← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~wgrant/launchpad/demolish-bvp into lp:launchpad

 

William Grant has proposed merging lp:~wgrant/launchpad/demolish-bvp into lp:launchpad.

Commit message:
Drop BranchVisibilityPolicy from the code. Sharing is the new black.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~wgrant/launchpad/demolish-bvp/+merge/128610

Delete all non-DB bits of BranchVisibilityPolicy. The modern sharing stuff is used instead.

I had to remove the tests for Branch:+edit's restrictions around transferring branches to owners that aren't permitted by the context, as sharing allows an authorised user to make anyone own a branch, so they can't be ported. This restriction will either be fully lifted or reimposed in a later branch, but for now the tests are gone.
-- 
https://code.launchpad.net/~wgrant/launchpad/demolish-bvp/+merge/128610
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~wgrant/launchpad/demolish-bvp into lp:launchpad.
=== modified file 'database/sampledata/current-dev.sql'
--- database/sampledata/current-dev.sql	2012-09-28 15:45:03 +0000
+++ database/sampledata/current-dev.sql	2012-10-09 00:01:20 +0000
@@ -1,6 +1,6 @@
 -- Copyright 2010-2011 Canonical Ltd.  This software is licensed under the
 -- GNU Affero General Public License version 3 (see the file LICENSE).
--- Created using pg_dump (PostgreSQL) 9.1.5
+-- Created using pg_dump (PostgreSQL) 9.1.4
 
 SET check_function_bodies = false;
 SET client_encoding = 'UTF8';
@@ -1799,30 +1799,30 @@
 
 ALTER TABLE product DISABLE TRIGGER ALL;
 
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (1, 1, 17, 'tomcat', 'Tomcat', 'Tomcat', 'The servlet container that is used in the official Reference Implementation for the Java Servlet and JavaServer Pages technologies.', 'Apache Tomcat is developed in an open and participatory environment and released under the Apache Software License. This project has nothing to do with Ubuntu, but this description uses the word "Ubuntu" for the purpose of testing search results.', '2004-09-24 20:58:00.655518', 'http://tomcat.apache.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 17, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (2, 2, 2, 'unassigned', 'unassigned syncs', 'unassigned syncs', 'syncs still not assigned to a real product', 'unassigned syncs, will not be processed, to be moved to real projects ASAP.', '2004-09-24 20:58:00.674409', 'http://archive.apache.org/dist/tomcat', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, false, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 17, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (3, 3, 2, 'arch-mirrors', 'Arch mirrors', 'Arch archive mirrors', 'Arch Archive Mirroring project.', 'Arch archive full-archive mirror tasks', '2004-09-24 20:58:00.691047', 'http://arch.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 15, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (4, 4, 12, 'firefox', 'Mozilla Firefox', 'Mozilla Firefox', 'The Mozilla Firefox web browser', 'The Mozilla Firefox web browser', '2004-09-24 20:58:02.185708', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, false, true, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 20, 10, 10, true, NULL, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (1, 1, 17, 'tomcat', 'Tomcat', 'Tomcat', 'The servlet container that is used in the official Reference Implementation for the Java Servlet and JavaServer Pages technologies.', 'Apache Tomcat is developed in an open and participatory environment and released under the Apache Software License. This project has nothing to do with Ubuntu, but this description uses the word "Ubuntu" for the purpose of testing search results.', '2004-09-24 20:58:00.655518', 'http://tomcat.apache.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 17, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (2, 2, 2, 'unassigned', 'unassigned syncs', 'unassigned syncs', 'syncs still not assigned to a real product', 'unassigned syncs, will not be processed, to be moved to real projects ASAP.', '2004-09-24 20:58:00.674409', 'http://archive.apache.org/dist/tomcat', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, false, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 17, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (3, 3, 2, 'arch-mirrors', 'Arch mirrors', 'Arch archive mirrors', 'Arch Archive Mirroring project.', 'Arch archive full-archive mirror tasks', '2004-09-24 20:58:00.691047', 'http://arch.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 15, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (4, 4, 12, 'firefox', 'Mozilla Firefox', 'Mozilla Firefox', 'The Mozilla Firefox web browser', 'The Mozilla Firefox web browser', '2004-09-24 20:58:02.185708', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, false, true, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 20, 10, 10, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (5, 5, 12, 'evolution', 'Evolution', 'The Evolution Groupware Application', 'Evolution is an email client, addressbook and calendar application that is very well integrated with the Gnome desktop. Evolution is the standard mail client in the Ubuntu distribution, and supports all current mail system standards.', 'Recently, Evolution has seen significant work to make it interoperable with the proprietary Microsoft Exchange Server protocols and formats, allowing organisations to replace Outlook on Windows with Evolution and Linux.
 
-The current stable release series of Evolution is 2.0.', '2004-09-24 20:58:02.240163', 'http://www.gnome.org/evolution/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, true, true, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 20, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (6, 5, 12, 'gnome-terminal', 'GNOME Terminal', 'The GNOME Terminal Emulator', 'Gnome Terminal is a simple terminal application for your Gnome desktop. It allows quick access to console applications, supports all console types, and has many useful features such as tabbed consoles (many consoles in a single window with quick switching between them).', 'The Gnome Terminal application fully supports Gnome 2 and is a standard part of the Gnome Desktop.', '2004-09-24 20:58:02.256678', 'http://www.gnome.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, 2, 14, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, 'gnome-terminal', NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (7, 6, 12, 'iso-codes', 'iso-codes', 'The iso-codes', 'foo', 'bar', '2004-09-24 20:58:02.258743', 'http://www.novell.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 13, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (8, 4, 12, 'thunderbird', 'Mozilla Thunderbird', 'Mozilla Thunderbird', 'The Mozilla Thunderbird email client', 'The Mozilla Thunderbird email client', '2004-09-24 20:58:04.478988', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+The current stable release series of Evolution is 2.0.', '2004-09-24 20:58:02.240163', 'http://www.gnome.org/evolution/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, true, true, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 20, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (6, 5, 12, 'gnome-terminal', 'GNOME Terminal', 'The GNOME Terminal Emulator', 'Gnome Terminal is a simple terminal application for your Gnome desktop. It allows quick access to console applications, supports all console types, and has many useful features such as tabbed consoles (many consoles in a single window with quick switching between them).', 'The Gnome Terminal application fully supports Gnome 2 and is a standard part of the Gnome Desktop.', '2004-09-24 20:58:02.256678', 'http://www.gnome.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, 2, 14, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, 'gnome-terminal', NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (7, 6, 12, 'iso-codes', 'iso-codes', 'The iso-codes', 'foo', 'bar', '2004-09-24 20:58:02.258743', 'http://www.novell.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 13, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (8, 4, 12, 'thunderbird', 'Mozilla Thunderbird', 'Mozilla Thunderbird', 'The Mozilla Thunderbird email client', 'The Mozilla Thunderbird email client', '2004-09-24 20:58:04.478988', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (9, 5, 16, 'applets', 'Gnome Applets', 'The Gnome Panel Applets', 'The Gnome Panel Applets are a collection of standard widgets that can be installed on your desktop Panel. These icons act as launchers for applications, or indicators of the status of your machine. For example, panel applets exist to show you your battery status or wifi network signal strength.', 'This is the collection of Panel Applets that is part of the default Gnome release. Additional Panel Applets are available from third parties. A complete set of Panel Applets is included in the Ubuntu OS, for example.
 
-The Gnome Panel team includes Abel Kascinsky, Frederick Wurst and Andreas Andropovitch Axelsson.', '2004-10-03 16:46:09.113721', 'http://www.gnome.org/panel/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 12, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (10, NULL, 2, 'python-gnome2-dev', 'python gnome2 dev', 'python gnome2 dev', 'Python bindings for the GNOME desktop environment', 'Python bindings for the GNOME desktop environment', '2004-09-24 20:58:00.674409', 'http://www.daa.com.au/~james/software/pygtk/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, false, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 18, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (11, 5, 12, 'netapplet', 'NetApplet', 'Network Applet', 'The Novell Network Applet', 'Displays current network status and allows network switching', '2005-03-10 16:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 5, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (12, NULL, 16, 'a52dec', 'a52dec', 'Liba52 Test Decoder', 'a52dec is a test program for liba52.', 'This tool decodes ATSC A/52 streams, and also includes a demultiplexer for mpeg-1 and mpeg-2 program streams. The liba52 source code is always distributed in the a52dec package, to make sure it easier for people to test it.', '2005-04-14 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 6, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (13, 5, 16, 'gnomebaker', 'gnomebaker', 'Gnome Baker', 'Gnome Baker is a CD burning application', 'Gnome Baker burns CDs like there''s no tomorrow', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 11, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (14, NULL, 12, 'bazaar', 'Bazaar', 'Bazaar', 'Bazaar is a distributed revision control system', 'Bazaar is all about source control and double-dashes.', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 10, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (15, NULL, 1, 'alsa-utils', 'alsa-utils', 'ALSA utilities', 'Utilities for configurating and using the Advanced Linux Sound Architecture', '', '2005-09-15 09:05:11.472752', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, true, NULL, false, NULL, 1, true, false, NULL, NULL, NULL, 8, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 1, NULL, NULL, NULL, NULL, 10, 10, 20, true, NULL, NULL, NULL, NULL);
+The Gnome Panel team includes Abel Kascinsky, Frederick Wurst and Andreas Andropovitch Axelsson.', '2004-10-03 16:46:09.113721', 'http://www.gnome.org/panel/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 12, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (10, NULL, 2, 'python-gnome2-dev', 'python gnome2 dev', 'python gnome2 dev', 'Python bindings for the GNOME desktop environment', 'Python bindings for the GNOME desktop environment', '2004-09-24 20:58:00.674409', 'http://www.daa.com.au/~james/software/pygtk/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, false, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 18, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (11, 5, 12, 'netapplet', 'NetApplet', 'Network Applet', 'The Novell Network Applet', 'Displays current network status and allows network switching', '2005-03-10 16:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 5, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (12, NULL, 16, 'a52dec', 'a52dec', 'Liba52 Test Decoder', 'a52dec is a test program for liba52.', 'This tool decodes ATSC A/52 streams, and also includes a demultiplexer for mpeg-1 and mpeg-2 program streams. The liba52 source code is always distributed in the a52dec package, to make sure it easier for people to test it.', '2005-04-14 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 6, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (13, 5, 16, 'gnomebaker', 'gnomebaker', 'Gnome Baker', 'Gnome Baker is a CD burning application', 'Gnome Baker burns CDs like there''s no tomorrow', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 11, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (14, NULL, 12, 'bazaar', 'Bazaar', 'Bazaar', 'Bazaar is a distributed revision control system', 'Bazaar is all about source control and double-dashes.', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 10, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (15, NULL, 1, 'alsa-utils', 'alsa-utils', 'ALSA utilities', 'Utilities for configurating and using the Advanced Linux Sound Architecture', '', '2005-09-15 09:05:11.472752', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, true, NULL, false, NULL, 1, true, false, NULL, NULL, NULL, 8, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 1, NULL, NULL, NULL, NULL, 10, 10, 20, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (16, NULL, 12, 'landscape', 'The Landscape Project', 'The Landscape Project', 'Landscape is a system being developed by Canonical to allow remote management of systems using a web interface.', 'Landscape is a system being developed by Canonical to allow remote management of systems using a web interface. The scope of the project isn''t limited, and will grow up as new features are planned.
 
-The Landscape system consists of two major parts: a client daemon which delivers information to the server and acts on server-provided requests; and a web server responsible for handling communication with clients and the user interface itself.', '2006-07-11 19:59:17.311451', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, 64, NULL, NULL, 9, NULL, NULL, NULL, NULL, false, true, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (17, NULL, 12, 'launchpad', 'Launchpad', 'Launchpad', 'Launchpad is a catalogue of libre software projects and products. Projects registered in the Launchpad are linked to their translations in Rosetta, their bugs in Malone, their RCS imports in Bazaar, and their packages in Soyuz.', 'Launchpad''s design is inspired by the Description of a Project (DOAP) framework by Edd Dumbill, with extensions for actual releases of products.', '2006-11-24 12:48:19.178553', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, NULL, NULL, NULL, 19, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 20, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (18, NULL, 37, 'upstart', 'Upstart', 'The Upstart System Initialization Process', 'Event-based init daemon.', 'upstart is a replacement for the /sbin/init daemon which handles starting of tasks and services during boot, stopping them during shutdown and supervising them while the system is running.', '2007-03-14 18:47:04.891546', 'http://upstart.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 20, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 37, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+The Landscape system consists of two major parts: a client daemon which delivers information to the server and acts on server-provided requests; and a web server responsible for handling communication with clients and the user interface itself.', '2006-07-11 19:59:17.311451', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, 64, NULL, NULL, 9, NULL, NULL, NULL, NULL, false, true, false, 'Internal Canonical project', false, false, NULL, 'User notified of licence policy on 2012-10-08.', false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 4, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (17, NULL, 12, 'launchpad', 'Launchpad', 'Launchpad', 'Launchpad is a catalogue of libre software projects and products. Projects registered in the Launchpad are linked to their translations in Rosetta, their bugs in Malone, their RCS imports in Bazaar, and their packages in Soyuz.', 'Launchpad''s design is inspired by the Description of a Project (DOAP) framework by Edd Dumbill, with extensions for actual releases of products.', '2006-11-24 12:48:19.178553', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, NULL, NULL, NULL, 19, NULL, NULL, NULL, NULL, true, false, false, 'Internal Canonical project', false, false, NULL, 'User notified of licence policy on 2012-10-08.', false, 12, NULL, NULL, NULL, NULL, 20, 10, 10, true, 4, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (18, NULL, 37, 'upstart', 'Upstart', 'The Upstart System Initialization Process', 'Event-based init daemon.', 'upstart is a replacement for the /sbin/init daemon which handles starting of tasks and services during boot, stopping them during shutdown and supervising them while the system is running.', '2007-03-14 18:47:04.891546', 'http://upstart.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 20, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 37, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (19, NULL, 28, 'aptoncd', 'APTonCD', 'APTonCD, Get APT Anywhere', 'A simple yet powerful tool which allows you to create one (or more) CD/DVD-Repository containing all of the packages downloaded via apt-get or aptitude.', 'A GUI-based tool that allows you to create a CD/DVD with all downloaded packages with APT-GET, creating a removable-repository.
 
 With aptoncd you can:
@@ -1832,12 +1832,12 @@
 * Upgrade a lot of computers with same DVD
 * And more is expected...
 
-In the "Create APTonCD" feature we have the possibility to make a CD/DVD with all previously downloaded packages with apt-get or aptitude. It uses apt-cache (/var/cache/apt/archives) and scans for packages and makes a repository in one (or more) CD/DVD, exactly as the previous option.', '2007-03-14 18:53:13.112116', 'http://aptoncd.sourceforge.net/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 21, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 28, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (20, NULL, 14, 'jokosher', 'Jokosher', 'Jokosher Audio Editor', 'Jokosher is a simple yet powerful multi-track studio. With it you can create and record music, podcasts and more, all from an integrated simple environment.', 'Jokosher brings together many sources of audio into a seamless environment where you can record, mix and publish your audio content.', '2007-03-15 20:11:49.501871', 'http://www.jokosher.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, NULL, NULL, NULL, 22, NULL, NULL, NULL, NULL, false, false, false, NULL, false, true, NULL, NULL, false, 14, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+In the "Create APTonCD" feature we have the possibility to make a CD/DVD with all previously downloaded packages with apt-get or aptitude. It uses apt-cache (/var/cache/apt/archives) and scans for packages and makes a repository in one (or more) CD/DVD, exactly as the previous option.', '2007-03-14 18:53:13.112116', 'http://aptoncd.sourceforge.net/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 21, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 28, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (20, NULL, 14, 'jokosher', 'Jokosher', 'Jokosher Audio Editor', 'Jokosher is a simple yet powerful multi-track studio. With it you can create and record music, podcasts and more, all from an integrated simple environment.', 'Jokosher brings together many sources of audio into a seamless environment where you can record, mix and publish your audio content.', '2007-03-15 20:11:49.501871', 'http://www.jokosher.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, NULL, NULL, NULL, 22, NULL, NULL, NULL, NULL, false, false, false, NULL, false, true, NULL, NULL, false, 14, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (21, NULL, 12, 'bzr', 'Bazaar', 'Bazaar Version Control System', 'Bazaar is a distributed revision control system. It allows team members to branch and merge upstream code very easily. Most importantly, it is very robust in handling renames so that merges across radical restructurings of the tree are efficient and correct.', 'Bazaar aims to be a distributed RCS system that the open source community loves to use.
 
-Distributed revision control systems allow multiple people to have their own branch of a project, and merge code efficiently between them. This enables new contributors to immediately have access to the full tools that previously have been limited to just the committers to a project.', '2007-03-27 16:28:27.763632', 'http://bazaar-vcs.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 23, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (22, NULL, 12, 'redfish', 'Redfish', 'Redfish', 'The redfish project.', 'The redfish project.', '2007-04-18 20:58:56.846607', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, 64, NULL, NULL, 24, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+Distributed revision control systems allow multiple people to have their own branch of a project, and merge code efficiently between them. This enables new contributors to immediately have access to the full tools that previously have been limited to just the committers to a project.', '2007-03-27 16:28:27.763632', 'http://bazaar-vcs.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 23, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (22, NULL, 12, 'redfish', 'Redfish', 'Redfish', 'The redfish project.', 'The redfish project.', '2007-04-18 20:58:56.846607', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, 64, NULL, NULL, 24, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (23, 1, 1, 'derby', 'Derby', 'Derby - Java Database', 'Apache Derby, an Apache DB subproject, is an open source relational database implemented entirely in Java and available under the Apache License, Version 2.0.', 'Some key advantages include:
 
     * Derby has a small footprint -- about 2 megabytes for the base engine and embedded JDBC driver.
@@ -1845,9 +1845,9 @@
     * Derby provides an embedded JDBC driver that lets you embed Derby in any Java-based solution.
     * Derby also supports the more familiar client/server mode with the Derby Network Client JDBC driver and Derby Network Server.
     * Derby is easy to install, deploy, and use.
-', '2007-11-19 12:44:30.603892', 'http://db.apache.org/derby/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 25, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 1, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (24, NULL, 243623, 'mega-money-maker', 'Mega Money Maker', 'Sample Commercial Project', 'Proprietary project', NULL, '2008-06-27 14:51:47.366199', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 26, NULL, NULL, NULL, NULL, false, false, false, 'All rights reserved.  Not free.', false, false, NULL, NULL, false, 243623, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (26, NULL, 16, 'obsolete-junk', 'Obsolete Junk', 'The Great Mass of Obsolete Junk', 'If you have junk that you don''t want clogging up your product, dump it here.', NULL, '2009-05-02 21:33:15.310312', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 28, NULL, NULL, NULL, NULL, false, false, false, '(We have them all because we are junk. Junk. Junk I tell you.)', false, false, NULL, NULL, true, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+', '2007-11-19 12:44:30.603892', 'http://db.apache.org/derby/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 25, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 1, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (24, NULL, 243623, 'mega-money-maker', 'Mega Money Maker', 'Sample Commercial Project', 'Proprietary project', NULL, '2008-06-27 14:51:47.366199', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 26, NULL, NULL, NULL, NULL, false, false, false, 'All rights reserved.  Not free.', false, false, NULL, NULL, false, 243623, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (26, NULL, 16, 'obsolete-junk', 'Obsolete Junk', 'The Great Mass of Obsolete Junk', 'If you have junk that you don''t want clogging up your product, dump it here.', NULL, '2009-05-02 21:33:15.310312', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 28, NULL, NULL, NULL, NULL, false, false, false, '(We have them all because we are junk. Junk. Junk I tell you.)', false, false, NULL, NULL, true, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 
 
 ALTER TABLE product ENABLE TRIGGER ALL;
@@ -2198,6 +2198,8 @@
 INSERT INTO accesspolicy (id, product, distribution, type, person) VALUES (64, NULL, 7, 4, NULL);
 INSERT INTO accesspolicy (id, product, distribution, type, person) VALUES (65, NULL, 8, 4, NULL);
 INSERT INTO accesspolicy (id, product, distribution, type, person) VALUES (66, NULL, 9, 4, NULL);
+INSERT INTO accesspolicy (id, product, distribution, type, person) VALUES (67, 16, NULL, 5, NULL);
+INSERT INTO accesspolicy (id, product, distribution, type, person) VALUES (68, 17, NULL, 5, NULL);
 
 
 ALTER TABLE accesspolicy ENABLE TRIGGER ALL;
@@ -2215,6 +2217,8 @@
 
 ALTER TABLE accesspolicygrant DISABLE TRIGGER ALL;
 
+INSERT INTO accesspolicygrant (policy, grantee, grantor, date_created) VALUES (67, 64, 16, '2012-10-08 11:10:30.900457');
+INSERT INTO accesspolicygrant (policy, grantee, grantor, date_created) VALUES (68, 57, 16, '2012-10-08 11:11:02.055363');
 
 
 ALTER TABLE accesspolicygrant ENABLE TRIGGER ALL;
@@ -2226,6 +2230,8 @@
 INSERT INTO accesspolicygrantflat (id, policy, artifact, grantee) VALUES (2, 2, 1, 63);
 INSERT INTO accesspolicygrantflat (id, policy, artifact, grantee) VALUES (3, 48, 2, 64);
 INSERT INTO accesspolicygrantflat (id, policy, artifact, grantee) VALUES (4, 48, 3, 64);
+INSERT INTO accesspolicygrantflat (id, policy, artifact, grantee) VALUES (6, 67, NULL, 64);
+INSERT INTO accesspolicygrantflat (id, policy, artifact, grantee) VALUES (8, 68, NULL, 57);
 
 
 ALTER TABLE accesspolicygrantflat ENABLE TRIGGER ALL;
@@ -3868,6 +3874,8 @@
 
 ALTER TABLE commercialsubscription DISABLE TRIGGER ALL;
 
+INSERT INTO commercialsubscription (id, date_created, date_last_modified, date_starts, date_expires, status, product, registrant, purchaser, whiteboard, sales_system_id) VALUES (1, '2012-10-08 11:09:37.75983', '2012-10-08 11:09:37.75983', '2012-10-08 11:09:37.838229', '2022-01-01 00:00:00', 10, 16, 65, 65, 'Complimentary 30 day subscription. -- Launchpad 2012-10-08', 'complimentary-30-day-2012-10-08 11:09:37.838229+00:00');
+INSERT INTO commercialsubscription (id, date_created, date_last_modified, date_starts, date_expires, status, product, registrant, purchaser, whiteboard, sales_system_id) VALUES (2, '2012-10-08 11:09:46.861812', '2012-10-08 11:09:46.861812', '2012-10-08 11:09:46.912691', '2022-01-01 00:00:00', 10, 17, 65, 65, 'Complimentary 30 day subscription. -- Launchpad 2012-10-08', 'complimentary-30-day-2012-10-08 11:09:46.912691+00:00');
 
 
 ALTER TABLE commercialsubscription ENABLE TRIGGER ALL;
@@ -9080,6 +9088,8 @@
 INSERT INTO productlicense (id, product, license) VALUES (24, 19, 160);
 INSERT INTO productlicense (id, product, license) VALUES (25, 20, 160);
 INSERT INTO productlicense (id, product, license) VALUES (26, 21, 160);
+INSERT INTO productlicense (id, product, license) VALUES (27, 16, 1000);
+INSERT INTO productlicense (id, product, license) VALUES (28, 17, 1000);
 
 
 ALTER TABLE productlicense ENABLE TRIGGER ALL;

=== modified file 'database/sampledata/current.sql'
--- database/sampledata/current.sql	2012-09-28 15:45:03 +0000
+++ database/sampledata/current.sql	2012-10-09 00:01:20 +0000
@@ -1,6 +1,6 @@
 -- Copyright 2010-2011 Canonical Ltd.  This software is licensed under the
 -- GNU Affero General Public License version 3 (see the file LICENSE).
--- Created using pg_dump (PostgreSQL) 9.1.5
+-- Created using pg_dump (PostgreSQL) 9.1.4
 
 SET check_function_bodies = false;
 SET client_encoding = 'UTF8';
@@ -1798,30 +1798,30 @@
 
 ALTER TABLE product DISABLE TRIGGER ALL;
 
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (1, 1, 17, 'tomcat', 'Tomcat', 'Tomcat', 'The servlet container that is used in the official Reference Implementation for the Java Servlet and JavaServer Pages technologies.', 'Apache Tomcat is developed in an open and participatory environment and released under the Apache Software License. This project has nothing to do with Ubuntu, but this description uses the word "Ubuntu" for the purpose of testing search results.', '2004-09-24 20:58:00.655518', 'http://tomcat.apache.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 17, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (2, 2, 2, 'unassigned', 'unassigned syncs', 'unassigned syncs', 'syncs still not assigned to a real product', 'unassigned syncs, will not be processed, to be moved to real projects ASAP.', '2004-09-24 20:58:00.674409', 'http://archive.apache.org/dist/tomcat', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, false, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 17, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (3, 3, 2, 'arch-mirrors', 'Arch mirrors', 'Arch archive mirrors', 'Arch Archive Mirroring project.', 'Arch archive full-archive mirror tasks', '2004-09-24 20:58:00.691047', 'http://arch.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 15, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (4, 4, 12, 'firefox', 'Mozilla Firefox', 'Mozilla Firefox', 'The Mozilla Firefox web browser', 'The Mozilla Firefox web browser', '2004-09-24 20:58:02.185708', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, false, true, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (1, 1, 17, 'tomcat', 'Tomcat', 'Tomcat', 'The servlet container that is used in the official Reference Implementation for the Java Servlet and JavaServer Pages technologies.', 'Apache Tomcat is developed in an open and participatory environment and released under the Apache Software License. This project has nothing to do with Ubuntu, but this description uses the word "Ubuntu" for the purpose of testing search results.', '2004-09-24 20:58:00.655518', 'http://tomcat.apache.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 17, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (2, 2, 2, 'unassigned', 'unassigned syncs', 'unassigned syncs', 'syncs still not assigned to a real product', 'unassigned syncs, will not be processed, to be moved to real projects ASAP.', '2004-09-24 20:58:00.674409', 'http://archive.apache.org/dist/tomcat', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, false, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 17, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (3, 3, 2, 'arch-mirrors', 'Arch mirrors', 'Arch archive mirrors', 'Arch Archive Mirroring project.', 'Arch archive full-archive mirror tasks', '2004-09-24 20:58:00.691047', 'http://arch.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 15, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (4, 4, 12, 'firefox', 'Mozilla Firefox', 'Mozilla Firefox', 'The Mozilla Firefox web browser', 'The Mozilla Firefox web browser', '2004-09-24 20:58:02.185708', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, false, true, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (5, 5, 12, 'evolution', 'Evolution', 'The Evolution Groupware Application', 'Evolution is an email client, addressbook and calendar application that is very well integrated with the Gnome desktop. Evolution is the standard mail client in the Ubuntu distribution, and supports all current mail system standards.', 'Recently, Evolution has seen significant work to make it interoperable with the proprietary Microsoft Exchange Server protocols and formats, allowing organisations to replace Outlook on Windows with Evolution and Linux.
 
-The current stable release series of Evolution is 2.0.', '2004-09-24 20:58:02.240163', 'http://www.gnome.org/evolution/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, true, true, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 20, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (6, 5, 12, 'gnome-terminal', 'GNOME Terminal', 'The GNOME Terminal Emulator', 'Gnome Terminal is a simple terminal application for your Gnome desktop. It allows quick access to console applications, supports all console types, and has many useful features such as tabbed consoles (many consoles in a single window with quick switching between them).', 'The Gnome Terminal application fully supports Gnome 2 and is a standard part of the Gnome Desktop.', '2004-09-24 20:58:02.256678', 'http://www.gnome.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, 2, 14, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, 'gnome-terminal', NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (7, 6, 12, 'iso-codes', 'iso-codes', 'The iso-codes', 'foo', 'bar', '2004-09-24 20:58:02.258743', 'http://www.novell.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 13, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (8, 4, 12, 'thunderbird', 'Mozilla Thunderbird', 'Mozilla Thunderbird', 'The Mozilla Thunderbird email client', 'The Mozilla Thunderbird email client', '2004-09-24 20:58:04.478988', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+The current stable release series of Evolution is 2.0.', '2004-09-24 20:58:02.240163', 'http://www.gnome.org/evolution/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, 1, 100, true, true, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 20, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (6, 5, 12, 'gnome-terminal', 'GNOME Terminal', 'The GNOME Terminal Emulator', 'Gnome Terminal is a simple terminal application for your Gnome desktop. It allows quick access to console applications, supports all console types, and has many useful features such as tabbed consoles (many consoles in a single window with quick switching between them).', 'The Gnome Terminal application fully supports Gnome 2 and is a standard part of the Gnome Desktop.', '2004-09-24 20:58:02.256678', 'http://www.gnome.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, 2, 14, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, 'gnome-terminal', NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (7, 6, 12, 'iso-codes', 'iso-codes', 'The iso-codes', 'foo', 'bar', '2004-09-24 20:58:02.258743', 'http://www.novell.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 13, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (8, 4, 12, 'thunderbird', 'Mozilla Thunderbird', 'Mozilla Thunderbird', 'The Mozilla Thunderbird email client', 'The Mozilla Thunderbird email client', '2004-09-24 20:58:04.478988', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (9, 5, 16, 'applets', 'Gnome Applets', 'The Gnome Panel Applets', 'The Gnome Panel Applets are a collection of standard widgets that can be installed on your desktop Panel. These icons act as launchers for applications, or indicators of the status of your machine. For example, panel applets exist to show you your battery status or wifi network signal strength.', 'This is the collection of Panel Applets that is part of the default Gnome release. Additional Panel Applets are available from third parties. A complete set of Panel Applets is included in the Ubuntu OS, for example.
 
-The Gnome Panel team includes Abel Kascinsky, Frederick Wurst and Andreas Andropovitch Axelsson.', '2004-10-03 16:46:09.113721', 'http://www.gnome.org/panel/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 12, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (10, NULL, 2, 'python-gnome2-dev', 'python gnome2 dev', 'python gnome2 dev', 'Python bindings for the GNOME desktop environment', 'Python bindings for the GNOME desktop environment', '2004-09-24 20:58:00.674409', 'http://www.daa.com.au/~james/software/pygtk/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, false, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 18, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (11, 5, 12, 'netapplet', 'NetApplet', 'Network Applet', 'The Novell Network Applet', 'Displays current network status and allows network switching', '2005-03-10 16:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 5, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (12, NULL, 16, 'a52dec', 'a52dec', 'Liba52 Test Decoder', 'a52dec is a test program for liba52.', 'This tool decodes ATSC A/52 streams, and also includes a demultiplexer for mpeg-1 and mpeg-2 program streams. The liba52 source code is always distributed in the a52dec package, to make sure it easier for people to test it.', '2005-04-14 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 6, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (13, 5, 16, 'gnomebaker', 'gnomebaker', 'Gnome Baker', 'Gnome Baker is a CD burning application', 'Gnome Baker burns CDs like there''s no tomorrow', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 11, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (14, NULL, 12, 'bazaar', 'Bazaar', 'Bazaar', 'Bazaar is a distributed revision control system', 'Bazaar is all about source control and double-dashes.', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 10, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (15, NULL, 1, 'alsa-utils', 'alsa-utils', 'ALSA utilities', 'Utilities for configurating and using the Advanced Linux Sound Architecture', '', '2005-09-15 09:05:11.472752', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, true, NULL, false, NULL, 1, true, false, NULL, NULL, NULL, 8, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 1, NULL, NULL, NULL, NULL, 10, 10, 20, true, NULL, NULL, NULL, NULL);
+The Gnome Panel team includes Abel Kascinsky, Frederick Wurst and Andreas Andropovitch Axelsson.', '2004-10-03 16:46:09.113721', 'http://www.gnome.org/panel/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 12, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (10, NULL, 2, 'python-gnome2-dev', 'python gnome2 dev', 'python gnome2 dev', 'Python bindings for the GNOME desktop environment', 'Python bindings for the GNOME desktop environment', '2004-09-24 20:58:00.674409', 'http://www.daa.com.au/~james/software/pygtk/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, false, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 18, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 2, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (11, 5, 12, 'netapplet', 'NetApplet', 'Network Applet', 'The Novell Network Applet', 'Displays current network status and allows network switching', '2005-03-10 16:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 5, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (12, NULL, 16, 'a52dec', 'a52dec', 'Liba52 Test Decoder', 'a52dec is a test program for liba52.', 'This tool decodes ATSC A/52 streams, and also includes a demultiplexer for mpeg-1 and mpeg-2 program streams. The liba52 source code is always distributed in the a52dec package, to make sure it easier for people to test it.', '2005-04-14 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 6, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (13, 5, 16, 'gnomebaker', 'gnomebaker', 'Gnome Baker', 'Gnome Baker is a CD burning application', 'Gnome Baker burns CDs like there''s no tomorrow', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 11, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (14, NULL, 12, 'bazaar', 'Bazaar', 'Bazaar', 'Bazaar is a distributed revision control system', 'Bazaar is all about source control and double-dashes.', '2005-08-26 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 10, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (15, NULL, 1, 'alsa-utils', 'alsa-utils', 'ALSA utilities', 'Utilities for configurating and using the Advanced Linux Sound Architecture', '', '2005-09-15 09:05:11.472752', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, true, NULL, false, NULL, 1, true, false, NULL, NULL, NULL, 8, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 1, NULL, NULL, NULL, NULL, 10, 10, 20, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (16, NULL, 12, 'landscape', 'The Landscape Project', 'The Landscape Project', 'Landscape is a system being developed by Canonical to allow remote management of systems using a web interface.', 'Landscape is a system being developed by Canonical to allow remote management of systems using a web interface. The scope of the project isn''t limited, and will grow up as new features are planned.
 
-The Landscape system consists of two major parts: a client daemon which delivers information to the server and acts on server-provided requests; and a web server responsible for handling communication with clients and the user interface itself.', '2006-07-11 19:59:17.311451', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, 64, NULL, NULL, 9, NULL, NULL, NULL, NULL, false, true, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (17, NULL, 12, 'launchpad', 'Launchpad', 'Launchpad', 'Launchpad is a catalogue of libre software projects and products. Projects registered in the Launchpad are linked to their translations in Rosetta, their bugs in Malone, their RCS imports in Bazaar, and their packages in Soyuz.', 'Launchpad''s design is inspired by the Description of a Project (DOAP) framework by Edd Dumbill, with extensions for actual releases of products.', '2006-11-24 12:48:19.178553', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, NULL, NULL, NULL, 19, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (18, NULL, 37, 'upstart', 'Upstart', 'The Upstart System Initialization Process', 'Event-based init daemon.', 'upstart is a replacement for the /sbin/init daemon which handles starting of tasks and services during boot, stopping them during shutdown and supervising them while the system is running.', '2007-03-14 18:47:04.891546', 'http://upstart.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 20, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 37, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+The Landscape system consists of two major parts: a client daemon which delivers information to the server and acts on server-provided requests; and a web server responsible for handling communication with clients and the user interface itself.', '2006-07-11 19:59:17.311451', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, 64, NULL, NULL, 9, NULL, NULL, NULL, NULL, false, true, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 4, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (17, NULL, 12, 'launchpad', 'Launchpad', 'Launchpad', 'Launchpad is a catalogue of libre software projects and products. Projects registered in the Launchpad are linked to their translations in Rosetta, their bugs in Malone, their RCS imports in Bazaar, and their packages in Soyuz.', 'Launchpad''s design is inspired by the Description of a Project (DOAP) framework by Edd Dumbill, with extensions for actual releases of products.', '2006-11-24 12:48:19.178553', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, NULL, NULL, NULL, 19, NULL, NULL, NULL, NULL, true, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 4, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (18, NULL, 37, 'upstart', 'Upstart', 'The Upstart System Initialization Process', 'Event-based init daemon.', 'upstart is a replacement for the /sbin/init daemon which handles starting of tasks and services during boot, stopping them during shutdown and supervising them while the system is running.', '2007-03-14 18:47:04.891546', 'http://upstart.ubuntu.com/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 20, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 37, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (19, NULL, 28, 'aptoncd', 'APTonCD', 'APTonCD, Get APT Anywhere', 'A simple yet powerful tool which allows you to create one (or more) CD/DVD-Repository containing all of the packages downloaded via apt-get or aptitude.', 'A GUI-based tool that allows you to create a CD/DVD with all downloaded packages with APT-GET, creating a removable-repository.
 
 With aptoncd you can:
@@ -1831,12 +1831,12 @@
 * Upgrade a lot of computers with same DVD
 * And more is expected...
 
-In the "Create APTonCD" feature we have the possibility to make a CD/DVD with all previously downloaded packages with apt-get or aptitude. It uses apt-cache (/var/cache/apt/archives) and scans for packages and makes a repository in one (or more) CD/DVD, exactly as the previous option.', '2007-03-14 18:53:13.112116', 'http://aptoncd.sourceforge.net/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 21, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 28, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (20, NULL, 14, 'jokosher', 'Jokosher', 'Jokosher Audio Editor', 'Jokosher is a simple yet powerful multi-track studio. With it you can create and record music, podcasts and more, all from an integrated simple environment.', 'Jokosher brings together many sources of audio into a seamless environment where you can record, mix and publish your audio content.', '2007-03-15 20:11:49.501871', 'http://www.jokosher.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, NULL, NULL, NULL, 22, NULL, NULL, NULL, NULL, false, false, false, NULL, false, true, NULL, NULL, false, 14, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+In the "Create APTonCD" feature we have the possibility to make a CD/DVD with all previously downloaded packages with apt-get or aptitude. It uses apt-cache (/var/cache/apt/archives) and scans for packages and makes a repository in one (or more) CD/DVD, exactly as the previous option.', '2007-03-14 18:53:13.112116', 'http://aptoncd.sourceforge.net/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 21, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 28, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (20, NULL, 14, 'jokosher', 'Jokosher', 'Jokosher Audio Editor', 'Jokosher is a simple yet powerful multi-track studio. With it you can create and record music, podcasts and more, all from an integrated simple environment.', 'Jokosher brings together many sources of audio into a seamless environment where you can record, mix and publish your audio content.', '2007-03-15 20:11:49.501871', 'http://www.jokosher.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, NULL, NULL, NULL, 22, NULL, NULL, NULL, NULL, false, false, false, NULL, false, true, NULL, NULL, false, 14, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (21, NULL, 12, 'bzr', 'Bazaar', 'Bazaar Version Control System', 'Bazaar is a distributed revision control system. It allows team members to branch and merge upstream code very easily. Most importantly, it is very robust in handling renames so that merges across radical restructurings of the tree are efficient and correct.', 'Bazaar aims to be a distributed RCS system that the open source community loves to use.
 
-Distributed revision control systems allow multiple people to have their own branch of a project, and merge code efficiently between them. This enables new contributors to immediately have access to the full tools that previously have been limited to just the committers to a project.', '2007-03-27 16:28:27.763632', 'http://bazaar-vcs.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 23, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (22, NULL, 12, 'redfish', 'Redfish', 'Redfish', 'The redfish project.', 'The redfish project.', '2007-04-18 20:58:56.846607', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, 64, NULL, NULL, 24, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+Distributed revision control systems allow multiple people to have their own branch of a project, and merge code efficiently between them. This enables new contributors to immediately have access to the full tools that previously have been limited to just the committers to a project.', '2007-03-27 16:28:27.763632', 'http://bazaar-vcs.org/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 23, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (22, NULL, 12, 'redfish', 'Redfish', 'Redfish', 'The redfish project.', 'The redfish project.', '2007-04-18 20:58:56.846607', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, true, 64, NULL, NULL, 24, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 12, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (23, 1, 1, 'derby', 'Derby', 'Derby - Java Database', 'Apache Derby, an Apache DB subproject, is an open source relational database implemented entirely in Java and available under the Apache License, Version 2.0.', 'Some key advantages include:
 
     * Derby has a small footprint -- about 2 megabytes for the base engine and embedded JDBC driver.
@@ -1844,9 +1844,9 @@
     * Derby provides an embedded JDBC driver that lets you embed Derby in any Java-based solution.
     * Derby also supports the more familiar client/server mode with the Derby Network Client JDBC driver and Derby Network Server.
     * Derby is easy to install, deploy, and use.
-', '2007-11-19 12:44:30.603892', 'http://db.apache.org/derby/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 25, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 1, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (24, NULL, 243623, 'mega-money-maker', 'Mega Money Maker', 'Sample Commercial Project', 'Proprietary project', NULL, '2008-06-27 14:51:47.366199', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 26, NULL, NULL, NULL, NULL, false, false, false, 'All rights reserved.  Not free.', false, false, NULL, NULL, false, 243623, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
-INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (26, NULL, 16, 'obsolete-junk', 'Obsolete Junk', 'The Great Mass of Obsolete Junk', 'If you have junk that you don''t want clogging up your product, dump it here.', NULL, '2009-05-02 21:33:15.310312', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 28, NULL, NULL, NULL, NULL, false, false, false, '(We have them all because we are junk. Junk. Junk I tell you.)', false, false, NULL, NULL, true, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, NULL, NULL, NULL, NULL);
+', '2007-11-19 12:44:30.603892', 'http://db.apache.org/derby/', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 25, NULL, NULL, NULL, NULL, false, false, false, NULL, false, false, NULL, NULL, false, 1, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (24, NULL, 243623, 'mega-money-maker', 'Mega Money Maker', 'Sample Commercial Project', 'Proprietary project', NULL, '2008-06-27 14:51:47.366199', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 26, NULL, NULL, NULL, NULL, false, false, false, 'All rights reserved.  Not free.', false, false, NULL, NULL, false, 243623, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
+INSERT INTO product (id, project, owner, name, displayname, title, summary, description, datecreated, homepageurl, screenshotsurl, wikiurl, listurl, programminglang, downloadurl, lastdoap, sourceforgeproject, freshmeatproject, reviewed, active, fti, autoupdate, translationgroup, translationpermission, official_rosetta, official_malone, bug_supervisor, driver, bugtracker, development_focus, homepage_content, icon, mugshot, logo, official_answers, private_bugs, private_specs, license_info, official_blueprints, enable_bug_expiration, bug_reporting_guidelines, reviewer_whiteboard, license_approved, registrant, remote_product, translation_focus, max_bug_heat, bug_reported_acknowledgement, answers_usage, blueprints_usage, translations_usage, enable_bugfiling_duplicate_search, branch_sharing_policy, bug_sharing_policy, specification_sharing_policy, information_type) VALUES (26, NULL, 16, 'obsolete-junk', 'Obsolete Junk', 'The Great Mass of Obsolete Junk', 'If you have junk that you don''t want clogging up your product, dump it here.', NULL, '2009-05-02 21:33:15.310312', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, true, NULL, false, NULL, 1, false, false, NULL, NULL, NULL, 28, NULL, NULL, NULL, NULL, false, false, false, '(We have them all because we are junk. Junk. Junk I tell you.)', false, false, NULL, NULL, true, 16, NULL, NULL, NULL, NULL, 10, 10, 10, true, 1, NULL, NULL, NULL);
 
 
 ALTER TABLE product ENABLE TRIGGER ALL;
@@ -2194,6 +2194,8 @@
 INSERT INTO accesspolicy (id, product, distribution, type, person) VALUES (62, NULL, 5, 4, NULL);
 INSERT INTO accesspolicy (id, product, distribution, type, person) VALUES (63, NULL, 7, 4, NULL);
 INSERT INTO accesspolicy (id, product, distribution, type, person) VALUES (64, NULL, 8, 4, NULL);
+INSERT INTO accesspolicy (id, product, distribution, type, person) VALUES (67, 16, NULL, 5, NULL);
+INSERT INTO accesspolicy (id, product, distribution, type, person) VALUES (68, 17, NULL, 5, NULL);
 
 
 ALTER TABLE accesspolicy ENABLE TRIGGER ALL;
@@ -2211,6 +2213,8 @@
 
 ALTER TABLE accesspolicygrant DISABLE TRIGGER ALL;
 
+INSERT INTO accesspolicygrant (policy, grantee, grantor, date_created) VALUES (67, 64, 16, '2012-10-08 11:10:30.900457');
+INSERT INTO accesspolicygrant (policy, grantee, grantor, date_created) VALUES (68, 57, 16, '2012-10-08 11:11:02.055363');
 
 
 ALTER TABLE accesspolicygrant ENABLE TRIGGER ALL;
@@ -2222,6 +2226,8 @@
 INSERT INTO accesspolicygrantflat (id, policy, artifact, grantee) VALUES (2, 2, 1, 63);
 INSERT INTO accesspolicygrantflat (id, policy, artifact, grantee) VALUES (3, 48, 2, 64);
 INSERT INTO accesspolicygrantflat (id, policy, artifact, grantee) VALUES (4, 48, 3, 64);
+INSERT INTO accesspolicygrantflat (id, policy, artifact, grantee) VALUES (5, 67, NULL, 64);
+INSERT INTO accesspolicygrantflat (id, policy, artifact, grantee) VALUES (6, 68, NULL, 57);
 
 
 ALTER TABLE accesspolicygrantflat ENABLE TRIGGER ALL;
@@ -3802,6 +3808,8 @@
 
 ALTER TABLE commercialsubscription DISABLE TRIGGER ALL;
 
+INSERT INTO commercialsubscription (id, date_created, date_last_modified, date_starts, date_expires, status, product, registrant, purchaser, whiteboard, sales_system_id) VALUES (1, '2012-10-08 11:09:37.75983', '2012-10-08 11:09:37.75983', '2012-10-08 11:09:37.838229', '2022-01-01 00:00:00', 10, 16, 65, 65, 'Complimentary 30 day subscription. -- Launchpad 2012-10-08', 'complimentary-30-day-2012-10-08 11:09:37.838229+00:00');
+INSERT INTO commercialsubscription (id, date_created, date_last_modified, date_starts, date_expires, status, product, registrant, purchaser, whiteboard, sales_system_id) VALUES (2, '2012-10-08 11:09:46.861812', '2012-10-08 11:09:46.861812', '2012-10-08 11:09:46.912691', '2022-01-01 00:00:00', 10, 17, 65, 65, 'Complimentary 30 day subscription. -- Launchpad 2012-10-08', 'complimentary-30-day-2012-10-08 11:09:46.912691+00:00');
 
 
 ALTER TABLE commercialsubscription ENABLE TRIGGER ALL;
@@ -9006,6 +9014,8 @@
 INSERT INTO productlicense (id, product, license) VALUES (24, 19, 160);
 INSERT INTO productlicense (id, product, license) VALUES (25, 20, 160);
 INSERT INTO productlicense (id, product, license) VALUES (26, 21, 160);
+INSERT INTO productlicense (id, product, license) VALUES (27, 16, 1000);
+INSERT INTO productlicense (id, product, license) VALUES (28, 17, 1000);
 
 
 ALTER TABLE productlicense ENABLE TRIGGER ALL;

=== modified file 'lib/lp/code/browser/branchlisting.py'
--- lib/lp/code/browser/branchlisting.py	2012-10-04 01:28:34 +0000
+++ lib/lp/code/browser/branchlisting.py	2012-10-09 00:01:20 +0000
@@ -73,7 +73,6 @@
 from lp.code.browser.branch import BranchMirrorMixin
 from lp.code.browser.branchmergeproposallisting import ActiveReviewsView
 from lp.code.browser.branchmergequeuelisting import HasMergeQueuesMenuMixin
-from lp.code.browser.branchvisibilitypolicy import BranchVisibilityPolicyMixin
 from lp.code.browser.summary import BranchCountSummaryView
 from lp.code.enums import (
     BranchLifecycleStatus,
@@ -497,8 +496,7 @@
             return "listing sortable"
 
 
-class BranchListingView(LaunchpadFormView, FeedsMixin,
-                        BranchVisibilityPolicyMixin):
+class BranchListingView(LaunchpadFormView, FeedsMixin):
     """A base class for views of branch listings."""
     schema = IBranchListingFilter
     field_names = ['lifecycle', 'sort_by']
@@ -1029,7 +1027,6 @@
         'list_branches',
         'active_reviews',
         'code_import',
-        'branch_visibility',
         ]
     extra_attributes = [
         'active_review_count',
@@ -1053,11 +1050,6 @@
             'Active reviews')
         return Link('+activereviews', text, site='code')
 
-    @enabled_with_permission('launchpad.Commercial')
-    def branch_visibility(self):
-        text = 'Define branch visibility'
-        return Link('+branchvisibility', text, icon='edit', site='mainsite')
-
     def code_import(self):
         text = 'Import a branch'
         return Link('+new-import', text, icon='add', site='code')

=== removed file 'lib/lp/code/browser/branchvisibilitypolicy.py'
--- lib/lp/code/browser/branchvisibilitypolicy.py	2012-01-01 02:58:52 +0000
+++ lib/lp/code/browser/branchvisibilitypolicy.py	1970-01-01 00:00:00 +0000
@@ -1,192 +0,0 @@
-# Copyright 2009-2011 Canonical Ltd.  This software is licensed under the
-# GNU Affero General Public License version 3 (see the file LICENSE).
-
-"""The view classes for handling branch visibility policies."""
-
-__metaclass__ = type
-
-__all__ = [
-    'AddBranchVisibilityTeamPolicyView',
-    'RemoveBranchVisibilityTeamPolicyView',
-    'BranchVisibilityPolicyMixin',
-    'BranchVisibilityPolicyView',
-    ]
-
-from zope.app.form import CustomWidgetFactory
-from zope.formlib import form
-from zope.schema import (
-    Choice,
-    List,
-    )
-from zope.schema.vocabulary import (
-    SimpleTerm,
-    SimpleVocabulary,
-    )
-
-from lp import _
-from lp.app.browser.launchpadform import (
-    action,
-    custom_widget,
-    LaunchpadFormView,
-    )
-from lp.app.widgets.itemswidgets import (
-    LabeledMultiCheckBoxWidget,
-    LaunchpadRadioWidgetWithDescription,
-    )
-from lp.code.enums import (
-    BranchVisibilityRule,
-    TeamBranchVisibilityRule,
-    )
-from lp.code.interfaces.branchvisibilitypolicy import (
-    IBranchVisibilityTeamPolicy,
-    )
-from lp.services.propertycache import cachedproperty
-from lp.services.webapp import (
-    canonical_url,
-    LaunchpadView,
-    )
-
-
-class BaseBranchVisibilityTeamPolicyView(LaunchpadFormView):
-    """Used as a base class for the add and remove view."""
-
-    schema = IBranchVisibilityTeamPolicy
-
-    @property
-    def adapters(self):
-        return {IBranchVisibilityTeamPolicy: self.context}
-
-    @property
-    def next_url(self):
-        return canonical_url(self.context, view_name='+branchvisibility')
-
-    cancel_url = next_url
-
-
-class AddBranchVisibilityTeamPolicyView(BaseBranchVisibilityTeamPolicyView):
-    """Simple form view to add branch visibility policy items."""
-
-    page_title = label = "Set branch visibility policy for team"
-
-    initial_values = {'rule': TeamBranchVisibilityRule.PRIVATE}
-    custom_widget('rule', LaunchpadRadioWidgetWithDescription)
-
-    def showSetDefaultPublic(self, action=None):
-        """Show if using inherited policy, or currently forbidden."""
-        base_rule = self.context.getBaseBranchVisibilityRule()
-        return (self.context.isUsingInheritedBranchVisibilityPolicy() or
-                base_rule == BranchVisibilityRule.FORBIDDEN)
-
-    def showSetDefaultForbidden(self, action=None):
-        """Show if using inherited policy, or currently forbidden."""
-        base_rule = self.context.getBaseBranchVisibilityRule()
-        return (self.context.isUsingInheritedBranchVisibilityPolicy() or
-                base_rule != BranchVisibilityRule.FORBIDDEN)
-
-    @action(_('Set Default Public'), name='set_default_public',
-            condition=showSetDefaultPublic,
-            validator=LaunchpadFormView.validate_none)
-    def set_default_public_action(self, action, data):
-        """Make the default policy public."""
-        self.context.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.PUBLIC)
-
-    @action(_('Set Default Forbidden'), name='set_default_forbidden',
-            condition=showSetDefaultForbidden,
-            validator=LaunchpadFormView.validate_none)
-    def set_default_forbidden_action(self, action, data):
-        """Make the default policy forbidden."""
-        self.context.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-
-    @action(_('Set Team Policy'), name='set_team_policy')
-    def set_team_policy_action(self, action, data):
-        "Set the branch visibility rule for the team."
-        team = data['team']
-        rule = BranchVisibilityRule.items[data['rule'].name]
-        self.context.setBranchVisibilityTeamPolicy(team, rule)
-
-
-class RemoveBranchVisibilityTeamPolicyView(BaseBranchVisibilityTeamPolicyView):
-    """The view to remove zero or more branch visibility policy items."""
-
-    page_title = label = "Remove branch visibility policy for teams"
-
-    def _policyDescription(self, item):
-        """The text visible to the user displayed by the widget."""
-        if item.team is None:
-            teamname = "Everyone"
-        else:
-            teamname = item.team.displayname
-
-        return "%s: %s" % (teamname, item.rule.title)
-
-    def _policyToken(self, item):
-        """The text used as the value of the widget."""
-        if item.team is None:
-            return '+everyone'
-        else:
-            return item.team.name
-
-    def _currentPolicyItemsField(self):
-        """Create the policy items field.
-
-        The vocabulary is created from the policy items.  This is then shown
-        using the multi checkbox widget.
-        """
-        terms = [SimpleTerm(item, self._policyToken(item),
-                            self._policyDescription(item))
-                 for item in self.context.getBranchVisibilityTeamPolicies()]
-
-        return form.Fields(
-            List(
-                __name__='policy_items',
-                title=_("Policy Items"),
-                value_type=Choice(vocabulary=SimpleVocabulary(terms)),
-                required=True),
-            render_context=self.render_context,
-            custom_widget=CustomWidgetFactory(LabeledMultiCheckBoxWidget))
-
-    def setUpFields(self):
-        """Override the setup to define own fields."""
-        self.form_fields = self._currentPolicyItemsField()
-
-    @action(_('Remove Selected Policy Items'), name='remove')
-    def remove_action(self, action, data):
-        """Remove selected policy items."""
-        for item in data['policy_items']:
-            self.context.removeTeamFromBranchVisibilityPolicy(item.team)
-
-
-class BranchVisibilityPolicyMixin:
-    """Mixin class providing visibility rules."""
-    @property
-    def base_visibility_rule(self):
-        return self.context.getBaseBranchVisibilityRule()
-
-    @property
-    def team_policies(self):
-        """The policy items that have a valid team."""
-        return [item for item in self.items if item.team is not None]
-
-    @cachedproperty
-    def items(self):
-        return self.context.getBranchVisibilityTeamPolicies()
-
-
-class BranchVisibilityPolicyView(LaunchpadView,
-                                 BranchVisibilityPolicyMixin):
-    """Simple view for displaying branch visibility policies."""
-
-    @property
-    def page_title(self):
-        name = self.context.displayname
-        return 'Set branch visibility policy for %s' % name
-
-    @property
-    def can_remove_items(self):
-        """You cannot remove items if using inherited policy or
-        if there is only the default policy item.
-        """
-        return (len(self.items) > 0 and
-                not self.context.isUsingInheritedBranchVisibilityPolicy())

=== modified file 'lib/lp/code/browser/configure.zcml'
--- lib/lp/code/browser/configure.zcml	2012-09-12 06:13:41 +0000
+++ lib/lp/code/browser/configure.zcml	2012-10-09 00:01:20 +0000
@@ -594,27 +594,6 @@
         name="+branch-listing"
         template="../templates/branch-listing.pt"
         permission="zope.Public"/>
-    <browser:page
-        name="+branchvisibility"
-        for="lp.code.interfaces.branchvisibilitypolicy.IHasBranchVisibilityPolicy"
-        facet="overview"
-        class="lp.code.browser.branchvisibilitypolicy.BranchVisibilityPolicyView"
-        permission="launchpad.Commercial"
-        template="../templates/branch-visibility.pt"/>
-    <browser:page
-        name="+addbranchvisibilitypolicy"
-        for="lp.code.interfaces.branchvisibilitypolicy.IHasBranchVisibilityPolicy"
-        facet="overview"
-        class="lp.code.browser.branchvisibilitypolicy.AddBranchVisibilityTeamPolicyView"
-        permission="launchpad.Commercial"
-        template="../../app/templates/generic-edit.pt"/>
-    <browser:page
-        name="+removebranchvisibilitypolicy"
-        for="lp.code.interfaces.branchvisibilitypolicy.IHasBranchVisibilityPolicy"
-        facet="overview"
-        class="lp.code.browser.branchvisibilitypolicy.RemoveBranchVisibilityTeamPolicyView"
-        permission="launchpad.Commercial"
-        template="../../app/templates/generic-edit.pt"/>
     <browser:menus
         classes="
             BranchContextMenu

=== modified file 'lib/lp/code/browser/tests/test_branch.py'
--- lib/lp/code/browser/tests/test_branch.py	2012-10-08 10:07:11 +0000
+++ lib/lp/code/browser/tests/test_branch.py	2012-10-09 00:01:20 +0000
@@ -34,7 +34,6 @@
     )
 from lp.code.enums import (
     BranchType,
-    BranchVisibilityRule,
     )
 from lp.registry.enums import BranchSharingPolicy
 from lp.registry.interfaces.accesspolicy import IAccessPolicySource
@@ -45,7 +44,6 @@
 from lp.services.webapp.publisher import canonical_url
 from lp.services.webapp.servers import LaunchpadTestRequest
 from lp.testing import (
-    admin_logged_in,
     BrowserTestCase,
     login,
     login_person,
@@ -894,68 +892,6 @@
 
     layer = DatabaseFunctionalLayer
 
-    def test_allowed_owner_is_ok(self):
-        # A branch's owner can be changed to a team permitted by the
-        # visibility policy.
-        person = self.factory.makePerson()
-        branch = self.factory.makeProductBranch(owner=person)
-        team = self.factory.makeTeam(
-            owner=person, displayname="Permitted team")
-        branch.product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-        branch.product.setBranchVisibilityTeamPolicy(
-            team, BranchVisibilityRule.PRIVATE)
-        browser = self.getUserBrowser(
-            canonical_url(branch) + '/+edit', user=person)
-        browser.getControl("Owner").displayValue = ["Permitted team"]
-        browser.getControl("Change Branch").click()
-        with person_logged_in(person):
-            self.assertEquals(team, branch.owner)
-
-    def test_forbidden_owner_is_error(self):
-        # An error is displayed if a branch's owner is changed to
-        # a value forbidden by the visibility policy.
-        product = self.factory.makeLegacyProduct(displayname='Some Product')
-        person = self.factory.makePerson()
-        branch = self.factory.makeBranch(product=product, owner=person)
-        self.factory.makeTeam(
-            owner=person, displayname="Forbidden team")
-        branch.product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-        branch.product.setBranchVisibilityTeamPolicy(
-            person, BranchVisibilityRule.PRIVATE)
-        browser = self.getUserBrowser(
-            canonical_url(branch) + '/+edit', user=person)
-        browser.getControl("Owner").displayValue = ["Forbidden team"]
-        browser.getControl("Change Branch").click()
-        self.assertThat(
-            browser.contents,
-            Contains(
-                'Forbidden team is not allowed to own branches in '
-                'Some Product.'))
-        with person_logged_in(person):
-            self.assertEquals(person, branch.owner)
-
-    def test_private_owner_is_ok(self):
-        # A branch's owner can be changed to a private team permitted by the
-        # visibility policy.
-        person = self.factory.makePerson()
-        product = self.factory.makeLegacyProduct()
-        branch = self.factory.makeProductBranch(product=product, owner=person)
-        team = self.factory.makeTeam(
-            owner=person, displayname="Private team",
-            visibility=PersonVisibility.PRIVATE)
-        branch.product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-        branch.product.setBranchVisibilityTeamPolicy(
-            team, BranchVisibilityRule.PRIVATE)
-        browser = self.getUserBrowser(
-            canonical_url(branch) + '/+edit', user=person)
-        browser.getControl("Owner").displayValue = ["Private team"]
-        browser.getControl("Change Branch").click()
-        with person_logged_in(person):
-            self.assertEquals(team, branch.owner)
-
     def test_branch_target_widget_renders_junk(self):
         # The branch target widget renders correctly for a junk branch.
         person = self.factory.makePerson()
@@ -967,7 +903,7 @@
     def test_branch_target_widget_renders_product(self):
         # The branch target widget renders correctly for a product branch.
         person = self.factory.makePerson()
-        product = self.factory.makeLegacyProduct()
+        product = self.factory.makeProduct()
         branch = self.factory.makeProductBranch(product=product, owner=person)
         login_person(person)
         view = create_initialized_view(branch, name='+edit')
@@ -986,7 +922,7 @@
     def test_branch_target_widget_saves_junk(self):
         # The branch target widget can retarget to a junk branch.
         person = self.factory.makePerson()
-        product = self.factory.makeLegacyProduct()
+        product = self.factory.makeProduct()
         branch = self.factory.makeProductBranch(product=product, owner=person)
         login_person(person)
         form = {
@@ -1165,27 +1101,10 @@
             product=product, stacked_on=stacked_on_branch,
             owner=product.owner,
             information_type=InformationType.PRIVATESECURITY)
-        with admin_logged_in():
-            branch.product.setBranchVisibilityTeamPolicy(
-                branch.owner, BranchVisibilityRule.PRIVATE)
         self.assertShownTypes(
             [InformationType.PRIVATESECURITY, InformationType.USERDATA],
             branch)
 
-    def test_private_branch(self):
-        # Branches on projects with a private policy can be made private.
-        branch = self.factory.makeBranch(
-            information_type=InformationType.PUBLIC)
-        with admin_logged_in():
-            branch.product.setBranchVisibilityTeamPolicy(
-                branch.owner, BranchVisibilityRule.PRIVATE)
-        self.assertShownTypes(
-            [InformationType.PUBLIC,
-             InformationType.PUBLICSECURITY,
-             InformationType.PRIVATESECURITY,
-             InformationType.USERDATA],
-            branch)
-
     def test_branch_for_project_with_embargoed_and_proprietary(self):
         # Branches for commercial projects which have a policy of embargoed or
         # proprietary allow only embargoed and proprietary types.

=== modified file 'lib/lp/code/browser/tests/test_branchlisting.py'
--- lib/lp/code/browser/tests/test_branchlisting.py	2012-10-04 01:09:26 +0000
+++ lib/lp/code/browser/tests/test_branchlisting.py	2012-10-09 00:01:20 +0000
@@ -27,16 +27,12 @@
     PersonProductSubscribedBranchesView,
     SourcePackageBranchesView,
     )
-from lp.code.enums import BranchVisibilityRule
 from lp.code.model.branch import Branch
 from lp.code.model.seriessourcepackagebranch import (
     SeriesSourcePackageBranchSet,
     )
 from lp.registry.enums import PersonVisibility
-from lp.registry.interfaces.person import (
-    IPerson,
-    IPersonSet,
-    )
+from lp.registry.interfaces.person import IPerson
 from lp.registry.interfaces.personproduct import IPersonProductFactory
 from lp.registry.interfaces.pocket import PackagePublishingPocket
 from lp.registry.model.person import Owner
@@ -46,7 +42,6 @@
 from lp.services.webapp.servers import LaunchpadTestRequest
 from lp.testing import (
     BrowserTestCase,
-    celebrity_logged_in,
     login_person,
     normalize_whitespace,
     person_logged_in,
@@ -65,7 +60,6 @@
     find_main_content,
     find_tag_by_id,
     )
-from lp.testing.sampledata import ADMIN_EMAIL
 from lp.testing.views import (
     create_initialized_view,
     create_view,
@@ -697,60 +691,6 @@
         super(TestProjectGroupBranches, self).setUp()
         self.project = self.factory.makeProject()
 
-    def test_project_with_no_branch_visibility_rule(self):
-        view = create_initialized_view(
-            self.project, name="+branches", rootsite='code')
-        privacy_portlet = find_tag_by_id(view(), 'privacy')
-        text = extract_text(privacy_portlet)
-        expected = """
-            Inherited branch visibility for all projects in .* is Public.
-            """
-        self.assertTextMatchesExpressionIgnoreWhitespace(
-            expected, text)
-
-    def test_project_with_private_branch_visibility_rule(self):
-        self.project.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-        view = create_initialized_view(
-            self.project, name="+branches", rootsite='code')
-        privacy_portlet = find_tag_by_id(view(), 'privacy')
-        text = extract_text(privacy_portlet)
-        expected = """
-            Inherited branch visibility for all projects in .* is Forbidden.
-            """
-        self.assertTextMatchesExpressionIgnoreWhitespace(
-            expected, text)
-
-    def _testBranchVisibilityLink(self, user):
-        login_person(user)
-        view = create_initialized_view(
-            self.project, name="+branches", rootsite='code',
-            principal=user)
-        action_portlet = find_tag_by_id(view(), 'action-portlet')
-        text = extract_text(action_portlet)
-        expected = '.*Define branch visibility.*'
-        self.assertTextMatchesExpressionIgnoreWhitespace(
-            expected, text)
-
-    def test_branch_visibility_link_admin(self):
-        # An admin will be displayed a link to define branch visibility in the
-        # action portlet.
-        admin = getUtility(IPersonSet).getByEmail(ADMIN_EMAIL)
-        self._testBranchVisibilityLink(admin)
-
-    def test_branch_visibility_link_commercial_admin(self):
-        # A commercial admin will be displayed a link to define branch
-        # visibility in the action portlet.
-        with celebrity_logged_in('commercial_admin') as admin:
-            self._testBranchVisibilityLink(admin)
-
-    def test_branch_visibility_link_non_admin(self):
-        # A non-admin will not see the action portlet.
-        view = create_initialized_view(
-            self.project, name="+branches", rootsite='code')
-        action_portlet = find_tag_by_id(view(), 'action-portlet')
-        self.assertIs(None, action_portlet)
-
     def test_no_branches_gets_message_not_listing(self):
         # If there are no product branches on the project's products, then
         # the view shows the no code hosting message instead of a listing.

=== modified file 'lib/lp/code/browser/tests/test_branchmergeproposal.py'
--- lib/lp/code/browser/tests/test_branchmergeproposal.py	2012-09-18 18:36:09 +0000
+++ lib/lp/code/browser/tests/test_branchmergeproposal.py	2012-10-09 00:01:20 +0000
@@ -46,7 +46,6 @@
 from lp.code.browser.codereviewcomment import CodeReviewDisplayComment
 from lp.code.enums import (
     BranchMergeProposalStatus,
-    BranchVisibilityRule,
     CodeReviewVote,
     )
 from lp.code.model.diff import PreviewDiff
@@ -213,9 +212,7 @@
         owner = self.bmp.source_branch.owner
         if not is_branch_visible:
             branch = self.bmp.source_branch
-            branch.product.setBranchVisibilityTeamPolicy(
-                branch.owner, BranchVisibilityRule.PRIVATE)
-            branch.setPrivate(True, owner)
+            branch.transitionToInformationType(InformationType.USERDATA, owner)
 
         # Set up some review requests.
         public_person1 = self.factory.makePerson()

=== modified file 'lib/lp/code/browser/tests/test_product.py'
--- lib/lp/code/browser/tests/test_product.py	2012-10-08 10:07:11 +0000
+++ lib/lp/code/browser/tests/test_product.py	2012-10-09 00:01:20 +0000
@@ -18,12 +18,10 @@
     InformationType,
     ServiceUsage,
     )
-from lp.code.enums import (
-    BranchType,
-    BranchVisibilityRule,
-    )
+from lp.code.enums import BranchType
 from lp.code.interfaces.revision import IRevisionSet
 from lp.code.publisher import CodeLayer
+from lp.registry.enums import BranchSharingPolicy
 from lp.services.webapp import canonical_url
 from lp.testing import (
     ANONYMOUS,
@@ -364,20 +362,18 @@
             contents, 'portlet-product-codestatistics'))
 
     def test_is_private(self):
-        team_owner = self.factory.makePerson()
-        team = self.factory.makeTeam(team_owner)
-        product = self.factory.makeLegacyProduct(owner=team_owner)
-        branch = self.factory.makeProductBranch(product=product)
+        product = self.factory.makeProduct(
+            branch_sharing_policy=BranchSharingPolicy.PROPRIETARY)
+        branch = self.factory.makeProductBranch(
+            product=product, owner=product.owner)
         login_person(product.owner)
         product.development_focus.branch = branch
-        product.setBranchVisibilityTeamPolicy(
-            team, BranchVisibilityRule.PRIVATE)
         view = create_initialized_view(
             product, '+code-index', rootsite='code',
             principal=product.owner)
         text = extract_text(find_tag_by_id(view.render(), 'privacy'))
         expected = (
-            "New branches for %(name)s are Private.*"
+            "New branches for %(name)s are Proprietary.*"
             % dict(name=product.displayname))
         self.assertTextMatchesExpressionIgnoreWhitespace(expected, text)
 

=== modified file 'lib/lp/code/configure.zcml'
--- lib/lp/code/configure.zcml	2012-10-02 07:08:13 +0000
+++ lib/lp/code/configure.zcml	2012-10-09 00:01:20 +0000
@@ -540,12 +540,6 @@
     <allow interface="lp.code.interfaces.branch.IBranchListingQueryOptimiser"/>
   </securedutility>
 
-  <!-- BranchVisibilityPolicy -->
-
-  <class class="lp.code.model.branchvisibilitypolicy.BranchVisibilityTeamPolicy">
-    <allow interface="lp.code.interfaces.branchvisibilitypolicy.IBranchVisibilityTeamPolicy"/>
-  </class>
-
   <!-- BranchDelta -->
 
   <class class="lp.code.adapters.branch.BranchDelta">

=== removed file 'lib/lp/code/doc/branch-visibility-policy.txt'
--- lib/lp/code/doc/branch-visibility-policy.txt	2011-12-24 17:49:30 +0000
+++ lib/lp/code/doc/branch-visibility-policy.txt	1970-01-01 00:00:00 +0000
@@ -1,358 +0,0 @@
-= Branch Visibility Policy =
-
-The branch visibility policy is used to define the default visibility
-of branches when they are created.
-
-Both projects and products can define a branch visibility policy.  If a
-policy does not exist for a product, it uses the policy defined by its
-project (if it exists).
-
-The information is saved in the database table BranchVisibilityPolicy.
-This table effectively creates tuples of (ProjectGroup or Product, Team,
-Policy).  Since there is no team that is used to define everyone, the
-non-specifying of a team means *everyone*.
-
-The Policy is defined by the enumerated type BranchVisibilityRule.
-
-    >>> from lp.code.enums import BranchVisibilityRule
-
-There are currently four visibility policies:
- * Public - branches are public by default for the specified team.
- * Private - branches are private by default for the specified team.
- * Private only - branches are private by default, and the owner
-     of the branch is not able to make them public.
- * Forbidden - members of the specified team are not able to create
-     branches in the context.  This is only valid as a base policy
-     that applies to everyone, and cannot be used as a selective
-     discriminator against certain teams.
-
-    >>> for item in BranchVisibilityRule.items:
-    ...     print item.title
-    Public
-    Private
-    Private only
-    Forbidden
-
-
-== IHasBranchVisibilityPolicy ==
-
-The interface IHasBranchVisibilityPolicy is used to define the public
-interface for modifying the branch visibility policy items.  Both
-IProjectGroup and IProduct inherit from this interface as both projects and
-products can set branch visibility policies.
-
-    >>> from zope.component import getUtility
-    >>> from lp.services.webapp.testing import verifyObject
-    >>> from lp.registry.interfaces.projectgroup import IProjectGroupSet
-    >>> from lp.code.interfaces.branchvisibilitypolicy import (
-    ...     IHasBranchVisibilityPolicy)
-    >>> project_set = getUtility(IProjectGroupSet)
-    >>> mozilla = project_set.getByName('mozilla')
-    >>> IHasBranchVisibilityPolicy.providedBy(mozilla)
-    True
-    >>> verifyObject(IHasBranchVisibilityPolicy, mozilla)
-    True
-
-    >>> firefox, thunderbird = list(mozilla.products)
-
-    >>> IHasBranchVisibilityPolicy.providedBy(firefox)
-    True
-    >>> verifyObject(IHasBranchVisibilityPolicy, firefox)
-    True
-
-
-== Teams to work with ==
-
-    >>> from lp.registry.interfaces.person import IPersonSet
-    >>> person_set = getUtility(IPersonSet)
-    >>> launchpad_team = person_set.getByName('launchpad')
-    >>> ubuntu_gnome_team = person_set.getByName('name18')
-    >>> from lp.registry.interfaces.product import IProductSet
-    >>> launchpad = getUtility(IProductSet).getByName('launchpad')
-    >>> evolution = getUtility(IProductSet).getByName('evolution')
-
-    >>> def teamname(team):
-    ...     if team is None:
-    ...         return "*everyone*"
-    ...     else:
-    ...         return team.displayname
-
-    >>> def print_team_policies(context):
-    ...     for item in context.getBranchVisibilityTeamPolicies():
-    ...         print "%s: %s" % (teamname(item.team), item.rule.title)
-
-
-== Default policy ==
-
-There is an implicit policy defined for all contexts.  The implicit
-policy is that everyone can create public branches.  The implicit policy
-is not returned with the items attribute.  In order to override this
-implicit policy you need to explicitly define a policy for everyone, and
-this is done by specifying None for the team.
-
-    >>> print_team_policies(evolution)
-    >>> print evolution.getBaseBranchVisibilityRule().title
-    Public
-    >>> evolution.setBranchVisibilityTeamPolicy(
-    ...     None, BranchVisibilityRule.PUBLIC)
-    >>> print_team_policies(evolution)
-    *everyone*: Public
-    >>> print evolution.getBaseBranchVisibilityRule().title
-    Public
-
-
-== Setting the policy for teams ==
-
-Setting the policy for a team overrides any existing policy that may
-exist for that team.
-
-    >>> evolution.setBranchVisibilityTeamPolicy(
-    ...     launchpad_team, BranchVisibilityRule.PUBLIC)
-    >>> print_team_policies(evolution)
-    *everyone*: Public
-    Launchpad Developers: Public
-
-Setting again replaces the policy.
-
-    >>> evolution.setBranchVisibilityTeamPolicy(
-    ...     launchpad_team, BranchVisibilityRule.PRIVATE)
-    >>> print_team_policies(evolution)
-    *everyone*: Public
-    Launchpad Developers: Private
-
-Setting the policy for *everyone* is done by passing None for the team.
-
-    >>> evolution.setBranchVisibilityTeamPolicy(
-    ...     None, BranchVisibilityRule.FORBIDDEN)
-    >>> print_team_policies(evolution)
-    *everyone*: Forbidden
-    Launchpad Developers: Private
-    >>> print evolution.getBaseBranchVisibilityRule().title
-    Forbidden
-
-
-== Removing teams from the policy object ==
-
-    >>> evolution.removeTeamFromBranchVisibilityPolicy(launchpad_team)
-    >>> print_team_policies(evolution)
-    *everyone*: Forbidden
-
-Attempting to remove a team that doesn't exist is allowed, but does not
-change the state of the policy object.
-
-    >>> evolution.removeTeamFromBranchVisibilityPolicy(launchpad_team)
-    >>> print_team_policies(evolution)
-    *everyone*: Forbidden
-
-In order to remove a policy assigned to everyone you pass None in for
-the team name.
-
-    >>> evolution.removeTeamFromBranchVisibilityPolicy(None)
-    >>> print_team_policies(evolution)
-
-
-== Listing the team policies ==
-
-Team policies are listed in alphabetical order of the team display name
-with the policy for *everybody* being first.
-
-    >>> evolution.setBranchVisibilityTeamPolicy(
-    ...     ubuntu_gnome_team, BranchVisibilityRule.PRIVATE)
-    >>> evolution.setBranchVisibilityTeamPolicy(
-    ...     launchpad_team, BranchVisibilityRule.PRIVATE)
-    >>> print_team_policies(evolution)
-    Launchpad Developers: Private
-    Ubuntu Gnome Team: Private
-
-    >>> evolution.setBranchVisibilityTeamPolicy(
-    ...     None, BranchVisibilityRule.PUBLIC)
-    >>> print_team_policies(evolution)
-    *everyone*: Public
-    Launchpad Developers: Private
-    Ubuntu Gnome Team: Private
-
-
-== Inherited team policies ==
-
-Products can inherit the branch visibility team policies of their
-projects.  If a product has no project, then there are no inherited
-team policies to inherit.
-
-    >>> print mozilla.isUsingInheritedBranchVisibilityPolicy()
-    False
-
-The inherited behaviour is only used if there are no explicit team
-policies set.
-
-    >>> print thunderbird.isUsingInheritedBranchVisibilityPolicy()
-    True
-
-Since the Launchpad product doesn't have a project associated with it,
-there is no inherited policy.
-
-    >>> print launchpad.isUsingInheritedBranchVisibilityPolicy()
-    False
-
-Adding a team to the mozilla project will also affect products
-associated with the mozilla project that are inheriting the project's
-branch policy.
-
-    >>> mozilla.setBranchVisibilityTeamPolicy(
-    ...     None, BranchVisibilityRule.FORBIDDEN)
-    >>> mozilla.setBranchVisibilityTeamPolicy(
-    ...     ubuntu_gnome_team, BranchVisibilityRule.PRIVATE)
-
-    >>> print_team_policies(mozilla)
-    *everyone*: Forbidden
-    Ubuntu Gnome Team: Private
-
-    >>> print_team_policies(thunderbird)
-    *everyone*: Forbidden
-    Ubuntu Gnome Team: Private
-
-In order to avoid inheriting the policy of the project, there just needs
-to be an explicit team policy for the product.  This explicit team
-policy could even be the same as the default policy.
-
-    >>> thunderbird.setBranchVisibilityTeamPolicy(
-    ...     None, BranchVisibilityRule.PUBLIC)
-    >>> print thunderbird.isUsingInheritedBranchVisibilityPolicy()
-    False
-    >>> print_team_policies(thunderbird)
-    *everyone*: Public
-
-
-== Determining the defined policy for a team ==
-
-You can get the defined policy for any given team using the method
-getBranchVisibilityRuleForTeam.  If there is not a policy explicity
-defined, then None is returned.
-
-    >>> print mozilla.getBranchVisibilityRuleForTeam(ubuntu_gnome_team).title
-    Private
-    >>> print mozilla.getBranchVisibilityRuleForTeam(None).title
-    Forbidden
-    >>> print mozilla.getBranchVisibilityRuleForTeam(launchpad_team)
-    None
-
-
-== Policy checks during branch creation ==
-
-The branch visibility policy is checked during branch creation through
-the relevant IBranchNamespace implementation.
-
-    >>> from lp.testing import login
-    >>> login('foo.bar@xxxxxxxxxxxxx')
-    >>> evolution.setBranchVisibilityTeamPolicy(
-    ...     None, BranchVisibilityRule.FORBIDDEN)
-    >>> vcs_imports_team = person_set.getByName('vcs-imports')
-    >>> evolution.setBranchVisibilityTeamPolicy(
-    ...     vcs_imports_team, BranchVisibilityRule.PUBLIC)
-    >>> print_team_policies(evolution)
-    *everyone*: Forbidden
-    Launchpad Developers: Private
-    Ubuntu Gnome Team: Private
-    VCS imports: Public
-
-    >>> foo_bar = person_set.getByEmail("foo.bar@xxxxxxxxxxxxx")
-    >>> stevea = person_set.getByName("stevea")
-    >>> ddaa = person_set.getByName("ddaa")
-
-When creating a branch, both the creator and owner need to be specified.
-The creator must be in the team of the owner in order to create a branch
-in the owner's namespace.
-
-If there is a policy that applies specificly to the owner of the branch,
-then that policy is applied for the branch.  This is to handle the
-situation where TeamA is a member of TeamB, TeamA has a PUBLIC policy,
-and TeamB has a PRIVATE policy.  By pushing to TeamA's branch area, the
-PUBLIC policy is used.
-
-If a owner is a member of more than one team that has a specified policy
-the PRIVATE and PRIVATE_ONLY override PUBLIC policies.
-
-If the owner is a member of more than one team that has PRIVATE or
-PRIVATE_ONLY set as the policy, then the branch is created private, and
-no team is subscribed to it as we can't guess which team the user means
-to have the visibility.
-
-Extensive behavioural tests for the determination of branch visibility
-can be found in the file:
-  lib/canonical/launchpad/database/tests/test_branchset.py
-
-Foo Bar is a member of all the teams.
-
-    >>> foo_bar.inTeam(launchpad_team)
-    True
-    >>> foo_bar.inTeam(ubuntu_gnome_team)
-    True
-    >>> foo_bar.inTeam(vcs_imports_team)
-    True
-
-If Foo Bar is creating a branch for evolution, the branch would be
-created as a private branch, but since there are two teams that specify
-privacy, the branch is created so only Foo Bar can see it.  It is up to
-Foo Bar to subscribe the appropriate team at a later date.
-
-    >>> branch = factory.makeProductBranch(
-    ...     name="testing-1", owner=foo_bar, product=evolution)
-    >>> branch.private
-    True
-    >>> branch.subscribers.count()
-    1
-
-Steve is a member of the Ubuntu Gnome Team, but not the Launchpad
-Developers team, so branches that are created by Steve are private
-and are subscribed to by the Ubuntu Gnome Team.
-
-    >>> stevea.inTeam(launchpad_team)
-    False
-    >>> stevea.inTeam(ubuntu_gnome_team)
-    True
-    >>> stevea.inTeam(vcs_imports_team)
-    False
-
-    >>> branch = factory.makeProductBranch(
-    ...     name="testing-2", owner=stevea, product=evolution)
-    >>> branch.private
-    True
-    >>> for name in sorted([subscriber.displayname for subscriber
-    ...                     in branch.subscribers]):
-    ...     print name
-    Steve Alexander
-    Ubuntu Gnome Team
-
-Since David is a member of VCS Imports but not a member of the other two
-teams that have private branches, David's branch will be public.
-
-    >>> ddaa.inTeam(launchpad_team)
-    False
-    >>> ddaa.inTeam(ubuntu_gnome_team)
-    False
-    >>> ddaa.inTeam(vcs_imports_team)
-    True
-
-    >>> branch = factory.makeProductBranch(
-    ...     name="testing-3", owner=ddaa, product=evolution)
-    >>> branch.private
-    False
-    >>> branch.subscribers.count()
-    1
-
-People that are not members of any of the specified teams get the base
-visibility policy, which for this product is Forbidden.
-
-    >>> no_priv = person_set.getByEmail("no-priv@xxxxxxxxxxxxx")
-
-    >>> no_priv.inTeam(launchpad_team)
-    False
-    >>> no_priv.inTeam(ubuntu_gnome_team)
-    False
-    >>> no_priv.inTeam(vcs_imports_team)
-    False
-
-    >>> branch = factory.makeProductBranch(
-    ...     name="testing-4", owner=no_priv, product=evolution)
-    Traceback (most recent call last):
-    ...
-    BranchCreationForbidden: You cannot create branches ...

=== modified file 'lib/lp/code/enums.py'
--- lib/lp/code/enums.py	2011-09-13 10:07:59 +0000
+++ lib/lp/code/enums.py	2012-10-09 00:01:20 +0000
@@ -11,7 +11,6 @@
     'BranchSubscriptionDiffSize',
     'BranchSubscriptionNotificationLevel',
     'BranchType',
-    'BranchVisibilityRule',
     'CodeImportEventDataType',
     'CodeImportEventType',
     'CodeImportJobState',
@@ -22,7 +21,6 @@
     'CodeReviewNotificationLevel',
     'CodeReviewVote',
     'RevisionControlSystems',
-    'TeamBranchVisibilityRule',
     'UICreatableBranchType',
     ]
 
@@ -305,40 +303,6 @@
         """)
 
 
-class BranchVisibilityRule(DBEnumeratedType):
-    """Branch Visibility Rules for defining branch visibility policy."""
-
-    PUBLIC = DBItem(1, """
-        Public
-
-        Branches are public by default.
-        """)
-
-    PRIVATE = DBItem(2, """
-        Private
-
-        Branches are private by default.
-        """)
-
-    PRIVATE_ONLY = DBItem(3, """
-        Private only
-
-        Branches are private by default. Branch owners are not able
-        to change the visibility of the branches to public.
-        """)
-
-    FORBIDDEN = DBItem(4, """
-        Forbidden
-
-        Users are not able to create branches in the context.
-        """)
-
-
-class TeamBranchVisibilityRule(EnumeratedType):
-    """The valid policy rules for teams."""
-    use_template(BranchVisibilityRule, exclude='FORBIDDEN')
-
-
 class RevisionControlSystems(DBEnumeratedType):
     """Revision Control Systems
 

=== removed file 'lib/lp/code/interfaces/branchvisibilitypolicy.py'
--- lib/lp/code/interfaces/branchvisibilitypolicy.py	2012-01-06 11:08:30 +0000
+++ lib/lp/code/interfaces/branchvisibilitypolicy.py	1970-01-01 00:00:00 +0000
@@ -1,102 +0,0 @@
-# Copyright 2009 Canonical Ltd.  This software is licensed under the
-# GNU Affero General Public License version 3 (see the file LICENSE).
-
-# pylint: disable-msg=E0211,E0213
-
-"""BranchVisibilityPolicy interfaces."""
-
-__metaclass__ = type
-
-__all__ = [
-    'IHasBranchVisibilityPolicy',
-    'IBranchVisibilityTeamPolicy',
-    'InvalidVisibilityPolicy',
-    ]
-
-from zope.interface import Interface
-from zope.schema import Choice
-
-from lp import _
-from lp.code.enums import TeamBranchVisibilityRule
-from lp.services.fields import PersonChoice
-
-
-class InvalidVisibilityPolicy(Exception):
-    """The default policy can only be public or forbidden.
-
-    If an attempt is made to set it to something other than one of these two
-    values, this exception is raised.
-    """
-
-
-class IHasBranchVisibilityPolicy(Interface):
-    """Implemented by types that need to define default branch visibility."""
-
-    def getBranchVisibilityTeamPolicies():
-        """The branch visibility team policy items."""
-
-    def getBaseBranchVisibilityRule():
-        """Return the BranchVisibilityRule that applies to everyone."""
-
-    def getBranchVisibilityRuleForTeam(team):
-        """Return the defined visibility rule for the team.
-
-        If there is no explicit team policy set for the team, return None.
-        """
-
-    def getBranchVisibilityRuleForBranch(branch):
-        """Return the most specific visibility rule for a branch.
-
-        The owner of the branch is used to determine the team that the rule
-        applies to.  If there is a rule defined for the actual branch owner
-        then that rule is used in preference to other rules only applicable
-        through team membership.
-
-        If there are a number of rules that apply for the owner of the branch
-        then the most restrictive rule is returned.
-        """
-
-    def isUsingInheritedBranchVisibilityPolicy():
-        """Return True if using policy from the inherited context.
-
-        Products that don't have any explicitly defined team policies, use
-        the team policies defined for the project if the product has an
-        associated project.  ProjectGroups can't have inherited policies.
-        """
-
-    def setBranchVisibilityTeamPolicy(team, rule):
-        """Set the policy for the team.
-
-        Each team can only have one policy.
-
-        :param team: The team to associate with the rule.
-        :param rule: A value of the BranchVisibilityRule enumerated type.
-        """
-
-    def removeTeamFromBranchVisibilityPolicy(team):
-        """Remove the team from the policy list.
-
-        If the team exists in the items list it is removed.  If the team
-        isn't in the items list, the method returns and the state of the
-        object is unchanged.  Attempting to remove the team None returns
-        the policy for everyone back to the default, which is Public.
-        """
-
-
-class IBranchVisibilityTeamPolicy(Interface):
-    """A branch visibility team policy is defined as a team and a rule.
-
-    The team may be null, in which case the rule applies to everyone.
-    """
-
-    team = PersonChoice(
-        title=_('Team'), required=True, vocabulary='ValidPersonOrTeam',
-        description=_("Specifies the team that the policy applies to. "
-                      "If None then the policy applies to everyone."))
-
-    rule = Choice(
-        title=_('Rule'), vocabulary=TeamBranchVisibilityRule,
-        default=TeamBranchVisibilityRule.PUBLIC,
-        description=_(
-        "The visibility rule defines the default branch visibility for "
-        "members of the team specified."))

=== modified file 'lib/lp/code/model/branchnamespace.py'
--- lib/lp/code/model/branchnamespace.py	2012-09-28 06:25:44 +0000
+++ lib/lp/code/model/branchnamespace.py	2012-10-09 00:01:20 +0000
@@ -22,7 +22,6 @@
 
 from lp.app.enums import (
     FREE_INFORMATION_TYPES,
-    FREE_PRIVATE_INFORMATION_TYPES,
     InformationType,
     NON_EMBARGOED_INFORMATION_TYPES,
     PUBLIC_INFORMATION_TYPES,
@@ -32,7 +31,6 @@
     BranchLifecycleStatus,
     BranchSubscriptionDiffSize,
     BranchSubscriptionNotificationLevel,
-    BranchVisibilityRule,
     CodeReviewNotificationLevel,
     )
 from lp.code.errors import (
@@ -162,18 +160,6 @@
             control_format=control_format, distroseries=distroseries,
             sourcepackagename=sourcepackagename)
 
-        # Implicit subscriptions are to enable teams to see private branches
-        # as soon as they are created.  The subscriptions can be edited at
-        # a later date if desired.
-        implicit_subscription = self.getPrivacySubscriber()
-        if implicit_subscription is not None:
-            branch.subscribe(
-                implicit_subscription,
-                BranchSubscriptionNotificationLevel.NOEMAIL,
-                BranchSubscriptionDiffSize.NODIFF,
-                CodeReviewNotificationLevel.NOEMAIL,
-                registrant)
-
         # The registrant of the branch should also be automatically subscribed
         # in order for them to get code review notifications.  The implicit
         # registrant subscription does not cause email to be sent about
@@ -304,13 +290,7 @@
 
     def getDefaultInformationType(self, who=None):
         """See `IBranchNamespace`."""
-        if InformationType.USERDATA in self.getAllowedInformationTypes(who):
-            return InformationType.USERDATA
-        return InformationType.PUBLIC
-
-    def getPrivacySubscriber(self):
-        """See `IBranchNamespace`."""
-        raise NotImplementedError(self.getPrivacySubscriber)
+        raise NotImplementedError
 
 
 class PersonalNamespace(_BaseNamespace):
@@ -334,18 +314,26 @@
         """See `IBranchNamespace`."""
         return '~%s/+junk' % self.owner.name
 
+    @property
+    def _is_private_team(self):
+        return (
+            self.owner.is_team
+            and self.owner.visibility == PersonVisibility.PRIVATE)
+
     def getAllowedInformationTypes(self, who=None):
         """See `IBranchNamespace`."""
         # Private teams get private branches, everyone else gets public ones.
-        if (self.owner.is_team
-            and self.owner.visibility == PersonVisibility.PRIVATE):
+        if self._is_private_team:
             return FREE_INFORMATION_TYPES
         else:
             return PUBLIC_INFORMATION_TYPES
 
-    def getPrivacySubscriber(self):
+    def getDefaultInformationType(self, who=None):
         """See `IBranchNamespace`."""
-        return None
+        if self._is_private_team:
+            return InformationType.USERDATA
+        else:
+            return InformationType.PUBLIC
 
     @property
     def target(self):
@@ -379,110 +367,34 @@
         """See `IBranchNamespace`."""
         return IBranchTarget(self.product)
 
-    @property
-    def _using_branchvisibilitypolicy(self):
-        return self.product.branch_sharing_policy is None
-
-    def _getRelatedPolicies(self):
-        """Return the privacy policies relating to the owner."""
-        policies = self.product.getBranchVisibilityTeamPolicies()
-        return [
-            policy for policy in policies
-            if self.owner.inTeam(policy.team)]
-
-    def _getRelatedPrivatePolicies(self):
-        """Return the related policies for privacy."""
-        return [policy for policy in self._getRelatedPolicies()
-                if policy.rule in (BranchVisibilityRule.PRIVATE,
-                                   BranchVisibilityRule.PRIVATE_ONLY)]
-
-    def getPrivacySubscriber(self):
-        """See `IBranchNamespace`."""
-        # New branch_sharing_policy-based privacy doesn't
-        # require a privacy subscriber, as branches are shared through
-        # AccessPolicyGrants.
-        if not self._using_branchvisibilitypolicy:
-            return None
-
-        # If there is a rule defined for the owner, then there is no privacy
-        # subscriber.
-        rule = self.product.getBranchVisibilityRuleForTeam(self.owner)
-        if rule is not None:
-            return None
-        # If there is one private policy for the user, then return the team
-        # for that policy, otherwise there is no privacy subsciber as we don't
-        # guess the user's intent.
-        private_policies = self._getRelatedPrivatePolicies()
-        if len(private_policies) == 1:
-            return private_policies[0].team
-        else:
-            return None
-
     def getAllowedInformationTypes(self, who=None):
         """See `IBranchNamespace`."""
-        if not self._using_branchvisibilitypolicy:
-            # The project uses the new simplified branch_sharing_policy
-            # rules, so check them.
-
-            # Some policies require that the branch owner or current user have
-            # full access to an information type. If it's required and the user
-            # doesn't hold it, no information types are legal.
-            required_grant = BRANCH_POLICY_REQUIRED_GRANTS[
-                self.product.branch_sharing_policy]
-            if (required_grant is not None
-                and not getUtility(IService, 'sharing').checkPillarAccess(
-                    self.product, required_grant, self.owner)
-                and (who is None
-                    or not getUtility(IService, 'sharing').checkPillarAccess(
-                        self.product, required_grant, who))):
-                return []
-
-            return BRANCH_POLICY_ALLOWED_TYPES[
-                self.product.branch_sharing_policy]
-
-        # The project still uses BranchVisibilityPolicy, so check that.
-        private_rules = (
-            BranchVisibilityRule.PRIVATE,
-            BranchVisibilityRule.PRIVATE_ONLY)
-
-        rule = self.product.getBranchVisibilityRuleForTeam(self.owner)
-        if rule is not None:
-            # If there is an explicit rule for the namespace owner, use that.
-            private = rule in private_rules
-            public = rule != BranchVisibilityRule.PRIVATE_ONLY
-        else:
-            # Otherwise find all the rules for the owner's teams.
-            related_rules = set(p.rule for p in self._getRelatedPolicies())
-
-            # If any of the rules allow private branches, allow them.
-            private = bool(related_rules.intersection(private_rules))
-
-            # If any of the rules allow public branches, allow them.
-            if related_rules.difference([BranchVisibilityRule.PRIVATE_ONLY]):
-                public = True
-            else:
-                # There's no team-specific rules, or none of them allow
-                # public branches. Fall back to the default rule.
-                base_rule = self.product.getBaseBranchVisibilityRule()
-                public = base_rule == BranchVisibilityRule.PUBLIC
-
-        types = []
-        if public:
-            types.extend(PUBLIC_INFORMATION_TYPES)
-        if private:
-            types.extend(FREE_PRIVATE_INFORMATION_TYPES)
-        return types
+        # The project uses the new simplified branch_sharing_policy
+        # rules, so check them.
+
+        # Some policies require that the branch owner or current user have
+        # full access to an information type. If it's required and the user
+        # doesn't hold it, no information types are legal.
+        required_grant = BRANCH_POLICY_REQUIRED_GRANTS[
+            self.product.branch_sharing_policy]
+        if (required_grant is not None
+            and not getUtility(IService, 'sharing').checkPillarAccess(
+                self.product, required_grant, self.owner)
+            and (who is None
+                or not getUtility(IService, 'sharing').checkPillarAccess(
+                    self.product, required_grant, who))):
+            return []
+
+        return BRANCH_POLICY_ALLOWED_TYPES[
+            self.product.branch_sharing_policy]
 
     def getDefaultInformationType(self, who=None):
         """See `IBranchNamespace`."""
-        if not self._using_branchvisibilitypolicy:
-            default_type = BRANCH_POLICY_DEFAULT_TYPES[
-                self.product.branch_sharing_policy]
-            if default_type not in self.getAllowedInformationTypes(who):
-                return None
-            return default_type
-
-        return super(ProductNamespace, self).getDefaultInformationType(who)
+        default_type = BRANCH_POLICY_DEFAULT_TYPES[
+            self.product.branch_sharing_policy]
+        if default_type not in self.getAllowedInformationTypes(who):
+            return None
+        return default_type
 
 
 class PackageNamespace(_BaseNamespace):
@@ -518,9 +430,9 @@
         """See `IBranchNamespace`."""
         return PUBLIC_INFORMATION_TYPES
 
-    def getPrivacySubscriber(self):
+    def getDefaultInformationType(self, who=None):
         """See `IBranchNamespace`."""
-        return None
+        return InformationType.PUBLIC
 
 
 class BranchNamespaceSet:

=== removed file 'lib/lp/code/model/branchvisibilitypolicy.py'
--- lib/lp/code/model/branchvisibilitypolicy.py	2011-12-30 06:14:56 +0000
+++ lib/lp/code/model/branchvisibilitypolicy.py	1970-01-01 00:00:00 +0000
@@ -1,165 +0,0 @@
-# Copyright 2009 Canonical Ltd.  This software is licensed under the
-# GNU Affero General Public License version 3 (see the file LICENSE).
-
-# pylint: disable-msg=E0611,W0212
-
-"""Implementation for the BranchVisibilityPolicy interfaces."""
-
-__metaclass__ = type
-
-__all__ = [
-    'BranchVisibilityTeamPolicy',
-    'BranchVisibilityPolicyMixin',
-    ]
-
-from sqlobject import ForeignKey
-from zope.interface import implements
-
-from lp.code.enums import BranchVisibilityRule
-from lp.code.interfaces.branchvisibilitypolicy import (
-    IBranchVisibilityTeamPolicy,
-    InvalidVisibilityPolicy,
-    )
-from lp.registry.interfaces.person import validate_person
-from lp.registry.interfaces.product import IProduct
-from lp.registry.interfaces.projectgroup import IProjectGroup
-from lp.services.database.enumcol import EnumCol
-from lp.services.database.sqlbase import SQLBase
-from lp.services.helpers import shortlist
-from lp.services.propertycache import cachedproperty
-
-
-class BranchVisibilityTeamPolicy(SQLBase):
-    """A sequence of ordered revisions in Bazaar."""
-
-    implements(IBranchVisibilityTeamPolicy)
-    _table = 'BranchVisibilityPolicy'
-
-    project = ForeignKey(dbName='project', foreignKey='ProjectGroup')
-    product = ForeignKey(dbName='product', foreignKey='Product')
-    team = ForeignKey(
-        dbName='team', foreignKey='Person',
-        storm_validator=validate_person,
-        default=None)
-    rule = EnumCol(
-        dbName="policy", enum=BranchVisibilityRule, notNull=True,
-        default=BranchVisibilityRule.PUBLIC)
-
-
-def policy_item_key(item):
-    if item.team is None:
-        return None
-    return item.team.displayname
-
-
-class BranchVisibilityPolicyMixin:
-    """Specifies a list of branch visibility policy items."""
-
-    @cachedproperty
-    def _policy_visibility_context(self):
-        if IProjectGroup.providedBy(self):
-            return dict(project=self, product=None)
-        elif IProduct.providedBy(self):
-            return dict(project=None, product=self)
-        else:
-            raise AssertionError(
-                "%s doesn't implement IProjectGroup nor IProduct." % self)
-
-    @property
-    def _policy_items(self):
-        return BranchVisibilityTeamPolicy.selectBy(
-            **self._policy_visibility_context)
-
-    def getBranchVisibilityTeamPolicies(self):
-        """See `IHasBranchVisibilityPolicy`."""
-        # If we are using the inherited policy return the items
-        # from the inherited context.
-        if self.isUsingInheritedBranchVisibilityPolicy():
-            return self.project.getBranchVisibilityTeamPolicies()
-        # Use shortlist here for policy items as we don't expect
-        # many items, and want a warning emitted if we start
-        # getting many items being created for projects as it
-        # may indicate a design flaw.
-        items = shortlist(self._policy_items)
-        return sorted(items, key=policy_item_key)
-
-    def _selectOneBranchVisibilityTeamPolicy(self, team):
-        """Finds one particular policy item."""
-        if self.isUsingInheritedBranchVisibilityPolicy():
-            policy_visibility_ctx = self.project._policy_visibility_context
-        else:
-            policy_visibility_ctx = self._policy_visibility_context
-        return BranchVisibilityTeamPolicy.selectOneBy(
-                team=team, **policy_visibility_ctx)
-
-    def getBaseBranchVisibilityRule(self):
-        """See `IHasBranchVisibilityPolicy`."""
-        item = self._selectOneBranchVisibilityTeamPolicy(None)
-        # If there is no explicit item set, then public is the default.
-        if item is None:
-            return BranchVisibilityRule.PUBLIC
-        else:
-            return item.rule
-
-    def getBranchVisibilityRuleForTeam(self, team):
-        """See `IHasBranchVisibilityPolicy`."""
-        item = self._selectOneBranchVisibilityTeamPolicy(team)
-        if item is None:
-            return None
-        else:
-            return item.rule
-
-    def getBranchVisibilityRuleForBranch(self, branch):
-        """See `IHasBranchVisibilityPolicy`."""
-        rule = self.getBranchVisibilityRuleForTeam(branch.owner)
-        if rule is None:
-            # Determine the rule based on team membership.
-            # Given the number of branch policies that are likely
-            # for any given product, we are simply checking all the
-            # policies rather than crafting a query on the branch's
-            # owner's team memberships.
-            rules = []
-            owner = branch.owner
-            for item in self.getBranchVisibilityTeamPolicies():
-                if item.team is not None and owner.inTeam(item.team):
-                    rules.append(item.rule)
-            if len(rules) > 0:
-                # max returns the most restrictive policy. The ordering
-                # of the dbSchema items ensures this.
-                rule = max(rules)
-            else:
-                rule = self.getBaseBranchVisibilityRule()
-
-        return rule
-
-    def isUsingInheritedBranchVisibilityPolicy(self):
-        """See `IHasBranchVisibilityPolicy`."""
-        # If there is no project to inherit a policy from,
-        # then we cannot be using an inherited policy.
-        if getattr(self, 'project', None) is None:
-            return False
-        # If there are no explictly defined policy items, use the
-        # inherited policy.
-        return self._policy_items.count() == 0
-
-    def setBranchVisibilityTeamPolicy(self, team, rule):
-        """See `IHasBranchVisibilityPolicy`."""
-        if team is None and rule not in (
-            BranchVisibilityRule.PUBLIC, BranchVisibilityRule.FORBIDDEN):
-            raise InvalidVisibilityPolicy
-        if team is not None and rule == BranchVisibilityRule.FORBIDDEN:
-            raise InvalidVisibilityPolicy
-        item = BranchVisibilityTeamPolicy.selectOneBy(
-            team=team, **self._policy_visibility_context)
-        if item is None:
-            item = BranchVisibilityTeamPolicy(
-                team=team, rule=rule, **self._policy_visibility_context)
-        else:
-            item.rule = rule
-
-    def removeTeamFromBranchVisibilityPolicy(self, team):
-        """See `IHasBranchVisibilityPolicy`."""
-        item = BranchVisibilityTeamPolicy.selectOneBy(
-            team=team, **self._policy_visibility_context)
-        if item is not None:
-            BranchVisibilityTeamPolicy.delete(item.id)

=== modified file 'lib/lp/code/model/tests/test_branch.py'
--- lib/lp/code/model/tests/test_branch.py	2012-09-19 13:22:42 +0000
+++ lib/lp/code/model/tests/test_branch.py	2012-10-09 00:01:20 +0000
@@ -55,7 +55,6 @@
     BranchLifecycleStatus,
     BranchSubscriptionNotificationLevel,
     BranchType,
-    BranchVisibilityRule,
     CodeReviewNotificationLevel,
     )
 from lp.code.errors import (
@@ -2496,21 +2495,10 @@
         # If there is a privacy policy allowing the branch owner to have
         # private branches, then setting the branch private is allowed.
         branch = self.factory.makeProductBranch()
-        branch.product.setBranchVisibilityTeamPolicy(
-            branch.owner, BranchVisibilityRule.PRIVATE)
         branch.setPrivate(True, branch.owner)
         self.assertTrue(branch.private)
         self.assertEqual(InformationType.USERDATA, branch.information_type)
 
-    def test_public_to_private_not_allowed(self):
-        # If there are no privacy policies allowing private branches, then
-        # CannotChangeInformationType is raised.
-        product = self.factory.makeLegacyProduct()
-        branch = self.factory.makeBranch(product=product)
-        self.assertRaisesWithContent(
-            CannotChangeInformationType, 'Forbidden by project policy.',
-            branch.setPrivate, True, branch.owner)
-
     def test_public_to_private_for_admins(self):
         # Admins can override the default behaviour and make any public branch
         # private.
@@ -2546,14 +2534,9 @@
     def test_private_to_public_not_allowed(self):
         # If the namespace policy does not allow public branches, attempting
         # to change the branch to be public raises CannotChangeInformationType.
-        product = self.factory.makeLegacyProduct()
-        branch = self.factory.makeBranch(
-            product=product,
-            information_type=InformationType.USERDATA)
-        branch.product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-        branch.product.setBranchVisibilityTeamPolicy(
-            branch.owner, BranchVisibilityRule.PRIVATE_ONLY)
+        product = self.factory.makeProduct(
+            branch_sharing_policy=BranchSharingPolicy.PROPRIETARY)
+        branch = self.factory.makeBranch(product=product, owner=product.owner)
         self.assertRaisesWithContent(
             CannotChangeInformationType, 'Forbidden by project policy.',
             branch.setPrivate, False, branch.owner)

=== modified file 'lib/lp/code/model/tests/test_branchmergeproposal.py'
--- lib/lp/code/model/tests/test_branchmergeproposal.py	2012-10-02 01:40:39 +0000
+++ lib/lp/code/model/tests/test_branchmergeproposal.py	2012-10-09 00:01:20 +0000
@@ -27,7 +27,6 @@
     BranchMergeProposalStatus,
     BranchSubscriptionDiffSize,
     BranchSubscriptionNotificationLevel,
-    BranchVisibilityRule,
     CodeReviewNotificationLevel,
     CodeReviewVote,
     )
@@ -131,8 +130,6 @@
     def setPrivate(branch):
         """Force a branch to be private."""
         login_person(branch.owner)
-        branch.product.setBranchVisibilityTeamPolicy(
-            branch.owner, BranchVisibilityRule.PRIVATE)
         branch.setPrivate(True, branch.owner)
 
     def test_private(self):
@@ -1554,8 +1551,6 @@
         source_branch = self.factory.makeBranch(
             stacked_on=base_branch, product=product, owner=owner)
         target_branch = self.factory.makeBranch(owner=owner, product=product)
-        target_branch.product.setBranchVisibilityTeamPolicy(
-            owner, BranchVisibilityRule.PRIVATE)
         login_person(owner)
         merge_proposal = self.factory.makeBranchMergeProposal(
             source_branch=source_branch,

=== modified file 'lib/lp/code/model/tests/test_branchnamespace.py'
--- lib/lp/code/model/tests/test_branchnamespace.py	2012-09-21 04:04:51 +0000
+++ lib/lp/code/model/tests/test_branchnamespace.py	2012-10-09 00:01:20 +0000
@@ -10,7 +10,6 @@
 
 from lp.app.enums import (
     FREE_INFORMATION_TYPES,
-    FREE_PRIVATE_INFORMATION_TYPES,
     InformationType,
     NON_EMBARGOED_INFORMATION_TYPES,
     PUBLIC_INFORMATION_TYPES,
@@ -20,10 +19,8 @@
 from lp.code.enums import (
     BranchLifecycleStatus,
     BranchType,
-    BranchVisibilityRule,
     )
 from lp.code.errors import (
-    BranchCreationForbidden,
     BranchCreatorNotMemberOfOwnerTeam,
     BranchCreatorNotOwner,
     BranchExists,
@@ -47,7 +44,6 @@
     BranchSharingPolicy,
     PersonVisibility,
     SharingPermission,
-    TeamMembershipPolicy,
     )
 from lp.registry.errors import (
     NoSuchDistroSeries,
@@ -317,18 +313,6 @@
         self.assertEqual(IBranchTarget(person), namespace.target)
 
 
-class TestPersonalNamespacePrivacy(TestCaseWithFactory):
-    """Tests for the privacy aspects of `PersonalNamespace`."""
-
-    layer = DatabaseFunctionalLayer
-
-    def test_subscriber(self):
-        # There are no implicit subscribers for a personal namespace.
-        person = self.factory.makePerson()
-        namespace = PersonalNamespace(person)
-        self.assertIs(None, namespace.getPrivacySubscriber())
-
-
 class TestProductNamespace(TestCaseWithFactory, NamespaceMixin):
     """Tests for `ProductNamespace`."""
 
@@ -364,90 +348,6 @@
         self.assertEqual(IBranchTarget(product), namespace.target)
 
 
-class TestProductNamespacePrivacyWithBranchVisibility(TestCaseWithFactory):
-    """Tests for the privacy aspects of `ProductNamespace`.
-
-    This tests the behaviour for a product using the old
-    BranchVisibilityPolicy rules.
-    """
-
-    layer = DatabaseFunctionalLayer
-
-    def test_subscriber(self):
-        # If there is no privacy policy, then there is no privacy subscriber.
-        person = self.factory.makePerson()
-        product = self.factory.makeProduct()
-        namespace = ProductNamespace(person, product)
-        self.assertIs(None, namespace.getPrivacySubscriber())
-
-    def test_subscriber_private_team_personal_namespace(self):
-        # If there is a private policy for a team that the registrant is in,
-        # and the namespace owner is in that team, then the team is
-        # subscribed.
-        person = self.factory.makePerson()
-        product = self.factory.makeLegacyProduct()
-        namespace = ProductNamespace(person, product)
-        team = self.factory.makeTeam(owner=person)
-        product.setBranchVisibilityTeamPolicy(
-            team, BranchVisibilityRule.PRIVATE)
-        self.assertEqual(team, namespace.getPrivacySubscriber())
-
-    def test_information_type_private_team(self):
-        # Given a privacy policy for a namespace, branches are created with
-        # the correct information type.
-        person = self.factory.makePerson()
-        team = self.factory.makeTeam(
-            membership_policy=TeamMembershipPolicy.MODERATED,
-            owner=person)
-        product = self.factory.makeLegacyProduct()
-        namespace = ProductNamespace(team, product)
-        product.setBranchVisibilityTeamPolicy(
-            team, BranchVisibilityRule.PRIVATE)
-        branch = namespace.createBranch(
-            BranchType.HOSTED, self.factory.getUniqueString(),
-            namespace.owner)
-        self.assertEqual(InformationType.USERDATA, branch.information_type)
-
-    def test_subscriber_private_team_namespace(self):
-        # If there is a private policy for a namespace owner, then there is no
-        # privacy subscriber.
-        person = self.factory.makePerson()
-        team = self.factory.makeTeam(owner=person)
-        product = self.factory.makeProduct()
-        namespace = ProductNamespace(team, product)
-        product.setBranchVisibilityTeamPolicy(
-            team, BranchVisibilityRule.PRIVATE)
-        self.assertIs(None, namespace.getPrivacySubscriber())
-
-    def test_subscriber_personal_namespace_multiple_rules(self):
-        # If the namespace owner is a member of multiple teams that have
-        # private rules, there is no privacy subscriber.
-        person = self.factory.makePerson()
-        product = self.factory.makeProduct()
-        namespace = ProductNamespace(person, product)
-        product.setBranchVisibilityTeamPolicy(
-            self.factory.makeTeam(owner=person), BranchVisibilityRule.PRIVATE)
-        product.setBranchVisibilityTeamPolicy(
-            self.factory.makeTeam(owner=person), BranchVisibilityRule.PRIVATE)
-        self.assertIs(None, namespace.getPrivacySubscriber())
-
-    def test_subscriber_personal_namespace_diverse_rules(self):
-        # If the namespace owner is a member of multiple teams and only one of
-        # those rules is private, then the team that has the private rule is
-        # the subscriber.
-        person = self.factory.makePerson()
-        product = self.factory.makeLegacyProduct()
-        namespace = ProductNamespace(person, product)
-        product.setBranchVisibilityTeamPolicy(
-            self.factory.makeTeam(owner=person), BranchVisibilityRule.PUBLIC)
-        product.setBranchVisibilityTeamPolicy(
-            self.factory.makeTeam(owner=person), BranchVisibilityRule.PUBLIC)
-        team = self.factory.makeTeam(owner=person)
-        product.setBranchVisibilityTeamPolicy(
-            team, BranchVisibilityRule.PRIVATE)
-        self.assertEqual(team, namespace.getPrivacySubscriber())
-
-
 class TestProductNamespacePrivacyWithInformationType(TestCaseWithFactory):
     """Tests for the privacy aspects of `ProductNamespace`.
 
@@ -641,21 +541,6 @@
         self.assertEqual(IBranchTarget(package), namespace.target)
 
 
-class TestPackageNamespacePrivacy(TestCaseWithFactory):
-    """Tests for the privacy aspects of `PackageNamespace`."""
-
-    layer = DatabaseFunctionalLayer
-
-    def test_subscriber(self):
-        # There are no implicit subscribers for a personal namespace.
-        person = self.factory.makePerson()
-        distroseries = self.factory.makeDistroSeries()
-        sourcepackagename = self.factory.makeSourcePackageName()
-        namespace = PackageNamespace(
-            person, SourcePackage(sourcepackagename, distroseries))
-        self.assertIs(None, namespace.getPrivacySubscriber())
-
-
 class TestNamespaceSet(TestCaseWithFactory):
     """Tests for `get_namespace`."""
 
@@ -1035,8 +920,10 @@
 class TestProductNamespaceCanCreateBranches(TestCaseWithFactory,
                                             BaseCanCreateBranchesMixin):
 
-    def _getNamespace(self, owner):
-        product = self.factory.makeLegacyProduct()
+    def _getNamespace(self, owner,
+                      branch_sharing_policy=BranchSharingPolicy.PUBLIC):
+        product = self.factory.makeProduct(
+            branch_sharing_policy=branch_sharing_policy)
         return ProductNamespace(owner, product)
 
     def setUp(self):
@@ -1047,53 +934,28 @@
         # If there is no privacy set up, any person can create a personal
         # branch on the product.
         person = self.factory.makePerson()
-        namespace = self._getNamespace(person)
-        self.assertTrue(namespace.canCreateBranches(person))
-
-    def test_any_person_with_public_base_rule(self):
-        # If the base visibility rule is PUBLIC, then anyone can create a
-        # personal branch.
-        person = self.factory.makePerson()
-        namespace = self._getNamespace(person)
-        namespace.product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.PUBLIC)
-        self.assertTrue(namespace.canCreateBranches(person))
-
-    def test_any_person_with_forbidden_base_rule(self):
-        # If the base visibility rule is FORBIDDEN, then non-privleged users
-        # canot create a branch.
-        person = self.factory.makePerson()
-        namespace = self._getNamespace(person)
-        namespace.product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
+        namespace = self._getNamespace(person, BranchSharingPolicy.PUBLIC)
+        self.assertTrue(namespace.canCreateBranches(person))
+
+    def test_any_person_with_proprietary_branches(self):
+        # If the sharing policy defaults to PROPRIETARY, then
+        # non-privileged users cannot create a branch.
+        person = self.factory.makePerson()
+        namespace = self._getNamespace(person, BranchSharingPolicy.PROPRIETARY)
         self.assertFalse(namespace.canCreateBranches(person))
 
-    def assertTeamMemberCanCreateBranches(self, policy_rule):
-        # Create a product with a team policy with the specified rule, and
-        # make sure that the team member can create branches.
+    def test_grantee_with_proprietary_branches(self):
+        # If the sharing policy defaults to PROPRIETARY, then
+        # non-privileged users cannot create a branch.
         person = self.factory.makePerson()
-        namespace = self._getNamespace(person)
-        namespace.product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-        team = self.factory.makeTeam(owner=person)
-        namespace.product.setBranchVisibilityTeamPolicy(team, policy_rule)
+        other_person = self.factory.makePerson()
+        team = self.factory.makeTeam(members=[person])
+        namespace = self._getNamespace(team, BranchSharingPolicy.PROPRIETARY)
+        getUtility(IService, 'sharing').sharePillarInformation(
+            namespace.product, team, namespace.product.owner,
+            {InformationType.PROPRIETARY: SharingPermission.ALL})
         self.assertTrue(namespace.canCreateBranches(person))
-
-    def test_team_member_public_policy(self):
-        # A person in a team with a PUBLIC rule can create branches even if
-        # the base rule is FORBIDDEN.
-        self.assertTeamMemberCanCreateBranches(BranchVisibilityRule.PUBLIC)
-
-    def test_team_member_private_policy(self):
-        # A person in a team with a PRIVATE rule can create branches even if
-        # the base rule is FORBIDDEN.
-        self.assertTeamMemberCanCreateBranches(BranchVisibilityRule.PRIVATE)
-
-    def test_team_member_private_only_policy(self):
-        # A person in a team with a PRIVATE_ONLY rule can create branches even
-        # if the base rule is FORBIDDEN.
-        self.assertTeamMemberCanCreateBranches(
-            BranchVisibilityRule.PRIVATE_ONLY)
+        self.assertFalse(namespace.canCreateBranches(other_person))
 
 
 class TestPersonalNamespaceAllowedInformationTypes(TestCaseWithFactory):
@@ -1141,102 +1003,6 @@
             namespace.getAllowedInformationTypes())
 
 
-class TestProductNamespaceAllowedInformationTypes(TestCaseWithFactory):
-    """Tests for ProductNamespace.getAllowedInformationTypes."""
-
-    layer = DatabaseFunctionalLayer
-
-    def setUp(self):
-        TestCaseWithFactory.setUp(self)
-        self.product = self.factory.makeLegacyProduct()
-        removeSecurityProxy(self.product).branch_sharing_policy = None
-
-    def _getNamespace(self, owner):
-        return ProductNamespace(owner, self.product)
-
-    def assertTypes(self, owner, types):
-        namespace = self._getNamespace(owner)
-        self.assertContentEqual(types, namespace.getAllowedInformationTypes())
-
-    def test_no_policies(self):
-        # If there are no defined policies, any personal branch is not
-        # private.
-        self.assertTypes(self.factory.makePerson(), PUBLIC_INFORMATION_TYPES)
-
-    def test_any_person_with_public_base_rule(self):
-        # If the base visibility rule is PUBLIC, then new branches are public.
-        self.product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.PUBLIC)
-        self.assertTypes(self.factory.makePerson(), PUBLIC_INFORMATION_TYPES)
-
-    def test_any_person_with_forbidden_base_rule(self):
-        # If the base visibility rule is FORBIDDEN, there are no legal types.
-        self.product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-        self.assertTypes(self.factory.makePerson(), [])
-
-    def test_team_member_with_private_rule(self):
-        # If a person is a member of a team that has a PRIVATE rule, then new
-        # branches are private in either the person or team namespace.
-        person = self.factory.makePerson()
-        team = self.factory.makeTeam(owner=person)
-        self.product.setBranchVisibilityTeamPolicy(
-            team, BranchVisibilityRule.PRIVATE)
-        self.assertTypes(person, FREE_INFORMATION_TYPES)
-        self.assertTypes(team, FREE_INFORMATION_TYPES)
-
-    def test_team_member_with_private_only_rule(self):
-        # If a person is a member of a team that has a PRIVATE_ONLY rule, then
-        # new branches are private in either the person or team namespace.
-        person = self.factory.makePerson()
-        team = self.factory.makeTeam(owner=person)
-        self.product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-        self.product.setBranchVisibilityTeamPolicy(
-            team, BranchVisibilityRule.PRIVATE_ONLY)
-        self.assertTypes(person, FREE_PRIVATE_INFORMATION_TYPES)
-        self.assertTypes(team, FREE_PRIVATE_INFORMATION_TYPES)
-
-    def test_non_team_member_with_private_rule(self):
-        # If a person is a not a member of a team that has a privacy rule,
-        # then new branches are public.
-        person = self.factory.makePerson()
-        team = self.factory.makeTeam(owner=person)
-        self.product.setBranchVisibilityTeamPolicy(
-            team, BranchVisibilityRule.PRIVATE)
-        self.assertTypes(self.factory.makePerson(), PUBLIC_INFORMATION_TYPES)
-
-    def test_team_member_with_multiple_private_rules(self):
-        # If a person is a member of multiple teams that has a privacy rules,
-        # then new branches are private in all options.
-        person = self.factory.makePerson()
-        team_1 = self.factory.makeTeam(owner=person)
-        team_2 = self.factory.makeTeam(owner=person)
-        self.product.setBranchVisibilityTeamPolicy(
-            team_1, BranchVisibilityRule.PRIVATE)
-        self.product.setBranchVisibilityTeamPolicy(
-            team_2, BranchVisibilityRule.PRIVATE)
-        self.assertTypes(person, FREE_INFORMATION_TYPES)
-        self.assertTypes(team_1, FREE_INFORMATION_TYPES)
-        self.assertTypes(team_2, FREE_INFORMATION_TYPES)
-
-    def test_team_member_with_multiple_differing_private_rules(self):
-        # If a person is a member of multiple teams that has a privacy rules,
-        # and one rule says PRIVATE and the other PUBLIC, then personal
-        # branches will be private, and branches owned by teams with rules
-        # will relate to the rule of the team.
-        person = self.factory.makePerson()
-        private_team = self.factory.makeTeam(owner=person)
-        public_team = self.factory.makeTeam(owner=person)
-        self.product.setBranchVisibilityTeamPolicy(
-            private_team, BranchVisibilityRule.PRIVATE)
-        self.product.setBranchVisibilityTeamPolicy(
-            public_team, BranchVisibilityRule.PUBLIC)
-        self.assertTypes(person, FREE_INFORMATION_TYPES)
-        self.assertTypes(private_team, FREE_INFORMATION_TYPES)
-        self.assertTypes(public_team, PUBLIC_INFORMATION_TYPES)
-
-
 class BaseValidateNewBranchMixin:
 
     layer = DatabaseFunctionalLayer
@@ -1330,92 +1096,23 @@
         return ProductNamespace(owner, product)
 
 
-class BranchVisibilityPolicyTestCase(TestCaseWithFactory):
-    """Base class for tests to make testing of branch visibility easier."""
+class JunkBranches(TestCaseWithFactory):
+    """Branches are considered junk if they have no associated product.
+    It is the product that has the branch visibility policy, so junk branches
+    have no related visibility policy."""
 
     layer = DatabaseFunctionalLayer
 
-    def setUp(self):
-        """Setup some sample people and teams.
-
-        The team names are: "xray", "yankee", and "zulu".
-
-        The people are:
-
-          * "albert", who is a member of all three teams.
-          * "bob", who is a member of yankee.
-          * "charlie", who is a member of zulu.
-          * "doug", who is a member of no teams.
-        """
-        super(BranchVisibilityPolicyTestCase, self).setUp(
-            'admin@xxxxxxxxxxxxx')
-        # Our test product.
-        self.product = self.factory.makeProduct()
-        removeSecurityProxy(self.product).branch_sharing_policy = None
-        # Create some test people.
-        self.albert = self.factory.makePerson(
-            name='albert', displayname='Albert Tester')
-        self.bob = self.factory.makePerson(
-            name='bob', displayname='Bob Tester')
-        self.charlie = self.factory.makePerson(
-            name='charlie', displayname='Charlie Tester')
-        self.doug = self.factory.makePerson(
-            name='doug', displayname='Doug Tester')
-        self.people = (self.albert, self.bob, self.charlie, self.doug)
-
-        # And create some test teams.
-        self.xray = self.factory.makeTeam(
-            name='xray', members=[self.albert],
-            membership_policy=TeamMembershipPolicy.MODERATED)
-        self.yankee = self.factory.makeTeam(
-            name='yankee', members=[self.albert, self.bob],
-            membership_policy=TeamMembershipPolicy.MODERATED)
-        self.zulu = self.factory.makeTeam(
-            name='zulu', members=[self.albert, self.charlie],
-            membership_policy=TeamMembershipPolicy.MODERATED)
-        self.teams = (self.xray, self.yankee, self.zulu)
-
-    def defineTeamPolicies(self, team_policies):
-        """Shortcut to help define team policies."""
-        for team, rule in team_policies:
-            self.product.setBranchVisibilityTeamPolicy(team, rule)
-
-    def assertBranchRule(self, registrant, owner, expected_rule):
-        """Check the getBranchVisibilityRuleForBranch results for a branch."""
-        branch = self.factory.makeProductBranch(
-            registrant=registrant, owner=owner, product=self.product)
-        rule = self.product.getBranchVisibilityRuleForBranch(branch)
-        self.assertEqual(rule, expected_rule,
-                         'Wrong visibililty rule returned: '
-                         'expected %s, got %s'
-                         % (expected_rule.name, rule.name))
-
     def assertPublic(self, creator, owner):
         """Assert that the policy check would result in a public branch.
 
         :param creator: The user creating the branch.
         :param owner: The person or team that will be the owner of the branch.
         """
-        namespace = get_branch_namespace(owner, product=self.product)
+        namespace = get_branch_namespace(owner)
         self.assertNotIn(
             InformationType.USERDATA, namespace.getAllowedInformationTypes())
 
-    def assertPrivateSubscriber(self, creator, owner, subscriber):
-        """Assert that the policy check results in a private branch.
-
-        :param creator: The user creating the branch.
-        :param owner: The person or team that will be the owner of the branch.
-        :param subscriber: The expected implicit subscriber to the branch.
-        """
-        policy = IBranchNamespacePolicy(
-            get_branch_namespace(owner, product=self.product))
-        self.assertIn(
-            InformationType.USERDATA, policy.getAllowedInformationTypes())
-        if subscriber is None:
-            self.assertIs(None, policy.getPrivacySubscriber())
-        else:
-            self.assertEqual(subscriber, policy.getPrivacySubscriber())
-
     def assertPolicyCheckRaises(self, error, creator, owner):
         """Assert that the policy check raises an exception.
 
@@ -1423,504 +1120,30 @@
         :param creator: The user creating the branch.
         :param owner: The person or team that will be the owner of the branch.
         """
-        policy = IBranchNamespacePolicy(
-            get_branch_namespace(owner, product=self.product))
+        policy = IBranchNamespacePolicy(get_branch_namespace(owner))
         self.assertRaises(
             error,
             policy.validateRegistrant,
             registrant=creator)
 
-
-class TestTeamMembership(BranchVisibilityPolicyTestCase):
-    """Assert the expected team memberhsip of the test users."""
-
-    def test_team_memberships(self):
-        albert, bob, charlie, doug = self.people
-        xray, yankee, zulu = self.teams
-        # Albert is a member of all three teams.
-        self.failUnless(albert.inTeam(xray),
-                        "Albert should be in team Xray team.")
-        self.failUnless(albert.inTeam(yankee),
-                        "Albert should be in the Yankee.")
-        self.failUnless(albert.inTeam(zulu),
-                        "Albert should be in Zulu team.")
-        # Bob is a member of only Yankee.
-        self.failIf(bob.inTeam(xray),
-                    "Bob should not be in team Xray team.")
-        self.failUnless(bob.inTeam(yankee),
-                        "Bob should be in the Yankee team.")
-        self.failIf(bob.inTeam(zulu),
-                    "Bob should not be in the Zulu team.")
-        # Charlie is a member of only Zulu.
-        self.failIf(charlie.inTeam(xray),
-                    "Charlie should not be in team Xray team.")
-        self.failIf(charlie.inTeam(yankee),
-                    "Charlie should not be in the Yankee team.")
-        self.failUnless(charlie.inTeam(zulu),
-                        "Charlie should be in the Zulu team.")
-        # Doug is not a member of any
-        self.failIf(doug.inTeam(xray),
-                    "Doug should not be in team Xray team.")
-        self.failIf(doug.inTeam(yankee),
-                    "Doug should not be in the Yankee team.")
-        self.failIf(doug.inTeam(zulu),
-                    "Doug should not be in the Zulu team.")
-
-
-class NoPolicies(BranchVisibilityPolicyTestCase):
-    """Test behaviour with no team policies defined."""
-
-    def test_creation_where_not_team_member(self):
-        """If the creator isn't a member of the owner an exception is raised.
-        """
-        self.assertPolicyCheckRaises(
-            BranchCreatorNotMemberOfOwnerTeam, self.doug, self.xray)
-
-    def test_creation_under_different_user(self):
-        """If the owner is a user other than the creator an exception is
-        raised.
-        """
-        self.assertPolicyCheckRaises(
-            BranchCreatorNotOwner, self.albert, self.bob)
-
-    def test_public_branch_creation(self):
-        """Branches where the creator is a memeber of owner will be public."""
-        albert, bob, charlie, doug = self.people
-        xray, yankee, zulu = self.teams
-
-        self.assertPublic(albert, albert)
-        self.assertPublic(albert, xray)
-        self.assertPublic(albert, yankee)
-        self.assertPublic(albert, zulu)
-
-        self.assertPublic(bob, bob)
-        self.assertPublic(bob, yankee)
-
-        self.assertPublic(charlie, charlie)
-        self.assertPublic(charlie, zulu)
-
-        self.assertPublic(doug, doug)
-
-
-class PolicySimple(BranchVisibilityPolicyTestCase):
-    """Test the visibility policy where the base visibility rule is PUBLIC
-    with one team specified to have PRIVATE branches.
-    """
-
-    def setUp(self):
-        BranchVisibilityPolicyTestCase.setUp(self)
-        self.defineTeamPolicies((
-            (None, BranchVisibilityRule.PUBLIC),
-            (self.xray, BranchVisibilityRule.PRIVATE),
-            ))
-
-    def test_xray_branches_private(self):
-        """Branches created in the xray namespace will be private."""
-        self.assertPrivateSubscriber(self.albert, self.xray, None)
-
-    def test_xray_member_branches_private(self):
-        """Branches created by members of the Xray team in their own namespace
-        will be private with the Xray team subscribed.
-        """
-        self.assertPrivateSubscriber(self.albert, self.albert, self.xray)
-
-    def test_xray_member_other_namespace_public(self):
-        """Branches created by members of the Xray team in other team
-        namespaces are public.
-        """
-        self.assertPublic(self.albert, self.yankee)
-        self.assertPublic(self.albert, self.zulu)
-
-    def test_public_branches(self):
-        """Branches created by users not in team Xray are created as public
-        branches.
-        """
-        albert, bob, charlie, doug = self.people
-        xray, yankee, zulu = self.teams
-
-        self.assertPublic(bob, bob)
-        self.assertPublic(bob, yankee)
-
-        self.assertPublic(charlie, charlie)
-        self.assertPublic(charlie, zulu)
-
-        self.assertPublic(doug, doug)
-
-
-class PolicyPrivateOnly(BranchVisibilityPolicyTestCase):
-    """Test the visibility policy where the base visibility rule is PUBLIC
-    with one team specified to have the PRIVATE_ONLY rule.
-
-    PRIVATE_ONLY only stops the user from changing the branch from private to
-    public and for branch creation behaves in the same maner as the PRIVATE
-    policy.
-    """
-
-    def setUp(self):
-        BranchVisibilityPolicyTestCase.setUp(self)
-        self.defineTeamPolicies((
-            (None, BranchVisibilityRule.PUBLIC),
-            (self.xray, BranchVisibilityRule.PRIVATE_ONLY),
-            ))
-
-    def test_xray_branches_private(self):
-        """Branches created in the xray namespace will be private."""
-        self.assertPrivateSubscriber(self.albert, self.xray, None)
-
-    def test_xray_member_branches_private(self):
-        """Branches created by members of the Xray team in their own namespace
-        will be private with the Xray team subscribed.
-        """
-        self.assertPrivateSubscriber(self.albert, self.albert, self.xray)
-
-    def test_xray_member_other_namespace_public(self):
-        """Branches created by members of the Xray team in other team
-        namespaces are public.
-        """
-        self.assertPublic(self.albert, self.yankee)
-        self.assertPublic(self.albert, self.zulu)
-
-    def test_public_branches(self):
-        """Branches created by users not in team Xray are created as public
-        branches.
-        """
-        albert, bob, charlie, doug = self.people
-        xray, yankee, zulu = self.teams
-
-        self.assertPublic(bob, bob)
-        self.assertPublic(bob, yankee)
-
-        self.assertPublic(charlie, charlie)
-        self.assertPublic(charlie, zulu)
-
-        self.assertPublic(doug, doug)
-
-
-class PolicyForbidden(BranchVisibilityPolicyTestCase):
-    """Test the visibility policy where the base visibility rule is FORBIDDEN
-    with one team specified to have the PRIVATE branches and another team
-    specified to have PUBLIC branches.
-    """
-
-    def setUp(self):
-        BranchVisibilityPolicyTestCase.setUp(self)
-        self.defineTeamPolicies((
-            (None, BranchVisibilityRule.FORBIDDEN),
-            (self.xray, BranchVisibilityRule.PRIVATE),
-            (self.yankee, BranchVisibilityRule.PUBLIC),
-            ))
-
-    def test_rule_for_branch_most_specific(self):
-        """Since Albert is in both xray and yankee, the PRIVATE rule is
-        returned in preference to the PUBLIC one.
-        """
-        self.assertBranchRule(
-            self.albert, self.albert, BranchVisibilityRule.PRIVATE)
-
-    def test_rule_for_branch_exact_defined(self):
-        """Branches in the yankee namespace will return the PUBLIC rule as it
-        is defined for the branch owner.
-        """
-        self.assertBranchRule(
-            self.albert, self.yankee, BranchVisibilityRule.PUBLIC)
-
-    def test_branch_creation_forbidden_non_members(self):
-        """People who are not members of Xray or Yankee are not allowed to
-        create branches.
-        """
-        self.assertPolicyCheckRaises(
-            BranchCreationForbidden, self.charlie, self.charlie)
-        self.assertPolicyCheckRaises(
-            BranchCreationForbidden, self.charlie, self.zulu)
-
-        self.assertPolicyCheckRaises(
-            BranchCreationForbidden, self.doug, self.doug)
-
-    def test_branch_creation_forbidden_other_namespace(self):
-        """People who are members of Xray or Yankee are not allowed to
-        create branches in a namespace of a team that is not a member
-        of Xray or Yankee.
-        """
-        self.assertPolicyCheckRaises(
-            BranchCreationForbidden, self.albert, self.zulu)
-
-    def test_yankee_branches_public(self):
-        """Branches in the yankee namespace are public."""
-        self.assertPublic(self.bob, self.yankee)
-        self.assertPublic(self.albert, self.yankee)
-
-    def test_yankee_member_branches_public(self):
-        """Branches created by a member of Yankee, who is not a member
-        of Xray will be public.
-        """
-        self.assertPublic(self.bob, self.bob)
-
-    def test_xray_branches_private(self):
-        """Branches in the xray namespace will be private."""
-        self.assertPrivateSubscriber(self.albert, self.xray, None)
-
-    def test_xray_member_branches_private(self):
-        """Branches created by Xray team members in their own namespace
-        will be private, and subscribed to by the Xray team.
-        """
-        self.assertPrivateSubscriber(self.albert, self.albert, self.xray)
-
-
-class PolicyTeamPrivateOverlap(BranchVisibilityPolicyTestCase):
-    """Test the visibility policy where a user is a member of multiple teams
-    with PRIVATE branches enabled.
-    """
-
-    def setUp(self):
-        BranchVisibilityPolicyTestCase.setUp(self)
-        self.defineTeamPolicies((
-            (self.xray, BranchVisibilityRule.PRIVATE),
-            (self.zulu, BranchVisibilityRule.PRIVATE),
-            ))
-
-    def test_public_branches_for_non_members(self):
-        """Branches created by people who are not members of xray or zulu
-        will be public branches.
-        """
-        self.assertPublic(self.bob, self.bob)
-        self.assertPublic(self.bob, self.yankee)
-        self.assertPublic(self.doug, self.doug)
-
-    def test_public_branches_for_members_in_other_namespace(self):
-        """If a member of xray or zulu creates a branch for a team that is
-        not a member of xray or zulu, then the branch will be a public branch.
-        """
-        self.assertPublic(self.albert, self.yankee)
-
-    def test_team_branches_private(self):
-        """Branches created in the namespace of a team that has private
-        branches specified are private.
-        """
-        self.assertPrivateSubscriber(self.charlie, self.zulu, None)
-        self.assertPrivateSubscriber(self.albert, self.zulu, None)
-        self.assertPrivateSubscriber(self.albert, self.xray, None)
-
-    def test_one_membership_private_with_subscriber(self):
-        """If the creator of the branch is a member of only one team that has
-        private branches set up, then that team will be subscribed to any
-        branches that the creator registers in their own namespace.
-        """
-        self.assertPrivateSubscriber(self.charlie, self.charlie, self.zulu)
-
-    def test_two_memberships_private_no_subscriber(self):
-        """If the creator of the branch is a member of two or more teams
-        that have private branches enabled, then when a branch is created
-        in their own namespace, there are no implicit subscribers.
-
-        This is done as we cannot guess which team should have access
-        to the private branch.
-        """
-        self.assertPrivateSubscriber(self.albert, self.albert, None)
-
-
-class ComplexPolicyStructure(BranchVisibilityPolicyTestCase):
-    """Test the visibility policy with a complex policy structure.
-
-    The base visibility policy is set to FORBIDDEN, with both xray and yankee
-    teams creating PRIVATE branches.  Members of zulu team create PUBLIC
-    branches.
-
-    Branch creation is forbidden to all people who are not a member of
-    one of the teams: xray, yankee or zulu.  Members of zulu can create
-    branches that are public.  Branches created by members of xray and
-    yankee in the team namespace are private, and branches created in the
-    namespace of the user are also created private.
-    """
-
-    def setUp(self):
-        BranchVisibilityPolicyTestCase.setUp(self)
-        self.defineTeamPolicies((
-            (None, BranchVisibilityRule.FORBIDDEN),
-            (self.xray, BranchVisibilityRule.PRIVATE),
-            (self.yankee, BranchVisibilityRule.PRIVATE_ONLY),
-            (self.zulu, BranchVisibilityRule.PUBLIC),
-            ))
-
-    def test_rule_for_branch_most_specific(self):
-        """Since Albert is in both xray and yankee, the PRIVATE_ONLY rule is
-        returned in preference to the PUBLIC or PRIVATE one.
-        """
-        self.assertBranchRule(
-            self.albert, self.albert, BranchVisibilityRule.PRIVATE_ONLY)
-
-    def test_rule_for_branch_exact_defined(self):
-        """Branches in the zulu namespace will return the PUBLIC rule as it is
-        defined for the branch owner.
-        """
-        self.assertBranchRule(
-            self.albert, self.xray, BranchVisibilityRule.PRIVATE)
-        self.assertBranchRule(
-            self.albert, self.yankee, BranchVisibilityRule.PRIVATE_ONLY)
-        self.assertBranchRule(
-            self.albert, self.zulu, BranchVisibilityRule.PUBLIC)
-
-    def test_non_membership_cannot_create_branches(self):
-        """A user who is not a member of any specified team gets the
-        base policy, which is in this case FORBIDDEN.
-        """
-        self.assertPolicyCheckRaises(
-            BranchCreationForbidden, self.doug, self.doug)
-
-    def test_zulu_branches_public(self):
-        """Branches pushed to the zulu team namespace are public branches."""
-        self.assertPublic(self.albert, self.zulu)
-        self.assertPublic(self.charlie, self.zulu)
-
-    def test_zulu_members_only_public(self):
-        """A user who is a member of zulu, and not a member of a team that
-        specifies private branch creation have public branches when created
-        in the user's own namespace.
-        """
-        self.assertPublic(self.charlie, self.charlie)
-
-    def test_xray_and_yankee_branches_private(self):
-        """Branches that are created in the namespace of either xray or yankee
-        are private branches.
-        """
-        self.assertPrivateSubscriber(self.albert, self.xray, None)
-        self.assertPrivateSubscriber(self.albert, self.yankee, None)
-        self.assertPrivateSubscriber(self.bob, self.yankee, None)
-
-    def test_xray_member_private_with_subscription(self):
-        """Branches created by a user who is a member of only one team that
-        specifies private branches will have branches in the user's namespace
-        created as private branches with the team subscribed to them.
-        """
-        self.assertPrivateSubscriber(self.bob, self.bob, self.yankee)
-
-    def test_multiple_memberships_private(self):
-        """If the user is a member of multiple teams that specify private
-        branches, then this overrides PUBLIC policy that may apply.
-
-        Any branch created in the user's own namespace will not have any
-        implicit subscribers.
-        """
-        self.assertPrivateSubscriber(self.albert, self.albert, None)
-
-
-class TeamsWithinTeamsPolicies(BranchVisibilityPolicyTestCase):
-    """Test the visibility policy when teams within teams have different
-    visibility rules.
-    """
-
-    def setUp(self):
-        """Join up the teams so zulu is in yankee, and yankee is in xray."""
-        BranchVisibilityPolicyTestCase.setUp(self)
-        self.yankee.addMember(self.zulu, self.albert, force_team_add=True)
-        self.xray.addMember(self.yankee, self.albert, force_team_add=True)
-        self.defineTeamPolicies((
-            (None, BranchVisibilityRule.FORBIDDEN),
-            (self.xray, BranchVisibilityRule.PRIVATE),
-            (self.yankee, BranchVisibilityRule.PUBLIC),
-            (self.zulu, BranchVisibilityRule.PRIVATE),
-            ))
-
-    def test_team_memberships(self):
-        albert, bob, charlie, doug = self.people
-        xray, yankee, zulu = self.teams
-        # Albert is a member of all three teams.
-        self.failUnless(albert.inTeam(xray),
-                        "Albert should be in team Xray team.")
-        self.failUnless(albert.inTeam(yankee),
-                        "Albert should be in the Yankee.")
-        self.failUnless(albert.inTeam(zulu),
-                        "Albert should be in Zulu team.")
-        # Bob is a member of Yankee, and now Xray.
-        self.failUnless(bob.inTeam(xray),
-                        "Bob should now be in team Xray team.")
-        self.failUnless(bob.inTeam(yankee),
-                        "Bob should be in the Yankee team.")
-        self.failIf(bob.inTeam(zulu),
-                    "Bob should not be in the Zulu team.")
-        # Charlie is a member of Zulu, and through Zulu a member
-        # of Yankee, and through Yankee a member of Xray.
-        self.failUnless(charlie.inTeam(xray),
-                        "Charlie should now be in team Xray team.")
-        self.failUnless(charlie.inTeam(yankee),
-                        "Charlie should now be in the Yankee team.")
-        self.failUnless(charlie.inTeam(zulu),
-                        "Charlie should be in the Zulu team.")
-        # Doug is not a member of any
-        self.failIf(doug.inTeam(xray),
-                    "Doug should not be in team Xray team.")
-        self.failIf(doug.inTeam(yankee),
-                    "Doug should not be in the Yankee team.")
-        self.failIf(doug.inTeam(zulu),
-                    "Doug should not be in the Zulu team.")
-
-    def test_non_membership_cannot_create_branches(self):
-        """A user who is not a member of any specified team gets the
-        base policy, which is in this case FORBIDDEN.
-        """
-        self.assertPolicyCheckRaises(
-            BranchCreationForbidden, self.doug, self.doug)
-
-    def test_xray_and_zulu_branches_private_no_subscriber(self):
-        """All branches created in the namespace of teams that specify
-        private branches are private with no subscribers.
-        """
-        self.assertPrivateSubscriber(self.albert, self.xray, None)
-        self.assertPrivateSubscriber(self.bob, self.xray, None)
-        self.assertPrivateSubscriber(self.charlie, self.xray, None)
-
-        self.assertPrivateSubscriber(self.albert, self.zulu, None)
-        self.assertPrivateSubscriber(self.charlie, self.zulu, None)
-
-    def test_yankee_branches_public(self):
-        """All branches created in the namespace of teams that specify
-        public branches are public.
-        """
-        self.assertPublic(self.albert, self.yankee)
-        self.assertPublic(self.bob, self.yankee)
-        self.assertPublic(self.charlie, self.yankee)
-
-    def test_privacy_through_team_membership_of_private_team(self):
-        """Policies that apply to team apply to people that are members
-        indirectly in the same way as direct membership.
-        """
-        self.assertPrivateSubscriber(self.bob, self.bob, self.xray)
-
-    def test_multiple_private_policies_through_indirect_membership(self):
-        """If a person is a member of a team that specifies private branches,
-        and that team is also a member either directly or indirectly of
-        another team that specifies private branches, then when members of
-        those teams create branches, those branches have no implicit
-        subscribers.
-        """
-        self.assertPrivateSubscriber(self.albert, self.albert, None)
-        self.assertPrivateSubscriber(self.charlie, self.charlie, None)
-
-
-class JunkBranches(BranchVisibilityPolicyTestCase):
-    """Branches are considered junk if they have no associated product.
-    It is the product that has the branch visibility policy, so junk branches
-    have no related visibility policy."""
-
-    def setUp(self):
-        """Override the product used for the visibility checks."""
-        BranchVisibilityPolicyTestCase.setUp(self)
-        # Override the product that is used in the check tests.
-        self.product = None
-
     def test_junk_branches_public(self):
         """Branches created by anyone that has no product defined are created
         as public branches.
         """
-        self.assertPublic(self.albert, self.albert)
+        person = self.factory.makePerson()
+        self.assertPublic(person, person)
 
     def test_team_junk_branches(self):
         """Team junk branches are allowed, and are public."""
-        self.assertPublic(self.albert, self.xray)
+        person = self.factory.makePerson()
+        team = self.factory.makeTeam(members=[person])
+        self.assertPublic(person, team)
 
     def test_no_create_junk_branch_for_other_user(self):
         """One user can't create +junk branches owned by another."""
         self.assertPolicyCheckRaises(
-            BranchCreatorNotOwner, self.albert, self.doug)
+            BranchCreatorNotOwner, self.factory.makePerson(),
+            self.factory.makePerson())
 
 
 class TestBranchNamespaceMoveBranch(TestCaseWithFactory):

=== modified file 'lib/lp/code/model/tests/test_branchvisibility.py'
--- lib/lp/code/model/tests/test_branchvisibility.py	2012-09-18 18:36:09 +0000
+++ lib/lp/code/model/tests/test_branchvisibility.py	2012-10-09 00:01:20 +0000
@@ -43,7 +43,7 @@
 
 
 class TestBranchVisibility(TestCaseWithFactory):
-    """Tests for `IHasBranchVisibilityPolicy`."""
+    """Tests for branch privacy."""
 
     layer = DatabaseFunctionalLayer
 

=== removed file 'lib/lp/code/model/tests/test_branchvisibilitypolicy.py'
--- lib/lp/code/model/tests/test_branchvisibilitypolicy.py	2012-01-01 02:58:52 +0000
+++ lib/lp/code/model/tests/test_branchvisibilitypolicy.py	1970-01-01 00:00:00 +0000
@@ -1,108 +0,0 @@
-# Copyright 2009 Canonical Ltd.  This software is licensed under the
-# GNU Affero General Public License version 3 (see the file LICENSE).
-
-"""Tests for BranchVisibilityPolicy."""
-
-__metaclass__ = type
-
-from lp.code.enums import BranchVisibilityRule
-from lp.code.interfaces.branchvisibilitypolicy import (
-    IHasBranchVisibilityPolicy,
-    InvalidVisibilityPolicy,
-    )
-from lp.services.webapp.testing import verifyObject
-from lp.testing import TestCaseWithFactory
-from lp.testing.layers import DatabaseFunctionalLayer
-
-
-class TestIHasBranchVisibilityPolicy(TestCaseWithFactory):
-    """Tests for `IHasBranchVisibilityPolicy`."""
-
-    layer = DatabaseFunctionalLayer
-
-    def test_product_implements_IHasBranchVisibilityPolicy(self):
-        # Products can have visibility policies.
-        product = self.factory.makeProduct()
-        verifyObject(IHasBranchVisibilityPolicy, product)
-
-    def test_project_implements_IHasBranchVisibilityPolicy(self):
-        # Products can have visibility policies.
-        project = self.factory.makeProject()
-        verifyObject(IHasBranchVisibilityPolicy, project)
-
-
-class TestBaseBranchVisibilityRules(TestCaseWithFactory):
-    """Tests for `getBaseBranchVisibilityRule`."""
-
-    layer = DatabaseFunctionalLayer
-
-    def test_no_rules(self):
-        # If there are no rules specified, the default is PUBLIC.
-        product = self.factory.makeProduct()
-        self.assertEqual(
-            BranchVisibilityRule.PUBLIC,
-            product.getBaseBranchVisibilityRule())
-
-    def test_explicit_public(self):
-        # If there is an explicit public rule, then still public.
-        product = self.factory.makeProduct()
-        product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.PUBLIC)
-        self.assertEqual(
-            BranchVisibilityRule.PUBLIC,
-            product.getBaseBranchVisibilityRule())
-
-    def test_explicit_forbidden(self):
-        # If there is an explicit public rule, then still public.
-        product = self.factory.makeProduct()
-        product.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-        self.assertEqual(
-            BranchVisibilityRule.FORBIDDEN,
-            product.getBaseBranchVisibilityRule())
-
-    def test_inherited_public(self):
-        # If there is an explicit public rule, then still public.
-        project = self.factory.makeProject()
-        product = self.factory.makeProduct(project=project)
-        project.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.PUBLIC)
-        self.assertEqual(
-            BranchVisibilityRule.PUBLIC,
-            product.getBaseBranchVisibilityRule())
-
-    def test_inherited_forbidden(self):
-        # If there is an explicit public rule, then still public.
-        project = self.factory.makeProject()
-        product = self.factory.makeProduct(project=project)
-        project.setBranchVisibilityTeamPolicy(
-            None, BranchVisibilityRule.FORBIDDEN)
-        self.assertEqual(
-            BranchVisibilityRule.FORBIDDEN,
-            product.getBaseBranchVisibilityRule())
-
-    def test_no_default_private(self):
-        # The default visibility rule cannot be PRIVATE or PRIVATE_ONLY.
-        product = self.factory.makeProduct()
-        self.assertRaises(
-            InvalidVisibilityPolicy,
-            product.setBranchVisibilityTeamPolicy,
-            None, BranchVisibilityRule.PRIVATE)
-        self.assertRaises(
-            InvalidVisibilityPolicy,
-            product.setBranchVisibilityTeamPolicy,
-            None, BranchVisibilityRule.PRIVATE_ONLY)
-
-    def test_no_forbidden_for_team(self):
-        # Forbidden is only valid for everyone, not a specific person or team.
-        product = self.factory.makeProduct()
-        person = self.factory.makePerson()
-        self.assertRaises(
-            InvalidVisibilityPolicy,
-            product.setBranchVisibilityTeamPolicy,
-            person, BranchVisibilityRule.FORBIDDEN)
-        team = self.factory.makeTeam(owner=person)
-        self.assertRaises(
-            InvalidVisibilityPolicy,
-            product.setBranchVisibilityTeamPolicy,
-            team, BranchVisibilityRule.FORBIDDEN)

=== removed file 'lib/lp/code/stories/branches/xx-branch-edit-privacy.txt'
--- lib/lp/code/stories/branches/xx-branch-edit-privacy.txt	2012-08-29 04:23:10 +0000
+++ lib/lp/code/stories/branches/xx-branch-edit-privacy.txt	1970-01-01 00:00:00 +0000
@@ -1,121 +0,0 @@
-Changing branch privacy
-=======================
-
-Which users can have private branches is controlled by
-the branch visibility policy (see doc/branch-visibility-policy.txt).
-This controls the initial visibility of branches created by users
-in particular namespaces, either their own or teams that the user is
-a member of.
-
-Once the branch is created, the user is able to change a public branch
-to private or a private branch to public in certain circumstances.
-
-    >>> login('admin@xxxxxxxxxxxxx')
-    >>> eric = factory.makePerson(
-    ...     name='eric', displayname='Eric the Viking',
-    ...     email='eric@xxxxxxxxxxx')
-    >>> fooix = factory.makeProduct(
-    ...     name='fooix', displayname='Fooix', owner=eric)
-    >>> trunk = factory.makeProductBranch(
-    ...     owner=eric, product=fooix, name='trunk')
-    >>> logout()
-
-
-Branches with no visibility policy
-----------------------------------
-
-If there is no policy set, then the user is not able to change the visibility
-of the branch.
-
-    >>> browser = setupBrowser(auth='Basic eric@xxxxxxxxxxx:test')
-    >>> browser.open('http://code.launchpad.dev/~eric/fooix/trunk')
-    >>> browser.getLink('Change branch details').click()
-    >>> browser.getControl('Keep branch confidential')
-    Traceback (most recent call last):
-    ...
-    LookupError: label 'Keep branch confidential'
-
-However an admin can.
-
-    >>> admin_browser.open('http://code.launchpad.dev/~eric/fooix/trunk')
-    >>> admin_browser.getLink('Change branch details').click()
-    >>> admin_browser.getControl('Private', index=1).click()
-    >>> admin_browser.getControl('Change Branch').click()
-
-The branch is now private, so it assumes the standard private presentation.
-
-    >>> print_tag_with_id(admin_browser.contents, 'privacy')
-    This branch contains Private information...
-
-
-Private branches allowed
-------------------------
-
-Allow the Warty Security Team to have private firefox branches.
-
-    >>> admin_browser.open('http://launchpad.dev/firefox/+branchvisibility')
-    >>> admin_browser.getLink('Customise policy for Mozilla Firefox').click()
-    >>> admin_browser.getControl('Team', index=0).value = 'name20'
-    >>> print_radio_button_field(admin_browser.contents, 'rule')
-    ( ) Public
-    (*) Private
-    ( ) Private only
-    >>> admin_browser.getControl('Set Team Policy').click()
-
-Now Sample Person, who is a member of the Warty Security Team should be
-able to mark the branch as private.
-
-    >>> browser = setupBrowser(auth='Basic test@xxxxxxxxxxxxx:test')
-    >>> browser.open('http://code.launchpad.dev/~name12/firefox/main')
-    >>> browser.getLink('Change branch details').click()
-    >>> browser.getControl('Private', index=1).selected = True
-    >>> browser.getControl('Change Branch').click()
-
-Since the branch is now private, it will have the standard Launchpad
-presentation for private things.
-
-    >>> print extract_text(find_tag_by_id(browser.contents, 'privacy'))
-    This branch contains Private information...
-
-If Sample Person changes the branch from private back to public, the page
-reverts to its normal presentation.
-
-    >>> browser.getLink('Change branch details').click()
-    >>> browser.getControl('Public', index=0).selected = True
-    >>> browser.getControl('Change Branch').click()
-    >>> print extract_text(find_tag_by_id(browser.contents, 'privacy'))
-    This branch contains Public information...
-
-
-Private Only branches
----------------------
-
-If the policy specifies private only, then the user is able to make
-a public branch private, but not vice versa.
-
-    >>> admin_browser.getLink('Set policy for a team').click()
-    >>> admin_browser.getControl('Set Default Forbidden').click()
-    >>> admin_browser.getLink('Set policy for a team').click()
-    >>> admin_browser.getControl('Team', index=0).value = 'name20'
-    >>> admin_browser.getControl('Private only').click()
-    >>> admin_browser.getControl('Set Team Policy').click()
-
-Mark the public branch private.
-
-    >>> browser.getLink('Change branch details').click()
-    >>> browser.getControl('Private', index=1).selected = True
-    >>> browser.getControl('Change Branch').click()
-
-The branch is now private, so it assumes the standard private presentation.
-
-    >>> print extract_text(find_tag_by_id(browser.contents, 'privacy'))
-    This branch contains Private information...
-
-However when the user now looks to edit the branch details, there
-is no option to mark the branch as public.
-
-    >>> browser.getLink('Change branch details').click()
-    >>> browser.getControl('Public')
-    Traceback (most recent call last):
-    ...
-    LookupError: label 'Public'

=== removed file 'lib/lp/code/stories/branches/xx-branch-visibility-policy.txt'
--- lib/lp/code/stories/branches/xx-branch-visibility-policy.txt	2011-05-05 05:46:41 +0000
+++ lib/lp/code/stories/branches/xx-branch-visibility-policy.txt	1970-01-01 00:00:00 +0000
@@ -1,273 +0,0 @@
-Branch Visibility Policy Pages
-==============================
-
-Controlling the branch visibility policies for products and projects is only
-available to Launchpad admins and Launchpad commercial admins.
-
-Not to anonymous people.
-
-    >>> anon_browser.open('http://launchpad.dev/firefox')
-    >>> anon_browser.getLink('Define branch visibility')
-    Traceback (most recent call last):
-    ...
-    LinkNotFoundError
-
-    >>> anon_browser.open('http://launchpad.dev/firefox/+branchvisibility')
-    Traceback (most recent call last):
-    ...
-    Unauthorized: ...
-
-Nor to 'normal' users.
-
-    >>> user_browser.open('http://launchpad.dev/firefox')
-    >>> user_browser.getLink('Define branch visibility')
-    Traceback (most recent call last):
-    ...
-    LinkNotFoundError
-
-    >>> user_browser.open('http://launchpad.dev/firefox/+branchvisibility')
-    Traceback (most recent call last):
-    ...
-    Unauthorized: ...
-
-Not even the owner of the project can get to it.
-
-    >>> owner_browser = setupBrowser(auth='Basic test@xxxxxxxxxxxxx:test')
-    >>> owner_browser.open('http://code.launchpad.dev/firefox')
-    >>> owner_browser.getLink('Define branch visibility')
-    Traceback (most recent call last):
-    ...
-    LinkNotFoundError
-
-    >>> owner_browser.open('http://launchpad.dev/firefox/+branchvisibility')
-    Traceback (most recent call last):
-    ...
-    Unauthorized: ...
-
-Launchpad admins however, can get to the page to the branch visibility
-overview page and to the page to actually modify the policies.
-
-    >>> admin_browser.open('http://code.launchpad.dev/firefox')
-    >>> admin_browser.getLink('Define branch visibility').click()
-    >>> print admin_browser.url
-    http://launchpad.dev/firefox/+branchvisibility
-
-    >>> admin_browser.getLink('Customise policy for Mozilla Firefox').click()
-    >>> print admin_browser.url
-    http://launchpad.dev/firefox/+addbranchvisibilitypolicy
-
-And members of the Launchpad Commercial team can view the pages.
-
-    >>> commercial_browser = setupBrowser(
-    ...     auth='Basic commercial-member@xxxxxxxxxxxxx:test')
-    >>> commercial_browser.open('http://code.launchpad.dev/firefox')
-    >>> commercial_browser.getLink('Define branch visibility').click()
-    >>> print commercial_browser.url
-    http://launchpad.dev/firefox/+branchvisibility
-
-    >>> commercial_browser.getLink(
-    ...     'Customise policy for Mozilla Firefox').click()
-    >>> print commercial_browser.url
-    http://launchpad.dev/firefox/+addbranchvisibilitypolicy
-
-Admins can define branch visibility on projects, too.
-
-    >>> admin_browser.open('http://code.launchpad.dev/mozilla')
-    >>> admin_browser.getLink('Define branch visibility').click()
-    >>> print admin_browser.url
-    http://launchpad.dev/mozilla/+branchvisibility
-
-    >>> admin_browser.getLink('Set policy for a team').click()
-    >>> print admin_browser.url
-    http://launchpad.dev/mozilla/+addbranchvisibilitypolicy
-
-As can commercial admins.
-
-    >>> commercial_browser.open('http://code.launchpad.dev/mozilla')
-    >>> commercial_browser.getLink('Define branch visibility').click()
-    >>> print commercial_browser.url
-    http://launchpad.dev/mozilla/+branchvisibility
-
-    >>> commercial_browser.getLink('Set policy for a team').click()
-    >>> print commercial_browser.url
-    http://launchpad.dev/mozilla/+addbranchvisibilitypolicy
-
-
-Default policies
-----------------
-
-The default policies are to have all branches public.  When the branch policy
-objects are created for products they are constructed with the branch policy
-objects of their associated project if there is one.  If the product does not
-specify any branch visibility policy items and there is an inherited branch
-visibility policy, then that policy is used.
-
-    >>> admin_browser.open('http://launchpad.dev/firefox/+branchvisibility')
-
-    >>> print extract_text(
-    ...     find_tag_by_id(admin_browser.contents, 'inherited'))
-    Using inherited policy from The Mozilla Project.
-
-    >>> print extract_text(
-    ...     find_tag_by_id(admin_browser.contents, 'default-policy'))
-    Default branch visibility for all branches in Mozilla Firefox is Public.
-
-When the project is using the inherited policy, the user can either
-edit the inherited policy, or make the product have its own policy
-by explicitly setting a policy for a team.
-
-    >>> actions = find_tag_by_id(admin_browser.contents, 'policy-actions')
-    >>> for anchor in actions.fetch('a'):
-    ...     print '%s -> %s' % (anchor.renderContents(), anchor['href'])
-    Edit inherited policy -> /mozilla/+branchvisibility
-    Customise policy for Mozilla Firefox -> +addbranchvisibilitypolicy
-
-Projects never have inherited policies, so they look a little different.
-
-    >>> admin_browser.getLink('Edit inherited policy').click()
-    >>> print find_tag_by_id(admin_browser.contents, 'inherited')
-    None
-    >>> print extract_text(
-    ...     find_tag_by_id(admin_browser.contents, 'default-policy'))
-    Default branch visibility for all branches
-    in The Mozilla Project is Public.
-
-    >>> actions = find_tag_by_id(admin_browser.contents, 'policy-actions')
-    >>> for anchor in actions.fetch('a'):
-    ...     print '%s -> %s' % (anchor.renderContents(), anchor['href'])
-    Set policy for a team -> +addbranchvisibilitypolicy
-
-Products that don't have an associated project look similar to projects.
-
-    >>> admin_browser.open(
-    ...     'http://launchpad.dev/alsa-utils/+branchvisibility')
-
-    >>> print find_tag_by_id(admin_browser.contents, 'inherited')
-    None
-    >>> print extract_text(
-    ...     find_tag_by_id(admin_browser.contents, 'default-policy'))
-    Default branch visibility for all branches in alsa-utils is Public.
-    >>> actions = find_tag_by_id(admin_browser.contents, 'policy-actions')
-    >>> for anchor in actions.fetch('a'):
-    ...     print '%s -> %s' % (anchor.renderContents(), anchor['href'])
-    Set policy for a team -> +addbranchvisibilitypolicy
-
-
-Overriding the inherited policy
--------------------------------
-
-Setting any policy item overrides the use of an inherited policy, even if
-it new policy item just specifies public branches for everyone.
-
-    >>> admin_browser.open('http://launchpad.dev/firefox/+branchvisibility')
-    >>> admin_browser.getLink('Customise policy for Mozilla Firefox').click()
-    >>> admin_browser.getControl('Set Default Public').click()
-    >>> print admin_browser.url
-    http://launchpad.dev/firefox/+branchvisibility
-
-The page now does not say that we are using an inherited policy.
-
-    >>> print find_tag_by_id(admin_browser.contents, 'inherited')
-    None
-
-And the actions that we can perform don't related to inherited policies
-either.
-
-    >>> actions = find_tag_by_id(admin_browser.contents, 'policy-actions')
-    >>> for anchor in actions.fetch('a'):
-    ...     print '%s -> %s' % (anchor.renderContents(), anchor['href'])
-    Set policy for a team -> +addbranchvisibilitypolicy
-    Remove policy items -> +removebranchvisibilitypolicy
-
-    >>> print_tag_with_id(admin_browser.contents, 'policy-items')
-    Default branch visibility for all branches in Mozilla Firefox is Public.
-
-Once real teams are added, they are shown on the page.
-
-    >>> admin_browser.getLink('Set policy for a team').click()
-    >>> admin_browser.getControl('Team', index=0).value = 'launchpad'
-
-The rules are shown as radio buttons.
-
-    >>> print_radio_button_field(admin_browser.contents, 'rule')
-    ( ) Public
-    (*) Private
-    ( ) Private only
-    >>> admin_browser.getControl('Set Team Policy').click()
-
-    >>> admin_browser.getLink('Set policy for a team').click()
-    >>> admin_browser.getControl('Team', index=0).value = 'name18'
-    >>> admin_browser.getControl('Set Team Policy').click()
-
-    >>> print_tag_with_id(admin_browser.contents, 'policy-items')
-    Default branch visibility for all branches in Mozilla Firefox is Public.
-    Except for the following teams:
-    Launchpad Developers: Private
-    Ubuntu Gnome Team: Private
-
-
-Removing policy items
----------------------
-
-When removing the policy items, the defined items are shown as a list
-of checkboxes.  Any number of these can be selected, and when the
-button is clicked, they are deleted.
-
-    >>> admin_browser.getLink('Remove policy items').click()
-    >>> main = find_main_content(admin_browser.contents)
-    >>> for checkbox in [tag for tag in main.fetch('input')
-    ...                  if tag['type'] == 'checkbox']:
-    ...     print checkbox['value'], checkbox.nextSibling
-    +everyone ...Everyone: Public
-    launchpad ...Launchpad Developers: Private
-    name18 ...Ubuntu Gnome Team: Private
-
-Selecting nothing, and clicking on remove items will not remove any
-items, nor will it be an error.
-
-    >>> admin_browser.getControl('Remove Selected Policy Items').click()
-    >>> admin_browser.getLink('Remove policy items').click()
-    >>> main = find_main_content(admin_browser.contents)
-    >>> for checkbox in [tag for tag in main.fetch('input')
-    ...                  if tag['type'] == 'checkbox']:
-    ...     print checkbox['value'], checkbox.nextSibling
-    +everyone ...Everyone: Public
-    launchpad ...Launchpad Developers: Private
-    name18 ...Ubuntu Gnome Team: Private
-
-See?  All still there.
-
-Before we remove them, let's ensure that the commercial admins can see
-the removal page.
-
-    >>> commercial_browser.open(
-    ...     'http://launchpad.dev/firefox/+branchvisibility')
-    >>> commercial_browser.getLink('Remove policy items').click()
-    >>> print commercial_browser.url
-    http://launchpad.dev/firefox/+removebranchvisibilitypolicy
-
-Now to remove two.  The override for Everyone, and Launchpad Devs.
-
-    >>> admin_browser.getControl('Everyone: Public').click()
-    >>> admin_browser.getControl('Launchpad Developers: Private').click()
-    >>> admin_browser.getControl('Remove Selected Policy Items').click()
-
-    >>> print_tag_with_id(admin_browser.contents, 'policy-items')
-    Default branch visibility for all branches in Mozilla Firefox is Public.
-    Except for the following teams:
-    Ubuntu Gnome Team: Private
-
-As you can see there is still a default visibility of Public.  This
-is now implicit rather than explicit.  So if we go back to remove more
-items, there is only one more policy item to remove.  Once that is removed
-Firefox will go back to inheriting the polices of Mozilla. Let's let
-the commercial admin do the removal to ensure he has the permission.
-
-    >>> commercial_browser.open(
-    ...     'http://launchpad.dev/firefox/+branchvisibility')
-    >>> commercial_browser.getLink('Remove policy items').click()
-    >>> commercial_browser.getControl('Ubuntu Gnome Team: Private').click()
-    >>> commercial_browser.getControl('Remove Selected Policy Items').click()
-
-    >>> print_tag_with_id(commercial_browser.contents, 'inherited')
-    Using inherited policy from The Mozilla Project.

=== modified file 'lib/lp/code/stories/branches/xx-product-branches.txt'
--- lib/lp/code/stories/branches/xx-product-branches.txt	2012-10-08 10:07:11 +0000
+++ lib/lp/code/stories/branches/xx-product-branches.txt	2012-10-09 00:01:20 +0000
@@ -169,10 +169,9 @@
 Involvement portlet
 ===================
 
-There are several links in the side portlet:
-'Import a branch', 'Configure code hosting', and 'Define branch
-visibility'.  The links are only shown if the user has permission to
-perform the task.
+There are two links in the side portlet:
+'Import a branch' and 'Configure code hosting'
+The links are only shown if the user has permission to perform the task.
 
     >>> from zope.component import getUtility
     >>> from lp.registry.interfaces.product import IProductSet
@@ -215,7 +214,6 @@
     >>> print_links(admin_browser)
     Import a branch
     Configure code hosting
-    Define branch visibility
 
 The owner of the project sees the links for the activities he can
 perform, everything except defining branch visibility.

=== removed file 'lib/lp/code/templates/branch-visibility.pt'
--- lib/lp/code/templates/branch-visibility.pt	2010-10-20 08:00:58 +0000
+++ lib/lp/code/templates/branch-visibility.pt	1970-01-01 00:00:00 +0000
@@ -1,83 +0,0 @@
-<html
-  xmlns="http://www.w3.org/1999/xhtml";
-  xmlns:tal="http://xml.zope.org/namespaces/tal";
-  xmlns:metal="http://xml.zope.org/namespaces/metal";
-  xmlns:i18n="http://xml.zope.org/namespaces/i18n";
-  metal:use-macro="view/macro:page/main_only"
-  i18n:domain="launchpad">
-
-<body>
-
-  <h1 metal:fill-slot="heading">Branch visibility policy</h1>
-
-  <div metal:fill-slot="main">
-
-  <p tal:condition="context/isUsingInheritedBranchVisibilityPolicy"
-     id="inherited">
-    Using inherited policy from
-    <strong tal:content="structure context/project/fmt:link" />.
-  </p>
-
-  <div id="policy-items">
-  <p id="default-policy">
-    Default branch visibility for all branches in
-    <strong tal:content="context/displayname">Project</strong>
-    is <strong tal:content="view/base_visibility_rule/title">Public</strong>.
-  </p>
-
-  <tal:has-policies condition="view/team_policies">
-    <p>Except for the following teams:
-    </p>
-    <ul id="team-policies">
-      <li tal:repeat="item view/team_policies">
-        <tal:team replace="structure item/team/fmt:link:mainsite"
-                  condition="item/team">Team Name</tal:team>:
-        <tal:team condition="not: item/team">Everyone</tal:team>
-        <tal:policy replace="item/rule/title">Public</tal:policy>
-      </li>
-    </ul>
-
-  </tal:has-policies>
-  </div>
-
-  <div style="padding-left: 1em" id="policy-actions">
-  <tal:using-inherited-policy condition="context/isUsingInheritedBranchVisibilityPolicy">
-      <p>
-        <img src="/@@/edit" alt="edit" />
-        <a tal:define="inherited_url context/project/fmt:url"
-           tal:attributes="href string:${inherited_url}/+branchvisibility">
-          Edit inherited policy
-        </a>
-      </p>
-      <p>
-        <img src="/@@/add" alt="add" />
-        <a href="+addbranchvisibilitypolicy">Customise policy for
-          <tal:displayname replace="context/displayname">Project
-          </tal:displayname>
-        </a>
-      </p>
-  </tal:using-inherited-policy>
-
-  <tal:no-inhertied-policy condition="not: context/isUsingInheritedBranchVisibilityPolicy">
-      <p>
-        <img src="/@@/add" alt="add" />
-        <a href="+addbranchvisibilitypolicy">Set policy for a team</a>
-      </p>
-
-      <tal:can-remove condition="view/can_remove_items">
-        <p>
-          <img src="/@@/remove" alt="remove" />
-          <a href="+removebranchvisibilitypolicy">Remove policy items</a>
-        </p>
-      </tal:can-remove>
-
-  </tal:no-inhertied-policy>
-  </div>
-
-  <p>NOTE: Changing the branch visibility policies for teams does not change
-  the visibility of any existing branches.</p>
-
-</div>
-
-</body>
-</html>

=== modified file 'lib/lp/code/templates/product-branch-summary.pt'
--- lib/lp/code/templates/product-branch-summary.pt	2012-10-03 03:07:36 +0000
+++ lib/lp/code/templates/product-branch-summary.pt	2012-10-09 00:01:20 +0000
@@ -127,10 +127,6 @@
         <a tal:condition="configure_codehosting"
            tal:replace="structure configure_codehosting/fmt:link"/>
       </p>
-      <p tal:define="menu context/menu:branches;
-                     link menu/branch_visibility"
-         tal:condition="link/enabled"
-         tal:content="structure link/render"></p>
     </div>
   </div>
 

=== modified file 'lib/lp/code/templates/product-branches.pt'
--- lib/lp/code/templates/product-branches.pt	2012-09-21 02:51:51 +0000
+++ lib/lp/code/templates/product-branches.pt	2012-10-09 00:01:20 +0000
@@ -47,9 +47,6 @@
         <p tal:define="configure_codehosting view/configure_codehosting | nothing"
            tal:condition="configure_codehosting"
            tal:replace="structure configure_codehosting/fmt:link"></p>
-        <p tal:define="link menu/branch_visibility"
-           tal:condition="link/enabled"
-           tal:content="structure link/render"></p>
       </div>
 
     </div>

=== modified file 'lib/lp/code/templates/project-branches.pt'
--- lib/lp/code/templates/project-branches.pt	2010-10-22 10:28:37 +0000
+++ lib/lp/code/templates/project-branches.pt	2012-10-09 00:01:20 +0000
@@ -3,49 +3,12 @@
   xmlns:tal="http://xml.zope.org/namespaces/tal";
   xmlns:metal="http://xml.zope.org/namespaces/metal";
   xmlns:i18n="http://xml.zope.org/namespaces/i18n";
-  metal:use-macro="view/macro:page/main_side"
+  metal:use-macro="view/macro:page/main_only"
   i18n:domain="launchpad">
 
   <body>
-
-    <metal:side fill-slot="side"
-                tal:define="context_menu context/menu:context"
-                tal:condition="not:
-                context/codehosting_usage/enumvalue:UNKNOWN">
-      <div id="privacy"
-           tal:define="priv not:view/base_visibility_rule/enumvalue:PUBLIC"
-           tal:attributes="class python: priv and 'first portlet private' or 'first portlet public'">
-        <p id="default-policy" style="margin-bottom: 0;">
-          Inherited branch visibility for all projects in
-          <strong tal:content="context/displayname">Project</strong> is
-          <strong tal:content="view/base_visibility_rule/title">Public</strong>.
-        </p>
-
-        <tal:has-policies condition="view/team_policies">
-          <p>Except for the following teams:</p>
-          <ul id="team-policies">
-            <li tal:repeat="item view/team_policies">
-              <tal:team replace="structure item/team/fmt:link:mainsite"
-                        condition="item/team">Team Name</tal:team>:
-              <tal:team condition="not: item/team">Everyone</tal:team>
-              <tal:policy replace="item/rule/title">Public</tal:policy>
-            </li>
-          </ul>
-        </tal:has-policies>
-      </div>
-
-      <div id="action-portlet"
-           class="portlet"
-           tal:define="menu context/menu:overview;
-                       link menu/branch_visibility"
-           tal:condition="link/enabled">
-        <div tal:content="structure link/render" />
-      </div>
-    </metal:side>
-
     <div metal:fill-slot="main"
          tal:define="branches view/branches">
-
       <tal:no-branches
         condition="not:context/has_branches">
         <div id="no-branchtable">
@@ -74,7 +37,6 @@
         <tal:branchlisting content="structure branches/@@+branch-listing" />
       </tal:has-branches>
     </div>
-
   </body>
 
 </html>

=== modified file 'lib/lp/registry/browser/product.py'
--- lib/lp/registry/browser/product.py	2012-10-06 23:40:20 +0000
+++ lib/lp/registry/browser/product.py	2012-10-09 00:01:20 +0000
@@ -428,7 +428,6 @@
     links = [
         'details',
         'announcements',
-        'branchvisibility',
         'downloads',
         ]
 
@@ -444,11 +443,6 @@
         text = 'Downloads'
         return Link('+download', text)
 
-    @enabled_with_permission('launchpad.Commercial')
-    def branchvisibility(self):
-        text = 'Define branch visibility'
-        return Link('+branchvisibility', text)
-
 
 class ProductEditLinksMixin(StructuralSubscriptionMenuMixin):
     """A mixin class for menus that need Product edit links."""
@@ -552,7 +546,6 @@
         'announcements',
         'administer',
         'review_license',
-        'branchvisibility',
         'rdf',
         'branding',
         'view_recipes',
@@ -604,11 +597,6 @@
         text = 'Downloads'
         return Link('+download', text, icon='info')
 
-    @enabled_with_permission('launchpad.Commercial')
-    def branchvisibility(self):
-        text = 'Define branch visibility'
-        return Link('+branchvisibility', text, icon='edit')
-
 
 class ProductBugsMenu(PillarBugsMenu, ProductEditLinksMixin):
 

=== modified file 'lib/lp/registry/browser/project.py'
--- lib/lp/registry/browser/project.py	2012-10-05 13:23:44 +0000
+++ lib/lp/registry/browser/project.py	2012-10-09 00:01:20 +0000
@@ -243,9 +243,8 @@
     usedfor = IProjectGroup
     facet = 'overview'
     links = [
-        'branding', 'driver', 'reassign', 'top_contributors',
-        'announce', 'announcements', 'branch_visibility', 'rdf',
-        'new_product', 'administer', 'milestones']
+        'branding', 'driver', 'reassign', 'top_contributors', 'announce',
+        'announcements', 'rdf', 'new_product', 'administer', 'milestones']
 
     @enabled_with_permission('launchpad.Edit')
     def new_product(self):
@@ -277,11 +276,6 @@
             'RDF</abbr> metadata')
         return Link('+rdf', text, icon='download-icon')
 
-    @enabled_with_permission('launchpad.Commercial')
-    def branch_visibility(self):
-        text = 'Define branch visibility'
-        return Link('+branchvisibility', text, icon='edit', site='mainsite')
-
 
 class IProjectGroupActionMenu(Interface):
     """Marker interface for views that use ProjectActionMenu."""

=== modified file 'lib/lp/registry/browser/tests/private-team-creation-views.txt'
--- lib/lp/registry/browser/tests/private-team-creation-views.txt	2012-08-15 22:01:39 +0000
+++ lib/lp/registry/browser/tests/private-team-creation-views.txt	2012-10-09 00:01:20 +0000
@@ -285,12 +285,6 @@
     ...         BranchSubscriptionNotificationLevel.DIFFSONLY,
     ...         BranchSubscriptionDiffSize.WHOLEDIFF,
     ...         CodeReviewNotificationLevel.STATUS, team_owner)
-    ...     # A branch visibility rule.
-    ...     from lp.code.enums import BranchVisibilityRule
-    ...     from lp.registry.interfaces.product import IProductSet
-    ...     evolution = getUtility(IProductSet).getByName('evolution')
-    ...     evolution.setBranchVisibilityTeamPolicy(
-    ...         team, BranchVisibilityRule.PRIVATE)
     ...     # A PPA.
     ...     from lp.soyuz.enums import ArchivePurpose
     ...     from lp.soyuz.interfaces.archive import IArchiveSet

=== modified file 'lib/lp/registry/doc/private-team-roles.txt'
--- lib/lp/registry/doc/private-team-roles.txt	2012-08-16 05:18:54 +0000
+++ lib/lp/registry/doc/private-team-roles.txt	2012-10-09 00:01:20 +0000
@@ -84,30 +84,6 @@
     private-team
 
 
-Branch visibility policies
---------------------------
-
-Private teams can have branch visibility policies.
-
-    >>> def teamname(team):
-    ...     if team is None:
-    ...         return "*everyone*"
-    ...     else:
-    ...         return team.displayname
-    >>> def print_team_policies(context):
-    ...     for item in context.getBranchVisibilityTeamPolicies():
-    ...         print "%s: %s" % (teamname(item.team), item.rule.title)
-
-    >>> from lp.code.enums import BranchVisibilityRule
-    >>> from lp.registry.interfaces.product import IProductSet
-    >>> evolution = getUtility(IProductSet).getByName('evolution')
-    >>> print_team_policies(evolution)
-    >>> evolution.setBranchVisibilityTeamPolicy(
-    ...     priv_team, BranchVisibilityRule.PRIVATE)
-    >>> print_team_policies(evolution)
-    Private Team: Private
-
-
 PPAs
 ====
 
@@ -155,6 +131,7 @@
 
 Private teams can have structural subscriptions to products.
 
+    >>> from lp.registry.interfaces.product import IProductSet
     >>> firefox = getUtility(IProductSet).getByName('firefox')
     >>> sub = firefox.addSubscription(
     ...     subscriber=priv_team, subscribed_by=team_owner)

=== modified file 'lib/lp/registry/interfaces/product.py'
--- lib/lp/registry/interfaces/product.py	2012-10-08 10:07:11 +0000
+++ lib/lp/registry/interfaces/product.py	2012-10-09 00:01:20 +0000
@@ -98,9 +98,6 @@
 from lp.bugs.interfaces.structuralsubscription import (
     IStructuralSubscriptionTarget,
     )
-from lp.code.interfaces.branchvisibilitypolicy import (
-    IHasBranchVisibilityPolicy,
-    )
 from lp.code.interfaces.hasbranches import (
     IHasBranches,
     IHasCodeImports,
@@ -425,10 +422,10 @@
 
 class IProductPublic(
     IBugTarget, ICanGetMilestonesDirectly, IHasAppointedDriver, IHasBranches,
-    IHasBranchVisibilityPolicy, IHasDrivers, IHasExternalBugTracker, IHasIcon,
-    IHasLogo, IHasMergeProposals, IHasMilestones, IHasExpirableBugs,
-    IHasMugshot, IHasOwner, IHasSprints, IHasTranslationImports,
-    ITranslationPolicy, IKarmaContext, ILaunchpadUsage, IMakesAnnouncements,
+    IHasDrivers, IHasExternalBugTracker, IHasIcon, IHasLogo,
+    IHasMergeProposals, IHasMilestones, IHasExpirableBugs, IHasMugshot,
+    IHasOwner, IHasSprints, IHasTranslationImports, ITranslationPolicy,
+    IKarmaContext, ILaunchpadUsage, IMakesAnnouncements,
     IOfficialBugTagTargetPublic, IHasOOPSReferences, IPillar,
     ISpecificationTarget, IHasRecipes, IHasCodeImports, IServiceUsage):
     """Public IProduct properties."""

=== modified file 'lib/lp/registry/interfaces/projectgroup.py'
--- lib/lp/registry/interfaces/projectgroup.py	2012-09-14 02:57:30 +0000
+++ lib/lp/registry/interfaces/projectgroup.py	2012-10-09 00:01:20 +0000
@@ -61,9 +61,6 @@
 from lp.bugs.interfaces.structuralsubscription import (
     IStructuralSubscriptionTarget,
     )
-from lp.code.interfaces.branchvisibilitypolicy import (
-    IHasBranchVisibilityPolicy,
-    )
 from lp.code.interfaces.hasbranches import (
     IHasBranches,
     IHasMergeProposals,
@@ -121,10 +118,10 @@
 
 class IProjectGroupPublic(
     ICanGetMilestonesDirectly, IHasAppointedDriver, IHasBranches, IHasBugs,
-    IHasDrivers, IHasBranchVisibilityPolicy, IHasIcon, IHasLogo,
-    IHasMergeProposals, IHasMilestones, IHasMugshot,
-    IHasOwner, IHasSpecifications, IHasSprints, IMakesAnnouncements,
-    IKarmaContext, IRootContext, IHasOfficialBugTags, IServiceUsage):
+    IHasDrivers, IHasIcon, IHasLogo, IHasMergeProposals, IHasMilestones,
+    IHasMugshot, IHasOwner, IHasSpecifications, IHasSprints,
+    IMakesAnnouncements, IKarmaContext, IRootContext, IHasOfficialBugTags,
+    IServiceUsage):
     """Public IProjectGroup properties."""
 
     id = Int(title=_('ID'), readonly=True)

=== modified file 'lib/lp/registry/model/product.py'
--- lib/lp/registry/model/product.py	2012-10-08 10:07:11 +0000
+++ lib/lp/registry/model/product.py	2012-10-09 00:01:20 +0000
@@ -119,7 +119,6 @@
 from lp.code.enums import BranchType
 from lp.code.interfaces.branch import DEFAULT_BRANCH_STATUS_IN_LISTING
 from lp.code.model.branchnamespace import BRANCH_POLICY_ALLOWED_TYPES
-from lp.code.model.branchvisibilitypolicy import BranchVisibilityPolicyMixin
 from lp.code.model.hasbranches import (
     HasBranchesMixin,
     HasCodeImportsMixin,
@@ -328,10 +327,10 @@
 
 class Product(SQLBase, BugTargetBase, MakesAnnouncements,
               HasDriversMixin, HasSpecificationsMixin, HasSprintsMixin,
-              KarmaContextMixin, BranchVisibilityPolicyMixin,
-              QuestionTargetMixin, HasTranslationImportsMixin,
-              HasAliasMixin, StructuralSubscriptionTargetMixin,
-              HasMilestonesMixin, OfficialBugTagTargetMixin, HasBranchesMixin,
+              KarmaContextMixin, QuestionTargetMixin,
+              HasTranslationImportsMixin, HasAliasMixin,
+              StructuralSubscriptionTargetMixin, HasMilestonesMixin,
+              OfficialBugTagTargetMixin, HasBranchesMixin,
               HasCustomLanguageCodesMixin, HasMergeProposalsMixin,
               HasCodeImportsMixin, InformationTypeMixin,
               TranslationPolicyMixin):

=== modified file 'lib/lp/registry/model/projectgroup.py'
--- lib/lp/registry/model/projectgroup.py	2012-09-26 20:56:43 +0000
+++ lib/lp/registry/model/projectgroup.py	2012-10-09 00:01:20 +0000
@@ -63,7 +63,6 @@
 from lp.bugs.model.structuralsubscription import (
     StructuralSubscriptionTargetMixin,
     )
-from lp.code.model.branchvisibilitypolicy import BranchVisibilityPolicyMixin
 from lp.code.model.hasbranches import (
     HasBranchesMixin,
     HasMergeProposalsMixin,
@@ -108,8 +107,7 @@
 
 class ProjectGroup(SQLBase, BugTargetBase, HasSpecificationsMixin,
                    MakesAnnouncements, HasSprintsMixin, HasAliasMixin,
-                   KarmaContextMixin, BranchVisibilityPolicyMixin,
-                   StructuralSubscriptionTargetMixin,
+                   KarmaContextMixin, StructuralSubscriptionTargetMixin,
                    HasBranchesMixin, HasMergeProposalsMixin,
                    HasMilestonesMixin, HasDriversMixin,
                    TranslationPolicyMixin):


Follow ups