from rest_framework import viewsets,filters from rest_framework.permissions import BasePermission, AllowAny from . import models as m from . import views from seminar.permissions import AllowWrite class PermissionMixin(object): """ Redefines get_permissions so that only organizers can make changes. """ def get_permissions(self): permission_classes = [] print("get_permissions have been called.") if self.action in ["create", "update", "partial_update", "destroy"]: permission_classes = [AllowWrite] # speciální permission na zápis - orgové else: permission_classes = [AllowAny] # návštěvník nemusí být zalogován, aby si prohlížel obsah return [permission() for permission in permission_classes] class ReadWriteSerializerMixin(object): """ Overrides get_serializer_class to choose the read serializer for GET requests and the write serializer for POST requests. Set read_serializer_class and write_serializer_class attributes on a viewset. """ read_serializer_class = None create_serializer_class = None write_serializer_class = None def get_serializer_class(self): if self.action == "create": return self.get_create_serializer_class() if self.action in ["update", "partial_update", "destroy"]: return self.get_write_serializer_class() return self.get_read_serializer_class() def get_read_serializer_class(self): assert self.read_serializer_class is not None, ( "'%s' should either include a `read_serializer_class` attribute," "or override the `get_read_serializer_class()` method." % self.__class__.__name__ ) return self.read_serializer_class def get_write_serializer_class(self): assert self.write_serializer_class is not None, ( "'%s' should either include a `write_serializer_class` attribute," "or override the `get_write_serializer_class()` method." % self.__class__.__name__ ) return self.write_serializer_class def get_create_serializer_class(self): assert self.create_serializer_class is not None, ( "'%s' should either include a `create_serializer_class` attribute," "or override the `get_create_serializer_class()` method." % self.__class__.__name__ ) return self.create_serializer_class class UlohaVzorakNodeViewSet(PermissionMixin, viewsets.ModelViewSet): queryset = m.UlohaVzorakNode.objects.all() serializer_class = views.UlohaVzorakNodeSerializer class TextViewSet(PermissionMixin, viewsets.ModelViewSet): queryset = m.Text.objects.all() serializer_class = views.TextSerializer class TextNodeViewSet(PermissionMixin, ReadWriteSerializerMixin,viewsets.ModelViewSet): queryset = m.TextNode.objects.all() read_serializer_class = views.TextNodeSerializer write_serializer_class = views.TextNodeWriteSerializer create_serializer_class = views.TextNodeCreateSerializer class CastNodeViewSet(PermissionMixin, ReadWriteSerializerMixin,viewsets.ModelViewSet): queryset = m.CastNode.objects.all() read_serializer_class = views.CastNodeSerializer write_serializer_class = views.CastNodeSerializer create_serializer_class = views.CastNodeCreateSerializer class UlohaVzorakNodeViewSet(PermissionMixin, viewsets.ModelViewSet): serializer_class = views.UlohaVzorakNodeSerializer def get_queryset(self): queryset = m.UlohaVzorakNode.objects.all() nazev = self.request.query_params.get('nazev',None) if nazev is not None: queryset = queryset.filter(nazev__contains=nazev) if self.request.user.has_perm('auth.org'): return queryset else: # pro neorgy jen zveřejněné vzoráky return queryset.filter(uloha__cislo_reseni__verejne_db=True)