summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_operations/tests.py12
-rw-r--r--archaeological_operations/urls.py5
-rw-r--r--archaeological_operations/views_api.py6
-rw-r--r--ishtar_common/models_common.py35
-rw-r--r--ishtar_common/rest.py56
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")