from django.http import HttpResponseRedirect from rest_framework.exceptions import PermissionDenied from rest_framework.permissions import AllowAny from outbo.apps.core.viewsets import ( AutoPermissionViewSetMixin, RetrieveModelMixin, MultipleSerializerViewSet, PartialUpdateModelMixin, NestedViewSetMixin, CreateModelMixin, ListModelMixin, DestroyModelMixin, ) from outbo.apps.photobriefing import rules from outbo.apps.photobriefing.models import Brief, BriefItem, Category, BriefItemPhoto from outbo.apps.photobriefing.serializers import ( BriefSerializer, BriefItemSerializer, CategorySerializer, BriefItemPhotoSerializer, ) class BriefViewSet( AutoPermissionViewSetMixin, PartialUpdateModelMixin, RetrieveModelMixin, MultipleSerializerViewSet, ): queryset = Brief.objects.all() serializer_class_set = BriefSerializer class BriefItemViewSet( AutoPermissionViewSetMixin, DestroyModelMixin, MultipleSerializerViewSet, ): queryset = BriefItem.objects.all() serializer_class_set = BriefItemSerializer class BriefItemNestedViewSet( NestedViewSetMixin, AutoPermissionViewSetMixin, CreateModelMixin, MultipleSerializerViewSet, ): queryset = BriefItem.objects.all() serializer_class_set = BriefItemSerializer def perform_create(self, *, serializer): current_user = self.request.user parents = self.get_parents_query_dict() brief = Brief.objects.get(pk=parents["brief_id"]) if not rules.can_edit_brief.test(current_user, brief): raise PermissionDenied() # NOTE: Should it be here? return serializer.save(brief=brief) class BriefItemPhotoViewSet( AutoPermissionViewSetMixin, RetrieveModelMixin, MultipleSerializerViewSet, ): queryset = BriefItemPhoto.objects.all() serializer_class_set = BriefItemPhotoSerializer retrieve_permission_classes = [AllowAny] def get_permissions(self): if self.action == "retrieve": return [permission() for permission in self.retrieve_permission_classes] return super().get_permissions() def retrieve(self, request, *args, **kwargs): photo: BriefItemPhoto = self.get_object() return HttpResponseRedirect(redirect_to=photo.file.url) class CategoryViewSet( AutoPermissionViewSetMixin, ListModelMixin, MultipleSerializerViewSet, ): queryset = Category.objects.all() serializer_class_set = CategorySerializer