-# 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
import catalogue.models
import infopages.models
-import picture.models
+import social.models
from .forms import SearchFilters
import re
import json
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(
{
'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,
}
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)]
])
{
'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,
}
for tag in tags[:limit - len(data)]
])
'type': 'collection',
'label': collection.title,
'url': collection.get_absolute_url(),
+ 'slug': collection.slug,
}
for collection in collections[:limit - len(data)]
])
'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 = [
[
item['label']
for item in data
+ ],
+ [
+ item.get('author', '')
+ for item in data
+ ],
+ [
+ item['url']
+ for item in data
]
]