diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-07-31 18:35:23 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-10-15 19:33:00 +0200 |
commit | fa9a89325a3767a8cc99fca04c8671a193e3378e (patch) | |
tree | 70ff91ba2014342da215d3d2ccb13e9558ce1195 /ishtar_common | |
parent | 9a380773f208abf5aec6bc7f000cce7e57d2cb8b (diff) | |
download | Ishtar-fa9a89325a3767a8cc99fca04c8671a193e3378e.tar.bz2 Ishtar-fa9a89325a3767a8cc99fca04c8671a193e3378e.zip |
✨ GIS: automatically update import key for geovectordata
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/migrations/0267_gis_import_key_init.py | 24 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 28 | ||||
-rw-r--r-- | ishtar_common/utils_migrations.py | 21 |
3 files changed, 72 insertions, 1 deletions
diff --git a/ishtar_common/migrations/0267_gis_import_key_init.py b/ishtar_common/migrations/0267_gis_import_key_init.py new file mode 100644 index 000000000..b532acd95 --- /dev/null +++ b/ishtar_common/migrations/0267_gis_import_key_init.py @@ -0,0 +1,24 @@ +from django.db import migrations + +from ishtar_common.utils_migrations import update_import_key + + +def update_importkey(apps, __): + updated = 0 + GeoVectorData = apps.get_model("ishtar_common", "geovectordata") + for data in GeoVectorData.objects.all(): + updated += 1 if update_import_key(data) else 0 + if updated: + print() + print(f"* {updated} GeoVectorData import_key updated") + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0266_gis_importchunk'), + ] + + operations = [ + migrations.RunPython(update_importkey) + ] diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index dcb4f05a3..96f0f5d86 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -2957,6 +2957,24 @@ class GeoVectorData(Imported, OwnPerms): self.save() return True + def update_import_key(self): + if self.import_key or not self.data_type: + return + # by default set import key to data type + base_import_key = import_key = self.data_type.txt_idx + base_q = GeoVectorData.objects.filter( + source_content_type_id=self.source_content_type_id, + source_id=self.source_id + ) + idx = 0 + q = base_q.filter(import_key=import_key) + while q.count(): + idx += 1 + import_key = f"{base_import_key}-{idx}" + q = base_q.filter(import_key=import_key) + GeoVectorData.objects.filter(pk=self.id).update(import_key=import_key) + return True + @classmethod def migrate_srid(cls, new_srid): fields = ( @@ -2976,7 +2994,15 @@ class GeoVectorData(Imported, OwnPerms): item.save() -post_save.connect(post_save_geodata, sender=GeoVectorData) +def post_save_geovectordata(sender, **kwargs): + geovectordata = kwargs["instance"] + if not geovectordata.pk: + return + geovectordata.update_import_key() + post_save_geodata(sender, **kwargs) + + +post_save.connect(post_save_geovectordata, sender=GeoVectorData) def geodata_attached_post_add(model, instance, pk_set): diff --git a/ishtar_common/utils_migrations.py b/ishtar_common/utils_migrations.py index 5654a8897..6d75ff885 100644 --- a/ishtar_common/utils_migrations.py +++ b/ishtar_common/utils_migrations.py @@ -212,3 +212,24 @@ def migrate_created_field(apps, app_name, model_names): continue history_date = q.all()[0].history_date item.__class__.objects.filter(pk=item.pk).update(created=history_date) + + +def update_import_key(geovectordata): # 0267_gis_import_key + if geovectordata.import_key or not geovectordata.data_type: + return + GeoVectorData = geovectordata.__class__ + # by default set import key to data type + base_import_key = import_key = geovectordata.data_type.txt_idx + base_q = GeoVectorData.objects.filter( + source_content_type_id=geovectordata.source_content_type_id, + source_id=geovectordata.source_id + ) + idx = 0 + q = base_q.filter(import_key=import_key) + while q.count(): + idx += 1 + import_key = f"{base_import_key}-{idx}" + q = base_q.filter(import_key=import_key) + GeoVectorData.objects.filter(pk=geovectordata.id).update( + import_key=import_key) + return True |