Skip to content

Commit

Permalink
Merge branch 'refactor(feedback)/BugV2' of https://github.com/TIHLDE/…
Browse files Browse the repository at this point in the history
…Lepton into refactor(feedback)/BugV2
  • Loading branch information
MadsNyl committed Nov 11, 2024
2 parents 45cded2 + e33f60e commit 1c66116
Show file tree
Hide file tree
Showing 110 changed files with 1,496 additions and 234 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@

## Neste versjon

## Versjon 2024.11.04
- 🎨**Overordnet**. Endret variabel og funksjonsnavn til å følge konvensjoner og andre små endringer.
-**Filtrering**. Admin kan nå filtere deltakere av et arrangement på studie, studieår, om deltakere har allergier, (om deltakere godtar å bli tatt bilde av, om deltakere har ankommet), i tillegg til søk på fornavn og etternavn.

-**Filopplasting**. Det er nå mulig for admin brukere å laste opp- og slette filer.
-**Mail endepunkt**. Det er nå laget et endepunkt for å sende mailer.

## Versjon 2024.10.11
-**Tilbakemelding-funksjon**. Man kan nå opprette tilbakemeldinger for bugs og idé.
- 🦟 **Påmelding**. Det vil nå ikke være mulig med flere påmeldinger på et arrangement enn maksgrensen.
Expand Down
1 change: 1 addition & 0 deletions app/authentication/serializers/change_password.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class ChangePasswordSerializer(serializers.Serializer):
set_password_form_class = SetPasswordForm

def __init__(self, *args, **kwargs):
self.set_password_form = None
self.old_password_field_enabled = getattr(
settings, "OLD_PASSWORD_FIELD_ENABLED", True
)
Expand Down
5 changes: 5 additions & 0 deletions app/authentication/serializers/reset_password.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from django.contrib.auth.forms import PasswordResetForm
from rest_framework import serializers
from rest_framework.fields import empty

from sentry_sdk import capture_exception

Expand All @@ -16,6 +17,10 @@ class PasswordResetSerializer(serializers.Serializer):
email = serializers.EmailField()
password_reset_form_class = PasswordResetForm

def __init__(self, instance=None, data=empty, **kwargs):
super().__init__(instance, data, kwargs)
self.reset_form = None

def validate_email(self, value):
# Create PasswordResetForm with the serializer
try:
Expand Down
10 changes: 5 additions & 5 deletions app/badge/filters/badge.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,15 @@ class UserWithBadgesFilter(FilterSet):
queryset=BadgeCategory.objects.all(),
)

def filter_category(self, queryset, name, value):
def filter_category(self, queryset, _name, value):
return queryset.filter(user_badges__badge__badge_category=value)

def filter_is_in_study(self, queryset, name, value):
def filter_is_in_study(self, queryset, _name, value):
return queryset.filter(
memberships__group__slug=value, memberships__group__type=GroupType.STUDY
)

def filter_is_in_studyyear(self, queryset, name, value):
def filter_is_in_studyyear(self, queryset, _name, value):
return queryset.filter(
memberships__group__slug=value, memberships__group__type=GroupType.STUDYYEAR
)
Expand All @@ -49,7 +49,7 @@ class UserWithSpecificBadgeFilter(FilterSet):
study = filters.NumberFilter(method="filter_study")
studyyear = filters.NumberFilter(method="filter_studyyear")

def filter_study(self, queryset, name, value):
def filter_study(self, queryset, _name, value):
return queryset.filter(
Exists(
Membership.objects.filter(
Expand All @@ -60,7 +60,7 @@ def filter_study(self, queryset, name, value):
)
)

def filter_studyyear(self, queryset, name, value):
def filter_studyyear(self, queryset, _name, value):
return queryset.filter(
Exists(
Membership.objects.filter(
Expand Down
4 changes: 2 additions & 2 deletions app/career/filters/job_post.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ class Meta:
model: JobPost
fields = ["expired", "job_type"]

def filter_expired(self, queryset, name, value):
def filter_expired(self, queryset, _name, value):
if value:
return queryset.filter(deadline__lt=yesterday()).order_by("-deadline")
return queryset.filter(deadline__gte=yesterday()).order_by("deadline")

def filter_classes(self, queryset, name, value):
def filter_classes(self, queryset, _name, value):
query = Q()
for year in value:
query |= Q(class_start__lte=year, class_end__gte=year)
Expand Down
13 changes: 7 additions & 6 deletions app/career/views/weekly_business.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@


class WeeklyBusinessViewSet(BaseViewSet):

queryset = WeeklyBusiness.objects.none()
serializer_class = WeeklyBusinessSerializer
permission_classes = [BasicViewPermission]
Expand All @@ -30,7 +29,7 @@ def get_queryset(self):
in_future_this_year_filter = Q(year=now().year) & Q(week__gte=week_nr(now()))
next_year_filter = Q(year__gt=now().year)
return WeeklyBusiness.objects.filter(
(in_future_this_year_filter) | next_year_filter
in_future_this_year_filter | next_year_filter
).order_by("year", "week")

def list(self, request, *args, **kwargs):
Expand All @@ -57,9 +56,10 @@ def create(self, request, *args, **kwargs):
return Response(
{"detail": serializer.errors}, status=status.HTTP_400_BAD_REQUEST
)
except ValueError as value_error:
except ValueError:
return Response(
{"detail": str(value_error)}, status=status.HTTP_400_BAD_REQUEST
{"detail": "En feil oppstod under behandlingen av forespørselen."},
status=status.HTTP_400_BAD_REQUEST,
)

def update(self, request, pk):
Expand All @@ -78,9 +78,10 @@ def update(self, request, pk):
return Response(
{"detail": serializer.errors}, status=status.HTTP_400_BAD_REQUEST
)
except ValueError as value_error:
except ValueError:
return Response(
{"detail": str(value_error)}, status=status.HTTP_400_BAD_REQUEST
{"detail": "En feil oppstod under behandlingen av forespørselen."},
status=status.HTTP_400_BAD_REQUEST,
)

def destroy(self, request, *args, **kwargs):
Expand Down
8 changes: 6 additions & 2 deletions app/codex/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,12 @@ class APICodexEventEndRegistrationDateBeforeStartRegistrationDate(APIException):


class CodexEventEndRegistrationDateAfterStartDate(ValueError):
pass
default_detail = (
"Sluttdatoen for påmelding kan ikke være etter startdatoen for kurset"
)


class CodexEventEndRegistrationDateBeforeStartRegistrationDate(ValueError):
pass
default_detail = (
"Sluttdatoen for påmelding kan ikke være før startdatoen for påmelding"
)
8 changes: 2 additions & 6 deletions app/codex/util/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@

def validate_event_dates(data: dict):
if data["end_registration_at"] > data["start_date"]:
raise CodexEventEndRegistrationDateAfterStartDate(
"Påmeldingsslutt kan ikke være etter kursstart"
)
raise CodexEventEndRegistrationDateAfterStartDate()

if data["end_registration_at"] < data["start_registration_at"]:
raise CodexEventEndRegistrationDateBeforeStartRegistrationDate(
"Påmeldingsslutt kan ikke være før påmeldingsstart"
)
raise CodexEventEndRegistrationDateBeforeStartRegistrationDate()
22 changes: 11 additions & 11 deletions app/common/azure_file_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def __init__(self, blob=None, url=None):
self.blob = blob
self.url = url
if url:
data = self.getContainerAndNameFromUrl()
data = self.get_container_and_name_from_url()
self.containerName = data[0]
self.blobName = data[1]

Expand All @@ -29,24 +29,24 @@ def get_or_create_container(self, name="default"):
container = blob_service_client.create_container(name, public_access="blob")
return container

def getContainerAndNameFromUrl(self):
def get_container_and_name_from_url(self):
import urllib.parse

url = urllib.parse.unquote(self.url)
# fmt: off
return re.sub("\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*/", "", url).split("/") # noqa: W605
return re.sub("\w+:/{2}[\d\w-]+(\.[\d\w-]+)*/", "", url).split("/") # noqa: W605
# fmt: on

def uploadBlob(self):
"Uploads the given blob to Azure and returns a url to the blob"
def upload_blob(self):
"""Uploads the given blob to Azure and returns a url to the blob"""
if not self.blob:
raise ValueError("Du må sende med en blob for som skal lastes opp")

self.checkBlobSize()
containerName = self.getContainerNameFromBlob()
container = self.get_or_create_container(containerName)
self.check_blob_size()
container_name = self.get_container_name_from_blob()
container = self.get_or_create_container(container_name)

blob_name = f"{uuid.uuid4()}{self.getBlobName()}"
blob_name = f"{uuid.uuid4()}{self.get_blob_name()}"

content_settings = ContentSettings(
content_type=self.blob.content_type if self.blob.content_type else None,
Expand All @@ -62,8 +62,8 @@ def uploadBlob(self):
return blob_client.url
raise ValueError("Noe gikk galt under filopplastningen")

def deleteBlob(self):
"Delete a blob by it's url"
def delete_blob(self):
"""Delete a blob by it's url"""
if not self.blobName and not self.containerName:
raise ValueError("Du kan ikke slette en blob uten en url")

Expand Down
4 changes: 2 additions & 2 deletions app/common/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,11 @@ class AdminGroup(models.TextChoices):

@classmethod
def all(cls):
return (cls.HS, cls.INDEX, cls.NOK, cls.PROMO, cls.SOSIALEN, cls.KOK)
return cls.HS, cls.INDEX, cls.NOK, cls.PROMO, cls.SOSIALEN, cls.KOK

@classmethod
def admin(cls):
return (cls.HS, cls.INDEX)
return cls.HS, cls.INDEX


class Groups(models.TextChoices):
Expand Down
10 changes: 5 additions & 5 deletions app/common/file_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,22 @@ def __init__(self, blob=None):
def get_or_create_container(self, name="default"):
pass

def getBlobName(self):
def get_blob_name(self):
return self.blob.name if self.blob.name else ""

def getContainerNameFromBlob(self):
def get_container_name_from_blob(self):
return (
"".join(e for e in self.blob.content_type if e.isalnum())
if self.blob.content_type
else "default"
)

def checkBlobSize(self):
def check_blob_size(self):
if self.blob.size > self.SIZE_50_MB:
raise ValueError("Filen kan ikke være større enn 50 MB")

@abstractmethod
def uploadBlob(self):
def upload_blob(self):
pass


Expand All @@ -43,6 +43,6 @@ def replace_file(instance_image, validated_data_image):
if instance_image and instance_image != validated_data_image:
if settings.AZURE_BLOB_STORAGE_NAME in instance_image:
try:
AzureFileHandler(url=instance_image).deleteBlob()
AzureFileHandler(url=instance_image).delete_blob()
except Exception as e:
capture_exception(e)
2 changes: 2 additions & 0 deletions app/common/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ class BaseModelSerializer(serializers.ModelSerializer):
def update(self, instance, validated_data):
if hasattr(instance, "image") and "image" in validated_data:
replace_file(instance.image, validated_data.get("image", None))
if hasattr(instance, "file") and "file" in validated_data:
replace_file(instance.file, validated_data.get("file", None))
return super().update(instance, validated_data)
2 changes: 1 addition & 1 deletion app/common/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@


@app.task(bind=True, base=BaseTask)
def delete_old_log_entries(self, *args, **kwargs):
def delete_old_log_entries(self, *_args, **_kwargs):
from datetime import timedelta

from django.contrib.admin.models import LogEntry
Expand Down
2 changes: 1 addition & 1 deletion app/common/tests/test_azure_filehandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ def test_get_getContainerAndNameFromUrl():
handler = AzureFileHandler(
url=f"https://{settings.AZURE_BLOB_STORAGE_NAME}/{container_name}/{file_name}"
)
data = handler.getContainerAndNameFromUrl()
data = handler.get_container_and_name_from_url()
assert data[0] == container_name
assert data[1] == file_name
12 changes: 6 additions & 6 deletions app/communication/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@ class APIAnotherVisibleBannerException(APIException):
default_detail = "Det finnes allerede et banner som er synlig i samme tidsrom"


class AnotherVisibleBannerError(ValidationError):
default_detail = "Det finnes allerede et banner som er synlig i samme tidsrom"


class APIDatesMixedException(APIException):
status_code = status.HTTP_400_BAD_REQUEST
default_detail = "Datoen banneret er synlig til er satt etter datoen banneret for synlig fra. Bytt om disse to"


class AnotherVisibleBannerError(ValidationError):
pass


class DatesMixedError(ValidationError):
pass
default_detail = "Datoen banneret er synlig til er satt etter datoen banneret for synlig fra. Bytt om disse to"


class APIAllChannelsUnselected(APIException):
Expand All @@ -27,4 +27,4 @@ class APIAllChannelsUnselected(APIException):


class AllChannelsUnselected(ValueError):
pass
default_detail = "Du må velge minst en kommunikasjonsmetode"
2 changes: 1 addition & 1 deletion app/communication/factories/mail_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Meta:
body = factory.Faker("paragraph", nb_sentences=10)

@factory.post_generation
def users(self, create, extracted, **kwargs):
def users(self, create, extracted, **_kwargs):
"""Add users to the mail: `MailFactory.create(users=(user1, user2, user3))`"""
if not create or not extracted:
# Simple build, or nothing to add, do nothing.
Expand Down
2 changes: 1 addition & 1 deletion app/communication/models/banner.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,5 +66,5 @@ def is_visible(self):
return self.visible_from <= now() <= self.visible_until

@classmethod
def has_visible_permission(cls, request):
def has_visible_permission(cls, _request):
return True
7 changes: 5 additions & 2 deletions app/communication/models/mail.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class Meta:
def send(self, connection):
from app.communication.notifier import send_html_email

emails = (user.email for user in self.users.all())
emails = [user.email for user in self.users.all()]
is_success = send_html_email(
to_mails=emails,
html=self.body,
Expand All @@ -40,4 +40,7 @@ def send(self, connection):
return is_success

def __str__(self):
return f"\"{self.subject}\", to {self.users.all()[0] if self.users.count() == 1 else f'{self.users.count()} users'}, {'sent' if self.sent else 'eta'} {self.eta}"
return (
f"\"{self.subject}\", to {self.users.all()[0] if self.users.count() == 1 else f'{self.users.count()} users'}, "
f"{'sent' if self.sent else 'eta'} {self.eta}"
)
2 changes: 1 addition & 1 deletion app/communication/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@


@app.task(bind=True, base=BaseTask)
def send_due_mails(self, *args, **kwargs):
def send_due_mails(self, *_args, **_kwargs):
from django.core.mail import get_connection

from app.communication.models.mail import Mail
Expand Down
6 changes: 3 additions & 3 deletions app/communication/tests/test_banner_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
DatesMixedError,
)
from app.communication.factories.banner_factory import BannerFactory
from app.util.utils import getTimezone, now
from app.util.utils import get_timezone, now


@pytest.mark.parametrize(
Expand All @@ -27,8 +27,8 @@ def test_two_banners_can_not_be_visible_simultaneously_in_any_period(
This test uses timedelta and parameterize to switch visible_from
and visible_until between 5 days earlier or later."""
existing_banner = BannerFactory(
visible_from=datetime(2020, 1, 1, tzinfo=getTimezone()),
visible_until=datetime(2021, 1, 1, tzinfo=getTimezone()),
visible_from=datetime(2020, 1, 1, tzinfo=get_timezone()),
visible_until=datetime(2021, 1, 1, tzinfo=get_timezone()),
)

with pytest.raises(AnotherVisibleBannerError):
Expand Down
4 changes: 2 additions & 2 deletions app/communication/views/banner.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ class Meta:
model = Banner
fields = ["is_visible", "is_expired"]

def filter_is_visible(self, queryset, name, value):
def filter_is_visible(self, queryset, _name, value):
if value:
return queryset.filter(visible_from__lte=now(), visible_until__gte=now())
return queryset

def filter_is_expired(self, queryset, name, value):
def filter_is_expired(self, queryset, _name, value):
if value:
return queryset.filter(visible_until__lt=now())
return queryset
Expand Down
Loading

0 comments on commit 1c66116

Please sign in to comment.