Fix API bug: Do not delete SubEventItems on PATCH request

This commit is contained in:
Raphael Michel
2020-08-06 09:28:35 +02:00
parent 0e245b41ee
commit 69879bdae0
2 changed files with 45 additions and 12 deletions

View File

@@ -459,12 +459,13 @@ class SubEventSerializer(I18nAwareModelSerializer):
@transaction.atomic @transaction.atomic
def update(self, instance, validated_data): def update(self, instance, validated_data):
item_price_overrides_data = validated_data.pop('subeventitem_set') if 'subeventitem_set' in validated_data else {} item_price_overrides_data = validated_data.pop('subeventitem_set')
variation_price_overrides_data = validated_data.pop('subeventitemvariation_set') if 'subeventitemvariation_set' in validated_data else {} variation_price_overrides_data = validated_data.pop('subeventitemvariation_set')
meta_data = validated_data.pop('meta_data', None) meta_data = validated_data.pop('meta_data', None)
seat_category_mapping = validated_data.pop('seat_category_mapping', None) seat_category_mapping = validated_data.pop('seat_category_mapping', None)
subevent = super().update(instance, validated_data) subevent = super().update(instance, validated_data)
if item_price_overrides_data is not None:
existing_item_overrides = {item.item: item.id for item in SubEventItem.objects.filter(subevent=subevent)} existing_item_overrides = {item.item: item.id for item in SubEventItem.objects.filter(subevent=subevent)}
for item_price_override_data in item_price_overrides_data: for item_price_override_data in item_price_overrides_data:
@@ -473,6 +474,7 @@ class SubEventSerializer(I18nAwareModelSerializer):
SubEventItem.objects.filter(id__in=existing_item_overrides.values()).delete() SubEventItem.objects.filter(id__in=existing_item_overrides.values()).delete()
if variation_price_overrides_data is not None:
existing_variation_overrides = {item.variation: item.id for item in SubEventItemVariation.objects.filter(subevent=subevent)} existing_variation_overrides = {item.variation: item.id for item in SubEventItemVariation.objects.filter(subevent=subevent)}
for variation_price_override_data in variation_price_overrides_data: for variation_price_override_data in variation_price_overrides_data:

View File

@@ -562,6 +562,37 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
assert resp.content.decode() == '{"non_field_errors":["One or more variations do not belong to this event."]}' assert resp.content.decode() == '{"non_field_errors":["One or more variations do not belong to this event."]}'
@pytest.mark.django_db
def test_subevent_update_keep_subeventitems(token_client, organizer, event, subevent, item, item2):
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
{
"item_price_overrides": [
{
"item": item.pk,
"price": "88.88",
"disabled": True
}
],
},
format='json'
)
assert resp.status_code == 200
with scopes_disabled():
assert event.subevents.get(id=subevent.id).item_overrides[item.pk].disabled
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
{
"date_from": "2017-12-27T10:00:00Z",
},
format='json'
)
assert resp.status_code == 200
with scopes_disabled():
assert event.subevents.get(id=subevent.id).item_overrides[item.pk].disabled
@pytest.mark.django_db @pytest.mark.django_db
def test_subevent_detail(token_client, organizer, event, subevent): def test_subevent_detail(token_client, organizer, event, subevent):
res = dict(TEST_SUBEVENT_RES) res = dict(TEST_SUBEVENT_RES)