Merge lp:~cjohnston/ubuntu-ci-services-itself/ts-next into lp:ubuntu-ci-services-itself

Proposed by Chris Johnston
Status: Merged
Approved by: Chris Johnston
Approved revision: 104
Merged at revision: 112
Proposed branch: lp:~cjohnston/ubuntu-ci-services-itself/ts-next
Merge into: lp:ubuntu-ci-services-itself
Diff against target: 200 lines (+153/-3)
4 files modified
docs/components/ticket-system.rst (+4/-0)
ticket_system/ticket/api.py (+28/-0)
ticket_system/ticket/tests/test_full_read_api.py (+117/-0)
ticket_system/ticket_system/urls.py (+4/-3)
To merge this branch: bzr merge lp:~cjohnston/ubuntu-ci-services-itself/ts-next
Reviewer Review Type Date Requested Status
Andy Doan (community) Approve
Chris Johnston (community) Needs Resubmitting
Francis Ginther Approve
Review via email: mp+201854@code.launchpad.net

Commit message

Add next/ API for the lander to get tickets from the TS

Description of the change

Adds a next/ api for the lander to either get the current ticket in progress, or if there are no in progress tickets, the next ticket in the queue.

To post a comment you must log in.
Revision history for this message
Francis Ginther (fginther) wrote :

Approve from the lander (api consumer) perspective.

review: Approve
Revision history for this message
Andy Doan (doanac) wrote :

On 01/15/2014 03:14 PM, Chris Johnston wrote:
> + def get_object_list(self, request):
> + exclude = ['000', '1000']
> + in_progress = ['200', '300', '400', '500']

aren't there constants in models.py we can use instead?

Revision history for this message
Chris Johnston (cjohnston) wrote :

How do you suggest using them?

Revision history for this message
Andy Doan (doanac) wrote :

On 01/16/2014 07:02 AM, Chris Johnston wrote:
> How do you suggest using them?

This is one way, and I'm sure 2 other people would have 2 more ways, but:

  exclude = [
      TicketWorkflowStepStatus.NEW.value,
      TicketWorkflowStepStatus.COMPLETE.value,
  ]

104. By Chris Johnston

Update per review

Revision history for this message
Chris Johnston (cjohnston) :
review: Needs Resubmitting
Revision history for this message
Andy Doan (doanac) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'docs/components/ticket-system.rst'
--- docs/components/ticket-system.rst 2014-01-15 02:23:07 +0000
+++ docs/components/ticket-system.rst 2014-01-16 15:41:47 +0000
@@ -171,6 +171,10 @@
171171
172Show the current in progress, or the first pending ticket.172Show the current in progress, or the first pending ticket.
173173
174::
175
176 curl --dump-header - http://162.213.34.2:8000/api/v1/next/
177
174get_ticket_status178get_ticket_status
175~~~~~~~~~~~~~~~~~179~~~~~~~~~~~~~~~~~
176180
177181
=== modified file 'ticket_system/ticket/api.py'
--- ticket_system/ticket/api.py 2014-01-15 00:31:20 +0000
+++ ticket_system/ticket/api.py 2014-01-16 15:41:47 +0000
@@ -161,3 +161,31 @@
161 filtering = {161 filtering = {
162 "current_workflow_step": ALL,162 "current_workflow_step": ALL,
163 }163 }
164
165
166class NextTicketResource(TicketTranslatedResource):
167 subticket = fields.ToManyField(FullSubTicketResource, 'subticket_set',
168 full=True)
169
170 class Meta:
171 queryset = Ticket.objects.all()
172 allowed_methods = ['get']
173 resource_name = 'next'
174
175 def get_object_list(self, request):
176 exclude = [TicketWorkflowStep.NEW.value,
177 TicketWorkflowStep.COMPLETED.value]
178 in_progress = [TicketWorkflowStep.PKG_BUILDING.value,
179 TicketWorkflowStep.IMAGE_BUILDING.value,
180 TicketWorkflowStep.IMAGE_TESTING.value,
181 TicketWorkflowStep.PKG_PUBLISHING.value]
182 qs = super(NextTicketResource, self).get_object_list(request).exclude(
183 current_workflow_step__in=exclude).order_by('id')[:1]
184 process = Ticket.objects.exclude(
185 current_workflow_step__in=exclude,
186 ).filter(current_workflow_step__in=in_progress)
187 if process:
188 qs = process
189 else:
190 qs = qs
191 return qs
164192
=== modified file 'ticket_system/ticket/tests/test_full_read_api.py'
--- ticket_system/ticket/tests/test_full_read_api.py 2014-01-09 21:06:18 +0000
+++ ticket_system/ticket/tests/test_full_read_api.py 2014-01-16 15:41:47 +0000
@@ -123,3 +123,120 @@
123 u'resource_uri': u'/api/v1/fullsubticket/{0}/'.format(123 u'resource_uri': u'/api/v1/fullsubticket/{0}/'.format(
124 self.subticket.pk),124 self.subticket.pk),
125 })125 })
126
127
128class GetNextTicketTest(TastypieTestCase):
129 """
130 Test that /next/ returns the current inprogress ticket, or the next
131 'queued' ticket.
132 """
133 def setUp(self):
134 super(GetNextTicketTest, self).setUp('/api/v1')
135 self.ticket_1 = mommy.make(
136 'Ticket', current_workflow_step=int(TicketWorkflowStep.NEW))
137 self.ticket_2 = mommy.make(
138 'Ticket', current_workflow_step=int(TicketWorkflowStep.QUEUED))
139 self.ticket_3 = mommy.make(
140 'Ticket', current_workflow_step=int(TicketWorkflowStep.QUEUED))
141 self.ticket_4 = mommy.make(
142 'Ticket', current_workflow_step=int(TicketWorkflowStep.COMPLETED))
143 self.sourcepackage = mommy.make('SourcePackage')
144 self.spu = mommy.make('SourcePackageUpload',
145 sourcepackage=self.sourcepackage)
146 self.subticket_1 = mommy.make('SubTicket', ticket=self.ticket_1,
147 source_package_upload=self.spu)
148 self.artifact_1 = mommy.make('Artifact', subticket=self.subticket_1)
149 self.subticket_2 = mommy.make('SubTicket', ticket=self.ticket_2,
150 source_package_upload=self.spu)
151 self.artifact_2 = mommy.make('Artifact', subticket=self.subticket_2)
152 self.subticket_3 = mommy.make('SubTicket', ticket=self.ticket_3,
153 source_package_upload=self.spu)
154 self.artifact_3 = mommy.make('Artifact', subticket=self.subticket_3)
155 self.subticket_4 = mommy.make('SubTicket', ticket=self.ticket_4,
156 source_package_upload=self.spu)
157 self.artifact_4 = mommy.make('Artifact', subticket=self.subticket_4)
158
159 def test_queued_ticket_next(self):
160 obj = self.getResource('next/')
161 self.assertEqual(len(obj['objects']), 1)
162 self.assertEqual(obj['objects'][0][u'resource_uri'],
163 u'/api/v1/next/{0}/'.format(
164 self.ticket_2.pk))
165 self.assertEqual(
166 obj['objects'][0][u'current_workflow_step'], get_enum_title(
167 self.ticket_2.current_workflow_step, TicketWorkflowStep))
168
169 def test_pkg_building_ticket_next(self):
170 self.ticket_3.current_workflow_step = int(
171 TicketWorkflowStep.PKG_BUILDING)
172 self.ticket_3.save()
173 obj = self.getResource('next/')
174 self.assertEqual(len(obj['objects']), 1)
175 self.assertEqual(obj['objects'][0][u'resource_uri'],
176 u'/api/v1/next/{0}/'.format(
177 self.ticket_3.pk))
178 self.assertEqual(
179 obj['objects'][0][u'current_workflow_step'], get_enum_title(
180 self.ticket_3.current_workflow_step, TicketWorkflowStep))
181
182 def test_image_building_ticket_next(self):
183 self.ticket_3.current_workflow_step = int(
184 TicketWorkflowStep.IMAGE_BUILDING)
185 self.ticket_3.save()
186 obj = self.getResource('next/')
187 self.assertEqual(len(obj['objects']), 1)
188 self.assertEqual(obj['objects'][0][u'resource_uri'],
189 u'/api/v1/next/{0}/'.format(
190 self.ticket_3.pk))
191 self.assertEqual(
192 obj['objects'][0][u'current_workflow_step'], get_enum_title(
193 self.ticket_3.current_workflow_step, TicketWorkflowStep))
194
195 def test_image_testing_ticket_next(self):
196 self.ticket_3.current_workflow_step = int(
197 TicketWorkflowStep.IMAGE_TESTING)
198 self.ticket_3.save()
199 obj = self.getResource('next/')
200 self.assertEqual(len(obj['objects']), 1)
201 self.assertEqual(obj['objects'][0][u'resource_uri'],
202 u'/api/v1/next/{0}/'.format(
203 self.ticket_3.pk))
204 self.assertEqual(
205 obj['objects'][0][u'current_workflow_step'], get_enum_title(
206 self.ticket_3.current_workflow_step, TicketWorkflowStep))
207
208 def test_pkg_publishing_ticket_next(self):
209 self.ticket_3.current_workflow_step = int(
210 TicketWorkflowStep.PKG_PUBLISHING)
211 self.ticket_3.save()
212 obj = self.getResource('next/')
213 self.assertEqual(len(obj['objects']), 1)
214 self.assertEqual(obj['objects'][0][u'resource_uri'],
215 u'/api/v1/next/{0}/'.format(
216 self.ticket_3.pk))
217 self.assertEqual(
218 obj['objects'][0][u'current_workflow_step'], get_enum_title(
219 self.ticket_3.current_workflow_step, TicketWorkflowStep))
220
221 def test_ticket_complete_next_new_ticket_next(self):
222 self.ticket_3.current_workflow_step = int(
223 TicketWorkflowStep.COMPLETED)
224 self.ticket_3.save()
225 obj = self.getResource('next/')
226 self.assertEqual(len(obj['objects']), 1)
227 self.assertEqual(obj['objects'][0][u'resource_uri'],
228 u'/api/v1/next/{0}/'.format(
229 self.ticket_2.pk))
230 self.assertEqual(
231 obj['objects'][0][u'current_workflow_step'], get_enum_title(
232 self.ticket_2.current_workflow_step, TicketWorkflowStep))
233
234 def test_no_queued_or_in_progress_ticket_next(self):
235 self.ticket_2.current_workflow_step = int(
236 TicketWorkflowStep.NEW)
237 self.ticket_2.save()
238 self.ticket_3.current_workflow_step = int(
239 TicketWorkflowStep.NEW)
240 self.ticket_3.save()
241 obj = self.getResource('next/')
242 self.assertEqual(len(obj['objects']), 0)
126243
=== modified file 'ticket_system/ticket_system/urls.py'
--- ticket_system/ticket_system/urls.py 2014-01-15 00:16:52 +0000
+++ ticket_system/ticket_system/urls.py 2014-01-16 15:41:47 +0000
@@ -21,9 +21,9 @@
21from ticket.api import (TicketResource, SubTicketResource, ArtifactResource,21from ticket.api import (TicketResource, SubTicketResource, ArtifactResource,
22 SourcePackageUploadResource, FullSubTicketResource,22 SourcePackageUploadResource, FullSubTicketResource,
23 FullTicketResource, FullArtifactResource,23 FullTicketResource, FullArtifactResource,
24 SubTicketUpdateStatusResource,24 TicketStatusResource, TicketUpdateStatusResource,
25 SubTicketStatusResource,25 SubTicketUpdateStatusResource, NextTicketResource,
26 TicketStatusResource, TicketUpdateStatusResource)26 SubTicketStatusResource)
2727
28admin.autodiscover()28admin.autodiscover()
29v1_api = Api(api_name='v1')29v1_api = Api(api_name='v1')
@@ -41,6 +41,7 @@
41v1_api.register(SubTicketStatusResource())41v1_api.register(SubTicketStatusResource())
42v1_api.register(TicketUpdateStatusResource())42v1_api.register(TicketUpdateStatusResource())
43v1_api.register(TicketStatusResource())43v1_api.register(TicketStatusResource())
44v1_api.register(NextTicketResource())
4445
45urlpatterns = patterns(46urlpatterns = patterns(
46 '',47 '',

Subscribers

People subscribed via source and target branches