summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_context_records/models.py1
-rw-r--r--archaeological_context_records/urls.py16
-rw-r--r--archaeological_context_records/views_api.py15
-rw-r--r--archaeological_files/models.py3
-rw-r--r--archaeological_files/urls.py15
-rw-r--r--archaeological_files/views_api.py15
-rw-r--r--archaeological_finds/models_finds.py1
-rw-r--r--archaeological_finds/urls.py13
-rw-r--r--archaeological_finds/views.py2
-rw-r--r--archaeological_finds/views_api.py16
-rw-r--r--archaeological_operations/tests.py1
-rw-r--r--archaeological_operations/urls.py12
-rw-r--r--archaeological_operations/views_api.py14
-rw-r--r--archaeological_warehouse/urls.py24
-rw-r--r--archaeological_warehouse/views_api.py23
-rw-r--r--ishtar_common/models_common.py7
-rw-r--r--ishtar_common/models_rest.py13
-rw-r--r--ishtar_common/templatetags/window_field.py4
18 files changed, 179 insertions, 16 deletions
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index ff33d8bf3..ef9e2788e 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -613,6 +613,7 @@ class ContextRecord(
rights=["change_contextrecord", "change_own_contextrecord"],
),
]
+ SERIALIZE_EXCLUDE = MainItem.SERIALIZE_EXCLUDE + ["contextrecord"]
history = HistoricalRecords(bases=[HistoryModel])
objects = UUIDModelManager()
diff --git a/archaeological_context_records/urls.py b/archaeological_context_records/urls.py
index 3db2cf9aa..fd267fc6a 100644
--- a/archaeological_context_records/urls.py
+++ b/archaeological_context_records/urls.py
@@ -18,10 +18,10 @@
# See the file COPYING for details.
from django.conf.urls import url
+from django.urls import path
from ishtar_common.utils import check_rights
-from archaeological_context_records import models
-from archaeological_context_records import views
+from archaeological_context_records import models, views, views_api
# be careful: each check_rights must be relevant with ishtar_menu
@@ -184,4 +184,16 @@ urlpatterns = [
name="contextrecord-qa-bulk-update-confirm",
kwargs={"confirm": True},
),
+ url(
+ r"api/facets/contextrecord/$", views_api.FacetContextRecordAPIView.as_view(),
+ name="api-facets-contextrecord"
+ ),
+ url(
+ r"api/search/context-record/$", views_api.SearchContextRecordAPI.as_view(),
+ name="api-search-contextrecord"
+ ),
+ path(
+ "api/get/contextrecord/<int:pk>/", views_api.GetContextRecordAPI.as_view(),
+ name="api-get-contextrecord"
+ ),
]
diff --git a/archaeological_context_records/views_api.py b/archaeological_context_records/views_api.py
new file mode 100644
index 000000000..8a5d8fbcd
--- /dev/null
+++ b/archaeological_context_records/views_api.py
@@ -0,0 +1,15 @@
+from ishtar_common.rest import SearchAPIView, FacetAPIView, GetAPIView
+from archaeological_context_records import models, forms
+
+
+class FacetContextRecordAPIView(FacetAPIView):
+ models = [models.ContextRecord]
+ select_forms = [forms.RecordSelect]
+
+
+class SearchContextRecordAPI(SearchAPIView):
+ model = models.ContextRecord
+
+
+class GetContextRecordAPI(GetAPIView):
+ model = models.ContextRecord
diff --git a/archaeological_files/models.py b/archaeological_files/models.py
index 6ea53c731..cdc996d95 100644
--- a/archaeological_files/models.py
+++ b/archaeological_files/models.py
@@ -61,7 +61,7 @@ from ishtar_common.models import (
HierarchicalType,
)
-from ishtar_common.models_common import HistoricalRecords, Department
+from ishtar_common.models_common import HistoricalRecords, Department, MainItem
from archaeological_operations.models import (
get_values_town_related,
@@ -516,6 +516,7 @@ class File(
}
HISTORICAL_M2M = ["towns", "departments"]
+ SERIALIZE_PROPERTIES = ["external_id"]
# fields
year = models.IntegerField(_("Year"), default=get_current_year)
diff --git a/archaeological_files/urls.py b/archaeological_files/urls.py
index 942987491..a8e0fa5a5 100644
--- a/archaeological_files/urls.py
+++ b/archaeological_files/urls.py
@@ -18,9 +18,10 @@
# See the file COPYING for details.
from django.conf.urls import url
+from django.urls import path
from ishtar_common.utils import check_rights
-from archaeological_files import views
+from archaeological_files import views, views_api
from archaeological_operations.views import administrativeactfile_document
# be carreful: each check_rights must be relevant with ishtar_menu
@@ -165,4 +166,16 @@ urlpatterns = [
),
name="file-edit-preventive-copy-planned",
),
+ url(
+ r"api/facets/file/$", views_api.FacetFileAPIView.as_view(),
+ name="api-facets-file"
+ ),
+ url(
+ r"api/search/file/$", views_api.SearchFileAPI.as_view(),
+ name="api-search-file"
+ ),
+ path(
+ "api/get/file/<int:pk>/", views_api.GetFileAPI.as_view(),
+ name="api-get-file"
+ ),
]
diff --git a/archaeological_files/views_api.py b/archaeological_files/views_api.py
new file mode 100644
index 000000000..b12634353
--- /dev/null
+++ b/archaeological_files/views_api.py
@@ -0,0 +1,15 @@
+from ishtar_common.rest import SearchAPIView, FacetAPIView, GetAPIView
+from archaeological_files import models, forms
+
+
+class FacetFileAPIView(FacetAPIView):
+ models = [models.File]
+ select_forms = [forms.FileSelect]
+
+
+class SearchFileAPI(SearchAPIView):
+ model = models.File
+
+
+class GetFileAPI(GetAPIView):
+ model = models.File
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index 2218cb011..5570af0d5 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -1758,6 +1758,7 @@ class Find(
"cached_object_types",
"cached_materials",
]
+ SERIALIZE_PROPERTIES = ["external_id"]
objects = UUIDModelManager()
# fields
diff --git a/archaeological_finds/urls.py b/archaeological_finds/urls.py
index 532e22ab0..518a2af7e 100644
--- a/archaeological_finds/urls.py
+++ b/archaeological_finds/urls.py
@@ -18,6 +18,7 @@
# See the file COPYING for details.
from django.conf.urls import url
+from django.urls import path
from ishtar_common.utils import check_rights, get_urls_for_model
@@ -613,6 +614,18 @@ urlpatterns = [
name="api-get-geo-points",
kwargs={"get_polygons": False},
),
+ url(
+ r"api/facets/find/$", views_api.FacetFindAPIView.as_view(),
+ name="api-facets-find"
+ ),
+ url(
+ r"api/search/find/$", views_api.SearchFindAPI.as_view(),
+ name="api-search-find"
+ ),
+ path(
+ "api/get/find/<int:pk>/", views_api.GetFindAPI.as_view(),
+ name="api-get-find"
+ ),
]
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 db8c4b04e..d8fd48353 100644
--- a/archaeological_finds/views.py
+++ b/archaeological_finds/views.py
@@ -195,6 +195,8 @@ def show_find_extra(request, find):
if not request.user or not request.user.ishtaruser:
return {}
user = request.user.ishtaruser
+ if isinstance(find, dict):
+ return {"baskets": []}
q = (
models.FindBasket.objects.filter(items__pk=find.pk)
.filter(
diff --git a/archaeological_finds/views_api.py b/archaeological_finds/views_api.py
index 66cadeb5e..64831de57 100644
--- a/archaeological_finds/views_api.py
+++ b/archaeological_finds/views_api.py
@@ -2,9 +2,10 @@ from rest_framework import authentication, permissions
from rest_framework.views import APIView
from rest_framework.response import Response
+from ishtar_common.rest import SearchAPIView, FacetAPIView, GetAPIView
from ishtar_common.serializers import PublicSerializer
-from archaeological_finds import models
+from archaeological_finds import models, forms
class PublicFindAPI(APIView):
@@ -38,3 +39,16 @@ class PublicFindAPI(APIView):
def get(self, request, format=None):
serializer = PublicSerializer(self.get_queryset(), many=True)
return Response(serializer.data)
+
+
+class FacetFindAPIView(FacetAPIView):
+ models = [models.Find]
+ select_forms = [forms.FindSelect]
+
+
+class SearchFindAPI(SearchAPIView):
+ model = models.Find
+
+
+class GetFindAPI(GetAPIView):
+ model = models.Find
diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py
index 0d6753119..b13bf99ff 100644
--- a/archaeological_operations/tests.py
+++ b/archaeological_operations/tests.py
@@ -4786,7 +4786,6 @@ class ApiTest(OperationInitTest, APITestCase):
distant_key__in=keys).update(
local_slug="neolithic", local_label="Néolithique")
-
def test_external_source_query(self):
# POV: local
# send a query to an external source when activated
diff --git a/archaeological_operations/urls.py b/archaeological_operations/urls.py
index 80ef64317..f177994be 100644
--- a/archaeological_operations/urls.py
+++ b/archaeological_operations/urls.py
@@ -359,15 +359,23 @@ urlpatterns = [
name="generate-stats-operation",
),
url(
+ r"api/facets/operation/$", views_api.FacetOperationAPIView.as_view(),
+ name="api-facets-operation"
+ ),
+ url(
r"api/search/operation/$", views_api.SearchOperationAPI.as_view(),
name="api-search-operation"
),
url(
- r"api/facets/operation/$", views_api.FacetOperationAPIView.as_view(),
- name="api-facets-operation"
+ r"api/search/archaeologicalsite/$", views_api.SearchSiteAPI.as_view(),
+ name="api-search-archaeologicalsite"
),
path(
"api/get/operation/<int:pk>/", views_api.GetOperationAPI.as_view(),
name="api-get-operation"
),
+ path(
+ "api/get/archaeologicalsite/<int:pk>/", views_api.GetSiteAPI.as_view(),
+ name="api-get-archaeologicalsite"
+ ),
]
diff --git a/archaeological_operations/views_api.py b/archaeological_operations/views_api.py
index 81d86b330..b1d4cfb51 100644
--- a/archaeological_operations/views_api.py
+++ b/archaeological_operations/views_api.py
@@ -2,14 +2,22 @@ from ishtar_common.rest import SearchAPIView, FacetAPIView, GetAPIView
from archaeological_operations import models, forms
+class FacetOperationAPIView(FacetAPIView):
+ models = [models.Operation, models.ArchaeologicalSite]
+ select_forms = [forms.OperationSelect, forms.SiteSelect]
+
+
class SearchOperationAPI(SearchAPIView):
model = models.Operation
-class FacetOperationAPIView(FacetAPIView):
- models = [models.Operation, models.ArchaeologicalSite]
- select_forms = [forms.OperationSelect, forms.SiteSelect]
+class SearchSiteAPI(SearchAPIView):
+ model = models.ArchaeologicalSite
class GetOperationAPI(GetAPIView):
model = models.Operation
+
+
+class GetSiteAPI(GetAPIView):
+ model = models.ArchaeologicalSite
diff --git a/archaeological_warehouse/urls.py b/archaeological_warehouse/urls.py
index e737125b7..870008de4 100644
--- a/archaeological_warehouse/urls.py
+++ b/archaeological_warehouse/urls.py
@@ -18,11 +18,11 @@
# See the file COPYING for details.
from django.conf.urls import url
+from django.urls import path
from ishtar_common.utils import check_rights
-from archaeological_warehouse import views
-from archaeological_warehouse import models
+from archaeological_warehouse import models, views, views_api
# be careful: each check_rights must be relevant with ishtar_menu
@@ -241,4 +241,24 @@ urlpatterns = [
views.GenerateStatsWarehouse.as_view(),
name="generate-stats-warehouse",
),
+ url(
+ r"api/facets/warehouse/$", views_api.FacetWarehouseAPIView.as_view(),
+ name="api-facets-warehouse"
+ ),
+ url(
+ r"api/search/warehouse/$", views_api.SearchWarehouseAPI.as_view(),
+ name="api-search-warehouse"
+ ),
+ path(
+ "api/get/warehouse/<int:pk>/", views_api.GetWarehouseAPI.as_view(),
+ name="api-get-warehouse"
+ ),
+ url(
+ r"api/search/container/$", views_api.SearchContainerAPI.as_view(),
+ name="api-search-container"
+ ),
+ path(
+ "api/get/container/<int:pk>/", views_api.GetContainerAPI.as_view(),
+ name="api-get-container"
+ ),
]
diff --git a/archaeological_warehouse/views_api.py b/archaeological_warehouse/views_api.py
new file mode 100644
index 000000000..468fe08c2
--- /dev/null
+++ b/archaeological_warehouse/views_api.py
@@ -0,0 +1,23 @@
+from ishtar_common.rest import SearchAPIView, FacetAPIView, GetAPIView
+from archaeological_warehouse import models, forms
+
+
+class FacetWarehouseAPIView(FacetAPIView):
+ models = [models.Warehouse, models.Container]
+ select_forms = [forms.WarehouseSelect, forms.ContainerSelect]
+
+
+class SearchWarehouseAPI(SearchAPIView):
+ model = models.Warehouse
+
+
+class SearchContainerAPI(SearchAPIView):
+ model = models.Container
+
+
+class GetWarehouseAPI(GetAPIView):
+ model = models.Warehouse
+
+
+class GetContainerAPI(GetAPIView):
+ model = models.Container
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py
index e55a21e0c..3138cecc6 100644
--- a/ishtar_common/models_common.py
+++ b/ishtar_common/models_common.py
@@ -29,7 +29,7 @@ from django.contrib.postgres.fields import JSONField
from django.contrib.postgres.search import SearchVectorField, SearchVector
from django.contrib.sites.models import Site
from django.core.cache import cache
-from django.core.exceptions import ObjectDoesNotExist
+from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from django.core.files import File
from django.core.serializers import serialize
from django.urls import reverse, NoReverseMatch
@@ -3268,7 +3268,10 @@ class MainItem(ShortMenuItem):
if field.name in self.SERIALIZE_EXCLUDE:
continue
if field.many_to_one or field.one_to_one:
- value = getattr(self, field.name)
+ try:
+ value = getattr(self, field.name)
+ except (MultipleObjectsReturned, ObjectDoesNotExist):
+ value = None
if value:
value = str(value)
else:
diff --git a/ishtar_common/models_rest.py b/ishtar_common/models_rest.py
index cc07a8803..f2b060bef 100644
--- a/ishtar_common/models_rest.py
+++ b/ishtar_common/models_rest.py
@@ -21,7 +21,18 @@ except (AssertionError, ImportError):
from ishtar_common.utils import ugettext_lazy as _
-MAIN_CONTENT_TYPES = (("archaeological_operations", "operation"),)
+APP_CONTENT_TYPES = [
+ ("archaeological_operations", "operation"),
+ ("archaeological_context_records", "contextrecord"),
+ ("archaeological_finds", "find"),
+ ("archaeological_warehouse", "warehouse"),
+ ("archaeological_files", "file"),
+]
+
+MAIN_CONTENT_TYPES = APP_CONTENT_TYPES + [
+ ("archaeological_operations", "archaeologicalsite"),
+ ("archaeological_warehouse", "container"),
+]
class ApiUser(models.Model):
diff --git a/ishtar_common/templatetags/window_field.py b/ishtar_common/templatetags/window_field.py
index cffa2a54f..70a2ba4da 100644
--- a/ishtar_common/templatetags/window_field.py
+++ b/ishtar_common/templatetags/window_field.py
@@ -211,4 +211,8 @@ def field_flex_detail_multiple_full(context, caption, items):
@register.filter
def m2m_listing(item, key):
+ if isinstance(item, dict):
+ if key in item:
+ return item[key]
+ return []
return item.m2m_listing(key)