X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/410bfa05ee36ed1d99356c443a5f3f6aa3ee9578..0a3506ef33141207e7e879fe763dc3adacbc591e:/forum/views/decorators.py
diff --git a/forum/views/decorators.py b/forum/views/decorators.py
index 44ec8ba..4eb832a 100644
--- a/forum/views/decorators.py
+++ b/forum/views/decorators.py
@@ -1,21 +1,33 @@
-from django.http import HttpResponse, HttpResponseRedirect
+from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.utils import simplejson
-from django.core.paginator import Paginator
+from django.core.paginator import Paginator, EmptyPage
from django.shortcuts import render_to_response
+from django.core.urlresolvers import reverse
from django.template import RequestContext
from django.utils.translation import ungettext, ugettext as _
+from forum.modules import ui
import logging
-def render(template=None, tab=None):
+def render(template=None, tab=None, tab_title='', weight=500, tabbed=True):
def decorator(func):
def decorated(request, *args, **kwargs):
context = func(request, *args, **kwargs)
+ if isinstance(context, HttpResponse):
+ return context
+
if tab is not None:
context['tab'] = tab
- return render_to_response(context.pop('template', template), context, context_instance=RequestContext(request))
+ return render_to_response(context.pop('template', template), context,
+ context_instance=RequestContext(request))
+
+ if tabbed and tab:
+ ui.register(ui.PAGE_TOP_TABS,
+ ui.PageTab(tab, tab_title, lambda: reverse(func.__name__), weight=weight))
+
return decorated
+
return decorator
def list(paginate, default_page_size):
@@ -23,43 +35,57 @@ def list(paginate, default_page_size):
def decorated(request, *args, **kwargs):
context = func(request, *args, **kwargs)
+ if isinstance(context, HttpResponse):
+ return context
+
pagesize = request.utils.page_size(default_page_size)
page = int(request.GET.get('page', 1))
big_list = context[paginate]
paginator = Paginator(big_list, pagesize)
- page_obj = paginator.page(page)
+ try:
+ page_obj = paginator.page(page)
+ except EmptyPage:
+ raise Http404()
+
context[paginate] = page_obj.object_list.lazy()
base_path = context.get('base_path', None) or request.path
sort = request.utils.sort_method('')
context["pagination_context"] = {
- 'is_paginated' : True,
- 'pages': paginator.num_pages,
- 'page': page,
- 'has_previous': page_obj.has_previous(),
- 'has_next': page_obj.has_next(),
- 'previous': page_obj.previous_page_number(),
- 'next': page_obj.next_page_number(),
- 'base_url' : "%s%ssort=%s&" % (base_path, ('?' in base_path) and '&' or '?', sort),
- 'pagesize' : pagesize
+ 'is_paginated' : True,
+ 'pages': paginator.num_pages,
+ 'page': page,
+ 'has_previous': page_obj.has_previous(),
+ 'has_next': page_obj.has_next(),
+ 'previous': page_obj.previous_page_number(),
+ 'next': page_obj.next_page_number(),
+ 'base_url' : "%s%ssort=%s&" % (base_path, ('?' in base_path) and '&' or '?', sort),
+ 'pagesize' : pagesize
}
context['sort_context'] = {
- 'base_url': "%s%ssort=" % (base_path, ('?' in base_path) and '&' or '?'),
- 'current': sort,
+ 'base_url': "%s%ssort=" % (base_path, ('?' in base_path) and '&' or '?'),
+ 'current': sort,
}
return context
+
return decorated
+
return decorator
class CommandException(Exception):
pass
+class RefreshPageCommand(HttpResponse):
+ def __init__(self):
+ super(RefreshPageCommand, self).__init__(
+ content=simplejson.dumps({'commands': {'refresh_page': []}, 'success': True}),
+ mimetype="application/json")
def command(func):
def decorated(request, *args, **kwargs):
@@ -71,19 +97,20 @@ def command(func):
response['success'] = True
except Exception, e:
- import sys, traceback
- traceback.print_exc(file=sys.stdout)
+ import traceback
+ #traceback.print_exc()
if isinstance(e, CommandException):
response = {
- 'success': False,
- 'error_message': str(e)
+ 'success': False,
+ 'error_message': e.message
}
else:
logging.error("%s: %s" % (func.__name__, str(e)))
+ logging.error(traceback.format_exc())
response = {
- 'success': False,
- 'error_message': _("We're sorry, but an unknown error ocurred.
Please try again in a while.")
+ 'success': False,
+ 'error_message': _("We're sorry, but an unknown error ocurred.
Please try again in a while.")
}
if request.is_ajax():