Skip to content

Commit

Permalink
Get serializer based on API version requested
Browse files Browse the repository at this point in the history
  • Loading branch information
rixx committed Nov 13, 2023
1 parent d9d519c commit 83107fd
Show file tree
Hide file tree
Showing 12 changed files with 52 additions and 15 deletions.
2 changes: 2 additions & 0 deletions src/pretalx/api/serializers/event.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from rest_framework.serializers import ModelSerializer
from urlman.serializers import UrlManField

from pretalx.api.versions import SUPPORTED_VERSIONS, register_serializer
from pretalx.event.models import Event


@register_serializer(SUPPORTED_VERSIONS)
class EventSerializer(ModelSerializer):
urls = UrlManField(urls=["base", "schedule", "login", "feed"])

Expand Down
6 changes: 6 additions & 0 deletions src/pretalx/api/serializers/question.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
from rest_framework.serializers import ModelSerializer, SlugRelatedField

from pretalx.api.versions import SUPPORTED_VERSIONS, register_serializer
from pretalx.person.models import User
from pretalx.submission.models import Answer, AnswerOption, Question, Submission


@register_serializer(SUPPORTED_VERSIONS)
class AnswerOptionSerializer(ModelSerializer):
class Meta:
model = AnswerOption
fields = ("id", "answer")


@register_serializer(SUPPORTED_VERSIONS)
class QuestionSerializer(ModelSerializer):
options = AnswerOptionSerializer(many=True, required=False)

Expand All @@ -36,12 +39,14 @@ class Meta:
)


@register_serializer(SUPPORTED_VERSIONS)
class MinimalQuestionSerializer(ModelSerializer):
class Meta:
model = Question
fields = ("id", "question")


@register_serializer(SUPPORTED_VERSIONS)
class AnswerWriteSerializer(ModelSerializer):
submission = SlugRelatedField(
queryset=Submission.objects.none(),
Expand Down Expand Up @@ -88,6 +93,7 @@ class Meta:
)


@register_serializer(SUPPORTED_VERSIONS)
class AnswerSerializer(AnswerWriteSerializer):
question = MinimalQuestionSerializer(Question.objects.none())

Expand Down
3 changes: 3 additions & 0 deletions src/pretalx/api/serializers/review.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
)

from pretalx.api.serializers.question import AnswerSerializer
from pretalx.api.versions import SUPPORTED_VERSIONS, register_serializer
from pretalx.submission.models import Answer, Review


@register_serializer(SUPPORTED_VERSIONS)
class AnonymousReviewSerializer(ModelSerializer):
"""Does not include the user and answer fields."""

Expand All @@ -25,6 +27,7 @@ class Meta:
]


@register_serializer(SUPPORTED_VERSIONS)
class ReviewSerializer(AnonymousReviewSerializer):
user = SlugRelatedField(slug_field="name", read_only=True)
answers = SerializerMethodField()
Expand Down
4 changes: 4 additions & 0 deletions src/pretalx/api/serializers/room.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from i18nfield.rest_framework import I18nAwareModelSerializer
from rest_framework.serializers import ModelSerializer, SerializerMethodField

from pretalx.api.versions import SUPPORTED_VERSIONS, register_serializer
from pretalx.schedule.models import Availability, Room


@register_serializer(SUPPORTED_VERSIONS)
class AvailabilitySerializer(ModelSerializer):
allDay = SerializerMethodField()

Expand All @@ -15,6 +17,7 @@ class Meta:
fields = ("id", "start", "end", "allDay")


@register_serializer(SUPPORTED_VERSIONS)
class RoomSerializer(I18nAwareModelSerializer):
url = SerializerMethodField()

Expand All @@ -26,6 +29,7 @@ class Meta:
fields = ("id", "guid", "name", "description", "capacity", "position", "url")


@register_serializer(SUPPORTED_VERSIONS)
class RoomOrgaSerializer(RoomSerializer):
availabilities = AvailabilitySerializer(many=True)

Expand Down
6 changes: 6 additions & 0 deletions src/pretalx/api/serializers/speaker.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

from pretalx.api.serializers.question import AnswerSerializer
from pretalx.api.serializers.room import AvailabilitySerializer
from pretalx.api.versions import SUPPORTED_VERSIONS, register_serializer
from pretalx.person.models import SpeakerProfile, User
from pretalx.schedule.models import Availability


@register_serializer(SUPPORTED_VERSIONS)
class SubmitterSerializer(ModelSerializer):
biography = SerializerMethodField()

Expand All @@ -25,11 +27,13 @@ class Meta:
fields = ("code", "name", "biography", "avatar")


@register_serializer(SUPPORTED_VERSIONS)
class SubmitterOrgaSerializer(SubmitterSerializer):
class Meta(SubmitterSerializer.Meta):
fields = SubmitterSerializer.Meta.fields + ("email",)


@register_serializer(SUPPORTED_VERSIONS)
class SpeakerSerializer(ModelSerializer):
code = CharField(source="user.code")
name = CharField(source="user.name")
Expand Down Expand Up @@ -63,6 +67,7 @@ class Meta:
fields = ("code", "name", "biography", "submissions", "avatar")


@register_serializer(SUPPORTED_VERSIONS)
class SpeakerOrgaSerializer(SpeakerSerializer):
email = CharField(source="user.email")
answers = SerializerMethodField()
Expand Down Expand Up @@ -90,6 +95,7 @@ class Meta(SpeakerSerializer.Meta):
fields = SpeakerSerializer.Meta.fields + ("answers", "email", "availabilities")


@register_serializer(SUPPORTED_VERSIONS)
class SpeakerReviewerSerializer(SpeakerOrgaSerializer):
def answers_queryset(self, obj):
return obj.reviewer_answers.all()
Expand Down
10 changes: 10 additions & 0 deletions src/pretalx/api/serializers/submission.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@

from pretalx.api.serializers.question import AnswerSerializer
from pretalx.api.serializers.speaker import SubmitterOrgaSerializer, SubmitterSerializer
from pretalx.api.versions import SUPPORTED_VERSIONS, register_serializer
from pretalx.schedule.models import Schedule, TalkSlot
from pretalx.submission.models import Resource, Submission, SubmissionStates, Tag


@register_serializer(SUPPORTED_VERSIONS)
class ResourceSerializer(ModelSerializer):
resource = SerializerMethodField()

Expand All @@ -25,6 +27,7 @@ class Meta:
fields = ("resource", "description")


@register_serializer(SUPPORTED_VERSIONS)
class SlotSerializer(I18nAwareModelSerializer):
room = SlugRelatedField(slug_field="name", read_only=True)
end = SerializerMethodField()
Expand All @@ -38,12 +41,14 @@ class Meta:
fields = ("room_id", "room", "start", "end")


@register_serializer(SUPPORTED_VERSIONS)
class BreakSerializer(SlotSerializer):
class Meta:
model = TalkSlot
fields = ("room", "room_id", "start", "end", "description")


@register_serializer(SUPPORTED_VERSIONS)
class SubmissionSerializer(I18nAwareModelSerializer):
submission_type = SlugRelatedField(slug_field="name", read_only=True)
track = SlugRelatedField(slug_field="name", read_only=True)
Expand Down Expand Up @@ -117,12 +122,14 @@ class Meta:
]


@register_serializer(SUPPORTED_VERSIONS)
class TagSerializer(I18nAwareModelSerializer):
class Meta:
model = Tag
fields = ["id", "tag", "description", "color"]


@register_serializer(SUPPORTED_VERSIONS)
class SubmissionOrgaSerializer(SubmissionSerializer):
answers = SerializerMethodField()
tags = SerializerMethodField()
Expand Down Expand Up @@ -163,6 +170,7 @@ class Meta(SubmissionSerializer.Meta):
]


@register_serializer(SUPPORTED_VERSIONS)
class SubmissionReviewerSerializer(SubmissionOrgaSerializer):
def answers_queryset(self, obj):
return obj.reviewer_answers.all()
Expand All @@ -171,6 +179,7 @@ class Meta(SubmissionOrgaSerializer.Meta):
pass


@register_serializer(SUPPORTED_VERSIONS)
class ScheduleListSerializer(ModelSerializer):
version = SerializerMethodField()

Expand All @@ -183,6 +192,7 @@ class Meta:
fields = ("version", "published")


@register_serializer(SUPPORTED_VERSIONS)
class ScheduleSerializer(ModelSerializer):
slots = SubmissionSerializer(
Submission.objects.none().filter(state=SubmissionStates.CONFIRMED), many=True
Expand Down
3 changes: 2 additions & 1 deletion src/pretalx/api/views/event.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
from django.http import Http404
from rest_framework import viewsets

from pretalx.api.mixins import PretalxViewSetMixin
from pretalx.api.serializers.event import EventSerializer
from pretalx.event.models import Event


class EventViewSet(viewsets.ReadOnlyModelViewSet):
class EventViewSet(PretalxViewSetMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = EventSerializer
queryset = Event.objects.none()
lookup_field = "slug"
Expand Down
7 changes: 4 additions & 3 deletions src/pretalx/api/views/question.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from rest_framework import viewsets
from rest_framework.permissions import SAFE_METHODS

from pretalx.api.mixins import PretalxViewSetMixin
from pretalx.api.serializers.question import (
AnswerSerializer,
AnswerWriteSerializer,
Expand Down Expand Up @@ -31,7 +32,7 @@ def get_questions_for_user(event, user, include_inactive=False):
return event.questions.none()


class QuestionViewSet(viewsets.ModelViewSet):
class QuestionViewSet(PretalxViewSetMixin, viewsets.ModelViewSet):
queryset = Question.objects.none()
serializer_class = QuestionSerializer
write_permission_required = "orga.edit_question"
Expand Down Expand Up @@ -71,7 +72,7 @@ class Meta:
fields = ("question", "submission", "person", "review")


class AnswerViewSet(viewsets.ModelViewSet):
class AnswerViewSet(PretalxViewSetMixin, viewsets.ModelViewSet):
queryset = Answer.objects.none()
serializer_class = AnswerSerializer
write_permission_required = "orga.change_submissions"
Expand All @@ -89,7 +90,7 @@ def get_queryset(self):
.select_related("question", "person", "review", "submission")
)

def get_serializer_class(self):
def get_unversioned_serializer_class(self):
if self.request.method in SAFE_METHODS:
return self.serializer_class
return AnswerWriteSerializer
Expand Down
5 changes: 3 additions & 2 deletions src/pretalx/api/views/review.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
from django.db import models
from rest_framework import viewsets

from pretalx.api.mixins import PretalxViewSetMixin
from pretalx.api.serializers.review import AnonymousReviewSerializer, ReviewSerializer
from pretalx.submission.models import Review
from pretalx.submission.models.submission import SubmissionStates


class ReviewViewSet(viewsets.ReadOnlyModelViewSet):
class ReviewViewSet(PretalxViewSetMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = ReviewSerializer
queryset = Review.objects.none()
filterset_fields = ("submission__code",)

def get_serializer_class(self):
def get_unversioned_serializer_class(self):
if not self.request.user.has_perm(
"orga.view_reviewer_names", self.request.event
):
Expand Down
5 changes: 3 additions & 2 deletions src/pretalx/api/views/room.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from rest_framework import pagination, viewsets

from pretalx.api.mixins import PretalxViewSetMixin
from pretalx.api.serializers.room import RoomOrgaSerializer, RoomSerializer
from pretalx.schedule.models import Room

Expand All @@ -8,7 +9,7 @@ class RoomPagination(pagination.LimitOffsetPagination):
default_limit = 100


class RoomViewSet(viewsets.ReadOnlyModelViewSet):
class RoomViewSet(PretalxViewSetMixin, viewsets.ReadOnlyModelViewSet):
queryset = Room.objects.none()
pagination_class = RoomPagination

Expand All @@ -17,7 +18,7 @@ def get_queryset(self):
return self.request.event.rooms.all()
return self.request.event.rooms.none()

def get_serializer_class(self):
def get_unversioned_serializer_class(self):
if self.request.user.has_perm("orga.edit_room", self.request.event):
return RoomOrgaSerializer
return RoomSerializer
5 changes: 3 additions & 2 deletions src/pretalx/api/views/speaker.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.utils.functional import cached_property
from rest_framework import viewsets

from pretalx.api.mixins import PretalxViewSetMixin
from pretalx.api.serializers.speaker import (
SpeakerOrgaSerializer,
SpeakerReviewerSerializer,
Expand All @@ -9,7 +10,7 @@
from pretalx.person.models import SpeakerProfile


class SpeakerViewSet(viewsets.ReadOnlyModelViewSet):
class SpeakerViewSet(PretalxViewSetMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = SpeakerSerializer
queryset = SpeakerProfile.objects.none()
lookup_field = "user__code__iexact"
Expand All @@ -20,7 +21,7 @@ class SpeakerViewSet(viewsets.ReadOnlyModelViewSet):
def serializer_questions(self):
return (self.request.query_params.get("questions") or "").split(",")

def get_serializer_class(self):
def get_unversioned_serializer_class(self):
if self.request.user.has_perm("orga.change_submissions", self.request.event):
return SpeakerOrgaSerializer
if self.request.user.has_perm("orga.view_speakers", self.request.event):
Expand Down
11 changes: 6 additions & 5 deletions src/pretalx/api/views/submission.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from django_scopes import scopes_disabled
from rest_framework import viewsets

from pretalx.api.mixins import PretalxViewSetMixin
from pretalx.api.serializers.submission import (
ScheduleListSerializer,
ScheduleSerializer,
Expand All @@ -25,7 +26,7 @@ class Meta:
fields = ("state", "content_locale", "submission_type")


class SubmissionViewSet(viewsets.ReadOnlyModelViewSet):
class SubmissionViewSet(PretalxViewSetMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = SubmissionSerializer
queryset = Submission.objects.none()
lookup_field = "code__iexact"
Expand All @@ -52,7 +53,7 @@ def get_queryset(self):
)
return self.request.event.submissions.all()

def get_serializer_class(self):
def get_unversioned_serializer_class(self):
if self.request.user.has_perm("orga.change_submissions", self.request.event):
return SubmissionOrgaSerializer
if self.request.user.has_perm("orga.view_submissions", self.request.event):
Expand All @@ -78,12 +79,12 @@ def get_serializer(self, *args, **kwargs):
)


class ScheduleViewSet(viewsets.ReadOnlyModelViewSet):
class ScheduleViewSet(PretalxViewSetMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = ScheduleSerializer
queryset = Schedule.objects.none()
lookup_value_regex = "[^/]+"

def get_serializer_class(self):
def get_unversioned_serializer_class(self):
if self.action == "list":
return ScheduleListSerializer
return ScheduleSerializer # self.action == 'retrieve'
Expand Down Expand Up @@ -119,7 +120,7 @@ def get_queryset(self):
return qs


class TagViewSet(viewsets.ReadOnlyModelViewSet):
class TagViewSet(PretalxViewSetMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = TagSerializer
queryset = Tag.objects.none()
lookup_field = "tag__iexact"
Expand Down

0 comments on commit 83107fd

Please sign in to comment.