diff options
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/models.py | 1 | ||||
| -rw-r--r-- | ishtar_common/models_imports.py | 23 | ||||
| -rw-r--r-- | ishtar_common/utils.py | 6 | ||||
| -rw-r--r-- | ishtar_common/version.py | 4 | ||||
| -rw-r--r-- | ishtar_common/views.py | 15 | ||||
| -rw-r--r-- | ishtar_common/views_item.py | 20 | ||||
| -rw-r--r-- | ishtar_common/wizards.py | 4 |
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: |
