diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-01-10 13:08:48 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-01-12 09:50:56 +0100 |
commit | 061edbaac5a37b8e717391c3b7d804a96c041979 (patch) | |
tree | 79a9647f9e8563d44d08123dd4844a249001e63a /ishtar_common/rest.py | |
parent | ac839d9481b863c93a9c0f92011118bb581f7c2d (diff) | |
download | Ishtar-061edbaac5a37b8e717391c3b7d804a96c041979.tar.bz2 Ishtar-061edbaac5a37b8e717391c3b7d804a96c041979.zip |
Syndication - export external sources
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] |