Raphaƫl: This branch looks very good. I think the implementation is perfect. I have some concerns about the primary test. > @@ -260,3 +267,79 @@ > text='Series and milestones')) > self.assertThat(view.render(), series_header_match) > self.assertThat(view.render(), Not(add_series_match)) > + > + > +class DistroRegistrantTestCase(TestCaseWithFactory): > + """A TestCase for registrants and owners of a distribution. > + > + The registrant is the creator of the distribution (read-only field). > + The owner is really the maintainer. > + """ This test case will be difficult to extend. I think we want tests for the model object and tests for the views. I preffer that each view (+add and +reassign) be have separate test cases, but that may not be necessary. Some of these tests need to move to a different directory. Test interfaces in lp/registry/doc Test models in lp/registry/tests Test views in lp/registry/browser/tests Get the rest of this test case updated per my remarks that split it into model and view tests. > + layer = LaunchpadFunctionalLayer This is the wrong layer. LaunchpadFunctionalLayer is slow and only needed if you are working with the librarian (uploading/downloading/email messages). Use layer = DatabaseFunctionalLayer + def setUp(self): + super(DistroRegistrantTestCase, self).setUp() + self.owner = self.factory.makePerson() + self.registrant = self.factory.makePerson() + self.admin = getUtility(IPersonSet).getByEmail('