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