slugs in search
[wolnelektury.git] / src / search / views.py
index 2f9adab..f797d9f 100644 (file)
@@ -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,22 @@ 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,
             }
             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 +60,8 @@ 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,
             }
             for tag in tags[:limit - len(data)]
         ])
@@ -83,6 +73,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 +90,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': book.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 = [