diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2024-04-16 18:18:13 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2024-04-17 12:12:19 +0200 |
commit | 57ce249c3e853e0f8292a18ceeae2509a9feadc3 (patch) | |
tree | 03a3b1633cc09ad0814e96d6e98a75d9a5b6c7b7 /archaeological_warehouse | |
parent | 3d567dac887b3768432483e1840279e0aed61317 (diff) | |
download | Ishtar-57ce249c3e853e0f8292a18ceeae2509a9feadc3.tar.bz2 Ishtar-57ce249c3e853e0f8292a18ceeae2509a9feadc3.zip |
✨ ishtar_maintenance: fix_geographic_items task - 🐛 Geodata: fix default attachment for find, context records, warehouse, container
Diffstat (limited to 'archaeological_warehouse')
-rw-r--r-- | archaeological_warehouse/models.py | 133 |
1 files changed, 49 insertions, 84 deletions
diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 826f4444f..5df824d8f 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -22,7 +22,6 @@ import datetime import logging import uuid -from django.conf import settings from django.contrib.gis.db import models from django.contrib.postgres.indexes import GinIndex from django.core.exceptions import ObjectDoesNotExist @@ -272,6 +271,51 @@ post_delete.connect(post_save_cache, sender=WarehouseType) NO_DIVISION_ERROR = _("The division number {} has not been set for the warehouse {}.") +def warehouse_post_save_geo(item, q_check_town, save=True): + # manage geodata towns + if getattr(item, "_post_save_geo_ok", False): + # prevent infinite loop - should not happen, but... + return + item._post_save_geo_ok = True + if not q_check_town.count(): + town_id = None + q_geotown = GeoVectorData.objects.filter(pk=None) + else: + town_id = q_check_town.values_list("precise_town_id", flat=True)[0] + q_geotown = GeoVectorData.objects.filter( + source_content_type__model="town", + source_content_type__app_label="ishtar_common", + source_id=town_id, + multi_polygon__isnull=False) + q_geodata_town = item.geodata.filter( + source_content_type__model="town", + source_content_type__app_label="ishtar_common", + ) + changed = False + if not q_geotown.count(): + # no simple town - clean + for geo in q_geodata_town.all(): + item.geodata.remove(geo) + if item.main_geodata == geo: + item.main_geodata = None + changed = True + else: + for geo in q_geodata_town.exclude(source_id=town_id).all(): + item.geodata.remove(geo) + if item.main_geodata == geo: + item.main_geodata = None + changed = True + if not q_geodata_town.filter(source_id=town_id).count(): + item.geodata.add(q_geotown.all()[0]) + changed = True + + if changed and save: + item.skip_history_when_saving = True + item._no_move = True + item.save() + return changed + + class Warehouse( Address, DocumentItem, @@ -427,47 +471,8 @@ class Warehouse( return self.name def post_save_geo(self, save=True): - # manage geodata towns - if getattr(self, "_post_save_geo_ok", False): - # prevent infinite loop - should not happen, but... - return - self._post_save_geo_ok = True - if not self.precise_town: - q_geotown = GeoVectorData.objects.filter(pk=None) - else: - q_geotown = GeoVectorData.objects.filter( - source_content_type__model="town", - source_content_type__app_label="ishtar_common", - source_id=self.precise_town.pk, - multi_polygon__isnull=False) - q_geodata_town = self.geodata.filter( - source_content_type__model="town", - source_content_type__app_label="ishtar_common", - ) - changed = False - if not q_geotown.count(): - # no simple town - clean - for geo in q_geodata_town.all(): - self.geodata.remove(geo) - if self.main_geodata == geo: - self.main_geodata = None - changed = True - else: - current_geo_town = q_geotown.all()[0] - for geo in q_geodata_town.exclude(pk=current_geo_town.pk).all(): - self.geodata.remove(geo) - if self.main_geodata == geo: - self.main_geodata = None - changed = True - if not q_geodata_town.filter(pk=current_geo_town.pk).count(): - self.geodata.add(current_geo_town) - changed = True - - if changed and save: - self.skip_history_when_saving = True - self._no_move = True - self.save() - return changed + q_check_town = Warehouse.objects.filter(pk=self.pk, precise_town_id__isnull=False) + return warehouse_post_save_geo(self, q_check_town, save=save) def get_container_type_by_place(self, place: int): """ @@ -1227,48 +1232,8 @@ class Container( return self.cached_label or "" def post_save_geo(self, save=True): - # manage geodata towns - if getattr(self, "_post_save_geo_ok", False): - # prevent infinite loop - should not happen, but... - return - self._post_save_geo_ok = True - - if not self.location.precise_town: - town_id = None - q_geotown = GeoVectorData.objects.filter(pk=None) - else: - town_id = self.location.precise_town_id - q_geotown = GeoVectorData.objects.filter( - source_content_type__model="town", - source_content_type__app_label="ishtar_common", - source_id=self.location.precise_town_id, - multi_polygon__isnull=False) - q_geodata_town = self.geodata.filter( - source_content_type__model="town", - source_content_type__app_label="ishtar_common", - ) - changed = False - if not q_geotown.count(): - for geo in q_geodata_town.all(): - self.geodata.remove(geo) - if self.main_geodata == geo: - self.main_geodata = None - changed = True - else: - for geo in q_geodata_town.exclude(source_id=town_id).all(): - self.geodata.remove(geo) - if self.main_geodata == geo: - self.main_geodata = None - changed = True - if not q_geodata_town.filter(source_id=town_id).count(): - self.geodata.add(q_geotown.all()[0]) - changed = True - - if changed and save: - self.skip_history_when_saving = True - self._no_move = True - self.save() - return changed + q_check_town = Warehouse.objects.filter(pk=self.location_id, precise_town_id__isnull=False) + return warehouse_post_save_geo(self, q_check_town, save=save) @property def start_division_number(self): |