Skip to content

Commit

Permalink
address review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
jeriox committed Mar 14, 2024
1 parent 74f74cb commit 19e6064
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 15 deletions.
6 changes: 6 additions & 0 deletions ephios/api/fields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from rest_framework.fields import ChoiceField


class ChoiceDisplayField(ChoiceField):
def to_representation(self, value):
return {"value": value, "readable_text": self.choices[value]}
13 changes: 6 additions & 7 deletions ephios/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,23 @@
ApplicationDetail,
ApplicationUpdate,
)
from ephios.api.views.events import EventViewSet
from ephios.api.views.events import EventViewSet, ShiftViewSet
from ephios.api.views.users import (
MailBasedUserParticipationView,
UserByMailView,
UserParticipationView,
UserProfileMeView,
UserViewSet,
)
from ephios.extra.permissions import staff_required

router = routers.DefaultRouter()
router.register(r"events", EventViewSet)
router.register(r"shifts", ShiftViewSet)
router.register(r"users", UserViewSet)
router.register(r"users/by_email", UserByMailView, basename="user-by-email")
router.register(
r"users/(?P<user>[\d]+)/participations", UserParticipationView, basename="user-participations"
)
router.register(
r"users/(?P<email>[\D]+)/participations",
MailBasedUserParticipationView,
basename="user-participations-mail",
)

app_name = "api"
urlpatterns = [
Expand Down
29 changes: 26 additions & 3 deletions ephios/api/views/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from rest_framework.permissions import DjangoObjectPermissions
from rest_framework_guardian import filters as guardian_filters

from ephios.core.models import Event, EventType, LocalParticipation, Shift
from ephios.api.fields import ChoiceDisplayField
from ephios.core.models import AbstractParticipation, Event, EventType, LocalParticipation, Shift
from ephios.core.templatetags.settings_extras import make_absolute


Expand Down Expand Up @@ -69,6 +70,14 @@ class Meta:
]


class ShiftViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = ShiftSerializer
permission_classes = [DjangoObjectPermissions, IsAuthenticatedOrTokenHasScope]
filter_backends = [guardian_filters.ObjectPermissionsFilter]
required_scopes = ["PUBLIC_READ"]
queryset = Shift.objects.all()


class EventViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = EventSerializer
filterset_fields = ["type"]
Expand Down Expand Up @@ -99,13 +108,27 @@ class EventViewSet(viewsets.ReadOnlyModelViewSet):


class ParticipationSerializer(serializers.ModelSerializer):
state = serializers.CharField(source="get_state_display")
event_title = serializers.CharField(source="shift.event.title")
state = ChoiceDisplayField(choices=AbstractParticipation.States.choices)
duration = serializers.SerializerMethodField()

class Meta:
model = LocalParticipation
fields = ["id", "shift", "state", "comment", "start_time", "end_time"]
fields = [
"id",
"shift",
"event_title",
"state",
"comment",
"start_time",
"end_time",
"duration",
]

def build_unknown_field(self, field_name, model_class):
if field_name in {"start_time", "end_time"}:
return self.build_property_field(field_name, model_class)
return super().build_unknown_field(field_name, model_class)

def get_duration(self, obj):
return obj.end_time - obj.start_time
38 changes: 33 additions & 5 deletions ephios/api/views/users.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
from django.db.models import Q
from django.utils import timezone
from django_filters.rest_framework import DjangoFilterBackend
from oauth2_provider.contrib.rest_framework import IsAuthenticatedOrTokenHasScope
from rest_framework import viewsets
from rest_framework.exceptions import PermissionDenied
from rest_framework.fields import SerializerMethodField
from rest_framework.filters import SearchFilter
from rest_framework.generics import RetrieveAPIView
from rest_framework.mixins import RetrieveModelMixin
from rest_framework.permissions import DjangoObjectPermissions
from rest_framework.relations import SlugRelatedField
from rest_framework.serializers import ModelSerializer
from rest_framework.viewsets import GenericViewSet
from rest_framework_guardian.filters import ObjectPermissionsFilter

from ephios.api.views.events import ParticipationSerializer
from ephios.core.models import LocalParticipation, Qualification, UserProfile
Expand Down Expand Up @@ -37,6 +43,7 @@ class UserProfileSerializer(ModelSerializer):
class Meta:
model = UserProfile
fields = [
"id",
"display_name",
"date_of_birth",
"email",
Expand Down Expand Up @@ -65,15 +72,36 @@ def get_object(self):
return self.request.user


class UserViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = UserProfileSerializer
queryset = UserProfile.objects.all()
permission_classes = [IsAuthenticatedOrTokenHasScope, DjangoObjectPermissions]
required_scopes = ["CONFIDENTIAL_READ"]
search_fields = ["display_name", "email"]

filter_backends = [
DjangoFilterBackend,
SearchFilter,
ObjectPermissionsFilter,
]


class UserByMailView(RetrieveModelMixin, GenericViewSet):
serializer_class = UserProfileSerializer
queryset = UserProfile.objects.all()
permission_classes = [IsAuthenticatedOrTokenHasScope, DjangoObjectPermissions]
required_scopes = ["CONFIDENTIAL_READ"]
filter_backends = [ObjectPermissionsFilter]
lookup_url_kwarg = "email"
lookup_field = "email"


class UserParticipationView(viewsets.ReadOnlyModelViewSet):
serializer_class = ParticipationSerializer
permission_classes = [IsAuthenticatedOrTokenHasScope]
filter_backends = [ObjectPermissionsFilter, DjangoFilterBackend]
filterset_fields = ["state"]
required_scopes = ["CONFIDENTIAL_READ"]

def get_queryset(self):
return LocalParticipation.objects.filter(user=self.kwargs["user"])


class MailBasedUserParticipationView(UserParticipationView):
def get_queryset(self):
return LocalParticipation.objects.filter(user__email=self.kwargs["email"])

0 comments on commit 19e6064

Please sign in to comment.