diff --git a/scipost_django/api/urls.py b/scipost_django/api/urls.py index 6b2f24c73bc7259be32cdc669763c73bbaa08eb7..417b7cb00e98f905dec14e67fecfd2c6da881409 100644 --- a/scipost_django/api/urls.py +++ b/scipost_django/api/urls.py @@ -21,7 +21,9 @@ from submissions.api.viewsets import SubmissionPublicAPIViewSet from conflicts.viewsets import ConflictOfInterestViewSet from news.viewsets import NewsItemViewSet -from . import views +from api.views.omniauth import OmniAuthUserInfoView +import api.views.search as search_views + app_name = 'api' @@ -51,8 +53,13 @@ urlpatterns += [ path( # /api/omniauth/userinfo/, for SciPost as GitLab/OmniAuth authorization server 'omniauth/userinfo/', - views.OmniAuthUserInfoView.as_view(), + OmniAuthUserInfoView.as_view(), name='omniauth_userinfo' ), + path( # /api/available_search_tabs/ + 'available_search_tabs/', + search_views.available_search_tabs, + name='available_search_tabs' + ), path('finances/', include('finances.api.urls')), ] diff --git a/scipost_django/api/views/__init__.py b/scipost_django/api/views/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/scipost_django/api/views.py b/scipost_django/api/views/omniauth.py similarity index 100% rename from scipost_django/api/views.py rename to scipost_django/api/views/omniauth.py diff --git a/scipost_django/api/views/search.py b/scipost_django/api/views/search.py new file mode 100644 index 0000000000000000000000000000000000000000..fa71b0483b6a6631d9ff0a0cd9f4df8f5a39539d --- /dev/null +++ b/scipost_django/api/views/search.py @@ -0,0 +1,30 @@ +__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" +__license__ = "AGPL v3" + + +import json + +from rest_framework.decorators import api_view +from rest_framework.response import Response + + +@api_view() +def available_search_tabs(request): + """ + JSON info on Search tabs available for user. + """ + tabsinfo = [ + { + 'objectType': 'publication', + 'label': 'publications', + 'url': 'publications' + }, + { + 'objectType': 'submission', + 'label': 'submissions', + 'url': 'submissions' + }, + ] + if request.user.is_authenticated: + pass + return Response(tabsinfo) diff --git a/scipost_django/api/viewsets/base.py b/scipost_django/api/viewsets/base.py new file mode 100644 index 0000000000000000000000000000000000000000..05d716b90dd2728e71f7c4fb5c0ba595e86cf2fc --- /dev/null +++ b/scipost_django/api/viewsets/base.py @@ -0,0 +1,27 @@ +__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" +__license__ = "AGPL v3" + + +from rest_framework import viewsets + + +class ExtraFilteredReadOnlyModelViewSet( + viewsets.ReadOnlyModelViewSet): + + def get_queryset(self): + """ + Filter queryset according to `extra_filterset_fields` attribute. + """ + queryset = super().get_queryset() + for (label, queryspec) in self.extra_filters.items(): + for lookup in queryspec['lookups']: + param = self.request.query_params.get( + '%s__%s' % (label, lookup), None) + if param: + query = Q() + for field in queryspec['fields']: + querydict = {} + querydict['%s__%s' % (field, lookup)] = param + query = query | Q(**querydict) + queryset = queryset.filter(query) + return queryset diff --git a/scipost_vue/components/Search.vue b/scipost_vue/components/Search.vue index 62e3b29be1015a023dd58db31db4b760618aa9f1..33862d9fb03b87a28d7866908d0984c215bac76c 100644 --- a/scipost_vue/components/Search.vue +++ b/scipost_vue/components/Search.vue @@ -177,6 +177,9 @@ </template> <script> +const headers = new Headers(); +headers.append('Accept', 'application/json; version=0') + import { ref, onMounted } from '@vue/composition-api' import SearchableObjectsTable from './SearchableObjectsTable.vue' @@ -193,23 +196,20 @@ export default { }, }, setup(props, context) { - const availableTabs = ref( - [ - { - objectType: 'publication', - label: 'publications', - url: 'publications' - }, - { - objectType: 'submission', - label: 'submissions', - url: 'submissions' - }, - ] - ) + const availableTabs = ref([]) const initialQuery = ref('') + const fetchAvailableTabs = async () => { + fetch('/api/available_search_tabs/', {headers: headers}) + .then(stream => stream.json()) + .then(data => { + availableTabs.value = data + }) + .catch(error => console.error(error)) + } + onMounted( () => { + fetchAvailableTabs() initialQuery.value = JSON.parse(document.getElementById('json_q').textContent) }) // Close search form in header in case it is open