127 lines
4.4 KiB
Python
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()
|
|
|