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

Proposed by Chris Johnston
Status: Merged
Approved by: Chris Johnston
Approved revision: 124
Merged at revision: 130
Proposed branch: lp:~cjohnston/ubuntu-ci-services-itself/ts-opentickets-api
Merge into: lp:ubuntu-ci-services-itself
Diff against target: 200 lines (+136/-3)
4 files modified
docs/components/ticket-system.rst (+10/-1)
ticket_system/ticket/api.py (+14/-0)
ticket_system/ticket/tests/test_read_api.py (+110/-1)
ticket_system/ticket_system/urls.py (+2/-1)
To merge this branch: bzr merge lp:~cjohnston/ubuntu-ci-services-itself/ts-opentickets-api
Reviewer Review Type Date Requested Status
Ursula Junque (community) Approve
Review via email: mp+202339@code.launchpad.net

Commit message

Add an open tickets API call to the TS for the WebUI

Description of the change

The WebUI needs a way to only show open tickets. This provides an API call for that.

To post a comment you must log in.
Revision history for this message
Ursula Junque (ursinha) wrote :

Looks good. I'd probably try to write some helpers in tests so the code could become a bit smaller, but that's up to you. Approving.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'docs/components/ticket-system.rst'
2--- docs/components/ticket-system.rst 2014-01-17 01:32:56 +0000
3+++ docs/components/ticket-system.rst 2014-01-20 16:43:21 +0000
4@@ -175,7 +175,7 @@
5
6 curl --dump-header - http://localhost:8000/api/v1/ticket/1/
7
8-Get Next Ticket
9+Get next ticket
10 ~~~~~~~~~~~~~~~
11
12 Show the current in progress, or the first pending ticket.
13@@ -184,6 +184,15 @@
14
15 curl --dump-header - http://localhost:8000/api/v1/next/
16
17+Get open tickets
18+~~~~~~~~~~~~~~~~
19+
20+Show a list of all open tickets.
21+
22+::
23+
24+ curl --dump-header - http://localhost:8000/api/v1/opentickets/
25+
26 Get ticket status
27 ~~~~~~~~~~~~~~~~~
28
29
30=== modified file 'ticket_system/ticket/api.py'
31--- ticket_system/ticket/api.py 2014-01-16 15:41:39 +0000
32+++ ticket_system/ticket/api.py 2014-01-20 16:43:21 +0000
33@@ -54,6 +54,20 @@
34 authorization = Authorization()
35
36
37+class OpenTicketResource(TicketTranslatedResource):
38+
39+ class Meta:
40+ queryset = Ticket.objects.all()
41+ allowed_methods = ['get']
42+ resource_name = 'opentickets'
43+
44+ def get_object_list(self, request):
45+ exclude = [TicketWorkflowStep.NEW.value,
46+ TicketWorkflowStep.COMPLETED.value]
47+ return super(OpenTicketResource, self).get_object_list(
48+ request).exclude(current_workflow_step__in=exclude).order_by('id')
49+
50+
51 class SourcePackageUploadResource(ModelResource):
52 sourcepackage = fields.ToOneField(SourcePackageResource, 'sourcepackage',
53 full=True)
54
55=== modified file 'ticket_system/ticket/tests/test_read_api.py'
56--- ticket_system/ticket/tests/test_read_api.py 2014-01-15 00:32:04 +0000
57+++ ticket_system/ticket/tests/test_read_api.py 2014-01-20 16:43:21 +0000
58@@ -31,7 +31,6 @@
59 self.subticket = mommy.make('SubTicket', ticket=self.ticket,
60 source_package_upload=self.spu)
61 self.artifact = mommy.make('Artifact', subticket=self.subticket)
62- self.maxDiff = None
63
64 def test_get_artifact_api(self):
65 obj = self.getResource('artifact/')
66@@ -249,3 +248,113 @@
67 u'status': unicode(get_enum_title(self.subticket.status,
68 SubTicketWorkflowStepStatus)),
69 })
70+
71+
72+class GetOpenTicketsTest(TastypieTestCase):
73+ """
74+ Test that /opentickets/ returns only in progress and queued tickets.
75+ """
76+
77+ def setUp(self):
78+ super(GetOpenTicketsTest, self).setUp('/api/v1')
79+ self.ticket_1 = mommy.make(
80+ 'Ticket', current_workflow_step=int(TicketWorkflowStep.NEW))
81+ self.ticket_2 = mommy.make(
82+ 'Ticket', current_workflow_step=int(TicketWorkflowStep.QUEUED))
83+ self.ticket_3 = mommy.make(
84+ 'Ticket', current_workflow_step=int(
85+ TicketWorkflowStep.PKG_BUILDING))
86+ self.ticket_4 = mommy.make(
87+ 'Ticket', current_workflow_step=int(
88+ TicketWorkflowStep.IMAGE_BUILDING))
89+ self.ticket_5 = mommy.make(
90+ 'Ticket', current_workflow_step=int(
91+ TicketWorkflowStep.IMAGE_TESTING))
92+ self.ticket_6 = mommy.make(
93+ 'Ticket', current_workflow_step=int(
94+ TicketWorkflowStep.PKG_PUBLISHING))
95+ self.ticket_7 = mommy.make(
96+ 'Ticket', current_workflow_step=int(TicketWorkflowStep.COMPLETED))
97+ self.sourcepackage = mommy.make('SourcePackage')
98+ self.spu = mommy.make('SourcePackageUpload',
99+ sourcepackage=self.sourcepackage)
100+ self.subticket_1 = mommy.make('SubTicket', ticket=self.ticket_1,
101+ source_package_upload=self.spu)
102+ self.artifact_1 = mommy.make('Artifact', subticket=self.subticket_1)
103+ self.subticket_2 = mommy.make('SubTicket', ticket=self.ticket_2,
104+ source_package_upload=self.spu)
105+ self.artifact_2 = mommy.make('Artifact', subticket=self.subticket_2)
106+ self.subticket_3 = mommy.make('SubTicket', ticket=self.ticket_3,
107+ source_package_upload=self.spu)
108+ self.artifact_3 = mommy.make('Artifact', subticket=self.subticket_3)
109+ self.subticket_4 = mommy.make('SubTicket', ticket=self.ticket_4,
110+ source_package_upload=self.spu)
111+ self.artifact_4 = mommy.make('Artifact', subticket=self.subticket_4)
112+ self.subticket_5 = mommy.make('SubTicket', ticket=self.ticket_5,
113+ source_package_upload=self.spu)
114+ self.artifact_5 = mommy.make('Artifact', subticket=self.subticket_5)
115+ self.subticket_6 = mommy.make('SubTicket', ticket=self.ticket_6,
116+ source_package_upload=self.spu)
117+ self.artifact_6 = mommy.make('Artifact', subticket=self.subticket_6)
118+ self.subticket_7 = mommy.make('SubTicket', ticket=self.ticket_7,
119+ source_package_upload=self.spu)
120+ self.artifact_7 = mommy.make('Artifact', subticket=self.subticket_7)
121+
122+ def test_total_open_tickets(self):
123+ obj = self.getResource('opentickets/')
124+ self.assertEqual(len(obj['objects']), 5)
125+
126+ def test_open_ticket_syntax(self):
127+ self.ticket_2.current_workflow_step = int(
128+ TicketWorkflowStep.NEW)
129+ self.ticket_2.save()
130+ self.ticket_3.current_workflow_step = int(
131+ TicketWorkflowStep.NEW)
132+ self.ticket_3.save()
133+ self.ticket_4.current_workflow_step = int(
134+ TicketWorkflowStep.NEW)
135+ self.ticket_4.save()
136+ self.ticket_5.current_workflow_step = int(
137+ TicketWorkflowStep.NEW)
138+ self.ticket_5.save()
139+ obj = self.getResource('opentickets/')
140+ self.assertEqual(obj['objects'][0], {
141+ u'added_binaries': self.ticket_6.added_binaries,
142+ u'status': unicode(get_enum_title(self.ticket_6.status,
143+ TicketWorkflowStepStatus)),
144+ u'created': unicode(self.ticket_6.created.strftime(
145+ "%Y-%m-%dT%H:%M:%S.%f")),
146+ u'current_workflow_step': unicode(get_enum_title(
147+ self.ticket_6.current_workflow_step,
148+ TicketWorkflowStep)),
149+ u'description': unicode(self.ticket_6.description),
150+ u'title': unicode(self.ticket_6.title),
151+ u'bug_id': self.ticket_6.bug_id,
152+ u'owner': unicode(self.ticket_6.owner),
153+ u'removed_binaries': self.ticket_6.removed_binaries,
154+ u'base_image': unicode(self.ticket_6.base_image),
155+ u'id': self.ticket_6.pk,
156+ u'resource_uri': u'/api/v1/opentickets/{0}/'.format(
157+ self.ticket_6.pk),
158+ u'updated': unicode(self.ticket_6.updated.strftime(
159+ "%Y-%m-%dT%H:%M:%S.%f")),
160+ })
161+
162+ def test_no_open_tickets(self):
163+ self.ticket_2.current_workflow_step = int(
164+ TicketWorkflowStep.NEW)
165+ self.ticket_2.save()
166+ self.ticket_3.current_workflow_step = int(
167+ TicketWorkflowStep.NEW)
168+ self.ticket_3.save()
169+ self.ticket_4.current_workflow_step = int(
170+ TicketWorkflowStep.NEW)
171+ self.ticket_4.save()
172+ self.ticket_5.current_workflow_step = int(
173+ TicketWorkflowStep.NEW)
174+ self.ticket_5.save()
175+ self.ticket_6.current_workflow_step = int(
176+ TicketWorkflowStep.NEW)
177+ self.ticket_6.save()
178+ obj = self.getResource('opentickets/')
179+ self.assertEqual(len(obj['objects']), 0)
180
181=== modified file 'ticket_system/ticket_system/urls.py'
182--- ticket_system/ticket_system/urls.py 2014-01-15 21:12:09 +0000
183+++ ticket_system/ticket_system/urls.py 2014-01-20 16:43:21 +0000
184@@ -23,7 +23,7 @@
185 FullTicketResource, FullArtifactResource,
186 TicketStatusResource, TicketUpdateStatusResource,
187 SubTicketUpdateStatusResource, NextTicketResource,
188- SubTicketStatusResource)
189+ SubTicketStatusResource, OpenTicketResource)
190
191 admin.autodiscover()
192 v1_api = Api(api_name='v1')
193@@ -42,6 +42,7 @@
194 v1_api.register(TicketUpdateStatusResource())
195 v1_api.register(TicketStatusResource())
196 v1_api.register(NextTicketResource())
197+v1_api.register(OpenTicketResource())
198
199 urlpatterns = patterns(
200 '',

Subscribers

People subscribed via source and target branches