From a7bb4ddcaa357399cf2ce001b2233b60a22baa58 Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Wed, 29 Mar 2023 15:01:29 -0400
Subject: [PATCH] Add ImageSerializer

---
 program/serializers.py | 50 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/program/serializers.py b/program/serializers.py
index 8ec1d823..21f4b476 100644
--- a/program/serializers.py
+++ b/program/serializers.py
@@ -30,6 +30,7 @@ from program.models import (
     FundingCategory,
     Host,
     HostLink,
+    Image,
     Language,
     LicenseType,
     LinkType,
@@ -209,6 +210,55 @@ class ThumbnailsMixin:
         return thumbnails
 
 
+class ImageSerializer(serializers.ModelSerializer):
+    thumbnails = serializers.SerializerMethodField()
+
+    @staticmethod
+    def get_thumbnails(instance) -> List[str]:
+        """Returns thumbnails"""
+        thumbnails = []
+
+        if instance.image.name and THUMBNAIL_SIZES:
+            for size in THUMBNAIL_SIZES:
+                thumbnails.append(instance.image.crop[size].name)
+
+        return thumbnails
+
+    class Meta:
+        model = Image
+        read_only_fields = (
+            "height",
+            "id",
+            "ppoi",
+            "thumbnails",
+            "width",
+        )
+        fields = (
+            "alt_text",
+            "credits",
+            "image",
+        ) + read_only_fields
+
+    def create(self, validated_data):
+        """Create and return a new Image instance, given the validated data."""
+
+        image = Image.objects.create(**validated_data | self.context)
+        image.save()
+
+        return image
+
+    def update(self, instance, validated_data):
+        """Update and return an existing Image instance, given the validated data."""
+
+        # Only alt_text and credits can be updated.
+        instance.alt_text = validated_data.get("alt_text", instance.alt_text)
+        instance.credits = validated_data.get("credits", instance.credits)
+
+        instance.save()
+
+        return instance
+
+
 class HostSerializer(ThumbnailsMixin, serializers.ModelSerializer):
     links = HostLinkSerializer(many=True, required=False)
     thumbnails = serializers.SerializerMethodField()
-- 
GitLab