Merge lp:~leonardr/launchpad/web-link into lp:launchpad

Proposed by Leonard Richardson
Status: Merged
Approved by: Tim Penhey
Approved revision: no longer in the source branch.
Merged at revision: 12324
Proposed branch: lp:~leonardr/launchpad/web-link
Merge into: lp:launchpad
Diff against target: 981 lines (+108/-61)
37 files modified
lib/canonical/launchpad/browser/librarian.py (+1/-3)
lib/canonical/launchpad/doc/canonical_url_examples.txt (+1/-1)
lib/canonical/launchpad/webapp/configure.zcml (+1/-1)
lib/canonical/launchpad/webapp/interfaces.py (+0/-8)
lib/lp/app/doc/tales.txt (+2/-2)
lib/lp/blueprints/tests/test_webservice.py (+2/-1)
lib/lp/bugs/browser/configure.zcml (+6/-3)
lib/lp/bugs/browser/tests/buglinktarget-views.txt (+2/-2)
lib/lp/bugs/interfaces/bugnomination.py (+1/-1)
lib/lp/bugs/interfaces/bugsubscription.py (+1/-1)
lib/lp/bugs/stories/webservice/xx-bug-tracker.txt (+2/-0)
lib/lp/bugs/stories/webservice/xx-bug.txt (+17/-2)
lib/lp/code/interfaces/diff.py (+1/-1)
lib/lp/code/stories/webservice/xx-branch.txt (+1/-1)
lib/lp/code/stories/webservice/xx-branchmergeproposal.txt (+5/-1)
lib/lp/code/stories/webservice/xx-branchsubscription.txt (+2/-0)
lib/lp/hardwaredb/interfaces/hwdb.py (+9/-9)
lib/lp/registry/interfaces/productrelease.py (+1/-1)
lib/lp/registry/interfaces/structuralsubscription.py (+1/-1)
lib/lp/registry/interfaces/wikiname.py (+1/-1)
lib/lp/registry/stories/webservice/xx-distribution-mirror.txt (+4/-0)
lib/lp/registry/stories/webservice/xx-distribution-source-package.txt (+2/-1)
lib/lp/registry/stories/webservice/xx-distribution.txt (+2/-0)
lib/lp/registry/stories/webservice/xx-distroseries.txt (+1/-1)
lib/lp/registry/stories/webservice/xx-person.txt (+5/-1)
lib/lp/registry/stories/webservice/xx-project-registry.txt (+14/-4)
lib/lp/services/worlddata/interfaces/country.py (+2/-1)
lib/lp/soyuz/interfaces/archivedependency.py (+1/-1)
lib/lp/soyuz/interfaces/archivepermission.py (+1/-1)
lib/lp/soyuz/interfaces/packageset.py (+3/-3)
lib/lp/soyuz/interfaces/publishing.py (+2/-2)
lib/lp/soyuz/interfaces/queue.py (+1/-1)
lib/lp/soyuz/stories/webservice/xx-archive.txt (+5/-0)
lib/lp/soyuz/stories/webservice/xx-builds.txt (+3/-1)
lib/lp/soyuz/stories/webservice/xx-distroarchseries.txt (+1/-1)
lib/lp/translations/stories/webservice/xx-potemplate.txt (+1/-0)
versions.cfg (+3/-3)
To merge this branch: bzr merge lp:~leonardr/launchpad/web-link
Reviewer Review Type Date Requested Status
Tim Penhey (community) Approve
Review via email: mp+47258@code.launchpad.net

Commit message

[r=thumper][bug=316694] Add a web_link property to the JSON representation of all web service entries that correspond to some page on the Launchpad website.

Description of the change

Many of the objects published over the Launchpad web service correspond to some page on the Launchpad website. To take a simple example, the entry at https://api.launchpad.net/devel/~leonardr corresponds to the web page at https://launchpad.net/~leonardr.

With this branch in place, the JSON representation of https://api.launchpad.net/devel/~leonardr will include a "web_link" with a value of "https://launchpad.net/~leonardr". In other words, the web service will link to the web site, where appropriate.

This branch removes IWebBrowserOriginatingRequest and replaces it with the identically-named interface in lazr.restful. The fact that Launchpad defines an adapter between IWebServiceRequest and IWebBrowserOriginatingRequest (an adapter previously used only for the librarian) activates the lazr.restful web_link feature.

However, not *every* object published over the Launchpad web service corresponds to some page on the website. I was able to find the following exceptions: bug nominations, bug subscriptions, preview diffs, product release files, structural subscriptions, wiki names, countries, archive dependencies, archive permissions, packagesets, publishing histories, and package uploads, along with everything related to the HWDB. I annotated the interfaces of all these exceptions by adding "publish_web_link=False" to their export_as_webservice_entry calls.

It's possible that I missed more exceptions. The worst that will happen is that we'll be publishing web_links that don't work, and when someone notices we'll be able to add another exception.

I changed the <browser:url> stanzas in three places in lib/lp/bugs/browser.zcml. In all cases I set the rootsite attribute to "bugs". For ICVE and IBugWatch, I noticed that the web_link being generated started with "launchpad.dev", not "bugs.launchpad.dev". It's likely that links to CVEs and bug watches (if there are any) have been slightly wrong all this time. For IBugNomination it's not strictly necessary to set a rootsite, since bug nominations are only published in the web service (which has its own rootsite), but I set it anyway so that the URL will be correct if bug nominations are ever published on the website.

The bulk of this diff is changes to tests. These changes may look fairly pointless--I'm just adding 'web_link' to a lot of representations--but they're important, or at least they were important during implementation. They demonstrate which entries publish web_link and which don't. When I first ran the Launchpad web service tests against the new version of lazr.restful, I got a huge number of failures because web_link was everywhere and the tests didn't expect it. I had to go through each failure and determine whether or not web_link *should* be present. I changed the test if web_link should be present, and changed the interface (making the existing test work again) if web_link should not be present.

Basically, I think the changes to the tests are important. I *don't* think it's particularly important to test the specific values for web_link. We could improve readibility with very little loss of coverage by replacing all these lines:

web_link: 'http://launchpad.../foo'

with this:

web_link: '...'

IOW just verifying that there *is* a web link, since in Launchpad it's always similar to the self_link,

I thought that I would catch a lot of 'incorrect rootsite' type errors by printing out the web_link in some detail, but as I mentioned, I only caught two: ICVE and IBugSubscription.

Hopefully this branch isn't too confusing. There's a lot of details but conceptually it's pretty simple, I think.

To post a comment you must log in.
Revision history for this message
Tim Penhey (thumper) wrote :

Looks good to me. Thanks for getting this working.

review: Approve
Revision history for this message
Martin Pool (mbp) wrote :

As this lands, please update the API developer guides and maybe mention it on the blog.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/canonical/launchpad/browser/librarian.py'
--- lib/canonical/launchpad/browser/librarian.py 2010-12-20 17:42:47 +0000
+++ lib/canonical/launchpad/browser/librarian.py 2011-02-03 19:06:35 +0000
@@ -29,9 +29,7 @@
29from canonical.launchpad.interfaces.librarian import ILibraryFileAlias29from canonical.launchpad.interfaces.librarian import ILibraryFileAlias
30from canonical.launchpad.layers import WebServiceLayer30from canonical.launchpad.layers import WebServiceLayer
31from canonical.launchpad.webapp.authorization import check_permission31from canonical.launchpad.webapp.authorization import check_permission
32from canonical.launchpad.webapp.interfaces import (32from lazr.restful.interfaces import IWebBrowserOriginatingRequest
33 IWebBrowserOriginatingRequest,
34 )
35from canonical.launchpad.webapp.publisher import (33from canonical.launchpad.webapp.publisher import (
36 canonical_url,34 canonical_url,
37 LaunchpadView,35 LaunchpadView,
3836
=== modified file 'lib/canonical/launchpad/doc/canonical_url_examples.txt'
--- lib/canonical/launchpad/doc/canonical_url_examples.txt 2011-01-11 03:29:37 +0000
+++ lib/canonical/launchpad/doc/canonical_url_examples.txt 2011-02-03 19:06:35 +0000
@@ -287,7 +287,7 @@
287 >>> from lp.bugs.interfaces.bugnomination import IBugNominationSet287 >>> from lp.bugs.interfaces.bugnomination import IBugNominationSet
288 >>> bug_nomination = getUtility(IBugNominationSet).get(1)288 >>> bug_nomination = getUtility(IBugNominationSet).get(1)
289 >>> canonical_url(bug_nomination)289 >>> canonical_url(bug_nomination)
290 u'http://launchpad.dev/bugs/1/nominations/1'290 u'http://bugs.launchpad.dev/bugs/1/nominations/1'
291291
292292
293== Remote Bug Trackers and Remote Bugs ==293== Remote Bug Trackers and Remote Bugs ==
294294
=== modified file 'lib/canonical/launchpad/webapp/configure.zcml'
--- lib/canonical/launchpad/webapp/configure.zcml 2011-02-02 15:43:31 +0000
+++ lib/canonical/launchpad/webapp/configure.zcml 2011-02-03 19:06:35 +0000
@@ -55,7 +55,7 @@
55 />55 />
56 <adapter56 <adapter
57 for="canonical.launchpad.layers.WebServiceLayer"57 for="canonical.launchpad.layers.WebServiceLayer"
58 provides="canonical.launchpad.webapp.interfaces.IWebBrowserOriginatingRequest"58 provides="lazr.restful.interfaces.IWebBrowserOriginatingRequest"
59 factory="canonical.launchpad.webapp.servers.web_service_request_to_browser_request"59 factory="canonical.launchpad.webapp.servers.web_service_request_to_browser_request"
60 />60 />
6161
6262
=== modified file 'lib/canonical/launchpad/webapp/interfaces.py'
--- lib/canonical/launchpad/webapp/interfaces.py 2010-12-16 22:42:28 +0000
+++ lib/canonical/launchpad/webapp/interfaces.py 2011-02-03 19:06:35 +0000
@@ -854,14 +854,6 @@
854 """854 """
855855
856856
857class IWebBrowserOriginatingRequest(Interface):
858 """Marker interface for converting webservice requests into webapp ones.
859
860 It's used in the webservice domain for calculating webapp URLs, for
861 instance, `ProxiedLibraryFileAlias`.
862 """
863
864
865# XXX mars 2010-07-14 bug=598816857# XXX mars 2010-07-14 bug=598816
866#858#
867# We need a conditional import of the request events until the real events859# We need a conditional import of the request events until the real events
868860
=== modified file 'lib/lp/app/doc/tales.txt'
--- lib/lp/app/doc/tales.txt 2010-11-24 18:57:14 +0000
+++ lib/lp/app/doc/tales.txt 2011-02-03 19:06:35 +0000
@@ -806,10 +806,10 @@
806The "standard" 'url' name is supported:806The "standard" 'url' name is supported:
807807
808 >>> test_tales("bugwatch/fmt:url", bugwatch=sf_bugwatch)808 >>> test_tales("bugwatch/fmt:url", bugwatch=sf_bugwatch)
809 u'/bugs/12/+watch/13'809 u'http://bugs.launchpad.dev/bugs/12/+watch/13'
810810
811 >>> test_tales("bugwatch/fmt:url", bugwatch=email_bugwatch)811 >>> test_tales("bugwatch/fmt:url", bugwatch=email_bugwatch)
812 u'/bugs/12/+watch/14'812 u'http://bugs.launchpad.dev/bugs/12/+watch/14'
813813
814As are 'external-link' and 'external-link-short', which help when hiding814As are 'external-link' and 'external-link-short', which help when hiding
815email addresses from users who are not logged in:815email addresses from users who are not logged in:
816816
=== modified file 'lib/lp/blueprints/tests/test_webservice.py'
--- lib/lp/blueprints/tests/test_webservice.py 2011-01-06 15:26:14 +0000
+++ lib/lp/blueprints/tests/test_webservice.py 2011-02-03 19:06:35 +0000
@@ -52,7 +52,8 @@
52 webservice = webservice_for_person(user)52 webservice = webservice_for_person(user)
53 response = webservice.get(53 response = webservice.get(
54 '/%s/+spec/%s' % (spec.product.name, spec.name))54 '/%s/+spec/%s' % (spec.product.name, spec.name))
55 expected_keys = [u'self_link', u'http_etag', u'resource_type_link']55 expected_keys = [u'self_link', u'http_etag', u'resource_type_link',
56 u'web_link']
56 self.assertEqual(response.status, 200)57 self.assertEqual(response.status, 200)
57 self.assertContentEqual(expected_keys, response.jsonBody().keys())58 self.assertContentEqual(expected_keys, response.jsonBody().keys())
5859
5960
=== modified file 'lib/lp/bugs/browser/configure.zcml'
--- lib/lp/bugs/browser/configure.zcml 2011-01-11 23:01:02 +0000
+++ lib/lp/bugs/browser/configure.zcml 2011-02-03 19:06:35 +0000
@@ -912,7 +912,8 @@
912 <browser:url912 <browser:url
913 for="lp.bugs.interfaces.cve.ICve"913 for="lp.bugs.interfaces.cve.ICve"
914 path_expression="sequence"914 path_expression="sequence"
915 parent_utility="lp.bugs.interfaces.cve.ICveSet"/>915 parent_utility="lp.bugs.interfaces.cve.ICveSet"
916 rootsite="bugs" />
916 <browser:defaultView917 <browser:defaultView
917 for="lp.bugs.interfaces.cve.ICve"918 for="lp.bugs.interfaces.cve.ICve"
918 name="+index"/>919 name="+index"/>
@@ -1121,14 +1122,16 @@
1121 <browser:url1122 <browser:url
1122 for="lp.bugs.interfaces.bugnomination.IBugNomination"1123 for="lp.bugs.interfaces.bugnomination.IBugNomination"
1123 path_expression="string:nominations/${id}"1124 path_expression="string:nominations/${id}"
1124 attribute_to_parent="bug"/>1125 attribute_to_parent="bug"
1126 rootsite="bugs" />
1125 </facet>1127 </facet>
1126 <facet1128 <facet
1127 facet="bugs">1129 facet="bugs">
1128 <browser:url1130 <browser:url
1129 for="lp.bugs.interfaces.bugwatch.IBugWatch"1131 for="lp.bugs.interfaces.bugwatch.IBugWatch"
1130 path_expression="string:+watch/${id}"1132 path_expression="string:+watch/${id}"
1131 attribute_to_parent="bug"/>1133 attribute_to_parent="bug"
1134 rootsite="bugs"/>
1132 <browser:defaultView1135 <browser:defaultView
1133 for="lp.bugs.interfaces.bugwatch.IBugWatch"1136 for="lp.bugs.interfaces.bugwatch.IBugWatch"
1134 name="+edit"/>1137 name="+edit"/>
11351138
=== modified file 'lib/lp/bugs/browser/tests/buglinktarget-views.txt'
--- lib/lp/bugs/browser/tests/buglinktarget-views.txt 2010-10-18 22:24:59 +0000
+++ lib/lp/bugs/browser/tests/buglinktarget-views.txt 2011-02-03 19:06:35 +0000
@@ -32,7 +32,7 @@
32 Link a bug report32 Link a bug report
3333
34 >>> print view.cancel_url34 >>> print view.cancel_url
35 http://launchpad.dev/bugs/cve/2005-273035 http://bugs.launchpad.dev/bugs/cve/2005-2730
3636
37It has a simple widget to enter the bug number or nickname of the bug to link37It has a simple widget to enter the bug number or nickname of the bug to link
38to. After it links the bug, it sends a ObjectModifiedEvent.38to. After it links the bug, it sends a ObjectModifiedEvent.
@@ -86,7 +86,7 @@
86 Remove links to bug reports86 Remove links to bug reports
8787
88 >>> print view.cancel_url88 >>> print view.cancel_url
89 http://launchpad.dev/bugs/cve/2005-273089 http://bugs.launchpad.dev/bugs/cve/2005-2730
9090
91After removing the bugs, it sends a SQLObjectModified event.91After removing the bugs, it sends a SQLObjectModified event.
9292
9393
=== modified file 'lib/lp/bugs/interfaces/bugnomination.py'
--- lib/lp/bugs/interfaces/bugnomination.py 2010-08-20 20:31:18 +0000
+++ lib/lp/bugs/interfaces/bugnomination.py 2011-02-03 19:06:35 +0000
@@ -105,7 +105,7 @@
105105
106 A nomination can apply to an IDistroSeries or an IProductSeries.106 A nomination can apply to an IDistroSeries or an IProductSeries.
107 """107 """
108 export_as_webservice_entry()108 export_as_webservice_entry(publish_web_link=False)
109109
110 # We want to customize the titles and descriptions of some of the110 # We want to customize the titles and descriptions of some of the
111 # attributes of our parent interfaces, so we redefine those specific111 # attributes of our parent interfaces, so we redefine those specific
112112
=== modified file 'lib/lp/bugs/interfaces/bugsubscription.py'
--- lib/lp/bugs/interfaces/bugsubscription.py 2011-01-28 10:03:12 +0000
+++ lib/lp/bugs/interfaces/bugsubscription.py 2011-02-03 19:06:35 +0000
@@ -39,7 +39,7 @@
39class IBugSubscription(Interface):39class IBugSubscription(Interface):
40 """The relationship between a person and a bug."""40 """The relationship between a person and a bug."""
4141
42 export_as_webservice_entry()42 export_as_webservice_entry(publish_web_link=False)
4343
44 id = Int(title=_('ID'), readonly=True, required=True)44 id = Int(title=_('ID'), readonly=True, required=True)
45 person = exported(PersonChoice(45 person = exported(PersonChoice(
4646
=== modified file 'lib/lp/bugs/stories/webservice/xx-bug-tracker.txt'
--- lib/lp/bugs/stories/webservice/xx-bug-tracker.txt 2010-04-15 08:45:31 +0000
+++ lib/lp/bugs/stories/webservice/xx-bug-tracker.txt 2011-02-03 19:06:35 +0000
@@ -28,6 +28,7 @@
28 summary: u'The Mozilla.org bug tracker is the grand-daddy of ...'28 summary: u'The Mozilla.org bug tracker is the grand-daddy of ...'
29 title: u'The Mozilla.org Bug Tracker'29 title: u'The Mozilla.org Bug Tracker'
30 watches_collection_link: u'http:.../bugs/bugtrackers/mozilla.org/watches'30 watches_collection_link: u'http:.../bugs/bugtrackers/mozilla.org/watches'
31 web_link: u'http://bugs.launchpad.dev/bugs/bugtrackers/mozilla.org'
31 --- ...32 --- ...
3233
33A bug tracker can be retrieved using the the bug tracker collection's34A bug tracker can be retrieved using the the bug tracker collection's
@@ -75,3 +76,4 @@
75 summary: u'Wombat summary'76 summary: u'Wombat summary'
76 title: u'Wombat title'77 title: u'Wombat title'
77 watches_collection_link: u'http://.../bugs/bugtrackers/wombat/watches'78 watches_collection_link: u'http://.../bugs/bugtrackers/wombat/watches'
79 web_link: u'http://bugs.launchpad.dev/bugs/bugtrackers/wombat'
7880
=== modified file 'lib/lp/bugs/stories/webservice/xx-bug.txt'
--- lib/lp/bugs/stories/webservice/xx-bug.txt 2011-01-28 10:03:12 +0000
+++ lib/lp/bugs/stories/webservice/xx-bug.txt 2011-02-03 19:06:35 +0000
@@ -53,6 +53,7 @@
53 users_affected_with_dupes_collection_link: u'http://.../bugs/11/users_affected_with_dupes'53 users_affected_with_dupes_collection_link: u'http://.../bugs/11/users_affected_with_dupes'
54 users_unaffected_collection_link: u'http://.../bugs/11/users_unaffected'54 users_unaffected_collection_link: u'http://.../bugs/11/users_unaffected'
55 users_unaffected_count: 055 users_unaffected_count: 0
56 web_link: u'http://bugs.../bugs/11'
56 who_made_private_link: None57 who_made_private_link: None
5758
58Bugs are indexed by number beneath the top-level collection.59Bugs are indexed by number beneath the top-level collection.
@@ -239,6 +240,7 @@
239 resource_type_link: u'http://.../#message'240 resource_type_link: u'http://.../#message'
240 self_link: u'http://.../firefox/+bug/5/comments/0'241 self_link: u'http://.../firefox/+bug/5/comments/0'
241 subject: u'Firefox install instructions should be complete'242 subject: u'Firefox install instructions should be complete'
243 web_link: u'http://bugs.../firefox/+bug/5/comments/0'
242244
243The messages are stored beneath the bug-specific collection. Their245The messages are stored beneath the bug-specific collection. Their
244URLs are based on their position with respect to the246URLs are based on their position with respect to the
@@ -283,6 +285,7 @@
283 resource_type_link: u'http://api.launchpad.dev/beta/#message'285 resource_type_link: u'http://api.launchpad.dev/beta/#message'
284 self_link: u'http://api.launchpad.dev/beta/firefox/+bug/5/comments/1'286 self_link: u'http://api.launchpad.dev/beta/firefox/+bug/5/comments/1'
285 subject: u'A new message'287 subject: u'A new message'
288 web_link: u'...'
286289
287We don't have to submit a subject when we add a new message.290We don't have to submit a subject when we add a new message.
288291
@@ -301,6 +304,7 @@
301 ...304 ...
302 self_link: u'http://api.launchpad.dev/beta/firefox/+bug/5/comments/2'305 self_link: u'http://api.launchpad.dev/beta/firefox/+bug/5/comments/2'
303 subject: u'Re: Firefox install instructions should be complete'306 subject: u'Re: Firefox install instructions should be complete'
307 web_link: u'...'
304308
305309
306Bug tasks310Bug tasks
@@ -343,6 +347,7 @@
343 status: u'Confirmed'347 status: u'Confirmed'
344 target_link: u'http://api.../debian/+source/mozilla-firefox'348 target_link: u'http://api.../debian/+source/mozilla-firefox'
345 title: u'Bug #1 in mozilla-firefox (Debian): "Firefox does not support SVG"'349 title: u'Bug #1 in mozilla-firefox (Debian): "Firefox does not support SVG"'
350 web_link: u'http://bugs.../debian/+source/mozilla-firefox/+bug/1'
346351
347The collection of bug tasks is not exposed as a resource:352The collection of bug tasks is not exposed as a resource:
348353
@@ -676,6 +681,7 @@
676 target_link: u'http://.../fooix/0.1'681 target_link: u'http://.../fooix/0.1'
677 ---682 ---
678683
684
679John cannot approve or decline the nomination.685John cannot approve or decline the nomination.
680686
681 >>> nom_url = nominations['entries'][0]['self_link']687 >>> nom_url = nominations['entries'][0]['self_link']
@@ -830,13 +836,14 @@
830 resource_type_link: u'http://.../#bug_subscription'836 resource_type_link: u'http://.../#bug_subscription'
831 self_link: u'http://.../bugs/1/+subscription/name12'837 self_link: u'http://.../bugs/1/+subscription/name12'
832 subscribed_by_link: u'http://.../~janitor'838 subscribed_by_link: u'http://.../~janitor'
833839 <BLANKLINE>
834 bug_link: u'http://.../bugs/1'840 bug_link: u'http://.../bugs/1'
835 date_created: u'2006-10-16T18:31:43.154816+00:00'841 date_created: u'2006-10-16T18:31:43.154816+00:00'
836 person_link: u'http://.../~stevea'842 person_link: u'http://.../~stevea'
837 resource_type_link: u'http://.../#bug_subscription'843 resource_type_link: u'http://.../#bug_subscription'
838 self_link: u'http://.../bugs/1/+subscription/stevea'844 self_link: u'http://.../bugs/1/+subscription/stevea'
839 subscribed_by_link: u'http://.../~janitor'845 subscribed_by_link: u'http://.../~janitor'
846 <BLANKLINE>
840847
841Each subscription can be accessed individually.848Each subscription can be accessed individually.
842849
@@ -1072,6 +1079,7 @@
1072 self_link: u'http://.../bugs/1/+watch/2'1079 self_link: u'http://.../bugs/1/+watch/2'
1073 title: u'The Mozilla.org Bug Tracker #2000'1080 title: u'The Mozilla.org Bug Tracker #2000'
1074 url: u'https://bugzilla.mozilla.org/show_bug.cgi?id=2000'1081 url: u'https://bugzilla.mozilla.org/show_bug.cgi?id=2000'
1082 web_link: u'http://bugs.../bugs/1/+watch/2'
10751083
1076 >>> bug_watch = webservice.get(bug_watch_2000['self_link']).jsonBody()1084 >>> bug_watch = webservice.get(bug_watch_2000['self_link']).jsonBody()
1077 >>> bug_watch == bug_watch_20001085 >>> bug_watch == bug_watch_2000
@@ -1143,7 +1151,7 @@
1143 self_link: u'http://.../bugs/1/+watch/13'1151 self_link: u'http://.../bugs/1/+watch/13'
1144 title: u'The Mozilla.org Bug Tracker #9876'1152 title: u'The Mozilla.org Bug Tracker #9876'
1145 url: u'https://bugzilla.mozilla.org/show_bug.cgi?id=9876'1153 url: u'https://bugzilla.mozilla.org/show_bug.cgi?id=9876'
11461154 web_link: u'http://bugs.../bugs/1/+watch/13'
11471155
1148Bug Trackers1156Bug Trackers
1149------------1157------------
@@ -1164,6 +1172,7 @@
1164 summary: u'The Mozilla.org bug tracker is the grand-daddy of bugzillas...'1172 summary: u'The Mozilla.org bug tracker is the grand-daddy of bugzillas...'
1165 title: u'The Mozilla.org Bug Tracker'1173 title: u'The Mozilla.org Bug Tracker'
1166 watches_collection_link: u'http://.../bugs/bugtrackers/mozilla.org/watches'1174 watches_collection_link: u'http://.../bugs/bugtrackers/mozilla.org/watches'
1175 web_link: u'http://bugs.../bugs/bugtrackers/mozilla.org'
11671176
1168We can change various aspects of bug trackers.1177We can change various aspects of bug trackers.
11691178
@@ -1220,6 +1229,7 @@
1220 summary: u'Where Bob files his bugs.'1229 summary: u'Where Bob files his bugs.'
1221 title: u"Bob's Tracker"1230 title: u"Bob's Tracker"
1222 watches_collection_link: u'http://.../bugs/bugtrackers/bob/watches'1231 watches_collection_link: u'http://.../bugs/bugtrackers/bob/watches'
1232 web_link: u'http://bugs.../bugs/bugtrackers/bob'
12231233
1224Non-admins can't disable a bugtracker through the API.1234Non-admins can't disable a bugtracker through the API.
12251235
@@ -1284,6 +1294,7 @@
1284 self_link: u'http://.../bugs/1/+attachment/1'1294 self_link: u'http://.../bugs/1/+attachment/1'
1285 title: u'numbers.txt'1295 title: u'numbers.txt'
1286 type: u'Unspecified'1296 type: u'Unspecified'
1297 web_link: u'http://bugs.../bugs/1/+attachment/1'
1287 ---1298 ---
12881299
1289The attachment can be fetched directly:1300The attachment can be fetched directly:
@@ -1297,6 +1308,7 @@
1297 self_link: u'http://.../bugs/1/+attachment/1'1308 self_link: u'http://.../bugs/1/+attachment/1'
1298 title: u'numbers.txt'1309 title: u'numbers.txt'
1299 type: u'Unspecified'1310 type: u'Unspecified'
1311 web_link: u'http://bugs.../bugs/1/+attachment/1'
13001312
1301Fetching the data actually yields a redirect to the Librarian, which1313Fetching the data actually yields a redirect to the Librarian, which
1302we must follow to download the data.1314we must follow to download the data.
@@ -1340,6 +1352,7 @@
1340 resource_type_link: u'http://.../#message'1352 resource_type_link: u'http://.../#message'
1341 self_link: u'http://.../firefox/+bug/1/comments/2'1353 self_link: u'http://.../firefox/+bug/1/comments/2'
1342 subject: u'Re: Firefox does not support SVG'1354 subject: u'Re: Firefox does not support SVG'
1355 web_link: u'http://bugs.../firefox/+bug/1/comments/2'
13431356
1344The message also links back to the attachments that were uploaded at1357The message also links back to the attachments that were uploaded at
1345the same time.1358the same time.
@@ -1847,6 +1860,7 @@
1847 status: u'Candidate'1860 status: u'Candidate'
1848 title: u'CVE-2005-2737 (Candidate)'1861 title: u'CVE-2005-2737 (Candidate)'
1849 url: u'http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=2005-2737'1862 url: u'http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=2005-2737'
1863 web_link: u'http://bugs.launchpad.dev/bugs/cve/2005-2737'
1850 ---1864 ---
1851 ...1865 ...
1852 self_link: u'http://.../bugs/cve/2005-2736'1866 self_link: u'http://.../bugs/cve/2005-2736'
@@ -1884,6 +1898,7 @@
1884 status: u'Entry'1898 status: u'Entry'
1885 title: u'CVE-1999-8979 (Entry)'1899 title: u'CVE-1999-8979 (Entry)'
1886 url: u'http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=1999-8979'1900 url: u'http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=1999-8979'
1901 web_link: u'http://bugs.launchpad.dev/bugs/cve/1999-8979'
1887 ---1902 ---
18881903
1889For every CVE we can also look at the bugs linked to it.1904For every CVE we can also look at the bugs linked to it.
18901905
=== modified file 'lib/lp/code/interfaces/diff.py'
--- lib/lp/code/interfaces/diff.py 2010-12-02 16:13:51 +0000
+++ lib/lp/code/interfaces/diff.py 2011-02-03 19:06:35 +0000
@@ -122,7 +122,7 @@
122 trying to determine the effective changes of landing the source branch on122 trying to determine the effective changes of landing the source branch on
123 the target branch.123 the target branch.
124 """124 """
125 export_as_webservice_entry()125 export_as_webservice_entry(publish_web_link=False)
126126
127 source_revision_id = exported(127 source_revision_id = exported(
128 TextLine(128 TextLine(
129129
=== modified file 'lib/lp/code/stories/webservice/xx-branch.txt'
--- lib/lp/code/stories/webservice/xx-branch.txt 2010-10-22 13:43:50 +0000
+++ lib/lp/code/stories/webservice/xx-branch.txt 2011-02-03 19:06:35 +0000
@@ -142,9 +142,9 @@
142 subscriptions_collection_link: u'http://.../~eric/fooix/trunk/subscriptions'142 subscriptions_collection_link: u'http://.../~eric/fooix/trunk/subscriptions'
143 unique_name: u'~eric/fooix/trunk'143 unique_name: u'~eric/fooix/trunk'
144 url: None144 url: None
145 web_link: u'http://code.../~eric/fooix/trunk'
145 whiteboard: None146 whiteboard: None
146147
147
148There is a branch merge proposal with Fooix trunk as the target branch, so it148There is a branch merge proposal with Fooix trunk as the target branch, so it
149should have a branch at the endpoint of landing_candidates.149should have a branch at the endpoint of landing_candidates.
150150
151151
=== modified file 'lib/lp/code/stories/webservice/xx-branchmergeproposal.txt'
--- lib/lp/code/stories/webservice/xx-branchmergeproposal.txt 2010-10-26 03:06:30 +0000
+++ lib/lp/code/stories/webservice/xx-branchmergeproposal.txt 2011-02-03 19:06:35 +0000
@@ -75,6 +75,7 @@
75 target_branch_link: u'http://api.launchpad.dev/devel/~...'75 target_branch_link: u'http://api.launchpad.dev/devel/~...'
76 votes_collection_link:76 votes_collection_link:
77 u'http://api.launchpad.dev/devel/~.../+merge/.../votes'77 u'http://api.launchpad.dev/devel/~.../+merge/.../votes'
78 web_link: u'http://code.../~.../+merge/...'
7879
79If we try and create the merge proposal again, we should get a ValueError.80If we try and create the merge proposal again, we should get a ValueError.
8081
@@ -170,6 +171,7 @@
170 supersedes_link: None171 supersedes_link: None
171 target_branch_link: u'http://.../~target/fooix/trunk'172 target_branch_link: u'http://.../~target/fooix/trunk'
172 votes_collection_link: u'http://.../~source/fooix/fix-it/+merge/.../votes'173 votes_collection_link: u'http://.../~source/fooix/fix-it/+merge/.../votes'
174 web_link: u'http://code.../~source/fooix/fix-it/+merge/...'
173175
174176
175== Read the comments ==177== Read the comments ==
@@ -192,6 +194,7 @@
192 title: u'Comment on proposed merge of lp://dev/~source/fooix/fix-it into lp://dev/~target/fooix/trunk'194 title: u'Comment on proposed merge of lp://dev/~source/fooix/fix-it into lp://dev/~target/fooix/trunk'
193 vote: u'Approve'195 vote: u'Approve'
194 vote_tag: u'code'196 vote_tag: u'code'
197 web_link: u'http://code.../~source/fooix/fix-it/+merge/.../comments/...'
195198
196 >>> comment_2 = webservice.named_get(199 >>> comment_2 = webservice.named_get(
197 ... merge_proposal['self_link'], 'getComment', id=2).jsonBody()200 ... merge_proposal['self_link'], 'getComment', id=2).jsonBody()
@@ -207,6 +210,7 @@
207 title: ...210 title: ...
208 vote: u'Abstain'211 vote: u'Abstain'
209 vote_tag: None212 vote_tag: None
213 web_link: u'http://code.../~source/fooix/fix-it/+merge/.../comments/...'
210214
211215
212== Check the votes ==216== Check the votes ==
@@ -280,7 +284,7 @@
280 title: ...284 title: ...
281 vote: u'Approve'285 vote: u'Approve'
282 vote_tag: u'code'286 vote_tag: u'code'
283287 web_link: u'http://code.../~source/fooix/fix-it/+merge/.../comments/...'
284288
285In fact, now that the votes indicate approval, we might as well set the merge289In fact, now that the votes indicate approval, we might as well set the merge
286proposal status to "Approved" as well.290proposal status to "Approved" as well.
287291
=== modified file 'lib/lp/code/stories/webservice/xx-branchsubscription.txt'
--- lib/lp/code/stories/webservice/xx-branchsubscription.txt 2010-05-27 04:35:57 +0000
+++ lib/lp/code/stories/webservice/xx-branchsubscription.txt 2011-02-03 19:06:35 +0000
@@ -39,6 +39,7 @@
39 review_level: u'No email'39 review_level: u'No email'
40 self_link: u'http://.../~farmer-bob/farm/corn/+subscription/farmer-joe'40 self_link: u'http://.../~farmer-bob/farm/corn/+subscription/farmer-joe'
41 subscribed_by_link: u'http://.../~salgado'41 subscribed_by_link: u'http://.../~salgado'
42 web_link: u'http://code.../~farmer-bob/farm/corn/+subscription/farmer-joe'
4243
43 >>> def print_subscriber_count(branch):44 >>> def print_subscriber_count(branch):
44 ... subscribers = webservice.get(45 ... subscribers = webservice.get(
@@ -93,6 +94,7 @@
93 review_level: u'Status changes only'94 review_level: u'Status changes only'
94 self_link: u'http://.../~farmer-bob/farm/corn/+subscription/farmer-joe'95 self_link: u'http://.../~farmer-bob/farm/corn/+subscription/farmer-joe'
95 subscribed_by_link: u'http://.../~salgado'96 subscribed_by_link: u'http://.../~salgado'
97 web_link: u'http://code.../~farmer-bob/farm/corn/+subscription/farmer-joe'
9698
9799
98We print the count, and even though subscribe was called again, there's still100We print the count, and even though subscribe was called again, there's still
99101
=== modified file 'lib/lp/hardwaredb/interfaces/hwdb.py'
--- lib/lp/hardwaredb/interfaces/hwdb.py 2010-11-09 14:47:27 +0000
+++ lib/lp/hardwaredb/interfaces/hwdb.py 2011-02-03 19:06:35 +0000
@@ -156,7 +156,7 @@
156156
157 See doc/hwdb.txt for details about the attributes.157 See doc/hwdb.txt for details about the attributes.
158 """158 """
159 export_as_webservice_entry()159 export_as_webservice_entry(publish_web_link=False)
160160
161 date_created = exported(161 date_created = exported(
162 Datetime(162 Datetime(
@@ -433,7 +433,7 @@
433433
434class IHWDriver(Interface):434class IHWDriver(Interface):
435 """Information about a device driver."""435 """Information about a device driver."""
436 export_as_webservice_entry()436 export_as_webservice_entry(publish_web_link=False)
437437
438 id = exported(438 id = exported(
439 Int(title=u'Driver ID', required=True, readonly=True))439 Int(title=u'Driver ID', required=True, readonly=True))
@@ -560,7 +560,7 @@
560class IHWDriverName(Interface):560class IHWDriverName(Interface):
561 """A driver name as appearing in `IHWDriver`.561 """A driver name as appearing in `IHWDriver`.
562 """562 """
563 export_as_webservice_entry()563 export_as_webservice_entry(publish_web_link=False)
564564
565 name = exported(565 name = exported(
566 TextLine(566 TextLine(
@@ -572,7 +572,7 @@
572class IHWDriverPackageName(Interface):572class IHWDriverPackageName(Interface):
573 """A driver name as appearing in `IHWDriver`.573 """A driver name as appearing in `IHWDriver`.
574 """574 """
575 export_as_webservice_entry()575 export_as_webservice_entry(publish_web_link=False)
576576
577 package_name = exported(577 package_name = exported(
578 TextLine(578 TextLine(
@@ -659,7 +659,7 @@
659class IHWVendorID(Interface):659class IHWVendorID(Interface):
660 """A list of vendor IDs for different busses associated with vendor names.660 """A list of vendor IDs for different busses associated with vendor names.
661 """661 """
662 export_as_webservice_entry()662 export_as_webservice_entry(publish_web_link=False)
663 id = exported(663 id = exported(
664 Int(title=u'The Database ID', required=True, readonly=True))664 Int(title=u'The Database ID', required=True, readonly=True))
665665
@@ -714,7 +714,7 @@
714714
715class IHWDeviceClass(Interface):715class IHWDeviceClass(Interface):
716 """The capabilities of a device."""716 """The capabilities of a device."""
717 export_as_webservice_entry()717 export_as_webservice_entry(publish_web_link=False)
718718
719 id = Int(title=u'Device class ID', required=True, readonly=True)719 id = Int(title=u'Device class ID', required=True, readonly=True)
720 device = Reference(schema=Interface)720 device = Reference(schema=Interface)
@@ -774,7 +774,7 @@
774774
775class IHWDevice(Interface):775class IHWDevice(Interface):
776 """Core information to identify a device."""776 """Core information to identify a device."""
777 export_as_webservice_entry()777 export_as_webservice_entry(publish_web_link=False)
778778
779 id = exported(779 id = exported(
780 Int(title=u'Device ID', required=True, readonly=True))780 Int(title=u'Device ID', required=True, readonly=True))
@@ -1038,7 +1038,7 @@
10381038
1039class IHWSubmissionDevice(Interface):1039class IHWSubmissionDevice(Interface):
1040 """Link a submission to a IHWDeviceDriver row."""1040 """Link a submission to a IHWDeviceDriver row."""
1041 export_as_webservice_entry()1041 export_as_webservice_entry(publish_web_link=False)
10421042
1043 id = exported(1043 id = exported(
1044 Int(title=u'HWSubmissionDevice ID', required=True, readonly=True))1044 Int(title=u'HWSubmissionDevice ID', required=True, readonly=True))
@@ -1169,7 +1169,7 @@
1169class IHWDBApplication(ILaunchpadApplication):1169class IHWDBApplication(ILaunchpadApplication):
1170 """Hardware database application application root."""1170 """Hardware database application application root."""
11711171
1172 export_as_webservice_entry('hwdb')1172 export_as_webservice_entry('hwdb', publish_web_link=False)
11731173
1174 @operation_parameters(1174 @operation_parameters(
1175 bus=Choice(1175 bus=Choice(
11761176
=== modified file 'lib/lp/registry/interfaces/productrelease.py'
--- lib/lp/registry/interfaces/productrelease.py 2010-08-20 20:31:18 +0000
+++ lib/lp/registry/interfaces/productrelease.py 2011-02-03 19:06:35 +0000
@@ -217,7 +217,7 @@
217class IProductReleaseFile(IProductReleaseFileEditRestricted,217class IProductReleaseFile(IProductReleaseFileEditRestricted,
218 IProductReleaseFilePublic):218 IProductReleaseFilePublic):
219 """A file associated with a ProductRelease."""219 """A file associated with a ProductRelease."""
220 export_as_webservice_entry("project_release_file")220 export_as_webservice_entry("project_release_file", publish_web_link=False)
221221
222222
223class IProductReleaseEditRestricted(Interface):223class IProductReleaseEditRestricted(Interface):
224224
=== modified file 'lib/lp/registry/interfaces/structuralsubscription.py'
--- lib/lp/registry/interfaces/structuralsubscription.py 2011-01-13 15:12:36 +0000
+++ lib/lp/registry/interfaces/structuralsubscription.py 2011-02-03 19:06:35 +0000
@@ -146,7 +146,7 @@
146 IStructuralSubscriptionPublic, IStructuralSubscriptionRestricted):146 IStructuralSubscriptionPublic, IStructuralSubscriptionRestricted):
147 """A subscription to a Launchpad structure."""147 """A subscription to a Launchpad structure."""
148148
149 export_as_webservice_entry()149 export_as_webservice_entry(publish_web_link=False)
150150
151151
152class IStructuralSubscriptionTargetRead(Interface):152class IStructuralSubscriptionTargetRead(Interface):
153153
=== modified file 'lib/lp/registry/interfaces/wikiname.py'
--- lib/lp/registry/interfaces/wikiname.py 2010-08-20 20:31:18 +0000
+++ lib/lp/registry/interfaces/wikiname.py 2011-02-03 19:06:35 +0000
@@ -26,7 +26,7 @@
2626
27class IWikiName(IHasOwner):27class IWikiName(IHasOwner):
28 """Wiki for Users"""28 """Wiki for Users"""
29 export_as_webservice_entry()29 export_as_webservice_entry(publish_web_link=False)
30 id = Int(title=_("Database ID"), required=True, readonly=True)30 id = Int(title=_("Database ID"), required=True, readonly=True)
31 # schema=Interface will be overriden in person.py because of circular31 # schema=Interface will be overriden in person.py because of circular
32 # dependencies.32 # dependencies.
3333
=== modified file 'lib/lp/registry/stories/webservice/xx-distribution-mirror.txt'
--- lib/lp/registry/stories/webservice/xx-distribution-mirror.txt 2010-10-18 22:24:59 +0000
+++ lib/lp/registry/stories/webservice/xx-distribution-mirror.txt 2011-02-03 19:06:35 +0000
@@ -32,6 +32,7 @@
32 self_link: u'http://.../ubuntu/+mirror/canonical-archive'32 self_link: u'http://.../ubuntu/+mirror/canonical-archive'
33 speed: u'100 Mbps'33 speed: u'100 Mbps'
34 status: u'Official'34 status: u'Official'
35 web_link: u'http://launchpad.../ubuntu/+mirror/canonical-archive'
35 whiteboard: None36 whiteboard: None
3637
37And CD image mirrors:38And CD image mirrors:
@@ -60,6 +61,7 @@
60 self_link: u'http://.../ubuntu/+mirror/canonical-releases'61 self_link: u'http://.../ubuntu/+mirror/canonical-releases'
61 speed: u'100 Mbps'62 speed: u'100 Mbps'
62 status: u'Official'63 status: u'Official'
64 web_link: u'http://launchpad.../ubuntu/+mirror/canonical-releases'
63 whiteboard: None65 whiteboard: None
6466
65= Security checks =67= Security checks =
@@ -152,6 +154,7 @@
152 self_link: u'http://.../ubuntu/+mirror/archive-404-mirror'154 self_link: u'http://.../ubuntu/+mirror/archive-404-mirror'
153 speed: u'512 Kbps'155 speed: u'512 Kbps'
154 status: u'Official'156 status: u'Official'
157 web_link: u'http://launchpad.../ubuntu/+mirror/archive-404-mirror'
155 whiteboard: None158 whiteboard: None
156159
157Now trying to set the owner using Sample Person's webservice is not authorized.160Now trying to set the owner using Sample Person's webservice is not authorized.
@@ -234,6 +237,7 @@
234 self_link: u'http://.../ubuntu/+mirror/canonical-releases'237 self_link: u'http://.../ubuntu/+mirror/canonical-releases'
235 speed: u'100 Mbps'238 speed: u'100 Mbps'
236 status: u'Unofficial'239 status: u'Unofficial'
240 web_link: u'http://launchpad.../ubuntu/+mirror/canonical-releases'
237 whiteboard: u'This mirror is too shiny to be true'241 whiteboard: u'This mirror is too shiny to be true'
238242
239= Distribution Mirror Custom Operations =243= Distribution Mirror Custom Operations =
240244
=== modified file 'lib/lp/registry/stories/webservice/xx-distribution-source-package.txt'
--- lib/lp/registry/stories/webservice/xx-distribution-source-package.txt 2010-06-08 13:07:44 +0000
+++ lib/lp/registry/stories/webservice/xx-distribution-source-package.txt 2011-02-03 19:06:35 +0000
@@ -19,7 +19,8 @@
19 u'resource_type_link': u'http://.../#distribution_source_package',19 u'resource_type_link': u'http://.../#distribution_source_package',
20 u'self_link': u'http://.../debian/+source/mozilla-firefox',20 u'self_link': u'http://.../debian/+source/mozilla-firefox',
21 u'title': u'\u201cmozilla-firefox\u201d package in Debian',21 u'title': u'\u201cmozilla-firefox\u201d package in Debian',
22 u'upstream_product_link': None}22 u'upstream_product_link': None,
23 u'web_link': u'http://launchpad.../debian/+source/mozilla-firefox'}
2324
24You can obtain a collection of bug tasks associated with the source25You can obtain a collection of bug tasks associated with the source
25package using the "getBugTasks" method.26package using the "getBugTasks" method.
2627
=== modified file 'lib/lp/registry/stories/webservice/xx-distribution.txt'
--- lib/lp/registry/stories/webservice/xx-distribution.txt 2010-11-03 01:42:20 +0000
+++ lib/lp/registry/stories/webservice/xx-distribution.txt 2011-02-03 19:06:35 +0000
@@ -49,6 +49,7 @@
49 series_collection_link: u'http://.../ubuntu/series'49 series_collection_link: u'http://.../ubuntu/series'
50 summary: u'Ubuntu is a new approach to Linux Distribution...'50 summary: u'Ubuntu is a new approach to Linux Distribution...'
51 title: u'Ubuntu Linux'51 title: u'Ubuntu Linux'
52 web_link: u'http://launchpad.../ubuntu'
5253
5354
54Distribution Custom Operations55Distribution Custom Operations
@@ -155,6 +156,7 @@
155 self_link: u'http://.../ubuntu/+mirror/canonical-releases'156 self_link: u'http://.../ubuntu/+mirror/canonical-releases'
156 speed: u'100 Mbps'157 speed: u'100 Mbps'
157 status: u'Official'158 status: u'Official'
159 web_link: u'http://launchpad.../ubuntu/+mirror/canonical-releases'
158 whiteboard: None160 whiteboard: None
159161
160"getCountryMirror" returns the country DNS mirror for a given country;162"getCountryMirror" returns the country DNS mirror for a given country;
161163
=== modified file 'lib/lp/registry/stories/webservice/xx-distroseries.txt'
--- lib/lp/registry/stories/webservice/xx-distroseries.txt 2010-06-09 08:26:26 +0000
+++ lib/lp/registry/stories/webservice/xx-distroseries.txt 2011-02-03 19:06:35 +0000
@@ -84,7 +84,7 @@
84 supported: False84 supported: False
85 title: u'The Hoary Hedgehog Release'85 title: u'The Hoary Hedgehog Release'
86 version: u'5.04'86 version: u'5.04'
8787 web_link: u'http://launchpad.../ubuntu/hoary'
8888
89Creating a milestone on the distroseries89Creating a milestone on the distroseries
90----------------------------------------90----------------------------------------
9191
=== modified file 'lib/lp/registry/stories/webservice/xx-person.txt'
--- lib/lp/registry/stories/webservice/xx-person.txt 2010-12-02 20:40:31 +0000
+++ lib/lp/registry/stories/webservice/xx-person.txt 2011-02-03 19:06:35 +0000
@@ -58,6 +58,7 @@
58 team_owner_link: None58 team_owner_link: None
59 time_zone: None59 time_zone: None
60 visibility: u'Public'60 visibility: u'Public'
61 web_link: u'http://launchpad.../~salgado'
61 wiki_names_collection_link: u'http://.../~salgado/wiki_names'62 wiki_names_collection_link: u'http://.../~salgado/wiki_names'
6263
63 >>> ubuntu_team = webservice.get("/~ubuntu-team").jsonBody()64 >>> ubuntu_team = webservice.get("/~ubuntu-team").jsonBody()
@@ -120,6 +121,7 @@
120 team_owner_link: u'http://.../~mark'121 team_owner_link: u'http://.../~mark'
121 time_zone: None122 time_zone: None
122 visibility: u'Public'123 visibility: u'Public'
124 web_link: u'http://launchpad.../~ubuntu-team'
123 wiki_names_collection_link: u'http://.../~ubuntu-team/wiki_names'125 wiki_names_collection_link: u'http://.../~ubuntu-team/wiki_names'
124126
125 >>> sorted(set(ubuntu_team.keys()).difference(salgado.keys()))127 >>> sorted(set(ubuntu_team.keys()).difference(salgado.keys()))
@@ -292,7 +294,8 @@
292 >>> sorted(salgado_landscape)294 >>> sorted(salgado_landscape)
293 [u'date_expires', u'date_joined', u'http_etag',295 [u'date_expires', u'date_joined', u'http_etag',
294 u'last_change_comment', u'last_changed_by_link', u'member_link',296 u'last_change_comment', u'last_changed_by_link', u'member_link',
295 u'resource_type_link', u'self_link', u'status', u'team_link']297 u'resource_type_link', u'self_link', u'status', u'team_link',
298 u'web_link']
296299
297Each team membership links to the person who approved the link.300Each team membership links to the person who approved the link.
298301
@@ -699,6 +702,7 @@
699 self_link: u'...'702 self_link: u'...'
700 title: u'...'703 title: u'...'
701 upstream_product_link: None704 upstream_product_link: None
705 web_link: u'...'
702 ---706 ---
703707
704708
705709
=== modified file 'lib/lp/registry/stories/webservice/xx-project-registry.txt'
--- lib/lp/registry/stories/webservice/xx-project-registry.txt 2010-12-22 14:50:08 +0000
+++ lib/lp/registry/stories/webservice/xx-project-registry.txt 2011-02-03 19:06:35 +0000
@@ -88,6 +88,7 @@
88 sourceforge_project: None88 sourceforge_project: None
89 summary: u'The Mozilla Project...'89 summary: u'The Mozilla Project...'
90 title: u'The Mozilla Project'90 title: u'The Mozilla Project'
91 web_link: u'http://launchpad.../mozilla'
91 wiki_url: None92 wiki_url: None
9293
93The milestones can be accessed through the94The milestones can be accessed through the
@@ -192,6 +193,7 @@
192 summary: u'The Mozilla Firefox web browser'193 summary: u'The Mozilla Firefox web browser'
193 title: u'Mozilla Firefox'194 title: u'Mozilla Firefox'
194 translation_focus_link: None195 translation_focus_link: None
196 web_link: u'http://launchpad.../firefox'
195 wiki_url: None197 wiki_url: None
196198
197In Launchpad project names may not have uppercase letters in their199In Launchpad project names may not have uppercase letters in their
@@ -255,6 +257,7 @@
255 summary: u'The Mozilla Firefox web browser'257 summary: u'The Mozilla Firefox web browser'
256 title: u'Mozilla Firefox'258 title: u'Mozilla Firefox'
257 translation_focus_link: None259 translation_focus_link: None
260 web_link: u'http://launchpad.../firefox'
258 wiki_url: None261 wiki_url: None
259262
260The milestones can be accessed through the263The milestones can be accessed through the
@@ -499,7 +502,8 @@
499 u'resource_type_link': u'.../#timeline_project_series',502 u'resource_type_link': u'.../#timeline_project_series',
500 u'self_link': u'http://.../firefox/trunk',503 u'self_link': u'http://.../firefox/trunk',
501 u'status': u'Obsolete',504 u'status': u'Obsolete',
502 u'uri': u'/firefox/trunk'},505 u'uri': u'/firefox/trunk',
506 u'web_link': u'http://launchpad.../firefox/trunk'},
503 {u'http_etag': ...507 {u'http_etag': ...
504 u'is_development_focus': False,508 u'is_development_focus': False,
505 u'landmarks': [{u'code_name': u'First Stable Release',509 u'landmarks': [{u'code_name': u'First Stable Release',
@@ -512,7 +516,8 @@
512 u'resource_type_link': u'.../#timeline_project_series',516 u'resource_type_link': u'.../#timeline_project_series',
513 u'self_link': u'http://.../firefox/1.0',517 u'self_link': u'http://.../firefox/1.0',
514 u'status': u'Active Development',518 u'status': u'Active Development',
515 u'uri': u'/firefox/1.0'},519 u'uri': u'/firefox/1.0',
520 u'web_link': u'http://launchpad.../firefox/1.0'},
516 {u'http_etag': ...521 {u'http_etag': ...
517 u'is_development_focus': False,522 u'is_development_focus': False,
518 u'landmarks': [],523 u'landmarks': [],
@@ -521,7 +526,8 @@
521 u'resource_type_link': u'.../#timeline_project_series',526 u'resource_type_link': u'.../#timeline_project_series',
522 u'self_link': u'http://.../firefox/experimental',527 u'self_link': u'http://.../firefox/experimental',
523 u'status': u'Active Development',528 u'status': u'Active Development',
524 u'uri': u'/firefox/experimental'}],529 u'uri': u'/firefox/experimental',
530 u'web_link': u'http://launchpad.../firefox/experimental'}],
525 u'start': 0,531 u'start': 0,
526 u'total_size': 3}532 u'total_size': 3}
527533
@@ -879,6 +885,7 @@
879 status: u'Active Development'885 status: u'Active Development'
880 summary: u'Foobadoo support for Babadoo'886 summary: u'Foobadoo support for Babadoo'
881 title: u'Babadoo foobadoo series'887 title: u'Babadoo foobadoo series'
888 web_link: u'http://launchpad.../babadoo/foobadoo'
882889
883"get_timeline" returns a lightweight representation of the series'890"get_timeline" returns a lightweight representation of the series'
884milestones and releases.891milestones and releases.
@@ -894,7 +901,8 @@
894 u'resource_type_link': u'http://.../#timeline_project_series',901 u'resource_type_link': u'http://.../#timeline_project_series',
895 u'self_link': u'http://.../babadoo/foobadoo',902 u'self_link': u'http://.../babadoo/foobadoo',
896 u'status': u'Active Development',903 u'status': u'Active Development',
897 u'uri': u'/babadoo/foobadoo'}904 u'uri': u'/babadoo/foobadoo',
905 u'web_link': u'http://launchpad.../babadoo/foobadoo'}
898906
899907
900Creating a milestone on the product series908Creating a milestone on the product series
@@ -982,6 +990,7 @@
982 self_link: u'http://.../firefox/1.0/1.0.0'990 self_link: u'http://.../firefox/1.0/1.0.0'
983 title: u'Mozilla Firefox 1.0.0 "First Stable Release"'991 title: u'Mozilla Firefox 1.0.0 "First Stable Release"'
984 version: u'1.0.0'992 version: u'1.0.0'
993 web_link: u'http://launchpad.../firefox/1.0/1.0.0'
985994
986The createProductRelease method is called by sending995The createProductRelease method is called by sending
987"ws.op=createProductRelease" as a request variable along with the996"ws.op=createProductRelease" as a request variable along with the
@@ -1059,6 +1068,7 @@
1059 summary: None1068 summary: None
1060 target_link: u'http://.../firefox'1069 target_link: u'http://.../firefox'
1061 title: u'Mozilla Firefox 1.0'1070 title: u'Mozilla Firefox 1.0'
1071 web_link: u'http://launchpad.../firefox/+milestone/1.0'
10621072
1063The milestone entry has a link to its release if it has one.1073The milestone entry has a link to its release if it has one.
10641074
10651075
=== modified file 'lib/lp/services/worlddata/interfaces/country.py'
--- lib/lp/services/worlddata/interfaces/country.py 2010-08-20 20:31:18 +0000
+++ lib/lp/services/worlddata/interfaces/country.py 2011-02-03 19:06:35 +0000
@@ -41,7 +41,8 @@
4141
42class ICountry(Interface):42class ICountry(Interface):
43 """The country description."""43 """The country description."""
44 export_as_webservice_entry(plural_name='countries')44 export_as_webservice_entry(
45 plural_name='countries', publish_web_link=False)
4546
46 id = Int(47 id = Int(
47 title=_('Country ID'), required=True, readonly=True,48 title=_('Country ID'), required=True, readonly=True,
4849
=== modified file 'lib/lp/soyuz/interfaces/archivedependency.py'
--- lib/lp/soyuz/interfaces/archivedependency.py 2010-08-20 20:31:18 +0000
+++ lib/lp/soyuz/interfaces/archivedependency.py 2011-02-03 19:06:35 +0000
@@ -31,7 +31,7 @@
3131
32class IArchiveDependency(Interface):32class IArchiveDependency(Interface):
33 """ArchiveDependency interface."""33 """ArchiveDependency interface."""
34 export_as_webservice_entry()34 export_as_webservice_entry(publish_web_link=False)
3535
36 id = Int(title=_("The archive ID."), readonly=True)36 id = Int(title=_("The archive ID."), readonly=True)
3737
3838
=== modified file 'lib/lp/soyuz/interfaces/archivepermission.py'
--- lib/lp/soyuz/interfaces/archivepermission.py 2010-08-23 17:16:35 +0000
+++ lib/lp/soyuz/interfaces/archivepermission.py 2011-02-03 19:06:35 +0000
@@ -41,7 +41,7 @@
4141
42class IArchivePermission(Interface):42class IArchivePermission(Interface):
43 """The interface for `ArchivePermission`."""43 """The interface for `ArchivePermission`."""
44 export_as_webservice_entry()44 export_as_webservice_entry(publish_web_link=False)
4545
46 id = Attribute("The archive permission ID.")46 id = Attribute("The archive permission ID.")
4747
4848
=== modified file 'lib/lp/soyuz/interfaces/packageset.py'
--- lib/lp/soyuz/interfaces/packageset.py 2010-08-20 20:31:18 +0000
+++ lib/lp/soyuz/interfaces/packageset.py 2011-02-03 19:06:35 +0000
@@ -62,7 +62,7 @@
6262
63class IPackagesetViewOnly(IHasOwner):63class IPackagesetViewOnly(IHasOwner):
64 """A read-only interface for package sets."""64 """A read-only interface for package sets."""
65 export_as_webservice_entry()65 export_as_webservice_entry(publish_web_link=False)
6666
67 id = Int(title=_('ID'), required=True, readonly=True)67 id = Int(title=_('ID'), required=True, readonly=True)
6868
@@ -244,7 +244,7 @@
244244
245class IPackagesetEdit(Interface):245class IPackagesetEdit(Interface):
246 """A writeable interface for package sets."""246 """A writeable interface for package sets."""
247 export_as_webservice_entry()247 export_as_webservice_entry(publish_web_link=False)
248248
249 def add(data):249 def add(data):
250 """Add source package names or other package sets to this one.250 """Add source package names or other package sets to this one.
@@ -349,7 +349,7 @@
349349
350class IPackageset(IPackagesetViewOnly, IPackagesetEdit):350class IPackageset(IPackagesetViewOnly, IPackagesetEdit):
351 """An interface for package sets."""351 """An interface for package sets."""
352 export_as_webservice_entry()352 export_as_webservice_entry(publish_web_link=False)
353353
354354
355class IPackagesetSet(Interface):355class IPackagesetSet(Interface):
356356
=== modified file 'lib/lp/soyuz/interfaces/publishing.py'
--- lib/lp/soyuz/interfaces/publishing.py 2011-01-11 04:07:35 +0000
+++ lib/lp/soyuz/interfaces/publishing.py 2011-02-03 19:06:35 +0000
@@ -635,7 +635,7 @@
635class ISourcePackagePublishingHistory(ISourcePackagePublishingHistoryPublic,635class ISourcePackagePublishingHistory(ISourcePackagePublishingHistoryPublic,
636 IPublishingEdit):636 IPublishingEdit):
637 """A source package publishing history record."""637 """A source package publishing history record."""
638 export_as_webservice_entry()638 export_as_webservice_entry(publish_web_link=False)
639639
640640
641#641#
@@ -855,7 +855,7 @@
855class IBinaryPackagePublishingHistory(IBinaryPackagePublishingHistoryPublic,855class IBinaryPackagePublishingHistory(IBinaryPackagePublishingHistoryPublic,
856 IPublishingEdit):856 IPublishingEdit):
857 """A binary package publishing record."""857 """A binary package publishing record."""
858 export_as_webservice_entry()858 export_as_webservice_entry(publish_web_link=False)
859859
860860
861class IPublishingSet(Interface):861class IPublishingSet(Interface):
862862
=== modified file 'lib/lp/soyuz/interfaces/queue.py'
--- lib/lp/soyuz/interfaces/queue.py 2010-08-24 15:51:02 +0000
+++ lib/lp/soyuz/interfaces/queue.py 2011-02-03 19:06:35 +0000
@@ -99,7 +99,7 @@
99class IPackageUpload(Interface):99class IPackageUpload(Interface):
100 """A Queue item for the archive uploader."""100 """A Queue item for the archive uploader."""
101101
102 export_as_webservice_entry()102 export_as_webservice_entry(publish_web_link=False)
103103
104 id = Int(104 id = Int(
105 title=_("ID"), required=True, readonly=True,105 title=_("ID"), required=True, readonly=True,
106106
=== modified file 'lib/lp/soyuz/stories/webservice/xx-archive.txt'
--- lib/lp/soyuz/stories/webservice/xx-archive.txt 2010-10-18 22:24:59 +0000
+++ lib/lp/soyuz/stories/webservice/xx-archive.txt 2011-02-03 19:06:35 +0000
@@ -28,6 +28,7 @@
28 resource_type_link: u'http://.../#archive'28 resource_type_link: u'http://.../#archive'
29 self_link: u'http://.../~cprov/+archive/ppa'29 self_link: u'http://.../~cprov/+archive/ppa'
30 signing_key_fingerprint: None30 signing_key_fingerprint: None
31 web_link: u'http://launchpad.../~cprov/+archive/ppa'
3132
32While the Archive signing key is being generated its33While the Archive signing key is being generated its
33'signing_key_fingerprint' attribute is None.34'signing_key_fingerprint' attribute is None.
@@ -93,6 +94,7 @@
93 resource_type_link: u'http://.../#archive'94 resource_type_link: u'http://.../#archive'
94 self_link: u'http://.../ubuntutest/+archive/primary'95 self_link: u'http://.../ubuntutest/+archive/primary'
95 signing_key_fingerprint: None96 signing_key_fingerprint: None
97 web_link: u'http://launchpad.../ubuntutest/+archive/primary'
9698
97A distribution can also provide a list of all its archives:99A distribution can also provide a list of all its archives:
98100
@@ -833,6 +835,7 @@
833 resource_type_link: u'http://.../#archive'835 resource_type_link: u'http://.../#archive'
834 self_link: u'http://.../~cprov/+archive/p3a'836 self_link: u'http://.../~cprov/+archive/p3a'
835 signing_key_fingerprint: u'tag:launchpad.net:2008:redacted'837 signing_key_fingerprint: u'tag:launchpad.net:2008:redacted'
838 web_link: u'http://launchpad.../~cprov/+archive/p3a'
836839
837 >>> pprint_entry(cprov_webservice.get("/~cprov/+archive/p3a").jsonBody())840 >>> pprint_entry(cprov_webservice.get("/~cprov/+archive/p3a").jsonBody())
838 commercial: False841 commercial: False
@@ -847,6 +850,7 @@
847 resource_type_link: u'http://.../#archive'850 resource_type_link: u'http://.../#archive'
848 self_link: u'http://.../~cprov/+archive/p3a'851 self_link: u'http://.../~cprov/+archive/p3a'
849 signing_key_fingerprint: u'ABCDEF0123456789ABCDDCBA0000111112345678'852 signing_key_fingerprint: u'ABCDEF0123456789ABCDDCBA0000111112345678'
853 web_link: u'http://launchpad.../~cprov/+archive/p3a'
850854
851== Creating subscriptions to a (private) archive ==855== Creating subscriptions to a (private) archive ==
852856
@@ -904,6 +908,7 @@
904 self_link: u'http://api.../~cprov/+archive/p3a/+subscriptions/mark'908 self_link: u'http://api.../~cprov/+archive/p3a/+subscriptions/mark'
905 status: u'Active'909 status: u'Active'
906 subscriber_link: u'http://api.launchpad.dev/beta/~mark'910 subscriber_link: u'http://api.launchpad.dev/beta/~mark'
911 web_link: u'http://launchpad.../~cprov/+archive/p3a/+subscriptions/mark'
907912
908Other webservice users cannot view the subscription.913Other webservice users cannot view the subscription.
909914
910915
=== modified file 'lib/lp/soyuz/stories/webservice/xx-builds.txt'
--- lib/lp/soyuz/stories/webservice/xx-builds.txt 2011-01-18 23:43:48 +0000
+++ lib/lp/soyuz/stories/webservice/xx-builds.txt 2011-02-03 19:06:35 +0000
@@ -54,11 +54,12 @@
54 log_url: u'http://.../~cprov/+archive/ppa/+buildjob/26/+files/netapplet-1.0.0.tar.gz'54 log_url: u'http://.../~cprov/+archive/ppa/+buildjob/26/+files/netapplet-1.0.0.tar.gz'
55 pocket: u'Release'55 pocket: u'Release'
56 resource_type_link: u'http://api.launchpad.dev/beta/#build'56 resource_type_link: u'http://api.launchpad.dev/beta/#build'
57 score: None 57 score: None
58 self_link: u'http://api.launchpad.dev/beta/~cprov/+archive/ppa/+buildjob/26'58 self_link: u'http://api.launchpad.dev/beta/~cprov/+archive/ppa/+buildjob/26'
59 status: u'Failed to build'59 status: u'Failed to build'
60 title: u'i386 build of cdrkit 1.0 in ubuntu breezy-autotest RELEASE'60 title: u'i386 build of cdrkit 1.0 in ubuntu breezy-autotest RELEASE'
61 upload_log_url: None61 upload_log_url: None
62 web_link: u'http://launchpad.../~cprov/+archive/ppa/+buildjob/26'
6263
63Whereas the 1.0 webservice for builds maintains the old property names64Whereas the 1.0 webservice for builds maintains the old property names
64(without underscores):65(without underscores):
@@ -85,6 +86,7 @@
85 self_link: u'http://.../~cprov/+archive/ppa/+buildjob/26'86 self_link: u'http://.../~cprov/+archive/ppa/+buildjob/26'
86 title: u'i386 build of cdrkit 1.0 in ubuntu breezy-autotest RELEASE'87 title: u'i386 build of cdrkit 1.0 in ubuntu breezy-autotest RELEASE'
87 upload_log_url: None88 upload_log_url: None
89 web_link: u'http://launchpad.../~cprov/+archive/ppa/+buildjob/26'
8890
89For testing purposes we will set 'buildlog' and 'upload_log' to the91For testing purposes we will set 'buildlog' and 'upload_log' to the
90same library file, so both can be verified.92same library file, so both can be verified.
9193
=== modified file 'lib/lp/soyuz/stories/webservice/xx-distroarchseries.txt'
--- lib/lp/soyuz/stories/webservice/xx-distroarchseries.txt 2011-01-19 00:32:50 +0000
+++ lib/lp/soyuz/stories/webservice/xx-distroarchseries.txt 2011-02-03 19:06:35 +0000
@@ -46,4 +46,4 @@
46 self_link: u'http://.../ubuntu/hoary/i386'46 self_link: u'http://.../ubuntu/hoary/i386'
47 supports_virtualized: True47 supports_virtualized: True
48 title: u'The Hoary Hedgehog Release for i386 (x86)'48 title: u'The Hoary Hedgehog Release for i386 (x86)'
4949 web_link: u'http://launchpad.../ubuntu/hoary/i386'
5050
=== modified file 'lib/lp/translations/stories/webservice/xx-potemplate.txt'
--- lib/lp/translations/stories/webservice/xx-potemplate.txt 2010-07-14 06:36:24 +0000
+++ lib/lp/translations/stories/webservice/xx-potemplate.txt 2011-02-03 19:06:35 +0000
@@ -28,6 +28,7 @@
28 translation_domain: u'pmount'28 translation_domain: u'pmount'
29 translation_files_collection_link:29 translation_files_collection_link:
30 u'http://.../pmount/+pots/pmount/translation_files'30 u'http://.../pmount/+pots/pmount/translation_files'
31 web_link: u'http://translations.launchpad.../ubuntu/hoary/+source/pmount/+pots/pmount'
3132
32"translation_files" will list all POFiles associated with this template.33"translation_files" will list all POFiles associated with this template.
3334
3435
=== modified file 'versions.cfg'
--- versions.cfg 2011-02-02 09:14:02 +0000
+++ versions.cfg 2011-02-03 19:06:35 +0000
@@ -33,8 +33,8 @@
33lazr.delegates = 1.2.033lazr.delegates = 1.2.0
34lazr.enum = 1.1.234lazr.enum = 1.1.2
35lazr.lifecycle = 1.135lazr.lifecycle = 1.1
36lazr.restful = 0.15.436lazr.restful = 0.16.0
37lazr.restfulclient = 0.11.137lazr.restfulclient = 0.11.2
38lazr.smtptest = 1.138lazr.smtptest = 1.1
39lazr.testing = 0.1.139lazr.testing = 0.1.1
40lazr.uri = 1.0.240lazr.uri = 1.0.2
@@ -75,7 +75,7 @@
75Twisted = 10.2.0-4395fix-175Twisted = 10.2.0-4395fix-1
76uuid = 1.3076uuid = 1.30
77van.testing = 2.0.177van.testing = 2.0.1
78wadllib = 1.1.578wadllib = 1.2.0
79webunit = 1.3.879webunit = 1.3.8
80# r1579 of lp:windmill, with a fix for the 512k bug.80# r1579 of lp:windmill, with a fix for the 512k bug.
81# Built from lp:~launchpad/windmill/512k-bug-fix.81# Built from lp:~launchpad/windmill/512k-bug-fix.