X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/57c36a7ae1484c72031bd157f05083038eae70fb..9e40b5e5d7e26f4b8d3250cfbde23540a6205fd6:/forum/views/commands.py diff --git a/forum/views/commands.py b/forum/views/commands.py index d829554..ed6c03f 100644 --- a/forum/views/commands.py +++ b/forum/views/commands.py @@ -2,11 +2,12 @@ import datetime from forum import settings from django.core.exceptions import ObjectDoesNotExist from django.utils import simplejson -from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden +from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, Http404 from django.shortcuts import get_object_or_404, render_to_response from django.utils.translation import ungettext, ugettext as _ from django.template import RequestContext 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 @@ -69,9 +70,9 @@ def vote_post(request, id, vote_type): new_vote_cls = (vote_type == 'up') and VoteUpAction or VoteDownAction score_inc = 0 - try: - old_vote = Action.objects.get_for_types((VoteUpAction, VoteDownAction), node=post, user=user) + old_vote = VoteAction.get_action_for(node=post, user=user) + if old_vote: if old_vote.action_date < datetime.datetime.now() - datetime.timedelta(days=int(settings.DENY_UNVOTE_DAYS)): raise CommandException( _("Sorry but you cannot cancel a vote after %(ndays)d %(tdays)s from the original vote") % @@ -80,8 +81,6 @@ def vote_post(request, id, vote_type): old_vote.cancel(ip=request.META['REMOTE_ADDR']) score_inc += (old_vote.__class__ == VoteDownAction) and 1 or -1 - except ObjectDoesNotExist: - old_vote = None if old_vote.__class__ != new_vote_cls: new_vote_cls(user=user, node=post, ip=request.META['REMOTE_ADDR']).save() @@ -127,7 +126,7 @@ def flag_post(request, id): raise NotEnoughLeftException(_('flags'), str(settings.MAX_FLAGS_PER_DAY)) try: - current = FlagAction.objects.get(user=user, node=post) + current = FlagAction.objects.get(canceled=False, user=user, node=post) raise CommandException(_("You already flagged this post with the following reason: %(reason)s") % {'reason': current.extra}) except ObjectDoesNotExist: reason = request.POST.get('prompt', '').strip() @@ -153,11 +152,12 @@ def like_comment(request, id): if not user.can_like_comment(comment): raise NotEnoughRepPointsException( _('like comments')) - try: - like = VoteUpCommentAction.objects.get(node=comment, user=user) + like = VoteAction.get_action_for(node=comment, user=user) + + if like: like.cancel(ip=request.META['REMOTE_ADDR']) likes = False - except ObjectDoesNotExist: + else: VoteUpCommentAction(node=comment, user=user, ip=request.META['REMOTE_ADDR']).save() likes = True @@ -179,7 +179,7 @@ def delete_comment(request, id): if not user.can_delete_comment(comment): raise NotEnoughRepPointsException( _('delete comments')) - if not comment.deleted: + if not comment.nis.deleted: DeleteAction(node=comment, user=user, ip=request.META['REMOTE_ADDR']).save() return { @@ -196,7 +196,7 @@ def mark_favorite(request, id): raise AnonymousNotAllowedException(_('mark a question as favorite')) try: - favorite = FavoriteAction.objects.get(node=question, user=request.user) + favorite = FavoriteAction.objects.get(canceled=False, node=question, user=request.user) favorite.cancel(ip=request.META['REMOTE_ADDR']) added = False except ObjectDoesNotExist: @@ -288,13 +288,14 @@ def accept_answer(request, id): commands = {} - if answer.accepted: - answer.accepted.cancel(user, ip=request.META['REMOTE_ADDR']) + if answer.nis.accepted: + answer.nstate.accepted.cancel(user, ip=request.META['REMOTE_ADDR']) commands['unmark_accepted'] = [answer.id] else: - if question.answer_accepted: - accepted = question.accepted_answer - accepted.accepted.cancel(user, ip=request.META['REMOTE_ADDR']) + accepted = question.accepted_answer + + 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() @@ -315,8 +316,8 @@ def delete_post(request, id): ret = {'commands': {}} - if post.deleted: - post.deleted.cancel(user, ip=request.META['REMOTE_ADDR']) + if post.nis.deleted: + post.nstate.deleted.cancel(user, ip=request.META['REMOTE_ADDR']) ret['commands']['unmark_deleted'] = [post.node_type, id] else: DeleteAction(node=post, user=user, ip=request.META['REMOTE_ADDR']).save() @@ -336,11 +337,11 @@ def close(request, id, close): if not user.is_authenticated(): raise AnonymousNotAllowedException(_('close questions')) - if question.extra_action: + if question.nis.closed: if not user.can_reopen_question(question): raise NotEnoughRepPointsException(_('reopen questions')) - question.extra_action.cancel(user, ip=request.META['REMOTE_ADDR']) + question.nstate.closed.cancel(user, ip=request.META['REMOTE_ADDR']) else: if not request.user.can_close_question(question): raise NotEnoughRepPointsException(_('close questions')) @@ -358,6 +359,69 @@ def close(request, id, close): } } +@command +def wikify(request, id): + node = get_object_or_404(Node, id=id) + user = request.user + + if not user.is_authenticated(): + raise AnonymousNotAllowedException(_('mark posts as community wiki')) + + if node.nis.wiki: + if not user.can_cancel_wiki(node): + raise NotEnoughRepPointsException(_('cancel a community wiki post')) + + if node.nstate.wiki.action_type == "wikify": + node.nstate.wiki.cancel() + else: + node.nstate.wiki = None + else: + if not user.can_wikify(node): + raise NotEnoughRepPointsException(_('mark posts as community wiki')) + + WikifyAction(node=node, user=user, ip=request.META['REMOTE_ADDR']).save() + + return { + 'commands': { + 'refresh_page': [] + } + } + +@command +def convert_to_comment(request, id): + user = request.user + answer = get_object_or_404(Answer, id=id) + question = answer.question + + if not request.POST: + description = lambda a: _("Answer by %(uname)s: %(snippet)s...") % {'uname': a.author.username, 'snippet': a.summary[:10]} + nodes = [(question.id, _("Question"))] + [nodes.append((a.id, description(a))) for a in question.answers.filter_state(deleted=False).exclude(id=answer.id)] + + return render_to_response('node/convert_to_comment.html', {'answer': answer, 'nodes': nodes}) + + if not user.is_authenticated(): + raise AnonymousNotAllowedException(_("convert answers to comments")) + + if not user.can_convert_to_comment(answer): + raise NotEnoughRepPointsException(_("convert answers to comments")) + + try: + new_parent = Node.objects.get(id=request.POST.get('under', None)) + except: + raise CommandException(_("That is an invalid post to put the comment under")) + + if not (new_parent == question or (new_parent.node_type == 'answer' and new_parent.parent == question)): + raise CommandException(_("That is an invalid post to put the comment under")) + + AnswerToCommentAction(user=user, node=answer, ip=request.META['REMOTE_ADDR']).save(data=dict(new_parent=new_parent)) + + return { + 'commands': { + 'refresh_page': [] + } + } + @command def subscribe(request, id): question = get_object_or_404(Question, id=id) @@ -403,13 +467,21 @@ def matching_tags(request): if len(request.GET['q']) == 0: raise CommandException(_("Invalid request")) - possible_tags = Tag.objects.filter(name__istartswith = request.GET['q']) + possible_tags = Tag.active.filter(name__istartswith = request.GET['q']) tag_output = '' for tag in possible_tags: tag_output += (tag.name + "|" + tag.name + "." + tag.used_count.__str__() + "\n") return HttpResponse(tag_output, mimetype="text/plain") +def related_questions(request): + if request.POST and request.POST.get('title', None): + 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") + else: + raise Http404() +