diff --git a/src/pretalx/api/serializers/event.py b/src/pretalx/api/serializers/event.py index 17aaecb239..bb35b66d3e 100644 --- a/src/pretalx/api/serializers/event.py +++ b/src/pretalx/api/serializers/event.py @@ -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"]) diff --git a/src/pretalx/api/serializers/question.py b/src/pretalx/api/serializers/question.py index 401695c5c4..c071343ce3 100644 --- a/src/pretalx/api/serializers/question.py +++ b/src/pretalx/api/serializers/question.py @@ -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) @@ -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(), @@ -88,6 +93,7 @@ class Meta: ) +@register_serializer(SUPPORTED_VERSIONS) class AnswerSerializer(AnswerWriteSerializer): question = MinimalQuestionSerializer(Question.objects.none()) diff --git a/src/pretalx/api/serializers/review.py b/src/pretalx/api/serializers/review.py index 8131b8f1a8..59cca3b5ba 100644 --- a/src/pretalx/api/serializers/review.py +++ b/src/pretalx/api/serializers/review.py @@ -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.""" @@ -25,6 +27,7 @@ class Meta: ] +@register_serializer(SUPPORTED_VERSIONS) class ReviewSerializer(AnonymousReviewSerializer): user = SlugRelatedField(slug_field="name", read_only=True) answers = SerializerMethodField() diff --git a/src/pretalx/api/serializers/room.py b/src/pretalx/api/serializers/room.py index d2ac6012df..dd090d8950 100644 --- a/src/pretalx/api/serializers/room.py +++ b/src/pretalx/api/serializers/room.py @@ -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() @@ -15,6 +17,7 @@ class Meta: fields = ("id", "start", "end", "allDay") +@register_serializer(SUPPORTED_VERSIONS) class RoomSerializer(I18nAwareModelSerializer): url = SerializerMethodField() @@ -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) diff --git a/src/pretalx/api/serializers/speaker.py b/src/pretalx/api/serializers/speaker.py index b08b25dd20..058187f6bd 100644 --- a/src/pretalx/api/serializers/speaker.py +++ b/src/pretalx/api/serializers/speaker.py @@ -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() @@ -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") @@ -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() @@ -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() diff --git a/src/pretalx/api/serializers/submission.py b/src/pretalx/api/serializers/submission.py index b37cd473ca..3d8db17e14 100644 --- a/src/pretalx/api/serializers/submission.py +++ b/src/pretalx/api/serializers/submission.py @@ -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() @@ -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() @@ -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) @@ -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() @@ -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() @@ -171,6 +179,7 @@ class Meta(SubmissionOrgaSerializer.Meta): pass +@register_serializer(SUPPORTED_VERSIONS) class ScheduleListSerializer(ModelSerializer): version = SerializerMethodField() @@ -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 diff --git a/src/pretalx/api/views/event.py b/src/pretalx/api/views/event.py index 7bd0e1b2f5..23e1a93b4d 100644 --- a/src/pretalx/api/views/event.py +++ b/src/pretalx/api/views/event.py @@ -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" diff --git a/src/pretalx/api/views/question.py b/src/pretalx/api/views/question.py index 5ffaaa3d2f..25b17da472 100644 --- a/src/pretalx/api/views/question.py +++ b/src/pretalx/api/views/question.py @@ -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, @@ -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" @@ -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" @@ -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 diff --git a/src/pretalx/api/views/review.py b/src/pretalx/api/views/review.py index e092c1997c..f55e6dd323 100644 --- a/src/pretalx/api/views/review.py +++ b/src/pretalx/api/views/review.py @@ -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 ): diff --git a/src/pretalx/api/views/room.py b/src/pretalx/api/views/room.py index 1c2ab99d0f..16483eae53 100644 --- a/src/pretalx/api/views/room.py +++ b/src/pretalx/api/views/room.py @@ -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 @@ -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 @@ -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 diff --git a/src/pretalx/api/views/speaker.py b/src/pretalx/api/views/speaker.py index 04ca9eefb9..9de5afe444 100644 --- a/src/pretalx/api/views/speaker.py +++ b/src/pretalx/api/views/speaker.py @@ -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, @@ -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" @@ -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): diff --git a/src/pretalx/api/views/submission.py b/src/pretalx/api/views/submission.py index 7b5dd2182d..5674023588 100644 --- a/src/pretalx/api/views/submission.py +++ b/src/pretalx/api/views/submission.py @@ -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, @@ -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" @@ -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): @@ -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' @@ -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"