diff options
author | Aurélien Bompard <aurelien@bompard.org> | 2013-07-15 12:02:04 +0200 |
---|---|---|
committer | Aurélien Bompard <aurelien@bompard.org> | 2013-07-15 12:02:04 +0200 |
commit | 1c0db6b8e3b262b9cdba6a32e71c9bbac8b5f7cc (patch) | |
tree | 54fecd587266ebac0efe2bd777d2fc2776fa092b /hyperkitty/lib/view_helpers.py | |
parent | 1a339ac1f7dac6e63b83864b6421aed1b0fdde75 (diff) | |
download | hyperkitty-1c0db6b8e3b262b9cdba6a32e71c9bbac8b5f7cc.tar.gz hyperkitty-1c0db6b8e3b262b9cdba6a32e71c9bbac8b5f7cc.tar.xz hyperkitty-1c0db6b8e3b262b9cdba6a32e71c9bbac8b5f7cc.zip |
Cleanups in the lib/__init__.py file
Diffstat (limited to 'hyperkitty/lib/view_helpers.py')
-rw-r--r-- | hyperkitty/lib/view_helpers.py | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/hyperkitty/lib/view_helpers.py b/hyperkitty/lib/view_helpers.py new file mode 100644 index 0000000..a27baaf --- /dev/null +++ b/hyperkitty/lib/view_helpers.py @@ -0,0 +1,171 @@ +#-*- 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> +# + + +import datetime + +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger +from django.utils.timezone import utc + +from hyperkitty.models import ThreadCategory, LastView +from hyperkitty.views.forms import CategoryForm + + +FLASH_MESSAGES = { + "updated-ok": ("success", "The profile was successfully updated."), + "sent-ok": ("success", "The message has been sent successfully."), +} + + +def get_months(store, list_name): + """ Return a dictionnary of years, months for which there are + potentially archives available for a given list (based on the + oldest post on the list). + + :arg list_name, name of the mailing list in which this email + should be searched. + """ + date_first = store.get_start_date(list_name) + if not date_first: + return {} + archives = {} + now = datetime.datetime.now() + year = date_first.year + month = date_first.month + while year < now.year: + archives[year] = range(1, 13)[(month -1):] + year = year + 1 + month = 1 + archives[now.year] = range(1, 13)[:now.month] + return archives + + +def get_display_dates(year, month, day): + if day is None: + start_day = 1 + else: + start_day = int(day) + begin_date = datetime.datetime(int(year), int(month), start_day) + + if day is None: + end_date = begin_date + datetime.timedelta(days=32) + end_date = end_date.replace(day=1) + else: + end_date = begin_date + datetime.timedelta(days=1) + + return begin_date, end_date + + +def daterange(start_date, end_date): + for n in range(int((end_date - start_date).days)): + yield start_date + datetime.timedelta(n) + + +def paginate(objects, page_num, max_page_range=10, paginator=None): + try: + page_num = int(page_num) + except (TypeError, ValueError): + page_num = 1 + if paginator is None: + paginator = Paginator(objects, 10) # else use the provided instance + try: + objects = paginator.page(page_num) + except PageNotAnInteger: + # If page is not an integer, deliver first page. + objects = paginator.page(1) + except EmptyPage: + # If page is out of range (e.g. 9999), deliver last page of results. + objects = paginator.page(paginator.num_pages) + # Calculate the displayed page range + if paginator.num_pages > max_page_range: + objects.page_range = [ 1 ] + subrange_lower = page_num - (max_page_range / 2 - 2) + if subrange_lower > 3: + objects.page_range.append("...") + else: + subrange_lower = 2 + objects.page_range.extend(range(subrange_lower, page_num)) + if page_num != 1 and page_num != 100: + objects.page_range.append(page_num) + subrange_upper = page_num + (max_page_range / 2 - 2) + if subrange_upper >= paginator.num_pages - 2: + subrange_upper = paginator.num_pages - 1 + objects.page_range.extend(range(page_num+1, subrange_upper+1)) + if subrange_upper < paginator.num_pages - 2: + objects.page_range.append("...") + objects.page_range.append(paginator.num_pages) + else: + objects.page_range = [ p+1 for p in range(paginator.num_pages) ] + return objects + + +def get_category_widget(request=None, current_category=None): + """ + Returns the category form and the applicable category object (or None if no + category is set for this thread). + + If current_category is not provided or None, try to deduce it from the POST + request. + if request is not provided or None, don't return the category form, return + None instead. + """ + categories = [ (c.name, c.name.upper()) + for c in ThreadCategory.objects.all() ] \ + + [("", "no category")] + + if request: + if request.method == "POST": + category_form = CategoryForm(request.POST) + else: + category_form = CategoryForm(initial={"category": current_category or ""}) + category_form["category"].field.choices = categories + else: + category_form = None + if request and request.method == "POST" and category_form.is_valid(): + # is_valid() must be called after the choices have been set + current_category = category_form.cleaned_data["category"] + + if not current_category: + category = None + else: + try: + category = ThreadCategory.objects.get(name=current_category) + except ThreadCategory.DoesNotExist: + category = None + return category, category_form + + +def is_thread_unread(request, mlist_name, thread): + """Returns True or False if the thread is unread or not.""" + unread = False + if request.user.is_authenticated(): + try: + last_view_obj = LastView.objects.get( + list_address=mlist_name, + threadid=thread.thread_id, + user=request.user) + except LastView.DoesNotExist: + unread = True + else: + if thread.date_active.replace(tzinfo=utc) \ + > last_view_obj.view_date: + unread = True + return unread |