-def did_you_mean(query, tokens):
- return query
- # change = {}
- # for t in tokens:
- # authors = Tag.objects.filter(category='author', name__iregex=match_word_re(t))
- # if len(authors) > 0:
- # continue
-
- # if False:
- # if not dictionary.check(t):
- # try:
- # change_to = dictionary.suggest(t)[0].lower()
- # if change_to != t.lower():
- # change[t] = change_to
- # except IndexError:
- # pass
-
- # if change == {}:
- # return None
-
- # for frm, to in change.items():
- # query = query.replace(frm, to)
-
- # return query
+def get_hints(prefix, user=None, limit=10):
+ if not prefix: return []
+ data = []
+ if len(data) < limit:
+ authors = catalogue.models.Tag.objects.filter(
+ category='author', name_pl__iregex='\m' + prefix).only('name', 'id', 'slug', 'category')
+ data.extend([
+ {
+ 'type': 'author',
+ 'label': author.name,
+ 'url': author.get_absolute_url(),
+ 'img': get_thumbnail(author.photo, '72x72', crop='top').url if author.photo else '',
+ }
+ for author in authors[:limit - len(data)]
+ ])
+
+ 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': 'userlist',
+ 'label': tag.name,
+ 'url': tag.get_absolute_url(),
+ }
+ for tag in tags[:limit - len(data)]
+ ])
+ if len(data) < limit:
+ tags = catalogue.models.Tag.objects.filter(
+ category__in=('theme', 'genre', 'epoch', 'kind'), name_pl__iregex='\m' + prefix).only('name', 'id', 'slug', 'category')
+ data.extend([
+ {
+ 'type': tag.category,
+ 'label': tag.name,
+ 'url': tag.get_absolute_url(),
+ }
+ for tag in tags[:limit - len(data)]
+ ])
+ if len(data) < limit:
+ collections = catalogue.models.Collection.objects.filter(
+ title_pl__iregex='\m' + prefix).only('title', 'slug')
+ data.extend([
+ {
+ 'type': 'collection',
+ 'label': collection.title,
+ 'url': collection.get_absolute_url(),
+ }
+ for collection in collections[:limit - len(data)]
+ ])
+ if len(data) < limit:
+ for b in catalogue.models.Book.objects.filter(findable=True, title__iregex='\m' + prefix)[:limit-len(data)]:
+ author_str = b.author_unicode()
+ translator = b.translator()
+ if translator:
+ author_str += ' (tłum. ' + translator + ')'
+ data.append(
+ {
+ 'type': 'book',
+ 'label': b.title,
+ 'author': author_str,
+ 'url': b.get_absolute_url(),
+ 'img': get_thumbnail(b.cover_clean, '72x72').url if b.cover_clean else '',
+ }
+ )
+ 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(),
+ }
+ for info in infos[:limit - len(data)]
+ ])
+ return data