Merge lp:~jcsackett/launchpad/registry-errors-649836 into lp:launchpad

Proposed by j.c.sackett
Status: Merged
Approved by: j.c.sackett
Approved revision: no longer in the source branch.
Merged at revision: 11673
Proposed branch: lp:~jcsackett/launchpad/registry-errors-649836
Merge into: lp:launchpad
Diff against target: 1061 lines (+183/-178)
28 files modified
lib/canonical/launchpad/interfaces/__init__.py (+0/-1)
lib/canonical/launchpad/testing/pages.py (+2/-2)
lib/lp/code/model/branchlookup.py (+4/-2)
lib/lp/code/model/branchnamespace.py (+7/-9)
lib/lp/code/model/linkedbranch.py (+1/-1)
lib/lp/code/model/tests/test_branchlookup.py (+4/-2)
lib/lp/code/model/tests/test_branchnamespace.py (+4/-2)
lib/lp/code/model/tests/test_linkedbranch.py (+1/-1)
lib/lp/code/xmlrpc/branch.py (+4/-2)
lib/lp/registry/configure.zcml (+7/-0)
lib/lp/registry/errors.py (+97/-1)
lib/lp/registry/interfaces/distributionmirror.py (+6/-49)
lib/lp/registry/interfaces/distroseries.py (+1/-9)
lib/lp/registry/interfaces/person.py (+3/-21)
lib/lp/registry/interfaces/sourcepackagename.py (+2/-10)
lib/lp/registry/interfaces/structuralsubscription.py (+0/-16)
lib/lp/registry/interfaces/teammembership.py (+0/-12)
lib/lp/registry/model/distribution.py (+1/-2)
lib/lp/registry/model/distributionmirror.py (+10/-9)
lib/lp/registry/model/person.py (+2/-2)
lib/lp/registry/model/sourcepackagename.py (+3/-4)
lib/lp/registry/model/structuralsubscription.py (+4/-2)
lib/lp/registry/model/teammembership.py (+4/-2)
lib/lp/registry/tests/test_distribution.py (+1/-1)
lib/lp/registry/tests/test_distroseries.py (+4/-10)
lib/lp/registry/tests/test_person.py (+5/-3)
lib/lp/registry/tests/test_structuralsubscriptiontarget.py (+4/-2)
lib/lp/registry/tests/test_team_webservice.py (+2/-1)
To merge this branch: bzr merge lp:~jcsackett/launchpad/registry-errors-649836
Reviewer Review Type Date Requested Status
Edwin Grubbs (community) code Approve
Review via email: mp+36994@code.launchpad.net

Commit message

Creates an lp.registry.errors module to collect and register exceptions used by the webservice.

Description of the change

Summary
=======

Cleans up the webservice exceptions in registry by moving them all to lp.registry.errors and registering that module with the webservice. This helps our ongoing efforts to get away from circular import problems and start moving things out of canonical.launchpad.interfaces

Proposed Fix
============

Create an lp.registry.errors module and move all exceptions with the webservice_error directive in them to this module. Register the new module in lp/registry/configure.zcml so they're not part of the mess in canonical/launchpad.

Pre-Implementation Talk
=======================

Spoke with Curtis Hovey about restricting the scope of the branch since there's substantially more we'll want to move into errors over time.

Implementation details
======================

As in proposed.

Tests
=====

bin/test -m lp.registry
bin/test -t webservice

Demo and Q/A
============

This is largely not demo-able; everything over the webservice should continue to work largely as it has, with the exception of a few changed error codes. (400 -> more specific errors)

Lint
====

make lint output:

= Launchpad lint =

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/canonical/launchpad/testing/pages.py
  lib/lp/code/model/branchnamespace.py
  lib/lp/registry/errors.py
  lib/lp/registry/interfaces/distributionmirror.py
  lib/lp/registry/interfaces/person.py
  lib/lp/registry/interfaces/sourcepackagename.py
  lib/lp/registry/interfaces/teammembership.py
  lib/lp/registry/model/distribution.py
  lib/lp/registry/model/distributionmirror.py
  lib/lp/registry/model/person.py
  lib/lp/registry/model/sourcepackagename.py

./lib/canonical/launchpad/testing/pages.py
     460: E302 expected 2 blank lines, found 1
      96: Line contains a call to pdb.
./lib/lp/code/model/branchnamespace.py
     541: E301 expected 1 blank line, found 0
./lib/lp/registry/interfaces/distributionmirror.py
     163: Line exceeds 78 characters.
     169: Line exceeds 78 characters.
./lib/lp/registry/interfaces/person.py
     494: E302 expected 2 blank lines, found 1
./lib/lp/registry/model/distribution.py
    1254: E231 missing whitespace after ','
    1260: E231 missing whitespace after ','
    1272: E231 missing whitespace after ','
    1258: Line exceeds 78 characters.
./lib/lp/registry/model/distributionmirror.py
     589: E501 line too long (80 characters)
     455: Line exceeds 78 characters.
     473: Line exceeds 78 characters.
     589: Line exceeds 78 characters.
     807: Line exceeds 78 characters.
     860: Line exceeds 78 characters.
./lib/lp/registry/model/sourcepackagename.py
     148: W601 .has_key() is deprecated, use 'in'

This has touched so many files the lint output is all over the place; everything that's left is either lint complaining about valid things (e.g. commas in 1-tuples) or something I'm not sure should be altered. I have fixed everything that seems to related to my changes.

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

Hi JC,

Thanks for doing this boring refactoring work. I just have a couple of minor comments below.

-Edwin

>=== modified file 'lib/lp/registry/interfaces/distroseries.py'
>--- lib/lp/registry/interfaces/distroseries.py 2010-09-21 13:05:42 +0000
>+++ lib/lp/registry/interfaces/distroseries.py 2010-09-29 17:42:02 +0000
>@@ -12,7 +12,6 @@
> 'IDistroSeriesEditRestricted',
> 'IDistroSeriesPublic',
> 'IDistroSeriesSet',
>- 'NoSuchDistroSeries',
> ]
>
> from lazr.enum import DBEnumeratedType
>@@ -26,7 +25,6 @@
> operation_returns_collection_of,
> operation_returns_entry,
> rename_parameters_as,
>- webservice_error,
> )
> from lazr.restful.fields import (
> Reference,
>@@ -51,7 +49,6 @@
> from canonical.launchpad.validators.email import email_validator
> from canonical.launchpad.validators.name import name_validator
> from canonical.launchpad.validators.version import sane_version
>-from lp.app.errors import NameLookupFailed
> from lp.app.interfaces.launchpad import IServiceUsage
> from lp.blueprints.interfaces.specificationtarget import ISpecificationGoal
> from lp.bugs.interfaces.bugtarget import (
>@@ -59,6 +56,7 @@
> IHasBugs,
> IHasOfficialBugTags,
> )
>+from lp.registry.errors import NoSuchDistroSeries

It looks like we could use a separate file for special form fields,
since DistroSeriesNameField needs NoSuchDistroSeries, but we lose the
benefit of moving that exception to lp.registry.errors, if we are just
going to import it. Can you open a bug for that?

> from lp.registry.interfaces.milestone import (
> IHasMilestones,
> IMilestone,
>@@ -858,11 +856,5 @@
> """
>
>
>-class NoSuchDistroSeries(NameLookupFailed):
>- """Raised when we try to find a DistroSeries that doesn't exist."""
>- webservice_error(400) #Bad request.
>- _message_prefix = "No such distribution series"
>-
>-
> # Monkey patch for circular import avoidance done in
> # _schema_circular_imports.py
>
>=== modified file 'lib/lp/registry/interfaces/person.py'
>--- lib/lp/registry/interfaces/person.py 2010-09-24 21:10:47 +0000
>+++ lib/lp/registry/interfaces/person.py 2010-09-29 17:42:02 +0000
>@@ -65,9 +61,7 @@
> operation_returns_entry,
> rename_parameters_as,
> REQUEST_USER,
>- webservice_error,
> )
>-from lazr.restful.error import expose
> from lazr.restful.fields import (
> CollectionField,
> Reference,
>@@ -121,6 +115,9 @@
> IHasRequestedReviews,
> )
> from lp.code.interfaces.hasrecipes import IHasRecipes
>+from lp.registry.errors import (
>+ PrivatePersonLinkageError,
>+ )

Can you run utilities/format-imports on all the files you touched
in this branch? This import will fit on a single line.

> from lp.registry.interfaces.gpg import IGPGKey
> from lp.registry.interfaces.irc import IIrcID
> from lp.registry.interfaces.jabber import IJabberID

review: Approve (code)
Revision history for this message
j.c.sackett (jcsackett) wrote :

>> @@ -59,6 +56,7 @@
>> IHasBugs,
>> IHasOfficialBugTags,
>> )
>> +from lp.registry.errors import NoSuchDistroSeries
>
>
>
> It looks like we could use a separate file for special form fields,
> since DistroSeriesNameField needs NoSuchDistroSeries, but we lose the
> benefit of moving that exception to lp.registry.errors, if we are just
> going to import it. Can you open a bug for that?

I can and will.

>> from lp.code.interfaces.hasrecipes import IHasRecipes
>> +from lp.registry.errors import (
>> + PrivatePersonLinkageError,
>> + )
>
>
> Can you run utilities/format-imports on all the files you touched
> in this branch? This import will fit on a single line.

Done.

Thanks for the review, Edwin.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/canonical/launchpad/interfaces/__init__.py'
--- lib/canonical/launchpad/interfaces/__init__.py 2010-09-28 15:20:09 +0000
+++ lib/canonical/launchpad/interfaces/__init__.py 2010-10-04 12:14:48 +0000
@@ -96,7 +96,6 @@
96from canonical.launchpad.interfaces.packagerelationship import *96from canonical.launchpad.interfaces.packagerelationship import *
97from canonical.launchpad.interfaces.pathlookup import *97from canonical.launchpad.interfaces.pathlookup import *
98from lp.registry.interfaces.poll import *98from lp.registry.interfaces.poll import *
99from lp.registry.errors import TeamMembershipTransitionError
100from lp.soyuz.interfaces.processor import *99from lp.soyuz.interfaces.processor import *
101from lp.registry.interfaces.product import *100from lp.registry.interfaces.product import *
102from lp.registry.interfaces.productlicense import *101from lp.registry.interfaces.productlicense import *
103102
=== modified file 'lib/canonical/launchpad/testing/pages.py'
--- lib/canonical/launchpad/testing/pages.py 2010-08-20 20:31:18 +0000
+++ lib/canonical/launchpad/testing/pages.py 2010-10-04 12:14:48 +0000
@@ -63,7 +63,7 @@
63from canonical.launchpad.webapp.interfaces import OAuthPermission63from canonical.launchpad.webapp.interfaces import OAuthPermission
64from canonical.launchpad.webapp.url import urlsplit64from canonical.launchpad.webapp.url import urlsplit
65from canonical.testing import PageTestLayer65from canonical.testing import PageTestLayer
66from lp.registry.interfaces.person import NameAlreadyTaken66from lp.registry.errors import NameAlreadyTaken
67from lp.testing import (67from lp.testing import (
68 ANONYMOUS,68 ANONYMOUS,
69 launchpadlib_for,69 launchpadlib_for,
@@ -329,7 +329,7 @@
329 ( ) An unchecked option329 ( ) An unchecked option
330 """330 """
331 main = BeautifulSoup(content)331 main = BeautifulSoup(content)
332 buttons = main.findAll(332 buttons = main.findAll(
333 'input', {'name': 'field.%s' % name})333 'input', {'name': 'field.%s' % name})
334 for button in buttons:334 for button in buttons:
335 if button.parent.name == 'label':335 if button.parent.name == 'label':
336336
=== modified file 'lib/lp/code/model/branchlookup.py'
--- lib/lp/code/model/branchlookup.py 2010-08-20 20:31:18 +0000
+++ lib/lp/code/model/branchlookup.py 2010-10-04 12:14:48 +0000
@@ -48,11 +48,14 @@
48from lp.code.interfaces.branchnamespace import IBranchNamespaceSet48from lp.code.interfaces.branchnamespace import IBranchNamespaceSet
49from lp.code.interfaces.linkedbranch import get_linked_to_branch49from lp.code.interfaces.linkedbranch import get_linked_to_branch
50from lp.code.model.branch import Branch50from lp.code.model.branch import Branch
51from lp.registry.errors import (
52 NoSuchDistroSeries,
53 NoSuchSourcePackageName,
54 )
51from lp.registry.interfaces.distribution import IDistribution55from lp.registry.interfaces.distribution import IDistribution
52from lp.registry.interfaces.distroseries import (56from lp.registry.interfaces.distroseries import (
53 IDistroSeries,57 IDistroSeries,
54 IDistroSeriesSet,58 IDistroSeriesSet,
55 NoSuchDistroSeries,
56 )59 )
57from lp.registry.interfaces.person import NoSuchPerson60from lp.registry.interfaces.person import NoSuchPerson
58from lp.registry.interfaces.pillar import IPillarNameSet61from lp.registry.interfaces.pillar import IPillarNameSet
@@ -62,7 +65,6 @@
62 NoSuchProduct,65 NoSuchProduct,
63 )66 )
64from lp.registry.interfaces.productseries import NoSuchProductSeries67from lp.registry.interfaces.productseries import NoSuchProductSeries
65from lp.registry.interfaces.sourcepackagename import NoSuchSourcePackageName
66from lp.registry.model.distribution import Distribution68from lp.registry.model.distribution import Distribution
67from lp.registry.model.distroseries import DistroSeries69from lp.registry.model.distroseries import DistroSeries
68from lp.registry.model.person import Person70from lp.registry.model.person import Person
6971
=== modified file 'lib/lp/code/model/branchnamespace.py'
--- lib/lp/code/model/branchnamespace.py 2010-08-20 20:31:18 +0000
+++ lib/lp/code/model/branchnamespace.py 2010-10-04 12:14:48 +0000
@@ -51,14 +51,15 @@
51 )51 )
52from lp.code.interfaces.branchtarget import IBranchTarget52from lp.code.interfaces.branchtarget import IBranchTarget
53from lp.code.model.branch import Branch53from lp.code.model.branch import Branch
54from lp.registry.errors import (
55 NoSuchDistroSeries,
56 NoSuchSourcePackageName,
57 )
54from lp.registry.interfaces.distribution import (58from lp.registry.interfaces.distribution import (
55 IDistributionSet,59 IDistributionSet,
56 NoSuchDistribution,60 NoSuchDistribution,
57 )61 )
58from lp.registry.interfaces.distroseries import (62from lp.registry.interfaces.distroseries import IDistroSeriesSet
59 IDistroSeriesSet,
60 NoSuchDistroSeries,
61 )
62from lp.registry.interfaces.person import (63from lp.registry.interfaces.person import (
63 IPersonSet,64 IPersonSet,
64 NoSuchPerson,65 NoSuchPerson,
@@ -70,10 +71,7 @@
70 NoSuchProduct,71 NoSuchProduct,
71 )72 )
72from lp.registry.interfaces.projectgroup import IProjectGroup73from lp.registry.interfaces.projectgroup import IProjectGroup
73from lp.registry.interfaces.sourcepackagename import (74from lp.registry.interfaces.sourcepackagename import ISourcePackageNameSet
74 ISourcePackageNameSet,
75 NoSuchSourcePackageName,
76 )
77from lp.registry.model.sourcepackage import SourcePackage75from lp.registry.model.sourcepackage import SourcePackage
78from lp.services.utils import iter_split76from lp.services.utils import iter_split
7977
@@ -302,7 +300,7 @@
302 @property300 @property
303 def name(self):301 def name(self):
304 """See `IBranchNamespace`."""302 """See `IBranchNamespace`."""
305 return '~%s/+junk' % (self.owner.name,)303 return '~%s/+junk' % self.owner.name
306304
307 def canBranchesBePrivate(self):305 def canBranchesBePrivate(self):
308 """See `IBranchNamespace`."""306 """See `IBranchNamespace`."""
309307
=== modified file 'lib/lp/code/model/linkedbranch.py'
--- lib/lp/code/model/linkedbranch.py 2010-08-20 20:31:18 +0000
+++ lib/lp/code/model/linkedbranch.py 2010-10-04 12:14:48 +0000
@@ -17,10 +17,10 @@
1717
18from lp.archivepublisher.debversion import Version18from lp.archivepublisher.debversion import Version
19from lp.code.interfaces.linkedbranch import ICanHasLinkedBranch19from lp.code.interfaces.linkedbranch import ICanHasLinkedBranch
20from lp.registry.errors import NoSuchDistroSeries
20from lp.registry.interfaces.distributionsourcepackage import (21from lp.registry.interfaces.distributionsourcepackage import (
21 IDistributionSourcePackage,22 IDistributionSourcePackage,
22 )23 )
23from lp.registry.interfaces.distroseries import NoSuchDistroSeries
24from lp.registry.interfaces.pocket import PackagePublishingPocket24from lp.registry.interfaces.pocket import PackagePublishingPocket
25from lp.registry.interfaces.product import IProduct25from lp.registry.interfaces.product import IProduct
26from lp.registry.interfaces.productseries import IProductSeries26from lp.registry.interfaces.productseries import IProductSeries
2727
=== modified file 'lib/lp/code/model/tests/test_branchlookup.py'
--- lib/lp/code/model/tests/test_branchlookup.py 2010-09-16 04:43:45 +0000
+++ lib/lp/code/model/tests/test_branchlookup.py 2010-10-04 12:14:48 +0000
@@ -26,7 +26,10 @@
26 )26 )
27from lp.code.interfaces.branchnamespace import get_branch_namespace27from lp.code.interfaces.branchnamespace import get_branch_namespace
28from lp.code.interfaces.linkedbranch import ICanHasLinkedBranch28from lp.code.interfaces.linkedbranch import ICanHasLinkedBranch
29from lp.registry.interfaces.distroseries import NoSuchDistroSeries29from lp.registry.errors import (
30 NoSuchDistroSeries,
31 NoSuchSourcePackageName,
32 )
30from lp.registry.interfaces.person import NoSuchPerson33from lp.registry.interfaces.person import NoSuchPerson
31from lp.registry.interfaces.pocket import PackagePublishingPocket34from lp.registry.interfaces.pocket import PackagePublishingPocket
32from lp.registry.interfaces.product import (35from lp.registry.interfaces.product import (
@@ -34,7 +37,6 @@
34 NoSuchProduct,37 NoSuchProduct,
35 )38 )
36from lp.registry.interfaces.productseries import NoSuchProductSeries39from lp.registry.interfaces.productseries import NoSuchProductSeries
37from lp.registry.interfaces.sourcepackagename import NoSuchSourcePackageName
38from lp.testing import (40from lp.testing import (
39 run_with_login,41 run_with_login,
40 TestCaseWithFactory,42 TestCaseWithFactory,
4143
=== modified file 'lib/lp/code/model/tests/test_branchnamespace.py'
--- lib/lp/code/model/tests/test_branchnamespace.py 2010-08-20 20:31:18 +0000
+++ lib/lp/code/model/tests/test_branchnamespace.py 2010-10-04 12:14:48 +0000
@@ -39,11 +39,13 @@
39 PersonalNamespace,39 PersonalNamespace,
40 ProductNamespace,40 ProductNamespace,
41 )41 )
42from lp.registry.errors import (
43 NoSuchDistroSeries,
44 NoSuchSourcePackageName,
45 )
42from lp.registry.interfaces.distribution import NoSuchDistribution46from lp.registry.interfaces.distribution import NoSuchDistribution
43from lp.registry.interfaces.distroseries import NoSuchDistroSeries
44from lp.registry.interfaces.person import NoSuchPerson47from lp.registry.interfaces.person import NoSuchPerson
45from lp.registry.interfaces.product import NoSuchProduct48from lp.registry.interfaces.product import NoSuchProduct
46from lp.registry.interfaces.sourcepackagename import NoSuchSourcePackageName
47from lp.registry.model.sourcepackage import SourcePackage49from lp.registry.model.sourcepackage import SourcePackage
48from lp.testing import TestCaseWithFactory50from lp.testing import TestCaseWithFactory
4951
5052
=== modified file 'lib/lp/code/model/tests/test_linkedbranch.py'
--- lib/lp/code/model/tests/test_linkedbranch.py 2010-08-20 20:31:18 +0000
+++ lib/lp/code/model/tests/test_linkedbranch.py 2010-10-04 12:14:48 +0000
@@ -18,7 +18,7 @@
18 get_linked_to_branch,18 get_linked_to_branch,
19 ICanHasLinkedBranch,19 ICanHasLinkedBranch,
20 )20 )
21from lp.registry.interfaces.distroseries import NoSuchDistroSeries21from lp.registry.errors import NoSuchDistroSeries
22from lp.registry.interfaces.pocket import PackagePublishingPocket22from lp.registry.interfaces.pocket import PackagePublishingPocket
23from lp.testing import (23from lp.testing import (
24 run_with_login,24 run_with_login,
2525
=== modified file 'lib/lp/code/xmlrpc/branch.py'
--- lib/lp/code/xmlrpc/branch.py 2010-09-07 05:39:39 +0000
+++ lib/lp/code/xmlrpc/branch.py 2010-10-04 12:14:48 +0000
@@ -52,7 +52,10 @@
52 compose_public_url,52 compose_public_url,
53 SUPPORTED_SCHEMES,53 SUPPORTED_SCHEMES,
54 )54 )
55from lp.registry.interfaces.distroseries import NoSuchDistroSeries55from lp.registry.errors import (
56 NoSuchDistroSeries,
57 NoSuchSourcePackageName,
58 )
56from lp.registry.interfaces.person import (59from lp.registry.interfaces.person import (
57 IPersonSet,60 IPersonSet,
58 NoSuchPerson,61 NoSuchPerson,
@@ -63,7 +66,6 @@
63 NoSuchProduct,66 NoSuchProduct,
64 )67 )
65from lp.registry.interfaces.productseries import NoSuchProductSeries68from lp.registry.interfaces.productseries import NoSuchProductSeries
66from lp.registry.interfaces.sourcepackagename import NoSuchSourcePackageName
6769
6870
69class IBranchSetAPI(Interface):71class IBranchSetAPI(Interface):
7072
=== modified file 'lib/lp/registry/configure.zcml'
--- lib/lp/registry/configure.zcml 2010-09-30 03:39:35 +0000
+++ lib/lp/registry/configure.zcml 2010-10-04 12:14:48 +0000
@@ -8,6 +8,7 @@
8 xmlns:i18n="http://namespaces.zope.org/i18n"8 xmlns:i18n="http://namespaces.zope.org/i18n"
9 xmlns:xmlrpc="http://namespaces.zope.org/xmlrpc"9 xmlns:xmlrpc="http://namespaces.zope.org/xmlrpc"
10 xmlns:lp="http://namespaces.canonical.com/lp"10 xmlns:lp="http://namespaces.canonical.com/lp"
11 xmlns:webservice="http://namespaces.canonical.com/webservice"
11 i18n_domain="launchpad">12 i18n_domain="launchpad">
12 <include13 <include
13 file="vocabularies.zcml"/>14 file="vocabularies.zcml"/>
@@ -1872,6 +1873,12 @@
1872 interface="lp.registry.interfaces.personproduct.IPersonProduct"/>1873 interface="lp.registry.interfaces.personproduct.IPersonProduct"/>
1873 </class>1874 </class>
18741875
1876 <!-- Registers exceptions used in webservice defined in lp.registry.
1877 Other data is in module=canonical.launchpad.interfaces as defined in
1878 zcml there.-->
1879
1880 <webservice:register module="lp.registry.errors" />
1881
1875 <adapter1882 <adapter
1876 provides="canonical.launchpad.webapp.interfaces.IBreadcrumb"1883 provides="canonical.launchpad.webapp.interfaces.IBreadcrumb"
1877 for="lp.registry.interfaces.personproduct.IPersonProduct"1884 for="lp.registry.interfaces.personproduct.IPersonProduct"
18781885
=== modified file 'lib/lp/registry/errors.py'
--- lib/lp/registry/errors.py 2010-09-28 15:14:38 +0000
+++ lib/lp/registry/errors.py 2010-10-04 12:14:48 +0000
@@ -1,14 +1,110 @@
1# Copyright 2009 Canonical Ltd. This software is licensed under the1# Copyright 2010 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4__metaclass__ = type4__metaclass__ = type
5__all__ = [5__all__ = [
6 'PrivatePersonLinkageError',
7 'NameAlreadyTaken',
8 'NoSuchDistroSeries',
9 'UserCannotChangeMembershipSilently',
10 'NoSuchSourcePackageName',
11 'CannotTransitionToCountryMirror',
12 'CountryMirrorAlreadySet',
13 'MirrorNotOfficial',
14 'MirrorHasNoHTTPURL',
15 'MirrorNotProbed',
16 'DeleteSubscriptionError',
17 'UserCannotSubscribePerson',
6 'TeamMembershipTransitionError',18 'TeamMembershipTransitionError',
7 ]19 ]
820
9import httplib21import httplib
1022
11from lazr.restful.declarations import webservice_error23from lazr.restful.declarations import webservice_error
24from zope.security.interfaces import Unauthorized
25
26from lp.app.errors import NameLookupFailed
27
28
29class PrivatePersonLinkageError(ValueError):
30 """An attempt was made to link a private person/team to something."""
31 webservice_error(httplib.FORBIDDEN)
32
33
34class NameAlreadyTaken(Exception):
35 """The name given for a person is already in use by other person."""
36 webservice_error(httplib.CONFLICT)
37
38
39class NoSuchDistroSeries(NameLookupFailed):
40 """Raised when we try to find a DistroSeries that doesn't exist."""
41 webservice_error(httplib.BAD_REQUEST)
42 _message_prefix = "No such distribution series"
43
44
45class UserCannotChangeMembershipSilently(Unauthorized):
46 """User not permitted to change membership status silently.
47
48 Raised when a user tries to change someone's membership silently, and is
49 not a Launchpad Administrator.
50 """
51 webservice_error(httplib.UNAUTHORIZED)
52
53
54class NoSuchSourcePackageName(NameLookupFailed):
55 """Raised when we can't find a particular sourcepackagename."""
56 webservice_error(httplib.BAD_REQUEST)
57 _message_prefix = "No such source package"
58
59
60class CannotTransitionToCountryMirror(Exception):
61 """Root exception for transitions to country mirrors."""
62 webservice_error(httplib.BAD_REQUEST)
63
64
65class CountryMirrorAlreadySet(CannotTransitionToCountryMirror):
66 """Distribution mirror cannot be set as a country mirror.
67
68 Raised when a user tries to change set a distribution mirror as a country
69 mirror, however there is already one set for that country.
70 """
71
72
73class MirrorNotOfficial(CannotTransitionToCountryMirror):
74 """Distribution mirror is not permitted to become a country mirror.
75
76 Raised when a user tries to change set a distribution mirror as a country
77 mirror, however the mirror in question is not official.
78 """
79
80
81class MirrorHasNoHTTPURL(CannotTransitionToCountryMirror):
82 """Distribution mirror has no HTTP URL.
83
84 Raised when a user tries to make an official mirror a country mirror,
85 however the mirror has not HTTP URL set.
86 """
87
88
89class MirrorNotProbed(CannotTransitionToCountryMirror):
90 """Distribution mirror has not been probed.
91
92 Raised when a user tries to set an official mirror as a country mirror,
93 however the mirror has not been probed yet.
94 """
95
96
97class DeleteSubscriptionError(Exception):
98 """Delete Subscription Error.
99
100 Raised when an error occurred trying to delete a
101 structural subscription."""
102 webservice_error(httplib.BAD_REQUEST)
103
104
105class UserCannotSubscribePerson(Exception):
106 """User does not have permission to subscribe the person or team."""
107 webservice_error(httplib.UNAUTHORIZED)
12108
13109
14class TeamMembershipTransitionError(ValueError):110class TeamMembershipTransitionError(ValueError):
15111
=== modified file 'lib/lp/registry/interfaces/distributionmirror.py'
--- lib/lp/registry/interfaces/distributionmirror.py 2010-08-20 20:31:18 +0000
+++ lib/lp/registry/interfaces/distributionmirror.py 2010-10-04 12:14:48 +0000
@@ -6,8 +6,6 @@
6__metaclass__ = type6__metaclass__ = type
77
8__all__ = [8__all__ = [
9 'CannotTransitionToCountryMirror',
10 'CountryMirrorAlreadySet',
11 'IDistributionMirror',9 'IDistributionMirror',
12 'IMirrorDistroArchSeries',10 'IMirrorDistroArchSeries',
13 'IMirrorDistroSeriesSource',11 'IMirrorDistroSeriesSource',
@@ -16,11 +14,8 @@
16 'IMirrorCDImageDistroSeries',14 'IMirrorCDImageDistroSeries',
17 'PROBE_INTERVAL',15 'PROBE_INTERVAL',
18 'MirrorContent',16 'MirrorContent',
17 'MirrorSpeed',
19 'MirrorFreshness',18 'MirrorFreshness',
20 'MirrorHasNoHTTPURL',
21 'MirrorNotOfficial',
22 'MirrorNotProbed',
23 'MirrorSpeed',
24 'MirrorStatus',19 'MirrorStatus',
25 'UnableToFetchCDImageFileList',20 'UnableToFetchCDImageFileList',
26 ]21 ]
@@ -38,7 +33,6 @@
38 exported,33 exported,
39 mutator_for,34 mutator_for,
40 operation_parameters,35 operation_parameters,
41 webservice_error,
42 )36 )
43from lazr.restful.fields import (37from lazr.restful.fields import (
44 Reference,38 Reference,
@@ -76,43 +70,6 @@
76PROBE_INTERVAL = 2370PROBE_INTERVAL = 23
7771
7872
79class CannotTransitionToCountryMirror(Exception):
80 """Root exception for transitions to country mirrors."""
81 webservice_error(400)
82
83
84class CountryMirrorAlreadySet(CannotTransitionToCountryMirror):
85 """Distribution mirror cannot be set as a country mirror.
86
87 Raised when a user tries to change set a distribution mirror as a country
88 mirror, however there is already one set for that country.
89 """
90
91
92class MirrorNotOfficial(CannotTransitionToCountryMirror):
93 """Distribution mirror is not permitted to become a country mirror.
94
95 Raised when a user tries to change set a distribution mirror as a country
96 mirror, however the mirror in question is not official.
97 """
98
99
100class MirrorHasNoHTTPURL(CannotTransitionToCountryMirror):
101 """Distribution mirror has no HTTP URL.
102
103 Raised when a user tries to make an official mirror a country mirror,
104 however the mirror has not HTTP URL set.
105 """
106
107
108class MirrorNotProbed(CannotTransitionToCountryMirror):
109 """Distribution mirror has not been probed.
110
111 Raised when a user tries to set an official mirror as a country mirror,
112 however the mirror has not been probed yet.
113 """
114
115
116class MirrorContent(DBEnumeratedType):73class MirrorContent(DBEnumeratedType):
117 """The content that is mirrored."""74 """The content that is mirrored."""
11875
@@ -191,13 +148,13 @@
191 S2G = DBItem(90, """148 S2G = DBItem(90, """
192 2 Gbps149 2 Gbps
193150
194 The upstream link of this mirror can make up to 2 gigabit per second.151 The upstream link of this mirror can make up to 2 gigabits per second.
195 """)152 """)
196153
197 S4G = DBItem(100, """154 S4G = DBItem(100, """
198 4 Gbps155 4 Gbps
199156
200 The upstream link of this mirror can make up to 4 gigabit per second.157 The upstream link of this mirror can make up to 4 gigabits per second.
201 """)158 """)
202159
203 S10G = DBItem(110, """160 S10G = DBItem(110, """
@@ -359,7 +316,8 @@
359 owner = exported(PublicPersonChoice(316 owner = exported(PublicPersonChoice(
360 title=_('Owner'), readonly=False, vocabulary='ValidOwner',317 title=_('Owner'), readonly=False, vocabulary='ValidOwner',
361 required=True, description=_(318 required=True, description=_(
362 "The person who is set as the current administrator of this mirror.")))319 "The person who is set as the current administrator of this"
320 "mirror.")))
363 distribution = exported(321 distribution = exported(
364 Reference(322 Reference(
365 Interface,323 Interface,
@@ -461,7 +419,7 @@
461 @operation_parameters(country_dns_mirror=copy_field(country_dns_mirror))419 @operation_parameters(country_dns_mirror=copy_field(country_dns_mirror))
462 @export_write_operation()420 @export_write_operation()
463 def transitionToCountryMirror(country_dns_mirror):421 def transitionToCountryMirror(country_dns_mirror):
464 """Method run on changing country_dns_mirror."""422 """Method run on changing country_dns_mirror."""
465423
466 @invariant424 @invariant
467 def mirrorMustHaveHTTPOrFTPURL(mirror):425 def mirrorMustHaveHTTPOrFTPURL(mirror):
@@ -598,7 +556,6 @@
598 """556 """
599557
600558
601
602class UnableToFetchCDImageFileList(Exception):559class UnableToFetchCDImageFileList(Exception):
603 """Couldn't fetch the file list needed for probing cdimage mirrors."""560 """Couldn't fetch the file list needed for probing cdimage mirrors."""
604561
605562
=== modified file 'lib/lp/registry/interfaces/distroseries.py'
--- lib/lp/registry/interfaces/distroseries.py 2010-09-21 13:05:42 +0000
+++ lib/lp/registry/interfaces/distroseries.py 2010-10-04 12:14:48 +0000
@@ -12,7 +12,6 @@
12 'IDistroSeriesEditRestricted',12 'IDistroSeriesEditRestricted',
13 'IDistroSeriesPublic',13 'IDistroSeriesPublic',
14 'IDistroSeriesSet',14 'IDistroSeriesSet',
15 'NoSuchDistroSeries',
16 ]15 ]
1716
18from lazr.enum import DBEnumeratedType17from lazr.enum import DBEnumeratedType
@@ -26,7 +25,6 @@
26 operation_returns_collection_of,25 operation_returns_collection_of,
27 operation_returns_entry,26 operation_returns_entry,
28 rename_parameters_as,27 rename_parameters_as,
29 webservice_error,
30 )28 )
31from lazr.restful.fields import (29from lazr.restful.fields import (
32 Reference,30 Reference,
@@ -51,7 +49,6 @@
51from canonical.launchpad.validators.email import email_validator49from canonical.launchpad.validators.email import email_validator
52from canonical.launchpad.validators.name import name_validator50from canonical.launchpad.validators.name import name_validator
53from canonical.launchpad.validators.version import sane_version51from canonical.launchpad.validators.version import sane_version
54from lp.app.errors import NameLookupFailed
55from lp.app.interfaces.launchpad import IServiceUsage52from lp.app.interfaces.launchpad import IServiceUsage
56from lp.blueprints.interfaces.specificationtarget import ISpecificationGoal53from lp.blueprints.interfaces.specificationtarget import ISpecificationGoal
57from lp.bugs.interfaces.bugtarget import (54from lp.bugs.interfaces.bugtarget import (
@@ -59,6 +56,7 @@
59 IHasBugs,56 IHasBugs,
60 IHasOfficialBugTags,57 IHasOfficialBugTags,
61 )58 )
59from lp.registry.errors import NoSuchDistroSeries
62from lp.registry.interfaces.milestone import (60from lp.registry.interfaces.milestone import (
63 IHasMilestones,61 IHasMilestones,
64 IMilestone,62 IMilestone,
@@ -858,11 +856,5 @@
858 """856 """
859857
860858
861class NoSuchDistroSeries(NameLookupFailed):
862 """Raised when we try to find a DistroSeries that doesn't exist."""
863 webservice_error(400) #Bad request.
864 _message_prefix = "No such distribution series"
865
866
867# Monkey patch for circular import avoidance done in859# Monkey patch for circular import avoidance done in
868# _schema_circular_imports.py860# _schema_circular_imports.py
869861
=== modified file 'lib/lp/registry/interfaces/person.py'
--- lib/lp/registry/interfaces/person.py 2010-09-24 21:10:47 +0000
+++ lib/lp/registry/interfaces/person.py 2010-10-04 12:14:48 +0000
@@ -27,12 +27,10 @@
27 'ImmutableVisibilityError',27 'ImmutableVisibilityError',
28 'InvalidName',28 'InvalidName',
29 'JoinNotAllowed',29 'JoinNotAllowed',
30 'NameAlreadyTaken',
31 'NoSuchPerson',30 'NoSuchPerson',
32 'PersonCreationRationale',31 'PersonCreationRationale',
33 'PersonVisibility',32 'PersonVisibility',
34 'PersonalStanding',33 'PersonalStanding',
35 'PrivatePersonLinkageError',
36 'PRIVATE_TEAM_PREFIX',34 'PRIVATE_TEAM_PREFIX',
37 'TeamContactMethod',35 'TeamContactMethod',
38 'TeamMembershipRenewalPolicy',36 'TeamMembershipRenewalPolicy',
@@ -41,8 +39,6 @@
41 'validate_public_person',39 'validate_public_person',
42 ]40 ]
4341
44import httplib
45
46from lazr.enum import (42from lazr.enum import (
47 DBEnumeratedType,43 DBEnumeratedType,
48 DBItem,44 DBItem,
@@ -65,9 +61,7 @@
65 operation_returns_entry,61 operation_returns_entry,
66 rename_parameters_as,62 rename_parameters_as,
67 REQUEST_USER,63 REQUEST_USER,
68 webservice_error,
69 )64 )
70from lazr.restful.error import expose
71from lazr.restful.fields import (65from lazr.restful.fields import (
72 CollectionField,66 CollectionField,
73 Reference,67 Reference,
@@ -121,6 +115,7 @@
121 IHasRequestedReviews,115 IHasRequestedReviews,
122 )116 )
123from lp.code.interfaces.hasrecipes import IHasRecipes117from lp.code.interfaces.hasrecipes import IHasRecipes
118from lp.registry.errors import PrivatePersonLinkageError
124from lp.registry.interfaces.gpg import IGPGKey119from lp.registry.interfaces.gpg import IGPGKey
125from lp.registry.interfaces.irc import IIrcID120from lp.registry.interfaces.irc import IIrcID
126from lp.registry.interfaces.jabber import IJabberID121from lp.registry.interfaces.jabber import IJabberID
@@ -158,14 +153,6 @@
158PRIVATE_TEAM_PREFIX = 'private-'153PRIVATE_TEAM_PREFIX = 'private-'
159154
160155
161class PrivatePersonLinkageError(ValueError):
162 """An attempt was made to link a private person/team to something."""
163 # HTTP 400 -- BAD REQUEST
164 # HTTP 403 would be better, but as this excpetion is raised inside a
165 # validator, it will default to 400 anyway.
166 webservice_error(httplib.BAD_REQUEST)
167
168
169@block_implicit_flushes156@block_implicit_flushes
170def validate_person_common(obj, attr, value, validate_func):157def validate_person_common(obj, attr, value, validate_func):
171 """Validate the person using the supplied function."""158 """Validate the person using the supplied function."""
@@ -178,10 +165,10 @@
178 from lp.registry.model.person import Person165 from lp.registry.model.person import Person
179 person = Person.get(value)166 person = Person.get(value)
180 if not validate_func(person):167 if not validate_func(person):
181 raise expose(PrivatePersonLinkageError(168 raise PrivatePersonLinkageError(
182 "Cannot link person (name=%s, visibility=%s) to %s (name=%s)"169 "Cannot link person (name=%s, visibility=%s) to %s (name=%s)"
183 % (person.name, person.visibility.name,170 % (person.name, person.visibility.name,
184 obj, getattr(obj, 'name', None))))171 obj, getattr(obj, 'name', None)))
185 return value172 return value
186173
187174
@@ -2182,11 +2169,6 @@
2182 """The name given for a person is not valid."""2169 """The name given for a person is not valid."""
21832170
21842171
2185class NameAlreadyTaken(Exception):
2186 """The name given for a person is already in use by other person."""
2187 webservice_error(409)
2188
2189
2190class NoSuchPerson(NameLookupFailed):2172class NoSuchPerson(NameLookupFailed):
2191 """Raised when we try to look up an IPerson that doesn't exist."""2173 """Raised when we try to look up an IPerson that doesn't exist."""
21922174
21932175
=== modified file 'lib/lp/registry/interfaces/sourcepackagename.py'
--- lib/lp/registry/interfaces/sourcepackagename.py 2010-08-20 20:31:18 +0000
+++ lib/lp/registry/interfaces/sourcepackagename.py 2010-10-04 12:14:48 +0000
@@ -10,10 +10,8 @@
10__all__ = [10__all__ = [
11 'ISourcePackageName',11 'ISourcePackageName',
12 'ISourcePackageNameSet',12 'ISourcePackageNameSet',
13 'NoSuchSourcePackageName',
14 ]13 ]
1514
16from lazr.restful.declarations import webservice_error
17from zope.interface import (15from zope.interface import (
18 Attribute,16 Attribute,
19 Interface,17 Interface,
@@ -25,7 +23,6 @@
2523
26from canonical.launchpad import _24from canonical.launchpad import _
27from canonical.launchpad.validators.name import name_validator25from canonical.launchpad.validators.name import name_validator
28from lp.app.errors import NameLookupFailed
2926
3027
31class ISourcePackageName(Interface):28class ISourcePackageName(Interface):
@@ -54,7 +51,8 @@
54 def get(sourcepackagenameid):51 def get(sourcepackagenameid):
55 """Return a sourcepackagename by its id.52 """Return a sourcepackagename by its id.
5653
57 If the sourcepackagename can't be found a NotFoundError will be raised.54 If the sourcepackagename can't be found a NotFoundError will be
55 raised.
58 """56 """
5957
60 def getAll():58 def getAll():
@@ -74,9 +72,3 @@
7472
75 def getOrCreateByName(name):73 def getOrCreateByName(name):
76 """Get a source package name by name, creating it if necessary."""74 """Get a source package name by name, creating it if necessary."""
77
78
79class NoSuchSourcePackageName(NameLookupFailed):
80 """Raised when we can't find a particular sourcepackagename."""
81 webservice_error(400)
82 _message_prefix = "No such source package"
8375
=== modified file 'lib/lp/registry/interfaces/structuralsubscription.py'
--- lib/lp/registry/interfaces/structuralsubscription.py 2010-08-20 20:31:18 +0000
+++ lib/lp/registry/interfaces/structuralsubscription.py 2010-10-04 12:14:48 +0000
@@ -10,11 +10,9 @@
10__all__ = [10__all__ = [
11 'BlueprintNotificationLevel',11 'BlueprintNotificationLevel',
12 'BugNotificationLevel',12 'BugNotificationLevel',
13 'DeleteSubscriptionError',
14 'IStructuralSubscription',13 'IStructuralSubscription',
15 'IStructuralSubscriptionForm',14 'IStructuralSubscriptionForm',
16 'IStructuralSubscriptionTarget',15 'IStructuralSubscriptionTarget',
17 'UserCannotSubscribePerson',
18 ]16 ]
1917
20from lazr.enum import (18from lazr.enum import (
@@ -32,7 +30,6 @@
32 operation_returns_collection_of,30 operation_returns_collection_of,
33 operation_returns_entry,31 operation_returns_entry,
34 REQUEST_USER,32 REQUEST_USER,
35 webservice_error,
36 )33 )
37from lazr.restful.fields import Reference34from lazr.restful.fields import Reference
38from zope.interface import (35from zope.interface import (
@@ -247,16 +244,3 @@
247 subscribe_me = Bool(244 subscribe_me = Bool(
248 title=u"I want to receive these notifications by e-mail.",245 title=u"I want to receive these notifications by e-mail.",
249 required=False)246 required=False)
250
251
252class DeleteSubscriptionError(Exception):
253 """Delete Subscription Error.
254
255 Raised when an error occurred trying to delete a
256 structural subscription."""
257 webservice_error(400)
258
259
260class UserCannotSubscribePerson(Exception):
261 """User does not have permission to subscribe the person or team."""
262 webservice_error(401)
263247
=== modified file 'lib/lp/registry/interfaces/teammembership.py'
--- lib/lp/registry/interfaces/teammembership.py 2010-09-01 19:46:27 +0000
+++ lib/lp/registry/interfaces/teammembership.py 2010-10-04 12:14:48 +0000
@@ -14,7 +14,6 @@
14 'ITeamMembershipSet',14 'ITeamMembershipSet',
15 'ITeamParticipation',15 'ITeamParticipation',
16 'TeamMembershipStatus',16 'TeamMembershipStatus',
17 'UserCannotChangeMembershipSilently',
18 ]17 ]
1918
20from lazr.enum import (19from lazr.enum import (
@@ -28,7 +27,6 @@
28 exported,27 exported,
29 operation_parameters,28 operation_parameters,
30 REQUEST_USER,29 REQUEST_USER,
31 webservice_error,
32 )30 )
33from lazr.restful.fields import Reference31from lazr.restful.fields import Reference
34from lazr.restful.interface import copy_field32from lazr.restful.interface import copy_field
@@ -43,7 +41,6 @@
43 Int,41 Int,
44 Text,42 Text,
45 )43 )
46from zope.security.interfaces import Unauthorized
4744
48from canonical.launchpad import _45from canonical.launchpad import _
4946
@@ -53,15 +50,6 @@
53DAYS_BEFORE_EXPIRATION_WARNING_IS_SENT = 750DAYS_BEFORE_EXPIRATION_WARNING_IS_SENT = 7
5451
5552
56class UserCannotChangeMembershipSilently(Unauthorized):
57 """User not permitted to change membership status silently.
58
59 Raised when a user tries to change someone's membership silently, and is
60 not a Launchpad Administrator.
61 """
62 webservice_error(401) # HTTP Error: 'Unauthorized'
63
64
65class TeamMembershipStatus(DBEnumeratedType):53class TeamMembershipStatus(DBEnumeratedType):
66 """TeamMembership Status54 """TeamMembership Status
6755
6856
=== modified file 'lib/lp/registry/model/distribution.py'
--- lib/lp/registry/model/distribution.py 2010-09-03 03:12:39 +0000
+++ lib/lp/registry/model/distribution.py 2010-10-04 12:14:48 +0000
@@ -88,7 +88,6 @@
88 SpecificationDefinitionStatus,88 SpecificationDefinitionStatus,
89 SpecificationFilter,89 SpecificationFilter,
90 SpecificationImplementationStatus,90 SpecificationImplementationStatus,
91 SpecificationSort,
92 )91 )
93from lp.blueprints.model.specification import (92from lp.blueprints.model.specification import (
94 HasSpecificationsMixin,93 HasSpecificationsMixin,
@@ -112,6 +111,7 @@
112 OfficialBugTagTargetMixin,111 OfficialBugTagTargetMixin,
113 )112 )
114from lp.bugs.model.bugtask import BugTask113from lp.bugs.model.bugtask import BugTask
114from lp.registry.errors import NoSuchDistroSeries
115from lp.registry.interfaces.distribution import (115from lp.registry.interfaces.distribution import (
116 IBaseDistribution,116 IBaseDistribution,
117 IDerivativeDistribution,117 IDerivativeDistribution,
@@ -123,7 +123,6 @@
123 MirrorContent,123 MirrorContent,
124 MirrorStatus,124 MirrorStatus,
125 )125 )
126from lp.registry.interfaces.distroseries import NoSuchDistroSeries
127from lp.registry.interfaces.packaging import PackagingType126from lp.registry.interfaces.packaging import PackagingType
128from lp.registry.interfaces.person import (127from lp.registry.interfaces.person import (
129 validate_person,128 validate_person,
130129
=== modified file 'lib/lp/registry/model/distributionmirror.py'
--- lib/lp/registry/model/distributionmirror.py 2010-08-24 15:29:01 +0000
+++ lib/lp/registry/model/distributionmirror.py 2010-10-04 12:14:48 +0000
@@ -56,9 +56,14 @@
56 MAIN_STORE,56 MAIN_STORE,
57 )57 )
58from lp.archivepublisher.diskpool import poolify58from lp.archivepublisher.diskpool import poolify
59from lp.registry.interfaces.distributionmirror import (59from lp.registry.errors import (
60 CannotTransitionToCountryMirror,60 CannotTransitionToCountryMirror,
61 CountryMirrorAlreadySet,61 CountryMirrorAlreadySet,
62 MirrorHasNoHTTPURL,
63 MirrorNotOfficial,
64 MirrorNotProbed,
65 )
66from lp.registry.interfaces.distributionmirror import (
62 IDistributionMirror,67 IDistributionMirror,
63 IDistributionMirrorSet,68 IDistributionMirrorSet,
64 IMirrorCDImageDistroSeries,69 IMirrorCDImageDistroSeries,
@@ -67,9 +72,6 @@
67 IMirrorProbeRecord,72 IMirrorProbeRecord,
68 MirrorContent,73 MirrorContent,
69 MirrorFreshness,74 MirrorFreshness,
70 MirrorHasNoHTTPURL,
71 MirrorNotOfficial,
72 MirrorNotProbed,
73 MirrorSpeed,75 MirrorSpeed,
74 MirrorStatus,76 MirrorStatus,
75 PROBE_INTERVAL,77 PROBE_INTERVAL,
@@ -353,7 +355,8 @@
353 if mirror is not None:355 if mirror is not None:
354 mirror.destroySelf()356 mirror.destroySelf()
355357
356 def _getMirrorDistroArchSeries(self, distro_arch_series, pocket, component):358 def _getMirrorDistroArchSeries(
359 self, distro_arch_series, pocket, component):
357 """Return MirrorDistroArchSeries given a arch series and pocket."""360 """Return MirrorDistroArchSeries given a arch series and pocket."""
358361
359 return IStore(MirrorDistroArchSeries).find(362 return IStore(MirrorDistroArchSeries).find(
@@ -525,7 +528,7 @@
525class DistributionMirrorSet:528class DistributionMirrorSet:
526 """See IDistributionMirrorSet"""529 """See IDistributionMirrorSet"""
527530
528 implements (IDistributionMirrorSet)531 implements(IDistributionMirrorSet)
529532
530 def __getitem__(self, mirror_id):533 def __getitem__(self, mirror_id):
531 """See IDistributionMirrorSet"""534 """See IDistributionMirrorSet"""
@@ -652,7 +655,7 @@
652 (MirrorFreshness.SIXHOURSBEHIND, 6.5),655 (MirrorFreshness.SIXHOURSBEHIND, 6.5),
653 (MirrorFreshness.ONEDAYBEHIND, 24.5),656 (MirrorFreshness.ONEDAYBEHIND, 24.5),
654 (MirrorFreshness.TWODAYSBEHIND, 48.5),657 (MirrorFreshness.TWODAYSBEHIND, 48.5),
655 (MirrorFreshness.ONEWEEKBEHIND, 168.5)658 (MirrorFreshness.ONEWEEKBEHIND, 168.5),
656 ]659 ]
657660
658 def _getPackageReleaseURLFromPublishingRecord(self, publishing_record):661 def _getPackageReleaseURLFromPublishingRecord(self, publishing_record):
@@ -799,7 +802,6 @@
799 query, clauseTables=['BinaryPackageFile'],802 query, clauseTables=['BinaryPackageFile'],
800 orderBy='-datepublished')803 orderBy='-datepublished')
801804
802
803 def _getPackageReleaseURLFromPublishingRecord(self, publishing_record):805 def _getPackageReleaseURLFromPublishingRecord(self, publishing_record):
804 """Given a BinaryPackagePublishingHistory, return the URL on806 """Given a BinaryPackagePublishingHistory, return the URL on
805 this mirror from where the BinaryPackageRelease file can be downloaded.807 this mirror from where the BinaryPackageRelease file can be downloaded.
@@ -880,4 +882,3 @@
880 log_file = ForeignKey(882 log_file = ForeignKey(
881 dbName='log_file', foreignKey='LibraryFileAlias', notNull=True)883 dbName='log_file', foreignKey='LibraryFileAlias', notNull=True)
882 date_created = UtcDateTimeCol(notNull=True, default=UTC_NOW)884 date_created = UtcDateTimeCol(notNull=True, default=UTC_NOW)
883
884885
=== modified file 'lib/lp/registry/model/person.py'
--- lib/lp/registry/model/person.py 2010-09-21 02:47:03 +0000
+++ lib/lp/registry/model/person.py 2010-10-04 12:14:48 +0000
@@ -191,6 +191,7 @@
191 HasMergeProposalsMixin,191 HasMergeProposalsMixin,
192 HasRequestedReviewsMixin,192 HasRequestedReviewsMixin,
193 )193 )
194from lp.registry.errors import NameAlreadyTaken
194from lp.registry.interfaces.codeofconduct import ISignedCodeOfConductSet195from lp.registry.interfaces.codeofconduct import ISignedCodeOfConductSet
195from lp.registry.interfaces.distribution import IDistribution196from lp.registry.interfaces.distribution import IDistribution
196from lp.registry.interfaces.gpg import IGPGKeySet197from lp.registry.interfaces.gpg import IGPGKeySet
@@ -217,7 +218,6 @@
217 IPersonSet,218 IPersonSet,
218 ITeam,219 ITeam,
219 JoinNotAllowed,220 JoinNotAllowed,
220 NameAlreadyTaken,
221 PersonalStanding,221 PersonalStanding,
222 PersonCreationRationale,222 PersonCreationRationale,
223 PersonVisibility,223 PersonVisibility,
@@ -1256,7 +1256,7 @@
1256 try:1256 try:
1257 return self._inTeam_cache[team.id]1257 return self._inTeam_cache[team.id]
1258 except KeyError:1258 except KeyError:
1259 pass 1259 pass
12601260
1261 tp = TeamParticipation.selectOneBy(team=team, person=self)1261 tp = TeamParticipation.selectOneBy(team=team, person=self)
1262 if tp is not None or self.id == team.teamownerID:1262 if tp is not None or self.id == team.teamownerID:
12631263
=== modified file 'lib/lp/registry/model/sourcepackagename.py'
--- lib/lp/registry/model/sourcepackagename.py 2010-08-20 20:31:18 +0000
+++ lib/lp/registry/model/sourcepackagename.py 2010-10-04 12:14:48 +0000
@@ -7,8 +7,8 @@
7__all__ = [7__all__ = [
8 'SourcePackageName',8 'SourcePackageName',
9 'SourcePackageNameSet',9 'SourcePackageNameSet',
10 'getSourcePackageDescriptions'10 'getSourcePackageDescriptions',
11]11 ]
1212
13from sqlobject import (13from sqlobject import (
14 SQLMultipleJoin,14 SQLMultipleJoin,
@@ -24,10 +24,10 @@
24 sqlvalues,24 sqlvalues,
25 )25 )
26from lp.app.errors import NotFoundError26from lp.app.errors import NotFoundError
27from lp.registry.errors import NoSuchSourcePackageName
27from lp.registry.interfaces.sourcepackagename import (28from lp.registry.interfaces.sourcepackagename import (
28 ISourcePackageName,29 ISourcePackageName,
29 ISourcePackageNameSet,30 ISourcePackageNameSet,
30 NoSuchSourcePackageName,
31 )31 )
3232
3333
@@ -155,4 +155,3 @@
155 description = ", %s" % binarypackagename155 description = ", %s" % binarypackagename
156 descriptions[sourcepackagename] += description156 descriptions[sourcepackagename] += description
157 return descriptions157 return descriptions
158
159158
=== modified file 'lib/lp/registry/model/structuralsubscription.py'
--- lib/lp/registry/model/structuralsubscription.py 2010-08-20 20:31:18 +0000
+++ lib/lp/registry/model/structuralsubscription.py 2010-10-04 12:14:48 +0000
@@ -18,6 +18,10 @@
18 )18 )
19from canonical.launchpad.interfaces.launchpad import ILaunchpadCelebrities19from canonical.launchpad.interfaces.launchpad import ILaunchpadCelebrities
20from lp.registry.enum import BugNotificationLevel20from lp.registry.enum import BugNotificationLevel
21from lp.registry.errors import (
22 DeleteSubscriptionError,
23 UserCannotSubscribePerson,
24 )
21from lp.registry.interfaces.distribution import IDistribution25from lp.registry.interfaces.distribution import IDistribution
22from lp.registry.interfaces.distributionsourcepackage import (26from lp.registry.interfaces.distributionsourcepackage import (
23 IDistributionSourcePackage,27 IDistributionSourcePackage,
@@ -33,10 +37,8 @@
33from lp.registry.interfaces.projectgroup import IProjectGroup37from lp.registry.interfaces.projectgroup import IProjectGroup
34from lp.registry.interfaces.structuralsubscription import (38from lp.registry.interfaces.structuralsubscription import (
35 BlueprintNotificationLevel,39 BlueprintNotificationLevel,
36 DeleteSubscriptionError,
37 IStructuralSubscription,40 IStructuralSubscription,
38 IStructuralSubscriptionTarget,41 IStructuralSubscriptionTarget,
39 UserCannotSubscribePerson,
40 )42 )
4143
4244
4345
=== modified file 'lib/lp/registry/model/teammembership.py'
--- lib/lp/registry/model/teammembership.py 2010-09-29 00:26:02 +0000
+++ lib/lp/registry/model/teammembership.py 2010-10-04 12:14:48 +0000
@@ -46,7 +46,10 @@
46from canonical.launchpad.mailnotification import MailWrapper46from canonical.launchpad.mailnotification import MailWrapper
47from canonical.launchpad.webapp import canonical_url47from canonical.launchpad.webapp import canonical_url
48from lp.app.browser.tales import DurationFormatterAPI48from lp.app.browser.tales import DurationFormatterAPI
49from lp.registry.errors import TeamMembershipTransitionError49from lp.registry.errors import (
50 TeamMembershipTransitionError,
51 UserCannotChangeMembershipSilently,
52 )
50from lp.registry.interfaces.person import (53from lp.registry.interfaces.person import (
51 IPersonSet,54 IPersonSet,
52 TeamMembershipRenewalPolicy,55 TeamMembershipRenewalPolicy,
@@ -59,7 +62,6 @@
59 ITeamMembershipSet,62 ITeamMembershipSet,
60 ITeamParticipation,63 ITeamParticipation,
61 TeamMembershipStatus,64 TeamMembershipStatus,
62 UserCannotChangeMembershipSilently,
63 )65 )
6466
6567
6668
=== modified file 'lib/lp/registry/tests/test_distribution.py'
--- lib/lp/registry/tests/test_distribution.py 2010-08-23 08:46:04 +0000
+++ lib/lp/registry/tests/test_distribution.py 2010-10-04 12:14:48 +0000
@@ -12,8 +12,8 @@
12 DatabaseFunctionalLayer,12 DatabaseFunctionalLayer,
13 LaunchpadFunctionalLayer,13 LaunchpadFunctionalLayer,
14 )14 )
15from lp.registry.errors import NoSuchDistroSeries
15from lp.registry.interfaces.distribution import IDistribution16from lp.registry.interfaces.distribution import IDistribution
16from lp.registry.interfaces.distroseries import NoSuchDistroSeries
17from lp.registry.interfaces.series import SeriesStatus17from lp.registry.interfaces.series import SeriesStatus
18from lp.registry.tests.test_distroseries import (18from lp.registry.tests.test_distroseries import (
19 TestDistroSeriesCurrentSourceReleases,19 TestDistroSeriesCurrentSourceReleases,
2020
=== modified file 'lib/lp/registry/tests/test_distroseries.py'
--- lib/lp/registry/tests/test_distroseries.py 2010-08-24 15:29:01 +0000
+++ lib/lp/registry/tests/test_distroseries.py 2010-10-04 12:14:48 +0000
@@ -19,25 +19,19 @@
19 DatabaseFunctionalLayer,19 DatabaseFunctionalLayer,
20 LaunchpadFunctionalLayer,20 LaunchpadFunctionalLayer,
21 )21 )
22from lp.registry.interfaces.distroseries import (22from lp.registry.errors import NoSuchDistroSeries
23 IDistroSeriesSet,23from lp.registry.interfaces.distroseries import IDistroSeriesSet
24 NoSuchDistroSeries,
25 )
26from lp.registry.interfaces.pocket import PackagePublishingPocket24from lp.registry.interfaces.pocket import PackagePublishingPocket
27from lp.soyuz.enums import (25from lp.soyuz.enums import (
28 ArchivePurpose,26 ArchivePurpose,
29 PackagePublishingStatus,27 PackagePublishingStatus,
30 )28 )
31from lp.soyuz.interfaces.archive import (29from lp.soyuz.interfaces.archive import IArchiveSet
32 IArchiveSet,
33 )
34from lp.soyuz.interfaces.component import IComponentSet30from lp.soyuz.interfaces.component import IComponentSet
35from lp.soyuz.interfaces.distroseriessourcepackagerelease import (31from lp.soyuz.interfaces.distroseriessourcepackagerelease import (
36 IDistroSeriesSourcePackageRelease,32 IDistroSeriesSourcePackageRelease,
37 )33 )
38from lp.soyuz.interfaces.publishing import (34from lp.soyuz.interfaces.publishing import active_publishing_status
39 active_publishing_status,
40 )
41from lp.soyuz.model.processor import ProcessorFamilySet35from lp.soyuz.model.processor import ProcessorFamilySet
42from lp.soyuz.tests.test_publishing import SoyuzTestPublisher36from lp.soyuz.tests.test_publishing import SoyuzTestPublisher
43from lp.testing import (37from lp.testing import (
4438
=== modified file 'lib/lp/registry/tests/test_person.py'
--- lib/lp/registry/tests/test_person.py 2010-09-28 03:01:37 +0000
+++ lib/lp/registry/tests/test_person.py 2010-10-04 12:14:48 +0000
@@ -9,9 +9,9 @@
99
10from lazr.lifecycle.snapshot import Snapshot10from lazr.lifecycle.snapshot import Snapshot
11import pytz11import pytz
12from storm.store import Store
12from testtools.matchers import LessThan13from testtools.matchers import LessThan
13import transaction14import transaction
14from storm.store import Store
15from zope.component import getUtility15from zope.component import getUtility
16from zope.interface import providedBy16from zope.interface import providedBy
17from zope.security.proxy import removeSecurityProxy17from zope.security.proxy import removeSecurityProxy
@@ -43,15 +43,17 @@
43from lp.bugs.interfaces.bugtask import IllegalRelatedBugTasksParams43from lp.bugs.interfaces.bugtask import IllegalRelatedBugTasksParams
44from lp.bugs.model.bug import Bug44from lp.bugs.model.bug import Bug
45from lp.bugs.model.bugtask import get_related_bugtasks_search_params45from lp.bugs.model.bugtask import get_related_bugtasks_search_params
46from lp.registry.errors import (
47 NameAlreadyTaken,
48 PrivatePersonLinkageError,
49 )
46from lp.registry.interfaces.karma import IKarmaCacheManager50from lp.registry.interfaces.karma import IKarmaCacheManager
47from lp.registry.interfaces.person import (51from lp.registry.interfaces.person import (
48 ImmutableVisibilityError,52 ImmutableVisibilityError,
49 InvalidName,53 InvalidName,
50 IPersonSet,54 IPersonSet,
51 NameAlreadyTaken,
52 PersonCreationRationale,55 PersonCreationRationale,
53 PersonVisibility,56 PersonVisibility,
54 PrivatePersonLinkageError,
55 )57 )
56from lp.registry.interfaces.product import IProductSet58from lp.registry.interfaces.product import IProductSet
57from lp.registry.model.karma import KarmaCategory59from lp.registry.model.karma import KarmaCategory
5860
=== modified file 'lib/lp/registry/tests/test_structuralsubscriptiontarget.py'
--- lib/lp/registry/tests/test_structuralsubscriptiontarget.py 2010-08-20 20:31:18 +0000
+++ lib/lp/registry/tests/test_structuralsubscriptiontarget.py 2010-10-04 12:14:48 +0000
@@ -25,13 +25,15 @@
25from canonical.testing import LaunchpadFunctionalLayer25from canonical.testing import LaunchpadFunctionalLayer
26from lp.bugs.interfaces.bug import CreateBugParams26from lp.bugs.interfaces.bug import CreateBugParams
27from lp.bugs.tests.test_bugtarget import bugtarget_filebug27from lp.bugs.tests.test_bugtarget import bugtarget_filebug
28from lp.registry.errors import (
29 DeleteSubscriptionError,
30 UserCannotSubscribePerson,
31 )
28from lp.registry.interfaces.distribution import IDistributionSet32from lp.registry.interfaces.distribution import IDistributionSet
29from lp.registry.interfaces.product import IProductSet33from lp.registry.interfaces.product import IProductSet
30from lp.registry.interfaces.sourcepackagename import ISourcePackageNameSet34from lp.registry.interfaces.sourcepackagename import ISourcePackageNameSet
31from lp.registry.interfaces.structuralsubscription import (35from lp.registry.interfaces.structuralsubscription import (
32 DeleteSubscriptionError,
33 IStructuralSubscriptionTarget,36 IStructuralSubscriptionTarget,
34 UserCannotSubscribePerson,
35 )37 )
36from lp.registry.model.structuralsubscription import StructuralSubscription38from lp.registry.model.structuralsubscription import StructuralSubscription
37from lp.testing import (39from lp.testing import (
3840
=== modified file 'lib/lp/registry/tests/test_team_webservice.py'
--- lib/lp/registry/tests/test_team_webservice.py 2010-09-24 21:10:47 +0000
+++ lib/lp/registry/tests/test_team_webservice.py 2010-10-04 12:14:48 +0000
@@ -3,6 +3,7 @@
33
4__metaclass__ = type4__metaclass__ = type
55
6import httplib
6import unittest7import unittest
78
8from lazr.restfulclient.errors import HTTPError9from lazr.restfulclient.errors import HTTPError
@@ -44,7 +45,7 @@
44 team_one.addMember,45 team_one.addMember,
45 person=team_two)46 person=team_two)
46 self.assertIn('Cannot link person', api_error.content)47 self.assertIn('Cannot link person', api_error.content)
47 self.assertEqual(400, api_error.response.status)48 self.assertEqual(httplib.FORBIDDEN, api_error.response.status)
4849
4950
50def test_suite():51def test_suite():