From 1b629227063ec3fee16aad6ead7f7a2c7b8d1b72 Mon Sep 17 00:00:00 2001 From: PCoder Date: Tue, 31 Aug 2021 21:55:15 +0530 Subject: [PATCH] Implement remainder of the api functionality --- app/views.py | 125 ++++++++++++++++++++++++++++++++------------ gmba_django/urls.py | 22 +++----- 2 files changed, 98 insertions(+), 49 deletions(-) diff --git a/app/views.py b/app/views.py index 108a833..af59fd1 100644 --- a/app/views.py +++ b/app/views.py @@ -11,6 +11,9 @@ from django.core.paginator import Paginator from django.http import FileResponse, HttpResponsePermanentRedirect, HttpResponse, JsonResponse from django.urls import reverse from django.shortcuts import get_object_or_404 +import operator +from django.db.models import Q +from functools import reduce import os.path as ospath from shutil import move @@ -18,7 +21,7 @@ from os import makedirs from tempfile import gettempdir from .formats import * from .convert import reindex_data, refresh_data -from .models import Person, RangesPeople, TaxaPeople, FieldsPeople, MethodsPeople, Range +from .models import Person, RangesPeople, TaxaPeople, FieldsPeople, MethodsPeople, Range, Field, Taxon, Resource # Get temporary file storage UPLOAD_PATH = gettempdir() @@ -162,6 +165,41 @@ class ConfigurationHomePageView(TemplateView): return context +def get_paginated(query_set, page, per_page): + paginator = Paginator(query_set, per_page).page(page) + filters = { + 'country': [], + 'range': [], + 'field': [], + 'taxon': [], + } + for p in paginator.object_list: + filters['country'].append(p.country) + for r in p.rangespeople_set.all(): + filters['range'].append(r.name) + for r in p.fieldspeople_set.all(): + filters['field'].append(r.name) + for r in p.taxapeople_set.all(): + filters['taxon'].append(r.name) + filters = { + 'country': sorted(set(filters['country'])), + 'range': sorted(set(filters['range'])), + 'field': sorted(set(filters['field'])), + 'taxon': sorted(set(filters['taxon'])), + } + + if len(query_set.all()) > len(paginator.object_list) and paginator.paginator.count == 1: + paginator.object_list = query_set.all() + paginator.count(len(paginator.object_list)) + return_data = { + 'items': [p.dict() for p in paginator.object_list], + 'filters': filters, + 'page': page, 'pages': paginator.paginator.num_pages, 'total': paginator.paginator.count, + 'has_next': paginator.has_next(), 'has_prev': paginator.has_previous() + } + return return_data + + class SearchView(View): def get(self, request): @@ -171,7 +209,8 @@ class SearchView(View): if not q or len(q) < 3: query_set = Person.objects.all() else: - query_set = Person.objects.filter(field_indexer__icontains=q.split(" ")) + query = reduce(operator.or_, (Q(field_indexer__icontains=item) for item in q.split(" "))) + query_set = Person.objects.filter(query) q_country = self.request.GET.get('country', '') q_range = self.request.GET.get('range', '') @@ -192,38 +231,7 @@ class SearchView(View): t_people_ids = [tp.person_id for tp in taxa_people] query_set = query_set.filter(id__in=t_people_ids) query_set = query_set.order_by('last_name') - paginator = Paginator(query_set, per_page).page(page) - filters = { - 'country': [], - 'range': [], - 'field': [], - 'taxon': [], - } - for p in paginator.object_list: - filters['country'].append(p.country) - for r in p.rangespeople_set.all(): - filters['range'].append(r.name) - for r in p.fieldspeople_set.all(): - filters['field'].append(r.name) - for r in p.taxapeople_set.all(): - filters['taxon'].append(r.name) - filters = { - 'country': sorted(set(filters['country'])), - 'range': sorted(set(filters['range'])), - 'field': sorted(set(filters['field'])), - 'taxon': sorted(set(filters['taxon'])), - } - - if len(query_set.all()) > len(paginator.object_list) and paginator.paginator.count == 1: - paginator.object_list = query_set.all() - paginator.count(len(paginator.object_list)) - return_data = { - 'items': [p.dict() for p in paginator.object_list], - 'filters': filters, - 'page': page, 'pages': paginator.paginator.num_pages, 'total': paginator.paginator.count, - 'has_next': paginator.has_next(), 'has_prev': paginator.has_previous() - } - return JsonResponse(return_data) + return JsonResponse(get_paginated(query_set, page, per_page)) class PeopleDetailView(View): @@ -241,6 +249,55 @@ class PeopleDetailView(View): return JsonResponse(return_data) +class PeopleListView(View): + def get(self, request): + page = int(self.request.GET.get('page', 1)) + per_page = int(self.request.GET.get('per_page', 10)) + query_set = Person.objects.all().order_by('last_name') + return JsonResponse(get_paginated(query_set, page, per_page)) + + +class ResourceListView(View): + def get(self, request): + page = int(self.request.GET.get('page', 1)) + per_page = int(self.request.GET.get('per_page', 10)) + query_set = Resource.objects.all().order_by('title') + return JsonResponse(get_paginated(query_set, page, per_page)) + + +MAX_FILTER_RESULTS = 50 + + +class RangesListView(View): + def get(self, request): + q = self.request.GET.get('q', '').strip() + if not q or len(q) < 3: + query_set = Range.objects.all().order_by('name')[:MAX_FILTER_RESULTS] + else: + query_set = Range.objects.filter(name__icontains=q.strip().lower()) + return JsonResponse(list(query_set.values()), safe=False) + + +class FieldsListView(View): + def get(self, request): + q = self.request.GET.get('q', '').strip() + if not q or len(q) < 3: + query_set = Field.objects.all().order_by('name')[:MAX_FILTER_RESULTS] + else: + query_set = Field.objects.filter(name__icontains=q.strip().lower()) + return JsonResponse(list(query_set.values()), safe=False) + + +class TaxaListView(View): + def get(self, request): + q = self.request.GET.get('q', '').strip() + if not q or len(q) < 3: + query_set = Taxon.objects.all().order_by('name')[:MAX_FILTER_RESULTS] + else: + query_set = Taxon.objects.filter(name__icontains=q.strip().lower()) + return JsonResponse(list(query_set.values()), safe=False) + + class UploadView(TemplateView): template_name = "app/admin/config.html" diff --git a/gmba_django/urls.py b/gmba_django/urls.py index 71295f5..9b8822d 100644 --- a/gmba_django/urls.py +++ b/gmba_django/urls.py @@ -18,7 +18,8 @@ from django.urls import path from django.views.generic import TemplateView from app.views import ( HomePageView, OfflinePageView, send_from_file, DemoPageView, ConfigurationPageView, get_progress, UploadView, - ReindexPageView, RefreshPageView, ConfigurationHomePageView, SearchView, PeopleDetailView + ReindexPageView, RefreshPageView, ConfigurationHomePageView, SearchView, PeopleDetailView, TaxaListView, + FieldsListView, RangesListView, ResourceListView, PeopleListView ) @@ -39,18 +40,9 @@ urlpatterns = [ path('refresh', RefreshPageView.as_view(), name='refresh'), path('api/search', SearchView.as_view(), name='api-search'), path('api/people/', PeopleDetailView.as_view(), name='api-people-detail'), - - - # TODO Implement the following - # path('reindex/', admin.site.urls), - # path('progress/', admin.site.urls), - # path('refresh/', admin.site.urls), - # path('upload/', admin.site.urls), - # path('api/taxa', admin.site.urls), - # path('api/fields', admin.site.urls), - # path('api/ranges', admin.site.urls), - # path('api/resources', admin.site.urls), - # path('api/people', admin.site.urls), - # path('api/people/', admin.site.urls), - # path('api/search', admin.site.urls), + path('api/taxa', TaxaListView.as_view(), name='api-taxa-list'), + path('api/fields', FieldsListView.as_view(), name='api-field-list'), + path('api/ranges', RangesListView.as_view(), name='api-range-list'), + path('api/resources', ResourceListView.as_view(), name='api-resource-list'), + path('api/people', PeopleListView.as_view(), name='api-people-list'), ]