fix(customers): Auto-generate username when creating customers
The CustomerSerializer was missing a create method to generate a unique username, causing IntegrityError when trying to create customers. - Add first_name and last_name as write-only fields - Remove email from read_only_fields so it can be set on creation - Generate username from email prefix (with counter for uniqueness) - Fall back to UUID-based username if no email provided 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -38,6 +38,8 @@ class ResourceTypeSerializer(serializers.ModelSerializer):
|
|||||||
class CustomerSerializer(serializers.ModelSerializer):
|
class CustomerSerializer(serializers.ModelSerializer):
|
||||||
"""Serializer for Customer (User with role=CUSTOMER)"""
|
"""Serializer for Customer (User with role=CUSTOMER)"""
|
||||||
name = serializers.SerializerMethodField()
|
name = serializers.SerializerMethodField()
|
||||||
|
first_name = serializers.CharField(write_only=True, required=False, allow_blank=True)
|
||||||
|
last_name = serializers.CharField(write_only=True, required=False, allow_blank=True)
|
||||||
total_spend = serializers.SerializerMethodField()
|
total_spend = serializers.SerializerMethodField()
|
||||||
last_visit = serializers.SerializerMethodField()
|
last_visit = serializers.SerializerMethodField()
|
||||||
status = serializers.SerializerMethodField()
|
status = serializers.SerializerMethodField()
|
||||||
@@ -52,11 +54,29 @@ class CustomerSerializer(serializers.ModelSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
fields = [
|
fields = [
|
||||||
'id', 'name', 'email', 'phone', 'city', 'state', 'zip',
|
'id', 'name', 'first_name', 'last_name', 'email', 'phone', 'city', 'state', 'zip',
|
||||||
'total_spend', 'last_visit', 'status', 'avatar_url', 'tags',
|
'total_spend', 'last_visit', 'status', 'avatar_url', 'tags',
|
||||||
'user_id', 'user_data',
|
'user_id', 'user_data',
|
||||||
]
|
]
|
||||||
read_only_fields = ['id', 'email']
|
read_only_fields = ['id']
|
||||||
|
|
||||||
|
def create(self, validated_data):
|
||||||
|
"""Create a customer with auto-generated username"""
|
||||||
|
import uuid
|
||||||
|
email = validated_data.get('email', '')
|
||||||
|
# Generate username from email or use a UUID if no email
|
||||||
|
if email:
|
||||||
|
base_username = email.split('@')[0]
|
||||||
|
username = base_username
|
||||||
|
counter = 1
|
||||||
|
while User.objects.filter(username=username).exists():
|
||||||
|
username = f"{base_username}{counter}"
|
||||||
|
counter += 1
|
||||||
|
else:
|
||||||
|
username = f"customer_{uuid.uuid4().hex[:8]}"
|
||||||
|
|
||||||
|
validated_data['username'] = username
|
||||||
|
return super().create(validated_data)
|
||||||
|
|
||||||
def get_name(self, obj):
|
def get_name(self, obj):
|
||||||
return obj.full_name
|
return obj.full_name
|
||||||
|
|||||||
Reference in New Issue
Block a user