diff options
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/models_common.py | 35 | ||||
-rw-r--r-- | ishtar_common/rest.py | 56 |
2 files changed, 87 insertions, 4 deletions
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") |