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