From cafe0a541b6349de15c0444bddf9493d8aa71df8 Mon Sep 17 00:00:00 2001 From: hernani Date: Tue, 29 Jun 2010 18:07:00 +0000 Subject: [PATCH] Shows user diamonds in some missing spots, and adds some improvements to module decorators. git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@474 0cfe37f9-358a-4d5e-be75-b63607b5c754 --- forum/modules/decorators.py | 17 ++++++ forum/skins/default/media/js/osqa.main.js | 27 ++++++--- .../skins/default/templates/users/users.html | 2 +- forum/views/commands.py | 29 ++++----- forum/views/decorators.py | 60 +++++++++---------- forum/views/users.py | 5 +- 6 files changed, 83 insertions(+), 57 deletions(-) diff --git a/forum/modules/decorators.py b/forum/modules/decorators.py index 8fbee7e..48bee43 100644 --- a/forum/modules/decorators.py +++ b/forum/modules/decorators.py @@ -100,6 +100,8 @@ def decorate(origin, needs_origin=True, mode=DecoratableObject.MODE_OVERRIDE): def decorator(fn): return fn + return decorator + def _decorate_params(origin): return decorate(origin, mode=DecoratableObject.MODE_PARAMS) @@ -110,3 +112,18 @@ def _decorate_result(origin): return decorate(origin, mode=DecoratableObject.MODE_RESULT) decorate.result = _decorate_result + +def _decorate_with(fn): + def decorator(origin): + if not isinstance(origin, DecoratableObject): + mod = inspect.getmodule(origin) + + name = origin.__name__ + origin = DecoratableObject(origin) + + origin._decorate(fn, True, False) + return origin + return decorator + + +decorate.withfn = _decorate_with \ No newline at end of file diff --git a/forum/skins/default/media/js/osqa.main.js b/forum/skins/default/media/js/osqa.main.js index 39ddd3b..270a6b4 100644 --- a/forum/skins/default/media/js/osqa.main.js +++ b/forum/skins/default/media/js/osqa.main.js @@ -229,12 +229,11 @@ function show_message(evt, msg, callback) { }); } -function load_prompt(evt, url) { +function load_prompt(evt, el, url) { $.get(url, function(data) { - var $dialog = show_dialog({ - html: data, + var doptions = { + html: data, extra_class: 'prompt', - event: evt, yes_callback: function() { var postvars = {}; $dialog.find('input, textarea, select').each(function() { @@ -248,7 +247,13 @@ function load_prompt(evt, url) { }, 'json'); }, show_no: true - }); + } + + if (!el.is('.centered')) { + doptions.event = evt; + } + + var $dialog = show_dialog(doptions); }); } @@ -297,12 +302,11 @@ $(function() { var el = $(this); if (el.is('.withprompt')) { - load_prompt(evt, el.attr('href')); + load_prompt(evt, el, el.attr('href')); } else if(el.is('.confirm')) { - $dialog = show_dialog({ + var doptions = { html: messages.confirm, extra_class: 'confirm', - event: evt, yes_callback: function() { start_command(); $.getJSON(el.attr('href'), function(data) { @@ -315,7 +319,12 @@ $(function() { yes_text: messages.yes, show_no: true, no_text: messages.no - }); + } + + if (!el.is('.centered')) { + doptions.event = evt; + } + var $dialog = show_dialog(doptions); } else { start_command(); $.getJSON(el.attr('href'), function(data) { diff --git a/forum/skins/default/templates/users/users.html b/forum/skins/default/templates/users/users.html index 38f060e..2f08693 100644 --- a/forum/skins/default/templates/users/users.html +++ b/forum/skins/default/templates/users/users.html @@ -47,7 +47,7 @@
diff --git a/forum/views/commands.py b/forum/views/commands.py index a8f6d42..ed72bd1 100644 --- a/forum/views/commands.py +++ b/forum/views/commands.py @@ -13,6 +13,7 @@ from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required from forum.utils.decorators import ajax_method, ajax_login_required from decorators import command, CommandException, RefreshPageCommand +from forum.modules import decorate from forum import settings import logging @@ -57,7 +58,7 @@ class CannotDoubleActionException(CommandException): ) -@command +@decorate.withfn(command) def vote_post(request, id, vote_type): post = get_object_or_404(Node, id=id).leaf user = request.user @@ -113,7 +114,7 @@ def vote_post(request, id, vote_type): return response -@command +@decorate.withfn(command) def flag_post(request, id): if not request.POST: return render_to_response('node/report.html', {'types': settings.FLAG_TYPES}) @@ -149,7 +150,7 @@ def flag_post(request, id): return {'message': _("Thank you for your report. A moderator will review your submission shortly.")} -@command +@decorate.withfn(command) def like_comment(request, id): comment = get_object_or_404(Comment, id=id) user = request.user @@ -179,7 +180,7 @@ def like_comment(request, id): } } -@command +@decorate.withfn(command) def delete_comment(request, id): comment = get_object_or_404(Comment, id=id) user = request.user @@ -199,7 +200,7 @@ def delete_comment(request, id): } } -@command +@decorate.withfn(command) def mark_favorite(request, id): question = get_object_or_404(Question, id=id) @@ -221,7 +222,7 @@ def mark_favorite(request, id): } } -@command +@decorate.withfn(command) def comment(request, id): post = get_object_or_404(Node, id=id) user = request.user @@ -262,7 +263,7 @@ def comment(request, id): return { 'commands': { 'insert_comment': [ - id, comment.id, comment.comment, user.username, user.get_profile_url(), + id, comment.id, comment.comment, user.decorated_name, user.get_profile_url(), reverse('delete_comment', kwargs={'id': comment.id}), reverse('node_markdown', kwargs={'id': comment.id}) ] @@ -275,7 +276,7 @@ def comment(request, id): } } -@command +@decorate.withfn(command) def node_markdown(request, id): user = request.user @@ -286,7 +287,7 @@ def node_markdown(request, id): return HttpResponse(node.body, mimetype="text/plain") -@command +@decorate.withfn(command) def accept_answer(request, id): user = request.user @@ -316,7 +317,7 @@ def accept_answer(request, id): return {'commands': commands} -@command +@decorate.withfn(command) def delete_post(request, id): post = get_object_or_404(Node, id=id) user = request.user @@ -339,7 +340,7 @@ def delete_post(request, id): return ret -@command +@decorate.withfn(command) def close(request, id, close): if close and not request.POST: return render_to_response('node/report.html', {'types': settings.CLOSE_TYPES}) @@ -368,7 +369,7 @@ def close(request, id, close): return RefreshPageCommand() -@command +@decorate.withfn(command) def wikify(request, id): node = get_object_or_404(Node, id=id) user = request.user @@ -392,7 +393,7 @@ def wikify(request, id): return RefreshPageCommand() -@command +@decorate.withfn(command) def convert_to_comment(request, id): user = request.user answer = get_object_or_404(Answer, id=id) @@ -425,7 +426,7 @@ def convert_to_comment(request, id): return RefreshPageCommand() -@command +@decorate.withfn(command) def subscribe(request, id): question = get_object_or_404(Question, id=id) diff --git a/forum/views/decorators.py b/forum/views/decorators.py index 4eb832a..a98f1be 100644 --- a/forum/views/decorators.py +++ b/forum/views/decorators.py @@ -5,7 +5,7 @@ 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 +from forum.modules import ui, decorate import logging def render(template=None, tab=None, tab_title='', weight=500, tabbed=True): @@ -87,35 +87,33 @@ class RefreshPageCommand(HttpResponse): content=simplejson.dumps({'commands': {'refresh_page': []}, 'success': True}), mimetype="application/json") -def command(func): - def decorated(request, *args, **kwargs): - try: - response = func(request, *args, **kwargs) - - if isinstance(response, HttpResponse): - return response - - response['success'] = True - except Exception, e: - import traceback - #traceback.print_exc() - - if isinstance(e, CommandException): - response = { - '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.") - } - - if request.is_ajax(): - return HttpResponse(simplejson.dumps(response), mimetype="application/json") +def command(func, request, *args, **kwargs): + try: + response = func(request, *args, **kwargs) + + if isinstance(response, HttpResponse): + return response + + response['success'] = True + except Exception, e: + import traceback + #traceback.print_exc() + + if isinstance(e, CommandException): + response = { + 'success': False, + 'error_message': e.message + } else: - return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) + 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.") + } + + if request.is_ajax(): + return HttpResponse(simplejson.dumps(response), mimetype="application/json") + else: + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) - return decorated \ No newline at end of file diff --git a/forum/views/users.py b/forum/views/users.py index dee69cd..dd31abb 100644 --- a/forum/views/users.py +++ b/forum/views/users.py @@ -16,6 +16,7 @@ from django.utils import simplejson from django.core.urlresolvers import reverse, NoReverseMatch from forum.forms import * from forum.utils.html import sanitize_html +from forum.modules import decorate from datetime import datetime, date import decorators from forum.actions import EditProfileAction, FavoriteAction, BonusRepAction, SuspendAction @@ -133,7 +134,7 @@ def user_powers(request, id, action, status): return HttpResponseRedirect(user.get_profile_url()) -@decorators.command +@decorate.withfn(decorators.command) def award_points(request, id): if (not request.POST) and request.POST.get('points', None): raise decorators.CommandException(_("Invalid request type")) @@ -151,7 +152,7 @@ def award_points(request, id): return dict(reputation=user.reputation) -@decorators.command +@decorate.withfn(decorators.command) def suspend(request, id): user = get_object_or_404(User, id=id) -- 2.39.5