Skip to content

Commit

Permalink
fix most auto schema warnings
Browse files Browse the repository at this point in the history
  • Loading branch information
felixrindt committed Nov 15, 2024
1 parent 0c8cee8 commit 280df91
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 19 deletions.
15 changes: 15 additions & 0 deletions ephios/api/access/auth.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,24 @@
from drf_spectacular.extensions import OpenApiAuthenticationExtension
from drf_spectacular.plumbing import build_bearer_security_scheme_object
from oauth2_provider.contrib.rest_framework import OAuth2Authentication

from ephios.api.models import AccessToken
from ephios.core.models import UserProfile


class TokenScheme(OpenApiAuthenticationExtension):
target_class = "ephios.api.access.auth.CustomOAuth2Authentication"
name = "tokenAuth"
match_subclasses = True
priority = 1

def get_security_definition(self, auto_schema):
return build_bearer_security_scheme_object(
header_name="Authorization",
token_prefix="Bearer",
)


class CustomOAuth2Authentication(OAuth2Authentication):
"""
Overwrites the default OAuth2Authentication to not allow inactive users to authenticate.
Expand Down
43 changes: 25 additions & 18 deletions ephios/api/serializers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import uuid

from django.db.models import Q
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from rest_framework.exceptions import MethodNotAllowed
from rest_framework.fields import BooleanField, SerializerMethodField
Expand All @@ -21,7 +24,7 @@

class QualificationSerializer(ModelSerializer):
category = SlugRelatedField(slug_field="uuid", read_only=True)
includes = SerializerMethodField()
includes = SerializerMethodField(label="Includes")

class Meta:
model = Qualification
Expand All @@ -33,7 +36,7 @@ class Meta:
"includes",
]

def get_includes(self, obj):
def get_includes(self, obj) -> list[uuid.UUID]:
return [q.uuid for q in collect_all_included_qualifications(obj.includes.all())]


Expand Down Expand Up @@ -81,9 +84,9 @@ class EventSerializer(serializers.ModelSerializer):
end_time = serializers.DateTimeField(source="get_end_time")
signup_stats = SignupStatsSerializer(source="get_signup_stats")
shifts = ShiftSerializer(many=True)
frontend_url = serializers.SerializerMethodField()
frontend_url = serializers.SerializerMethodField(label=_("Frontend URL"))

def get_frontend_url(self, obj):
def get_frontend_url(self, obj) -> str:
return make_absolute(obj.get_absolute_url())

class Meta:
Expand All @@ -103,7 +106,7 @@ class Meta:


class UserProfileSerializer(ModelSerializer):
qualifications = SerializerMethodField()
qualifications = SerializerMethodField(label="Qualifications")

class Meta:
model = UserProfile
Expand All @@ -115,7 +118,7 @@ class Meta:
"qualifications",
]

def get_qualifications(self, obj):
def get_qualifications(self, obj) -> list:
return QualificationSerializer(
Qualification.objects.filter(
Q(grants__user=obj)
Expand All @@ -125,16 +128,13 @@ def get_qualifications(self, obj):
).data


class ParticipantSerializer(serializers.Serializer):
class PublicParticipantSerializer(serializers.Serializer):
display_name = serializers.CharField()
email = serializers.EmailField(allow_null=True)
date_of_birth = serializers.DateField()
age = serializers.IntegerField(source="get_age")
is_minor = BooleanField()
type = serializers.SerializerMethodField()
type = serializers.SerializerMethodField(label=_("Participation type"))
qualifications = QualificationSerializer(many=True)

def get_type(self, obj):
def get_type(self, obj) -> str:
"""return class name of dataclass"""
return obj.__class__.__name__

Expand All @@ -145,21 +145,29 @@ def create(self, validated_data):
raise MethodNotAllowed("create")


class ConfidentialParticipantSerializer(PublicParticipantSerializer):
email = serializers.EmailField(allow_null=True)
date_of_birth = serializers.DateField()
age = serializers.IntegerField(source="get_age")


class UserinfoParticipationSerializer(ModelSerializer):
state = ChoiceDisplayField(choices=AbstractParticipation.States.choices)
duration = serializers.SerializerMethodField()
duration = serializers.SerializerMethodField(label=_("Duration in seconds"))
start_time = serializers.DateTimeField(label=_("Start time"))
end_time = serializers.DateTimeField(label=_("End time"))
event_title = serializers.CharField(source="shift.event.title")
event_type = EventTypeSerializer(source="shift.event.type")
event = serializers.PrimaryKeyRelatedField(source="shift.event", read_only=True)
user = serializers.PrimaryKeyRelatedField(read_only=True, allow_null=True)
participant = ParticipantSerializer(read_only=True)
participant = ConfidentialParticipantSerializer(read_only=True)

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):
def get_duration(self, obj) -> float:
return (obj.end_time - obj.start_time).total_seconds()

class Meta:
Expand All @@ -186,9 +194,8 @@ class ParticipationSerializer(UserinfoParticipationSerializer):
redact confidential fields
"""

participant = PublicParticipantSerializer(read_only=True)

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
del self.fields["comment"]
participant_field = self.fields["participant"]
for field_name in ["email", "age", "date_of_birth"]:
del participant_field.fields[field_name]
2 changes: 1 addition & 1 deletion ephios/api/views/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class OwnParticipationsViewSet(viewsets.ReadOnlyModelViewSet):
required_scopes = ["ME_READ"]

def get_queryset(self):
return LocalParticipation.objects.filter(user=self.request.user).select_related(
return LocalParticipation.objects.filter(user_id=self.request.user.id).select_related(
"shift", "shift__event", "shift__event__type"
)

Expand Down

0 comments on commit 280df91

Please sign in to comment.