update
This commit is contained in:
196
backEnd/contact/serializers.py
Normal file
196
backEnd/contact/serializers.py
Normal file
@@ -0,0 +1,196 @@
|
||||
from rest_framework import serializers
|
||||
from .models import ContactSubmission
|
||||
|
||||
|
||||
class ContactSubmissionSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
Serializer for ContactSubmission model.
|
||||
Handles both creation and retrieval of contact form submissions.
|
||||
"""
|
||||
|
||||
# Computed fields
|
||||
full_name = serializers.ReadOnlyField()
|
||||
is_high_priority = serializers.ReadOnlyField()
|
||||
is_enterprise_client = serializers.ReadOnlyField()
|
||||
industry_display = serializers.SerializerMethodField()
|
||||
project_type_display = serializers.SerializerMethodField()
|
||||
budget_display = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = ContactSubmission
|
||||
fields = [
|
||||
'id',
|
||||
'first_name',
|
||||
'last_name',
|
||||
'full_name',
|
||||
'email',
|
||||
'phone',
|
||||
'company',
|
||||
'job_title',
|
||||
'industry',
|
||||
'industry_display',
|
||||
'company_size',
|
||||
'project_type',
|
||||
'project_type_display',
|
||||
'timeline',
|
||||
'budget',
|
||||
'budget_display',
|
||||
'message',
|
||||
'newsletter_subscription',
|
||||
'privacy_consent',
|
||||
'status',
|
||||
'priority',
|
||||
'is_high_priority',
|
||||
'is_enterprise_client',
|
||||
'created_at',
|
||||
'updated_at',
|
||||
'admin_notes',
|
||||
'assigned_to',
|
||||
]
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'status',
|
||||
'priority',
|
||||
'created_at',
|
||||
'updated_at',
|
||||
'admin_notes',
|
||||
'assigned_to',
|
||||
]
|
||||
|
||||
def get_industry_display(self, obj):
|
||||
return obj.get_industry_display()
|
||||
|
||||
def get_project_type_display(self, obj):
|
||||
return obj.get_project_type_display()
|
||||
|
||||
def get_budget_display(self, obj):
|
||||
return obj.get_budget_display()
|
||||
|
||||
def validate_email(self, value):
|
||||
"""
|
||||
Custom email validation to ensure it's a business email.
|
||||
"""
|
||||
if value and not any(domain in value.lower() for domain in ['@gmail.com', '@yahoo.com', '@hotmail.com']):
|
||||
return value
|
||||
# Allow personal emails but log them
|
||||
return value
|
||||
|
||||
def validate_privacy_consent(self, value):
|
||||
"""
|
||||
Ensure privacy consent is given.
|
||||
"""
|
||||
if not value:
|
||||
raise serializers.ValidationError("Privacy consent is required to submit the form.")
|
||||
return value
|
||||
|
||||
def validate(self, attrs):
|
||||
"""
|
||||
Cross-field validation.
|
||||
"""
|
||||
# Ensure required fields are present
|
||||
required_fields = ['first_name', 'last_name', 'email', 'company', 'job_title', 'message']
|
||||
for field in required_fields:
|
||||
if not attrs.get(field):
|
||||
raise serializers.ValidationError(f"{field.replace('_', ' ').title()} is required.")
|
||||
|
||||
# Validate enterprise client indicators
|
||||
if attrs.get('company_size') in ['201-1000', '1000+'] and attrs.get('budget') in ['under-50k', '50k-100k']:
|
||||
# This might be a mismatch, but we'll allow it and flag for review
|
||||
pass
|
||||
|
||||
return attrs
|
||||
|
||||
|
||||
class ContactSubmissionCreateSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
Simplified serializer for creating contact submissions.
|
||||
Only includes fields that should be provided by the frontend.
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
model = ContactSubmission
|
||||
fields = [
|
||||
'first_name',
|
||||
'last_name',
|
||||
'email',
|
||||
'phone',
|
||||
'company',
|
||||
'job_title',
|
||||
'industry',
|
||||
'company_size',
|
||||
'project_type',
|
||||
'timeline',
|
||||
'budget',
|
||||
'message',
|
||||
'newsletter_subscription',
|
||||
'privacy_consent',
|
||||
]
|
||||
|
||||
def validate_privacy_consent(self, value):
|
||||
"""
|
||||
Ensure privacy consent is given.
|
||||
"""
|
||||
if not value:
|
||||
raise serializers.ValidationError("Privacy consent is required to submit the form.")
|
||||
return value
|
||||
|
||||
def validate(self, attrs):
|
||||
"""
|
||||
Cross-field validation for creation.
|
||||
"""
|
||||
# Ensure required fields are present
|
||||
required_fields = ['first_name', 'last_name', 'email', 'company', 'job_title', 'message']
|
||||
for field in required_fields:
|
||||
if not attrs.get(field):
|
||||
raise serializers.ValidationError(f"{field.replace('_', ' ').title()} is required.")
|
||||
|
||||
return attrs
|
||||
|
||||
|
||||
class ContactSubmissionListSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
Simplified serializer for listing contact submissions.
|
||||
Used in admin views and API listings.
|
||||
"""
|
||||
|
||||
full_name = serializers.ReadOnlyField()
|
||||
is_high_priority = serializers.ReadOnlyField()
|
||||
is_enterprise_client = serializers.ReadOnlyField()
|
||||
|
||||
class Meta:
|
||||
model = ContactSubmission
|
||||
fields = [
|
||||
'id',
|
||||
'full_name',
|
||||
'email',
|
||||
'company',
|
||||
'job_title',
|
||||
'project_type',
|
||||
'status',
|
||||
'priority',
|
||||
'is_high_priority',
|
||||
'is_enterprise_client',
|
||||
'created_at',
|
||||
]
|
||||
|
||||
|
||||
class ContactSubmissionUpdateSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
Serializer for updating contact submissions (admin use).
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
model = ContactSubmission
|
||||
fields = [
|
||||
'status',
|
||||
'priority',
|
||||
'admin_notes',
|
||||
'assigned_to',
|
||||
]
|
||||
|
||||
def validate_status(self, value):
|
||||
"""
|
||||
Validate status transitions.
|
||||
"""
|
||||
# Add business logic for status transitions if needed
|
||||
return value
|
||||
Reference in New Issue
Block a user