From 55f501d9395ab4c621b82c2b92af7159090b25d0 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Sun, 8 Jun 2025 13:15:43 -0400 Subject: [PATCH] fix: handle user_id correctly in ChecklistItem creation and updates to avoid constraint issues --- backend/server/adventures/serializers.py | 27 ++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py index 4487598..2708ab3 100644 --- a/backend/server/adventures/serializers.py +++ b/backend/server/adventures/serializers.py @@ -271,6 +271,7 @@ class ChecklistItemSerializer(CustomModelSerializer): class ChecklistSerializer(CustomModelSerializer): items = ChecklistItemSerializer(many=True, source='checklistitem_set') + class Meta: model = Checklist fields = [ @@ -281,8 +282,16 @@ class ChecklistSerializer(CustomModelSerializer): def create(self, validated_data): items_data = validated_data.pop('checklistitem_set') checklist = Checklist.objects.create(**validated_data) + for item_data in items_data: - ChecklistItem.objects.create(checklist=checklist, **item_data) + # Remove user_id from item_data to avoid constraint issues + item_data.pop('user_id', None) + # Set user_id from the parent checklist + ChecklistItem.objects.create( + checklist=checklist, + user_id=checklist.user_id, + **item_data + ) return checklist def update(self, instance, validated_data): @@ -300,6 +309,9 @@ class ChecklistSerializer(CustomModelSerializer): # Update or create items updated_item_ids = set() for item_data in items_data: + # Remove user_id from item_data to avoid constraint issues + item_data.pop('user_id', None) + item_id = item_data.get('id') if item_id: if item_id in current_item_ids: @@ -310,10 +322,18 @@ class ChecklistSerializer(CustomModelSerializer): updated_item_ids.add(item_id) else: # If ID is provided but doesn't exist, create new item - ChecklistItem.objects.create(checklist=instance, **item_data) + ChecklistItem.objects.create( + checklist=instance, + user_id=instance.user_id, + **item_data + ) else: # If no ID is provided, create new item - ChecklistItem.objects.create(checklist=instance, **item_data) + ChecklistItem.objects.create( + checklist=instance, + user_id=instance.user_id, + **item_data + ) # Delete items that are not in the updated data items_to_delete = current_item_ids - updated_item_ids @@ -329,7 +349,6 @@ class ChecklistSerializer(CustomModelSerializer): raise serializers.ValidationError( 'Checklists associated with a public collection must be public.' ) - return data class CollectionSerializer(CustomModelSerializer):