100 lines
3.0 KiB
Python
Executable File
100 lines
3.0 KiB
Python
Executable File
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)
|