Merge lp:~jml/launchpad/create-commercial-ppa into lp:launchpad

Proposed by Jonathan Lange
Status: Merged
Approved by: Richard Harding
Approved revision: no longer in the source branch.
Merged at revision: 15074
Proposed branch: lp:~jml/launchpad/create-commercial-ppa
Merge into: lp:launchpad
Diff against target: 2612 lines (+317/-258)
88 files modified
lib/lp/answers/browser/tests/faq-views.txt (+2/-2)
lib/lp/app/doc/lazr-js-widgets.txt (+6/-6)
lib/lp/app/doc/tales.txt (+6/-6)
lib/lp/blueprints/browser/tests/sprintattendance-views.txt (+2/-2)
lib/lp/bugs/browser/tests/bug-nomination-views.txt (+3/-3)
lib/lp/bugs/browser/tests/bug-views.txt (+1/-1)
lib/lp/bugs/browser/tests/bugtarget-filebug-views.txt (+2/-2)
lib/lp/bugs/doc/bug-nomination.txt (+1/-1)
lib/lp/bugs/doc/bugattachments.txt (+1/-1)
lib/lp/bugs/doc/bugtask-status-changes.txt (+2/-2)
lib/lp/bugs/doc/malone-karma.txt (+1/-1)
lib/lp/bugs/tests/bugs-emailinterface.txt (+2/-2)
lib/lp/code/stories/branches/package-branch-merges-with-product-branches.txt (+1/-1)
lib/lp/code/stories/branches/xx-branch-deletion.txt (+2/-2)
lib/lp/code/stories/branches/xx-product-branches.txt (+2/-2)
lib/lp/code/stories/branches/xx-reviewing.txt (+1/-1)
lib/lp/code/stories/feeds/xx-revision-atom.txt (+1/-1)
lib/lp/coop/answersbugs/tests/notifications-linked-bug.txt (+1/-1)
lib/lp/hardwaredb/doc/hwdb.txt (+1/-1)
lib/lp/registry/browser/tests/coc-views.txt (+2/-2)
lib/lp/registry/browser/tests/distribution-views.txt (+1/-1)
lib/lp/registry/browser/tests/distributionmirror-views.txt (+2/-2)
lib/lp/registry/browser/tests/distroseries-views.txt (+8/-8)
lib/lp/registry/browser/tests/karmacontext-views.txt (+1/-1)
lib/lp/registry/browser/tests/mailinglist-message-views.txt (+1/-1)
lib/lp/registry/browser/tests/milestone-views.txt (+16/-16)
lib/lp/registry/browser/tests/nameblacklist-views.txt (+1/-1)
lib/lp/registry/browser/tests/packaging-views.txt (+2/-2)
lib/lp/registry/browser/tests/peoplemerge-views.txt (+7/-7)
lib/lp/registry/browser/tests/person-admin-views.txt (+2/-2)
lib/lp/registry/browser/tests/person-edit-views.txt (+1/-1)
lib/lp/registry/browser/tests/person-karma-views.txt (+1/-1)
lib/lp/registry/browser/tests/person-views.txt (+6/-6)
lib/lp/registry/browser/tests/pillar-views.txt (+3/-3)
lib/lp/registry/browser/tests/poll-views.txt (+8/-8)
lib/lp/registry/browser/tests/product-edit-people-view.txt (+3/-3)
lib/lp/registry/browser/tests/product-files-views.txt (+1/-1)
lib/lp/registry/browser/tests/product-portlet-packages-view.txt (+10/-10)
lib/lp/registry/browser/tests/product-views.txt (+3/-3)
lib/lp/registry/browser/tests/productrelease-views.txt (+1/-1)
lib/lp/registry/browser/tests/productseries-setbranch-view.txt (+1/-1)
lib/lp/registry/browser/tests/productseries-views.txt (+7/-7)
lib/lp/registry/browser/tests/projectgroup-views.txt (+1/-1)
lib/lp/registry/browser/tests/projectgroupset-views.txt (+6/-6)
lib/lp/registry/browser/tests/sourcepackage-views.txt (+4/-4)
lib/lp/registry/browser/tests/team-join-views.txt (+1/-1)
lib/lp/registry/browser/tests/team-views.txt (+3/-3)
lib/lp/registry/browser/tests/teammembership-views.txt (+2/-2)
lib/lp/registry/browser/tests/user-to-user-views.txt (+5/-5)
lib/lp/registry/doc/commercialsubscription.txt (+3/-3)
lib/lp/registry/doc/distribution-mirror.txt (+2/-2)
lib/lp/registry/doc/distribution.txt (+2/-2)
lib/lp/registry/doc/distroseries.txt (+5/-5)
lib/lp/registry/doc/mailinglists.txt (+1/-1)
lib/lp/registry/doc/milestone.txt (+4/-4)
lib/lp/registry/doc/person.txt (+2/-2)
lib/lp/registry/doc/personlocation.txt (+1/-1)
lib/lp/registry/doc/private-team-roles.txt (+3/-3)
lib/lp/registry/doc/product.txt (+2/-2)
lib/lp/registry/doc/productrelease.txt (+4/-4)
lib/lp/registry/doc/productseries.txt (+5/-5)
lib/lp/registry/doc/teammembership-email-notification.txt (+8/-8)
lib/lp/registry/doc/teammembership.txt (+22/-22)
lib/lp/registry/doc/vocabularies.txt (+5/-5)
lib/lp/registry/interfaces/person.py (+1/-1)
lib/lp/registry/model/person.py (+10/-4)
lib/lp/registry/stories/product/xx-product-index.txt (+1/-1)
lib/lp/registry/stories/teammembership/private-team.txt (+1/-1)
lib/lp/registry/stories/webservice/xx-private-team.txt (+1/-1)
lib/lp/registry/tests/bug-249185.txt (+1/-1)
lib/lp/services/identity/doc/emailaddress.txt (+2/-2)
lib/lp/services/mail/doc/notification-recipient-set.txt (+1/-1)
lib/lp/services/webapp/doc/launchbag.txt (+1/-1)
lib/lp/soyuz/doc/archive-deletion.txt (+2/-2)
lib/lp/soyuz/doc/archive.txt (+3/-3)
lib/lp/soyuz/doc/archiveauthtoken.txt (+3/-3)
lib/lp/soyuz/doc/gina-multiple-arch.txt (+1/-1)
lib/lp/soyuz/doc/gina.txt (+1/-1)
lib/lp/soyuz/doc/packageset.txt (+1/-1)
lib/lp/soyuz/doc/publishing-security.txt (+1/-1)
lib/lp/soyuz/interfaces/archive.py (+1/-1)
lib/lp/soyuz/model/archive.py (+19/-8)
lib/lp/soyuz/stories/ppa/xx-ppa-files.txt (+1/-1)
lib/lp/soyuz/tests/test_person_createppa.py (+29/-2)
lib/lp/testing/_login.py (+3/-2)
lib/lp/testing/tests/test_login.py (+14/-0)
lib/lp/translations/browser/tests/distroseries-views.txt (+1/-1)
lib/lp/translations/browser/tests/language-views.txt (+1/-1)
To merge this branch: bzr merge lp:~jml/launchpad/create-commercial-ppa
Reviewer Review Type Date Requested Status
Steve Kowalik (community) code Approve
Review via email: mp+100635@code.launchpad.net

Commit message

Allow those with commercial admin or admin permissions to create commercial PPAs.

Description of the change

This branch simply changes the createPPA API such that commercial PPAs can be created as well as private PPAs.

While doing this, we changed the login helpers so that one can easily get the logged in user. This is particularly helpful when testing with celebrities. We also added some unit tests for the current PPA creation behaviour, which didn't appear to have unit tests before.

We also discovered a logic bug in validatePPA. We have noted the bug in the code, and would be happy to fix it, but consider such a work separate to the work contained herein.

$ bzr di -r submit: | diffstat
Using parent branch file:///var/launchpad/test/,branch=stable/
 registry/interfaces/person.py | 2 +-
 registry/model/person.py | 14 ++++++++++----
 soyuz/interfaces/archive.py | 2 +-
 soyuz/model/archive.py | 26 ++++++++++++++++++++------
 soyuz/tests/test_person_createppa.py | 34 ++++++++++++++++++++++++++++++++--
 testing/_login.py | 5 +++--
 testing/tests/test_login.py | 14 ++++++++++++++
 7 files changed, 81 insertions(+), 16 deletions(-)

Thanks,
jml & James Westby

To post a comment you must log in.
Revision history for this message
Steve Kowalik (stevenk) wrote :

This looks like great work. I think I'd prefer you make use of IPersonRoles in createPPA rather than pulling both commercial and admins from celebrities.

role = IPersonRoles(person)
if role.in_admin or role.in_commercial_admin:

"has_the_power" sounds like a terrible variable name, but I think it will become unnecessary if you make use of IPersonRoles.

I thought commercial PPAs were required to be private, but you don't seem to imply that or test that in your code.

I'm going to mark this as Approved, but I'd prefer you fix/think about the above before landing.

review: Approve (code)
Revision history for this message
Jonathan Lange (jml) wrote :

I've changed to use roles, avoiding the local variable.

As for commercial PPAs being required to be private, there's nothing currently in the Launchpad code-base enforcing that. I'm not aware of any business requirement on our end. As mentioned in the added XXX comment, the current permission createPPA logic is sloppy at best.

There's also no protection logic for changing the 'private' and 'commercial' attributes once the archive is created.

Revision history for this message
Curtis Hovey (sinzui) wrote :

I think the role checking on line 92 is naive.
* When the team is private, the PPA must also be private.
  If person.is_team and person.private:
      private = True
* If the user maintains project with an active commercial subscription, the PPA may be private
  if private and not person.hasCurrentCommercialSubscription():
      # Raise error.

I do not know the rules for determining if the PPA may be commercial, but I think we want to find something, a team, a celebrity, or a role in Ubuntu that we can test that the user is a member of.

Revision history for this message
Jonathan Lange (jml) wrote :

Curtis, I agree. However, that naïvety is present in trunk and, I think, out of scope for this branch.

I am happy to make those changes in a follow-up branch. Although, I would prefer to have a pre-implementation chat, since making this particular code path correct does nothing to prevent future errors or make the current rules for private creation more understandable.

Revision history for this message
Jonathan Lange (jml) wrote :

This, I expect, fixes the test failures we saw.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/answers/browser/tests/faq-views.txt'
2--- lib/lp/answers/browser/tests/faq-views.txt 2011-12-22 05:09:10 +0000
3+++ lib/lp/answers/browser/tests/faq-views.txt 2012-04-10 14:04:27 +0000
4@@ -4,7 +4,7 @@
5 >>> from lp.registry.interfaces.product import IProductSet
6
7 >>> firefox = getUtility(IProductSet).getByName('firefox')
8- >>> login_person(firefox.owner)
9+ >>> ignored = login_person(firefox.owner)
10 >>> firefox_faq = firefox.newFAQ(
11 ... firefox.owner, 'A FAQ', 'FAQ for test purpose')
12
13@@ -59,7 +59,7 @@
14 Other users do not see the link.
15
16 >>> user = factory.makePerson(name='a-user')
17- >>> login_person(user)
18+ >>> ignored = login_person(user)
19 >>> view = create_initialized_view(
20 ... firefox, '+portlet-listfaqs', principal=user)
21 >>> content = find_tag_by_id(view.render(), 'portlet-latest-faqs')
22
23=== modified file 'lib/lp/app/doc/lazr-js-widgets.txt'
24--- lib/lp/app/doc/lazr-js-widgets.txt 2012-02-01 15:49:40 +0000
25+++ lib/lp/app/doc/lazr-js-widgets.txt 2012-04-10 14:04:27 +0000
26@@ -42,7 +42,7 @@
27 the edit view that appears as well as a <script> tag that will change that
28 link into an AJAX control when JS is available:
29
30- >>> login_person(product.owner)
31+ >>> ignored = login_person(product.owner)
32 >>> print widget()
33 <h1 id="edit-title"><span class="yui3-editable_text-text">Widgets &gt;
34 important</span>
35@@ -90,7 +90,7 @@
36 http://launchpad.dev/widget/+edit-people
37 >>> print diff_view.edit_title
38 Change the product title
39- >>> login_person(product.owner)
40+ >>> ignored = login_person(product.owner)
41 >>> print diff_view()
42 <h1...
43 <a class="yui3-editable_text-trigger sprite edit"
44@@ -157,7 +157,7 @@
45 javascript is written to the page to hook up the links to show the multiline
46 editor.
47
48- >>> login_person(eric)
49+ >>> ignored = login_person(eric)
50 >>> print widget()
51 <div id="edit-description" class="lazr-multiline-edit">
52 <div class="clearfix">
53@@ -319,7 +319,7 @@
54 If the user has edit rights, an edit icon is rendered and some javascript is
55 rendered to hook up the widget.
56
57- >>> login_person(eric)
58+ >>> ignored = login_person(eric)
59 >>> print widget()
60 <span id="edit-hide_email_addresses">
61 My email: <span class="value">Don't hide it</span>
62@@ -379,7 +379,7 @@
63 If the user has edit rights, an edit icon is rendered and some javascript is
64 rendered to hook up the widget.
65
66- >>> login_person(branch.owner)
67+ >>> ignored = login_person(branch.owner)
68 >>> print widget()
69 <span id="edit-lifecycle_status">
70 <span class="value branchstatusDEVELOPMENT">Development</span>
71@@ -457,7 +457,7 @@
72 If the user has edit rights, an edit icon is rendered and some javascript is
73 rendered to hook up the widget.
74
75- >>> login_person(eric)
76+ >>> ignored = login_person(eric)
77 >>> print widget()
78 <span id="edit-distroseries">
79 <dt>
80
81=== modified file 'lib/lp/app/doc/tales.txt'
82--- lib/lp/app/doc/tales.txt 2012-04-02 05:42:19 +0000
83+++ lib/lp/app/doc/tales.txt 2012-04-10 14:04:27 +0000
84@@ -171,12 +171,12 @@
85 a subscription to the PPA.
86
87 >>> ppa_user = factory.makePerson(name="jake", displayname="Jake Smith")
88- >>> login_person(ppa_user)
89+ >>> ignored = login_person(ppa_user)
90 >>> print test_tales("ppa/fmt:reference", ppa=private_ppa)
91
92- >>> login_person(owner)
93+ >>> ignored = login_person(owner)
94 >>> ignore = private_ppa.newSubscription(ppa_user, owner)
95- >>> login_person(ppa_user)
96+ >>> ignored = login_person(ppa_user)
97 >>> print test_tales("ppa/fmt:reference", ppa=private_ppa)
98 ppa:joe/pppa
99
100@@ -496,7 +496,7 @@
101 <a href="http://code.launchpad.dev/~eric/fooix/bar"
102 class="sprite branch">lp://dev/~eric/fooix/bar</a>
103
104- >>> login_person(fooix.owner, LaunchpadTestRequest())
105+ >>> ignored = login_person(fooix.owner, LaunchpadTestRequest())
106 >>> fooix.development_focus.branch = branch
107 >>> from lp.services.propertycache import clear_property_cache
108 >>> clear_property_cache(branch)
109@@ -556,7 +556,7 @@
110
111 But if we log in as the subscriber, a link is presented.
112
113- >>> login_person(subscription.person)
114+ >>> ignored = login_person(subscription.person)
115 >>> test_tales("subscription/fmt:link", subscription=subscription)
116 u'<a href="http://.../+subscription/michael">Subscription
117 of Michael the Viking to lp://dev/~eric/fooix/my-branch</a>'
118@@ -1550,7 +1550,7 @@
119 If the private attribute is True, the class is 'private'.
120
121 >>> owner = bug.bugtasks[0].target.owner
122- >>> login_person(owner)
123+ >>> ignored = login_person(owner)
124 >>> bug.setPrivate(True, owner)
125 True
126
127
128=== modified file 'lib/lp/blueprints/browser/tests/sprintattendance-views.txt'
129--- lib/lp/blueprints/browser/tests/sprintattendance-views.txt 2012-02-17 12:10:43 +0000
130+++ lib/lp/blueprints/browser/tests/sprintattendance-views.txt 2012-04-10 14:04:27 +0000
131@@ -107,7 +107,7 @@
132 present at the sprint.
133
134 >>> person = factory.makePerson(name='brown')
135- >>> login_person(person)
136+ >>> ignored = login_person(person)
137 >>> form = {
138 ... 'field.time_starts': '2005-10-07 09:00',
139 ... 'field.time_ends': '2005-10-17 19:05',
140@@ -126,7 +126,7 @@
141 using their psychotic powers :).
142
143 >>> person = factory.makePerson(name='black')
144- >>> login_person(person)
145+ >>> ignored = login_person(person)
146 >>> form = {
147 ... 'field.time_starts': '2005-10-07 09:00',
148 ... 'field.time_ends': '2005-10-17 19:05',
149
150=== modified file 'lib/lp/bugs/browser/tests/bug-nomination-views.txt'
151--- lib/lp/bugs/browser/tests/bug-nomination-views.txt 2011-12-24 17:49:30 +0000
152+++ lib/lp/bugs/browser/tests/bug-nomination-views.txt 2012-04-10 14:04:27 +0000
153@@ -27,7 +27,7 @@
154 >>> firefox = removeSecurityProxy(firefox)
155 >>> firefox.bug_supervisor = nominator
156
157- >>> login_person(nominator)
158+ >>> ignored = login_person(nominator)
159 >>> request = LaunchpadTestRequest()
160 >>> bug_one_in_ubuntu_firefox = getUtility(IBugTaskSet).get(17)
161 >>> print bug_one_in_ubuntu_firefox.bug.id
162@@ -48,7 +48,7 @@
163
164 Here's an example of nominating a bug for a distroseries.
165
166- >>> login_person(nominator)
167+ >>> ignored = login_person(nominator)
168
169 >>> request = LaunchpadTestRequest(
170 ... method="POST",
171@@ -187,7 +187,7 @@
172 set up if the user has permission to approve the nomination.
173
174 >>> from lp.bugs.interfaces.bug import CreateBugParams
175- >>> login_person(nominator)
176+ >>> ignored = login_person(nominator)
177 >>> no_priv = getUtility(ILaunchBag).user
178 >>> ubuntu_bug = ubuntu.createBug(CreateBugParams(
179 ... no_priv, "Ubuntu bug", comment="Test bug."))
180
181=== modified file 'lib/lp/bugs/browser/tests/bug-views.txt'
182--- lib/lp/bugs/browser/tests/bug-views.txt 2012-02-21 22:46:28 +0000
183+++ lib/lp/bugs/browser/tests/bug-views.txt 2012-04-10 14:04:27 +0000
184@@ -507,7 +507,7 @@
185
186 (Login as a bug supervisor to be able to nominate.)
187
188- >>> login_person(nominator)
189+ >>> ignored = login_person(nominator)
190
191 >>> current_user = getUtility(ILaunchBag).user
192 >>> ubuntu_warty = ubuntu.getSeries("warty")
193
194=== modified file 'lib/lp/bugs/browser/tests/bugtarget-filebug-views.txt'
195--- lib/lp/bugs/browser/tests/bugtarget-filebug-views.txt 2012-01-17 14:27:01 +0000
196+++ lib/lp/bugs/browser/tests/bugtarget-filebug-views.txt 2012-04-10 14:04:27 +0000
197@@ -713,10 +713,10 @@
198 >>> person = factory.makePerson()
199 >>> product = factory.makeProduct(owner=owner)
200
201- >>> login_person(person)
202+ >>> ignored = login_person(person)
203 >>> filebug_view = create_initialized_view(product, '+filebug')
204 >>> normal_fields = set(filebug_view.field_names)
205- >>> login_person(owner)
206+ >>> ignored = login_person(owner)
207 >>> filebug_view = create_initialized_view(product, '+filebug')
208 >>> owner_fields = set(filebug_view.field_names)
209 >>> product.setBugSupervisor(owner, owner)
210
211=== modified file 'lib/lp/bugs/doc/bug-nomination.txt'
212--- lib/lp/bugs/doc/bug-nomination.txt 2011-12-26 06:01:53 +0000
213+++ lib/lp/bugs/doc/bug-nomination.txt 2012-04-10 14:04:27 +0000
214@@ -24,7 +24,7 @@
215 >>> firefox = getUtility(IProductSet).getByName("firefox")
216 >>> firefox = removeSecurityProxy(firefox)
217 >>> firefox.bug_supervisor = nominator
218- >>> login_person(nominator)
219+ >>> ignored = login_person(nominator)
220
221 The BugNomination class implements IBugNomination.
222
223
224=== modified file 'lib/lp/bugs/doc/bugattachments.txt'
225--- lib/lp/bugs/doc/bugattachments.txt 2011-12-30 07:38:46 +0000
226+++ lib/lp/bugs/doc/bugattachments.txt 2012-04-10 14:04:27 +0000
227@@ -616,7 +616,7 @@
228 its Librarian file is set.
229
230 >>> private_bug_owner = factory.makePerson()
231- >>> login_person(private_bug_owner)
232+ >>> ignored = login_person(private_bug_owner)
233 >>> private_bug = factory.makeBug(private=True, owner=private_bug_owner)
234 >>> private_attachment = private_bug.addAttachment(
235 ... owner=private_bug_owner, data="secret", filename="baz.txt",
236
237=== modified file 'lib/lp/bugs/doc/bugtask-status-changes.txt'
238--- lib/lp/bugs/doc/bugtask-status-changes.txt 2010-10-20 01:36:53 +0000
239+++ lib/lp/bugs/doc/bugtask-status-changes.txt 2012-04-10 14:04:27 +0000
240@@ -18,7 +18,7 @@
241 >>> user = factory.makePerson()
242
243 >>> from lp.bugs.interfaces.bugtask import BugTaskStatus
244- >>> login_person(owner)
245+ >>> ignored = login_person(owner)
246 >>> bugtask.transitionToStatus(BugTaskStatus.WONTFIX, owner)
247 >>> print bugtask.status.title
248 Won't Fix
249@@ -30,7 +30,7 @@
250 registrant or bug supervisor can change from this status to any
251 other status.
252
253- >>> login_person(user)
254+ >>> ignored = login_person(user)
255 >>> bugtask.transitionToStatus(BugTaskStatus.CONFIRMED, user)
256 Traceback (most recent call last):
257 ...
258
259=== modified file 'lib/lp/bugs/doc/malone-karma.txt'
260--- lib/lp/bugs/doc/malone-karma.txt 2011-08-01 05:25:59 +0000
261+++ lib/lp/bugs/doc/malone-karma.txt 2012-04-10 14:04:27 +0000
262@@ -117,7 +117,7 @@
263
264 Driver accept a bug task:
265
266- >>> login_person(bugtask.target.owner)
267+ >>> ignored = login_person(bugtask.target.owner)
268 >>> old_bugtask = Snapshot(bugtask, providing=IBugTask)
269 >>> bugtask.transitionToStatus(
270 ... BugTaskStatus.TRIAGED, getUtility(ILaunchBag).user)
271
272=== modified file 'lib/lp/bugs/tests/bugs-emailinterface.txt'
273--- lib/lp/bugs/tests/bugs-emailinterface.txt 2012-03-27 13:38:04 +0000
274+++ lib/lp/bugs/tests/bugs-emailinterface.txt 2012-04-10 14:04:27 +0000
275@@ -1445,7 +1445,7 @@
276 ... login('foo.bar@canonical.com')
277 ... upstream_task.pillar.setBugSupervisor(email_user, email_user)
278
279- >>> login_person(email_user)
280+ >>> ignored = login_person(email_user)
281
282 >>> submit_commands(bug_four, 'status wontfix')
283 >>> print upstream_task.status.title
284@@ -1495,7 +1495,7 @@
285 Let's take a look at all the other error messages that the sub
286 commands can produce.
287
288- >>> login_person(email_user)
289+ >>> ignored = login_person(email_user)
290
291 Invalid status:
292
293
294=== modified file 'lib/lp/code/stories/branches/package-branch-merges-with-product-branches.txt'
295--- lib/lp/code/stories/branches/package-branch-merges-with-product-branches.txt 2012-01-15 13:32:27 +0000
296+++ lib/lp/code/stories/branches/package-branch-merges-with-product-branches.txt 2012-04-10 14:04:27 +0000
297@@ -37,7 +37,7 @@
298
299 Linking the packages makes this possible.
300
301- >>> login_person(eric)
302+ >>> ignored = login_person(eric)
303 >>> b1.sourcepackage.setPackaging(b2.product.development_focus, eric)
304 >>> logout()
305
306
307=== modified file 'lib/lp/code/stories/branches/xx-branch-deletion.txt'
308--- lib/lp/code/stories/branches/xx-branch-deletion.txt 2012-03-07 00:58:37 +0000
309+++ lib/lp/code/stories/branches/xx-branch-deletion.txt 2012-04-10 14:04:27 +0000
310@@ -14,7 +14,7 @@
311 ... product=product, branch_type=BranchType.HOSTED)
312 >>> productseries = factory.makeProductSeries(
313 ... product=product, branch=branch)
314- >>> login_person(alice)
315+ >>> ignored = login_person(alice)
316 >>> product.development_focus = productseries
317 >>> delete_branch = factory.makeProductBranch(
318 ... name='to-delete', owner=alice,
319@@ -56,7 +56,7 @@
320 If the branch is junk, then the user is taken back to the code listing for
321 the deleted branch's owner.
322
323- >>> login_person(alice)
324+ >>> ignored = login_person(alice)
325 >>> delete_branch = factory.makePersonalBranch(
326 ... name='to-delete', owner=alice)
327 >>> logout()
328
329=== modified file 'lib/lp/code/stories/branches/xx-product-branches.txt'
330--- lib/lp/code/stories/branches/xx-product-branches.txt 2012-03-08 19:35:12 +0000
331+++ lib/lp/code/stories/branches/xx-product-branches.txt 2012-04-10 14:04:27 +0000
332@@ -182,7 +182,7 @@
333 >>> login(ANONYMOUS)
334 >>> product = getUtility(IProductSet).getByName('firefox')
335 >>> old_branch = product.development_focus.branch
336- >>> login_person(product.owner)
337+ >>> ignored = login_person(product.owner)
338 >>> product.development_focus.branch = None
339 >>> logout()
340 >>> def print_links(browser):
341@@ -235,7 +235,7 @@
342 If the product specifies that it officially uses Launchpad code, then
343 the 'Import a branch' button is still shown.
344
345- >>> login_person(product.owner)
346+ >>> ignored = login_person(product.owner)
347 >>> product.development_focus.branch = old_branch
348 >>> logout()
349 >>> browser.open('http://code.launchpad.dev/firefox')
350
351=== modified file 'lib/lp/code/stories/branches/xx-reviewing.txt'
352--- lib/lp/code/stories/branches/xx-reviewing.txt 2012-01-15 13:32:27 +0000
353+++ lib/lp/code/stories/branches/xx-reviewing.txt 2012-04-10 14:04:27 +0000
354@@ -10,7 +10,7 @@
355 >>> from lp.code.tests.helpers import (
356 ... make_merge_proposal_without_reviewers)
357 >>> bmp = make_merge_proposal_without_reviewers(factory)
358- >>> login_person(bmp.registrant)
359+ >>> ignored = login_person(bmp.registrant)
360 >>> ignored = bmp.nominateReviewer(vikings, bmp.registrant)
361 >>> url = canonical_url(bmp)
362 >>> logout()
363
364=== modified file 'lib/lp/code/stories/feeds/xx-revision-atom.txt'
365--- lib/lp/code/stories/feeds/xx-revision-atom.txt 2011-12-20 10:52:02 +0000
366+++ lib/lp/code/stories/feeds/xx-revision-atom.txt 2012-04-10 14:04:27 +0000
367@@ -53,7 +53,7 @@
368 ... 3, makeRevision(
369 ... mary, 'rev3', "Mary's revision"))
370
371- >>> login_person(mike)
372+ >>> ignored = login_person(mike)
373 >>> team = factory.makeTeam(mike, 'The M Team', name='m-team')
374 >>> ignored = team.addMember(mary, mike)
375 >>> from zope.component import getUtility
376
377=== modified file 'lib/lp/coop/answersbugs/tests/notifications-linked-bug.txt'
378--- lib/lp/coop/answersbugs/tests/notifications-linked-bug.txt 2011-09-09 15:05:51 +0000
379+++ lib/lp/coop/answersbugs/tests/notifications-linked-bug.txt 2012-04-10 14:04:27 +0000
380@@ -49,7 +49,7 @@
381 >>> from lp.testing import login_person
382 >>> sample_person = getUtility(IPersonSet).getByEmail(
383 ... 'test@canonical.com')
384- >>> login_person(sample_person)
385+ >>> ignored = login_person(sample_person)
386 >>> original_bugtask = Snapshot(bugtask, providing=providedBy(bugtask))
387 >>> bugtask.transitionToAssignee(sample_person)
388 >>> notify(ObjectModifiedEvent(
389
390=== modified file 'lib/lp/hardwaredb/doc/hwdb.txt'
391--- lib/lp/hardwaredb/doc/hwdb.txt 2012-01-16 00:10:41 +0000
392+++ lib/lp/hardwaredb/doc/hwdb.txt 2012-04-10 14:04:27 +0000
393@@ -410,7 +410,7 @@
394 >>> email = getUtility(IEmailAddressSet).new(
395 ... u'beeblebrox@beeblebrox.net', user)
396 >>> transaction.commit()
397- >>> login_person(user)
398+ >>> ignored = login_person(user)
399 >>> user.validateAndEnsurePreferredEmail(email)
400 >>> transaction.commit()
401 >>> HWSubmissionEmailLinker(log=DevNullLogger()).run()
402
403=== modified file 'lib/lp/registry/browser/tests/coc-views.txt'
404--- lib/lp/registry/browser/tests/coc-views.txt 2011-12-22 05:09:10 +0000
405+++ lib/lp/registry/browser/tests/coc-views.txt 2012-04-10 14:04:27 +0000
406@@ -27,7 +27,7 @@
407 ... for index, li in enumerate(ol.findAll('li')):
408 ... print '%s. %s' % ((index+1), extract_text(li))
409 >>> user = factory.makePerson()
410- >>> login_person(user)
411+ >>> ignored = login_person(user)
412 >>> from lp.registry.interfaces.codeofconduct import ICodeOfConductSet
413 >>> from lp.registry.interfaces.person import IPersonSet
414 >>> from lp.testing.pages import (
415@@ -70,7 +70,7 @@
416 If the user has already signed the code of conduct, no directions are shown.
417
418 >>> admin = getUtility(IPersonSet).getByEmail('admin@canonical.com')
419- >>> login_person(admin)
420+ >>> ignored = login_person(admin)
421 >>> view = create_initialized_view(coc_set, '+index', principal=admin)
422 >>> content = find_tag_by_id(view.render(), 'maincontent')
423 >>> print_coc_directions(content)
424
425=== modified file 'lib/lp/registry/browser/tests/distribution-views.txt'
426--- lib/lp/registry/browser/tests/distribution-views.txt 2011-12-28 17:03:06 +0000
427+++ lib/lp/registry/browser/tests/distribution-views.txt 2012-04-10 14:04:27 +0000
428@@ -272,7 +272,7 @@
429 >>> from lp.testing.pages import find_tag_by_id
430
431 >>> owner = distribution.owner
432- >>> login_person(owner)
433+ >>> ignored = login_person(owner)
434 >>> distribution.official_malone = False
435 >>> question = factory.makeQuestion(target=distribution)
436 >>> faq = factory.makeFAQ(target=distribution)
437
438=== modified file 'lib/lp/registry/browser/tests/distributionmirror-views.txt'
439--- lib/lp/registry/browser/tests/distributionmirror-views.txt 2011-12-24 17:49:30 +0000
440+++ lib/lp/registry/browser/tests/distributionmirror-views.txt 2012-04-10 14:04:27 +0000
441@@ -14,7 +14,7 @@
442 >>> distribution.full_functionality
443 False
444
445- >>> login_person(distribution.owner)
446+ >>> ignored = login_person(distribution.owner)
447 >>> view = create_initialized_view(
448 ... distribution, '+newmirror', principal=distribution.owner)
449 >>> content = find_tag_by_id(view.render(), 'not-full-functionality')
450@@ -28,7 +28,7 @@
451
452 >>> ubuntu = getUtility(ILaunchpadCelebrities).ubuntu
453 >>> owner = ubuntu.owner.teamowner
454- >>> login_person(owner)
455+ >>> ignored = login_person(owner)
456 >>> view = create_initialized_view(ubuntu, '+newmirror', principal=owner)
457 >>> content = find_tag_by_id(view.render(), 'full-functionality')
458 >>> print extract_text(content)
459
460=== modified file 'lib/lp/registry/browser/tests/distroseries-views.txt'
461--- lib/lp/registry/browser/tests/distroseries-views.txt 2011-12-24 17:49:30 +0000
462+++ lib/lp/registry/browser/tests/distroseries-views.txt 2012-04-10 14:04:27 +0000
463@@ -158,7 +158,7 @@
464
465 >>> driver = factory.makePerson(name='ubuntu-driver')
466 >>> hoary.driver = driver
467- >>> login_person(driver)
468+ >>> ignored = login_person(driver)
469 >>> view = create_initialized_view(hoary, '+edit')
470 >>> print view.label
471 Edit The Hoary Hedgehog Release details
472@@ -189,7 +189,7 @@
473
474 >>> yo_driver = factory.makePerson(name='yo-driver')
475 >>> youbuntu.driver = yo_driver
476- >>> login_person(yo_driver)
477+ >>> ignored = login_person(yo_driver)
478 >>> view = create_initialized_view(yo_series, '+edit')
479 >>> print view.label
480 Edit Melon details
481@@ -259,7 +259,7 @@
482 Users who are appointed as drivers of a distribution can create a series.
483 Most distributions are an `IDerivativeDistribution`.
484
485- >>> login_person(yo_driver)
486+ >>> ignored = login_person(yo_driver)
487 >>> view = create_view(youbuntu, name='+addseries')
488 >>> check_permission('launchpad.Moderate', view)
489 True
490@@ -282,9 +282,9 @@
491 >>> ubuntu.full_functionality
492 True
493
494- >>> login_person(ubuntu.owner.teamowner)
495+ >>> ignored = login_person(ubuntu.owner.teamowner)
496 >>> ubuntu.driver = yo_driver
497- >>> login_person(yo_driver)
498+ >>> ignored = login_person(yo_driver)
499 >>> view = create_view(youbuntu, name='+addseries')
500 >>> check_permission('launchpad.Edit', view)
501 False
502@@ -299,7 +299,7 @@
503 >>> print yo_series.driver.name
504 yo-driver
505
506- >>> login_person(yo_driver)
507+ >>> ignored = login_person(yo_driver)
508 >>> view = create_view(yo_series, name='+edit')
509 >>> check_permission('launchpad.Edit', view)
510 True
511@@ -319,9 +319,9 @@
512
513 Drivers of an `IBaseDistribution` such as Ubuntu cannot edit a series.
514
515- >>> login_person(ubuntu.owner.teamowner)
516+ >>> ignored = login_person(ubuntu.owner.teamowner)
517 >>> hoary.driver = yo_driver
518- >>> login_person(yo_driver)
519+ >>> ignored = login_person(yo_driver)
520
521 >>> view = create_view(hoary, name='+edit')
522 >>> check_permission('launchpad.Edit', view)
523
524=== modified file 'lib/lp/registry/browser/tests/karmacontext-views.txt'
525--- lib/lp/registry/browser/tests/karmacontext-views.txt 2011-12-22 05:09:10 +0000
526+++ lib/lp/registry/browser/tests/karmacontext-views.txt 2012-04-10 14:04:27 +0000
527@@ -11,7 +11,7 @@
528
529 >>> product = getUtility(IProductSet).getByName('evolution')
530 >>> user = product.owner
531- >>> login_person(user)
532+ >>> ignored = login_person(user)
533 >>> view = create_initialized_view(
534 ... product, '+topcontributors', principal=user)
535 >>> contributors = view._getTopContributorsWithLimit(limit=3)
536
537=== modified file 'lib/lp/registry/browser/tests/mailinglist-message-views.txt'
538--- lib/lp/registry/browser/tests/mailinglist-message-views.txt 2011-05-13 16:50:50 +0000
539+++ lib/lp/registry/browser/tests/mailinglist-message-views.txt 2012-04-10 14:04:27 +0000
540@@ -26,7 +26,7 @@
541 >>> held_message = mlist.holdMessage(message)
542 >>> transaction.commit()
543
544- >>> login_person(team.teamowner)
545+ >>> ignored = login_person(team.teamowner)
546 >>> view = create_initialized_view(
547 ... held_message, name='+moderation', principal=team.teamowner)
548 >>> print view.widget_name
549
550=== modified file 'lib/lp/registry/browser/tests/milestone-views.txt'
551--- lib/lp/registry/browser/tests/milestone-views.txt 2012-01-14 09:00:39 +0000
552+++ lib/lp/registry/browser/tests/milestone-views.txt 2012-04-10 14:04:27 +0000
553@@ -47,7 +47,7 @@
554 The MilestoneView provides access to the milestone and to its release if
555 it has one.
556
557- >>> login_person(person)
558+ >>> ignored = login_person(person)
559 >>> view = create_view(milestone, '+index')
560 >>> print view.context.name
561 kakapo
562@@ -205,7 +205,7 @@
563
564 The user_counts property is an empty list if the user is None.
565
566- >>> login_person(None)
567+ >>> ignored = login_person(None)
568 >>> view = create_view(milestone, '+index')
569 >>> view.user_counts
570 []
571@@ -214,7 +214,7 @@
572 files. It implements getReleases() that always returns the view's
573 release as a set.
574
575- >>> login_person(person)
576+ >>> ignored = login_person(person)
577 >>> view = create_view(milestone, '+index')
578 >>> view.getReleases()
579 set([<ProductRelease ...>])
580@@ -285,7 +285,7 @@
581 The delete column and delete submit are not rendered if the user does
582 not have edit permission.
583
584- >>> login_person(engineer)
585+ >>> ignored = login_person(engineer)
586 >>> view = create_view(
587 ... milestone, '+productrelease-data', principal=engineer)
588 >>> content = find_tag_by_id(view.render(), 'release-data')
589@@ -296,7 +296,7 @@
590 >>> print find_tag_by_id(content, 'delete-files')
591 None
592
593- >>> login_person(person)
594+ >>> ignored = login_person(person)
595
596
597 ProjectGroup milestones
598@@ -332,7 +332,7 @@
599 >>> from lp.registry.interfaces.product import IProductSet
600
601 >>> firefox = getUtility(IProductSet).getByName('firefox')
602- >>> login_person(firefox.owner)
603+ >>> ignored = login_person(firefox.owner)
604 >>> firefox_1_0 = firefox.getSeries('1.0')
605 >>> milestone = firefox_1_0.newMilestone('1.0.8')
606
607@@ -440,7 +440,7 @@
608 ... IDistributionSet)
609
610 >>> ubuntu_distro = getUtility(IDistributionSet).getByName('ubuntu')
611- >>> login_person(ubuntu_distro.owner.teamowner)
612+ >>> ignored = login_person(ubuntu_distro.owner.teamowner)
613 >>> hoary_series = ubuntu_distro.getSeries('hoary')
614 >>> milestone = hoary_series.newMilestone('alpha')
615 >>> view = create_initialized_view(milestone, '+edit')
616@@ -498,7 +498,7 @@
617 >>> from lp.registry.interfaces.person import IPersonSet
618
619 >>> no_priv = getUtility(IPersonSet).getByName('no-priv')
620- >>> login_person(no_priv)
621+ >>> ignored = login_person(no_priv)
622 >>> view = create_initialized_view(milestone, '+edit')
623 >>> check_permission('launchpad.Edit', view)
624 False
625@@ -510,7 +510,7 @@
626 The AddMilestoneView is used to create a new milestone.
627
628 >>> owner = firefox.owner
629- >>> login_person(owner)
630+ >>> ignored = login_person(owner)
631 >>> view = create_initialized_view(firefox_1_0, '+addmilestone')
632 >>> print view.label
633 Register a new milestone
634@@ -582,9 +582,9 @@
635
636 >>> distroseries = factory.makeDistroSeries(name='pumpkin')
637 >>> driver = factory.makePerson(name='a-driver')
638- >>> login_person(distroseries.distribution.owner)
639+ >>> ignored = login_person(distroseries.distribution.owner)
640 >>> distroseries.driver = driver
641- >>> login_person(driver)
642+ >>> ignored = login_person(driver)
643
644 >>> form = {
645 ... 'field.name': 'pie',
646@@ -605,9 +605,9 @@
647 The driver of an `IBaseDistribution` such as Ubuntu cannot create a
648 milestone.
649
650- >>> login_person(ubuntu_distro.owner.teamowner)
651+ >>> ignored = login_person(ubuntu_distro.owner.teamowner)
652 >>> hoary_series.driver = driver
653- >>> login_person(driver)
654+ >>> ignored = login_person(driver)
655
656 >>> view = create_initialized_view(hoary_series, '+addmilestone')
657 >>> check_permission('launchpad.Edit', view)
658@@ -628,7 +628,7 @@
659 Milestones. The view is restricted to owners of the project and drivers
660 of the series.
661
662- >>> login_person(owner)
663+ >>> ignored = login_person(owner)
664 >>> milestone = firefox_1_0.newMilestone('1.0.10')
665 >>> print milestone.name
666 1.0.10
667@@ -724,7 +724,7 @@
668 project owner or series driver..
669
670 >>> milestone = firefox_1_0.newMilestone('1.0.12')
671- >>> login_person(no_priv)
672+ >>> ignored = login_person(no_priv)
673 >>> view = create_initialized_view(milestone, '+delete')
674 >>> check_permission('launchpad.Edit', view)
675 False
676@@ -734,7 +734,7 @@
677 untargeted. It is possible for the owner or release manager to not have access
678 to a private bug that was targeted to a milestone by a driver.
679
680- >>> login_person(owner)
681+ >>> ignored = login_person(owner)
682 >>> milestone = firefox_1_0.newMilestone('1.0.13')
683 >>> private_bug = factory.makeBug(product=firefox, private=True)
684 >>> private_bugtask = bug.bugtasks[0]
685
686=== modified file 'lib/lp/registry/browser/tests/nameblacklist-views.txt'
687--- lib/lp/registry/browser/tests/nameblacklist-views.txt 2011-12-22 05:09:10 +0000
688+++ lib/lp/registry/browser/tests/nameblacklist-views.txt 2012-04-10 14:04:27 +0000
689@@ -20,7 +20,7 @@
690 All the blacklisted regular expressions that filter pillar names and
691 person names can be seen on the /+nameblacklist page.
692
693- >>> login_person(registry_expert)
694+ >>> ignored = login_person(registry_expert)
695 >>> view = create_initialized_view(name_blacklist_set, '+index',
696 ... principal=registry_expert)
697 >>> print extract_text(find_tag_by_id(view.render(), 'blacklist'))
698
699=== modified file 'lib/lp/registry/browser/tests/packaging-views.txt'
700--- lib/lp/registry/browser/tests/packaging-views.txt 2011-12-22 05:09:10 +0000
701+++ lib/lp/registry/browser/tests/packaging-views.txt 2012-04-10 14:04:27 +0000
702@@ -195,7 +195,7 @@
703 >>> grumpy_series.status = SeriesStatus.FROZEN
704
705 >>> a_user = factory.makePerson(name="hedgehog")
706- >>> login_person(a_user)
707+ >>> ignored = login_person(a_user)
708 >>> form = {
709 ... 'field.sourcepackagename': 'hot',
710 ... 'field.actions.continue': 'Update',
711@@ -263,7 +263,7 @@
712 >>> from lp.testing.pages import find_tag_by_id
713 >>> from lp.registry.interfaces.person import IPersonSet
714 >>> steve_a = getUtility(IPersonSet).getByName('stevea')
715- >>> login_person(steve_a)
716+ >>> ignored = login_person(steve_a)
717 >>> view = create_initialized_view(
718 ... product, name='+packages', principal=steve_a)
719 >>> print_packages(view)
720
721=== modified file 'lib/lp/registry/browser/tests/peoplemerge-views.txt'
722--- lib/lp/registry/browser/tests/peoplemerge-views.txt 2011-12-24 17:49:30 +0000
723+++ lib/lp/registry/browser/tests/peoplemerge-views.txt 2012-04-10 14:04:27 +0000
724@@ -18,7 +18,7 @@
725 >>> person_set = getUtility(IPersonSet)
726 >>> merge_job_source = getUtility(IPersonMergeJobSource)
727 >>> registry_expert= factory.makeRegistryExpert()
728- >>> login_person(registry_expert)
729+ >>> ignored = login_person(registry_expert)
730
731 A team (name21) can be merged into another (ubuntu-team).
732
733@@ -63,7 +63,7 @@
734 them to merge a profile which has no email address.
735
736 >>> admin = person_set.getByName('name16')
737- >>> login_person(registry_expert)
738+ >>> ignored = login_person(registry_expert)
739
740 # First we need to forge a person without a single email address.
741 >>> from lp.registry.interfaces.person import PersonCreationRationale
742@@ -105,19 +105,19 @@
743 >>> team_owner = factory.makePerson()
744 >>> team_member = factory.makePerson()
745 >>> deletable_team = factory.makeTeam(owner=team_owner, name='deletable')
746- >>> login_person(team_owner)
747+ >>> ignored = login_person(team_owner)
748 >>> ignore = deletable_team.addMember(team_member, reviewer=team_owner)
749 >>> view = create_initialized_view(deletable_team, '+delete')
750
751- >>> login_person(team_member)
752+ >>> ignored = login_person(team_member)
753 >>> check_permission('launchpad.Moderate', view)
754 False
755
756- >>> login_person(registry_expert)
757+ >>> ignored = login_person(registry_expert)
758 >>> check_permission('launchpad.Moderate', view)
759 True
760
761- >>> login_person(team_owner)
762+ >>> ignored = login_person(team_owner)
763 >>> check_permission('launchpad.Moderate', view)
764 True
765
766@@ -212,7 +212,7 @@
767
768 >>> team, mailing_list = factory.makeTeamAndMailingList(
769 ... 'not-deletable', 'rock')
770- >>> login_person(team.teamowner)
771+ >>> ignored = login_person(team.teamowner)
772 >>> view = create_initialized_view(
773 ... team, '+delete', principal=team.teamowner)
774 >>> view.canDelete(data={})
775
776=== modified file 'lib/lp/registry/browser/tests/person-admin-views.txt'
777--- lib/lp/registry/browser/tests/person-admin-views.txt 2012-01-15 11:52:24 +0000
778+++ lib/lp/registry/browser/tests/person-admin-views.txt 2012-04-10 14:04:27 +0000
779@@ -52,7 +52,7 @@
780
781 Non administrators cannot access the +review view
782
783- >>> login_person(user)
784+ >>> ignored = login_person(user)
785 >>> view = create_initialized_view(user, '+review')
786 >>> check_permission('launchpad.Admin', view)
787 False
788@@ -69,7 +69,7 @@
789
790 An admin can see a user's account information.
791
792- >>> login_person(admin)
793+ >>> ignored = login_person(admin)
794 >>> view = create_initialized_view(
795 ... user, '+reviewaccount', principal=admin)
796 >>> check_permission('launchpad.Admin', view)
797
798=== modified file 'lib/lp/registry/browser/tests/person-edit-views.txt'
799--- lib/lp/registry/browser/tests/person-edit-views.txt 2011-06-02 00:34:24 +0000
800+++ lib/lp/registry/browser/tests/person-edit-views.txt 2012-04-10 14:04:27 +0000
801@@ -10,7 +10,7 @@
802 The +editircnickname provides a label and a title.
803
804 >>> person = factory.makePerson(name='basil', displayname='Basil')
805- >>> login_person(person)
806+ >>> ignored = login_person(person)
807 >>> view = create_initialized_view(
808 ... person, name='+editircnicknames', form={}, principal=person)
809 >>> print view.label
810
811=== modified file 'lib/lp/registry/browser/tests/person-karma-views.txt'
812--- lib/lp/registry/browser/tests/person-karma-views.txt 2010-07-09 23:49:51 +0000
813+++ lib/lp/registry/browser/tests/person-karma-views.txt 2012-04-10 14:04:27 +0000
814@@ -5,7 +5,7 @@
815 The ~person/+karma page is controlled by the PersonKarmaView.
816
817 >>> geddy = factory.makePerson(name='geddy', displayname='Geddy Lee')
818- >>> login_person(geddy)
819+ >>> ignored = login_person(geddy)
820 >>> view = create_initialized_view(geddy, '+karma')
821
822 The view's label shows the person who's karma we're looking at...
823
824=== modified file 'lib/lp/registry/browser/tests/person-views.txt'
825--- lib/lp/registry/browser/tests/person-views.txt 2012-04-02 05:42:19 +0000
826+++ lib/lp/registry/browser/tests/person-views.txt 2012-04-10 14:04:27 +0000
827@@ -18,7 +18,7 @@
828 >>> homepage_content = "line one <script>\n\nhttp://aa.aa/"
829 >>> person_set = getUtility(IPersonSet)
830 >>> active_user = person_set.getByName('name12')
831- >>> login_person(active_user)
832+ >>> ignored = login_person(active_user)
833 >>> active_user.homepage_content = homepage_content
834 >>> login(ANONYMOUS)
835 >>> view = create_initialized_view(active_user, '+index')
836@@ -34,7 +34,7 @@
837 content is formatted HTML.
838
839 >>> team = factory.makeTeam()
840- >>> login_person(team.teamowner)
841+ >>> ignored = login_person(team.teamowner)
842 >>> team.homepage_content = homepage_content
843 >>> login(ANONYMOUS)
844 >>> view = create_initialized_view(team, '+index')
845@@ -69,7 +69,7 @@
846 # Only admins can change an account.
847
848 >>> admin_user = person_set.getByName('name16')
849- >>> login_person(admin_user)
850+ >>> ignored = login_person(admin_user)
851 >>> invalid_user = factory.makePerson(name="ugh")
852 >>> invalid_user.homepage_content = homepage_content
853 >>> IMasterObject(invalid_user.account).status = AccountStatus.NOACCOUNT
854@@ -334,7 +334,7 @@
855
856 >>> from lp.blueprints.enums import SpecificationImplementationStatus
857
858- >>> login_person(user)
859+ >>> ignored = login_person(user)
860 >>> product = factory.makeProduct(name="tool", owner=user)
861 >>> spec = factory.makeSpecification(
862 ... product=product, title='Specs need stories')
863@@ -729,7 +729,7 @@
864 >>> login("admin@canonical.com")
865 >>> private_ppa = factory.makeArchive(private=True)
866
867- >>> login_person(private_ppa.owner)
868+ >>> ignored = login_person(private_ppa.owner)
869 >>> view = create_initialized_view(private_ppa.owner, "+index")
870 >>> view.should_show_ppa_section
871 True
872@@ -745,7 +745,7 @@
873 >>> print sample_person.archive
874 None
875
876- >>> login_person(sample_person)
877+ >>> ignored = login_person(sample_person)
878 >>> view = create_initialized_view(sample_person, "+index")
879 >>> view.should_show_ppa_section
880 True
881
882=== modified file 'lib/lp/registry/browser/tests/pillar-views.txt'
883--- lib/lp/registry/browser/tests/pillar-views.txt 2012-03-20 13:34:44 +0000
884+++ lib/lp/registry/browser/tests/pillar-views.txt 2012-04-10 14:04:27 +0000
885@@ -9,7 +9,7 @@
886
887
888 >>> distribution = factory.makeDistribution(name='umbra')
889- >>> login_person(distribution.owner)
890+ >>> ignored = login_person(distribution.owner)
891 >>> view = create_view(
892 ... distribution, '+get-involved', principal=distribution.owner)
893
894@@ -65,7 +65,7 @@
895 Products are supported.
896
897 >>> product = factory.makeProduct(name='bread')
898- >>> login_person(product.owner)
899+ >>> ignored = login_person(product.owner)
900 >>> product.blueprints_usage = ServiceUsage.LAUNCHPAD
901 >>> view = create_view(product, '+get-involved')
902 >>> print view.blueprints_usage.name
903@@ -236,7 +236,7 @@
904 and translations those links are not enabled for DistributionSourcePackages.
905
906 >>> from lp.app.enums import ServiceUsage
907- >>> login_person(distribution.owner)
908+ >>> ignored = login_person(distribution.owner)
909 >>> distribution.blueprints_usage = ServiceUsage.LAUNCHPAD
910 >>> distribution.translations_usage = ServiceUsage.LAUNCHPAD
911 >>> package = factory.makeDistributionSourcePackage(
912
913=== modified file 'lib/lp/registry/browser/tests/poll-views.txt'
914--- lib/lp/registry/browser/tests/poll-views.txt 2011-12-22 05:09:10 +0000
915+++ lib/lp/registry/browser/tests/poll-views.txt 2012-04-10 14:04:27 +0000
916@@ -23,7 +23,7 @@
917
918 The portlet does not render any markup when there are no polls...
919
920- >>> login_person(user)
921+ >>> ignored = login_person(user)
922 >>> view = create_team_view(team, name='+portlet-polls', principal=user)
923 >>> view.has_current_polls
924 False
925@@ -36,7 +36,7 @@
926
927 Unless the user is a team owner.
928
929- >>> login_person(owner)
930+ >>> ignored = login_person(owner)
931 >>> view = create_team_view(team, name='+portlet-polls', principal=owner)
932 >>> view.has_current_polls
933 False
934@@ -63,7 +63,7 @@
935 ... 'name', 'title', 'proposition', open_date, close_date,
936 ... PollSecrecy.OPEN, False)
937
938- >>> login_person(user)
939+ >>> ignored = login_person(user)
940 >>> view = create_team_view(team, name='+portlet-polls', principal=user)
941 >>> view.has_current_polls
942 True
943@@ -77,7 +77,7 @@
944
945 The portlet shows more details to the poll owner.
946
947- >>> login_person(owner)
948+ >>> ignored = login_person(owner)
949 >>> view = create_team_view(team, name='+portlet-polls', principal=owner)
950 >>> view.has_current_polls
951 True
952@@ -96,7 +96,7 @@
953
954 >>> poll.dateopens = open_date - timedelta(weeks=2)
955
956- >>> login_person(user)
957+ >>> ignored = login_person(user)
958 >>> view = create_team_view(team, name='+portlet-polls', principal=user)
959 >>> print extract_text(view.render())
960 Polls
961@@ -104,7 +104,7 @@
962 You have 7 days left to vote in this poll.
963 Show polls
964
965- >>> login_person(owner)
966+ >>> ignored = login_person(owner)
967 >>> view = create_team_view(team, name='+portlet-polls', principal=owner)
968 >>> print extract_text(view.render())
969 Polls
970@@ -118,14 +118,14 @@
971
972 >>> poll.datecloses = close_date - timedelta(weeks=2)
973
974- >>> login_person(user)
975+ >>> ignored = login_person(user)
976 >>> view = create_team_view(team, name='+portlet-polls', principal=user)
977 >>> print extract_text(view.render())
978 Polls
979 No current polls.
980 Show polls
981
982- >>> login_person(owner)
983+ >>> ignored = login_person(owner)
984 >>> view = create_team_view(team, name='+portlet-polls', principal=owner)
985 >>> print extract_text(view.render())
986 Polls
987
988=== modified file 'lib/lp/registry/browser/tests/product-edit-people-view.txt'
989--- lib/lp/registry/browser/tests/product-edit-people-view.txt 2011-12-24 17:49:30 +0000
990+++ lib/lp/registry/browser/tests/product-edit-people-view.txt 2012-04-10 14:04:27 +0000
991@@ -29,7 +29,7 @@
992 Sample person, as the owner/maintainer can change the owner/maintainer
993 to No Privileges Person.
994
995- >>> login_person(sample_person)
996+ >>> ignored = login_person(sample_person)
997 >>> form = {
998 ... 'field.owner': 'no-priv',
999 ... 'field.actions.save': 'Save changes',
1000@@ -45,7 +45,7 @@
1001 Ownership can not be transferred to an open team.
1002
1003 >>> owner = factory.makePerson()
1004- >>> login_person(owner)
1005+ >>> ignored = login_person(owner)
1006 >>> product = factory.makeProduct(owner=owner)
1007 >>> from lp.registry.interfaces.person import TeamSubscriptionPolicy
1008 >>> team = factory.makeTeam(
1009@@ -67,7 +67,7 @@
1010 As a short-cut, a checkbox is presented to disclaim the maintainer
1011 role and transfer it to the Registry Administrators team.
1012
1013- >>> login_person(sample_person)
1014+ >>> ignored = login_person(sample_person)
1015 >>> product = factory.makeProduct(owner=sample_person)
1016 >>> transaction.commit()
1017
1018
1019=== modified file 'lib/lp/registry/browser/tests/product-files-views.txt'
1020--- lib/lp/registry/browser/tests/product-files-views.txt 2011-12-22 05:09:10 +0000
1021+++ lib/lp/registry/browser/tests/product-files-views.txt 2012-04-10 14:04:27 +0000
1022@@ -61,7 +61,7 @@
1023
1024 >>> from lp.testing.pages import (
1025 ... extract_text, find_tag_by_id)
1026- >>> login_person(product.owner)
1027+ >>> ignored = login_person(product.owner)
1028 >>> view = create_initialized_view(product, '+download',
1029 ... principal=product.owner)
1030 >>> admin_links = find_tag_by_id(view.render(), 'admin-links')
1031
1032=== modified file 'lib/lp/registry/browser/tests/product-portlet-packages-view.txt'
1033--- lib/lp/registry/browser/tests/product-portlet-packages-view.txt 2012-02-10 03:52:50 +0000
1034+++ lib/lp/registry/browser/tests/product-portlet-packages-view.txt 2012-04-10 14:04:27 +0000
1035@@ -40,7 +40,7 @@
1036 Let's create a test project.
1037
1038 >>> product = factory.makeProduct(name="bingo")
1039- >>> login_person(product.owner)
1040+ >>> ignored = login_person(product.owner)
1041 >>> view = create_initialized_view(
1042 ... product, name="+portlet-packages",
1043 ... principal=product.owner)
1044@@ -79,7 +79,7 @@
1045 >>> spph = factory.makeSourcePackagePublishingHistory(
1046 ... sourcepackagename=spn)
1047 >>> (ubuntu, product, spn) = updateCache()
1048- >>> login_person(product.owner)
1049+ >>> ignored = login_person(product.owner)
1050 >>> view = create_initialized_view(
1051 ... product, name="+portlet-packages",
1052 ... principal=product.owner)
1053@@ -95,7 +95,7 @@
1054 >>> spph = factory.makeSourcePackagePublishingHistory(
1055 ... sourcepackagename=spn, distroseries=warty)
1056 >>> (ubuntu, product, spn) = updateCache()
1057- >>> login_person(product.owner)
1058+ >>> ignored = login_person(product.owner)
1059 >>> view = create_initialized_view(
1060 ... product, name="+portlet-packages",
1061 ... principal=product.owner)
1062@@ -110,7 +110,7 @@
1063 ... sourcepackagename=spn, distroseries=ubuntu.currentseries,
1064 ... status=PackagePublishingStatus.DELETED)
1065 >>> (ubuntu, product, spn) = updateCache()
1066- >>> login_person(product.owner)
1067+ >>> ignored = login_person(product.owner)
1068 >>> view = create_initialized_view(
1069 ... product, name="+portlet-packages",
1070 ... principal=product.owner)
1071@@ -124,7 +124,7 @@
1072 >>> spph = factory.makeSourcePackagePublishingHistory(
1073 ... sourcepackagename=spn, distroseries=ubuntu.currentseries,
1074 ... status=PackagePublishingStatus.PUBLISHED)
1075- >>> login_person(product.owner)
1076+ >>> ignored = login_person(product.owner)
1077 >>> view = create_initialized_view(
1078 ... product, name="+portlet-packages",
1079 ... principal=product.owner)
1080@@ -159,7 +159,7 @@
1081 >>> spph = factory.makeSourcePackagePublishingHistory(
1082 ... sourcepackagename=spn, distroseries=ubuntu.currentseries)
1083 >>> (ubuntu, product, spn) = updateCache()
1084- >>> login_person(product.owner)
1085+ >>> ignored = login_person(product.owner)
1086 >>> view = create_initialized_view(
1087 ... product, name="+portlet-packages",
1088 ... principal=product.owner)
1089@@ -175,7 +175,7 @@
1090 >>> spph = factory.makeSourcePackagePublishingHistory(
1091 ... sourcepackagename=spn, distroseries=ubuntu.currentseries)
1092 >>> (ubuntu, product, spn) = updateCache()
1093- >>> login_person(product.owner)
1094+ >>> ignored = login_person(product.owner)
1095 >>> view = create_initialized_view(
1096 ... product, name="+portlet-packages",
1097 ... principal=product.owner)
1098@@ -211,7 +211,7 @@
1099 ... ubuntu.currentseries,
1100 ... babingo_spn, product.owner)
1101 >>> (ubuntu, product, spn) = updateCache()
1102- >>> login_person(product.owner)
1103+ >>> ignored = login_person(product.owner)
1104 >>> view = create_initialized_view(
1105 ... product, name="+portlet-packages",
1106 ... principal=product.owner)
1107@@ -240,7 +240,7 @@
1108 >>> print product.date_next_suggest_packaging
1109 None
1110
1111- >>> login_person(product.owner)
1112+ >>> ignored = login_person(product.owner)
1113 >>> view = create_initialized_view(
1114 ... product, name="+portlet-packages", principal=product.owner)
1115 >>> view.can_show_portlet
1116@@ -287,7 +287,7 @@
1117 ... 'field.distributionsourcepackage': 'bingo',
1118 ... 'field.actions.link': 'Set Ubuntu Package Information',
1119 ... }
1120- >>> login_person(product.owner)
1121+ >>> ignored = login_person(product.owner)
1122 >>> view = create_initialized_view(
1123 ... product, name="+portlet-packages", form=form)
1124 >>> view.errors
1125
1126=== modified file 'lib/lp/registry/browser/tests/product-views.txt'
1127--- lib/lp/registry/browser/tests/product-views.txt 2012-02-14 07:06:37 +0000
1128+++ lib/lp/registry/browser/tests/product-views.txt 2012-04-10 14:04:27 +0000
1129@@ -342,13 +342,13 @@
1130
1131 >>> from lp.services.webapp.authorization import check_permission
1132
1133- >>> login_person(firefox.owner)
1134+ >>> ignored = login_person(firefox.owner)
1135 >>> view = create_view(firefox, name='+addseries')
1136 >>> check_permission('launchpad.Driver', view)
1137 True
1138
1139 >>> firefox.driver = factory.makePerson()
1140- >>> login_person(firefox.driver)
1141+ >>> ignored = login_person(firefox.driver)
1142 >>> view = create_view(firefox, name='+addseries')
1143 >>> check_permission('launchpad.Driver', view)
1144 True
1145@@ -423,7 +423,7 @@
1146
1147 >>> product = factory.makeProduct(name='cucumber')
1148 >>> owner = product.owner
1149- >>> login_person(owner)
1150+ >>> ignored = login_person(owner)
1151 >>> question = factory.makeQuestion(target=product)
1152 >>> faq = factory.makeFAQ(target=product)
1153 >>> bug = factory.makeBug(product=product)
1154
1155=== modified file 'lib/lp/registry/browser/tests/productrelease-views.txt'
1156--- lib/lp/registry/browser/tests/productrelease-views.txt 2012-02-21 22:46:28 +0000
1157+++ lib/lp/registry/browser/tests/productrelease-views.txt 2012-04-10 14:04:27 +0000
1158@@ -20,7 +20,7 @@
1159 The view explains what that the user is creating a release, and lists
1160 the other releases for the series. There are no other releases yet.
1161
1162- >>> login_person(owner)
1163+ >>> ignored = login_person(owner)
1164 >>> view = create_initialized_view(naked_milestone, '+addrelease')
1165 >>> print view.label
1166 Create a new release for App
1167
1168=== modified file 'lib/lp/registry/browser/tests/productseries-setbranch-view.txt'
1169--- lib/lp/registry/browser/tests/productseries-setbranch-view.txt 2012-03-08 19:09:08 +0000
1170+++ lib/lp/registry/browser/tests/productseries-setbranch-view.txt 2012-04-10 14:04:27 +0000
1171@@ -10,7 +10,7 @@
1172 >>> product = factory.makeProduct(name="chevy")
1173 >>> series = factory.makeProductSeries(name="impala", product=product)
1174 >>> transaction.commit()
1175- >>> login_person(product.owner)
1176+ >>> ignored = login_person(product.owner)
1177 >>> view = create_initialized_view(series, name='+setbranch',
1178 ... principal=product.owner)
1179 >>> content = find_tag_by_id(view.render(), 'maincontent')
1180
1181=== modified file 'lib/lp/registry/browser/tests/productseries-views.txt'
1182--- lib/lp/registry/browser/tests/productseries-views.txt 2012-03-07 00:58:37 +0000
1183+++ lib/lp/registry/browser/tests/productseries-views.txt 2012-04-10 14:04:27 +0000
1184@@ -24,7 +24,7 @@
1185 rendering links:
1186
1187 >>> from lp.app.enums import ServiceUsage
1188- >>> login_person(product.owner)
1189+ >>> ignored = login_person(product.owner)
1190 >>> product.answers_usage = ServiceUsage.LAUNCHPAD
1191 >>> product.blueprints_usage = ServiceUsage.LAUNCHPAD
1192 >>> product.official_malone = True
1193@@ -81,7 +81,7 @@
1194 If the Create milestone link is not enabled, the script is not present.
1195
1196 >>> a_user = factory.makePerson(name="hedgehog")
1197- >>> login_person(a_user)
1198+ >>> ignored = login_person(a_user)
1199 >>> view = create_view(series, '+index', principal=a_user)
1200 >>> content = view.render()
1201 >>> print find_tag_by_id(content, 'milestone-script')
1202@@ -93,7 +93,7 @@
1203 be removed by the in-page script. If the product series has no milestones,
1204 the class table is 'listing unseen'.
1205
1206- >>> login_person(product.owner)
1207+ >>> ignored = login_person(product.owner)
1208 >>> view = create_view(series, '+index', principal=product.owner)
1209 >>> print view.milestone_table_class
1210 listing unseen
1211@@ -196,7 +196,7 @@
1212
1213 Users without edit permission cannot access the view.
1214
1215- >>> login_person(a_user)
1216+ >>> ignored = login_person(a_user)
1217 >>> view = create_view(series, name='+review')
1218 >>> check_permission('launchpad.Admin', view)
1219 False
1220@@ -236,7 +236,7 @@
1221 >>> product = factory.makeProduct(name="field", displayname='Field')
1222 >>> productseries = factory.makeProductSeries(
1223 ... product=product, name='rabbit', date_created=test_date)
1224- >>> login_person(celebrities.admin.teamowner)
1225+ >>> ignored = login_person(celebrities.admin.teamowner)
1226 >>> productseries.releasefileglob = 'http://eg.dom/rabbit/*'
1227
1228 Users without edit permission cannot access the view.
1229@@ -250,14 +250,14 @@
1230
1231 The project owner can access the view.
1232
1233- >>> login_person(product.owner)
1234+ >>> ignored = login_person(product.owner)
1235 >>> view = create_view(productseries, name='+delete')
1236 >>> check_permission('launchpad.Edit', view)
1237 True
1238
1239 Registry experts can also access the view.
1240
1241- >>> login_person(celebrities.registry_experts.teamowner)
1242+ >>> ignored = login_person(celebrities.registry_experts.teamowner)
1243 >>> check_permission('launchpad.Edit', view)
1244 True
1245
1246
1247=== modified file 'lib/lp/registry/browser/tests/projectgroup-views.txt'
1248--- lib/lp/registry/browser/tests/projectgroup-views.txt 2011-12-22 05:09:10 +0000
1249+++ lib/lp/registry/browser/tests/projectgroup-views.txt 2012-04-10 14:04:27 +0000
1250@@ -21,7 +21,7 @@
1251 ... product.project = projectgroup
1252
1253 >>> owner = projectgroup.owner
1254- >>> login_person(owner)
1255+ >>> ignored = login_person(owner)
1256 >>> add_daughter(projectgroup, 'a')
1257 >>> projectgroup.products.count()
1258 1
1259
1260=== modified file 'lib/lp/registry/browser/tests/projectgroupset-views.txt'
1261--- lib/lp/registry/browser/tests/projectgroupset-views.txt 2011-12-24 17:49:30 +0000
1262+++ lib/lp/registry/browser/tests/projectgroupset-views.txt 2012-04-10 14:04:27 +0000
1263@@ -30,7 +30,7 @@
1264 A regular user cannot access the view.
1265
1266 >>> user = factory.makePerson()
1267- >>> login_person(user)
1268+ >>> ignored = login_person(user)
1269 >>> celebs = getUtility(ILaunchpadCelebrities)
1270 >>> registry = celebs.registry_experts
1271 >>> user.inTeam(registry)
1272@@ -47,7 +47,7 @@
1273 >>> registry_member.inTeam(registry)
1274 True
1275
1276- >>> login_person(registry_member)
1277+ >>> ignored = login_person(registry_member)
1278 >>> check_permission('launchpad.Moderate', view)
1279 True
1280
1281@@ -69,13 +69,13 @@
1282
1283 A regular user cannot access the view.
1284
1285- >>> login_person(user)
1286+ >>> ignored = login_person(user)
1287 >>> check_permission('launchpad.Moderate', view)
1288 False
1289
1290 A member of the registry team has permission.
1291
1292- >>> login_person(registry_member)
1293+ >>> ignored = login_person(registry_member)
1294 >>> check_permission('launchpad.Moderate', view)
1295 True
1296
1297@@ -95,12 +95,12 @@
1298
1299 A regular user cannot access the view.
1300
1301- >>> login_person(user)
1302+ >>> ignored = login_person(user)
1303 >>> check_permission('launchpad.Moderate', view)
1304 False
1305
1306 A member of the registry team has permission.
1307
1308- >>> login_person(registry_member)
1309+ >>> ignored = login_person(registry_member)
1310 >>> check_permission('launchpad.Moderate', view)
1311 True
1312
1313=== modified file 'lib/lp/registry/browser/tests/sourcepackage-views.txt'
1314--- lib/lp/registry/browser/tests/sourcepackage-views.txt 2011-12-22 05:09:10 +0000
1315+++ lib/lp/registry/browser/tests/sourcepackage-views.txt 2012-04-10 14:04:27 +0000
1316@@ -49,7 +49,7 @@
1317 >>> print view.view.request.form
1318 {'field.__visited_steps__': 'sourcepackage_change_upstream_step1'}
1319
1320- >>> login_person(product.owner)
1321+ >>> ignored = login_person(product.owner)
1322 >>> form = {
1323 ... 'field.product': 'bonkers',
1324 ... 'field.actions.continue': 'Continue',
1325@@ -303,7 +303,7 @@
1326
1327 Having official_malone set results in has_bugtracker being true.
1328
1329- >>> login_person(product.owner)
1330+ >>> ignored = login_person(product.owner)
1331 >>> product.official_malone = True
1332 >>> print view.has_bugtracker
1333 True
1334@@ -331,7 +331,7 @@
1335 If the product's project does have a bug tracker then the product
1336 inherits it.
1337
1338- >>> login_person(project.owner)
1339+ >>> ignored = login_person(project.owner)
1340 >>> project.bugtracker = bugtracker
1341 >>> print view.has_bugtracker
1342 True
1343@@ -354,7 +354,7 @@
1344 http://launchpad.dev/youbuntu/wonky/+source/stinkypackage
1345
1346 >>> user = package.packaging.owner
1347- >>> login_person(user)
1348+ >>> ignored = login_person(user)
1349 >>> form = {'field.actions.unlink': 'Unlink'}
1350 >>> view = create_initialized_view(
1351 ... package, name='+remove-packaging', form=form, principal=user)
1352
1353=== modified file 'lib/lp/registry/browser/tests/team-join-views.txt'
1354--- lib/lp/registry/browser/tests/team-join-views.txt 2012-01-04 06:52:11 +0000
1355+++ lib/lp/registry/browser/tests/team-join-views.txt 2012-04-10 14:04:27 +0000
1356@@ -37,7 +37,7 @@
1357 Therefore no error message is seen.
1358
1359 >>> sample_person = personset.getByName('name12')
1360- >>> login_person(sample_person)
1361+ >>> ignored = login_person(sample_person)
1362 >>> no_list_team = make_team(
1363 ... 'open-team-no-list', TeamSubscriptionPolicy.OPEN)
1364
1365
1366=== modified file 'lib/lp/registry/browser/tests/team-views.txt'
1367--- lib/lp/registry/browser/tests/team-views.txt 2012-02-16 20:37:55 +0000
1368+++ lib/lp/registry/browser/tests/team-views.txt 2012-04-10 14:04:27 +0000
1369@@ -30,7 +30,7 @@
1370 If new members are added/proposed, they'll show up at the top of the lists.
1371
1372 >>> sample_person = person_set.getByName('name12')
1373- >>> login_person(sample_person)
1374+ >>> ignored = login_person(sample_person)
1375 >>> sample_person.join(ubuntu_team)
1376 >>> salgado = person_set.getByName('salgado')
1377 >>> mark = person_set.getByName('mark')
1378@@ -80,7 +80,7 @@
1379
1380 >>> guadamen = person_set.getByName('guadamen')
1381 >>> bart = factory.makePerson(email='bart@example.com', name='bart')
1382- >>> login_person(bart)
1383+ >>> ignored = login_person(bart)
1384
1385 >>> view = create_initialized_view(guadamen, '+index')
1386 >>> print view.contact_link_title
1387@@ -150,7 +150,7 @@
1388 This page lists the teams that you administer and can add as a member
1389 to the current team.
1390
1391- >>> login_person(sample_person)
1392+ >>> ignored = login_person(sample_person)
1393 >>> view = create_initialized_view(guadamen, '+add-my-teams')
1394 >>> for candidate in view.candidate_teams:
1395 ... print candidate.name, candidate.visibility.title
1396
1397=== modified file 'lib/lp/registry/browser/tests/teammembership-views.txt'
1398--- lib/lp/registry/browser/tests/teammembership-views.txt 2011-12-30 07:50:11 +0000
1399+++ lib/lp/registry/browser/tests/teammembership-views.txt 2012-04-10 14:04:27 +0000
1400@@ -61,10 +61,10 @@
1401
1402 >>> from lp.registry.browser.team import TeamInvitationView
1403
1404- >>> login_person(team_owner)
1405+ >>> ignored = login_person(team_owner)
1406 >>> ignored = super_team.addMember(team, team_owner)
1407 >>> membership = membership_set.getByPersonAndTeam(team, super_team)
1408- >>> login_person(team.teamowner)
1409+ >>> ignored = login_person(team.teamowner)
1410 >>> view = TeamInvitationView(membership, request)
1411 >>> print view.label
1412 Make Bassists a member of Us
1413
1414=== modified file 'lib/lp/registry/browser/tests/user-to-user-views.txt'
1415--- lib/lp/registry/browser/tests/user-to-user-views.txt 2012-02-10 21:35:50 +0000
1416+++ lib/lp/registry/browser/tests/user-to-user-views.txt 2012-04-10 14:04:27 +0000
1417@@ -24,7 +24,7 @@
1418 ...No Priv would start by going to Salgado's +contactuser page.
1419
1420 >>> from lp.testing import login
1421- >>> login_person(no_priv)
1422+ >>> ignored = login_person(no_priv)
1423 >>> view = create_view(no_priv, salgado)
1424
1425 This contact is allowed.
1426@@ -220,13 +220,13 @@
1427
1428 Salgado decides to hide his email addresses.
1429
1430- >>> login_person(salgado)
1431+ >>> ignored = login_person(salgado)
1432 >>> salgado.hide_email_addresses = True
1433
1434 Anne contacts Salgado even though his email addresses are hidden.
1435
1436 >>> anne = factory.makePerson(email='anne@example.com', name='anne')
1437- >>> login_person(anne)
1438+ >>> ignored = login_person(anne)
1439
1440 >>> view = create_view(
1441 ... anne, salgado, {
1442@@ -284,7 +284,7 @@
1443
1444 >>> guadamen = person_set.getByName('guadamen')
1445 >>> bart = factory.makePerson(email='bart@example.com', name='bart')
1446- >>> login_person(bart)
1447+ >>> ignored = login_person(bart)
1448
1449 >>> view = create_view(
1450 ... bart, guadamen, {
1451@@ -424,7 +424,7 @@
1452
1453 >>> cris = factory.makePerson(email='cris@example.com', name='cris')
1454 >>> dave = factory.makePerson(email='dave@example.com', name='dave')
1455- >>> login_person(cris)
1456+ >>> ignored = login_person(cris)
1457
1458 >>> view = create_view(
1459 ... cris, dave, {
1460
1461=== modified file 'lib/lp/registry/doc/commercialsubscription.txt'
1462--- lib/lp/registry/doc/commercialsubscription.txt 2012-03-09 18:08:41 +0000
1463+++ lib/lp/registry/doc/commercialsubscription.txt 2012-04-10 14:04:27 +0000
1464@@ -54,7 +54,7 @@
1465 >>> check_permission('launchpad.Commercial', bzr.commercial_subscription)
1466 False
1467
1468- >>> login_person(owner)
1469+ >>> ignored = login_person(owner)
1470 >>> check_permission('launchpad.Commercial', bzr.commercial_subscription)
1471 False
1472
1473@@ -542,7 +542,7 @@
1474 >>> registry = celebs.registry_experts
1475 >>> ignored = registry.addMember(registry_member, registry.teamowner)
1476
1477- >>> login_person(registry_member)
1478+ >>> ignored = login_person(registry_member)
1479 >>> check_permission('launchpad.Moderate', product_set)
1480 True
1481 >>> gnome = product_set.forReview(search_text='gnome')
1482@@ -577,7 +577,7 @@
1483 >>> product = factory.makeProduct(name='dog')
1484 >>> project = factory.makeProject(name='cat')
1485
1486- >>> login_person(registry_member)
1487+ >>> ignored = login_person(registry_member)
1488 >>> check_permission('launchpad.Moderate', project_set)
1489 True
1490 >>> check_permission('launchpad.Moderate', project)
1491
1492=== modified file 'lib/lp/registry/doc/distribution-mirror.txt'
1493--- lib/lp/registry/doc/distribution-mirror.txt 2011-12-24 17:49:30 +0000
1494+++ lib/lp/registry/doc/distribution-mirror.txt 2012-04-10 14:04:27 +0000
1495@@ -838,7 +838,7 @@
1496 ... owner, speed, brazil, content, http_base_url='http://a.ab/')
1497
1498
1499- >>> login_person(mirror.owner)
1500+ >>> ignored = login_person(mirror.owner)
1501 >>> mirror.owner = new_owner
1502 >>> print mirror.owner.name
1503 bear
1504@@ -855,7 +855,7 @@
1505
1506 Only mirrors which have never been probed can be deleted this way.
1507
1508- >>> login_person(cdimage_mirror.owner)
1509+ >>> ignored = login_person(cdimage_mirror.owner)
1510 >>> cdimage_mirror.destroySelf()
1511 Traceback (most recent call last):
1512 ...
1513
1514=== modified file 'lib/lp/registry/doc/distribution.txt'
1515--- lib/lp/registry/doc/distribution.txt 2011-10-12 16:04:06 +0000
1516+++ lib/lp/registry/doc/distribution.txt 2012-04-10 14:04:27 +0000
1517@@ -399,7 +399,7 @@
1518 If the official_ attributes are False and the enum hasn't been set,
1519 the usage enums don't know anything.
1520
1521- >>> login_person(ubuntu.owner.teamowner)
1522+ >>> ignored = login_person(ubuntu.owner.teamowner)
1523 >>> ubuntu.official_answers = False
1524 >>> print ubuntu.answers_usage.name
1525 UNKNOWN
1526@@ -454,7 +454,7 @@
1527
1528 >>> debian_owner = factory.makePerson()
1529 >>> debian.owner = debian_owner
1530- >>> login_person(debian_owner)
1531+ >>> ignored = login_person(debian_owner)
1532 >>> debian.blueprints_usage = ServiceUsage.NOT_APPLICABLE
1533 >>> print debian.blueprints_usage.name
1534 NOT_APPLICABLE
1535
1536=== modified file 'lib/lp/registry/doc/distroseries.txt'
1537--- lib/lp/registry/doc/distroseries.txt 2012-03-29 07:56:15 +0000
1538+++ lib/lp/registry/doc/distroseries.txt 2012-04-10 14:04:27 +0000
1539@@ -846,7 +846,7 @@
1540 >>> youbuntu = factory.makeDistribution(name='youbuntu')
1541 >>> yo_driver = factory.makePerson(name='yo-driver')
1542 >>> youbuntu.driver = yo_driver
1543- >>> login_person(yo_driver)
1544+ >>> ignored = login_person(yo_driver)
1545 >>> youbuntu.full_functionality
1546 False
1547
1548@@ -865,7 +865,7 @@
1549 they are not automatically set as the series driver because they always
1550 have permission to edit the series.
1551
1552- >>> login_person(youbuntu.owner)
1553+ >>> ignored = login_person(youbuntu.owner)
1554 >>> yo_series = youbuntu.newSeries(
1555 ... name='forest', displayname='Forest', title='YouBuntu Forest',
1556 ... summary='summary', description='description', version='09.07',
1557@@ -879,9 +879,9 @@
1558 Soyuz and Translations before a series can be created. Ubuntu driver can
1559 not create series.
1560
1561- >>> login_person(ubuntu.owner.activemembers[0])
1562+ >>> ignored = login_person(ubuntu.owner.activemembers[0])
1563 >>> ubuntu.driver = yo_driver
1564- >>> login_person(yo_driver)
1565+ >>> ignored = login_person(yo_driver)
1566 >>> ubuntu.newSeries(
1567 ... name='finch', displayname='Finch', title='Ubuntu Finch',
1568 ... summary='summary', description='description', version='9.06',
1569@@ -893,7 +893,7 @@
1570 Owners and admins of base distributions are the only users who can create a
1571 series.
1572
1573- >>> login_person(ubuntu.owner.activemembers[0])
1574+ >>> ignored = login_person(ubuntu.owner.activemembers[0])
1575 >>> u_series = ubuntu.newSeries(
1576 ... name='finch', displayname='Finch', title='Ubuntu Finch',
1577 ... summary='summary', description='description', version='9.06',
1578
1579=== modified file 'lib/lp/registry/doc/mailinglists.txt'
1580--- lib/lp/registry/doc/mailinglists.txt 2011-12-30 08:03:42 +0000
1581+++ lib/lp/registry/doc/mailinglists.txt 2012-04-10 14:04:27 +0000
1582@@ -215,7 +215,7 @@
1583 >>> list_three.transitionToStatus(MailingListStatus.ACTIVE)
1584 >>> transaction.commit()
1585
1586- >>> login_person(team_three.teamowner)
1587+ >>> ignored = login_person(team_three.teamowner)
1588 >>> list_three.deactivate()
1589 >>> print list_three.status.name
1590 DEACTIVATING
1591
1592=== modified file 'lib/lp/registry/doc/milestone.txt'
1593--- lib/lp/registry/doc/milestone.txt 2011-12-30 07:38:46 +0000
1594+++ lib/lp/registry/doc/milestone.txt 2012-04-10 14:04:27 +0000
1595@@ -381,7 +381,7 @@
1596 admins. The name, dateexpected, summary, and active, attributes are
1597 editable.
1598
1599- >>> login_person(upstream_firefox.owner)
1600+ >>> ignored = login_person(upstream_firefox.owner)
1601 >>> fizzy_milestone = ff_onedotzero.newMilestone('fuzzy')
1602
1603 >>> print fizzy_milestone.name
1604@@ -437,11 +437,11 @@
1605 >>> release_manager = factory.makePerson(name='release-manager')
1606 >>> fizzy_milestone.series_target.driver = release_manager
1607
1608- >>> login_person(driver)
1609+ >>> ignored = login_person(driver)
1610 >>> check_permission('launchpad.Edit', fizzy_milestone)
1611 False
1612
1613- >>> login_person(release_manager)
1614+ >>> ignored = login_person(release_manager)
1615 >>> check_permission('launchpad.Edit', fizzy_milestone)
1616 True
1617
1618@@ -454,7 +454,7 @@
1619 specifications targeted to it.
1620
1621 >>> owner = getUtility(IPersonSet).getByName('name12')
1622- >>> login_person(owner)
1623+ >>> ignored = login_person(owner)
1624 >>> milestone = ff_onedotzero.newMilestone('1.0.10')
1625 >>> print milestone.product_release
1626 None
1627
1628=== modified file 'lib/lp/registry/doc/person.txt'
1629--- lib/lp/registry/doc/person.txt 2012-01-18 07:37:32 +0000
1630+++ lib/lp/registry/doc/person.txt 2012-04-10 14:04:27 +0000
1631@@ -798,7 +798,7 @@
1632
1633 But Owner, a member of that team, will see it in the results.
1634
1635- >>> login_person(private_team_owner)
1636+ >>> ignored = login_person(private_team_owner)
1637 >>> print_people(personset.find('team'))
1638 Another a new team (new3): []
1639 Hoary Gnome Team (name21): []
1640@@ -1089,7 +1089,7 @@
1641 >>> registry = celebs.registry_experts
1642 >>> ignored = registry.addMember(registry_member, registry.teamowner)
1643
1644- >>> login_person(registry_member)
1645+ >>> ignored = login_person(registry_member)
1646 >>> derby = getUtility(IProductSet).getByName('derby')
1647 >>> derby.active = False
1648 >>> for project in mark.getOwnedProjects():
1649
1650=== modified file 'lib/lp/registry/doc/personlocation.txt'
1651--- lib/lp/registry/doc/personlocation.txt 2012-02-16 21:52:58 +0000
1652+++ lib/lp/registry/doc/personlocation.txt 2012-04-10 14:04:27 +0000
1653@@ -22,7 +22,7 @@
1654 latitude and longitude to None, regardless of what was passed in.
1655
1656 >>> cprov = personset.getByName('cprov')
1657- >>> login_person(cprov)
1658+ >>> ignored = login_person(cprov)
1659 >>> cprov.setLocation(-43.2, -61.93, 'America/Sao_Paulo', cprov)
1660 >>> print cprov.time_zone
1661 America/Sao_Paulo
1662
1663=== modified file 'lib/lp/registry/doc/private-team-roles.txt'
1664--- lib/lp/registry/doc/private-team-roles.txt 2011-12-20 18:37:09 +0000
1665+++ lib/lp/registry/doc/private-team-roles.txt 2012-04-10 14:04:27 +0000
1666@@ -18,7 +18,7 @@
1667 ... TeamSubscriptionPolicy,
1668 ... )
1669 >>> admin_user = getUtility(IPersonSet).getByEmail('admin@canonical.com')
1670- >>> login_person(admin_user)
1671+ >>> ignored = login_person(admin_user)
1672 >>> priv_team = factory.makeTeam(name='private-team',
1673 ... owner=team_owner,
1674 ... visibility=PersonVisibility.PRIVATE,
1675@@ -140,7 +140,7 @@
1676 ... visibility=PersonVisibility.PRIVATE)
1677
1678 >>> # We must login as the archive owner to add the subscription.
1679- >>> login_person(team_owner)
1680+ >>> ignored = login_person(team_owner)
1681 >>> subscription = private_archive.newSubscription(
1682 ... subscriber=another_priv_team,
1683 ... registrant=team_owner)
1684@@ -184,7 +184,7 @@
1685 Only a person can register a project, not a team, so no team, public
1686 or private, can be the project registrant.
1687
1688- >>> login_person(admin_user)
1689+ >>> ignored = login_person(admin_user)
1690 >>> public_team = factory.makeTeam(name='public-team',
1691 ... owner=team_owner,
1692 ... visibility=PersonVisibility.PUBLIC,
1693
1694=== modified file 'lib/lp/registry/doc/product.txt'
1695--- lib/lp/registry/doc/product.txt 2012-03-09 17:50:07 +0000
1696+++ lib/lp/registry/doc/product.txt 2012-04-10 14:04:27 +0000
1697@@ -289,7 +289,7 @@
1698
1699 >>> from lp.bugs.interfaces.bugtracker import IBugTrackerSet
1700
1701- >>> login_person(firefox.owner)
1702+ >>> ignored = login_person(firefox.owner)
1703 >>> bug_tracker_set = getUtility(IBugTrackerSet)
1704 >>> gnome_bugzilla = bug_tracker_set.getByName('gnome-bugzilla')
1705 >>> firefox.project.bugtracker = gnome_bugzilla
1706@@ -722,7 +722,7 @@
1707 >>> print mark.name
1708 mark
1709
1710- >>> login_person(firefox.owner)
1711+ >>> ignored = login_person(firefox.owner)
1712 >>> firefox.owner = mark
1713
1714 >>> print firefox.owner.name
1715
1716=== modified file 'lib/lp/registry/doc/productrelease.txt'
1717--- lib/lp/registry/doc/productrelease.txt 2011-12-24 17:49:30 +0000
1718+++ lib/lp/registry/doc/productrelease.txt 2012-04-10 14:04:27 +0000
1719@@ -10,7 +10,7 @@
1720 >>> firefox = productset['firefox']
1721 >>> firefox_1_0 = firefox.getSeries('1.0')
1722 >>> owner = firefox_1_0.owner
1723- >>> login_person(owner)
1724+ >>> ignored = login_person(owner)
1725 >>> milestone = firefox_1_0.newMilestone('1.0.9')
1726 >>> from datetime import datetime
1727 >>> from pytz import UTC
1728@@ -32,18 +32,18 @@
1729 >>> release_manager = factory.makePerson(name='release-manager')
1730 >>> firefox_109.milestone.series_target.driver = release_manager
1731
1732- >>> login_person(driver)
1733+ >>> ignored = login_person(driver)
1734 >>> check_permission('launchpad.Edit', firefox_109)
1735 False
1736
1737- >>> login_person(release_manager)
1738+ >>> ignored = login_person(release_manager)
1739 >>> check_permission('launchpad.Edit', firefox_109)
1740 True
1741
1742 A product release can be deleted using its destroySelf() method, as long
1743 as it doesn't have any IProductReleaseFiles associated with it.
1744
1745- >>> login_person(owner)
1746+ >>> ignored = login_person(owner)
1747 >>> firefox_109.files.count()
1748 0
1749 >>> firefox_109.destroySelf()
1750
1751=== modified file 'lib/lp/registry/doc/productseries.txt'
1752--- lib/lp/registry/doc/productseries.txt 2011-12-30 06:14:56 +0000
1753+++ lib/lp/registry/doc/productseries.txt 2012-04-10 14:04:27 +0000
1754@@ -73,7 +73,7 @@
1755 ...
1756 Unauthorized: (..., 'newSeries', 'launchpad.Driver')
1757
1758- >>> login_person(firefox.owner)
1759+ >>> ignored = login_person(firefox.owner)
1760 >>> emacs_series = firefox.newSeries(
1761 ... firefox.owner , 'emacs', summary,
1762 ... releasefileglob='ftp://gnu.org/emacs*.gz')
1763@@ -90,7 +90,7 @@
1764 to make him the release manager.
1765
1766 >>> firefox.driver = series_driver
1767- >>> login_person(series_driver)
1768+ >>> ignored = login_person(series_driver)
1769 >>> emacs2 = firefox.newSeries(series_driver , 'emacs2', summary)
1770 >>> print emacs2.driver.name
1771 driver
1772@@ -114,7 +114,7 @@
1773
1774 >>> from lp.services.webapp.authorization import check_permission
1775
1776- >>> login_person(series_driver)
1777+ >>> ignored = login_person(series_driver)
1778 >>> print emacs_series.owner.name
1779 name12
1780 >>> print emacs_series.driver
1781@@ -125,9 +125,9 @@
1782 A person appointed to the series driver has the release manager role and can
1783 edit a product series.
1784
1785- >>> login_person(firefox.owner)
1786+ >>> ignored = login_person(firefox.owner)
1787 >>> emacs_series.driver = series_driver
1788- >>> login_person(series_driver)
1789+ >>> ignored = login_person(series_driver)
1790 >>> check_permission('launchpad.Edit', emacs_series)
1791 True
1792
1793
1794=== modified file 'lib/lp/registry/doc/teammembership-email-notification.txt'
1795--- lib/lp/registry/doc/teammembership-email-notification.txt 2012-01-27 11:12:53 +0000
1796+++ lib/lp/registry/doc/teammembership-email-notification.txt 2012-04-10 14:04:27 +0000
1797@@ -50,10 +50,10 @@
1798
1799 In open teams joining and leaving the team generates no notifications.
1800
1801- >>> login_person(admin_person)
1802+ >>> ignored = login_person(admin_person)
1803 >>> base_mails = len(stub.test_emails)
1804 >>> new_person = factory.makePerson()
1805- >>> login_person(new_person)
1806+ >>> ignored = login_person(new_person)
1807 >>> new_person.join(open_team)
1808 >>> membership = membershipset.getByPersonAndTeam(new_person, open_team)
1809 >>> membership.status.title
1810@@ -72,7 +72,7 @@
1811 generates a notification email only to Ubuntu Team administrators.
1812
1813 >>> lifeless = personset.getByName('lifeless')
1814- >>> login_person(lifeless)
1815+ >>> ignored = login_person(lifeless)
1816 >>> lifeless.join(ubuntu_team)
1817 >>> membership = membershipset.getByPersonAndTeam(lifeless, ubuntu_team)
1818 >>> membership.status.title
1819@@ -708,7 +708,7 @@
1820 >>> print karl_on_mirroradmins.dateexpires
1821 None
1822
1823- >>> login_person(mirror_admins.teamowner)
1824+ >>> ignored = login_person(mirror_admins.teamowner)
1825 >>> karl_on_mirroradmins.setExpirationDate(
1826 ... tomorrow, mirror_admins.teamowner)
1827 >>> ondemand = TeamMembershipRenewalPolicy.ONDEMAND
1828@@ -716,7 +716,7 @@
1829 >>> mirror_admins.defaultrenewalperiod = 365
1830 >>> flush_database_updates()
1831
1832- >>> login_person(karl)
1833+ >>> ignored = login_person(karl)
1834 >>> karl.renewTeamMembership(mirror_admins)
1835 >>> run_mail_jobs()
1836 >>> len(stub.test_emails)
1837@@ -847,7 +847,7 @@
1838 >>> print dumper_hwdb_membership.status.title
1839 Approved
1840
1841- >>> login_person(admin_person)
1842+ >>> ignored = login_person(admin_person)
1843 >>> setStatus(dumper_hwdb_membership, TeamMembershipStatus.DEACTIVATED,
1844 ... reviewer=admin_person, silent=True)
1845 >>> run_mail_jobs()
1846@@ -862,7 +862,7 @@
1847
1848 >>> kamion = getUtility(IPersonSet).getByName('kamion')
1849 >>> stevea = getUtility(IPersonSet).getByName('stevea')
1850- >>> login_person(kamion)
1851+ >>> ignored = login_person(kamion)
1852 >>> ubuntu_team = personset.getByName('ubuntu-team')
1853 >>> kamion_ubuntu_team_membership = membershipset.getByPersonAndTeam(
1854 ... kamion, ubuntu_team)
1855@@ -890,7 +890,7 @@
1856 notification email contain subscription information.
1857
1858 >>> owner = factory.makePerson(name='team-owner')
1859- >>> login_person(owner)
1860+ >>> ignored = login_person(owner)
1861 >>> team_one, list_one = factory.makeTeamAndMailingList(
1862 ... 'team-one', owner.name)
1863 >>> dummy = pop_notifications()
1864
1865=== modified file 'lib/lp/registry/doc/teammembership.txt'
1866--- lib/lp/registry/doc/teammembership.txt 2012-01-06 11:08:30 +0000
1867+++ lib/lp/registry/doc/teammembership.txt 2012-04-10 14:04:27 +0000
1868@@ -67,7 +67,7 @@
1869 team he wants.
1870
1871 >>> salgado = personset.getByName('salgado')
1872- >>> login_person(salgado)
1873+ >>> ignored = login_person(salgado)
1874 >>> salgado.join(t3)
1875 >>> salgado.join(t4)
1876
1877@@ -79,7 +79,7 @@
1878
1879 >>> [m.displayname for m in t3.allmembers]
1880 [u'Jeff Waugh']
1881- >>> login_person(t3.teamowner)
1882+ >>> ignored = login_person(t3.teamowner)
1883 >>> t3.setMembershipData(salgado, TeamMembershipStatus.APPROVED, reviewer)
1884 >>> flush_database_updates()
1885 >>> [m.displayname for m in t3.allmembers]
1886@@ -92,7 +92,7 @@
1887 >>> launchpad = personset.getByName('launchpad')
1888 >>> launchpad.subscriptionpolicy == TeamSubscriptionPolicy.RESTRICTED
1889 True
1890- >>> login_person(salgado)
1891+ >>> ignored = login_person(salgado)
1892 >>> salgado.join(launchpad)
1893 Traceback (most recent call last):
1894 ...
1895@@ -112,7 +112,7 @@
1896 requester to the join() method.
1897
1898 >>> ubuntu_team = personset.getByName('ubuntu-team')
1899- >>> login_person(ubuntu_team.teamowner)
1900+ >>> ignored = login_person(ubuntu_team.teamowner)
1901 >>> ubuntu_team.join(t3, ubuntu_team.teamowner)
1902 >>> t3.subscriptionpolicy
1903 <DBItem TeamSubscriptionPolicy.MODERATED...
1904@@ -126,7 +126,7 @@
1905 True
1906
1907 # Clean things up to not upset the other tests.
1908- >>> login_person(t2.teamowner)
1909+ >>> ignored = login_person(t2.teamowner)
1910 >>> t2.setMembershipData(
1911 ... ubuntu_team, TeamMembershipStatus.DEACTIVATED, t2.teamowner)
1912 >>> ubuntu_team in t2.activemembers
1913@@ -151,7 +151,7 @@
1914 Unauthorized:...
1915
1916 # Log in as the team owner.
1917- >>> login_person(t3.teamowner)
1918+ >>> ignored = login_person(t3.teamowner)
1919
1920 If the member was added (i.e. he wasn't already a member of the team),
1921 addMember returns a tuple with True plus the new membership status.
1922@@ -203,7 +203,7 @@
1923 invited to be a member and one of the team's admins will have to accept the
1924 invitation before the team is made a member.
1925
1926- >>> login_person(t1.teamowner)
1927+ >>> ignored = login_person(t1.teamowner)
1928
1929 # If the reviewer were also an admin of the team being added,
1930 # the status would go to APPROVED instead of INVITED.
1931@@ -220,7 +220,7 @@
1932 Once one of the t2 admins approve the membership, t2 is shown as a member
1933 of t1 and the owner of t2 is an indirect member.
1934
1935- >>> login_person(t2.teamowner)
1936+ >>> ignored = login_person(t2.teamowner)
1937 >>> t2.acceptInvitationToBeMemberOf(t1, comment='something')
1938 >>> [m.displayname for m in t1.activemembers]
1939 [u'James Blackwell', u't2']
1940@@ -231,7 +231,7 @@
1941
1942 >>> t2.addMember(t3, reviewer=mark)
1943 (True, <DBItem TeamMembershipStatus.INVITED...)
1944- >>> login_person(t3.teamowner)
1945+ >>> ignored = login_person(t3.teamowner)
1946 >>> t3.declineInvitationToBeMemberOf(t2, comment='something')
1947 >>> membership = membershipset.getByPersonAndTeam(t3, t2)
1948 >>> membership.status == TeamMembershipStatus.INVITATION_DECLINED
1949@@ -242,7 +242,7 @@
1950 force_team_add=True to addMember(). We'll use that to add t3 as a member of
1951 t2, thus making all t3 members be considered members of t2 as well.
1952
1953- >>> login_person(t2.teamowner)
1954+ >>> ignored = login_person(t2.teamowner)
1955
1956 # If the reviewer is also an admin of the team being added,
1957 # force_team_add is unnecessary, and we can't prove that that
1958@@ -264,7 +264,7 @@
1959 Passing in force_team_add=True is not necessary if the reviewer is the
1960 admin of the team being added.
1961
1962- >>> login_person(t3.teamowner)
1963+ >>> ignored = login_person(t3.teamowner)
1964 >>> t6.addMember(t3, reviewer=t3.teamowner)
1965 (True, <DBItem TeamMembershipStatus.APPROVED...)
1966 >>> [m.displayname for m in t6.allmembers]
1967@@ -275,7 +275,7 @@
1968 loops.
1969
1970 >>> foobar = personset.getByEmail('foo.bar@canonical.com')
1971- >>> login_person(foobar)
1972+ >>> ignored = login_person(foobar)
1973 >>> t3.addMember(t2, reviewer)
1974 Traceback (most recent call last):
1975 ...
1976@@ -336,7 +336,7 @@
1977 take no actions. One of t5 administrators have to go and remove t2 from t5
1978 if t2 shouldn't be a member of t5 anymore.
1979
1980- >>> login_person(t5.teamowner)
1981+ >>> ignored = login_person(t5.teamowner)
1982 >>> t5.setMembershipData(t2, TeamMembershipStatus.DEACTIVATED, reviewer)
1983
1984 Removing t2 from t5 will have implications in all teams that have t5 as a
1985@@ -364,7 +364,7 @@
1986 If 'Guilherme Salgado' decides to leave t3, he'll also be removed from t1
1987 and t2, but not from t4, because he's a direct member of t4.
1988
1989- >>> login_person(salgado)
1990+ >>> ignored = login_person(salgado)
1991 >>> salgado.leave(t3)
1992 >>> salgado in t1.allmembers
1993 False
1994@@ -412,7 +412,7 @@
1995 rights over it. This ensures we'll never have teams which can't be
1996 managed. This does not imply that the owner will be a member of the team.
1997
1998- >>> login_person(t5.teamowner)
1999+ >>> ignored = login_person(t5.teamowner)
2000 >>> t5.teamowner.leave(t5)
2001 >>> flush_database_updates()
2002 >>> [m.displayname for m in t5.allmembers]
2003@@ -449,7 +449,7 @@
2004
2005 # Foo Bar is a launchpad admin, but even so he can't change a membership's
2006 # status/expiry-date by hand.
2007- >>> login_person(foobar)
2008+ >>> ignored = login_person(foobar)
2009 >>> membership = foobar.team_memberships[0]
2010 >>> membership.status = None
2011 Traceback (most recent call last):
2012@@ -749,7 +749,7 @@
2013
2014 The member himself can't change the expiration date of his membership.
2015
2016- >>> login_person(karl)
2017+ >>> ignored = login_person(karl)
2018 >>> karl_on_mirroradmins.setExpirationDate(tomorrow, karl)
2019 Traceback (most recent call last):
2020 ...
2021@@ -757,7 +757,7 @@
2022
2023 Only a team admin can.
2024
2025- >>> login_person(mirror_admins.teamowner)
2026+ >>> ignored = login_person(mirror_admins.teamowner)
2027 >>> karl_on_mirroradmins.setExpirationDate(
2028 ... tomorrow, mirror_admins.teamowner)
2029 >>> karl_on_mirroradmins.dateexpires == tomorrow
2030@@ -783,7 +783,7 @@
2031 >>> karl_on_mirroradmins.canBeRenewedByMember()
2032 True
2033
2034- >>> login_person(karl)
2035+ >>> ignored = login_person(karl)
2036 >>> karl.renewTeamMembership(mirror_admins)
2037
2038
2039@@ -831,7 +831,7 @@
2040
2041 We can also change the sort order of the results of getMembersByStatus.
2042
2043- >>> login_person(cprov)
2044+ >>> ignored = login_person(cprov)
2045 >>> cprov.leave(t3)
2046 >>> flush_database_updates()
2047
2048@@ -932,7 +932,7 @@
2049 Adding admins as a member of t1 will make Salgado a member of t1 as well.
2050
2051 >>> admins = getUtility(IPersonSet).getByName('admins')
2052- >>> login_person(t1.teamowner)
2053+ >>> ignored = login_person(t1.teamowner)
2054 >>> t1.addMember(admins, reviewer=t1.teamowner, force_team_add=True)
2055 (True, <DBItem TeamMembershipStatus.APPROVED...)
2056 >>> flush_database_updates()
2057@@ -948,7 +948,7 @@
2058 On the other hand, making t3 a member of admins won't change anything
2059 for Salgado.
2060
2061- >>> login_person(foobar)
2062+ >>> ignored = login_person(foobar)
2063 >>> admins.addMember(t3, reviewer=admins.teamowner, force_team_add=True)
2064 (True, <DBItem TeamMembershipStatus.APPROVED...)
2065 >>> flush_database_updates()
2066
2067=== modified file 'lib/lp/registry/doc/vocabularies.txt'
2068--- lib/lp/registry/doc/vocabularies.txt 2012-02-11 04:43:49 +0000
2069+++ lib/lp/registry/doc/vocabularies.txt 2012-04-10 14:04:27 +0000
2070@@ -768,7 +768,7 @@
2071 search for 'team' should give us some of them. Notice that the
2072 PRIVATE_TEAM 'myteam' is not included in the results.
2073
2074- >>> login_person(sample_person)
2075+ >>> ignored = login_person(sample_person)
2076 >>> ephemeral = factory.makeTeam(owner=foo_bar, name='ephemeral-team')
2077 >>> sorted(person.name for person in vocab.search('team'))
2078 [u'ephemeral-team', u'hwdb-team', u'name18', u'name20', u'name21',
2079@@ -779,11 +779,11 @@
2080 Valid teams do not include teams that have been merged.
2081
2082 >>> from lp.app.interfaces.launchpad import ILaunchpadCelebrities
2083- >>> login_person(foo_bar)
2084+ >>> ignored = login_person(foo_bar)
2085 >>> registry_experts = getUtility(ILaunchpadCelebrities).registry_experts
2086 >>> person_set.merge(
2087 ... ephemeral, registry_experts, reviewer=ephemeral.teamowner)
2088- >>> login_person(sample_person)
2089+ >>> ignored = login_person(sample_person)
2090 >>> sorted(person.name for person in vocab.search('team'))
2091 [u'hwdb-team', u'name18', u'name20', u'name21',
2092 u'no-team-memberships', u'otherteam', u'simple-team',
2093@@ -1172,7 +1172,7 @@
2094 >>> login('mark@example.com')
2095 >>> product_set['firefox'].setAliases(['iceweasel'])
2096 >>> current_user = launchbag.user
2097- >>> login_person(current_user)
2098+ >>> ignored = login_person(current_user)
2099 >>> vocab.getTermByToken('iceweasel').token
2100 'firefox'
2101
2102@@ -1240,7 +1240,7 @@
2103 ... IDistributionSet)
2104 >>> login('mark@example.com')
2105 >>> getUtility(IDistributionSet)['ubuntu'].setAliases(['ubantoo'])
2106- >>> login_person(current_user)
2107+ >>> ignored = login_person(current_user)
2108 >>> vocab.getTermByToken('ubantoo').token
2109 'ubuntu'
2110
2111
2112=== modified file 'lib/lp/registry/interfaces/person.py'
2113--- lib/lp/registry/interfaces/person.py 2012-03-26 16:09:50 +0000
2114+++ lib/lp/registry/interfaces/person.py 2012-04-10 14:04:27 +0000
2115@@ -1491,7 +1491,7 @@
2116 @export_factory_operation(Interface, []) # Really IArchive.
2117 @operation_for_version("beta")
2118 def createPPA(name=None, displayname=None, description=None,
2119- private=False):
2120+ private=False, commercial=False):
2121 """Create a PPA.
2122
2123 :param name: A string with the name of the new PPA to create. If
2124
2125=== modified file 'lib/lp/registry/model/person.py'
2126--- lib/lp/registry/model/person.py 2012-04-05 13:05:04 +0000
2127+++ lib/lp/registry/model/person.py 2012-04-10 14:04:27 +0000
2128@@ -2965,16 +2965,22 @@
2129 return getUtility(IArchiveSet).getPPAOwnedByPerson(self, name)
2130
2131 def createPPA(self, name=None, displayname=None, description=None,
2132- private=False):
2133+ private=False, commercial=False):
2134 """See `IPerson`."""
2135- errors = Archive.validatePPA(self, name, private)
2136+ # XXX: We pass through the Person on whom the PPA is being created,
2137+ # but validatePPA assumes that that Person is also the one creating
2138+ # the PPA. This is not true in general, and particularly not for
2139+ # teams. Instead, both the acting user and the target of the PPA
2140+ # creation ought to be passed through.
2141+ errors = Archive.validatePPA(self, name, private, commercial)
2142 if errors:
2143- raise PPACreationError(errors)
2144+ raise PPACreationError(errors)
2145 ubuntu = getUtility(ILaunchpadCelebrities).ubuntu
2146 return getUtility(IArchiveSet).new(
2147 owner=self, purpose=ArchivePurpose.PPA,
2148 distribution=ubuntu, name=name, displayname=displayname,
2149- description=description, private=private)
2150+ description=description, private=private,
2151+ commercial=commercial)
2152
2153 def isBugContributor(self, user=None):
2154 """See `IPerson`."""
2155
2156=== modified file 'lib/lp/registry/stories/product/xx-product-index.txt'
2157--- lib/lp/registry/stories/product/xx-product-index.txt 2012-03-14 12:07:58 +0000
2158+++ lib/lp/registry/stories/product/xx-product-index.txt 2012-04-10 14:04:27 +0000
2159@@ -192,7 +192,7 @@
2160 much time left on its commercial subscription, a portlet is displayed to
2161 direct the owner to purchase a subscription.
2162
2163- >>> login_person(firefox.owner)
2164+ >>> ignored = login_person(firefox.owner)
2165 >>> firefox.licenses = [License.OTHER_PROPRIETARY]
2166 >>> flush_database_updates()
2167 >>> transaction.commit()
2168
2169=== modified file 'lib/lp/registry/stories/teammembership/private-team.txt'
2170--- lib/lp/registry/stories/teammembership/private-team.txt 2012-01-15 11:06:57 +0000
2171+++ lib/lp/registry/stories/teammembership/private-team.txt 2012-04-10 14:04:27 +0000
2172@@ -16,7 +16,7 @@
2173 ... visibility=PersonVisibility.PRIVATE)
2174 >>> person_set = getUtility(IPersonSet)
2175 >>> cprov = person_set.getByName('cprov')
2176- >>> login_person(owner)
2177+ >>> ignored = login_person(owner)
2178 >>> ignored = priv_team.addMember(cprov, reviewer=owner)
2179 >>> logout()
2180
2181
2182=== modified file 'lib/lp/registry/stories/webservice/xx-private-team.txt'
2183--- lib/lp/registry/stories/webservice/xx-private-team.txt 2012-02-13 23:02:42 +0000
2184+++ lib/lp/registry/stories/webservice/xx-private-team.txt 2012-04-10 14:04:27 +0000
2185@@ -10,7 +10,7 @@
2186 >>> login('test@canonical.com')
2187 >>> from lp.registry.interfaces.person import PersonVisibility
2188 >>> team_owner = factory.makePerson(name="private-team-owner")
2189- >>> login_person(team_owner)
2190+ >>> ignored = login_person(team_owner)
2191 >>> member1 = factory.makePerson(name='member-one')
2192 >>> private_team = factory.makeTeam(
2193 ... owner=team_owner,
2194
2195=== modified file 'lib/lp/registry/tests/bug-249185.txt'
2196--- lib/lp/registry/tests/bug-249185.txt 2009-12-24 01:41:54 +0000
2197+++ lib/lp/registry/tests/bug-249185.txt 2012-04-10 14:04:27 +0000
2198@@ -7,7 +7,7 @@
2199 >>> devs = factory.makeTeam(person)
2200 >>> adjutants = factory.makeTeam(person)
2201
2202- >>> login_person(person)
2203+ >>> ignored = login_person(person)
2204 >>> dev1 = factory.makePerson()
2205 >>> ignored = devs.addMember(dev1, person)
2206
2207
2208=== modified file 'lib/lp/services/identity/doc/emailaddress.txt'
2209--- lib/lp/services/identity/doc/emailaddress.txt 2012-01-05 00:23:45 +0000
2210+++ lib/lp/services/identity/doc/emailaddress.txt 2012-04-10 14:04:27 +0000
2211@@ -12,7 +12,7 @@
2212
2213 We can get an email address through IEmailAddressSet.getByEmail().
2214
2215- >>> login_person(person)
2216+ >>> ignored = login_person(person)
2217 >>> email = emailset.getByEmail(person.preferredemail.email)
2218 >>> email == person.preferredemail
2219 True
2220@@ -78,7 +78,7 @@
2221 Email addresses may be deleted if they're not a person's preferred one
2222 or the address of a team's mailing list.
2223
2224- >>> login_person(foobar)
2225+ >>> ignored = login_person(foobar)
2226 >>> emailaddress = emailset.getByEmail('oink@canonical.com')
2227 >>> emailaddress.destroySelf()
2228 >>> print emailset.getByEmail('oink@canonical.com')
2229
2230=== modified file 'lib/lp/services/mail/doc/notification-recipient-set.txt'
2231--- lib/lp/services/mail/doc/notification-recipient-set.txt 2011-12-24 17:49:30 +0000
2232+++ lib/lp/services/mail/doc/notification-recipient-set.txt 2012-04-10 14:04:27 +0000
2233@@ -134,7 +134,7 @@
2234 person:
2235
2236 >>> ubuntu_team = person_set.getByName('ubuntu-team')
2237- >>> login_person(ubuntu_team.teamowner)
2238+ >>> ignored = login_person(ubuntu_team.teamowner)
2239 >>> print ubuntu_team.preferredemail.email
2240 support@ubuntu.com
2241
2242
2243=== modified file 'lib/lp/services/webapp/doc/launchbag.txt'
2244--- lib/lp/services/webapp/doc/launchbag.txt 2011-12-24 17:49:30 +0000
2245+++ lib/lp/services/webapp/doc/launchbag.txt 2012-04-10 14:04:27 +0000
2246@@ -79,7 +79,7 @@
2247 >>> from lp.testing.factory import LaunchpadObjectFactory
2248 >>> factory = LaunchpadObjectFactory()
2249 >>> person = factory.makePerson()
2250- >>> login_person(person)
2251+ >>> ignored = login_person(person)
2252 >>> launchbag.time_zone
2253 <UTC>
2254
2255
2256=== modified file 'lib/lp/soyuz/doc/archive-deletion.txt'
2257--- lib/lp/soyuz/doc/archive-deletion.txt 2010-08-24 15:29:01 +0000
2258+++ lib/lp/soyuz/doc/archive-deletion.txt 2012-04-10 14:04:27 +0000
2259@@ -44,7 +44,7 @@
2260 some random dude is refused:
2261
2262 >>> person = factory.makePerson(name="duderino")
2263- >>> login_person(person)
2264+ >>> ignored = login_person(person)
2265 >>> archive.delete(person)
2266 Traceback (most recent call last):
2267 ...
2268@@ -52,7 +52,7 @@
2269
2270 However we can delete it using the owner of the archive:
2271
2272- >>> login_person(archive.owner)
2273+ >>> ignored = login_person(archive.owner)
2274 >>> archive.delete(archive.owner)
2275
2276 The deletion code uses a store.execute() command to speed up the operation
2277
2278=== modified file 'lib/lp/soyuz/doc/archive.txt'
2279--- lib/lp/soyuz/doc/archive.txt 2012-02-28 11:14:44 +0000
2280+++ lib/lp/soyuz/doc/archive.txt 2012-04-10 14:04:27 +0000
2281@@ -1041,7 +1041,7 @@
2282 >>> print_dependencies(no_priv.archive)
2283 No dependencies recorded.
2284
2285- >>> login_person(no_priv)
2286+ >>> ignored = login_person(no_priv)
2287 >>> archive_dependency = no_priv.archive.addArchiveDependency(
2288 ... cprov.archive, release_pocket, main_component)
2289
2290@@ -1518,7 +1518,7 @@
2291
2292 >>> ppa_owner = factory.makePerson(
2293 ... name="ppa-owner", displayname="PPA Owner")
2294- >>> login_person(ppa_owner)
2295+ >>> ignored = login_person(ppa_owner)
2296
2297 If no PPAs match the search criteria, and a name is not given, then
2298 None is returned.
2299@@ -2105,7 +2105,7 @@
2300 >>> check_permission('launchpad.Append', joes_ppa)
2301 False
2302
2303- >>> login_person(joes_ppa.owner)
2304+ >>> ignored = login_person(joes_ppa.owner)
2305 >>> check_permission('launchpad.Append', joes_ppa)
2306 False
2307
2308
2309=== modified file 'lib/lp/soyuz/doc/archiveauthtoken.txt'
2310--- lib/lp/soyuz/doc/archiveauthtoken.txt 2012-01-15 13:32:27 +0000
2311+++ lib/lp/soyuz/doc/archiveauthtoken.txt 2012-04-10 14:04:27 +0000
2312@@ -32,7 +32,7 @@
2313
2314 Create a subscription for Team Brad to joe's archive:
2315
2316- >>> login_person(joe)
2317+ >>> ignored = login_person(joe)
2318 >>> subscription_to_joe_private_ppa = joe_private_ppa.newSubscription(
2319 ... teambrad, joe)
2320 >>> login("brad@example.com")
2321@@ -64,7 +64,7 @@
2322
2323 So deactivate the old token so that we can create a new token:
2324
2325- >>> login_person(bradsmith)
2326+ >>> ignored = login_person(bradsmith)
2327 >>> token_with_random_string.deactivate()
2328 >>> login("brad@example.com")
2329
2330@@ -158,7 +158,7 @@
2331 ...
2332 Unauthorized:...
2333
2334- >>> login_person(joe)
2335+ >>> ignored = login_person(joe)
2336 >>> new_token.deactivate()
2337
2338 Deactivating sets the date_deactivated value.
2339
2340=== modified file 'lib/lp/soyuz/doc/gina-multiple-arch.txt'
2341--- lib/lp/soyuz/doc/gina-multiple-arch.txt 2011-12-18 13:45:20 +0000
2342+++ lib/lp/soyuz/doc/gina-multiple-arch.txt 2012-04-10 14:04:27 +0000
2343@@ -36,7 +36,7 @@
2344 >>> hoary = ubuntu.getSeries("hoary")
2345
2346 # Only the distro owner or admins can create a series.
2347- >>> login_person(ubuntu.owner.activemembers[0])
2348+ >>> ignored = login_person(ubuntu.owner.activemembers[0])
2349 >>> dapper = ubuntu.newSeries("dapper", "Dapper Dragoon", "My title",
2350 ... "My summary", "My description", "5.10",
2351 ... hoary, celebs.launchpad_developers)
2352
2353=== modified file 'lib/lp/soyuz/doc/gina.txt'
2354--- lib/lp/soyuz/doc/gina.txt 2012-01-05 13:03:31 +0000
2355+++ lib/lp/soyuz/doc/gina.txt 2012-04-10 14:04:27 +0000
2356@@ -44,7 +44,7 @@
2357 >>> hoary = ubuntu.getSeries("hoary")
2358
2359 # Only the distro owner and admins can create a new series.
2360- >>> login_person(ubuntu.owner.activemembers[0])
2361+ >>> ignored = login_person(ubuntu.owner.activemembers[0])
2362 >>> breezy = ubuntu.newSeries(
2363 ... "breezy", "Breezy Badger", "My title",
2364 ... "My summary", "My description", "5.10",
2365
2366=== modified file 'lib/lp/soyuz/doc/packageset.txt'
2367--- lib/lp/soyuz/doc/packageset.txt 2011-12-24 17:49:30 +0000
2368+++ lib/lp/soyuz/doc/packageset.txt 2012-04-10 14:04:27 +0000
2369@@ -597,7 +597,7 @@
2370 >>> ignored = techboard.addMember(
2371 ... person2, reviewer=person2, status=TeamMembershipStatus.APPROVED,
2372 ... force_team_add=True)
2373- >>> login_person(person2)
2374+ >>> ignored = login_person(person2)
2375
2376 Create a new package set.
2377
2378
2379=== modified file 'lib/lp/soyuz/doc/publishing-security.txt'
2380--- lib/lp/soyuz/doc/publishing-security.txt 2011-12-18 17:44:02 +0000
2381+++ lib/lp/soyuz/doc/publishing-security.txt 2012-04-10 14:04:27 +0000
2382@@ -70,7 +70,7 @@
2383
2384 But the owner can see them.
2385
2386- >>> login_person(private_ppa.owner)
2387+ >>> ignored = login_person(private_ppa.owner)
2388 >>> print public_ppa.getPublishedSources().first().displayname
2389 foo 666 in breezy-autotest
2390
2391
2392=== modified file 'lib/lp/soyuz/interfaces/archive.py'
2393--- lib/lp/soyuz/interfaces/archive.py 2012-02-28 05:09:39 +0000
2394+++ lib/lp/soyuz/interfaces/archive.py 2012-04-10 14:04:27 +0000
2395@@ -1742,7 +1742,7 @@
2396
2397 def new(purpose, owner, name=None, displayname=None, distribution=None,
2398 description=None, enabled=True, require_virtualized=True,
2399- private=False):
2400+ private=False, commercial=False):
2401 """Create a new archive.
2402
2403 On named-ppa creation, the signing key for the default PPA for the
2404
2405=== modified file 'lib/lp/soyuz/model/archive.py'
2406--- lib/lp/soyuz/model/archive.py 2012-01-18 14:30:52 +0000
2407+++ lib/lp/soyuz/model/archive.py 2012-04-10 14:04:27 +0000
2408@@ -65,7 +65,10 @@
2409 validate_person,
2410 )
2411 from lp.registry.interfaces.pocket import PackagePublishingPocket
2412-from lp.registry.interfaces.role import IHasOwner
2413+from lp.registry.interfaces.role import (
2414+ IHasOwner,
2415+ IPersonRoles,
2416+ )
2417 from lp.registry.interfaces.sourcepackagename import ISourcePackageNameSet
2418 from lp.registry.model.sourcepackagename import SourcePackageName
2419 from lp.registry.model.teammembership import TeamParticipation
2420@@ -1974,18 +1977,24 @@
2421 self.enabled_restricted_families = restricted
2422
2423 @classmethod
2424- def validatePPA(self, person, proposed_name, private=False):
2425+ def validatePPA(self, person, proposed_name, private=False,
2426+ commercial=False):
2427 ubuntu = getUtility(ILaunchpadCelebrities).ubuntu
2428- if private:
2429+ if private or commercial:
2430 # NOTE: This duplicates the policy in lp/soyuz/configure.zcml
2431 # which says that one needs 'launchpad.Commercial' permission to
2432 # set 'private', and the logic in `AdminByCommercialTeamOrAdmins`
2433 # which determines who is granted launchpad.Commercial
2434 # permissions.
2435- commercial = getUtility(ILaunchpadCelebrities).commercial_admin
2436- admin = getUtility(ILaunchpadCelebrities).admin
2437- if not person.inTeam(commercial) and not person.inTeam(admin):
2438- return '%s is not allowed to make private PPAs' % person.name
2439+ role = IPersonRoles(person)
2440+ if not (role.in_admin or role.in_commercial_admin):
2441+ if private:
2442+ return (
2443+ '%s is not allowed to make private PPAs' % person.name)
2444+ if commercial:
2445+ return (
2446+ '%s is not allowed to make commercial PPAs'
2447+ % person.name)
2448 if person.is_team and (
2449 person.subscriptionpolicy in OPEN_TEAM_POLICY):
2450 return "Open teams cannot have PPAs."
2451@@ -2120,7 +2129,7 @@
2452
2453 def new(self, purpose, owner, name=None, displayname=None,
2454 distribution=None, description=None, enabled=True,
2455- require_virtualized=True, private=False):
2456+ require_virtualized=True, private=False, commercial=False):
2457 """See `IArchiveSet`."""
2458 if distribution is None:
2459 distribution = getUtility(ILaunchpadCelebrities).ubuntu
2460@@ -2197,6 +2206,8 @@
2461 else:
2462 new_archive.private = private
2463
2464+ new_archive.commercial = commercial
2465+
2466 return new_archive
2467
2468 def __iter__(self):
2469
2470=== modified file 'lib/lp/soyuz/stories/ppa/xx-ppa-files.txt'
2471--- lib/lp/soyuz/stories/ppa/xx-ppa-files.txt 2012-03-27 13:38:04 +0000
2472+++ lib/lp/soyuz/stories/ppa/xx-ppa-files.txt 2012-04-10 14:04:27 +0000
2473@@ -265,7 +265,7 @@
2474 proxy redirects to the public http url. We'll copy the test sources and
2475 binaries across to no-priv's public ppa.
2476
2477- >>> login_person(no_priv)
2478+ >>> ignored = login_person(no_priv)
2479 >>> from lp.soyuz.interfaces.publishing import PackagePublishingPocket
2480 >>> from lp.soyuz.scripts.packagecopier import do_copy
2481 >>> copies = do_copy(
2482
2483=== modified file 'lib/lp/soyuz/tests/test_person_createppa.py'
2484--- lib/lp/soyuz/tests/test_person_createppa.py 2012-01-01 02:58:52 +0000
2485+++ lib/lp/soyuz/tests/test_person_createppa.py 2012-04-10 14:04:27 +0000
2486@@ -5,7 +5,12 @@
2487
2488 __metaclass__ = type
2489
2490-from lp.testing import TestCaseWithFactory
2491+from lp.registry.errors import PPACreationError
2492+from lp.testing import (
2493+ celebrity_logged_in,
2494+ person_logged_in,
2495+ TestCaseWithFactory,
2496+ )
2497 from lp.testing.layers import DatabaseFunctionalLayer
2498
2499
2500@@ -14,7 +19,29 @@
2501
2502 layer = DatabaseFunctionalLayer
2503
2504- def test_create_ppa(self):
2505+ def test_default_name(self):
2506 person = self.factory.makePerson()
2507 ppa = person.createPPA()
2508 self.assertEqual(ppa.name, 'ppa')
2509+
2510+ def test_private(self):
2511+ with celebrity_logged_in('commercial_admin') as person:
2512+ ppa = person.createPPA(private=True)
2513+ self.assertEqual(True, ppa.private)
2514+
2515+ def test_private_without_permission(self):
2516+ person = self.factory.makePerson()
2517+ with person_logged_in(person):
2518+ self.assertRaises(
2519+ PPACreationError, person.createPPA, private=True)
2520+
2521+ def test_commercial(self):
2522+ with celebrity_logged_in('commercial_admin') as person:
2523+ ppa = person.createPPA(commercial=True)
2524+ self.assertEqual(True, ppa.commercial)
2525+
2526+ def test_commercial_without_permission(self):
2527+ person = self.factory.makePerson()
2528+ with person_logged_in(person):
2529+ self.assertRaises(
2530+ PPACreationError, person.createPPA, commercial=True)
2531
2532=== modified file 'lib/lp/testing/_login.py'
2533--- lib/lp/testing/_login.py 2012-02-02 13:49:33 +0000
2534+++ lib/lp/testing/_login.py 2012-04-10 14:04:27 +0000
2535@@ -84,6 +84,7 @@
2536 raise ValueError("Got team, expected person: %r" % (person,))
2537 participation = _test_login_impl(participation)
2538 setupInteractionForPerson(person, participation)
2539+ return person
2540
2541
2542 def login_team(team, participation=None):
2543@@ -140,9 +141,9 @@
2544 def _with_login(login_method, identifier):
2545 """Make a context manager that runs with a particular log in."""
2546 interaction = queryInteraction()
2547- login_method(identifier)
2548+ person = login_method(identifier)
2549 try:
2550- yield
2551+ yield person
2552 finally:
2553 if interaction is None:
2554 logout()
2555
2556=== modified file 'lib/lp/testing/tests/test_login.py'
2557--- lib/lp/testing/tests/test_login.py 2012-01-03 11:51:30 +0000
2558+++ lib/lp/testing/tests/test_login.py 2012-04-10 14:04:27 +0000
2559@@ -240,6 +240,14 @@
2560 person = self.getLoggedInPerson()
2561 self.assertTrue(person.inTeam(team))
2562
2563+ def test_team_logged_in_provides_person(self):
2564+ # person_logged_in makes the logged-in person available through
2565+ # the context manager.
2566+ team = self.factory.makeTeam()
2567+ with person_logged_in(team) as p:
2568+ person = self.getLoggedInPerson()
2569+ self.assertEqual(p, person)
2570+
2571 def test_celebrity_logged_in(self):
2572 # celebrity_logged_in runs in a context where a celebrity is logged
2573 # in.
2574@@ -248,6 +256,12 @@
2575 person = self.getLoggedInPerson()
2576 self.assertTrue(person.inTeam(vcs_imports))
2577
2578+ def test_celebrity_logged_in_provides_person(self):
2579+ vcs_imports = getUtility(ILaunchpadCelebrities).vcs_imports
2580+ with celebrity_logged_in('vcs_imports') as p:
2581+ person = self.getLoggedInPerson()
2582+ self.assertEqual(p, person)
2583+
2584 def test_celebrity_logged_in_restores_person(self):
2585 # Once outside of the celebrity_logged_in context, the originally
2586 # logged-in person is re-logged in.
2587
2588=== modified file 'lib/lp/translations/browser/tests/distroseries-views.txt'
2589--- lib/lp/translations/browser/tests/distroseries-views.txt 2011-12-24 17:49:30 +0000
2590+++ lib/lp/translations/browser/tests/distroseries-views.txt 2012-04-10 14:04:27 +0000
2591@@ -83,7 +83,7 @@
2592 >>> membership = getUtility(ITeamMembershipSet).new(
2593 ... expert, expert_team, TeamMembershipStatus.APPROVED,
2594 ... expert_team)
2595- >>> login_person(expert)
2596+ >>> ignored = login_person(expert)
2597 >>> check_effect_of_hiding(hoary)
2598 User can access revealed translations.
2599 User can access hidden translations.
2600
2601=== modified file 'lib/lp/translations/browser/tests/language-views.txt'
2602--- lib/lp/translations/browser/tests/language-views.txt 2010-12-10 10:53:44 +0000
2603+++ lib/lp/translations/browser/tests/language-views.txt 2012-04-10 14:04:27 +0000
2604@@ -207,7 +207,7 @@
2605 >>> person = factory.makePerson()
2606 >>> print person.languages
2607 []
2608- >>> login_person(person)
2609+ >>> ignored = login_person(person)
2610 >>> languageset_view = create_initialized_view(language_set, '+index',
2611 ... layer=TranslationsLayer)
2612 >>> print languageset_view.user_languages