Merge lp:~sinzui/launchpad/api-bug-tracker-0 into lp:launchpad

Proposed by Curtis Hovey
Status: Merged
Approved by: Edwin Grubbs
Approved revision: no longer in the source branch.
Merged at revision: not available
Proposed branch: lp:~sinzui/launchpad/api-bug-tracker-0
Merge into: lp:launchpad
Diff against target: 164 lines (+106/-1)
3 files modified
lib/canonical/launchpad/security.py (+5/-0)
lib/lp/bugs/interfaces/bugtracker.py (+24/-1)
lib/lp/bugs/stories/webservice/xx-bug-tracker.txt (+77/-0)
To merge this branch: bzr merge lp:~sinzui/launchpad/api-bug-tracker-0
Reviewer Review Type Date Requested Status
Edwin Grubbs (community) code Approve
Review via email: mp+21061@code.launchpad.net

Description of the change

This is my branch to export bugtrackerset over the api.

    lp:~sinzui/launchpad/api-bug-tracker-0
    Diff size: 129
    Launchpad bug: https://bugs.launchpad.net/bugs/id
    Test command: ./bin/test -vv \
        -t webservice/xx-bug-tracker
    Pre-implementation: Edwin
    Target release: 10.03

Export bugtrackerset over the api
---------------------------------

Export the bugtrackerset of the api so that ensureBugTracker() can be
used in API operations. We want a formoverlay to register an new bugtracker
when user discovers that the bug tracker he wants to set to the project is
not registered.

Rules
-----

    * Export IBugTrackerSet and ensureBugTracker

QA
--

    * Verify that you can get the IBugTrackerSet via anonymous api
    * Verify that you can use ensureBugTracker() to register a tracker
      logged in.

Lint
----

Linting changed files:
  lib/canonical/launchpad/security.py
  lib/lp/bugs/interfaces/bugtracker.py
  lib/lp/bugs/stories/webservice/xx-bug-tracker.txt

Test
----

    * lib/lp/bugs/stories/webservice/xx-bug-tracker.txt
      * Added tests to verify that IBugTrakerSet is exported for anonymous
        Use. Added a test to verify that ensureBugTracker can create a
        new bugtracker.

Implementation
--------------

    * lib/canonical/launchpad/security.py
      * Added a security checker for IBugTracker to ensure anonymous users
        can see them.
    * lib/lp/bugs/interfaces/bugtracker.py
      * Exported IbugTrackerSet with search and ensureBugTracker methods.

To post a comment you must log in.
Revision history for this message
Edwin Grubbs (edwin-grubbs) wrote :

Hi Curtis,

This branch looks good. Just one comment below.

merge-conditional

-Edwin

>=== added file 'lib/lp/bugs/stories/webservice/xx-bug-tracker.txt'
>--- lib/lp/bugs/stories/webservice/xx-bug-tracker.txt>*1970-01-01 00:00:00 +0000
>+++ lib/lp/bugs/stories/webservice/xx-bug-tracker.txt>*2010-03-10 16:34:01 +0000
>@@ -0,0 +1,62 @@
>+Bug tracker
>+===========
>+
>+The bug tracker set is exported as a collection at /bugs/bugtrackers that
>+any user can access.
>+
>+ >>> from lazr.restful.testing.webservice import (
>+ ... pprint_collection, pprint_entry)
>+
>+ >>> bug_tracker_collection = anon_webservice.get(
>+ ... '/bugs/bugtrackers').jsonBody()
>+ >>> pprint_collection(bug_tracker_collection)
>+ next_collection_link:
>+ u'http://api.launchpad.dev/beta/bugs/bugtrackers?ws.start=5&ws.size=5'

Normally, "api.launchpad.dev/beta" is replaced with "..." so that the test doesn't break when the default version changes.
Please replace all the other instances also.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/canonical/launchpad/security.py'
--- lib/canonical/launchpad/security.py 2010-03-10 00:46:20 +0000
+++ lib/canonical/launchpad/security.py 2010-03-10 19:03:28 +0000
@@ -1297,6 +1297,11 @@
1297 user.inTeam(translation_group.owner)))1297 user.inTeam(translation_group.owner)))
12981298
12991299
1300class ViewBugTracker(AnonymousAuthorization):
1301 """Anyone can view a bug tracker."""
1302 usedfor = IBugTracker
1303
1304
1300class EditBugTracker(AuthorizationBase):1305class EditBugTracker(AuthorizationBase):
1301 permission = 'launchpad.Edit'1306 permission = 'launchpad.Edit'
1302 usedfor = IBugTracker1307 usedfor = IBugTracker
13031308
=== modified file 'lib/lp/bugs/interfaces/bugtracker.py'
--- lib/lp/bugs/interfaces/bugtracker.py 2009-12-25 16:36:53 +0000
+++ lib/lp/bugs/interfaces/bugtracker.py 2010-03-10 19:03:28 +0000
@@ -32,7 +32,10 @@
3232
33from lazr.lifecycle.snapshot import doNotSnapshot33from lazr.lifecycle.snapshot import doNotSnapshot
34from lazr.restful.declarations import (34from lazr.restful.declarations import (
35 export_as_webservice_entry, exported)35 call_with, collection_default_content, export_as_webservice_collection,
36 export_as_webservice_entry, export_factory_operation,
37 export_read_operation, exported, operation_parameters,
38 operation_returns_entry, rename_parameters_as, REQUEST_USER)
36from lazr.restful.fields import CollectionField, Reference39from lazr.restful.fields import CollectionField, Reference
3740
3841
@@ -325,6 +328,7 @@
325 Each BugTracker is a distinct instance of a bug tracking tool. For328 Each BugTracker is a distinct instance of a bug tracking tool. For
326 example, bugzilla.mozilla.org is distinct from bugzilla.gnome.org.329 example, bugzilla.mozilla.org is distinct from bugzilla.gnome.org.
327 """330 """
331 export_as_webservice_collection(IBugTracker)
328332
329 title = Attribute('Title')333 title = Attribute('Title')
330334
@@ -336,6 +340,10 @@
336 If no tracker with the given id exists, return default.340 If no tracker with the given id exists, return default.
337 """341 """
338342
343 @operation_parameters(
344 name=TextLine(title=u"The bug tracker name", required=True))
345 @operation_returns_entry(IBugTracker)
346 @export_read_operation()
339 def getByName(name, default=None):347 def getByName(name, default=None):
340 """Get a BugTracker by its name.348 """Get a BugTracker by its name.
341349
@@ -352,9 +360,23 @@
352 def __iter__():360 def __iter__():
353 """Iterate through BugTrackers."""361 """Iterate through BugTrackers."""
354362
363 @rename_parameters_as(baseurl='base_url')
364 @operation_parameters(
365 baseurl=TextLine(
366 title=u"The base URL of the bug tracker", required=True))
367 @operation_returns_entry(IBugTracker)
368 @export_read_operation()
355 def queryByBaseURL(baseurl):369 def queryByBaseURL(baseurl):
356 """Return one or None BugTracker's by baseurl"""370 """Return one or None BugTracker's by baseurl"""
357371
372 @call_with(owner=REQUEST_USER)
373 @rename_parameters_as(
374 baseurl='base_url', bugtrackertype='bug_tracker_type',
375 contactdetails='contat_details')
376 @export_factory_operation(
377 IBugTracker,
378 ['baseurl', 'bugtrackertype', 'title', 'summary',
379 'contactdetails', 'name'])
358 def ensureBugTracker(baseurl, owner, bugtrackertype,380 def ensureBugTracker(baseurl, owner, bugtrackertype,
359 title=None, summary=None, contactdetails=None, name=None):381 title=None, summary=None, contactdetails=None, name=None):
360 """Make sure that there is a bugtracker for the given base url.382 """Make sure that there is a bugtracker for the given base url.
@@ -362,6 +384,7 @@
362 If not, create one using the given attributes.384 If not, create one using the given attributes.
363 """385 """
364386
387 @collection_default_content()
365 def search():388 def search():
366 """Search all the IBugTrackers in the system."""389 """Search all the IBugTrackers in the system."""
367390
368391
=== added file 'lib/lp/bugs/stories/webservice/xx-bug-tracker.txt'
--- lib/lp/bugs/stories/webservice/xx-bug-tracker.txt 1970-01-01 00:00:00 +0000
+++ lib/lp/bugs/stories/webservice/xx-bug-tracker.txt 2010-03-10 19:03:28 +0000
@@ -0,0 +1,77 @@
1Bug tracker
2===========
3
4The bug tracker set is exported as a collection at /bugs/bugtrackers that
5any user can access.
6
7 >>> from lazr.restful.testing.webservice import (
8 ... pprint_collection, pprint_entry)
9
10 >>> bug_tracker_collection = anon_webservice.get(
11 ... '/bugs/bugtrackers').jsonBody()
12 >>> pprint_collection(bug_tracker_collection)
13 next_collection_link: u'http://.../bugs/bugtrackers?ws.start=5&ws.size=5'
14 resource_type_link: u'http://.../#bug_trackers'
15 start: 0
16 total_size: 8
17 ---
18 active: True
19 base_url: u'https://bugzilla.mozilla.org/'
20 base_url_aliases: []
21 bug_tracker_type: u'Bugzilla'
22 contact_details: u'Carrier pigeon only'
23 has_lp_plugin: None
24 name: u'mozilla.org'
25 registrant_link: u'http://.../~name12'
26 resource_type_link: u'http://.../#bug_tracker'
27 self_link: u'http://.../bugs/bugtrackers/mozilla.org'
28 summary: u'The Mozilla.org bug tracker is the grand-daddy of ...'
29 title: u'The Mozilla.org Bug Tracker'
30 watches_collection_link: u'http:.../bugs/bugtrackers/mozilla.org/watches'
31 --- ...
32
33A bug tracker can be retrieved using the the bug tracker collection's
34getByName named operation.
35
36 >>> bug_tracker = anon_webservice.named_get(
37 ... '/bugs/bugtrackers', 'getByName',
38 ... name='gnome-bugzilla').jsonBody()
39 >>> print bug_tracker['name']
40 gnome-bugzilla
41
42A bug tracker can be retrieved using the the bug tracker collection's
43queryByBaseURL named operation.
44
45 >>> bug_tracker = anon_webservice.named_get(
46 ... '/bugs/bugtrackers', 'queryByBaseURL',
47 ... base_url='https://bugzilla.mozilla.org/').jsonBody()
48 >>> print bug_tracker['name']
49 mozilla.org
50
51The bug tracker set provides the ensureBugTracker named operation that a
52logged in user can call to create a bug tracker.
53
54 >>> params = dict(
55 ... base_url='http://wombat.zz/', bug_tracker_type='Bugzilla',
56 ... name='wombat', title='Wombat title', summary='Wombat summary',
57 ... contact_details='big-nose@wombat.zz')
58 >>> print webservice.named_post(
59 ... '/bugs/bugtrackers', 'ensureBugTracker', **params)
60 HTTP/1.1 201 Created ...
61 Location: http://.../bugs/bugtrackers/wombat ...
62
63 >>> bug_tracker = webservice.get('/bugs/bugtrackers/wombat').jsonBody()
64 >>> pprint_entry(bug_tracker)
65 active: True
66 base_url: u'http://wombat.zz/'
67 base_url_aliases: []
68 bug_tracker_type: u'Bugzilla'
69 contact_details: None
70 has_lp_plugin: False
71 name: u'wombat'
72 registrant_link: u'http://.../~salgado'
73 resource_type_link: u'http://.../#bug_tracker'
74 self_link: u'http://.../bugs/bugtrackers/wombat'
75 summary: u'Wombat summary'
76 title: u'Wombat title'
77 watches_collection_link: u'http://.../bugs/bugtrackers/wombat/watches'