Gallery-Archivist/backend/api/creators/serializers.py

125 lines
3.5 KiB
Python

from rest_framework import serializers
from django.utils.timezone import localtime
from apps.archive.models import CreatorDescription, CreatorModel
class CreatorListSerializer(serializers.ModelSerializer):
source_site = serializers.SerializerMethodField()
date = serializers.SerializerMethodField()
description = serializers.SerializerMethodField()
avatar_url = serializers.SerializerMethodField()
banner_url = serializers.SerializerMethodField()
class Meta:
model = CreatorModel
fields = [
"creator_id",
"source_site",
"slug",
"name",
"date",
"description",
"avatar_url",
"banner_url",
]
def get_source_site(self, obj):
return obj.source_site.slug
def get_date(self, obj):
return {
"created": localtime(obj.date_created).isoformat(),
"imported": localtime(obj.date_imported).isoformat(),
"last_import": localtime(obj.date_last_import).isoformat(),
}
def get_description(self, obj):
# Get the most recent CreatorDescription entry
creator_desc = (
CreatorDescription.objects.filter(creator=obj)
.order_by("-date_imported")
.first()
)
if creator_desc:
return creator_desc.description.content
return None # Return None if no descriptions exist
def get_avatar_url(self, obj):
if obj.avatar:
return obj.avatar.file.url
else:
return None
def get_banner_url(self, obj):
if obj.banner:
return obj.banner.file.url
else:
return None
class CreatorDetailsSerializer(serializers.ModelSerializer):
description = serializers.SerializerMethodField()
date = serializers.SerializerMethodField()
avatar_url = serializers.SerializerMethodField()
banner_url = serializers.SerializerMethodField()
categories = serializers.SerializerMethodField()
class Meta:
model = CreatorModel
fields = [
"creator_id",
"slug",
"name",
"avatar_url",
"banner_url",
"description",
"date",
"categories",
]
def get_description(self, obj):
data = []
# Fetch descriptions ordered by date_imported from the through model
creator_descriptions = CreatorDescription.objects.filter(creator=obj).order_by(
"-date_imported"
)
for creator_desc in creator_descriptions:
data.append(
{
"id": creator_desc.description.id,
"content": creator_desc.description.content,
"date_imported": creator_desc.date_imported,
}
)
return data
def get_avatar_url(self, obj):
if obj.avatar:
return obj.avatar.file.url
else:
return None
def get_banner_url(self, obj):
if obj.banner:
return obj.banner.file.url
else:
return None
def get_date(self, obj):
return {
"created": localtime(obj.date_created).isoformat(),
"imported": localtime(obj.date_imported).isoformat(),
"last_import": localtime(obj.date_last_import).isoformat(),
}
def get_categories(self, obj):
data = []
for cat in obj.categories.all():
data.append({"name": cat.name, "slug": cat.slug})
return data