summaryrefslogtreecommitdiff
path: root/archaeological_warehouse/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_warehouse/models.py')
-rw-r--r--archaeological_warehouse/models.py133
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):