summaryrefslogtreecommitdiffstats
path: root/hyperkitty/views
diff options
context:
space:
mode:
authorAurélien Bompard <aurelien@bompard.org>2013-06-06 16:53:53 +0200
committerAurélien Bompard <aurelien@bompard.org>2013-06-06 16:53:53 +0200
commit421bf9d5b3087afb185d776a53bc90f973955df3 (patch)
tree9bf12eeb9e1c658b52c7656e7f32c1769b0ba234 /hyperkitty/views
parent44a3da0ede4a028da4896c6e5f1ff136ac380f76 (diff)
downloadhyperkitty-421bf9d5b3087afb185d776a53bc90f973955df3.tar.gz
hyperkitty-421bf9d5b3087afb185d776a53bc90f973955df3.tar.xz
hyperkitty-421bf9d5b3087afb185d776a53bc90f973955df3.zip
Add search
Diffstat (limited to 'hyperkitty/views')
-rw-r--r--hyperkitty/views/forms.py18
-rw-r--r--hyperkitty/views/list.py31
-rw-r--r--hyperkitty/views/pages.py2
-rw-r--r--hyperkitty/views/search.py114
-rw-r--r--hyperkitty/views/thread.py4
5 files changed, 116 insertions, 53 deletions
diff --git a/hyperkitty/views/forms.py b/hyperkitty/views/forms.py
index 6f6c294..938deba 100644
--- a/hyperkitty/views/forms.py
+++ b/hyperkitty/views/forms.py
@@ -98,24 +98,6 @@ class AddTagForm(forms.Form):
-class SearchForm(forms.Form):
- target = forms.CharField(label='', help_text=None,
- widget=forms.Select(
- choices=(('Subject', 'Subject'),
- ('Content', 'Content'),
- ('SubjectContent', 'Subject & Content'),
- ('From', 'From'))
- )
- )
-
- keyword = forms.CharField(max_length=100,label='', help_text=None,
- widget=forms.TextInput(
- attrs={'placeholder': 'Search this list.'}
- )
- )
-
-
-
class ReplyForm(forms.Form):
newthread = forms.BooleanField(label="", required=False)
subject = forms.CharField(label="", required=False,
diff --git a/hyperkitty/views/list.py b/hyperkitty/views/list.py
index a58bdbb..523aff4 100644
--- a/hyperkitty/views/list.py
+++ b/hyperkitty/views/list.py
@@ -35,8 +35,7 @@ from django.http import Http404
from hyperkitty.models import Tag, Favorite, LastView
from hyperkitty.lib import get_months, get_store, get_display_dates, daterange
from hyperkitty.lib import FLASH_MESSAGES
-from hyperkitty.lib.voting import get_votes
-from forms import SearchForm
+from hyperkitty.lib.voting import get_votes, set_message_votes
if settings.USE_MOCKUPS:
@@ -76,7 +75,6 @@ def _thread_list(request, mlist, threads, template_name='thread_list.html', extr
if mlist is None:
raise Http404("No archived mailing-list by that name.")
store = get_store(request)
- search_form = SearchForm(auto_id=False)
participants = set()
for thread in threads:
@@ -165,7 +163,6 @@ def _thread_list(request, mlist, threads, template_name='thread_list.html', extr
context = {
'mlist' : mlist,
'current_page': page_num,
- 'search_form': search_form,
'threads': threads,
'participants': len(participants),
'months_list': get_months(store, mlist.name),
@@ -178,7 +175,6 @@ def _thread_list(request, mlist, threads, template_name='thread_list.html', extr
def overview(request, mlist_fqdn=None):
if not mlist_fqdn:
return redirect('/')
- search_form = SearchForm(auto_id=False)
# Get stats for last 30 days
today = datetime.datetime.utcnow()
@@ -250,7 +246,6 @@ def overview(request, mlist_fqdn=None):
context = {
'mlist' : mlist,
- 'search_form': search_form,
'top_threads': top_threads[:5],
'most_active_threads': active_threads[:5],
'top_author': authors,
@@ -261,27 +256,3 @@ def overview(request, mlist_fqdn=None):
'archives_baseurl': archives_baseurl,
}
return render(request, "recent_activities.html", context)
-
-
-def search_tag(request, mlist_fqdn, tag):
- '''Returns threads having a particular tag'''
- store = get_store(request)
- mlist = store.get_list(mlist_fqdn)
-
- try:
- tags = Tag.objects.filter(tag=tag)
- except Tag.DoesNotExist:
- tags = {}
-
- threads = []
- for t in tags:
- thread = store.get_thread(mlist_fqdn, t.threadid)
- if thread is not None:
- threads.append(thread)
-
- extra_context = {
- "tag": tag,
- "list_title": "Search results for tag \"%s\"" % tag,
- "no_results_text": "for this tag",
- }
- return _thread_list(request, mlist, threads, extra_context=extra_context)
diff --git a/hyperkitty/views/pages.py b/hyperkitty/views/pages.py
index 7148322..fa529c0 100644
--- a/hyperkitty/views/pages.py
+++ b/hyperkitty/views/pages.py
@@ -31,7 +31,6 @@ from django.http import HttpResponse
from mailmanclient import Client
from hyperkitty.lib import get_store
-from forms import SearchForm
def index(request):
@@ -40,7 +39,6 @@ def index(request):
context = {
'all_lists': lists,
- 'search_form': SearchForm(auto_id=False),
}
return render(request, "index.html", context)
diff --git a/hyperkitty/views/search.py b/hyperkitty/views/search.py
new file mode 100644
index 0000000..1d2f3bf
--- /dev/null
+++ b/hyperkitty/views/search.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 1998-2012 by the Free Software Foundation, Inc.
+#
+# This file is part of HyperKitty.
+#
+# HyperKitty is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# HyperKitty is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# HyperKitty. If not, see <http://www.gnu.org/licenses/>.
+#
+# Author: Aurelien Bompard <abompard@fedoraproject.org>
+#
+
+
+from django.shortcuts import render
+from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger, Page
+
+from hyperkitty.models import Tag
+from hyperkitty.lib import get_store
+from hyperkitty.lib.voting import get_votes, set_message_votes
+
+from .list import _thread_list
+
+
+class SearchPaginator(Paginator):
+ """
+ A paginator which does not split the object_list into pages, because Whoosh
+ already handles that
+ """
+ def __init__(self, object_list, per_page, total):
+ super(SearchPaginator, self).__init__(object_list, per_page)
+ self._count = total
+
+ def page(self, number):
+ "Returns the object list without paginating"""
+ return Page(self.object_list, number, self)
+
+
+def search_tag(request, mlist_fqdn, tag):
+ '''Returns threads having a particular tag'''
+ store = get_store(request)
+ mlist = store.get_list(mlist_fqdn)
+
+ try:
+ tags = Tag.objects.filter(tag=tag)
+ except Tag.DoesNotExist:
+ tags = {}
+
+ threads = []
+ for t in tags:
+ thread = store.get_thread(mlist_fqdn, t.threadid)
+ if thread is not None:
+ threads.append(thread)
+
+ extra_context = {
+ "tag": tag,
+ "list_title": "Search results for tag \"%s\"" % tag,
+ "no_results_text": "for this tag",
+ }
+ return _thread_list(request, mlist, threads, extra_context=extra_context)
+
+
+def search(request, page=1):
+ """ Returns messages corresponding to a query """
+ store = get_store(request)
+ query = request.GET.get("query")
+ mlist_fqdn = request.GET.get("list")
+ try:
+ page_num = int(request.GET.get('page'))
+ except ValueError:
+ page_num = 1
+ results_per_page = 10
+ query_result = store.search(query, mlist_fqdn, page_num, results_per_page)
+ total = query_result["total"]
+ messages = query_result["results"]
+ for message in messages:
+ set_message_votes(message, request.user)
+ if mlist_fqdn is None:
+ mlist = None
+ else:
+ mlist = store.get_list(mlist_fqdn)
+ if mlist is None:
+ raise Http404("No archived mailing-list by that name.")
+
+ paginator = SearchPaginator(messages, 10, total)
+ try:
+ messages = paginator.page(page_num)
+ except PageNotAnInteger:
+ # If page is not an integer, deliver first page.
+ messages = paginator.page(1)
+ except EmptyPage:
+ # If page is out of range (e.g. 9999), deliver last page of results.
+ messages = paginator.page(paginator.num_pages)
+
+ context = {
+ 'mlist' : mlist,
+ "query": query,
+ 'current_page': page_num,
+ 'messages': messages,
+ 'total': total,
+ 'page_range': [ p+1 for p in range(paginator.num_pages) ],
+ }
+ return render(request, "search_results.html", context)
+
+
+
diff --git a/hyperkitty/views/thread.py b/hyperkitty/views/thread.py
index 1e44714..fd52831 100644
--- a/hyperkitty/views/thread.py
+++ b/hyperkitty/views/thread.py
@@ -34,7 +34,7 @@ from django.utils.timezone import utc
import robot_detection
from hyperkitty.models import Tag, Favorite, LastView
-from forms import SearchForm, AddTagForm, ReplyForm
+from forms import AddTagForm, ReplyForm
from hyperkitty.lib import get_months, get_store, stripped_subject
from hyperkitty.lib.voting import set_message_votes
@@ -72,7 +72,6 @@ def _get_thread_replies(request, thread, offset=1, limit=None):
def thread_index(request, mlist_fqdn, threadid, month=None, year=None):
''' Displays all the email for a given thread identifier '''
- search_form = SearchForm(auto_id=False)
store = get_store(request)
thread = store.get_thread(mlist_fqdn, threadid)
if not thread:
@@ -140,7 +139,6 @@ def thread_index(request, mlist_fqdn, threadid, month=None, year=None):
'threadid': threadid,
'subject': subject,
'tags': tags,
- 'search_form': search_form,
'addtag_form': tag_form,
'month': thread.date_active,
'first_mail': thread.starting_email,