from django.http import HttpResponseRedirect from rest_framework import serializers from rest_framework.permissions import AllowAny from outbo.apps.core.viewsets import ( AutoPermissionViewSetMixin, RetrieveModelMixin, MultipleSerializerViewSet, PartialUpdateModelMixin, DestroyModelMixin, ) from outbo.apps.final_photobriefing.enums import PhotoType from outbo.apps.final_photobriefing.models import FinalBrief, FinalBriefPhoto class FinalBriefPhotoSerializer: class List(serializers.ModelSerializer): url = serializers.HyperlinkedIdentityField( view_name="final_photobriefing:finalbriefphoto-detail" ) type = serializers.SerializerMethodField() filename = serializers.ReadOnlyField() class Meta: model = FinalBriefPhoto fields = ["url", "type", "filename"] def get_type(self, instance): t, val = instance.type.split(".", 1) return PhotoType[val].value class Create(serializers.ModelSerializer): type = serializers.CharField() class Meta: model = FinalBriefPhoto fields = ["type", "file"] def validate_type(self, value): try: return PhotoType(value) except ValueError: raise serializers.ValidationError("Invalid photo type value") class BaseFinalBriefSerializer(serializers.ModelSerializer): class Meta: model = FinalBrief class FinalBriefSerializer: class Retrieve(BaseFinalBriefSerializer): photos = FinalBriefPhotoSerializer.List(many=True) class Meta(BaseFinalBriefSerializer.Meta): fields = ["photos", "created_at", "updated_at"] class Update(BaseFinalBriefSerializer): photos = FinalBriefPhotoSerializer.Create(many=True) class Meta(BaseFinalBriefSerializer.Meta): fields = ["photos"] def update(self, instance, validated_data): photos = validated_data.pop("photos", None) if photos is not None: for photo in photos: FinalBriefPhoto.objects.create(brief=instance, **photo) return instance class FinalBriefViewSet( AutoPermissionViewSetMixin, RetrieveModelMixin, PartialUpdateModelMixin, MultipleSerializerViewSet, ): queryset = FinalBrief.objects.all() serializer_class_set = FinalBriefSerializer class FinalBriefPhotoViewSet( AutoPermissionViewSetMixin, RetrieveModelMixin, DestroyModelMixin, MultipleSerializerViewSet, ): queryset = FinalBriefPhoto.objects.all() serializer_class_set = FinalBriefPhotoSerializer 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 = self.get_object() return HttpResponseRedirect(redirect_to=photo.file.url)