Przeglądaj źródła

Implement searching individual fields (#1457)

Nick Sweeting 1 rok temu
rodzic
commit
920b92e658

+ 26 - 2
archivebox/core/views.py

@@ -387,13 +387,37 @@ class PublicIndexView(ListView):
 
     def get_queryset(self, **kwargs):
         qs = super().get_queryset(**kwargs)
-        query = self.request.GET.get('q')
-        if query and query.strip():
+        query = self.request.GET.get('q', default = '').strip()
+
+        if not query:
+            return qs.distinct()
+
+        query_type = self.request.GET.get('query_type')
+
+        if not query_type or query_type == 'all':
             qs = qs.filter(Q(title__icontains=query) | Q(url__icontains=query) | Q(timestamp__icontains=query) | Q(tags__name__icontains=query))
             try:
                 qs = qs | query_search_index(query)
             except Exception as err:
                 print(f'[!] Error while using search backend: {err.__class__.__name__} {err}')
+        elif query_type == 'fulltext':
+            try:
+                qs = qs | query_search_index(query)
+            except Exception as err:
+                print(f'[!] Error while using search backend: {err.__class__.__name__} {err}')
+        elif query_type == 'meta':
+            qs = qs.filter(Q(title__icontains=query) | Q(url__icontains=query) | Q(timestamp__icontains=query) | Q(tags__name__icontains=query))
+        elif query_type == 'url':
+            qs = qs.filter(Q(url__icontains=query))
+        elif query_type == 'title':
+            qs = qs.filter(Q(title__icontains=query))
+        elif query_type == 'timestamp':
+            qs = qs.filter(Q(timestamp__icontains=query))
+        elif query_type == 'tags':
+            qs = qs.filter(Q(tags__name__icontains=query))
+        else:
+            print(f'[!] Unknown value for query_type: "{query_type}"')
+
         return qs.distinct()
 
     def get(self, *args, **kwargs):

+ 9 - 0
archivebox/templates/core/public_index.html

@@ -6,6 +6,15 @@
         <form id="changelist-search" action="{% url 'public-index' %}" method="get">
             <div>
                 <label for="searchbar"><img src="/static/admin/img/search.svg" alt="Search"></label>
+                <select name="query_type" id="query_type">
+                    <option value="all" selected>All</option>
+                    <option value="fulltext">Content</option>
+                    <option value="meta">Metadata</option>
+                    <option value="url">URL</option>
+                    <option value="title">Title</option>
+                    <option value="timestamp">Timestamp</option>
+                    <option value="tags">Tags</option>
+                </select>
                 <input type="text" size="40" name="q" value="" id="searchbar" autofocus placeholder="Title, URL, tags, timestamp, or content...".>
                 <input type="submit" value="Search" style="height: 36px; padding-top: 6px; margin: 8px"/>
                 <input type="button"