diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-11-06 00:22:56 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-12-12 12:20:59 +0100 |
commit | 905dfbb0ebb91af7b7acaae256306f178863c57f (patch) | |
tree | f9a0ceb1b16a84c1ae4cb56a32115409c092bf73 | |
parent | dfb5da2d29eeb1c9e4b81ea9bc8c883409780bc5 (diff) | |
download | Ishtar-905dfbb0ebb91af7b7acaae256306f178863c57f.tar.bz2 Ishtar-905dfbb0ebb91af7b7acaae256306f178863c57f.zip |
Syndication - WIP serialization
-rw-r--r-- | archaeological_operations/tests.py | 12 | ||||
-rw-r--r-- | archaeological_operations/urls.py | 5 | ||||
-rw-r--r-- | archaeological_operations/views_api.py | 6 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 35 | ||||
-rw-r--r-- | ishtar_common/rest.py | 56 |
5 files changed, 109 insertions, 5 deletions
diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index 36e786f35..0d6753119 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -4798,3 +4798,15 @@ class ApiTest(OperationInitTest, APITestCase): # POV: local # test query limitation pass + + def test_sheet_display(self): + # POV: external + api_search_model = self.create_api_search_model() + url = reverse("api-get-operation", args=[self.operations[0].pk]) + data = {"submited": 1, "search_vector": "28"} + response = self.client.get( + url, format="json", HTTP_AUTHORIZATION=self.auth_token, data=data + ) + self.assertEqual(response.status_code, 200) + j = json.loads(response.content.decode()) + print(j) diff --git a/archaeological_operations/urls.py b/archaeological_operations/urls.py index a7b41ff15..80ef64317 100644 --- a/archaeological_operations/urls.py +++ b/archaeological_operations/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 from archaeological_operations import views @@ -365,4 +366,8 @@ urlpatterns = [ r"api/facets/operation/$", views_api.FacetOperationAPIView.as_view(), name="api-facets-operation" ), + path( + "api/get/operation/<int:pk>/", views_api.GetOperationAPI.as_view(), + name="api-get-operation" + ), ] diff --git a/archaeological_operations/views_api.py b/archaeological_operations/views_api.py index aca400ea3..81d86b330 100644 --- a/archaeological_operations/views_api.py +++ b/archaeological_operations/views_api.py @@ -1,4 +1,4 @@ -from ishtar_common.rest import SearchAPIView, FacetAPIView +from ishtar_common.rest import SearchAPIView, FacetAPIView, GetAPIView from archaeological_operations import models, forms @@ -9,3 +9,7 @@ class SearchOperationAPI(SearchAPIView): class FacetOperationAPIView(FacetAPIView): models = [models.Operation, models.ArchaeologicalSite] select_forms = [forms.OperationSelect, forms.SiteSelect] + + +class GetOperationAPI(GetAPIView): + model = models.Operation diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 79022acc6..58eac91e2 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -3246,6 +3246,41 @@ class MainItem(ShortMenuItem): """ QUICK_ACTIONS = [] + SERIALIZE_EXCLUDE = ["search_vector"] + + def full_serialize(self) -> dict: + """ + API serialization + :return: data dict + """ + full_result = {} + serialize_fields = [] + for field in self._meta.get_fields(): + if field.name in self.SERIALIZE_EXCLUDE: + continue + if field.many_to_one or field.one_to_one: + value = getattr(self, field.name) + if value: + value = str(value) + else: + value = None + full_result[field.name] = value + elif field.many_to_many: + values = getattr(self, field.name) + if values.count(): + values = [str(v) for v in values] + else: + values = [] + full_result[field.name] = values + else: + serialize_fields.append(field.name) + result = json.loads(serialize( + "json", + [self], + fields=serialize_fields + )) + full_result.update(result[0]["fields"]) + return full_result @classmethod def class_verbose_name(cls): diff --git a/ishtar_common/rest.py b/ishtar_common/rest.py index 2d3cefffd..b0498cea6 100644 --- a/ishtar_common/rest.py +++ b/ishtar_common/rest.py @@ -4,12 +4,13 @@ from django.conf import settings from django.db.models import Q from django.utils.translation import activate, deactivate -from rest_framework import authentication, permissions +from rest_framework import authentication, permissions, generics from rest_framework.response import Response from rest_framework.views import APIView from ishtar_common import models_rest from ishtar_common.views_item import get_item +from ishtar_common.serializers_utils import generic_get_results class IpModelPermission(permissions.BasePermission): @@ -99,10 +100,12 @@ class FacetAPIView(APIView): search_keys.append(str(search_key).lower()) deactivate() values[ct_model].append( - [f"{type.model._meta.app_label}.{type.model._meta.model_name}", - search_keys, values_ct] + [ + f"{type.model._meta.app_label}.{type.model._meta.model_name}", + search_keys, + values_ct, + ] ) - #values = json.dumps(values) return Response(values, content_type="json") def _get_base_search_model_queries(self): @@ -130,3 +133,48 @@ class FacetAPIView(APIView): return models_rest.ApiSearchModel.objects.filter( user=request.user.apiuser ).filter(q) + + +class GetAPIView(generics.RetrieveAPIView): + authentication_classes = (authentication.TokenAuthentication,) + permission_classes = (permissions.IsAuthenticated, IpModelPermission) + model = None + + def __init__(self, **kwargs): + assert self.model is not None + super().__init__(**kwargs) + + def search_model_query(self, request): + return models_rest.ApiSearchModel.objects.filter( + user=request.user.apiuser, + content_type__app_label=self.model._meta.app_label, + content_type__model=self.model._meta.model_name, + ) + + def get(self, request, *args, **kwargs): + _get_item = get_item( + self.model, + "get_" + self.model.SLUG, + self.model.SLUG, + no_permission_check=True + # TODO: own_table_cols=get_table_cols_for_ope() - adapt columns + ) + search_model = self.search_model_query(request).all()[0] + if search_model.limit_query: + request.GET._mutable = True + query = search_model.limit_query + request.GET["search_vector"] = query + request.GET._mutable = False + q = _get_item(request, data_type="json", return_query=True).filter( + pk=self.kwargs["pk"] + ) + if not q.count(): + return Response({}, content_type="json") + obj = q.all()[0] + result = obj.full_serialize() + """ + result = generic_get_results( + [self.model], "", no_geo=False, result_queryset={self.model.__name__: q} + ) + """ + return Response(result, content_type="json") |