Merge lp:~cprov/uci-engine/webui-reviews-refix into lp:uci-engine

Proposed by Celso Providelo
Status: Merged
Approved by: Celso Providelo
Approved revision: 883
Merged at revision: 883
Proposed branch: lp:~cprov/uci-engine/webui-reviews-refix
Merge into: lp:uci-engine
Diff against target: 196 lines (+71/-16)
6 files modified
ci-utils/ci_utils/__init__.py (+1/-0)
juju-deployer/configs/unit_config.yaml.tmpl (+1/-0)
ticket_system/ticket/api.py (+4/-1)
ticket_system/ticket/models.py (+6/-5)
ticket_system/ticket/tests/test_write_api.py (+54/-7)
webui/tickets/static/tickets/webui.js (+5/-3)
To merge this branch: bzr merge lp:~cprov/uci-engine/webui-reviews-refix
Reviewer Review Type Date Requested Status
Evan (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+240675@code.launchpad.net

Commit message

Re-fixing ticket review creation and updating and extending test coverage for vital features like that.

Description of the change

Re-fixing ticket review creation and updating and extending test coverage for vital features like that.

Despite of them being tastypie stock-features, it seems to be easy to get things messed up by adding changes to the top-level resource (ticket).

Also landing quite a few drive-by adjustments for using django-admin forms and enabling support for vivid in the TS (it was already exposed in the webui).

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:883
http://s-jenkins.ubuntu-ci:8080/job/uci-engine-ci/1672/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/uci-engine-ci/1672/rebuild

review: Approve (continuous-integration)
Revision history for this message
Evan (ev) wrote :

Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ci-utils/ci_utils/__init__.py'
2--- ci-utils/ci_utils/__init__.py 2014-10-30 17:30:49 +0000
3+++ ci-utils/ci_utils/__init__.py 2014-11-05 05:32:38 +0000
4@@ -37,6 +37,7 @@
5 'precise',
6 'trusty',
7 'utopic',
8+ 'vivid',
9 ]
10
11
12
13=== modified file 'juju-deployer/configs/unit_config.yaml.tmpl'
14--- juju-deployer/configs/unit_config.yaml.tmpl 2014-10-16 09:27:12 +0000
15+++ juju-deployer/configs/unit_config.yaml.tmpl 2014-11-05 05:32:38 +0000
16@@ -37,6 +37,7 @@
17 private_ppas_only: $CI_PRIVATE_PPAS_ONLY
18
19 image_map:
20+ vivid: http://cloud-images.ubuntu.com/vivid/current/vivid-server-cloudimg-amd64-disk1.img
21 utopic: http://cloud-images.ubuntu.com/utopic/current/utopic-server-cloudimg-amd64-disk1.img
22 trusty: http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img
23 precise: http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img
24
25=== modified file 'ticket_system/ticket/api.py'
26--- ticket_system/ticket/api.py 2014-10-30 04:57:56 +0000
27+++ ticket_system/ticket/api.py 2014-11-05 05:32:38 +0000
28@@ -136,7 +136,9 @@
29 return bundle
30
31 for subticket in subtickets:
32- if not isinstance(subticket, dict):
33+ if isinstance(subticket, basestring):
34+ continue
35+ elif not isinstance(subticket, dict):
36 sp = subticket.data['sourcepackage']
37 else:
38 sp = subticket['sourcepackage']
39@@ -602,6 +604,7 @@
40 class Meta:
41 queryset = Review.objects.all()
42 authorization = Authorization()
43+ allowed_methods = ['get', 'post', 'patch', 'delete']
44 filtering = {
45 'ticket': ALL_WITH_RELATIONS,
46 'review_type': ALL,
47
48=== modified file 'ticket_system/ticket/models.py'
49--- ticket_system/ticket/models.py 2014-11-04 09:05:06 +0000
50+++ ticket_system/ticket/models.py 2014-11-05 05:32:38 +0000
51@@ -99,7 +99,7 @@
52 }, {
53 'name': 'citrain',
54 'steps': json.dumps([
55- {'name': 'silo_creation'},
56+ {'name': 'silo_creating'},
57 {'name': 'silo_building'},
58 {'name': 'silo_testing'},
59 {'name': 'silo_publishing'}
60@@ -124,7 +124,7 @@
61 owner = models.EmailField(max_length=254)
62 creator = models.EmailField(max_length=254, null=True, blank=True)
63 title = models.CharField(max_length=4096)
64- description = models.TextField()
65+ description = models.TextField(blank=True)
66 bug_id = models.IntegerField(null=True, blank=True)
67 current_workflow_step = models.IntegerField(
68 choices=_choices(TicketWorkflowStep), max_length=4096,
69@@ -288,7 +288,7 @@
70 help_text='Branch revision number approved for this cycle.')
71
72 source_package_upload = models.ForeignKey(
73- SourcePackageUpload, null=True,
74+ SourcePackageUpload, null=True, blank=True,
75 help_text='Current SPU generated by this merge proposal.')
76
77 class Meta:
78@@ -336,7 +336,8 @@
79 ~models.Q(pk=self.ticket.pk),
80 ~models.Q(status=TicketWorkflowStepStatus.FAILED),
81 current_workflow_step__range=(
82- TicketWorkflowStep.QUEUED, TicketWorkflowStep.PKG_PUBLISHING),
83+ TicketWorkflowStep.SILO_BUILDING,
84+ TicketWorkflowStep.PKG_PUBLISHING),
85 )
86
87 return conflicting_tickets
88@@ -405,4 +406,4 @@
89
90 def __unicode__(self):
91 return 'ticket-{} - {}: completed({})'.format(
92- self.ticket.id, self.review_type, self.completed)
93+ self.ticket.uuid, self.review_type, self.completed)
94
95=== modified file 'ticket_system/ticket/tests/test_write_api.py'
96--- ticket_system/ticket/tests/test_write_api.py 2014-11-04 17:01:32 +0000
97+++ ticket_system/ticket/tests/test_write_api.py 2014-11-05 05:32:38 +0000
98@@ -135,25 +135,72 @@
99 [unicode(spu) for spu in sub_bar.source_package_uploads.all()])
100
101 def test_post_ticket_atomically_for_reviews(self):
102+ # 'Reviews' can be created atomically with the related `Ticket`.
103+
104+ # We are injecting a review here to check if tastypie it behaving
105+ # correctly and not updating existing reviews to accomplish the
106+ # request.
107+ other_ticket = create_ticket()
108+ existing_review = other_ticket.review_set.create(
109+ review_type='QA',
110+ workflow_step=TicketWorkflowStep.IMAGE_BUILDING)
111+
112+ # Let's POST to create a new ticket with pre-defined reviews.
113 params = self.post_ticket_data.copy()
114 params.update({
115 'title': 'Atomic Ticket with Review',
116 'reviews': [{
117 'review_type': 'QA',
118 'workflow_step': 'Package validation',
119+ }, {
120+ 'review_type': 'QA',
121+ 'workflow_step': 'Image building',
122 }],
123 })
124 self.post(resource=self.resource, params=params)
125
126 # 'Atomic Ticket with Review' was created.
127- [existing, ticket] = list(Ticket.objects.all())
128+ [existing, other, ticket] = list(Ticket.objects.all())
129+
130 self.assertEqual('Atomic Ticket with Review', unicode(ticket))
131- # and already contain the specified `Review`
132- [review] = list(ticket.review_set.all())
133- self.assertEqual('QA', review.review_type)
134- self.assertEqual(
135- TicketWorkflowStep.PKG_VALIDATION.value, review.workflow_step)
136- self.assertFalse(review.completed)
137+ # and already contain the specified `Review`s
138+ [review_pkg, review_img] = list(ticket.review_set.all())
139+ self.assertEqual('QA', review_pkg.review_type)
140+ self.assertEqual(
141+ TicketWorkflowStep.PKG_VALIDATION.value, review_pkg.workflow_step)
142+ self.assertFalse(review_pkg.completed)
143+ self.assertEqual('QA', review_img.review_type)
144+ self.assertEqual(
145+ TicketWorkflowStep.IMAGE_BUILDING.value, review_img.workflow_step)
146+ self.assertFalse(review_img.completed)
147+
148+ # Note that the reviews created via POST are new, they are not
149+ # mysteriously reused/updated by tastypie.
150+ self.assertNotIn(existing_review.pk, [review_pkg.pk, review_img.pk])
151+
152+ def test_patch_ticket_reviews(self):
153+ # `Ticket` PATCH can update `Review`s.
154+ review = self.ticket.review_set.create(
155+ review_type='QA',
156+ workflow_step=TicketWorkflowStep.IMAGE_BUILDING)
157+
158+ params = self.post_ticket_data.copy()
159+ params.update({
160+ 'title': 'Atomic Patched Ticket',
161+ 'reviews': [{
162+ 'id': review.id,
163+ 'completed': True,
164+ 'workflow_step': 'Image building',
165+ }],
166+ })
167+ self.patch(resource=self.detail_url, params=params)
168+
169+ # The existing `Subticket` was updated and a new one was created.
170+ [ticket] = list(Ticket.objects.all())
171+ self.assertEqual('Atomic Patched Ticket', unicode(ticket))
172+ [new_review] = list(ticket.review_set.all())
173+ self.assertEqual(review.id, new_review.id)
174+ self.assertTrue(new_review.completed)
175
176 def test_post_ticket_atomically_reuses_workflows(self):
177 # `Ticket` atomic creation re-uses existing `Workflows`s.
178
179=== modified file 'webui/tickets/static/tickets/webui.js'
180--- webui/tickets/static/tickets/webui.js 2014-11-04 13:32:04 +0000
181+++ webui/tickets/static/tickets/webui.js 2014-11-05 05:32:38 +0000
182@@ -54,9 +54,11 @@
183 this.get('srcNode').all('button').on('click', function(e) {
184 var review = self.get('review');
185 var data = {
186- reviews: [
187- {'id': review.id, 'completed': true}
188- ]
189+ reviews: [{
190+ 'id': review.id,
191+ 'workflow_step': review.workflow_step,
192+ 'completed': true
193+ }]
194 };
195 // Issue a PATCH TS-request to update the review and
196 // update the widget accordingly.

Subscribers

People subscribed via source and target branches