diff options
Diffstat (limited to 'ishtar_common/rest.py')
| -rw-r--r-- | ishtar_common/rest.py | 84 | 
1 files changed, 76 insertions, 8 deletions
diff --git a/ishtar_common/rest.py b/ishtar_common/rest.py index f85061b69..e489e5f80 100644 --- a/ishtar_common/rest.py +++ b/ishtar_common/rest.py @@ -1,7 +1,10 @@ -import json +import datetime +import requests  from django.conf import settings  from django.db.models import Q +from django.http import HttpResponse +from django.shortcuts import reverse  from django.utils.translation import activate, deactivate  from rest_framework import authentication, permissions, generics @@ -10,8 +13,8 @@ from rest_framework.views import APIView  from ishtar_common import models_rest  from ishtar_common.models_common import GeneralType +from ishtar_common.models_imports import Importer  from ishtar_common.views_item import get_item -from ishtar_common.serializers_utils import generic_get_results  class IpModelPermission(permissions.BasePermission): @@ -39,15 +42,24 @@ class SearchAPIView(APIView):              content_type__model=self.model._meta.model_name,          ) -    def get(self, request, format=None): +    def get(self, request, slug=None, format=None, data_type="json"): +        search_model = self.search_model_query(request).all()[0] +        # get default importer +        if slug: +            q = search_model.export.filter(slug=slug) +            if not q.count(): +                return HttpResponse('Page not found', status=404) +            table_cols, col_names = q.all()[0].get_columns() +        else: +            table_cols, col_names = self.model.get_columns(dict_col_labels=False) +          _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 +            no_permission_check=True, +            own_table_cols=table_cols          ) -        search_model = self.search_model_query(request).all()[0]          if search_model.limit_query:              query = search_model.limit_query              if request.GET.get("search_vector", None): @@ -55,13 +67,30 @@ class SearchAPIView(APIView):              request.GET._mutable = True              request.GET["search_vector"] = query              request.GET._mutable = False -        data_type = "json" + +        # source-1-689-source-1-1853 -> 689-1853 +        if "selected_ids" in request.GET: +            value = request.GET["selected_ids"] +            values = [] +            for idx, k in enumerate(value.split("-")): +                if idx % 3 == 2: +                    values.append(k) +            request.GET._mutable = True +            request.GET["selected_ids"] = "-".join(values) +            request.GET._mutable = False +          if request.GET.get("data_type", None):              data_type = request.GET.get("data_type") -        response = _get_item(request, data_type=data_type) +        response = _get_item(request, col_names=col_names, data_type=data_type, +                             type=data_type)          return response +class ExportAPIView(SearchAPIView): +    def get(self, request, slug=None, format=None, data_type="csv"): +        return super().get(request, slug=slug, format=format, data_type=data_type) + +  class FacetAPIView(APIView):      authentication_classes = (authentication.TokenAuthentication,)      permission_classes = (permissions.IsAuthenticated, IpModelPermission) @@ -78,6 +107,45 @@ class FacetAPIView(APIView):      def get(self, request, format=None):          values = {}          base_queries = self._get_base_search_model_queries() + +        # config +        values["config"] = { +            "search_columns": "", +            "search_columns_label": "", +            "exports": "", +            "exports_label": "" +        } +        for model in self.models: +            model_name = f"{model._meta.app_label}-{model._meta.model_name}-" +            q = models_rest.ApiSearchModel.objects.filter( +                user=request.user.apiuser, +                content_type__app_label=model._meta.app_label, +                content_type__model=model._meta.model_name +            ) +            if not q.count(): +                continue +            search_model = q.all()[0] +            # cols, col_names = search_model.table_format.get_columns() +            cols, col_names = model.get_columns(dict_col_labels=False) +            cols, col_names = [c for c in cols if c], [c for c in col_names if c] +            if cols and col_names: +                if values["config"]["search_columns"]: +                    values["config"]["search_columns"] += "||" +                    values["config"]["search_columns_label"] += "||" +                values["config"]["search_columns"] += "||".join([ +                    model_name + (col[0] if isinstance(col, list) else col) +                    for col in cols +                ]) +                values["config"]["search_columns_label"] += "||".join([ +                    model_name + col for col in col_names +                ]) +            for export in search_model.export.all(): +                if values["config"]["exports"]: +                    values["config"]["exports"] += "||" +                    values["config"]["exports_label"] += "||" +                values["config"]["exports"] += model_name + export.slug +                values["config"]["exports_label"] += model_name + export.name +          for idx, select_form in enumerate(self.select_forms):              # only send types matching permissions              model, q = base_queries[idx]  | 
