Files
site_backend/api/serializers.py

127 lines
4.4 KiB
Python

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()