from django.shortcuts import get_object_or_404 from django.views.generic import TemplateView from rest_framework import viewsets, permissions, mixins from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner from AKModel.serializers import AKSerializer, AKSlotSerializer, RoomSerializer, AKTrackSerializer, AKCategorySerializer, \ AKOwnerSerializer class EventSlugMixin: """ Mixin to handle views with event slugs """ event = None def _load_event(self): # Find event based on event slug self.event = get_object_or_404(Event, slug=self.kwargs.get("event_slug", None)) def get(self, request, *args, **kwargs): self._load_event() return super().get(request, *args, **kwargs) def post(self, request, *args, **kwargs): self._load_event() return super().post(request, *args, **kwargs) def list(self, request, *args, **kwargs): self._load_event() return super().list(request, *args, **kwargs) def create(self, request, *args, **kwargs): self._load_event() return super().create(request, *args, **kwargs) def get_context_data(self, *, object_list=None, **kwargs): context = super().get_context_data(object_list=object_list, **kwargs) # Add event to context (to make it accessible in templates) context["event"] = self.event return context class FilterByEventSlugMixin(EventSlugMixin): """ Mixin to filter different querysets based on a event slug from the request url """ def get_queryset(self): # Filter current queryset based on url event slug or return 404 if event slug is invalid return super().get_queryset().filter(event=self.event) class AKOwnerViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,) serializer_class = AKOwnerSerializer def get_queryset(self): return AKOwner.objects.filter(event=self.event) class AKCategoryViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,) serializer_class = AKCategorySerializer def get_queryset(self): return AKCategory.objects.filter(event=self.event) class AKTrackViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,) serializer_class = AKTrackSerializer def get_queryset(self): return AKTrack.objects.filter(event=self.event) class AKViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,) serializer_class = AKSerializer def get_queryset(self): return AK.objects.filter(event=self.event) class RoomViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,) serializer_class = RoomSerializer def get_queryset(self): return Room.objects.filter(event=self.event) class AKSlotViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,) serializer_class = AKSlotSerializer def get_queryset(self): return AKSlot.objects.filter(event=self.event) class UserView(TemplateView): template_name = "AKModel/user.html"