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
1=== modified file 'lib/canonical/launchpad/browser/librarian.py'
2--- lib/canonical/launchpad/browser/librarian.py 2010-12-20 17:42:47 +0000
3+++ lib/canonical/launchpad/browser/librarian.py 2011-02-03 19:06:35 +0000
4@@ -29,9 +29,7 @@
5 from canonical.launchpad.interfaces.librarian import ILibraryFileAlias
6 from canonical.launchpad.layers import WebServiceLayer
7 from canonical.launchpad.webapp.authorization import check_permission
8-from canonical.launchpad.webapp.interfaces import (
9- IWebBrowserOriginatingRequest,
10- )
11+from lazr.restful.interfaces import IWebBrowserOriginatingRequest
12 from canonical.launchpad.webapp.publisher import (
13 canonical_url,
14 LaunchpadView,
15
16=== modified file 'lib/canonical/launchpad/doc/canonical_url_examples.txt'
17--- lib/canonical/launchpad/doc/canonical_url_examples.txt 2011-01-11 03:29:37 +0000
18+++ lib/canonical/launchpad/doc/canonical_url_examples.txt 2011-02-03 19:06:35 +0000
19@@ -287,7 +287,7 @@
20 >>> from lp.bugs.interfaces.bugnomination import IBugNominationSet
21 >>> bug_nomination = getUtility(IBugNominationSet).get(1)
22 >>> canonical_url(bug_nomination)
23- u'http://launchpad.dev/bugs/1/nominations/1'
24+ u'http://bugs.launchpad.dev/bugs/1/nominations/1'
25
26
27 == Remote Bug Trackers and Remote Bugs ==
28
29=== modified file 'lib/canonical/launchpad/webapp/configure.zcml'
30--- lib/canonical/launchpad/webapp/configure.zcml 2011-02-02 15:43:31 +0000
31+++ lib/canonical/launchpad/webapp/configure.zcml 2011-02-03 19:06:35 +0000
32@@ -55,7 +55,7 @@
33 />
34 <adapter
35 for="canonical.launchpad.layers.WebServiceLayer"
36- provides="canonical.launchpad.webapp.interfaces.IWebBrowserOriginatingRequest"
37+ provides="lazr.restful.interfaces.IWebBrowserOriginatingRequest"
38 factory="canonical.launchpad.webapp.servers.web_service_request_to_browser_request"
39 />
40
41
42=== modified file 'lib/canonical/launchpad/webapp/interfaces.py'
43--- lib/canonical/launchpad/webapp/interfaces.py 2010-12-16 22:42:28 +0000
44+++ lib/canonical/launchpad/webapp/interfaces.py 2011-02-03 19:06:35 +0000
45@@ -854,14 +854,6 @@
46 """
47
48
49-class IWebBrowserOriginatingRequest(Interface):
50- """Marker interface for converting webservice requests into webapp ones.
51-
52- It's used in the webservice domain for calculating webapp URLs, for
53- instance, `ProxiedLibraryFileAlias`.
54- """
55-
56-
57 # XXX mars 2010-07-14 bug=598816
58 #
59 # We need a conditional import of the request events until the real events
60
61=== modified file 'lib/lp/app/doc/tales.txt'
62--- lib/lp/app/doc/tales.txt 2010-11-24 18:57:14 +0000
63+++ lib/lp/app/doc/tales.txt 2011-02-03 19:06:35 +0000
64@@ -806,10 +806,10 @@
65 The "standard" 'url' name is supported:
66
67 >>> test_tales("bugwatch/fmt:url", bugwatch=sf_bugwatch)
68- u'/bugs/12/+watch/13'
69+ u'http://bugs.launchpad.dev/bugs/12/+watch/13'
70
71 >>> test_tales("bugwatch/fmt:url", bugwatch=email_bugwatch)
72- u'/bugs/12/+watch/14'
73+ u'http://bugs.launchpad.dev/bugs/12/+watch/14'
74
75 As are 'external-link' and 'external-link-short', which help when hiding
76 email addresses from users who are not logged in:
77
78=== modified file 'lib/lp/blueprints/tests/test_webservice.py'
79--- lib/lp/blueprints/tests/test_webservice.py 2011-01-06 15:26:14 +0000
80+++ lib/lp/blueprints/tests/test_webservice.py 2011-02-03 19:06:35 +0000
81@@ -52,7 +52,8 @@
82 webservice = webservice_for_person(user)
83 response = webservice.get(
84 '/%s/+spec/%s' % (spec.product.name, spec.name))
85- expected_keys = [u'self_link', u'http_etag', u'resource_type_link']
86+ expected_keys = [u'self_link', u'http_etag', u'resource_type_link',
87+ u'web_link']
88 self.assertEqual(response.status, 200)
89 self.assertContentEqual(expected_keys, response.jsonBody().keys())
90
91
92=== modified file 'lib/lp/bugs/browser/configure.zcml'
93--- lib/lp/bugs/browser/configure.zcml 2011-01-11 23:01:02 +0000
94+++ lib/lp/bugs/browser/configure.zcml 2011-02-03 19:06:35 +0000
95@@ -912,7 +912,8 @@
96 <browser:url
97 for="lp.bugs.interfaces.cve.ICve"
98 path_expression="sequence"
99- parent_utility="lp.bugs.interfaces.cve.ICveSet"/>
100+ parent_utility="lp.bugs.interfaces.cve.ICveSet"
101+ rootsite="bugs" />
102 <browser:defaultView
103 for="lp.bugs.interfaces.cve.ICve"
104 name="+index"/>
105@@ -1121,14 +1122,16 @@
106 <browser:url
107 for="lp.bugs.interfaces.bugnomination.IBugNomination"
108 path_expression="string:nominations/${id}"
109- attribute_to_parent="bug"/>
110+ attribute_to_parent="bug"
111+ rootsite="bugs" />
112 </facet>
113 <facet
114 facet="bugs">
115 <browser:url
116 for="lp.bugs.interfaces.bugwatch.IBugWatch"
117 path_expression="string:+watch/${id}"
118- attribute_to_parent="bug"/>
119+ attribute_to_parent="bug"
120+ rootsite="bugs"/>
121 <browser:defaultView
122 for="lp.bugs.interfaces.bugwatch.IBugWatch"
123 name="+edit"/>
124
125=== modified file 'lib/lp/bugs/browser/tests/buglinktarget-views.txt'
126--- lib/lp/bugs/browser/tests/buglinktarget-views.txt 2010-10-18 22:24:59 +0000
127+++ lib/lp/bugs/browser/tests/buglinktarget-views.txt 2011-02-03 19:06:35 +0000
128@@ -32,7 +32,7 @@
129 Link a bug report
130
131 >>> print view.cancel_url
132- http://launchpad.dev/bugs/cve/2005-2730
133+ http://bugs.launchpad.dev/bugs/cve/2005-2730
134
135 It has a simple widget to enter the bug number or nickname of the bug to link
136 to. After it links the bug, it sends a ObjectModifiedEvent.
137@@ -86,7 +86,7 @@
138 Remove links to bug reports
139
140 >>> print view.cancel_url
141- http://launchpad.dev/bugs/cve/2005-2730
142+ http://bugs.launchpad.dev/bugs/cve/2005-2730
143
144 After removing the bugs, it sends a SQLObjectModified event.
145
146
147=== modified file 'lib/lp/bugs/interfaces/bugnomination.py'
148--- lib/lp/bugs/interfaces/bugnomination.py 2010-08-20 20:31:18 +0000
149+++ lib/lp/bugs/interfaces/bugnomination.py 2011-02-03 19:06:35 +0000
150@@ -105,7 +105,7 @@
151
152 A nomination can apply to an IDistroSeries or an IProductSeries.
153 """
154- export_as_webservice_entry()
155+ export_as_webservice_entry(publish_web_link=False)
156
157 # We want to customize the titles and descriptions of some of the
158 # attributes of our parent interfaces, so we redefine those specific
159
160=== modified file 'lib/lp/bugs/interfaces/bugsubscription.py'
161--- lib/lp/bugs/interfaces/bugsubscription.py 2011-01-28 10:03:12 +0000
162+++ lib/lp/bugs/interfaces/bugsubscription.py 2011-02-03 19:06:35 +0000
163@@ -39,7 +39,7 @@
164 class IBugSubscription(Interface):
165 """The relationship between a person and a bug."""
166
167- export_as_webservice_entry()
168+ export_as_webservice_entry(publish_web_link=False)
169
170 id = Int(title=_('ID'), readonly=True, required=True)
171 person = exported(PersonChoice(
172
173=== modified file 'lib/lp/bugs/stories/webservice/xx-bug-tracker.txt'
174--- lib/lp/bugs/stories/webservice/xx-bug-tracker.txt 2010-04-15 08:45:31 +0000
175+++ lib/lp/bugs/stories/webservice/xx-bug-tracker.txt 2011-02-03 19:06:35 +0000
176@@ -28,6 +28,7 @@
177 summary: u'The Mozilla.org bug tracker is the grand-daddy of ...'
178 title: u'The Mozilla.org Bug Tracker'
179 watches_collection_link: u'http:.../bugs/bugtrackers/mozilla.org/watches'
180+ web_link: u'http://bugs.launchpad.dev/bugs/bugtrackers/mozilla.org'
181 --- ...
182
183 A bug tracker can be retrieved using the the bug tracker collection's
184@@ -75,3 +76,4 @@
185 summary: u'Wombat summary'
186 title: u'Wombat title'
187 watches_collection_link: u'http://.../bugs/bugtrackers/wombat/watches'
188+ web_link: u'http://bugs.launchpad.dev/bugs/bugtrackers/wombat'
189
190=== modified file 'lib/lp/bugs/stories/webservice/xx-bug.txt'
191--- lib/lp/bugs/stories/webservice/xx-bug.txt 2011-01-28 10:03:12 +0000
192+++ lib/lp/bugs/stories/webservice/xx-bug.txt 2011-02-03 19:06:35 +0000
193@@ -53,6 +53,7 @@
194 users_affected_with_dupes_collection_link: u'http://.../bugs/11/users_affected_with_dupes'
195 users_unaffected_collection_link: u'http://.../bugs/11/users_unaffected'
196 users_unaffected_count: 0
197+ web_link: u'http://bugs.../bugs/11'
198 who_made_private_link: None
199
200 Bugs are indexed by number beneath the top-level collection.
201@@ -239,6 +240,7 @@
202 resource_type_link: u'http://.../#message'
203 self_link: u'http://.../firefox/+bug/5/comments/0'
204 subject: u'Firefox install instructions should be complete'
205+ web_link: u'http://bugs.../firefox/+bug/5/comments/0'
206
207 The messages are stored beneath the bug-specific collection. Their
208 URLs are based on their position with respect to the
209@@ -283,6 +285,7 @@
210 resource_type_link: u'http://api.launchpad.dev/beta/#message'
211 self_link: u'http://api.launchpad.dev/beta/firefox/+bug/5/comments/1'
212 subject: u'A new message'
213+ web_link: u'...'
214
215 We don't have to submit a subject when we add a new message.
216
217@@ -301,6 +304,7 @@
218 ...
219 self_link: u'http://api.launchpad.dev/beta/firefox/+bug/5/comments/2'
220 subject: u'Re: Firefox install instructions should be complete'
221+ web_link: u'...'
222
223
224 Bug tasks
225@@ -343,6 +347,7 @@
226 status: u'Confirmed'
227 target_link: u'http://api.../debian/+source/mozilla-firefox'
228 title: u'Bug #1 in mozilla-firefox (Debian): "Firefox does not support SVG"'
229+ web_link: u'http://bugs.../debian/+source/mozilla-firefox/+bug/1'
230
231 The collection of bug tasks is not exposed as a resource:
232
233@@ -676,6 +681,7 @@
234 target_link: u'http://.../fooix/0.1'
235 ---
236
237+
238 John cannot approve or decline the nomination.
239
240 >>> nom_url = nominations['entries'][0]['self_link']
241@@ -830,13 +836,14 @@
242 resource_type_link: u'http://.../#bug_subscription'
243 self_link: u'http://.../bugs/1/+subscription/name12'
244 subscribed_by_link: u'http://.../~janitor'
245-
246+ <BLANKLINE>
247 bug_link: u'http://.../bugs/1'
248 date_created: u'2006-10-16T18:31:43.154816+00:00'
249 person_link: u'http://.../~stevea'
250 resource_type_link: u'http://.../#bug_subscription'
251 self_link: u'http://.../bugs/1/+subscription/stevea'
252 subscribed_by_link: u'http://.../~janitor'
253+ <BLANKLINE>
254
255 Each subscription can be accessed individually.
256
257@@ -1072,6 +1079,7 @@
258 self_link: u'http://.../bugs/1/+watch/2'
259 title: u'The Mozilla.org Bug Tracker #2000'
260 url: u'https://bugzilla.mozilla.org/show_bug.cgi?id=2000'
261+ web_link: u'http://bugs.../bugs/1/+watch/2'
262
263 >>> bug_watch = webservice.get(bug_watch_2000['self_link']).jsonBody()
264 >>> bug_watch == bug_watch_2000
265@@ -1143,7 +1151,7 @@
266 self_link: u'http://.../bugs/1/+watch/13'
267 title: u'The Mozilla.org Bug Tracker #9876'
268 url: u'https://bugzilla.mozilla.org/show_bug.cgi?id=9876'
269-
270+ web_link: u'http://bugs.../bugs/1/+watch/13'
271
272 Bug Trackers
273 ------------
274@@ -1164,6 +1172,7 @@
275 summary: u'The Mozilla.org bug tracker is the grand-daddy of bugzillas...'
276 title: u'The Mozilla.org Bug Tracker'
277 watches_collection_link: u'http://.../bugs/bugtrackers/mozilla.org/watches'
278+ web_link: u'http://bugs.../bugs/bugtrackers/mozilla.org'
279
280 We can change various aspects of bug trackers.
281
282@@ -1220,6 +1229,7 @@
283 summary: u'Where Bob files his bugs.'
284 title: u"Bob's Tracker"
285 watches_collection_link: u'http://.../bugs/bugtrackers/bob/watches'
286+ web_link: u'http://bugs.../bugs/bugtrackers/bob'
287
288 Non-admins can't disable a bugtracker through the API.
289
290@@ -1284,6 +1294,7 @@
291 self_link: u'http://.../bugs/1/+attachment/1'
292 title: u'numbers.txt'
293 type: u'Unspecified'
294+ web_link: u'http://bugs.../bugs/1/+attachment/1'
295 ---
296
297 The attachment can be fetched directly:
298@@ -1297,6 +1308,7 @@
299 self_link: u'http://.../bugs/1/+attachment/1'
300 title: u'numbers.txt'
301 type: u'Unspecified'
302+ web_link: u'http://bugs.../bugs/1/+attachment/1'
303
304 Fetching the data actually yields a redirect to the Librarian, which
305 we must follow to download the data.
306@@ -1340,6 +1352,7 @@
307 resource_type_link: u'http://.../#message'
308 self_link: u'http://.../firefox/+bug/1/comments/2'
309 subject: u'Re: Firefox does not support SVG'
310+ web_link: u'http://bugs.../firefox/+bug/1/comments/2'
311
312 The message also links back to the attachments that were uploaded at
313 the same time.
314@@ -1847,6 +1860,7 @@
315 status: u'Candidate'
316 title: u'CVE-2005-2737 (Candidate)'
317 url: u'http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=2005-2737'
318+ web_link: u'http://bugs.launchpad.dev/bugs/cve/2005-2737'
319 ---
320 ...
321 self_link: u'http://.../bugs/cve/2005-2736'
322@@ -1884,6 +1898,7 @@
323 status: u'Entry'
324 title: u'CVE-1999-8979 (Entry)'
325 url: u'http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=1999-8979'
326+ web_link: u'http://bugs.launchpad.dev/bugs/cve/1999-8979'
327 ---
328
329 For every CVE we can also look at the bugs linked to it.
330
331=== modified file 'lib/lp/code/interfaces/diff.py'
332--- lib/lp/code/interfaces/diff.py 2010-12-02 16:13:51 +0000
333+++ lib/lp/code/interfaces/diff.py 2011-02-03 19:06:35 +0000
334@@ -122,7 +122,7 @@
335 trying to determine the effective changes of landing the source branch on
336 the target branch.
337 """
338- export_as_webservice_entry()
339+ export_as_webservice_entry(publish_web_link=False)
340
341 source_revision_id = exported(
342 TextLine(
343
344=== modified file 'lib/lp/code/stories/webservice/xx-branch.txt'
345--- lib/lp/code/stories/webservice/xx-branch.txt 2010-10-22 13:43:50 +0000
346+++ lib/lp/code/stories/webservice/xx-branch.txt 2011-02-03 19:06:35 +0000
347@@ -142,9 +142,9 @@
348 subscriptions_collection_link: u'http://.../~eric/fooix/trunk/subscriptions'
349 unique_name: u'~eric/fooix/trunk'
350 url: None
351+ web_link: u'http://code.../~eric/fooix/trunk'
352 whiteboard: None
353
354-
355 There is a branch merge proposal with Fooix trunk as the target branch, so it
356 should have a branch at the endpoint of landing_candidates.
357
358
359=== modified file 'lib/lp/code/stories/webservice/xx-branchmergeproposal.txt'
360--- lib/lp/code/stories/webservice/xx-branchmergeproposal.txt 2010-10-26 03:06:30 +0000
361+++ lib/lp/code/stories/webservice/xx-branchmergeproposal.txt 2011-02-03 19:06:35 +0000
362@@ -75,6 +75,7 @@
363 target_branch_link: u'http://api.launchpad.dev/devel/~...'
364 votes_collection_link:
365 u'http://api.launchpad.dev/devel/~.../+merge/.../votes'
366+ web_link: u'http://code.../~.../+merge/...'
367
368 If we try and create the merge proposal again, we should get a ValueError.
369
370@@ -170,6 +171,7 @@
371 supersedes_link: None
372 target_branch_link: u'http://.../~target/fooix/trunk'
373 votes_collection_link: u'http://.../~source/fooix/fix-it/+merge/.../votes'
374+ web_link: u'http://code.../~source/fooix/fix-it/+merge/...'
375
376
377 == Read the comments ==
378@@ -192,6 +194,7 @@
379 title: u'Comment on proposed merge of lp://dev/~source/fooix/fix-it into lp://dev/~target/fooix/trunk'
380 vote: u'Approve'
381 vote_tag: u'code'
382+ web_link: u'http://code.../~source/fooix/fix-it/+merge/.../comments/...'
383
384 >>> comment_2 = webservice.named_get(
385 ... merge_proposal['self_link'], 'getComment', id=2).jsonBody()
386@@ -207,6 +210,7 @@
387 title: ...
388 vote: u'Abstain'
389 vote_tag: None
390+ web_link: u'http://code.../~source/fooix/fix-it/+merge/.../comments/...'
391
392
393 == Check the votes ==
394@@ -280,7 +284,7 @@
395 title: ...
396 vote: u'Approve'
397 vote_tag: u'code'
398-
399+ web_link: u'http://code.../~source/fooix/fix-it/+merge/.../comments/...'
400
401 In fact, now that the votes indicate approval, we might as well set the merge
402 proposal status to "Approved" as well.
403
404=== modified file 'lib/lp/code/stories/webservice/xx-branchsubscription.txt'
405--- lib/lp/code/stories/webservice/xx-branchsubscription.txt 2010-05-27 04:35:57 +0000
406+++ lib/lp/code/stories/webservice/xx-branchsubscription.txt 2011-02-03 19:06:35 +0000
407@@ -39,6 +39,7 @@
408 review_level: u'No email'
409 self_link: u'http://.../~farmer-bob/farm/corn/+subscription/farmer-joe'
410 subscribed_by_link: u'http://.../~salgado'
411+ web_link: u'http://code.../~farmer-bob/farm/corn/+subscription/farmer-joe'
412
413 >>> def print_subscriber_count(branch):
414 ... subscribers = webservice.get(
415@@ -93,6 +94,7 @@
416 review_level: u'Status changes only'
417 self_link: u'http://.../~farmer-bob/farm/corn/+subscription/farmer-joe'
418 subscribed_by_link: u'http://.../~salgado'
419+ web_link: u'http://code.../~farmer-bob/farm/corn/+subscription/farmer-joe'
420
421
422 We print the count, and even though subscribe was called again, there's still
423
424=== modified file 'lib/lp/hardwaredb/interfaces/hwdb.py'
425--- lib/lp/hardwaredb/interfaces/hwdb.py 2010-11-09 14:47:27 +0000
426+++ lib/lp/hardwaredb/interfaces/hwdb.py 2011-02-03 19:06:35 +0000
427@@ -156,7 +156,7 @@
428
429 See doc/hwdb.txt for details about the attributes.
430 """
431- export_as_webservice_entry()
432+ export_as_webservice_entry(publish_web_link=False)
433
434 date_created = exported(
435 Datetime(
436@@ -433,7 +433,7 @@
437
438 class IHWDriver(Interface):
439 """Information about a device driver."""
440- export_as_webservice_entry()
441+ export_as_webservice_entry(publish_web_link=False)
442
443 id = exported(
444 Int(title=u'Driver ID', required=True, readonly=True))
445@@ -560,7 +560,7 @@
446 class IHWDriverName(Interface):
447 """A driver name as appearing in `IHWDriver`.
448 """
449- export_as_webservice_entry()
450+ export_as_webservice_entry(publish_web_link=False)
451
452 name = exported(
453 TextLine(
454@@ -572,7 +572,7 @@
455 class IHWDriverPackageName(Interface):
456 """A driver name as appearing in `IHWDriver`.
457 """
458- export_as_webservice_entry()
459+ export_as_webservice_entry(publish_web_link=False)
460
461 package_name = exported(
462 TextLine(
463@@ -659,7 +659,7 @@
464 class IHWVendorID(Interface):
465 """A list of vendor IDs for different busses associated with vendor names.
466 """
467- export_as_webservice_entry()
468+ export_as_webservice_entry(publish_web_link=False)
469 id = exported(
470 Int(title=u'The Database ID', required=True, readonly=True))
471
472@@ -714,7 +714,7 @@
473
474 class IHWDeviceClass(Interface):
475 """The capabilities of a device."""
476- export_as_webservice_entry()
477+ export_as_webservice_entry(publish_web_link=False)
478
479 id = Int(title=u'Device class ID', required=True, readonly=True)
480 device = Reference(schema=Interface)
481@@ -774,7 +774,7 @@
482
483 class IHWDevice(Interface):
484 """Core information to identify a device."""
485- export_as_webservice_entry()
486+ export_as_webservice_entry(publish_web_link=False)
487
488 id = exported(
489 Int(title=u'Device ID', required=True, readonly=True))
490@@ -1038,7 +1038,7 @@
491
492 class IHWSubmissionDevice(Interface):
493 """Link a submission to a IHWDeviceDriver row."""
494- export_as_webservice_entry()
495+ export_as_webservice_entry(publish_web_link=False)
496
497 id = exported(
498 Int(title=u'HWSubmissionDevice ID', required=True, readonly=True))
499@@ -1169,7 +1169,7 @@
500 class IHWDBApplication(ILaunchpadApplication):
501 """Hardware database application application root."""
502
503- export_as_webservice_entry('hwdb')
504+ export_as_webservice_entry('hwdb', publish_web_link=False)
505
506 @operation_parameters(
507 bus=Choice(
508
509=== modified file 'lib/lp/registry/interfaces/productrelease.py'
510--- lib/lp/registry/interfaces/productrelease.py 2010-08-20 20:31:18 +0000
511+++ lib/lp/registry/interfaces/productrelease.py 2011-02-03 19:06:35 +0000
512@@ -217,7 +217,7 @@
513 class IProductReleaseFile(IProductReleaseFileEditRestricted,
514 IProductReleaseFilePublic):
515 """A file associated with a ProductRelease."""
516- export_as_webservice_entry("project_release_file")
517+ export_as_webservice_entry("project_release_file", publish_web_link=False)
518
519
520 class IProductReleaseEditRestricted(Interface):
521
522=== modified file 'lib/lp/registry/interfaces/structuralsubscription.py'
523--- lib/lp/registry/interfaces/structuralsubscription.py 2011-01-13 15:12:36 +0000
524+++ lib/lp/registry/interfaces/structuralsubscription.py 2011-02-03 19:06:35 +0000
525@@ -146,7 +146,7 @@
526 IStructuralSubscriptionPublic, IStructuralSubscriptionRestricted):
527 """A subscription to a Launchpad structure."""
528
529- export_as_webservice_entry()
530+ export_as_webservice_entry(publish_web_link=False)
531
532
533 class IStructuralSubscriptionTargetRead(Interface):
534
535=== modified file 'lib/lp/registry/interfaces/wikiname.py'
536--- lib/lp/registry/interfaces/wikiname.py 2010-08-20 20:31:18 +0000
537+++ lib/lp/registry/interfaces/wikiname.py 2011-02-03 19:06:35 +0000
538@@ -26,7 +26,7 @@
539
540 class IWikiName(IHasOwner):
541 """Wiki for Users"""
542- export_as_webservice_entry()
543+ export_as_webservice_entry(publish_web_link=False)
544 id = Int(title=_("Database ID"), required=True, readonly=True)
545 # schema=Interface will be overriden in person.py because of circular
546 # dependencies.
547
548=== modified file 'lib/lp/registry/stories/webservice/xx-distribution-mirror.txt'
549--- lib/lp/registry/stories/webservice/xx-distribution-mirror.txt 2010-10-18 22:24:59 +0000
550+++ lib/lp/registry/stories/webservice/xx-distribution-mirror.txt 2011-02-03 19:06:35 +0000
551@@ -32,6 +32,7 @@
552 self_link: u'http://.../ubuntu/+mirror/canonical-archive'
553 speed: u'100 Mbps'
554 status: u'Official'
555+ web_link: u'http://launchpad.../ubuntu/+mirror/canonical-archive'
556 whiteboard: None
557
558 And CD image mirrors:
559@@ -60,6 +61,7 @@
560 self_link: u'http://.../ubuntu/+mirror/canonical-releases'
561 speed: u'100 Mbps'
562 status: u'Official'
563+ web_link: u'http://launchpad.../ubuntu/+mirror/canonical-releases'
564 whiteboard: None
565
566 = Security checks =
567@@ -152,6 +154,7 @@
568 self_link: u'http://.../ubuntu/+mirror/archive-404-mirror'
569 speed: u'512 Kbps'
570 status: u'Official'
571+ web_link: u'http://launchpad.../ubuntu/+mirror/archive-404-mirror'
572 whiteboard: None
573
574 Now trying to set the owner using Sample Person's webservice is not authorized.
575@@ -234,6 +237,7 @@
576 self_link: u'http://.../ubuntu/+mirror/canonical-releases'
577 speed: u'100 Mbps'
578 status: u'Unofficial'
579+ web_link: u'http://launchpad.../ubuntu/+mirror/canonical-releases'
580 whiteboard: u'This mirror is too shiny to be true'
581
582 = Distribution Mirror Custom Operations =
583
584=== modified file 'lib/lp/registry/stories/webservice/xx-distribution-source-package.txt'
585--- lib/lp/registry/stories/webservice/xx-distribution-source-package.txt 2010-06-08 13:07:44 +0000
586+++ lib/lp/registry/stories/webservice/xx-distribution-source-package.txt 2011-02-03 19:06:35 +0000
587@@ -19,7 +19,8 @@
588 u'resource_type_link': u'http://.../#distribution_source_package',
589 u'self_link': u'http://.../debian/+source/mozilla-firefox',
590 u'title': u'\u201cmozilla-firefox\u201d package in Debian',
591- u'upstream_product_link': None}
592+ u'upstream_product_link': None,
593+ u'web_link': u'http://launchpad.../debian/+source/mozilla-firefox'}
594
595 You can obtain a collection of bug tasks associated with the source
596 package using the "getBugTasks" method.
597
598=== modified file 'lib/lp/registry/stories/webservice/xx-distribution.txt'
599--- lib/lp/registry/stories/webservice/xx-distribution.txt 2010-11-03 01:42:20 +0000
600+++ lib/lp/registry/stories/webservice/xx-distribution.txt 2011-02-03 19:06:35 +0000
601@@ -49,6 +49,7 @@
602 series_collection_link: u'http://.../ubuntu/series'
603 summary: u'Ubuntu is a new approach to Linux Distribution...'
604 title: u'Ubuntu Linux'
605+ web_link: u'http://launchpad.../ubuntu'
606
607
608 Distribution Custom Operations
609@@ -155,6 +156,7 @@
610 self_link: u'http://.../ubuntu/+mirror/canonical-releases'
611 speed: u'100 Mbps'
612 status: u'Official'
613+ web_link: u'http://launchpad.../ubuntu/+mirror/canonical-releases'
614 whiteboard: None
615
616 "getCountryMirror" returns the country DNS mirror for a given country;
617
618=== modified file 'lib/lp/registry/stories/webservice/xx-distroseries.txt'
619--- lib/lp/registry/stories/webservice/xx-distroseries.txt 2010-06-09 08:26:26 +0000
620+++ lib/lp/registry/stories/webservice/xx-distroseries.txt 2011-02-03 19:06:35 +0000
621@@ -84,7 +84,7 @@
622 supported: False
623 title: u'The Hoary Hedgehog Release'
624 version: u'5.04'
625-
626+ web_link: u'http://launchpad.../ubuntu/hoary'
627
628 Creating a milestone on the distroseries
629 ----------------------------------------
630
631=== modified file 'lib/lp/registry/stories/webservice/xx-person.txt'
632--- lib/lp/registry/stories/webservice/xx-person.txt 2010-12-02 20:40:31 +0000
633+++ lib/lp/registry/stories/webservice/xx-person.txt 2011-02-03 19:06:35 +0000
634@@ -58,6 +58,7 @@
635 team_owner_link: None
636 time_zone: None
637 visibility: u'Public'
638+ web_link: u'http://launchpad.../~salgado'
639 wiki_names_collection_link: u'http://.../~salgado/wiki_names'
640
641 >>> ubuntu_team = webservice.get("/~ubuntu-team").jsonBody()
642@@ -120,6 +121,7 @@
643 team_owner_link: u'http://.../~mark'
644 time_zone: None
645 visibility: u'Public'
646+ web_link: u'http://launchpad.../~ubuntu-team'
647 wiki_names_collection_link: u'http://.../~ubuntu-team/wiki_names'
648
649 >>> sorted(set(ubuntu_team.keys()).difference(salgado.keys()))
650@@ -292,7 +294,8 @@
651 >>> sorted(salgado_landscape)
652 [u'date_expires', u'date_joined', u'http_etag',
653 u'last_change_comment', u'last_changed_by_link', u'member_link',
654- u'resource_type_link', u'self_link', u'status', u'team_link']
655+ u'resource_type_link', u'self_link', u'status', u'team_link',
656+ u'web_link']
657
658 Each team membership links to the person who approved the link.
659
660@@ -699,6 +702,7 @@
661 self_link: u'...'
662 title: u'...'
663 upstream_product_link: None
664+ web_link: u'...'
665 ---
666
667
668
669=== modified file 'lib/lp/registry/stories/webservice/xx-project-registry.txt'
670--- lib/lp/registry/stories/webservice/xx-project-registry.txt 2010-12-22 14:50:08 +0000
671+++ lib/lp/registry/stories/webservice/xx-project-registry.txt 2011-02-03 19:06:35 +0000
672@@ -88,6 +88,7 @@
673 sourceforge_project: None
674 summary: u'The Mozilla Project...'
675 title: u'The Mozilla Project'
676+ web_link: u'http://launchpad.../mozilla'
677 wiki_url: None
678
679 The milestones can be accessed through the
680@@ -192,6 +193,7 @@
681 summary: u'The Mozilla Firefox web browser'
682 title: u'Mozilla Firefox'
683 translation_focus_link: None
684+ web_link: u'http://launchpad.../firefox'
685 wiki_url: None
686
687 In Launchpad project names may not have uppercase letters in their
688@@ -255,6 +257,7 @@
689 summary: u'The Mozilla Firefox web browser'
690 title: u'Mozilla Firefox'
691 translation_focus_link: None
692+ web_link: u'http://launchpad.../firefox'
693 wiki_url: None
694
695 The milestones can be accessed through the
696@@ -499,7 +502,8 @@
697 u'resource_type_link': u'.../#timeline_project_series',
698 u'self_link': u'http://.../firefox/trunk',
699 u'status': u'Obsolete',
700- u'uri': u'/firefox/trunk'},
701+ u'uri': u'/firefox/trunk',
702+ u'web_link': u'http://launchpad.../firefox/trunk'},
703 {u'http_etag': ...
704 u'is_development_focus': False,
705 u'landmarks': [{u'code_name': u'First Stable Release',
706@@ -512,7 +516,8 @@
707 u'resource_type_link': u'.../#timeline_project_series',
708 u'self_link': u'http://.../firefox/1.0',
709 u'status': u'Active Development',
710- u'uri': u'/firefox/1.0'},
711+ u'uri': u'/firefox/1.0',
712+ u'web_link': u'http://launchpad.../firefox/1.0'},
713 {u'http_etag': ...
714 u'is_development_focus': False,
715 u'landmarks': [],
716@@ -521,7 +526,8 @@
717 u'resource_type_link': u'.../#timeline_project_series',
718 u'self_link': u'http://.../firefox/experimental',
719 u'status': u'Active Development',
720- u'uri': u'/firefox/experimental'}],
721+ u'uri': u'/firefox/experimental',
722+ u'web_link': u'http://launchpad.../firefox/experimental'}],
723 u'start': 0,
724 u'total_size': 3}
725
726@@ -879,6 +885,7 @@
727 status: u'Active Development'
728 summary: u'Foobadoo support for Babadoo'
729 title: u'Babadoo foobadoo series'
730+ web_link: u'http://launchpad.../babadoo/foobadoo'
731
732 "get_timeline" returns a lightweight representation of the series'
733 milestones and releases.
734@@ -894,7 +901,8 @@
735 u'resource_type_link': u'http://.../#timeline_project_series',
736 u'self_link': u'http://.../babadoo/foobadoo',
737 u'status': u'Active Development',
738- u'uri': u'/babadoo/foobadoo'}
739+ u'uri': u'/babadoo/foobadoo',
740+ u'web_link': u'http://launchpad.../babadoo/foobadoo'}
741
742
743 Creating a milestone on the product series
744@@ -982,6 +990,7 @@
745 self_link: u'http://.../firefox/1.0/1.0.0'
746 title: u'Mozilla Firefox 1.0.0 "First Stable Release"'
747 version: u'1.0.0'
748+ web_link: u'http://launchpad.../firefox/1.0/1.0.0'
749
750 The createProductRelease method is called by sending
751 "ws.op=createProductRelease" as a request variable along with the
752@@ -1059,6 +1068,7 @@
753 summary: None
754 target_link: u'http://.../firefox'
755 title: u'Mozilla Firefox 1.0'
756+ web_link: u'http://launchpad.../firefox/+milestone/1.0'
757
758 The milestone entry has a link to its release if it has one.
759
760
761=== modified file 'lib/lp/services/worlddata/interfaces/country.py'
762--- lib/lp/services/worlddata/interfaces/country.py 2010-08-20 20:31:18 +0000
763+++ lib/lp/services/worlddata/interfaces/country.py 2011-02-03 19:06:35 +0000
764@@ -41,7 +41,8 @@
765
766 class ICountry(Interface):
767 """The country description."""
768- export_as_webservice_entry(plural_name='countries')
769+ export_as_webservice_entry(
770+ plural_name='countries', publish_web_link=False)
771
772 id = Int(
773 title=_('Country ID'), required=True, readonly=True,
774
775=== modified file 'lib/lp/soyuz/interfaces/archivedependency.py'
776--- lib/lp/soyuz/interfaces/archivedependency.py 2010-08-20 20:31:18 +0000
777+++ lib/lp/soyuz/interfaces/archivedependency.py 2011-02-03 19:06:35 +0000
778@@ -31,7 +31,7 @@
779
780 class IArchiveDependency(Interface):
781 """ArchiveDependency interface."""
782- export_as_webservice_entry()
783+ export_as_webservice_entry(publish_web_link=False)
784
785 id = Int(title=_("The archive ID."), readonly=True)
786
787
788=== modified file 'lib/lp/soyuz/interfaces/archivepermission.py'
789--- lib/lp/soyuz/interfaces/archivepermission.py 2010-08-23 17:16:35 +0000
790+++ lib/lp/soyuz/interfaces/archivepermission.py 2011-02-03 19:06:35 +0000
791@@ -41,7 +41,7 @@
792
793 class IArchivePermission(Interface):
794 """The interface for `ArchivePermission`."""
795- export_as_webservice_entry()
796+ export_as_webservice_entry(publish_web_link=False)
797
798 id = Attribute("The archive permission ID.")
799
800
801=== modified file 'lib/lp/soyuz/interfaces/packageset.py'
802--- lib/lp/soyuz/interfaces/packageset.py 2010-08-20 20:31:18 +0000
803+++ lib/lp/soyuz/interfaces/packageset.py 2011-02-03 19:06:35 +0000
804@@ -62,7 +62,7 @@
805
806 class IPackagesetViewOnly(IHasOwner):
807 """A read-only interface for package sets."""
808- export_as_webservice_entry()
809+ export_as_webservice_entry(publish_web_link=False)
810
811 id = Int(title=_('ID'), required=True, readonly=True)
812
813@@ -244,7 +244,7 @@
814
815 class IPackagesetEdit(Interface):
816 """A writeable interface for package sets."""
817- export_as_webservice_entry()
818+ export_as_webservice_entry(publish_web_link=False)
819
820 def add(data):
821 """Add source package names or other package sets to this one.
822@@ -349,7 +349,7 @@
823
824 class IPackageset(IPackagesetViewOnly, IPackagesetEdit):
825 """An interface for package sets."""
826- export_as_webservice_entry()
827+ export_as_webservice_entry(publish_web_link=False)
828
829
830 class IPackagesetSet(Interface):
831
832=== modified file 'lib/lp/soyuz/interfaces/publishing.py'
833--- lib/lp/soyuz/interfaces/publishing.py 2011-01-11 04:07:35 +0000
834+++ lib/lp/soyuz/interfaces/publishing.py 2011-02-03 19:06:35 +0000
835@@ -635,7 +635,7 @@
836 class ISourcePackagePublishingHistory(ISourcePackagePublishingHistoryPublic,
837 IPublishingEdit):
838 """A source package publishing history record."""
839- export_as_webservice_entry()
840+ export_as_webservice_entry(publish_web_link=False)
841
842
843 #
844@@ -855,7 +855,7 @@
845 class IBinaryPackagePublishingHistory(IBinaryPackagePublishingHistoryPublic,
846 IPublishingEdit):
847 """A binary package publishing record."""
848- export_as_webservice_entry()
849+ export_as_webservice_entry(publish_web_link=False)
850
851
852 class IPublishingSet(Interface):
853
854=== modified file 'lib/lp/soyuz/interfaces/queue.py'
855--- lib/lp/soyuz/interfaces/queue.py 2010-08-24 15:51:02 +0000
856+++ lib/lp/soyuz/interfaces/queue.py 2011-02-03 19:06:35 +0000
857@@ -99,7 +99,7 @@
858 class IPackageUpload(Interface):
859 """A Queue item for the archive uploader."""
860
861- export_as_webservice_entry()
862+ export_as_webservice_entry(publish_web_link=False)
863
864 id = Int(
865 title=_("ID"), required=True, readonly=True,
866
867=== modified file 'lib/lp/soyuz/stories/webservice/xx-archive.txt'
868--- lib/lp/soyuz/stories/webservice/xx-archive.txt 2010-10-18 22:24:59 +0000
869+++ lib/lp/soyuz/stories/webservice/xx-archive.txt 2011-02-03 19:06:35 +0000
870@@ -28,6 +28,7 @@
871 resource_type_link: u'http://.../#archive'
872 self_link: u'http://.../~cprov/+archive/ppa'
873 signing_key_fingerprint: None
874+ web_link: u'http://launchpad.../~cprov/+archive/ppa'
875
876 While the Archive signing key is being generated its
877 'signing_key_fingerprint' attribute is None.
878@@ -93,6 +94,7 @@
879 resource_type_link: u'http://.../#archive'
880 self_link: u'http://.../ubuntutest/+archive/primary'
881 signing_key_fingerprint: None
882+ web_link: u'http://launchpad.../ubuntutest/+archive/primary'
883
884 A distribution can also provide a list of all its archives:
885
886@@ -833,6 +835,7 @@
887 resource_type_link: u'http://.../#archive'
888 self_link: u'http://.../~cprov/+archive/p3a'
889 signing_key_fingerprint: u'tag:launchpad.net:2008:redacted'
890+ web_link: u'http://launchpad.../~cprov/+archive/p3a'
891
892 >>> pprint_entry(cprov_webservice.get("/~cprov/+archive/p3a").jsonBody())
893 commercial: False
894@@ -847,6 +850,7 @@
895 resource_type_link: u'http://.../#archive'
896 self_link: u'http://.../~cprov/+archive/p3a'
897 signing_key_fingerprint: u'ABCDEF0123456789ABCDDCBA0000111112345678'
898+ web_link: u'http://launchpad.../~cprov/+archive/p3a'
899
900 == Creating subscriptions to a (private) archive ==
901
902@@ -904,6 +908,7 @@
903 self_link: u'http://api.../~cprov/+archive/p3a/+subscriptions/mark'
904 status: u'Active'
905 subscriber_link: u'http://api.launchpad.dev/beta/~mark'
906+ web_link: u'http://launchpad.../~cprov/+archive/p3a/+subscriptions/mark'
907
908 Other webservice users cannot view the subscription.
909
910
911=== modified file 'lib/lp/soyuz/stories/webservice/xx-builds.txt'
912--- lib/lp/soyuz/stories/webservice/xx-builds.txt 2011-01-18 23:43:48 +0000
913+++ lib/lp/soyuz/stories/webservice/xx-builds.txt 2011-02-03 19:06:35 +0000
914@@ -54,11 +54,12 @@
915 log_url: u'http://.../~cprov/+archive/ppa/+buildjob/26/+files/netapplet-1.0.0.tar.gz'
916 pocket: u'Release'
917 resource_type_link: u'http://api.launchpad.dev/beta/#build'
918- score: None
919+ score: None
920 self_link: u'http://api.launchpad.dev/beta/~cprov/+archive/ppa/+buildjob/26'
921 status: u'Failed to build'
922 title: u'i386 build of cdrkit 1.0 in ubuntu breezy-autotest RELEASE'
923 upload_log_url: None
924+ web_link: u'http://launchpad.../~cprov/+archive/ppa/+buildjob/26'
925
926 Whereas the 1.0 webservice for builds maintains the old property names
927 (without underscores):
928@@ -85,6 +86,7 @@
929 self_link: u'http://.../~cprov/+archive/ppa/+buildjob/26'
930 title: u'i386 build of cdrkit 1.0 in ubuntu breezy-autotest RELEASE'
931 upload_log_url: None
932+ web_link: u'http://launchpad.../~cprov/+archive/ppa/+buildjob/26'
933
934 For testing purposes we will set 'buildlog' and 'upload_log' to the
935 same library file, so both can be verified.
936
937=== modified file 'lib/lp/soyuz/stories/webservice/xx-distroarchseries.txt'
938--- lib/lp/soyuz/stories/webservice/xx-distroarchseries.txt 2011-01-19 00:32:50 +0000
939+++ lib/lp/soyuz/stories/webservice/xx-distroarchseries.txt 2011-02-03 19:06:35 +0000
940@@ -46,4 +46,4 @@
941 self_link: u'http://.../ubuntu/hoary/i386'
942 supports_virtualized: True
943 title: u'The Hoary Hedgehog Release for i386 (x86)'
944-
945+ web_link: u'http://launchpad.../ubuntu/hoary/i386'
946
947=== modified file 'lib/lp/translations/stories/webservice/xx-potemplate.txt'
948--- lib/lp/translations/stories/webservice/xx-potemplate.txt 2010-07-14 06:36:24 +0000
949+++ lib/lp/translations/stories/webservice/xx-potemplate.txt 2011-02-03 19:06:35 +0000
950@@ -28,6 +28,7 @@
951 translation_domain: u'pmount'
952 translation_files_collection_link:
953 u'http://.../pmount/+pots/pmount/translation_files'
954+ web_link: u'http://translations.launchpad.../ubuntu/hoary/+source/pmount/+pots/pmount'
955
956 "translation_files" will list all POFiles associated with this template.
957
958
959=== modified file 'versions.cfg'
960--- versions.cfg 2011-02-02 09:14:02 +0000
961+++ versions.cfg 2011-02-03 19:06:35 +0000
962@@ -33,8 +33,8 @@
963 lazr.delegates = 1.2.0
964 lazr.enum = 1.1.2
965 lazr.lifecycle = 1.1
966-lazr.restful = 0.15.4
967-lazr.restfulclient = 0.11.1
968+lazr.restful = 0.16.0
969+lazr.restfulclient = 0.11.2
970 lazr.smtptest = 1.1
971 lazr.testing = 0.1.1
972 lazr.uri = 1.0.2
973@@ -75,7 +75,7 @@
974 Twisted = 10.2.0-4395fix-1
975 uuid = 1.30
976 van.testing = 2.0.1
977-wadllib = 1.1.5
978+wadllib = 1.2.0
979 webunit = 1.3.8
980 # r1579 of lp:windmill, with a fix for the 512k bug.
981 # Built from lp:~launchpad/windmill/512k-bug-fix.