summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/models.py1
-rw-r--r--ishtar_common/models_imports.py23
-rw-r--r--ishtar_common/utils.py6
-rw-r--r--ishtar_common/version.py4
-rw-r--r--ishtar_common/views.py15
-rw-r--r--ishtar_common/views_item.py20
-rw-r--r--ishtar_common/wizards.py4
7 files changed, 61 insertions, 12 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index dbd4ba72a..94d86b171 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -3131,6 +3131,7 @@ class Person(Address, Merge, OwnPerms, ValueGetter, MainItem):
"ishtaruser__isnull": "ishtaruser__isnull",
"attached_to": "attached_to",
}
+ BASE_REQUEST_EXCLUDE = {"name": "AnonymousUser", "surname": "AnonymousUser"}
# alternative names of fields for searches
ALT_NAMES = {
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index d26a20791..b2966f578 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,28 @@ 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.
+ Mark each item for deletion with timestamp_label set to -1 (prevent
+ unecessary post_delete treatment - m2m_historization_changed and
+ related_historization_changed).
+ """
+ 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/version.py b/ishtar_common/version.py
index 2f2876b37..95ae8f8b0 100644
--- a/ishtar_common/version.py
+++ b/ishtar_common/version.py
@@ -1,5 +1,5 @@
-# 4.99.37
-VERSION = (4, 99, 37)
+# 4.99.38
+VERSION = (4, 99, 38)
def get_version():
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")
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index a925e71ce..f5ab7bae4 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -2395,7 +2395,7 @@ def execute_queries(
distinct_queries, query_parameters, my_relation_types_prefix, my_bool_fields,
my_reversed_bool_fields, related_name_fields, many_counted_fields,
reversed_many_counted_fields, my_dated_fields, datetime_fields,
- my_number_fields, and_reqs, data_type, operator
+ my_number_fields, and_reqs, data_type, operator, excluded_dct
):
if isinstance(groups, tuple):
operator, groups = groups
@@ -2417,7 +2417,7 @@ def execute_queries(
my_reversed_bool_fields, related_name_fields,
many_counted_fields, reversed_many_counted_fields,
my_dated_fields, datetime_fields, my_number_fields, and_reqs,
- data_type, operator)
+ data_type, operator, excluded_dct)
items = __operator_query(model, items, sub_items, operator)
continue
@@ -2428,7 +2428,7 @@ def execute_queries(
sub_dct, distinct_queries, query_parameters, my_relation_types_prefix,
my_bool_fields, my_reversed_bool_fields, related_name_fields,
many_counted_fields, reversed_many_counted_fields, my_dated_fields,
- datetime_fields, my_number_fields, and_reqs, data_type, operator)
+ datetime_fields, my_number_fields, and_reqs, data_type, operator, excluded_dct)
return items
@@ -2437,14 +2437,14 @@ def execute_query(
distinct_queries, query_parameters, my_relation_types_prefix,
my_bool_fields, my_reversed_bool_fields, related_name_fields,
many_counted_fields, reversed_many_counted_fields, my_dated_fields,
- datetime_fields, my_number_fields, and_reqs, data_type, operator
+ datetime_fields, my_number_fields, and_reqs, data_type, operator, excluded_dct
):
query, exc_query, extras = main_manager(
request, model, query_own, full, sub_dct, distinct_queries,
query_parameters, my_relation_types_prefix, my_bool_fields,
my_reversed_bool_fields, related_name_fields, many_counted_fields,
reversed_many_counted_fields, my_dated_fields, datetime_fields,
- my_number_fields, and_reqs[:]
+ my_number_fields, and_reqs[:], excluded_dct
)
sub_items = model.objects.filter(query)
for d_q in distinct_queries:
@@ -2496,9 +2496,9 @@ def main_manager(
request, model, query_own, full, dct, distinct_queries, query_parameters,
my_relation_types_prefix, my_bool_fields, my_reversed_bool_fields,
related_name_fields, many_counted_fields, reversed_many_counted_fields,
- my_dated_fields, datetime_fields, my_number_fields, and_reqs
+ my_dated_fields, datetime_fields, my_number_fields, and_reqs,
+ excluded_dct
):
- excluded_dct = {}
or_reqs = []
exc_and_reqs, exc_or_reqs = [], []
dct, excluded_dct, distinct_queries = _search_manage_search_vector(
@@ -2754,6 +2754,9 @@ def get_item(
my_base_request = copy(base_request)
else:
my_base_request = {}
+ excluded_dct = {}
+ if hasattr(model, "BASE_REQUEST_EXCLUDE"):
+ excluded_dct = copy(model.BASE_REQUEST_EXCLUDE)
if not bool_fields and hasattr(model, "BOOL_FIELDS"):
my_bool_fields = model.BOOL_FIELDS[:]
else:
@@ -3091,7 +3094,8 @@ def get_item(
my_relation_types_prefix, my_bool_fields, my_reversed_bool_fields,
related_name_fields, many_counted_fields,
reversed_many_counted_fields, my_dated_fields, datetime_fields,
- my_number_fields, and_reqs, data_type, operator)
+ my_number_fields, and_reqs, data_type, operator,
+ excluded_dct)
if return_query:
return items
diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py
index 5e23d469a..2a2b396d4 100644
--- a/ishtar_common/wizards.py
+++ b/ishtar_common/wizards.py
@@ -1854,6 +1854,10 @@ class DeletionWizard(Wizard):
def done(self, form_list, **kwargs):
obj = self.get_current_object()
if obj:
+ if hasattr(obj, "timestamp_label"):
+ # mark item for deletion with timestamp_label set to -1
+ obj.__class__.objects.filter(pk=obj.pk).update(
+ timestamp_label=-1)
try:
obj.delete()
except ObjectDoesNotExist: