X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/25d2724e64a7828113860d6f7232815a34133ec1..af86787210acddeca6800db8e6e7106edd3973cc:/forum/views/commands.py diff --git a/forum/views/commands.py b/forum/views/commands.py index f04bd35..74bbe5a 100644 --- a/forum/views/commands.py +++ b/forum/views/commands.py @@ -12,8 +12,8 @@ from forum.actions import * 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 forum.modules.decorators import decoratable from decorators import command, CommandException, RefreshPageCommand +from forum.modules import decorate from forum import settings import logging @@ -58,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 @@ -114,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}) @@ -150,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 @@ -180,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 @@ -200,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) @@ -222,8 +222,7 @@ def mark_favorite(request, id): } } -@decoratable -@command +@decorate.withfn(command) def comment(request, id): post = get_object_or_404(Node, id=id) user = request.user @@ -264,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}) ] @@ -277,7 +276,7 @@ def comment(request, id): } } -@command +@decorate.withfn(command) def node_markdown(request, id): user = request.user @@ -288,8 +287,11 @@ def node_markdown(request, id): return HttpResponse(node.body, mimetype="text/plain") -@command +@decorate.withfn(command) def accept_answer(request, id): + if settings.DISABLE_ACCEPTING_FEATURE: + raise Http404() + user = request.user if not user.is_authenticated(): @@ -299,7 +301,7 @@ def accept_answer(request, id): question = answer.question if not user.can_accept_answer(answer): - raise CommandException(_("Sorry but only the question author can accept an answer")) + raise CommandException(_("Sorry but you cannot accept the answer")) commands = {} @@ -307,18 +309,24 @@ def accept_answer(request, id): answer.nstate.accepted.cancel(user, ip=request.META['REMOTE_ADDR']) commands['unmark_accepted'] = [answer.id] else: - accepted = question.accepted_answer + if settings.MAXIMUM_ACCEPTED_ANSWERS and (question.accepted_count >= settings.MAXIMUM_ACCEPTED_ANSWERS): + raise CommandException(ungettext("This question already has an accepted answer.", + "Sorry but this question has reached the limit of accepted answers.", int(settings.MAXIMUM_ACCEPTED_ANSWERS))) + + if settings.MAXIMUM_ACCEPTED_PER_USER and question.accepted_count: + accepted_from_author = question.accepted_answers.filter(author=answer.author).count() + + if accepted_from_author >= settings.MAXIMUM_ACCEPTED_PER_USER: + raise CommandException(ungettext("The author of this answer already has an accepted answer in this question.", + "Sorry but the author of this answer has reached the limit of accepted answers per question.", int(settings.MAXIMUM_ACCEPTED_PER_USER))) - if accepted: - accepted.nstate.accepted.cancel(user, ip=request.META['REMOTE_ADDR']) - commands['unmark_accepted'] = [accepted.id] AcceptAnswerAction(node=answer, user=user, ip=request.META['REMOTE_ADDR']).save() commands['mark_accepted'] = [answer.id] return {'commands': commands} -@command +@decorate.withfn(command) def delete_post(request, id): post = get_object_or_404(Node, id=id) user = request.user @@ -341,7 +349,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}) @@ -370,7 +378,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 @@ -394,7 +402,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) @@ -427,24 +435,32 @@ def convert_to_comment(request, id): return RefreshPageCommand() -@command -def subscribe(request, id): +@decorate.withfn(command) +def subscribe(request, id, user=0): + if user: + user = User.objects.filter(id=user)[0] + if user.is_a_super_user_or_staff(): + raise CommandException(_("You do not have the correct credentials to preform this action.")) + + else: + user = request.user + question = get_object_or_404(Question, id=id) try: - subscription = QuestionSubscription.objects.get(question=question, user=request.user) + subscription = QuestionSubscription.objects.get(question=question, user=user) subscription.delete() subscribed = False except: - subscription = QuestionSubscription(question=question, user=request.user, auto_subscription=False) + subscription = QuestionSubscription(question=question, user=user, auto_subscription=False) subscription.save() subscribed = True return { - 'commands': { - 'set_subscription_button': [subscribed and _('unsubscribe me') or _('subscribe me')], - 'set_subscription_status': [''] - } + 'commands': { + 'set_subscription_button': [subscribed and _('unsubscribe me') or _('subscribe me')], + 'set_subscription_status': [''] + } } #internally grouped views - used by the tagging system @@ -481,10 +497,10 @@ def matching_tags(request): def related_questions(request): if request.POST and request.POST.get('title', None): + can_rank, questions = Question.objects.search(request.POST['title']) return HttpResponse(simplejson.dumps( [dict(title=q.title, url=q.get_absolute_url(), score=q.score, summary=q.summary) - for q in Question.objects.search(request.POST['title']).filter_state(deleted=False)[0:10]]), - mimetype="application/json") + for q in questions.filter_state(deleted=False)[0:10]]), mimetype="application/json") else: raise Http404()