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") | 
