summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentinAndre <quentin.andre@imt-atlantique.net>2021-07-10 08:37:57 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-09-01 12:36:46 +0200
commitc683ae15a9346a94068265c0ae10060988448d32 (patch)
tree37b1874957feaa42ff79af589f06ac6e5e9c1645
parent5c5de8cb55e777df371b914e4f7978f19dc20dbc (diff)
downloadIshtar-c683ae15a9346a94068265c0ae10060988448d32.tar.bz2
Ishtar-c683ae15a9346a94068265c0ae10060988448d32.zip
api for geo_get_items for context records + tests
-rw-r--r--archaeological_context_records/models.py106
-rw-r--r--archaeological_finds/models.py2
-rw-r--r--archaeological_finds/tests.py233
-rw-r--r--archaeological_finds/urls.py36
-rw-r--r--archaeological_finds/views.py34
5 files changed, 341 insertions, 70 deletions
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index 5dfaa427a..01eb6e27b 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -23,11 +23,13 @@ import uuid
from django.apps import apps
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.core.urlresolvers import reverse
from django.db import connection
from django.db.models import Q
from django.db.models.signals import post_delete, post_save, m2m_changed
+
from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy, pgettext
from django.utils.text import slugify
@@ -35,7 +37,7 @@ from ishtar_common.utils import (
cached_label_changed,
m2m_historization_changed,
post_save_geo,
- task
+ task,
)
from ishtar_common.models import (
@@ -62,7 +64,7 @@ from ishtar_common.models import (
DocumentItem,
MainItem,
QuickAction,
- RelationsViews
+ RelationsViews,
)
from ishtar_common.models_common import HistoricalRecords
from archaeological_operations.models import (
@@ -856,6 +858,21 @@ class ContextRecord(
return precise_poly
return self.operation.get_precise_polygons()
+ def get_geo_items(self, get_polygons, rounded=True):
+ dict = super(ContextRecord, self).get_geo_items(get_polygons, rounded)
+ associated_geo_items = {"associated base finds": {}}
+ BaseFind = apps.get_model("archaeological_finds", "BaseFind")
+ for find_label in self._get_associated_cached_labels():
+ try:
+ bf = BaseFind.objects.get(label=find_label)
+ associated_geo_items["associated base finds"][
+ str(find_label)
+ ] = bf.get_geo_items(get_polygons, rounded)
+ except BaseFind.DoesNotExist:
+ pass
+ dict["properties"] = associated_geo_items
+ return dict
+
@classmethod
def cached_label_bulk_update(
cls, operation_id=None, parcel_id=None, transaction_id=None
@@ -1385,21 +1402,23 @@ class ContextRecordTree(RelationsViews):
);
CREATE INDEX {table}_id ON {table} (cr_id);
CREATE INDEX {table}_parent_id ON {table} (cr_parent_id);
- """.format(table="context_records_tree",
- fk_table="archaeological_context_records_contextrecord")
+ """.format(
+ table="context_records_tree",
+ fk_table="archaeological_context_records_contextrecord",
+ )
key = models.TextField(primary_key=True)
cr = models.ForeignKey(
"archaeological_context_records.ContextRecord",
verbose_name=_("Context record"),
related_name="context_record_tree_parent",
- on_delete=models.CASCADE
+ on_delete=models.CASCADE,
)
cr_parent = models.ForeignKey(
"archaeological_context_records.ContextRecord",
verbose_name=_("Context record parent"),
related_name="context_record_tree_child",
- on_delete=models.CASCADE
+ on_delete=models.CASCADE,
)
class Meta:
@@ -1414,7 +1433,8 @@ class ContextRecordTree(RelationsViews):
if child_id != parent_id:
cls.objects.get_or_create(
key=f"{child_id}_{parent_id}",
- cr_id=child_id, cr_parent_id=parent_id
+ cr_id=child_id,
+ cr_parent_id=parent_id,
)
keys.append((child_id, parent_id))
return keys
@@ -1422,17 +1442,20 @@ class ContextRecordTree(RelationsViews):
@classmethod
def _get_base_relations(cls):
return RelationType.objects.filter(
- logical_relation__in=('included', 'equal')).values_list("id", flat=True)
+ logical_relation__in=("included", "equal")
+ ).values_list("id", flat=True)
@classmethod
def _get_base_equal_relations(cls):
- return RelationType.objects.filter(
- logical_relation='equal').values_list("id", flat=True)
+ return RelationType.objects.filter(logical_relation="equal").values_list(
+ "id", flat=True
+ )
@classmethod
def _get_base_included_relations(cls):
- return RelationType.objects.filter(
- logical_relation='included').values_list("id", flat=True)
+ return RelationType.objects.filter(logical_relation="included").values_list(
+ "id", flat=True
+ )
@classmethod
def _get_base_children(cls):
@@ -1441,9 +1464,11 @@ class ContextRecordTree(RelationsViews):
@classmethod
def _update_child(cls, parent_id, tree, rel_types):
whole_tree = set()
- children = list(RecordRelations.objects.values_list(
- "left_record_id", flat=True).filter(
- right_record_id=parent_id, relation_type_id__in=rel_types))
+ children = list(
+ RecordRelations.objects.values_list("left_record_id", flat=True).filter(
+ right_record_id=parent_id, relation_type_id__in=rel_types
+ )
+ )
to_be_pop = []
for idx, c in enumerate(children[:]):
if c in tree: # cyclic
@@ -1459,8 +1484,8 @@ class ContextRecordTree(RelationsViews):
@classmethod
def _get_parent_trees(cls, child_id, trees, rel_types, deep=0):
parents = RecordRelations.objects.values_list(
- "right_record_id", flat=True).filter(
- left_record_id=child_id, relation_type_id__in=rel_types)
+ "right_record_id", flat=True
+ ).filter(left_record_id=child_id, relation_type_id__in=rel_types)
if not parents:
return trees
new_trees = []
@@ -1475,14 +1500,14 @@ class ContextRecordTree(RelationsViews):
def _get_equals(cls, item_id, equal_rel_types, exclude=None):
if not exclude:
exclude = [item_id]
- q = RecordRelations.objects.values_list(
- "right_record_id", flat=True).filter(
- left_record_id=item_id, relation_type_id__in=equal_rel_types)
+ q = RecordRelations.objects.values_list("right_record_id", flat=True).filter(
+ left_record_id=item_id, relation_type_id__in=equal_rel_types
+ )
q = q.exclude(right_record_id__in=exclude)
equals = list(q)
- q = RecordRelations.objects.values_list(
- "left_record_id", flat=True).filter(
- right_record_id=item_id, relation_type_id__in=equal_rel_types)
+ q = RecordRelations.objects.values_list("left_record_id", flat=True).filter(
+ right_record_id=item_id, relation_type_id__in=equal_rel_types
+ )
q = q.exclude(left_record_id__in=exclude)
equals += list(q)
exclude += equals
@@ -1496,13 +1521,11 @@ class ContextRecordTree(RelationsViews):
for equal_id in equals:
if item_id != equal_id:
cls.objects.get_or_create(
- key=f"{item_id}_{equal_id}",
- cr_id=item_id, cr_parent_id=equal_id
+ key=f"{item_id}_{equal_id}", cr_id=item_id, cr_parent_id=equal_id
)
keys.append((item_id, equal_id))
cls.objects.get_or_create(
- key=f"{equal_id}_{item_id}",
- cr_id=equal_id, cr_parent_id=item_id
+ key=f"{equal_id}_{item_id}", cr_id=equal_id, cr_parent_id=item_id
)
keys.append((equal_id, item_id))
return keys
@@ -1518,7 +1541,8 @@ class ContextRecordTree(RelationsViews):
if alt_child != child_id:
cls.objects.get_or_create(
key=f"{alt_child}_{parent_id}",
- cr_id=alt_child, cr_parent_id=parent_id
+ cr_id=alt_child,
+ cr_parent_id=parent_id,
)
keys.append((alt_child, parent_id))
equals_parent = set(cls._get_equals(parent_id, equal_rel_types))
@@ -1527,7 +1551,8 @@ class ContextRecordTree(RelationsViews):
if alt_parent != parent_id:
cls.objects.get_or_create(
key=f"{child_id}_{alt_parent}",
- cr_id=child_id, cr_parent_id=alt_parent
+ cr_id=child_id,
+ cr_parent_id=alt_parent,
)
keys.append((child_id, alt_parent))
@@ -1535,7 +1560,8 @@ class ContextRecordTree(RelationsViews):
if alt_child != child_id:
cls.objects.get_or_create(
key=f"{alt_child}_{alt_parent}",
- cr_id=alt_child, cr_parent_id=alt_parent
+ cr_id=alt_child,
+ cr_parent_id=alt_parent,
)
keys.append((alt_child, alt_parent))
return set(keys)
@@ -1545,8 +1571,7 @@ class ContextRecordTree(RelationsViews):
all_relations = set()
# add self relation
cls.objects.get_or_create(
- key=f"{item_id}_{item_id}",
- cr_id=item_id, cr_parent_id=item_id
+ key=f"{item_id}_{item_id}", cr_id=item_id, cr_parent_id=item_id
)
all_relations.add((item_id, item_id))
current_relations_as_child = list(
@@ -1561,8 +1586,9 @@ class ContextRecordTree(RelationsViews):
# get first parents
parent_ids = [
- tree[-1] for tree in cls._get_parent_trees(item_id, [[item_id]],
- inc_rel_types)]
+ tree[-1]
+ for tree in cls._get_parent_trees(item_id, [[item_id]], inc_rel_types)
+ ]
if not parent_ids:
parent_ids = [item_id]
@@ -1580,15 +1606,19 @@ class ContextRecordTree(RelationsViews):
if not already_updated:
already_updated = [item_id]
for parent_id in current_relations_as_child:
- if (item_id, parent_id) not in all_relations and \
- parent_id not in already_updated:
+ if (
+ item_id,
+ parent_id,
+ ) not in all_relations and parent_id not in already_updated:
# disappeared - must regenerate
already_updated.append(parent_id)
cls.objects.filter(key=f"{item_id}_{parent_id}").delete()
cls._update(parent_id, already_updated)
for child_id in current_relations_as_parent:
- if (child_id, item_id) not in all_relations and \
- child_id not in already_updated:
+ if (
+ child_id,
+ item_id,
+ ) not in all_relations and child_id not in already_updated:
# disappeared - must regenerate
already_updated.append(child_id)
cls.objects.filter(key=f"{child_id}_{item_id}").delete()
diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py
index 9f562c703..c8c526d2f 100644
--- a/archaeological_finds/models.py
+++ b/archaeological_finds/models.py
@@ -21,7 +21,7 @@ from archaeological_finds.models_finds import (
MaterialTypeQualityType,
ObjectTypeQualityType,
FindInsideContainer,
- FunctionalArea
+ FunctionalArea,
)
from archaeological_finds.models_treatments import (
Treatment,
diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py
index 004d7d6c2..1c85c2a9a 100644
--- a/archaeological_finds/tests.py
+++ b/archaeological_finds/tests.py
@@ -16,7 +16,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# See the file COPYING for details.
-
+import copy
from copy import deepcopy
import csv
import json
@@ -2514,45 +2514,87 @@ class GeomaticTest(FindInit, TestCase):
defaults={"srid": 4326, "label": "WGS84", "auth_name": "EPSG"},
)
- base_find = models.BaseFind.objects.get(pk=base_find.pk)
+ base_find_pt = models.BaseFind.objects.get(pk=base_find.pk)
# with point
geom = GEOSGeometry("POINT({} {} {})".format(2, 43, 1), srid=4326)
- base_find.point = geom
- base_find.multi_polygon = None
- base_find.save()
- base_find = models.BaseFind.objects.get(pk=base_find.pk)
+ base_find_pt.point = geom
+ base_find_pt.multi_polygon = None
+ base_find_pt.save()
+ base_find_pt = models.BaseFind.objects.get(pk=base_find_pt.pk)
dic = {
"type": "Feature",
"geometry": {"type": "MultiPolygon", "coordinates": []},
}
- res = base_find.get_geo_items(get_polygons=True)
+ res = base_find_pt.get_geo_items(get_polygons=True)
self.assertEqual(dic, res)
dic["geometry"] = {"type": "Point", "coordinates": [2.0, 43.0]}
- res = base_find.get_geo_items(get_polygons=False)
+ res = base_find_pt.get_geo_items(get_polygons=False)
self.assertEqual(dic, res)
- # test API
- find = base_find.find.all()[0]
+ # test API with point
+ find = base_find_pt.find.all()[0]
response = self.client.get(reverse("api-get-geo-point", kwargs={"pk": 0}))
self.assertEqual(response.status_code, 404)
response = self.client.get(reverse("api-get-geo-point", kwargs={"pk": find.pk}))
self.assertEqual(response.status_code, 200)
self.assertIn(json.dumps(dic).encode("utf-8"), response.content)
- # with multi-polygon
- base_find = models.BaseFind.objects.get(pk=base_find.pk)
+ # test context record with point for base find
+ cr = ContextRecord.objects.get(pk=base_find_pt.context_record.pk)
+ pk = cr.pk
+ cr.point = geom
+ cr.multi_polygon = None
+ cr.multi_polygon_source = None
+ cr.multi_polygon_source_item = None
+ cr.save()
+ cr = ContextRecord.objects.get(pk=pk)
+
+ dic_copy = copy.deepcopy(dic)
+ dic["properties"] = {"associated base finds": {"Find 1": dic_copy}}
+ self.assertEqual(dic, cr.get_geo_items(False))
+
+ dic2_copy = copy.deepcopy(dic_copy)
+ dic2_copy["geometry"] = {"type": "MultiPolygon", "coordinates": []}
+ dic2 = {
+ "type": "Feature",
+ "geometry": {"type": "MultiPolygon", "coordinates": []},
+ "properties": {"associated base finds": {"Find 1": dic2_copy}},
+ }
+ self.assertEqual(dic2, cr.get_geo_items(True))
+
+ # test of API for point context record with point as base find
+ response = self.client.get(
+ reverse("api-get-geo-points-from-context", kwargs={"context_record_pk": 0})
+ )
+ self.assertEqual(response.status_code, 404)
+ response = self.client.get(
+ reverse(
+ "api-get-geo-points-from-context", kwargs={"context_record_pk": cr.pk}
+ )
+ )
+ self.assertEqual(response.status_code, 200)
+ self.assertIn(json.dumps(dic).encode("utf-8"), response.content)
+
+ response = self.client.get(
+ reverse(
+ "api-get-geo-polygons-from-context", kwargs={"context_record_pk": 0}
+ )
+ )
+ self.assertEqual(response.status_code, 404)
+ response = self.client.get(
+ reverse(
+ "api-get-geo-polygons-from-context", kwargs={"context_record_pk": cr.pk}
+ )
+ )
+ self.assertEqual(response.status_code, 200)
+ self.assertIn(json.dumps(dic2).encode("utf-8"), response.content)
+
+ # the context record is a multi-polygon
limit = (
"MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),"
"((6 3,9 2,9 4,6 3)))"
)
- base_find.multi_polygon = "SRID=4326;" + limit
- base_find.point_source = None
- base_find.point_2d = None
- base_find.point = None
- base_find.save()
-
- base_find = models.BaseFind.objects.get(pk=base_find.pk)
dict_poly = {
"type": "Feature",
"geometry": {
@@ -2566,16 +2608,74 @@ class GeomaticTest(FindInit, TestCase):
],
},
}
- res_poly = base_find.get_geo_items(get_polygons=True)
- self.assertEqual(dict_poly, res_poly)
+
+ cr = ContextRecord.objects.get(pk=base_find.context_record.pk)
+ pk = cr.pk
+ cr.multi_polygon = "SRID=4326;" + limit
+ cr.multi_polygon_source = "P"
+ cr.multi_polygon_source_item = str(ContextRecord._meta.verbose_name)
+ cr.save()
+ cr = ContextRecord.objects.get(pk=pk)
+
+ dic_poly_based = copy.deepcopy(dict_poly)
+ dic_poly_based["properties"] = {"associated base finds": {"Find 1": dic2_copy}}
+ self.assertEqual(dic_poly_based, cr.get_geo_items(True))
+
dict_centroid = {
"type": "Feature",
"geometry": {"type": "Point", "coordinates": [3.86111, 3.02778]},
}
+ dic_poly_centroid_based = copy.deepcopy(dict_centroid)
+ dic_poly_centroid_based["properties"] = {
+ "associated base finds": {"Find 1": dic_copy}
+ }
+ self.assertEqual(dic_poly_centroid_based, cr.get_geo_items(False))
+
+ # test of API for point context record with multipolygon as base find
+ response = self.client.get(
+ reverse("api-get-geo-points-from-context", kwargs={"context_record_pk": 0})
+ )
+ self.assertEqual(response.status_code, 404)
+ response = self.client.get(
+ reverse(
+ "api-get-geo-points-from-context", kwargs={"context_record_pk": cr.pk}
+ )
+ )
+ self.assertEqual(response.status_code, 200)
+ self.assertIn(
+ json.dumps(dic_poly_centroid_based).encode("utf-8"), response.content
+ )
+
+ response = self.client.get(
+ reverse(
+ "api-get-geo-polygons-from-context", kwargs={"context_record_pk": 0}
+ )
+ )
+ self.assertEqual(response.status_code, 404)
+ response = self.client.get(
+ reverse(
+ "api-get-geo-polygons-from-context", kwargs={"context_record_pk": cr.pk}
+ )
+ )
+ self.assertEqual(response.status_code, 200)
+ self.assertIn(json.dumps(dic_poly_based).encode("utf-8"), response.content)
+
+ # with multi-polygon for base find
+ base_find = models.BaseFind.objects.get(pk=base_find.pk)
+ base_find.multi_polygon = "SRID=4326;" + limit
+ base_find.point_source = None
+ base_find.point_2d = None
+ base_find.point = None
+ base_find.save()
+
+ base_find = models.BaseFind.objects.get(pk=base_find.pk)
+
+ res_poly = base_find.get_geo_items(get_polygons=True)
+ self.assertEqual(dict_poly, res_poly)
res_centroid = base_find.get_geo_items(get_polygons=False)
self.assertEqual(dict_centroid, res_centroid)
- # test API
+ # test API with polygon
response = self.client.get(reverse("api-get-geo-polygons", kwargs={"pk": 0}))
self.assertEqual(response.status_code, 404)
response = self.client.get(
@@ -2595,6 +2695,95 @@ class GeomaticTest(FindInit, TestCase):
self.assertEqual(response.status_code, 200)
self.assertIn(json.dumps(dict_centroid).encode("utf-8"), response.content)
+ # context record is a polygon (and base find also)
+ cr = ContextRecord.objects.get(pk=base_find.context_record.pk)
+ pk = cr.pk
+ cr.multi_polygon = "SRID=4326;" + limit
+ cr.multi_polygon_source = "P"
+ cr.multi_polygon_source_item = str(ContextRecord._meta.verbose_name)
+ cr.save()
+ cr = ContextRecord.objects.get(pk=pk)
+
+ dict_poly_copy = copy.deepcopy(dict_poly)
+ dict_poly["properties"] = {"associated base finds": {"Find 1": dict_poly_copy}}
+ self.assertEqual(dict_poly, cr.get_geo_items(True))
+
+ dict_centroid_copy = copy.deepcopy(dict_centroid)
+ dict_centroid["properties"] = {
+ "associated base finds": {"Find 1": dict_centroid_copy}
+ }
+ self.assertEqual(dict_centroid, cr.get_geo_items(False))
+
+ # test of API for multipolygon context record with multipolygon as base find
+ response = self.client.get(
+ reverse("api-get-geo-points-from-context", kwargs={"context_record_pk": 0})
+ )
+ self.assertEqual(response.status_code, 404)
+ response = self.client.get(
+ reverse(
+ "api-get-geo-points-from-context", kwargs={"context_record_pk": cr.pk}
+ )
+ )
+ self.assertEqual(response.status_code, 200)
+ self.assertIn(json.dumps(dict_centroid).encode("utf-8"), response.content)
+
+ response = self.client.get(
+ reverse(
+ "api-get-geo-polygons-from-context", kwargs={"context_record_pk": 0}
+ )
+ )
+ self.assertEqual(response.status_code, 404)
+ response = self.client.get(
+ reverse(
+ "api-get-geo-polygons-from-context", kwargs={"context_record_pk": cr.pk}
+ )
+ )
+ self.assertEqual(response.status_code, 200)
+ self.assertIn(json.dumps(dict_poly).encode("utf-8"), response.content)
+
+ # context record is a point (and base find a polygon)
+ cr = ContextRecord.objects.get(pk=base_find_pt.context_record.pk)
+ pk = cr.pk
+ cr.point = geom
+ cr.multi_polygon = None
+ cr.multi_polygon_source = None
+ cr.multi_polygon_source_item = None
+ cr.save()
+ cr = ContextRecord.objects.get(pk=pk)
+
+ dic2["properties"] = {"associated base finds": {"Find 1": dict_poly_copy}}
+ self.assertEqual(dic2, cr.get_geo_items(True))
+
+ dic["properties"] = {"associated base finds": {"Find 1": dict_centroid_copy}}
+ self.assertEqual(dic, cr.get_geo_items(False))
+
+ # test of API for point context record with multipolygon as base find
+ response = self.client.get(
+ reverse("api-get-geo-points-from-context", kwargs={"context_record_pk": 0})
+ )
+ self.assertEqual(response.status_code, 404)
+ response = self.client.get(
+ reverse(
+ "api-get-geo-points-from-context", kwargs={"context_record_pk": cr.pk}
+ )
+ )
+ self.assertEqual(response.status_code, 200)
+ self.assertIn(json.dumps(dic).encode("utf-8"), response.content)
+
+ response = self.client.get(
+ reverse(
+ "api-get-geo-polygons-from-context", kwargs={"context_record_pk": 0}
+ )
+ )
+ self.assertEqual(response.status_code, 404)
+ response = self.client.get(
+ reverse(
+ "api-get-geo-polygons-from-context", kwargs={"context_record_pk": cr.pk}
+ )
+ )
+ self.assertEqual(response.status_code, 200)
+ self.assertIn(json.dumps(dic2).encode("utf-8"), response.content)
+
class AutocompleteTest(AutocompleteTestBase, TestCase):
diff --git a/archaeological_finds/urls.py b/archaeological_finds/urls.py
index 58125cc06..2e2278d87 100644
--- a/archaeological_finds/urls.py
+++ b/archaeological_finds/urls.py
@@ -573,7 +573,7 @@ urlpatterns = [
),
url(r"api/public/find/$", views.PublicFindAPI.as_view(), name="api-public-find"),
url(
- r"api/ishtar/base-finds/geo/polygons/(?P<pk>[0-9]+)/?$",
+ r"api/ishtar/base-finds/geo/polygons/?pk=(?P<pk>[0-9]+)/?$",
check_rights(["view_find", "view_own_find"])(
views.get_geo_items,
),
@@ -581,13 +581,45 @@ urlpatterns = [
kwargs={"get_polygons": True},
),
url(
- r"api/ishtar/base-finds/geo/point/(?P<pk>[0-9]+)/$",
+ r"api/ishtar/base-finds/geo/point/?pk=(?P<pk>[0-9]+)/$",
check_rights(["view_find", "view_own_find"])(
views.get_geo_items,
),
name="api-get-geo-point",
kwargs={"get_polygons": False},
),
+ url(
+ r"api/ishtar/base-finds/geo/polygons/?context-record=(?P<context_record_pk>[0-9]+)/$",
+ check_rights(["view_find", "view_own_find"])(
+ views.get_geo_items,
+ ),
+ name="api-get-geo-polygons-from-context",
+ kwargs={"get_polygons": True},
+ ),
+ url(
+ r"api/ishtar/base-finds/geo/points/?context-record=(?P<context_record_pk>[0-9]+)/$",
+ check_rights(["view_find", "view_own_find"])(
+ views.get_geo_items,
+ ),
+ name="api-get-geo-points-from-context",
+ kwargs={"get_polygons": False},
+ ),
+ url(
+ r"api/ishtar/base-finds/geo/polygons/?operation=(?P<operation_pk>[0-9]+)/$",
+ check_rights(["view_find", "view_own_find"])(
+ views.get_geo_items,
+ ),
+ name="api-get-geo-polygons-from-operation",
+ kwargs={"get_polygons": True},
+ ),
+ url(
+ r"api/ishtar/base-finds/geo/points/?operation=(?P<operation_pk>[0-9]+)/$",
+ check_rights(["view_find", "view_own_find"])(
+ views.get_geo_items,
+ ),
+ name="api-get-geo-points-from-operation",
+ kwargs={"get_polygons": False},
+ ),
]
urlpatterns += get_urls_for_model(models.Find, views, own=True, autocomplete=True)
diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py
index d0ac01305..06bbfe632 100644
--- a/archaeological_finds/views.py
+++ b/archaeological_finds/views.py
@@ -30,6 +30,8 @@ from django.core.urlresolvers import reverse
from django.db.models import Q
from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import redirect
+
+from archaeological_context_records.models import ContextRecord
from ishtar_common.utils import ugettext_lazy as _
from django.views.generic import TemplateView
from django.views.generic.edit import CreateView, FormView
@@ -37,7 +39,7 @@ from django.views.generic.edit import CreateView, FormView
from ishtar_common.serializers import PublicSerializer
from ishtar_common.models import IshtarUser, get_current_profile
-from archaeological_operations.models import AdministrativeAct
+from archaeological_operations.models import AdministrativeAct, Operation
from archaeological_finds import models
from ishtar_common.forms import FinalForm
@@ -1318,10 +1320,28 @@ class PublicFindAPI(APIView):
return Response(serializer.data)
-def get_geo_items(request, pk, get_polygons, current_right=None):
- try:
- base_find = models.BaseFind.objects.get(pk=pk)
- except models.BaseFind.DoesNotExist:
- raise Http404()
- dic = base_find.get_geo_items(get_polygons=get_polygons)
+def get_geo_items(
+ request,
+ get_polygons,
+ pk=None,
+ context_record_pk=None,
+ operation_pk=None,
+ current_right=None,
+):
+ if operation_pk:
+ try:
+ bf = Operation.objects.get(pk=operation_pk)
+ except Operation.DoesNotExist:
+ raise Http404()
+ elif context_record_pk:
+ try:
+ bf = ContextRecord.objects.get(pk=context_record_pk)
+ except ContextRecord.DoesNotExist:
+ raise Http404()
+ else:
+ try:
+ bf = models.BaseFind.objects.get(pk=pk)
+ except models.BaseFind.DoesNotExist:
+ raise Http404()
+ dic = bf.get_geo_items(get_polygons=get_polygons)
return HttpResponse(json.dumps(dic).encode("utf-8"))