diff --git a/django/contrib/comments/views/moderation.py b/django/contrib/comments/views/moderation.py
index 3334b09..5a4e8b6 100644
a
|
b
|
def flag(request, comment_id, next=None):
|
34 | 34 | created = created, |
35 | 35 | request = request, |
36 | 36 | ) |
| 37 | if request.POST.has_key('next'): |
| 38 | next = request.POST.get('next') |
| 39 | elif request.GET.has_key('next'): |
| 40 | next = request.GET.get('next') |
37 | 41 | return next_redirect(request.POST.copy(), next, flag_done, c=comment.pk) |
38 | 42 | |
39 | 43 | # Render a form on GET |
40 | 44 | else: |
| 45 | next = request.GET.get('next', next) |
41 | 46 | return render_to_response('comments/flag.html', |
42 | 47 | {'comment': comment, "next": next}, |
43 | 48 | template.RequestContext(request) |
… |
… |
def delete(request, comment_id, next=None):
|
74 | 79 | created = created, |
75 | 80 | request = request, |
76 | 81 | ) |
| 82 | if request.POST.has_key('next'): |
| 83 | next = request.POST.get('next') |
| 84 | elif request.GET.has_key('next'): |
| 85 | next = request.GET.get('next') |
77 | 86 | return next_redirect(request.POST.copy(), next, delete_done, c=comment.pk) |
78 | 87 | |
79 | 88 | # Render a form on GET |
80 | 89 | else: |
| 90 | next = request.GET.get('next', next) |
81 | 91 | return render_to_response('comments/delete.html', |
82 | 92 | {'comment': comment, "next": next}, |
83 | 93 | template.RequestContext(request) |
… |
… |
def approve(request, comment_id, next=None):
|
117 | 127 | created = created, |
118 | 128 | request = request, |
119 | 129 | ) |
| 130 | if request.POST.has_key('next'): |
| 131 | next = request.POST.get('next') |
| 132 | elif request.GET.has_key('next'): |
| 133 | next = request.GET.get('next') |
120 | 134 | return next_redirect(request.POST.copy(), next, approve_done, c=comment.pk) |
121 | 135 | |
122 | 136 | # Render a form on GET |
123 | 137 | else: |
| 138 | next = request.GET.get('next', next) |
124 | 139 | return render_to_response('comments/approve.html', |
125 | 140 | {'comment': comment, "next": next}, |
126 | 141 | template.RequestContext(request) |
diff --git a/docs/ref/contrib/comments/index.txt b/docs/ref/contrib/comments/index.txt
index f6e1553..4bfedcd 100644
a
|
b
|
you can include a hidden form input called ``next`` in your comment form. For ex
|
188 | 188 | |
189 | 189 | <input type="hidden" name="next" value="{% url my_comment_was_posted %}" /> |
190 | 190 | |
| 191 | The ``next`` parameter can be passed into the comment system in a variety of ways, |
| 192 | but POST will always be preferred over GET and the named parameter is always overridden. |
| 193 | |
| 194 | A ``next`` parameter can be specified in ``urls.py`` with the following line:: |
| 195 | |
| 196 | (r'^flag/(\d+)/$', flag, {'next': '/I/am/done/'}) |
| 197 | |
191 | 198 | .. _notes-on-the-comment-form: |
192 | 199 | |
193 | 200 | Notes on the comment form |
diff --git a/tests/regressiontests/comment_tests/tests/moderation_view_tests.py b/tests/regressiontests/comment_tests/tests/moderation_view_tests.py
index b9eadd7..91055ca 100644
a
|
b
|
from django.contrib.auth.models import User, Permission
|
3 | 3 | from django.contrib.contenttypes.models import ContentType |
4 | 4 | from regressiontests.comment_tests.tests import CommentTestCase |
5 | 5 | from django.contrib.comments import signals |
6 | | |
| 6 | from django.contrib.comments.views.moderation import delete |
| 7 | import re |
7 | 8 | class FlagViewTests(CommentTestCase): |
8 | 9 | |
9 | 10 | def testFlagGet(self): |
… |
… |
class DeleteViewTests(CommentTestCase):
|
92 | 93 | self.client.login(username="normaluser", password="normaluser") |
93 | 94 | response = self.client.post("/delete/%d/" % pk) |
94 | 95 | self.assertEqual(response["Location"], "http://testserver/deleted/?c=%d" % pk) |
| 96 | |
| 97 | response = self.client.post("/delete/%d/" % pk, {"next": "/somewhere/else/"}) |
| 98 | location = response["Location"] |
| 99 | match = re.search(r"^http://testserver/somewhere/else/\?c=\d+$", location) |
| 100 | self.failUnless(match != None, "Unexpected redirect location: %s" % location) |
95 | 101 | c = Comment.objects.get(pk=pk) |
96 | 102 | self.failUnless(c.is_removed) |
97 | 103 | self.assertEqual(c.flags.filter(flag=CommentFlag.MODERATOR_DELETION, user__username="normaluser").count(), 1) |
… |
… |
class DeleteViewTests(CommentTestCase):
|
106 | 112 | |
107 | 113 | # Post a comment and check the signals |
108 | 114 | self.testDeletePost() |
109 | | self.assertEqual(received_signals, [signals.comment_was_flagged]) |
| 115 | self.assertEqual(received_signals, [signals.comment_was_flagged, signals.comment_was_flagged]) |
110 | 116 | |
111 | 117 | def testDeletedView(self): |
112 | 118 | comments = self.createSomeComments() |
… |
… |
class DeleteViewTests(CommentTestCase):
|
114 | 120 | response = self.client.get("/deleted/", data={"c":pk}) |
115 | 121 | self.assertTemplateUsed(response, "comments/deleted.html") |
116 | 122 | |
| 123 | def testDeletedViewNextGet(self): |
| 124 | comments = self.createSomeComments() |
| 125 | pk = comments[0].pk |
| 126 | makeModerator("normaluser") |
| 127 | self.client.login(username="normaluser", password="normaluser") |
| 128 | response = self.client.get("/delete/%d/" % pk, data={"next": "/somewhere/else"}) |
| 129 | self.assertEqual(response.context[1]['next'], "/somewhere/else") |
| 130 | self.assertTemplateUsed(response, "comments/delete.html") |
| 131 | |
| 132 | def testDeletedViewNextGetPost(self): |
| 133 | comments = self.createSomeComments() |
| 134 | pk = comments[0].pk |
| 135 | makeModerator("normaluser") |
| 136 | self.client.login(username="normaluser", password="normaluser") |
| 137 | response = self.client.post("/delete/%d/?next=/somewhere/else" % pk, data={"next": "/somewhere/new"}) |
| 138 | location = response["Location"] |
| 139 | match = re.search(r"^http://testserver/somewhere/new\?c=\d+$", location) |
| 140 | self.failUnless(match != None, "Unexpected redirect location: %s" % location) |
| 141 | |
| 142 | |
117 | 143 | class ApproveViewTests(CommentTestCase): |
118 | 144 | |
119 | 145 | def testApprovePermissions(self): |
… |
… |
class ApproveViewTests(CommentTestCase):
|
131 | 157 | def testApprovePost(self): |
132 | 158 | """POSTing the delete view should mark the comment as removed""" |
133 | 159 | c1, c2, c3, c4 = self.createSomeComments() |
134 | | c1.is_public = False; c1.save() |
| 160 | c1.is_public = False |
| 161 | c1.save() |
135 | 162 | |
136 | 163 | makeModerator("normaluser") |
137 | 164 | self.client.login(username="normaluser", password="normaluser") |
… |
… |
class ModerationQueueTests(CommentTestCase):
|
179 | 206 | self.client.login(username="normaluser", password="normaluser") |
180 | 207 | |
181 | 208 | c1.is_public = c2.is_public = False |
182 | | c1.save(); c2.save() |
| 209 | c1.save() |
| 210 | c2.save() |
183 | 211 | response = self.client.get("/moderate/") |
184 | 212 | self.assertEqual(list(response.context[0]["comments"]), [c1, c2]) |
185 | 213 | |