From 63d01445917073b83c0c47ab152c6b3808f018bd Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 17 Dec 2019 01:37:12 -0400 Subject: [PATCH] Add transaction handling to the interval sources Adds transaction handling to the delete and save methods. Signed-off-by: Roberto Rosario --- HISTORY.rst | 2 ++ mayan/apps/sources/models/base.py | 32 ++++++++++++++++--------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 909ecc3ca2..1d3d3f1ede 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -15,6 +15,8 @@ - Delete periodic task on document type delete. Closes Gitlab issue #715. Thanks to Rob de Canha-Knight (@rssfed23) for the report and research. +- Add transaction handling to the interval sources delete and save + methods. 3.3.5 (2019-12-13) ================== diff --git a/mayan/apps/sources/models/base.py b/mayan/apps/sources/models/base.py index 1f1fefc2bf..bc4c0a3f68 100644 --- a/mayan/apps/sources/models/base.py +++ b/mayan/apps/sources/models/base.py @@ -217,26 +217,28 @@ class IntervalBaseModel(OutOfProcessSource): def delete(self, *args, **kwargs): pk = self.pk - super(IntervalBaseModel, self).delete(*args, **kwargs) - self._delete_periodic_task(pk=pk) + with transaction.atomic(): + super(IntervalBaseModel, self).delete(*args, **kwargs) + self._delete_periodic_task(pk=pk) def save(self, *args, **kwargs): new_source = not self.pk - super(IntervalBaseModel, self).save(*args, **kwargs) + with transaction.atomic(): + super(IntervalBaseModel, self).save(*args, **kwargs) - if not new_source: - self._delete_periodic_task() + if not new_source: + self._delete_periodic_task() - interval_instance, created = IntervalSchedule.objects.get_or_create( - every=self.interval, period='seconds' - ) - # Create a new interval or reuse someone else's - PeriodicTask.objects.create( - name=self._get_periodic_task_name(), - interval=interval_instance, - task='mayan.apps.sources.tasks.task_check_interval_source', - kwargs=json.dumps({'source_id': self.pk}) - ) + interval_instance, created = IntervalSchedule.objects.get_or_create( + every=self.interval, period='seconds' + ) + # Create a new interval or reuse someone else's + PeriodicTask.objects.create( + name=self._get_periodic_task_name(), + interval=interval_instance, + task='mayan.apps.sources.tasks.task_check_interval_source', + kwargs=json.dumps({'source_id': self.pk}) + ) class SourceLog(models.Model):