summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ishtar_common/models_imports.py20
-rw-r--r--ishtar_common/utils.py6
-rw-r--r--ishtar_common/views.py15
3 files changed, 39 insertions, 2 deletions
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index d26a20791..6ee126976 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -48,6 +48,7 @@ from django.core.exceptions import ValidationError, SuspiciousOperation
from django.core.files import File
from django.core.files.base import ContentFile
from django.core.validators import validate_comma_separated_integer_list, MinValueValidator
+from django.db import transaction, IntegrityError
from django.db.models import Q
from django.db.models.base import ModelBase
from django.db.models.signals import pre_delete
@@ -2347,6 +2348,25 @@ class Import(BaseImport):
self.parse_error_file()
return bool(self.error_lines.filter(ignored=False).count())
+ def delete(self, using=None, keep_parents=False) -> bool:
+ """
+ Delete imported items one by one in order to prevent post save errors.
+ """
+ try:
+ with transaction.atomic():
+ for k in dir(self):
+ if not k.startswith("imported_archaeological_") and \
+ not k.startswith("imported_ishtar_common_"):
+ continue
+ for idx, obj in enumerate(getattr(self, k).all()):
+ obj.__class__.objects.filter(pk=obj.pk).update(
+ timestamp_label=-1)
+ obj.delete()
+ super().delete(using=using, keep_parents=keep_parents)
+ return True
+ except IntegrityError:
+ return False
+
@property
def pre_import_form_is_valid(self) -> bool:
for column in self.importer_type.columns.filter(col_number__lte=0, required=True):
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 30bf4b7db..da7bf02f0 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -2421,6 +2421,9 @@ def related_historization_changed(sender, **kwargs):
rel_obj, "__delete", False):
return
obj = getattr(rel_obj, rel_obj.CURRENT_MODEL_ATTR)
+ # object is been deleted
+ if obj.__class__.objects.filter(pk=obj.pk, timestamp_label=-1).count():
+ return
obj._post_save_geo_ok = True
manage_m2m(obj, kwargs)
@@ -2429,6 +2432,9 @@ def m2m_historization_changed(sender, **kwargs):
obj = kwargs.get("instance", None)
if not obj or getattr(obj, "__delete", False):
return
+ # object is been deleted
+ if obj.__class__.objects.filter(pk=obj.pk, timestamp_label=-1).count():
+ return
manage_m2m(obj, kwargs)
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index e346e625d..dbaf8626b 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -2639,18 +2639,29 @@ class ImportMatchView(ImportPermissionMixin, IshtarMixin, LoginRequiredMixin, Mo
return reverse("import_link_unmatched", args=[self.kwargs["pk"]])
-class ImportDeleteView(ImportPermissionMixin, IshtarMixin, LoginRequiredMixin, DeleteView):
+class ImportDeleteView(ImportPermissionMixin, IshtarMixin, LoginRequiredMixin,
+ DeleteView):
template_name = "ishtar/import_delete.html"
model = models.Import
page_name = _("Delete import")
permission_full = "ishtar_common.delete_import"
permission_own = "delete_own_import"
+ def form_valid(self, form):
+ if not self.object.delete():
+ messages.add_message(
+ self.request, messages.WARNING,
+ _("Integrity error - contact the administrator"))
+ return HttpResponseRedirect(self.request.path)
+ success_url = self.get_success_url()
+ return HttpResponseRedirect(success_url)
+
def get_success_url(self):
return reverse("current_imports")
-class ImportGroupDeleteView(ImportPermissionMixin, IshtarMixin, LoginRequiredMixin, DeleteView):
+class ImportGroupDeleteView(ImportPermissionMixin, IshtarMixin, LoginRequiredMixin,
+ DeleteView):
template_name = "ishtar/import_delete.html"
model = models.ImportGroup
page_name = _("Delete import")