From 9252e301a3600957cb1043548c5a78471eeca305 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 3 Mar 2020 11:07:38 +0100 Subject: [PATCH] mdel_ddpacs: make _handle_create atomic (#40011) --- passerelle/apps/mdel_ddpacs/abstract.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/passerelle/apps/mdel_ddpacs/abstract.py b/passerelle/apps/mdel_ddpacs/abstract.py index 65229313..538dce37 100644 --- a/passerelle/apps/mdel_ddpacs/abstract.py +++ b/passerelle/apps/mdel_ddpacs/abstract.py @@ -24,7 +24,7 @@ import re import xml.etree.ElementTree as ET import zipfile -from django.db import models, IntegrityError +from django.db import models, IntegrityError, transaction from django.core.urlresolvers import reverse from django.http import HttpResponse from django.utils.translation import ugettext_lazy as _ @@ -129,16 +129,17 @@ class Resource(BaseResource): def _handle_create(self, request, payload): reference = 'A-' + payload['display_id'] - try: - demand = self.demand_set.create( - reference=reference, - step=1, - data=payload) - except IntegrityError as e: - raise APIError('reference-non-unique', http_status=400, - data={'original_exc': exception_to_text(e)}) - self.add_job('push_demand', demand_id=demand.id) - return self.status(request, demand) + with transaction.atomic(): + try: + demand = self.demand_set.create( + reference=reference, + step=1, + data=payload) + except IntegrityError as e: + raise APIError('reference-non-unique', http_status=400, + data={'original_exc': exception_to_text(e)}) + self.add_job('push_demand', demand_id=demand.id) + return self.status(request, demand) def push_demand(self, demand_id): demand = self.demand_set.get(id=demand_id) -- 2.24.0