Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/implement-lending-system' into i…
Browse files Browse the repository at this point in the history
…mplement-lending-system

# Conflicts:
#	lego/apps/lending/managers.py
#	lego/apps/lending/models.py
#	lego/apps/lending/serializers.py
#	lego/apps/lending/views.py
  • Loading branch information
Bestem0r committed Mar 12, 2024
2 parents e549314 + 0c729d5 commit 75848dc
Show file tree
Hide file tree
Showing 52 changed files with 1,361 additions and 531 deletions.
4 changes: 2 additions & 2 deletions lego/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import RedirectView

from .v1 import router as v1
from .v1 import urlpatterns as v1_urlpatterns


@csrf_exempt
Expand All @@ -22,7 +22,7 @@ def version_redirect(request, path):

app_name = "api"
urlpatterns = [
re_path(r"^v1/", include((v1.urls, "v1"), namespace="v1")),
re_path(r"^v1/", include((v1_urlpatterns, "v1"), namespace="v1")),
re_path(
r"^$", RedirectView.as_view(url=f"/api/{settings.API_VERSION}/"), name="default"
),
Expand Down
10 changes: 10 additions & 0 deletions lego/api/v1.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from django.urls import include, path
from rest_framework import routers

from lego.apps.articles.views import ArticlesViewSet
Expand Down Expand Up @@ -33,6 +34,8 @@
FollowEventViewSet,
FollowUserViewSet,
)
from lego.apps.forums.urls import urlpatterns as forums_urls
from lego.apps.forums.views import ForumsViewSet, ThreadViewSet
from lego.apps.frontpage.views import FrontpageViewSet
from lego.apps.gallery.views import GalleryPictureViewSet, GalleryViewSet
from lego.apps.ical.viewsets import ICalTokenViewset, ICalViewset
Expand Down Expand Up @@ -133,6 +136,7 @@
router.register(r"followers-company", FollowCompanyViewSet)
router.register(r"followers-event", FollowEventViewSet)
router.register(r"followers-user", FollowUserViewSet)
router.register(r"forums", ForumsViewSet)
router.register(r"frontpage", FrontpageViewSet, basename="frontpage")
router.register(r"galleries", GalleryViewSet)
router.register(r"galleries/(?P<gallery_pk>\d+)/pictures", GalleryPictureViewSet)
Expand Down Expand Up @@ -197,6 +201,7 @@
r"surveys/(?P<survey_pk>\d+)/submissions", SubmissionViewSet, basename="submission"
)
router.register(r"tags", TagViewSet)
router.register(r"threads", ThreadViewSet)
router.register(r"user-delete", UserDeleteViewSet, basename="user-delete")
router.register(r"users", UsersViewSet)
router.register(
Expand All @@ -206,3 +211,8 @@
)
router.register(r"oidc", OIDCViewSet, basename="oidc")
router.register(r"webhooks-stripe", StripeWebhook, basename="webhooks-stripe")

urlpatterns = [
path("", include(router.urls)),
path("forums/", include((forums_urls, "forums"))),
]
3 changes: 3 additions & 0 deletions lego/apps/companies/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,19 +45,22 @@
README = "readme"
ITDAGENE = "itdagene"
LABAMBA_SPONSOR = "labamba_sponsor"
SOCIAL_MEDIA = "social_media"

OTHER_OFFERS = (
(COLLABORATION, COLLABORATION),
(README, README),
(ITDAGENE, ITDAGENE),
(LABAMBA_SPONSOR, LABAMBA_SPONSOR),
(SOCIAL_MEDIA, SOCIAL_MEDIA),
)

TRANSLATED_OTHER_OFFERS = {
COLLABORATION: "Samarbeid med andre linjeforeninger",
README: "Annonsering i readme",
ITDAGENE: "Stand på itDAGENE",
LABAMBA_SPONSOR: "Sponsing av LaBamba",
SOCIAL_MEDIA: "Profilering på sosiale medier",
}

COLLABORATION_ONLINE = "collaboration_online"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Generated by Django 4.0.10 on 2024-02-02 14:51

import django.contrib.postgres.fields
from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("companies", "0027_companyinterest_bedex_comment_and_more"),
]

operations = [
migrations.AlterField(
model_name="companyinterest",
name="other_offers",
field=django.contrib.postgres.fields.ArrayField(
base_field=models.CharField(
choices=[
("collaboration", "collaboration"),
("readme", "readme"),
("itdagene", "itdagene"),
("labamba_sponsor", "labamba_sponsor"),
("social_media", "social_media"),
],
max_length=64,
),
blank=True,
null=True,
size=None,
),
),
]
8 changes: 6 additions & 2 deletions lego/apps/contact/serializers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.db.models import Q
from rest_framework import exceptions, serializers

from lego.apps.users.constants import GROUP_COMMITTEE
from lego.apps.users.constants import GROUP_BOARD, GROUP_COMMITTEE
from lego.apps.users.models import AbakusGroup
from lego.utils.fields import PrimaryKeyRelatedFieldNoPKOpt
from lego.utils.functions import verify_captcha
Expand All @@ -12,7 +13,10 @@ class ContactFormSerializer(serializers.Serializer):
anonymous = serializers.BooleanField()
captcha_response = serializers.CharField()
recipient_group = PrimaryKeyRelatedFieldNoPKOpt(
allow_null=True, queryset=AbakusGroup.objects.all().filter(type=GROUP_COMMITTEE)
allow_null=True,
queryset=AbakusGroup.objects.all().filter(
Q(type=GROUP_COMMITTEE) | Q(type=GROUP_BOARD)
),
)

def validate_captcha_response(self, captcha_response):
Expand Down
17 changes: 13 additions & 4 deletions lego/apps/events/fixtures/test_events.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,6 @@
end_time: "2118-09-01T15:20:30+03:00"
created_by: 1
require_auth: False
use_contact_tracing: True

- model: events.Event
pk: 11
Expand Down Expand Up @@ -198,7 +197,8 @@
end_time: "2012-09-01T15:20:30+03:00"
created_by: 1
require_auth: False

responsible_group: 25

- model: events.Pool
pk: 1
fields:
Expand Down Expand Up @@ -287,9 +287,9 @@
pk: 9
fields:
name: Abakusmember
capacity: 1
capacity: 1
event: 13
counter: 1
counter: 1
activation_date: "2019-09-01T13:20:30+03:00"
permission_groups:
- - Abakus
Expand Down Expand Up @@ -361,3 +361,12 @@
pool: 9
registration_date: "2011-09-01T13:20:30+03:00"
status: "SUCCESS_REGISTER"

- model: events.Registration
pk: 8
fields:
user: 10
event: 1
pool: null
registration_date: "2011-09-01T13:20:30+03:00"
status: "SUCCESS_REGISTER"
17 changes: 17 additions & 0 deletions lego/apps/events/migrations/0038_event_is_foreign_language.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.0.10 on 2023-10-31 17:23

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("events", "0037_event_responsible_users"),
]

operations = [
migrations.AddField(
model_name="event",
name="is_foreign_language",
field=models.BooleanField(default=False),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Generated by Django 4.0.10 on 2024-02-20 19:26

from django.db import migrations


class Migration(migrations.Migration):
dependencies = [
("events", "0038_event_is_foreign_language"),
]

operations = [
migrations.RemoveField(
model_name="event",
name="use_contact_tracing",
),
]
23 changes: 16 additions & 7 deletions lego/apps/events/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
from lego.apps.events.exceptions import (
EventHasClosed,
EventNotReady,
NoPhoneNumber,
NoSuchPool,
NoSuchRegistration,
NotRegisteredPhotoConsents,
Expand All @@ -32,7 +31,7 @@
from lego.apps.followers.models import FollowEvent
from lego.apps.permissions.models import ObjectPermissionsModel
from lego.apps.users.constants import AUTUMN, SPRING
from lego.apps.users.models import AbakusGroup, Penalty, User
from lego.apps.users.models import AbakusGroup, Membership, Penalty, User
from lego.utils.models import BasisModel
from lego.utils.youtube_validator import youtube_validator

Expand Down Expand Up @@ -99,10 +98,10 @@ def unregistration_close_time(self) -> date:
youtube_url = CharField(
max_length=200, default="", validators=[youtube_validator], blank=True
)
use_contact_tracing = models.BooleanField(default=False)
legacy_registration_count = models.PositiveIntegerField(default=0)
mazemap_poi = models.PositiveIntegerField(null=True)
responsible_users = ManyToManyField(User)
is_foreign_language = models.BooleanField(default=False, blank=False, null=False)

class Meta:
permission_handler = EventPermissionHandler()
Expand Down Expand Up @@ -134,6 +133,15 @@ def user_should_see_regs(self, user: User) -> bool:
or (self.created_by is not None and self.created_by.id == user.id)
)

def user_should_see_allergies(self, user: User) -> bool:
memberships = Membership.objects.filter(user=user)
in_responsible_group = self.responsible_group in [
mem.abakus_group for mem in memberships
]
created_by_self = user == self.created_by

return created_by_self or in_responsible_group

def admin_register(
self,
admin_user: User,
Expand Down Expand Up @@ -302,9 +310,6 @@ def register(self, registration: Registration) -> Registration:
if self.registration_close_time < current_time:
raise EventHasClosed()

if self.use_contact_tracing and user.phone_number is None:
raise NoPhoneNumber()

current_semester = AUTUMN if self.start_time.month > 7 else SPRING
if self.use_consent and not user.has_registered_photo_consents_for_semester(
self.start_time.year,
Expand Down Expand Up @@ -771,10 +776,14 @@ def restricted_lookup(self) -> tuple[list[User], list]:
)
return [registration.user for registration in registrations], []

def announcement_lookup(self) -> list[User]:
def announcement_lookup(self, exclude_waiting_list: bool) -> list[User]:
registrations: QuerySet[Registration] = self.registrations.filter(
status=constants.SUCCESS_REGISTER
)

if exclude_waiting_list:
registrations = registrations.exclude(pool=None)

return [registration.user for registration in registrations]

def add_legacy_registration(self) -> None:
Expand Down
34 changes: 8 additions & 26 deletions lego/apps/events/serializers/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,13 @@
from lego.apps.events.models import Event, Pool, Registration
from lego.apps.events.serializers.pools import (
PoolAdministrateAllergiesSerializer,
PoolAdministrateExportSerializer,
PoolAdministrateSerializer,
PoolCreateAndUpdateSerializer,
PoolReadAuthSerializer,
PoolReadSerializer,
)
from lego.apps.events.serializers.registrations import (
RegistrationReadDetailedAllergiesSerializer,
RegistrationReadDetailedExportSerializer,
RegistrationReadDetailedSerializer,
RegistrationReadSerializer,
)
Expand Down Expand Up @@ -113,6 +111,7 @@ class Meta:
"survey",
"is_priced",
"responsible_users",
"is_foreign_language",
) + ObjectPermissionsSerializerMixin.Meta.fields
read_only = True

Expand Down Expand Up @@ -187,9 +186,9 @@ class Meta:
"survey",
"use_consent",
"youtube_url",
"use_contact_tracing",
"mazemap_poi",
"responsible_users",
"is_foreign_language",
)
read_only = True

Expand Down Expand Up @@ -323,29 +322,26 @@ def get_unanswered_surveys(self, obj):
return request.user.unanswered_surveys()


class EventAdministrateSerializer(EventReadSerializer):
class EventAdministrateSerializer(EventReadSerializer, EventReadDetailedSerializer):
pools = PoolAdministrateSerializer(many=True)
unregistered = RegistrationReadDetailedSerializer(many=True)
waiting_registrations = RegistrationReadDetailedSerializer(many=True)
responsible_group = AbakusGroupField(
queryset=AbakusGroup.objects.all(), required=False, allow_null=True
)

class Meta(EventReadSerializer.Meta):
fields = EventReadSerializer.Meta.fields + ( # type: ignore
"pools",
"unregistered",
"waiting_registrations",
"use_consent",
"use_contact_tracing",
"created_by",
"feedback_required",
"responsible_group",
)


class EventAdministrateExportSerializer(EventAdministrateSerializer):
pools = PoolAdministrateExportSerializer(many=True)
unregistered = RegistrationReadDetailedExportSerializer(many=True)
waiting_registrations = RegistrationReadDetailedExportSerializer(many=True)


class EventAdministrateAllergiesSerializer(EventAdministrateSerializer):
pools = PoolAdministrateAllergiesSerializer(many=True)
waiting_registrations = RegistrationReadDetailedAllergiesSerializer(many=True)
Expand Down Expand Up @@ -406,9 +402,9 @@ class Meta:
"registration_close_time",
"unregistration_close_time",
"youtube_url",
"use_contact_tracing",
"mazemap_poi",
"responsible_users",
"is_foreign_language",
) + ObjectPermissionsSerializerMixin.Meta.fields

def validate(self, data):
Expand All @@ -422,18 +418,6 @@ def validate(self, data):
"end_time": "User does not have the required permissions for time travel"
}
)
if (
self.instance is not None
and "use_contact_tracing" in data
and data["use_contact_tracing"] != self.instance.use_contact_tracing
and self.instance.registrations.exists()
):
raise serializers.ValidationError(
{
"use_contact_tracing": "Cannot change this field after registration has started"
}
)

return data

def create(self, validated_data):
Expand All @@ -445,7 +429,6 @@ def create(self, validated_data):
validated_data["require_auth"] = require_auth
if event_status_type == constants.TBA:
pools = []
validated_data["location"] = "TBA"
elif event_status_type == constants.OPEN:
pools = []
elif event_status_type == constants.INFINITE:
Expand All @@ -466,7 +449,6 @@ def update(self, instance, validated_data):
)
if event_status_type == constants.TBA:
pools = []
validated_data["location"] = "TBA"
elif event_status_type == constants.OPEN:
pools = []
elif event_status_type == constants.INFINITE:
Expand Down
Loading

0 comments on commit 75848dc

Please sign in to comment.