diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-09-08 17:49:05 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-12-12 12:23:18 +0100 |
commit | f115f144dc01a41c1373485416488b77ecaa62fc (patch) | |
tree | 95fc53fcdc8959da12250e0a4f49b35e0af902d3 /archaeological_operations/models.py | |
parent | 392a3508b2a5bfe266844b5be4ab58a01caff766 (diff) | |
download | Ishtar-f115f144dc01a41c1373485416488b77ecaa62fc.tar.bz2 Ishtar-f115f144dc01a41c1373485416488b77ecaa62fc.zip |
Geo display: clean old code - manage bad data
Diffstat (limited to 'archaeological_operations/models.py')
-rw-r--r-- | archaeological_operations/models.py | 135 |
1 files changed, 66 insertions, 69 deletions
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 69f8d4fdc..69b24fecd 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -30,6 +30,7 @@ from django.contrib.gis.db import models from django.contrib.gis.db.models.aggregates import Union from django.contrib.gis.db.models.functions import Centroid from django.contrib.postgres.indexes import GinIndex +from django.contrib.sites.models import Site from django.db import IntegrityError, transaction from django.db.models import Q, Count, Sum, Max, Avg from django.db.models.signals import post_save, m2m_changed, post_delete @@ -1729,92 +1730,88 @@ class Operation( q = self.towns.filter(limit__isnull=False).annotate(poly=Union("limit")).all() if not q.count(): return None - return q.all()[0].poly, self._meta.verbose_namea - - """ - def _get_child_geodata(self, query, cr_list, collection_context_records_id, - current_geodata): - childs = [] - for cr in query.exclude(id__in=cr_list).values( - "main_geodata", "id").distinct().all(): - childs.append(cr["id"]) - geodata_id = cr["main_geodata"] - if geodata_id not in collection_context_records_id \ - and geodata_id not in current_geodata: - collection_context_records_id.append(geodata_id) - cr_list += childs - return childs - """ - - def get_geo_items(self, rounded=True): - dct = super(Operation, self).get_geo_items(rounded=rounded) - ContextRecord = apps.get_model( - "archaeological_context_records", "ContextRecord" - ) - - q = self.context_record.filter(main_geodata__isnull=False) - - """ - included = q.filter( - right_relations__relation_type__txt_idx='is_included') - q_upper = q.exclude(id__in=set(included.values_list("id", flat=True))) - cr_list = [] - - childs = self._get_child_geodata( - q_upper, cr_list, collection_context_records_id, - current_geodata) - while childs: - new_childs = [] - for child_id in childs: - q_lower = q.filter( - right_relations__relation_type__txt_idx='is_included', - right_relations__right_record_id=child_id - ) - new_childs += self._get_child_geodata( - q_lower, cr_list, collection_context_records_id, - current_geodata) - childs = new_childs - + return q.all()[0].poly, self._meta.verbose_name - - """ - collection_context_records_id = [] - current_geodata = self.geodata.values_list("id", flat=True) + def _get_geo_item_list(self, q, current_geodata, url, precision, rounded): + collection_id = [] + items_id = [] q = q.values("main_geodata", "id") - for cr in q.distinct().all(): - geodata_id = cr["main_geodata"] - if geodata_id not in collection_context_records_id \ - and geodata_id not in current_geodata: - collection_context_records_id.append(geodata_id) - - collection_context_records = [] - for cr_id in collection_context_records_id: - geo = json.loads(GeoVectorData.objects.get(pk=cr_id).geojson) + for item in q.distinct().all(): + geodata_id = item["main_geodata"] + if geodata_id not in current_geodata: + collection_id.append(geodata_id) + items_id.append(item["id"]) + current_geodata.append(geodata_id) + + collection = [] + for idx in range(len(collection_id)): + geo = json.loads(GeoVectorData.objects.get(pk=collection_id[idx]).geojson) geo_type = geo.get("type", None) + url_geo = url.format(items_id[idx]) if geo_type == "FeatureCollection": - collection_context_records += geo["features"] + for feat in geo["features"]: + if "properties" in feat: + feat["properties"]["url"] = url_geo + collection += geo["features"] elif geo_type: - collection_context_records.append(geo) + if "properties" in geo: + geo["properties"]["url"] = url_geo + collection.append(geo) - profile = get_current_profile() - precision = profile.point_precision if not precision and rounded: - precision = 5 - if precision is not None: - r = re.compile(r"(\d+)\.(\d{6})(\d*)") - for feat in collection_context_records: - geom_type = feat["geometry"].get("type", None) - if geom_type == "Point": + precision = 6 + r = re.compile(r"(\d+)\.(\d{6})(\d*)") + new_collection = [] + for feat in collection: + geom_type = feat["geometry"].get("type", None) + if geom_type == "Point": + if precision is not None: feat["geometry"]["coordinates"] = [ round(feat["geometry"]["coordinates"][0], precision), round(feat["geometry"]["coordinates"][1], precision), ] + if not (-90 <= feat["geometry"]["coordinates"][1] <= 90) or not ( + -180 <= feat["geometry"]["coordinates"][0] <= 180): + # probably a bad projection + continue + new_collection.append(feat) + return new_collection + + + def get_geo_items(self, rounded=True): + dct = super(Operation, self).get_geo_items(rounded=rounded) + site = Site.objects.get_current() + scheme = "https" if settings.ISHTAR_SECURE else "http" + base_url = scheme + "://" + site.domain + + profile = get_current_profile() + precision = profile.point_precision + + current_geodata = list(self.geodata.values_list("id", flat=True)) + + q = self.context_record.filter(main_geodata__isnull=False) + url = base_url + "/show-contextrecord/{}/" + collection_context_records = self._get_geo_item_list( + q, current_geodata, url, precision, rounded + ) + + BaseFind = apps.get_model("archaeological_finds", "BaseFind") + q = BaseFind.objects.filter(context_record__operation_id=self.pk, + main_geodata__isnull=False) + url = base_url + "/show-basefind/{}/" + collection_finds = self._get_geo_item_list( + q, current_geodata, url, precision, rounded + ) dct["context-records"] = { "type": "FeatureCollection", "features": collection_context_records, } + dct["finds"] = { + "type": "FeatureCollection", + "features": collection_finds, + } return dct def context_record_relations_q(self): |