summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAurélien Bompard <aurelien@bompard.org>2013-07-11 16:28:07 +0200
committerAurélien Bompard <aurelien@bompard.org>2013-07-11 17:17:27 +0200
commit2c7c64b084040ad0666b15c511ff18bb96fc79b9 (patch)
tree0b3a627936cad2de88344fca4c351ee761128a33
parent510c337117a77591400d7ee1d8d20ffd3ca2f731 (diff)
downloadhyperkitty-2c7c64b084040ad0666b15c511ff18bb96fc79b9.tar.gz
hyperkitty-2c7c64b084040ad0666b15c511ff18bb96fc79b9.tar.xz
hyperkitty-2c7c64b084040ad0666b15c511ff18bb96fc79b9.zip
Factorize the category widget code
-rw-r--r--hyperkitty/lib/__init__.py26
-rw-r--r--hyperkitty/views/thread.py29
2 files changed, 28 insertions, 27 deletions
diff --git a/hyperkitty/lib/__init__.py b/hyperkitty/lib/__init__.py
index fef4a75..0cb1c7d 100644
--- a/hyperkitty/lib/__init__.py
+++ b/hyperkitty/lib/__init__.py
@@ -29,6 +29,8 @@ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from mailmanclient import MailmanConnectionError
from hyperkitty.lib import mailman
+from hyperkitty.models import ThreadCategory
+from hyperkitty.views.forms import CategoryForm
FLASH_MESSAGES = {
@@ -176,3 +178,27 @@ def paginate(objects, page_num, max_page_range=10, paginator=None):
else:
objects.page_range = [ p+1 for p in range(paginator.num_pages) ]
return objects
+
+
+def get_category_widget(request, current_category=None):
+ categories = [ (c.name, c.name.upper())
+ for c in ThreadCategory.objects.all() ] \
+ + [("", "no categories")]
+
+ if request.method == "POST":
+ category_form = CategoryForm(request.POST)
+ else:
+ category_form = CategoryForm(initial={"category": current_category or ""})
+ category_form["category"].field.choices = categories
+ if 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
diff --git a/hyperkitty/views/thread.py b/hyperkitty/views/thread.py
index 8c745ba..365dca9 100644
--- a/hyperkitty/views/thread.py
+++ b/hyperkitty/views/thread.py
@@ -100,18 +100,7 @@ def thread_index(request, mlist_fqdn, threadid, month=None, year=None):
fav_action = "rm"
# Category
- categories = [ (c.name, c.name.upper())
- for c in ThreadCategory.objects.all() ] \
- + [("", "no categories")]
- category_form = CategoryForm(initial={"category": thread.category or ""})
- category_form["category"].field.choices = categories
- if not thread.category:
- category = None
- else:
- try:
- category = ThreadCategory.objects.get(name=thread.category)
- except ThreadCategory.DoesNotExist:
- category = None
+ category, category_form = get_category_widget(request, thread.category)
# Extract relative dates
today = datetime.date.today()
@@ -312,21 +301,7 @@ def set_category(request, mlist_fqdn, threadid):
raise SuspiciousOperation
store = get_store(request)
- categories = [ (c.name, c.name.upper())
- for c in ThreadCategory.objects.all() ] \
- + [("", "No categories")]
- category_form = CategoryForm(request.POST)
- category_form["category"].field.choices = categories
-
- if not category_form.is_valid():
- return HttpResponse("Error settings category: invalid data",
- content_type="text/plain", status=500)
-
- category_name = category_form.cleaned_data["category"]
- try:
- category = ThreadCategory.objects.get(name=category_name)
- except ThreadCategory.DoesNotExist:
- raise Http404("No such category: %s" % category_name)
+ category, category_form = get_category_widget(request)
thread = store.get_thread(mlist_fqdn, threadid)
if category.name != thread.category:
thread.category = category.name