diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-11-24 08:13:12 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-12-12 12:20:59 +0100 |
commit | fa4b00372209425b18c57fe9af29a416ce36b39f (patch) | |
tree | 2d5197ad3fb0ac78b343732d3251de320ea07f72 | |
parent | e3ce9c77d36db4510076b677ec7ce1e0021a51f8 (diff) | |
download | Ishtar-fa4b00372209425b18c57fe9af29a416ce36b39f.tar.bz2 Ishtar-fa4b00372209425b18c57fe9af29a416ce36b39f.zip |
Syndication - api view & url for find, context record, warehouse, container and file
-rw-r--r-- | archaeological_context_records/models.py | 1 | ||||
-rw-r--r-- | archaeological_context_records/urls.py | 16 | ||||
-rw-r--r-- | archaeological_context_records/views_api.py | 15 | ||||
-rw-r--r-- | archaeological_files/models.py | 3 | ||||
-rw-r--r-- | archaeological_files/urls.py | 15 | ||||
-rw-r--r-- | archaeological_files/views_api.py | 15 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 1 | ||||
-rw-r--r-- | archaeological_finds/urls.py | 13 | ||||
-rw-r--r-- | archaeological_finds/views.py | 2 | ||||
-rw-r--r-- | archaeological_finds/views_api.py | 16 | ||||
-rw-r--r-- | archaeological_operations/tests.py | 1 | ||||
-rw-r--r-- | archaeological_operations/urls.py | 12 | ||||
-rw-r--r-- | archaeological_operations/views_api.py | 14 | ||||
-rw-r--r-- | archaeological_warehouse/urls.py | 24 | ||||
-rw-r--r-- | archaeological_warehouse/views_api.py | 23 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 7 | ||||
-rw-r--r-- | ishtar_common/models_rest.py | 13 | ||||
-rw-r--r-- | ishtar_common/templatetags/window_field.py | 4 |
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) |