Skip to content
Snippets Groups Projects
views.py 7.06 KiB
Newer Older
  • Learn to ignore specific revisions
  • from django.contrib import admin, messages
    from django.http import HttpResponseRedirect
    
    from django.shortcuts import get_object_or_404
    
    from django.urls import reverse_lazy
    from django.utils.translation import gettext_lazy as _
    
    
    from django.views.generic import TemplateView, DetailView, ListView, DeleteView
    
    Nadja Geisler's avatar
    Nadja Geisler committed
    from rest_framework import viewsets, permissions, mixins
    
    from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage, AKRequirement
    
    Nadja Geisler's avatar
    Nadja Geisler committed
    from AKModel.serializers import AKSerializer, AKSlotSerializer, RoomSerializer, AKTrackSerializer, AKCategorySerializer, \
        AKOwnerSerializer
    
    class EventSlugMixin:
    
        Mixin to handle views with event slugs
    
            # 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)
    
    
    Nadja Geisler's avatar
    Nadja Geisler committed
        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 initial(self, request, *args, **kwargs):
            if self.event is None:
                self._load_event()
            super().initial(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 AdminViewMixin:
    
        site_url = ''
        title = ''
    
    
        def get_context_data(self, **kwargs):
            extra = admin.site.each_context(self.request)
            extra.update(super().get_context_data(**kwargs))
    
    
            if self.site_url != '':
                extra["site_url"] = self.site_url
            if self.title != '':
                extra["title"] = self.title
    
    
            return extra
    
    
    
    Nadja Geisler's avatar
    Nadja Geisler committed
    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.CreateModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
    
    Nadja Geisler's avatar
    Nadja Geisler committed
        permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,)
        serializer_class = AKTrackSerializer
    
        def get_queryset(self):
            return AKTrack.objects.filter(event=self.event)
    
    
    
    class AKViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
    
    Nadja Geisler's avatar
    Nadja Geisler committed
        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"
    
    
    
    class EventStatusView(AdminViewMixin, DetailView):
        template_name = "admin/AKModel/status.html"
        model = Event
        context_object_name = "event"
    
        title = _("Event Status")
    
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context["unscheduled_slots_count"] = context["event"].akslot_set.filter(start=None).count
    
            context["site_url"] = reverse_lazy("dashboard:dashboard_event", kwargs={'slug': context["event"].slug})
    
            context["ak_messages"] = AKOrgaMessage.objects.filter(ak__event=context["event"])
    
    class AKRequirementOverview(AdminViewMixin, FilterByEventSlugMixin, ListView):
        model = AKRequirement
        context_object_name = "requirements"
        title = _("Requirements for Event")
        template_name = "admin/AKModel/requirements_overview.html"
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context["event"] = self.event
            context["site_url"] = reverse_lazy("dashboard:dashboard_event", kwargs={'slug': context["event"].slug})
            return context
    
    
    
    class AKCSVExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
        template_name = "admin/AKModel/ak_csv_export.html"
        model = AKSlot
        context_object_name = "slots"
        title = _("AK CSV Export")
    
        def get_queryset(self):
            return super().get_queryset().order_by("ak__track")
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            return context
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
    
    
    class AKWikiExportView(AdminViewMixin, FilterByEventSlugMixin, ListView):
        template_name = "admin/AKModel/wiki_export.html"
        model = AK
        context_object_name = "AKs"
        title = _("AK Wiki Export")
    
        def get_queryset(self):
            return super().get_queryset().order_by("category")
    
    
    
    class AKMessageDeleteView(AdminViewMixin, DeleteView):
        model = Event
        template_name = "admin/AKModel/message_delete.html"
    
        def get_orga_messages_for_event(self, event):
            return AKOrgaMessage.objects.filter(ak__event=event)
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context["ak_messages"] = self.get_orga_messages_for_event(self.get_object())
            return context
    
        def post(self, request, *args, **kwargs):
            self.get_orga_messages_for_event(self.get_object()).delete()
            messages.add_message(self.request, messages.SUCCESS, _("AK Orga Messages successfully deleted"))
            return HttpResponseRedirect(reverse_lazy('admin:event_status', kwargs={'slug': self.get_object().slug}))