import hashlib from rest_framework import serializers from apps.accounts.models import User from apps.accounts.serializers import UserSerializer from .models import Album, AlbumCollaborator, AlbumItem, LibraryItem, MediaRendition class MediaRenditionSerializer(serializers.ModelSerializer): class Meta: model = MediaRendition fields = ["kind", "file", "width", "height"] class LibraryItemSerializer(serializers.ModelSerializer): renditions = MediaRenditionSerializer(many=True, read_only=True) class Meta: model = LibraryItem fields = [ "id", "file", "media_type", "original_filename", "file_size", "width", "height", "duration_seconds", "captured_at", "latitude", "longitude", "camera_make", "camera_model", "processing_status", "renditions", "created_at", ] read_only_fields = [ "id", "width", "height", "duration_seconds", "captured_at", "camera_make", "camera_model", "processing_status", "renditions", "created_at", ] def create(self, validated_data): upload = validated_data["file"] checksum = hashlib.sha256(upload.read()).hexdigest() upload.seek(0) validated_data["checksum"] = checksum validated_data["file_size"] = upload.size validated_data.setdefault("original_filename", upload.name) validated_data["owner"] = self.context["request"].user library_item, _created = LibraryItem.objects.get_or_create( owner=validated_data["owner"], checksum=checksum, defaults=validated_data, ) return library_item class AlbumItemSerializer(serializers.ModelSerializer): library_item = LibraryItemSerializer(read_only=True) library_item_id = serializers.PrimaryKeyRelatedField( queryset=LibraryItem.objects.all(), source="library_item", write_only=True ) class Meta: model = AlbumItem fields = ["id", "album", "library_item", "library_item_id", "added_by", "added_at"] read_only_fields = ["id", "album", "added_by", "added_at"] class AlbumCollaboratorSerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) user_id = serializers.PrimaryKeyRelatedField( queryset=User.objects.all(), source="user", write_only=True ) class Meta: model = AlbumCollaborator fields = ["id", "album", "user", "user_id", "role", "status", "invited_by"] read_only_fields = ["id", "album", "status", "invited_by"] class AlbumSerializer(serializers.ModelSerializer): items = AlbumItemSerializer(many=True, read_only=True) collaborators = AlbumCollaboratorSerializer(many=True, read_only=True) class Meta: model = Album fields = [ "id", "owner", "name", "description", "cover_item", "audience", "items", "collaborators", "created_at", "updated_at", ] read_only_fields = ["id", "owner", "items", "collaborators", "created_at", "updated_at"]