X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/94a4fcc7ab9e1713dc2defc8b35c875fc90f6fa5..c1c30568a2ecc705db04d7f0c94749e55cb41b47:/src/search/views.py?ds=inline diff --git a/src/search/views.py b/src/search/views.py index d6edd5164..6066cd97a 100644 --- a/src/search/views.py +++ b/src/search/views.py @@ -1,5 +1,5 @@ -# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. -# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Wolne Lektury. See NOTICE for more information. # from django.conf import settings from django.shortcuts import render @@ -9,7 +9,7 @@ from sorl.thumbnail import get_thumbnail import catalogue.models import infopages.models -import picture.models +import social.models from .forms import SearchFilters import re import json @@ -24,22 +24,8 @@ def remove_query_syntax_chars(query, replace=' '): return query_syntax_chars.sub(replace, query) -@cache.never_cache -def hint(request, mozhint=False, param='term'): - prefix = request.GET.get(param, '') - if len(prefix) < 2: - return JsonResponse([], safe=False) - - prefix = re_escape(' '.join(remove_query_syntax_chars(prefix).split())) - - try: - limit = int(request.GET.get('max', '')) - except ValueError: - limit = 20 - else: - if limit < 1: - limit = 20 - +def get_hints(prefix, user=None, limit=10): + if not prefix: return [] data = [] if len(data) < limit: authors = catalogue.models.Tag.objects.filter( @@ -48,19 +34,23 @@ def hint(request, mozhint=False, param='term'): { 'type': 'author', 'label': author.name, - 'url': author.get_absolute_gallery_url() if author.for_pictures else author.get_absolute_url(), + 'url': author.get_absolute_url(), 'img': get_thumbnail(author.photo, '72x72', crop='top').url if author.photo else '', + 'slug': author.slug, + 'id': author.id, } for author in authors[:limit - len(data)] ]) - if request.user.is_authenticated and len(data) < limit: - tags = catalogue.models.Tag.objects.filter( - category='set', user=request.user, name_pl__iregex='\m' + prefix).only('name', 'id', 'slug', 'category') + + if user is not None and user.is_authenticated and len(data) < limit: + tags = social.models.UserList.objects.filter( + user=user, name__iregex='\m' + prefix).only('name', 'id', 'slug') data.extend([ { - 'type': 'set', + 'type': 'userlist', 'label': tag.name, 'url': tag.get_absolute_url(), + 'slug': tag.slug, } for tag in tags[:limit - len(data)] ]) @@ -71,7 +61,9 @@ def hint(request, mozhint=False, param='term'): { 'type': tag.category, 'label': tag.name, - 'url': tag.get_absolute_gallery_url() if tag.for_pictures else tag.get_absolute_url(), + 'url': tag.get_absolute_url(), + 'slug': tag.slug, + 'id': tag.id, } for tag in tags[:limit - len(data)] ]) @@ -83,6 +75,7 @@ def hint(request, mozhint=False, param='term'): 'type': 'collection', 'label': collection.title, 'url': collection.get_absolute_url(), + 'slug': collection.slug, } for collection in collections[:limit - len(data)] ]) @@ -99,32 +92,47 @@ def hint(request, mozhint=False, param='term'): 'author': author_str, 'url': b.get_absolute_url(), 'img': get_thumbnail(b.cover_clean, '72x72').url if b.cover_clean else '', + 'slug': b.slug, } ) - if len(data) < limit: - arts = picture.models.Picture.objects.filter( - title__iregex='\m' + prefix).only('title', 'id', 'slug') # img? - data.extend([ - { - 'type': 'art', - 'label': art.title, - 'author': art.author_unicode(), - 'url': art.get_absolute_url(), - 'img': get_thumbnail(art.image_file, '72x72').url if art.image_file else '', - } - for art in arts[:limit - len(data)] - ]) if len(data) < limit: infos = infopages.models.InfoPage.objects.filter( + published=True, + findable=True, title_pl__iregex='\m' + prefix).only('title', 'id', 'slug') data.extend([ { 'type': 'info', 'label': info.title, 'url': info.get_absolute_url(), + 'slug': info.slug, } for info in infos[:limit - len(data)] ]) + return data + + +@cache.never_cache +def hint(request, mozhint=False, param='term'): + prefix = request.GET.get(param, '') + if len(prefix) < 2: + return JsonResponse([], safe=False) + + prefix = re_escape(' '.join(remove_query_syntax_chars(prefix).split())) + + try: + limit = int(request.GET.get('max', '')) + except ValueError: + limit = 20 + else: + if limit < 1: + limit = 20 + + data = get_hints( + prefix, + user=request.user if request.user.is_authenticated else None, + limit=limit + ) if mozhint: data = [