X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/cafe0a541b6349de15c0444bddf9493d8aa71df8..f3b3b737aefbb812828fdec07e188ff8093ccf81:/forum/views/commands.py diff --git a/forum/views/commands.py b/forum/views/commands.py index ed72bd1..ad6d773 100644 --- a/forum/views/commands.py +++ b/forum/views/commands.py @@ -10,7 +10,6 @@ from forum.models import * from forum.models.node import NodeMetaClass 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 decorators import command, CommandException, RefreshPageCommand from forum.modules import decorate @@ -289,6 +288,9 @@ def node_markdown(request, id): @decorate.withfn(command) def accept_answer(request, id): + if settings.DISABLE_ACCEPTING_FEATURE: + raise Http404() + user = request.user if not user.is_authenticated(): @@ -298,7 +300,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 = {} @@ -306,11 +308,17 @@ 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] @@ -427,23 +435,34 @@ def convert_to_comment(request, id): return RefreshPageCommand() @decorate.withfn(command) -def subscribe(request, id): +def subscribe(request, id, user=None): + if user: + try: + user = User.objects.get(id=user) + except User.DoesNotExist: + raise Http404() + + if not (request.user.is_a_super_user_or_staff() or user.is_authenticated()): + 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 @@ -480,10 +499,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()