]> git.openstreetmap.org Git - osqa.git/commitdiff
Improved "convert to question" routine, using the question edit form, and the same...
authorhernani <hernani@0cfe37f9-358a-4d5e-be75-b63607b5c754>
Sun, 13 Mar 2011 01:29:36 +0000 (01:29 +0000)
committerhernani <hernani@0cfe37f9-358a-4d5e-be75-b63607b5c754>
Sun, 13 Mar 2011 01:29:36 +0000 (01:29 +0000)
git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@829 0cfe37f9-358a-4d5e-be75-b63607b5c754

forum/actions/node.py
forum/skins/default/templates/node/convert_to_question.html
forum/skins/default/templates/question_edit.html
forum/templatetags/node_tags.py
forum/urls.py
forum/views/commands.py
forum/views/writers.py

index 530c649299809992a20249661e40a8e06b1df228..263839a136e79a47fa38ae1c6371ed92421813af 100644 (file)
@@ -196,21 +196,29 @@ class CommentToAnswerAction(ActionProxy):
             'question': self.describe_node(viewer, self.node.abs_parent),\r
         }\r
 \r
-class AnswerToQuestionAction(ActionProxy):\r
+class AnswerToQuestionAction(NodeEditAction):\r
     verb = _("converted to question")\r
 \r
-    def process_data(self, title):\r
+    def process_data(self,  **data):\r
+        revision_data = self.create_revision_data(**data)\r
+        revision = self.node.create_revision(self.user, **revision_data)\r
+\r
+        original_question = self.node.question\r
+\r
+        self.extra = {\r
+            'covert_revision': revision.revision,\r
+            'original_question': original_question\r
+        }\r
+\r
         self.node.node_type = "question"\r
-        self.node.title = title\r
-        self.node.active_revision.title = title\r
-        self.node.active_revision.save()\r
-        self.node.last_edited = self\r
-        self.node.update_last_activity(self.user, save=True)\r
+        self.node.parent = None\r
+        self.node.abs_parent = None\r
 \r
-        try:\r
-            self.node.abs_parent.reset_answer_count_cache()\r
-        except AttributeError:\r
-            pass\r
+        original_question.reset_answer_count_cache()\r
+\r
+    def process_action(self):\r
+        self.node.last_edited = self\r
+        self.node.save()\r
 \r
 \r
     def describe(self, viewer=None):\r
index 84ea16b521137b27e52d8d88071eb1457e9804d9..3656c4bf4d51cd6219025dcaac711f5139c60698 100644 (file)
@@ -1,7 +1,4 @@
+{% extends "question_edit.html" %}
 {% load i18n %}
-<div>
-    <p>{% trans "Title of the new question:" %}</p>
-
-    <input type="text" name="title" />
-</div>
-
+{% block title %}{% trans "Convert to question" %}{% endblock %}
+{% block edittype %}{% trans "Convert to question" %}{% endblock %}
index 9d7a6cd074ecd8d0c5ddc77f450109467ae8ef64..7b41cac20d3b67e76bbc2eb9d7d938552bd534e0 100644 (file)
         
 {% block content %}
 <div id="main-bar" class="headNormal">
-    {% trans "Edit question" %} [<a href="{{ question.get_absolute_url }}">{% trans "back" %}</a>]
+    {% block edittype %}{% trans "Edit question" %}{% endblock %} [<a href="{{ question.get_absolute_url }}">{% trans "back" %}</a>]
 </div>
 <div id="main-body" class="ask-body">
     <div id="askform">
-        <form id="fmedit" action="{% url edit_question question.id %}" method="post" >
+        <form id="fmedit" action="" method="post" >
             <label for="id_revision" ><strong>{% trans "revision" %}:</strong></label> <br/> 
             {% if revision_form.revision.errors %}{{ revision_form.revision.errors.as_ul }}{% endif %}
             <div style="vertical-align:middle">
index 544d91872da498422acceab42c90726b9fb9494f..6680f59c4e14e6dbf6ed29d4f3656202f83f7cc9 100644 (file)
@@ -151,7 +151,7 @@ def post_controls(post, user):
         \r
         if post.node_type == "answer" and user.can_convert_to_question(post):\r
             menu.append(post_control(_('convert to question'), reverse('convert_to_question', kwargs={'id': post.id}),\r
-                        command=True, withprompt=True))\r
+                        command=False, confirm=True))\r
 \r
         if user.is_superuser or user.is_staff:\r
             plain_text = strip_tags(post.html)\r
index fc64e28ac953c980a2dcb1272bd1ccd70c0f9a70..564eafd9fe68c05d54e98ea26b50eb15019849d2 100644 (file)
@@ -97,7 +97,7 @@ urlpatterns += patterns('',
                         url(r'^%s(?P<id>\d+)/' % _('node_markdown/'), app.commands.node_markdown, name='node_markdown'),
                         url(r'^%s(?P<id>\d+)/' % _('convert/'), app.commands.convert_to_comment,
                             name='convert_to_comment'),
-                        url(r'^%s(?P<id>\d+)/' % _('convert_to_question/'), app.commands.convert_to_question,
+                        url(r'^%s(?P<id>\d+)/' % _('convert_to_question/'), app.writers.convert_to_question,
                             name='convert_to_question'),
                         url(r'^%s(?P<id>\d+)/' % _('wikify/'), app.commands.wikify, name='wikify'),
 
index 11818ecacf30c17539ae8d13867683e43ce8bf56..a447ffefb79c27ac6c3f2bc711f49b14629f38f4 100644 (file)
@@ -456,36 +456,6 @@ def convert_comment_to_answer(request, id):
 
     return RefreshPageCommand()
 
-@decorate.withfn(command)
-def convert_to_question(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_question.html', {'answer': answer})
-
-    if not user.is_authenticated():
-        raise AnonymousNotAllowedException(_("convert answers to questions"))
-
-    if not user.can_convert_to_question(answer):
-        raise NotEnoughRepPointsException(_("convert answers to questions"))
-
-    try:
-        title = request.POST.get('title', None)
-    except:
-        raise CommandException(_("You haven't specified the title of the new question"))
-
-    AnswerToQuestionAction(user=user, node=answer, ip=request.META['REMOTE_ADDR']).save(data=dict(title=title))
-
-    return RefreshPageCommand()
-
 @decorate.withfn(command)
 def subscribe(request, id, user=None):
     if user:
index a5c5d704f817f926f28d5328842ed72ad02494e9..5064757aad706e349c8706669036edfcb997d98b 100644 (file)
@@ -12,11 +12,12 @@ from django.utils.translation import ugettext as _
 from django.core.urlresolvers import reverse
 from django.core.exceptions import PermissionDenied
 
-from forum.actions import AskAction, AnswerAction, ReviseAction, RollbackAction, RetagAction
+from forum.actions import AskAction, AnswerAction, ReviseAction, RollbackAction, RetagAction, AnswerToQuestionAction
 from forum.forms import *
 from forum.models import *
 from forum.forms import get_next_url
 from forum.utils import html
+from forum.http_responses import HttpResponseUnauthorized
 
 from vars import PENDING_SUBMISSION_SESSION_ATTR
 
@@ -111,6 +112,16 @@ def ask(request):
         'tab' : 'ask'
         }, context_instance=RequestContext(request))
 
+def convert_to_question(request, id):
+    user = request.user
+    answer = get_object_or_404(Answer, id=id)
+
+    if not user.can_convert_to_question(answer):
+        return HttpResponseUnauthorized(request)
+
+    return _edit_question(request, answer, template='node/convert_to_question.html', summary=_("Converted to question"),
+                           action_class=AnswerToQuestionAction, allow_rollback=False, url_getter=lambda a: Question.objects.get(id=a.id).get_absolute_url())
+
 def edit_question(request, id):
     question = get_object_or_404(Question, id=id)
     if question.nis.deleted and not request.user.can_view_deleted_post(question):
@@ -138,7 +149,7 @@ def _retag_question(request, question):
         #'tags' : _get_tags_cache_json(),
     }, context_instance=RequestContext(request))
 
-def _edit_question(request, question):
+def _edit_question(request, question, template='question_edit.html', summary='', action_class=ReviseAction, allow_rollback=True, url_getter=lambda q: q.get_absolute_url()):
     if request.method == 'POST':
         revision_form = RevisionForm(question, data=request.POST)
         revision_form.is_valid()
@@ -151,7 +162,7 @@ def _edit_question(request, question):
 
         if not 'select_revision' in request.POST and form.is_valid():
             if form.has_changed():
-                action = ReviseAction(user=request.user, node=question, ip=request.META['REMOTE_ADDR']).save(data=form.cleaned_data)
+                action = action_class(user=request.user, node=question, ip=request.META['REMOTE_ADDR']).save(data=form.cleaned_data)
 
                 if settings.WIKI_ON:
                     if request.POST.get('wiki', False) and not question.nis.wiki:
@@ -160,20 +171,23 @@ def _edit_question(request, question):
                         question.nstate.wiki = None
             else:
                 if not revision == question.active_revision:
-                    RollbackAction(user=request.user, node=question).save(data=dict(activate=revision))
+                    if allow_rollback:
+                        RollbackAction(user=request.user, node=question).save(data=dict(activate=revision))
+                    else:
+                        pass
 
-            return HttpResponseRedirect(question.get_absolute_url())
+            return HttpResponseRedirect(url_getter(question))
     else:
         revision_form = RevisionForm(question)
-        form = EditQuestionForm(question, request.user)
+        form = EditQuestionForm(question, request.user, initial={'summary': summary})
 
-    return render_to_response('question_edit.html', {
+    return render_to_response(template, {
         'question': question,
         'revision_form': revision_form,
         'form' : form,
-        #'tags' : _get_tags_cache_json()
     }, context_instance=RequestContext(request))
 
+
 def edit_answer(request, id):
     answer = get_object_or_404(Answer, id=id)
     if answer.deleted and not request.user.can_view_deleted_post(answer):