summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2022-09-09 12:38:46 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2022-12-12 12:23:18 +0100
commita8d8513c6c365d09eb663722b29740d3231d2c56 (patch)
tree44dd6b9849a9bdfbfb6b1c22c78cf3ad0992d7c6
parent16aa1615cfdfdf96104b8654bb7caa463a5c95e0 (diff)
downloadIshtar-a8d8513c6c365d09eb663722b29740d3231d2c56.tar.bz2
Ishtar-a8d8513c6c365d09eb663722b29740d3231d2c56.zip
Geo: display associated context records and associated finds on sheet map (refactor and fixes)
-rw-r--r--CHANGES.md10
-rw-r--r--archaeological_context_records/models.py30
-rw-r--r--archaeological_finds/templates/ishtar/sheet_basefind.html2
-rw-r--r--archaeological_operations/models.py53
-rw-r--r--ishtar_common/models_common.py46
-rw-r--r--ishtar_common/static/js/ishtar-map.js2
-rw-r--r--ishtar_common/templates/ishtar/blocks/sheet_map.html46
7 files changed, 102 insertions, 87 deletions
diff --git a/CHANGES.md b/CHANGES.md
index de2b73b93..3d8c14c33 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,11 +1,19 @@
---
title: Ishtar changelog
-date: 2022-08-05
+date: 2022-09-09
---
Ishtar changelog
================
+### Features ###
+
+- Geo: display associated context records and associated finds on sheet map
+
+### Bug fix ###
+
+- Fix safe_or template tags
+
v4.0.15 - 2022-08-30
--------------------
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index 12d203a7c..1209a11cb 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -25,6 +25,7 @@ from django.conf import settings
from django.contrib.gis.db import models
from django.contrib.gis.geos import Point
from django.contrib.postgres.indexes import GinIndex
+from django.contrib.sites.models import Site
from django.db import connection
from django.db.models import Q
from django.db.models.signals import post_delete, post_save, m2m_changed
@@ -66,7 +67,7 @@ from ishtar_common.models import (
QuickAction,
RelationsViews,
)
-from ishtar_common.models_common import HistoricalRecords, SerializeItem
+from ishtar_common.models_common import GeoVectorData, HistoricalRecords, SerializeItem
from archaeological_operations.models import (
Operation,
Period,
@@ -961,17 +962,24 @@ class ContextRecord(
def get_geo_items(self, rounded=True):
dct = super(ContextRecord, self).get_geo_items(rounded=rounded)
- BaseFind = apps.get_model("archaeological_finds", "BaseFind")
- collection_base_finds = []
- for bf in self.base_finds.distinct().all():
- try:
- geo_item = bf.get_geo_items(rounded=rounded)
- collection_base_finds.append(geo_item)
- except BaseFind.DoesNotExist:
- pass
- dct["properties"]["base-finds"] = {
+ 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.base_finds.filter(main_geodata__isnull=False)
+ url = base_url + "/show-basefind/{}/"
+ collection_finds = GeoVectorData._get_geo_item_list(
+ q, current_geodata, url, precision, rounded
+ )
+
+ dct["finds"] = {
"type": "FeatureCollection",
- "features": collection_base_finds,
+ "features": collection_finds,
}
return dct
diff --git a/archaeological_finds/templates/ishtar/sheet_basefind.html b/archaeological_finds/templates/ishtar/sheet_basefind.html
index 81705aaae..ae4dde731 100644
--- a/archaeological_finds/templates/ishtar/sheet_basefind.html
+++ b/archaeological_finds/templates/ishtar/sheet_basefind.html
@@ -16,7 +16,7 @@
<div class='row'>
{% field_flex_detail "Operation" base_find.context_record.operation first %}
{% field_flex_detail "Archaeological site" base_find.context_record.archaeological_site first %}
- {% field_flex_detail "Context record" base_find.context_record.short_label first %}
+ {% field_flex_detail "Context record" base_find.context_record first %}
{% field_flex "Town" base_find.context_record.town_label_with_areas '' '' first %}
{% field_flex "Parcel" base_find.context_record.parcel '' '' first %}
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index 69b24fecd..370b3c9b2 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -75,7 +75,7 @@ from ishtar_common.models import (
MainItem,
HierarchicalType,
)
-from ishtar_common.models_common import Department, HistoricalRecords
+from ishtar_common.models_common import Department, GeoVectorData, HistoricalRecords
from ishtar_common.model_managers import UUIDModelManager
from ishtar_common.utils import (
cached_label_changed,
@@ -1732,53 +1732,6 @@ class Operation(
return None
return q.all()[0].poly, self._meta.verbose_name
-
- def _get_geo_item_list(self, q, current_geodata, url, precision, rounded):
- collection_id = []
- items_id = []
- q = q.values("main_geodata", "id")
- 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":
- for feat in geo["features"]:
- if "properties" in feat:
- feat["properties"]["url"] = url_geo
- collection += geo["features"]
- elif geo_type:
- if "properties" in geo:
- geo["properties"]["url"] = url_geo
- collection.append(geo)
-
- if not precision and rounded:
- 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()
@@ -1792,7 +1745,7 @@ class Operation(
q = self.context_record.filter(main_geodata__isnull=False)
url = base_url + "/show-contextrecord/{}/"
- collection_context_records = self._get_geo_item_list(
+ collection_context_records = GeoVectorData._get_geo_item_list(
q, current_geodata, url, precision, rounded
)
@@ -1800,7 +1753,7 @@ class Operation(
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(
+ collection_finds = GeoVectorData._get_geo_item_list(
q, current_geodata, url, precision, rounded
)
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py
index 9d71ae0dc..b72251f02 100644
--- a/ishtar_common/models_common.py
+++ b/ishtar_common/models_common.py
@@ -2359,6 +2359,52 @@ class GeoVectorData(Imported, OwnPerms):
profile = get_current_profile()
return profile.srs
+ @classmethod
+ def _get_geo_item_list(cls, q, current_geodata, url, precision, rounded):
+ collection_id = []
+ items_id = []
+ q = q.values("main_geodata", "id")
+ 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":
+ for feat in geo["features"]:
+ if "properties" in feat:
+ feat["properties"]["url"] = url_geo
+ collection += geo["features"]
+ elif geo_type:
+ if "properties" in geo:
+ geo["properties"]["url"] = url_geo
+ collection.append(geo)
+
+ if not precision and rounded:
+ 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=5):
dct = {"type": "Feature", "geometry": {},
"properties": {"label": str(self)}}
diff --git a/ishtar_common/static/js/ishtar-map.js b/ishtar_common/static/js/ishtar-map.js
index 8ffe399d6..67d29cc48 100644
--- a/ishtar_common/static/js/ishtar-map.js
+++ b/ishtar_common/static/js/ishtar-map.js
@@ -716,7 +716,7 @@ var display_map = function(map_id, points, lines_and_polys, layers){
} else {
initialize_base_map(map_id, layers);
}
- display_points(map_id, points);
+ display_points(map_id, points, true);
init_popup(map_id);
diff --git a/ishtar_common/templates/ishtar/blocks/sheet_map.html b/ishtar_common/templates/ishtar/blocks/sheet_map.html
index 11780ae8a..4a380ed13 100644
--- a/ishtar_common/templates/ishtar/blocks/sheet_map.html
+++ b/ishtar_common/templates/ishtar/blocks/sheet_map.html
@@ -9,40 +9,40 @@
<h4>{% trans "Geographic data" %}</h4>
<ul>{% for geodata in geodata_list %}
<li>
- <input type="checkbox" name="map-ol-{{item.SLUG}}-{{item.pk}}-{{geodata.pk}}"
- class="map-ol-{{item.SLUG}}-{{item.pk}}"
- id="map-ol-{{item.SLUG}}-{{item.pk}}-{{geodata.pk}}"
+ <input type="checkbox" name="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}-{{geodata.pk}}"
+ class="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}"
+ id="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}-{{geodata.pk}}"
{% if not forloop.counter0 %}checked{% endif %}
>
- &nbsp; <label for="map-ol-{{item.SLUG}}-{{item.pk}}-{{geodata.pk}}">
+ &nbsp; <label for="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}-{{geodata.pk}}">
<strong>{{geodata.data_type}}</strong></label><br/>
{{geodata.name}}
</li>{% endfor %}
- {% if geo_item.SLUG == "operation" %}
+ {% if geo_item.SLUG == "operation" and display_context_records %}
<li>
- <input type="checkbox" name="map-ol-{{item.SLUG}}-{{item.pk}}-crs"
- class="map-ol-{{item.SLUG}}-{{item.pk}}"
- id="map-ol-{{item.SLUG}}-{{item.pk}}-crs">
- &nbsp; <label for="map-ol-{{item.SLUG}}-{{item.pk}}-crs">
+ <input type="checkbox" name="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}-crs"
+ class="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}"
+ id="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}-crs">
+ &nbsp; <label for="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}-crs">
<strong>{% trans "Associated context records" %}</strong></label>
</li>
{% endif %}
- {% if geo_item.SLUG == "operation" or geo_item.SLUG == "contextrecord" %}
+ {% if display_finds %}{% if geo_item.SLUG == "operation" or geo_item.SLUG == "contextrecord" %}
<li>
- <input type="checkbox" name="map-ol-{{item.SLUG}}-{{item.pk}}-finds"
- class="map-ol-{{item.SLUG}}-{{item.pk}}"
- id="map-ol-{{item.SLUG}}-{{item.pk}}-finds">
- &nbsp; <label for="map-ol-{{item.SLUG}}-{{item.pk}}-finds">
+ <input type="checkbox" name="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}-finds"
+ class="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}"
+ id="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}-finds">
+ &nbsp; <label for="map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}-finds">
<strong>{% trans "Associated finds" %}</strong></label>
</li>
- {% endif %}
+ {% endif %}{% endif %}
</ul>
</div>
<script type="text/javascript">
-const refresh_map_{{item.SLUG}}_{{item.pk}} = function(first_init) {
- let idx = "{{item.SLUG}}-{{item.pk}}";
+const refresh_map_{{geo_item.SLUG}}_{{geo_item.pk}} = function(first_init) {
+ let idx = "{{geo_item.SLUG}}-{{geo_item.pk}}";
let geodata_list = { {% for geodata in geodata_list %}
- "{{item.SLUG}}-{{item.pk}}-{{geodata.pk}}": ["{{geodata.geometry_type}}", {{geodata.geojson|safe}}]{% if not forloop.last %},{% endif %}
+ "{{geo_item.SLUG}}-{{geo_item.pk}}-{{geodata.pk}}": ["{{geodata.geometry_type}}", {{geodata.geojson|safe}}]{% if not forloop.last %},{% endif %}
{% endfor %} };
let url{% if geo_item.SLUG == "operation" or geo_item.SLUG == "contextrecord" %} = "{% url 'api-get-geo' %}"{% endif %};
let attrs{% if geo_item.SLUG == "operation" %} = {"operation_id": "{{geo_item.pk}}"}{% elif geo_item.SLUG == "contextrecord" %} = {"context_record_id": "{{geo_item.pk}}"}{% endif %};
@@ -51,19 +51,19 @@ const refresh_map_{{item.SLUG}}_{{item.pk}} = function(first_init) {
display_points("map-{{window_id}}-" + idx, _geo_points[idx], first_init);
}
-const display_map_{{item.SLUG}}_{{item.pk}} = function() {
+const display_map_{{geo_item.SLUG}}_{{geo_item.pk}} = function() {
const html = render_map("map-{{window_id}}-{{geo_item.SLUG}}-{{geo_item.pk}}", false, true);
$("#map-content-{{window_id}}-{{geo_item.SLUG}}-{{geo_item.pk}}").html(html);
display_map("map-{{window_id}}-{{geo_item.SLUG}}-{{geo_item.pk}}", null, null);
- $(".map-ol-{{item.SLUG}}-{{item.pk}}").change(
+ $(".map-ol-{{geo_item.SLUG}}-{{geo_item.pk}}").change(
function(){
- refresh_map_{{item.SLUG}}_{{item.pk}}(false);
+ refresh_map_{{geo_item.SLUG}}_{{geo_item.pk}}(false);
}
);
}
-display_map_{{item.SLUG}}_{{item.pk}}();
-refresh_map_{{item.SLUG}}_{{item.pk}}(true);
+display_map_{{geo_item.SLUG}}_{{geo_item.pk}}();
+refresh_map_{{geo_item.SLUG}}_{{geo_item.pk}}(true);
</script>