139 lines
5.1 KiB
Python
139 lines
5.1 KiB
Python
from django.contrib.auth import get_user_model
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
from rest_framework import serializers
|
|
|
|
from .models import CustomerProfile, VendorProfile
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
class VendorProfileSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = VendorProfile
|
|
fields = (
|
|
"business_name",
|
|
"slug",
|
|
"description",
|
|
"contact_phone",
|
|
"contact_email",
|
|
"address_line1",
|
|
"address_line2",
|
|
"city",
|
|
"state",
|
|
"postal_code",
|
|
"country",
|
|
"created_at",
|
|
"updated_at",
|
|
)
|
|
read_only_fields = ("slug", "created_at", "updated_at")
|
|
|
|
|
|
class VendorRegistrationSerializer(serializers.Serializer):
|
|
email = serializers.EmailField()
|
|
password = serializers.CharField(write_only=True, min_length=8)
|
|
first_name = serializers.CharField(required=False, allow_blank=True, max_length=150)
|
|
last_name = serializers.CharField(required=False, allow_blank=True, max_length=150)
|
|
phone_number = serializers.CharField(required=False, allow_blank=True, max_length=32)
|
|
|
|
business_name = serializers.CharField(max_length=255)
|
|
description = serializers.CharField(required=False, allow_blank=True)
|
|
contact_phone = serializers.CharField(required=False, allow_blank=True, max_length=32)
|
|
contact_email = serializers.EmailField(required=False, allow_blank=True)
|
|
address_line1 = serializers.CharField(required=False, allow_blank=True, max_length=255)
|
|
address_line2 = serializers.CharField(required=False, allow_blank=True, max_length=255)
|
|
city = serializers.CharField(required=False, allow_blank=True, max_length=100)
|
|
state = serializers.CharField(required=False, allow_blank=True, max_length=100)
|
|
postal_code = serializers.CharField(required=False, allow_blank=True, max_length=32)
|
|
country = serializers.CharField(required=False, allow_blank=True, max_length=100)
|
|
|
|
def validate_email(self, value):
|
|
if User.objects.filter(email__iexact=value).exists():
|
|
raise serializers.ValidationError("A user with this email already exists.")
|
|
return value
|
|
|
|
def create(self, validated_data):
|
|
profile_data = {
|
|
"business_name": validated_data.pop("business_name"),
|
|
"description": validated_data.pop("description", ""),
|
|
"contact_phone": validated_data.pop("contact_phone", ""),
|
|
"contact_email": validated_data.pop("contact_email", ""),
|
|
"address_line1": validated_data.pop("address_line1", ""),
|
|
"address_line2": validated_data.pop("address_line2", ""),
|
|
"city": validated_data.pop("city", ""),
|
|
"state": validated_data.pop("state", ""),
|
|
"postal_code": validated_data.pop("postal_code", ""),
|
|
"country": validated_data.pop("country", ""),
|
|
}
|
|
password = validated_data.pop("password")
|
|
user = User.objects.create_user(
|
|
password=password,
|
|
is_vendor=True,
|
|
is_customer=False,
|
|
**validated_data,
|
|
)
|
|
VendorProfile.objects.create(user=user, **profile_data)
|
|
return user
|
|
|
|
|
|
class CustomerProfileSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = CustomerProfile
|
|
fields = (
|
|
"preferred_contact_method",
|
|
"emergency_contact_name",
|
|
"emergency_contact_phone",
|
|
"created_at",
|
|
"updated_at",
|
|
)
|
|
read_only_fields = fields
|
|
|
|
|
|
class CustomerRegistrationSerializer(serializers.Serializer):
|
|
email = serializers.EmailField()
|
|
password = serializers.CharField(write_only=True, min_length=8)
|
|
first_name = serializers.CharField(required=False, allow_blank=True, max_length=150)
|
|
last_name = serializers.CharField(required=False, allow_blank=True, max_length=150)
|
|
phone_number = serializers.CharField(required=False, allow_blank=True, max_length=32)
|
|
|
|
def validate_email(self, value):
|
|
if User.objects.filter(email__iexact=value).exists():
|
|
raise serializers.ValidationError("A user with this email already exists.")
|
|
return value
|
|
|
|
def create(self, validated_data):
|
|
password = validated_data.pop("password")
|
|
user = User.objects.create_user(
|
|
password=password,
|
|
is_vendor=False,
|
|
is_customer=True,
|
|
**validated_data,
|
|
)
|
|
CustomerProfile.objects.create(user=user)
|
|
return user
|
|
|
|
|
|
class UserMeSerializer(serializers.ModelSerializer):
|
|
vendor_profile = VendorProfileSerializer(read_only=True)
|
|
customer_profile = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = (
|
|
"id",
|
|
"email",
|
|
"first_name",
|
|
"last_name",
|
|
"phone_number",
|
|
"is_vendor",
|
|
"is_customer",
|
|
"vendor_profile",
|
|
"customer_profile",
|
|
)
|
|
|
|
def get_customer_profile(self, obj):
|
|
try:
|
|
profile = obj.customer_profile
|
|
except ObjectDoesNotExist:
|
|
return None
|
|
return CustomerProfileSerializer(profile).data
|