Files
GNX-WEB/gnx-react/backend/case_studies/serializers.py
Iliyan Angelov 18ae8b9f88 update
2025-10-08 13:46:46 +03:00

112 lines
4.0 KiB
Python

from rest_framework import serializers
from .models import CaseStudy, CaseStudyCategory, Client, CaseStudyImage, CaseStudyProcess
class CaseStudyCategorySerializer(serializers.ModelSerializer):
"""Serializer for case study categories"""
case_studies_count = serializers.SerializerMethodField()
class Meta:
model = CaseStudyCategory
fields = ['id', 'name', 'slug', 'description', 'display_order', 'case_studies_count']
def get_case_studies_count(self, obj):
return obj.case_studies.filter(published=True).count()
class ClientSerializer(serializers.ModelSerializer):
"""Serializer for clients"""
logo = serializers.SerializerMethodField()
class Meta:
model = Client
fields = ['id', 'name', 'slug', 'logo', 'description', 'website']
def get_logo(self, obj):
return obj.get_logo_url
class CaseStudyImageSerializer(serializers.ModelSerializer):
"""Serializer for case study gallery images"""
image = serializers.SerializerMethodField()
class Meta:
model = CaseStudyImage
fields = ['id', 'image', 'caption', 'display_order']
def get_image(self, obj):
return obj.get_image_url
class CaseStudyProcessSerializer(serializers.ModelSerializer):
"""Serializer for case study process steps"""
class Meta:
model = CaseStudyProcess
fields = ['id', 'title', 'description', 'step_number']
class CaseStudyListSerializer(serializers.ModelSerializer):
"""Serializer for case study list view"""
category_name = serializers.CharField(source='category.name', read_only=True)
category_slug = serializers.CharField(source='category.slug', read_only=True)
client_name = serializers.CharField(source='client.name', read_only=True, allow_null=True)
thumbnail = serializers.SerializerMethodField()
class Meta:
model = CaseStudy
fields = [
'id', 'title', 'slug', 'subtitle', 'excerpt', 'thumbnail',
'category_name', 'category_slug', 'client_name',
'published_at', 'created_at', 'updated_at',
'views_count', 'featured', 'published', 'display_order'
]
def get_thumbnail(self, obj):
return obj.get_thumbnail_url
class CaseStudyDetailSerializer(serializers.ModelSerializer):
"""Serializer for case study detail view"""
category = CaseStudyCategorySerializer(read_only=True)
client = ClientSerializer(read_only=True)
thumbnail = serializers.SerializerMethodField()
featured_image = serializers.SerializerMethodField()
poster_image = serializers.SerializerMethodField()
project_image = serializers.SerializerMethodField()
gallery_images = CaseStudyImageSerializer(many=True, read_only=True)
process_steps = CaseStudyProcessSerializer(many=True, read_only=True)
related_case_studies = serializers.SerializerMethodField()
class Meta:
model = CaseStudy
fields = [
'id', 'title', 'slug', 'subtitle', 'description', 'excerpt',
'thumbnail', 'featured_image', 'poster_image', 'project_image',
'project_overview', 'site_map_content',
'category', 'client', 'gallery_images', 'process_steps',
'meta_description', 'meta_keywords',
'published', 'featured', 'views_count', 'display_order',
'published_at', 'created_at', 'updated_at', 'related_case_studies'
]
def get_thumbnail(self, obj):
return obj.get_thumbnail_url
def get_featured_image(self, obj):
return obj.get_featured_image_url
def get_poster_image(self, obj):
return obj.get_poster_image_url
def get_project_image(self, obj):
return obj.get_project_image_url
def get_related_case_studies(self, obj):
"""Get related case studies from the same category"""
related = CaseStudy.objects.filter(
category=obj.category,
published=True
).exclude(id=obj.id)[:3]
return CaseStudyListSerializer(related, many=True, context=self.context).data