diff options
author | Aurélien Bompard <aurelien@bompard.org> | 2013-06-06 16:53:53 +0200 |
---|---|---|
committer | Aurélien Bompard <aurelien@bompard.org> | 2013-06-06 16:53:53 +0200 |
commit | 421bf9d5b3087afb185d776a53bc90f973955df3 (patch) | |
tree | 9bf12eeb9e1c658b52c7656e7f32c1769b0ba234 /hyperkitty/views | |
parent | 44a3da0ede4a028da4896c6e5f1ff136ac380f76 (diff) | |
download | hyperkitty-421bf9d5b3087afb185d776a53bc90f973955df3.tar.gz hyperkitty-421bf9d5b3087afb185d776a53bc90f973955df3.tar.xz hyperkitty-421bf9d5b3087afb185d776a53bc90f973955df3.zip |
Add search
Diffstat (limited to 'hyperkitty/views')
-rw-r--r-- | hyperkitty/views/forms.py | 18 | ||||
-rw-r--r-- | hyperkitty/views/list.py | 31 | ||||
-rw-r--r-- | hyperkitty/views/pages.py | 2 | ||||
-rw-r--r-- | hyperkitty/views/search.py | 114 | ||||
-rw-r--r-- | hyperkitty/views/thread.py | 4 |
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, |