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 /ishtar_common | |
| parent | 6bafe9204cf2524f1a074b9dedcd0009a38525ee (diff) | |
| download | Ishtar-17426c62ae8bd08d9c66ac0f97dbad1f26d8d154.tar.bz2 Ishtar-17426c62ae8bd08d9c66ac0f97dbad1f26d8d154.zip  | |
⚡️ improve main geo data management
Diffstat (limited to 'ishtar_common')
| -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):  | 
