summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-11-29 16:45:39 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-11-29 16:45:39 +0100
commit47ae57c37abfed75f93594255b6c617afa011bf5 (patch)
treec9172a07ceb24b67854009b0c3cad9e365affe7b /ishtar_common
parent713a5fd98aef4432977461dbf0b24790b9539053 (diff)
downloadIshtar-47ae57c37abfed75f93594255b6c617afa011bf5.tar.bz2
Ishtar-47ae57c37abfed75f93594255b6c617afa011bf5.zip
🐛 fix deletion of items with associated datations - better performance for deletion - delete directly associéted geovectordata
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/models.py4
-rw-r--r--ishtar_common/models_common.py41
-rw-r--r--ishtar_common/utils.py7
-rw-r--r--ishtar_common/wizards.py1
4 files changed, 50 insertions, 3 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index aa9224be7..86be555ca 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -187,6 +187,8 @@ from ishtar_common.models_common import (
State,
StatisticItem,
Town,
+ main_item_pre_delete,
+ geo_item_pre_delete
)
__all__ = [
@@ -247,6 +249,8 @@ __all__ = [
"GeoOriginType",
"GeoProviderType",
"GeoBufferType",
+ "geo_item_pre_delete",
+ "main_item_pre_delete"
]
logger = logging.getLogger(__name__)
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py
index 00ff8babd..986ba209d 100644
--- a/ishtar_common/models_common.py
+++ b/ishtar_common/models_common.py
@@ -40,7 +40,7 @@ from django.urls import reverse, NoReverseMatch
from django.core.validators import validate_slug
from django.db import connection, transaction, OperationalError, IntegrityError
from django.db.models import JSONField, Q, Count, Max
-from django.db.models.signals import post_save, post_delete, m2m_changed
+from django.db.models.signals import m2m_changed, post_save, post_delete, pre_delete
from django.template import loader
from django.template.defaultfilters import slugify
from django.utils import timezone
@@ -3110,6 +3110,8 @@ def geodata_attached_changed(sender, **kwargs):
if not profile.mapping:
return
instance = kwargs.get("instance", None)
+ if getattr(instance, "__delete", False):
+ return
model = kwargs.get("model", None)
pk_set = kwargs.get("pk_set", None)
@@ -3244,6 +3246,43 @@ class GeographicItem(models.Model):
self._geodata_list = lst
return lst
+ @property
+ def q_associated_source_geovectordata(self):
+ content_type = ContentType.objects.get_for_model(self.__class__)
+ return GeoVectorData.objects.filter(source_content_type=content_type,
+ source_id=self.pk)
+
+ def get_deleted_data(self) -> dict:
+ """
+ Return sub object list that will be deleted
+ :return: {"Sub object type": ["Sub object 1", "Sub object 2", ...]}
+ """
+ if not self.q_associated_source_geovectordata.count():
+ return {}
+ lbl = str(_("Geographic - Vector data"))
+ data = {lbl: []}
+ for geodata in self.q_associated_source_geovectordata.all():
+ data[lbl].append(f"{self.__class__._meta.verbose_name} - {geodata}")
+ return data
+
+
+def main_item_pre_delete(sender, **kwargs):
+ instance = kwargs.get("instance", None)
+ if not instance or not instance.pk:
+ return
+ instance.__delete = True
+
+
+def geo_item_pre_delete(sender, **kwargs):
+ instance = kwargs.get("instance", None)
+ if not instance or not instance.pk:
+ return
+ instance.__delete = True
+ instance._post_save_geo_ok = True
+ instance._post_saved_geo = True
+ instance.geodata.clear()
+ instance.q_associated_source_geovectordata.delete()
+
class PermissionQuery(models.Model):
model = models.ForeignKey(ContentType, related_name="permissions",
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index bd79814e9..bdd7a67e5 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -2402,20 +2402,23 @@ def manage_m2m(obj, kwargs):
obj.skip_history_when_saving = True
elif not obj.history_modifier:
obj.skip_history_when_saving = True
+ obj._post_save_geo_ok = True
obj.save()
def related_historization_changed(sender, **kwargs):
rel_obj = kwargs.get("instance", None)
- if not rel_obj or not getattr(rel_obj, "CURRENT_MODEL_ATTR", None):
+ if not rel_obj or not getattr(rel_obj, "CURRENT_MODEL_ATTR", None) or getattr(
+ rel_obj, "__delete", False):
return
obj = getattr(rel_obj, rel_obj.CURRENT_MODEL_ATTR)
+ obj._post_save_geo_ok = True
manage_m2m(obj, kwargs)
def m2m_historization_changed(sender, **kwargs):
obj = kwargs.get("instance", None)
- if not obj:
+ if not obj or getattr(obj, "__delete", False):
return
manage_m2m(obj, kwargs)
diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py
index d29ebf365..a7313b13b 100644
--- a/ishtar_common/wizards.py
+++ b/ishtar_common/wizards.py
@@ -1941,6 +1941,7 @@ class MultipleDeletionWizard(MultipleItemWizard):
for obj in objs:
lbls.append(str(obj))
try:
+ obj.__delete = True
obj.delete()
except ObjectDoesNotExist:
pass