From 57e367d112def03a3c2bda086b055b2e5ecb201b Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Fri, 3 Jan 2025 09:53:23 -0500 Subject: [PATCH] refactor: update AdventureSerializer to handle visits data more gracefully and remove visits from request body in AdventureCard --- backend/server/adventures/serializers.py | 36 ++++++++++--------- .../src/lib/components/AdventureCard.svelte | 4 +-- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py index d78e93d..2c677f7 100644 --- a/backend/server/adventures/serializers.py +++ b/backend/server/adventures/serializers.py @@ -116,7 +116,7 @@ class AdventureSerializer(CustomModelSerializer): return False def create(self, validated_data): - visits_data = validated_data.pop('visits', []) + visits_data = validated_data.pop('visits', None) category_data = validated_data.pop('category', None) print(category_data) adventure = Adventure.objects.create(**validated_data) @@ -131,6 +131,7 @@ class AdventureSerializer(CustomModelSerializer): return adventure def update(self, instance, validated_data): + has_visits = 'visits' in validated_data visits_data = validated_data.pop('visits', []) category_data = validated_data.pop('category', None) @@ -142,24 +143,25 @@ class AdventureSerializer(CustomModelSerializer): instance.category = category instance.save() - current_visits = instance.visits.all() - current_visit_ids = set(current_visits.values_list('id', flat=True)) + if has_visits: + current_visits = instance.visits.all() + current_visit_ids = set(current_visits.values_list('id', flat=True)) - updated_visit_ids = set() - for visit_data in visits_data: - visit_id = visit_data.get('id') - if visit_id and visit_id in current_visit_ids: - visit = current_visits.get(id=visit_id) - for attr, value in visit_data.items(): - setattr(visit, attr, value) - visit.save() - updated_visit_ids.add(visit_id) - else: - new_visit = Visit.objects.create(adventure=instance, **visit_data) - updated_visit_ids.add(new_visit.id) + updated_visit_ids = set() + for visit_data in visits_data: + visit_id = visit_data.get('id') + if visit_id and visit_id in current_visit_ids: + visit = current_visits.get(id=visit_id) + for attr, value in visit_data.items(): + setattr(visit, attr, value) + visit.save() + updated_visit_ids.add(visit_id) + else: + new_visit = Visit.objects.create(adventure=instance, **visit_data) + updated_visit_ids.add(new_visit.id) - visits_to_delete = current_visit_ids - updated_visit_ids - instance.visits.filter(id__in=visits_to_delete).delete() + visits_to_delete = current_visit_ids - updated_visit_ids + instance.visits.filter(id__in=visits_to_delete).delete() return instance diff --git a/frontend/src/lib/components/AdventureCard.svelte b/frontend/src/lib/components/AdventureCard.svelte index 49990d5..b77b8ea 100644 --- a/frontend/src/lib/components/AdventureCard.svelte +++ b/frontend/src/lib/components/AdventureCard.svelte @@ -80,7 +80,7 @@ headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ collection: null, visits: adventure.visits }) + body: JSON.stringify({ collection: null }) }); if (res.ok) { addToast('info', `${$t('adventures.collection_remove_success')}`); @@ -97,7 +97,7 @@ headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ collection: collectionId, visits: adventure.visits }) + body: JSON.stringify({ collection: collectionId }) }); if (res.ok) { console.log('Adventure linked to collection');