diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-03-26 12:14:45 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-06-13 18:01:31 +0200 |
commit | 17426c62ae8bd08d9c66ac0f97dbad1f26d8d154 (patch) | |
tree | 07c193313a80bda34e6004ca6ec923baee4f0a10 | |
parent | 6bafe9204cf2524f1a074b9dedcd0009a38525ee (diff) | |
download | Ishtar-17426c62ae8bd08d9c66ac0f97dbad1f26d8d154.tar.bz2 Ishtar-17426c62ae8bd08d9c66ac0f97dbad1f26d8d154.zip |
⚡️ improve main geo data management
-rw-r--r-- | ishtar_common/models_common.py | 65 |
1 files changed, 31 insertions, 34 deletions
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 9b9b974d4..d3ba726bf 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -2960,16 +2960,16 @@ def geodata_attached_post_add(model, instance, pk_set): m2m_key = f"{child_model._meta.model_name}_id" geoitems = {} for child_id in query.values_list("id", flat=True): - child = None for pk in item_pks: q = m2m_model.objects.filter(**{m2m_key: child_id, "geovectordata_id": pk}) - if not q.count(): - if not child: - child = model.objects.get(pk=pk) - if pk not in geoitems: - geoitems[pk] = GeoVectorData.objects.get(pk=pk) - child_model.objects.get(pk=child_id).geodata.add(geoitems[pk]) + if q.count(): + continue + if pk not in geoitems: + geoitems[pk] = GeoVectorData.objects.get(pk=pk) + child = child_model.objects.get(pk=child_id) + child.geodata.add(geoitems[pk]) + child._manage_main_geo() def geodata_attached_remove(model, instance, pk_set=None, clear=False): @@ -2994,16 +2994,19 @@ def geodata_attached_remove(model, instance, pk_set=None, clear=False): m2m_key = f"{child_model._meta.model_name}_id" geoitems = {} for child_id in query.values_list("id", flat=True): - child = None for pk in item_pks: + q = child_model.objects.filter(pk=child_id, main_geodata_id=pk) + if q.count(): + q.update(main_geodata_id=None) q = m2m_model.objects.filter(**{m2m_key: child_id, "geovectordata_id": pk}) - if q.count(): - if not child: - child = model.objects.get(pk=pk) - if pk not in geoitems: - geoitems[pk] = GeoVectorData.objects.get(pk=pk) - child_model.objects.get(pk=child_id).geodata.remove(geoitems[pk]) + if not q.count(): + continue + if pk not in geoitems: + geoitems[pk] = GeoVectorData.objects.get(pk=pk) + child = child_model.objects.get(pk=child_id) + child.geodata.remove(geoitems[pk]) + child._manage_main_geo() def geodata_attached_changed(sender, **kwargs): @@ -3114,15 +3117,7 @@ class GeographicItem(models.Model): """ return [] - def save( - self, force_insert=False, force_update=False, using=None, update_fields=None - ): - super(GeographicItem, self).save( - force_insert=force_insert, - force_update=force_update, - using=using, - update_fields=update_fields, - ) + def _manage_main_geo(self): if self.main_geodata and not self.geodata.filter( pk=self.main_geodata.pk).count(): try: @@ -3130,17 +3125,19 @@ class GeographicItem(models.Model): self.geodata.add(self.main_geodata) except (OperationalError, IntegrityError): pass - elif not self.main_geodata: - try: - with transaction.atomic(): - if self.geodata.count(): - # arbitrary associate the first to geodata - self.main_geodata = self.geodata.order_by("pk").all()[0] - self.skip_history_when_saving = True - self._no_move = True - self.save() - except (OperationalError, IntegrityError, IndexError): - pass + if self.main_geodata or not self.geodata.count(): + return + try: + with transaction.atomic(): + # arbitrary associate the first to geodata + data_id = self.geodata.order_by("pk").values_list("pk", flat=True)[0] + self.__class__.objects.filter(pk=self.pk).update(main_geodata_id=data_id) + except (OperationalError, IntegrityError, IndexError): + pass + + def save(self, *args, **kwargs): + super().save(*args, **kwargs) + self._manage_main_geo() @property def geodata_list(self): |