from rest_framework import serializers from .models import ContactUs, Composition, Campaign class ContactUsSerializer(serializers.ModelSerializer): """ Serializer for ContactUs model. """ class Meta: model = ContactUs fields = ['id', 'name', 'email_or_phone', 'description', 'category', 'created_at', 'updated_at'] read_only_fields = ['id', 'created_at', 'updated_at'] def validate_email_or_phone(self, value): """Validate that the field contains either email or phone.""" if not value or len(value.strip()) == 0: raise serializers.ValidationError("Email or phone number is required.") return value.strip() def validate_name(self, value): """Validate name field.""" if not value or len(value.strip()) == 0: raise serializers.ValidationError("Name is required.") return value.strip() def validate_description(self, value): """Validate description field.""" if not value or len(value.strip()) == 0: raise serializers.ValidationError("Description is required.") return value.strip() class CompositionSerializer(serializers.ModelSerializer): """ Serializer for Composition model. """ image_url = serializers.SerializerMethodField() class Meta: model = Composition fields = ['id', 'name', 'description', 'image', 'image_url', 'created_at', 'updated_at'] read_only_fields = ['id', 'created_at', 'updated_at', 'image_url'] def get_image_url(self, obj): """Get the full URL of the image.""" if obj.image: request = self.context.get('request') if request: return request.build_absolute_uri(obj.image.url) return obj.image.url return None def validate_name(self, value): """Validate name field.""" if not value or len(value.strip()) == 0: raise serializers.ValidationError("Name is required.") return value.strip() def validate_description(self, value): """Validate description field.""" if not value or len(value.strip()) == 0: raise serializers.ValidationError("Description is required.") return value.strip() class CampaignSerializer(serializers.ModelSerializer): """ Serializer for Campaign model. """ image_url = serializers.SerializerMethodField() is_active = serializers.SerializerMethodField() is_upcoming = serializers.SerializerMethodField() is_ended = serializers.SerializerMethodField() class Meta: model = Campaign fields = ['id', 'name', 'description', 'start_time', 'end_time', 'image', 'image_url', 'is_active', 'is_upcoming', 'is_ended', 'created_at', 'updated_at'] read_only_fields = ['id', 'created_at', 'updated_at', 'image_url', 'is_active', 'is_upcoming', 'is_ended'] def get_image_url(self, obj): """Get the full URL of the image.""" if obj.image: request = self.context.get('request') if request: return request.build_absolute_uri(obj.image.url) return obj.image.url return None def get_is_active(self, obj): """Get campaign active status.""" return obj.is_active() def get_is_upcoming(self, obj): """Get campaign upcoming status.""" return obj.is_upcoming() def get_is_ended(self, obj): """Get campaign ended status.""" return obj.is_ended() def validate(self, data): """Validate that end_time is after start_time.""" if 'start_time' in data and 'end_time' in data: if data['end_time'] <= data['start_time']: raise serializers.ValidationError({ 'end_time': 'End time must be after start time.' }) return data def validate_name(self, value): """Validate name field.""" if not value or len(value.strip()) == 0: raise serializers.ValidationError("Name is required.") return value.strip() def validate_description(self, value): """Validate description field.""" if not value or len(value.strip()) == 0: raise serializers.ValidationError("Description is required.") return value.strip()