Merge lp:~stevenk/launchpad/reject-reason-plus-queue into lp:launchpad

Proposed by Steve Kowalik
Status: Merged
Approved by: William Grant
Approved revision: no longer in the source branch.
Merged at revision: 16648
Proposed branch: lp:~stevenk/launchpad/reject-reason-plus-queue
Merge into: lp:launchpad
Diff against target: 256 lines (+65/-49)
3 files modified
lib/lp/soyuz/browser/queue.py (+11/-9)
lib/lp/soyuz/browser/tests/test_queue.py (+41/-37)
lib/lp/soyuz/templates/distroseries-queue.pt (+13/-3)
To merge this branch: bzr merge lp:~stevenk/launchpad/reject-reason-plus-queue
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+165960@code.launchpad.net

Commit message

Make use of the new comment argument to IPackageUpload.rejectFromQueue() in DistroSeries:+queue by showing a textbox for a reason and require it to be specified when rejecting packages.

Description of the change

Make use of the new comment argument to IPackageUpload.rejectFromQueue() by showing a textbox for a reason and require it to be specified when rejecting packages.

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/soyuz/browser/queue.py'
2--- lib/lp/soyuz/browser/queue.py 2013-04-17 08:13:18 +0000
3+++ lib/lp/soyuz/browser/queue.py 2013-05-28 06:37:30 +0000
4@@ -309,6 +309,7 @@
5 # Retrieve the form data.
6 accept = self.request.form.get('Accept', '')
7 reject = self.request.form.get('Reject', '')
8+ rejection_comment = self.request.form.get('rejection_comment', '')
9 component_override = self.request.form.get('component_override', '')
10 section_override = self.request.form.get('section_override', '')
11 priority_override = self.request.form.get('priority_override', '')
12@@ -318,6 +319,11 @@
13 if (not accept and not reject) or not queue_ids:
14 return
15
16+ # If we're asked to reject with no comment, bail.
17+ if reject and not rejection_comment:
18+ self.error = 'Rejection comment required.'
19+ return
20+
21 # Determine if there is a source override requested.
22 new_component = None
23 new_section = None
24@@ -421,7 +427,11 @@
25 'priority'] = new_priority.title.lower()
26
27 try:
28- getattr(self, 'queue_action_' + action)(queue_item)
29+ if action == 'accept':
30+ queue_item.acceptFromQueue(user=self.user)
31+ elif action == 'reject':
32+ queue_item.rejectFromQueue(
33+ user=self.user, comment=rejection_comment)
34 except (QueueAdminUnauthorizedError,
35 QueueInconsistentStateError) as info:
36 failure.append('FAILED: %s (%s)' %
37@@ -447,14 +457,6 @@
38 url = str(self.request.URL) + "?queue_state=%s" % self.state.value
39 self.request.response.redirect(url)
40
41- def queue_action_accept(self, queue_item):
42- """Accept the queue item passed."""
43- queue_item.acceptFromQueue(user=self.user)
44-
45- def queue_action_reject(self, queue_item):
46- """Reject the queue item passed."""
47- queue_item.rejectFromQueue(user=self.user)
48-
49 def sortedSections(self):
50 """Possible sections for the context distroseries.
51
52
53=== modified file 'lib/lp/soyuz/browser/tests/test_queue.py'
54--- lib/lp/soyuz/browser/tests/test_queue.py 2013-04-17 11:07:33 +0000
55+++ lib/lp/soyuz/browser/tests/test_queue.py 2013-05-28 06:37:30 +0000
56@@ -42,17 +42,15 @@
57 from lp.testing.views import create_initialized_view
58
59
60-class TestAcceptQueueUploads(TestCaseWithFactory):
61- """Uploads for the partner archive can be accepted with the relevant
62- permissions.
63- """
64+class TestAcceptRejectQueueUploads(TestCaseWithFactory):
65+ """Uploads can be accepted or rejected with the relevant permissions."""
66
67 layer = LaunchpadFunctionalLayer
68
69 def setUp(self):
70 """Create two new uploads in the new state and a person with
71 permission to upload to the partner archive."""
72- super(TestAcceptQueueUploads, self).setUp()
73+ super(TestAcceptRejectQueueUploads, self).setUp()
74 login('admin@canonical.com')
75 self.test_publisher = SoyuzTestPublisher()
76 self.test_publisher.prepareBreezyAutotest()
77@@ -132,6 +130,11 @@
78 view.performQueueAction()
79 return view
80
81+ def assertStatus(self, package_upload_id, status):
82+ self.assertEqual(
83+ status,
84+ getUtility(IPackageUploadSet).get(package_upload_id).status)
85+
86 def test_main_admin_can_accept_main_upload(self):
87 # A person with queue admin access for main
88 # can accept uploads to the main archive.
89@@ -145,10 +148,7 @@
90 request = LaunchpadTestRequest(form=self.form)
91 request.method = 'POST'
92 self.setupQueueView(request)
93-
94- self.assertEquals(
95- 'DONE',
96- getUtility(IPackageUploadSet).get(package_upload_id).status.name)
97+ self.assertStatus(package_upload_id, PackageUploadStatus.DONE)
98
99 def test_main_admin_cannot_accept_partner_upload(self):
100 # A person with queue admin access for main cannot necessarily
101@@ -169,9 +169,7 @@
102 "FAILED: partner-upload (You have no rights to accept "
103 "component(s) 'partner')"),
104 view.request.response.notifications[0].message)
105- self.assertEquals(
106- 'NEW',
107- getUtility(IPackageUploadSet).get(package_upload_id).status.name)
108+ self.assertStatus(package_upload_id, PackageUploadStatus.NEW)
109
110 def test_admin_can_accept_partner_upload(self):
111 # An admin can always accept packages, even for the
112@@ -183,10 +181,7 @@
113 request = LaunchpadTestRequest(form=self.form)
114 request.method = 'POST'
115 self.setupQueueView(request)
116-
117- self.assertEquals(
118- 'DONE',
119- getUtility(IPackageUploadSet).get(package_upload_id).status.name)
120+ self.assertStatus(package_upload_id, PackageUploadStatus.DONE)
121
122 def test_partner_admin_can_accept_partner_upload(self):
123 # A person with queue admin access for partner
124@@ -201,10 +196,7 @@
125 request = LaunchpadTestRequest(form=self.form)
126 request.method = 'POST'
127 self.setupQueueView(request)
128-
129- self.assertEquals(
130- 'DONE',
131- getUtility(IPackageUploadSet).get(package_upload_id).status.name)
132+ self.assertStatus(package_upload_id, PackageUploadStatus.DONE)
133
134 def test_partner_admin_cannot_accept_main_upload(self):
135 # A person with queue admin access for partner cannot necessarily
136@@ -225,9 +217,7 @@
137 "FAILED: main-upload (You have no rights to accept "
138 "component(s) 'main')"),
139 view.request.response.notifications[0].message)
140- self.assertEquals(
141- 'NEW',
142- getUtility(IPackageUploadSet).get(package_upload_id).status.name)
143+ self.assertStatus(package_upload_id, PackageUploadStatus.NEW)
144
145 def test_proposed_admin_can_accept_proposed_upload(self):
146 # A person with queue admin access for proposed can accept uploads
147@@ -243,7 +233,6 @@
148 self.proposed_queue_admin,
149 pocket=PackagePublishingPocket.PROPOSED,
150 distroseries=distroseries))
151- package_upload_set = getUtility(IPackageUploadSet)
152
153 for spr in (self.proposed_spr, self.proposed_series_spr):
154 package_upload_id = spr.package_upload.id
155@@ -251,9 +240,7 @@
156 request = LaunchpadTestRequest(form=self.form)
157 request.method = 'POST'
158 self.setupQueueView(request, series=spr.upload_distroseries)
159-
160- self.assertEqual(
161- 'DONE', package_upload_set.get(package_upload_id).status.name)
162+ self.assertStatus(package_upload_id, PackageUploadStatus.DONE)
163
164 def test_proposed_admin_cannot_accept_release_upload(self):
165 # A person with queue admin access for proposed cannot necessarly
166@@ -275,9 +262,7 @@
167 "FAILED: main-upload (You have no rights to accept "
168 "component(s) 'main')"),
169 view.request.response.notifications[0].message)
170- self.assertEqual(
171- 'NEW',
172- getUtility(IPackageUploadSet).get(package_upload_id).status.name)
173+ self.assertStatus(package_upload_id, PackageUploadStatus.NEW)
174
175 def test_proposed_series_admin_can_accept_that_series_upload(self):
176 # A person with queue admin access for proposed for one series can
177@@ -294,10 +279,7 @@
178 request = LaunchpadTestRequest(form=self.form)
179 request.method = 'POST'
180 self.setupQueueView(request, series=self.second_series)
181-
182- self.assertEqual(
183- 'DONE',
184- getUtility(IPackageUploadSet).get(package_upload_id).status.name)
185+ self.assertStatus(package_upload_id, PackageUploadStatus.DONE)
186
187 def test_proposed_series_admin_cannot_accept_other_series_upload(self):
188 # A person with queue admin access for proposed for one series
189@@ -317,9 +299,31 @@
190
191 self.assertEqual(
192 "You do not have permission to act on queue items.", view.error)
193- self.assertEqual(
194- 'NEW',
195- getUtility(IPackageUploadSet).get(package_upload_id).status.name)
196+ self.assertStatus(package_upload_id, PackageUploadStatus.NEW)
197+
198+ def test_cannot_reject_without_comment(self):
199+ login_person(self.proposed_queue_admin)
200+ package_upload_id = self.proposed_spr.package_upload.id
201+ form = {
202+ 'Reject': 'Reject',
203+ 'QUEUE_ID': [package_upload_id]}
204+ request = LaunchpadTestRequest(form=form)
205+ request.method = 'POST'
206+ view = self.setupQueueView(request)
207+ self.assertEqual('Rejection comment required.', view.error)
208+ self.assertStatus(package_upload_id, PackageUploadStatus.NEW)
209+
210+ def test_reject_with_comment(self):
211+ login_person(self.proposed_queue_admin)
212+ package_upload_id = self.proposed_spr.package_upload.id
213+ form = {
214+ 'Reject': 'Reject',
215+ 'rejection_comment': 'Because I can.',
216+ 'QUEUE_ID': [package_upload_id]}
217+ request = LaunchpadTestRequest(form=form)
218+ request.method = 'POST'
219+ self.setupQueueView(request)
220+ self.assertStatus(package_upload_id, PackageUploadStatus.REJECTED)
221
222
223 class TestQueueItemsView(TestCaseWithFactory):
224
225=== modified file 'lib/lp/soyuz/templates/distroseries-queue.pt'
226--- lib/lp/soyuz/templates/distroseries-queue.pt 2013-04-18 08:49:33 +0000
227+++ lib/lp/soyuz/templates/distroseries-queue.pt 2013-05-28 06:37:30 +0000
228@@ -183,15 +183,25 @@
229 </select>
230 </td>
231 <td colspan="2" style="vertical-align: bottom">
232+ <input value="Accept" name="Accept" type="submit"/>
233+ </td>
234+ </tr>
235+ <tr tal:condition="view/availableActions">
236+ <td colspan="4" style="text-align: right;
237+ vertical-align: bottom;
238+ padding-bottom: 5px">
239+ <label>Rejection comment:</label>
240+ </td>
241+ <td colspan="3" style="vertical-align: bottom">
242+ <input size="80" type="text" name="rejection_comment" />
243+ </td>
244+ <td style="vertical-align: bottom">
245 <input
246 tal:condition="view/state/enumvalue:REJECTED"
247 disabled="true" value="Reject" name="Reject" type="submit"/>
248 <input
249 tal:condition="not:view/state/enumvalue:REJECTED"
250 value="Reject" name="Reject" type="submit"/>
251- <br/>
252- <br/>
253- <input value="Accept" name="Accept" type="submit"/>
254 </td>
255 </tr>
256 </tbody>