From d4def1e24aa0e9329df1e39de161830b4884e565 Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" <> Date: Fri, 4 Aug 2006 11:04:25 +0000 Subject: Bug 347290: Move default product and classification creation into Bugzilla::Install Patch By Max Kanat-Alexander (module owner) a=justdave --- Bugzilla/DB/Schema.pm | 12 +++++--- Bugzilla/Install.pm | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ Bugzilla/Install/DB.pm | 15 +++++++-- checksetup.pl | 63 ++++++-------------------------------- 4 files changed, 113 insertions(+), 60 deletions(-) diff --git a/Bugzilla/DB/Schema.pm b/Bugzilla/DB/Schema.pm index 9f4670845..088a70a78 100644 --- a/Bugzilla/DB/Schema.pm +++ b/Bugzilla/DB/Schema.pm @@ -874,12 +874,16 @@ use constant ABSTRACT_SCHEMA => { classification_id => {TYPE => 'INT2', NOTNULL => 1, DEFAULT => '1'}, description => {TYPE => 'MEDIUMTEXT'}, - milestoneurl => {TYPE => 'TINYTEXT', NOTNULL => 1}, - disallownew => {TYPE => 'BOOLEAN', NOTNULL => 1}, - votesperuser => {TYPE => 'INT2', NOTNULL => 1}, + milestoneurl => {TYPE => 'TINYTEXT', NOTNULL => 1, + DEFAULT => "''"}, + disallownew => {TYPE => 'BOOLEAN', NOTNULL => 1, + DEFAULT => 0}, + votesperuser => {TYPE => 'INT2', NOTNULL => 1, + DEFAULT => 0}, maxvotesperbug => {TYPE => 'INT2', NOTNULL => 1, DEFAULT => '10000'}, - votestoconfirm => {TYPE => 'INT2', NOTNULL => 1}, + votestoconfirm => {TYPE => 'INT2', NOTNULL => 1, + DEFAULT => 0}, defaultmilestone => {TYPE => 'varchar(20)', NOTNULL => 1, DEFAULT => "'---'"}, ], diff --git a/Bugzilla/Install.pm b/Bugzilla/Install.pm index 4e94fa4a4..f35292ed9 100644 --- a/Bugzilla/Install.pm +++ b/Bugzilla/Install.pm @@ -26,7 +26,10 @@ package Bugzilla::Install; use strict; +use Bugzilla::Group; +use Bugzilla::Product; use Bugzilla::User::Setting; +use Bugzilla::Version; use constant SETTINGS => { # 2005-03-03 travis@sedsystems.ca -- Bug 41972 @@ -50,6 +53,25 @@ use constant SETTINGS => { }; +use constant DEFAULT_CLASSIFICATION => { + name => 'Unclassified', + description => 'Unassigned to any classification' +}; + +use constant DEFAULT_PRODUCT => { + name => 'TestProduct', + description => 'This is a test product.' + . ' This ought to be blown away and replaced with real stuff in a' + . ' finished installation of bugzilla.' +}; + +use constant DEFAULT_COMPONENT => { + name => 'TestComponent', + description => 'This is a test component in the test product database.' + . ' This ought to be blown away and replaced with real stuff in' + . ' a finished installation of Bugzilla.' +}; + sub update_settings { my %settings = %{SETTINGS()}; foreach my $setting (keys %settings) { @@ -58,6 +80,58 @@ sub update_settings { } } +# This function should be called only after creating the admin user. +sub create_default_product { + my $dbh = Bugzilla->dbh; + + # Make the default Classification if it doesn't already exist. + if (!$dbh->selectrow_array('SELECT 1 FROM classifications')) { + my $class = DEFAULT_CLASSIFICATION; + print "Creating default classification '$class->{name}'...\n"; + $dbh->do('INSERT INTO classifications (name, description) + VALUES (?, ?)', + undef, $class->{name}, $class->{description}); + } + + # And same for the default product/component. + if (!$dbh->selectrow_array('SELECT 1 FROM products')) { + my $default_prod = DEFAULT_PRODUCT; + print "Creating initial dummy product '$default_prod->{name}'...\n"; + + $dbh->do(q{INSERT INTO products (name, description) + VALUES (?,?)}, + undef, $default_prod->{name}, $default_prod->{description}); + + my $product = new Bugzilla::Product({name => $default_prod->{name}}); + + # The default version. + Bugzilla::Version::create(Bugzilla::Version::DEFAULT_VERSION, $product); + + # And we automatically insert the default milestone. + $dbh->do(q{INSERT INTO milestones (product_id, value, sortkey) + SELECT id, defaultmilestone, 0 + FROM products}); + + # Get the user who will be the owner of the Product. + # We pick the admin with the lowest id, or we insert + # an invalid "0" into the database, just so that we can + # create the component. + my $admin_group = new Bugzilla::Group({name => 'admin'}); + my ($admin_id) = $dbh->selectrow_array( + 'SELECT user_id FROM user_group_map WHERE group_id = ? + ORDER BY user_id ' . $dbh->sql_limit(1), + undef, $admin_group->id) || 0; + + my $default_comp = DEFAULT_COMPONENT; + + $dbh->do("INSERT INTO components (name, product_id, description, + initialowner) + VALUES (?, ?, ?, ?)", undef, $default_comp->{name}, + $product->id, $default_comp->{description}, $admin_id); + } + +} + 1; __END__ @@ -100,4 +174,13 @@ Params: none Returns: nothing. +=item C + +Description: Creates the default product and classification if + they don't exist. + +Params: none + +Returns: nothing + =back diff --git a/Bugzilla/Install/DB.pm b/Bugzilla/Install/DB.pm index 46e9b5c5a..9b29bbc76 100644 --- a/Bugzilla/Install/DB.pm +++ b/Bugzilla/Install/DB.pm @@ -449,6 +449,16 @@ sub update_table_definitions { _add_classifications_sortkey(); _move_data_nomail_into_db(); + + # The products table lacked sensible defaults. + $dbh->bz_alter_column('products', 'milestoneurl', + {TYPE => 'TINYTEXT', NOTNULL => 1, DEFAULT => "''"}); + $dbh->bz_alter_column('products', 'disallownew', + {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 0}); + $dbh->bz_alter_column('products', 'votesperuser', + {TYPE => 'INT2', NOTNULL => 1, DEFAULT => 0}); + $dbh->bz_alter_column('products', 'votestoconfirm', + {TYPE => 'INT2', NOTNULL => 1, DEFAULT => 0}); ################################################################ # New --TABLE-- changes should go *** A B O V E *** this point # @@ -1194,9 +1204,10 @@ sub _use_ids_for_products_and_components { $dbh->do("UPDATE attachstatusdefs SET product_id = $product_id " . "WHERE product = " . $dbh->quote($product)) if $dbh->bz_table_info("attachstatusdefs"); - } + } + + print "Updating the database to use component IDs.\n"; - print "Updating the database to use component IDs.\n"; $dbh->bz_add_column("components", "id", {TYPE => 'SMALLSERIAL', NOTNULL => 1, PRIMARYKEY => 1}); $dbh->bz_add_column("bugs", "component_id", diff --git a/checksetup.pl b/checksetup.pl index ed670a271..4dad00ecd 100755 --- a/checksetup.pl +++ b/checksetup.pl @@ -466,53 +466,6 @@ Bugzilla::Install::DB::update_fielddefs_definition(); Bugzilla::Field::populate_field_definitions(); -########################################################################### -# Create initial test product if there are no products present. -########################################################################### -my $sth = $dbh->prepare("SELECT description FROM products"); -$sth->execute; -unless ($sth->rows) { - print "Creating initial dummy product 'TestProduct' ...\n"; - my $test_product_name = 'TestProduct'; - my $test_product_desc = - 'This is a test product. This ought to be blown away and' - . ' replaced with real stuff in a finished installation of bugzilla.'; - my $test_product_version = 'other'; - - $dbh->do(q{INSERT INTO products(name, description, milestoneurl, - disallownew, votesperuser, votestoconfirm) - VALUES (?, ?, '', ?, ?, ?)}, - undef, $test_product_name, $test_product_desc, 0, 0, 0); - - # We could probably just assume that this is "1", but better - # safe than sorry... - my $product_id = $dbh->bz_last_key('products', 'id'); - - $dbh->do(q{INSERT INTO versions (value, product_id) - VALUES (?, ?)}, - undef, $test_product_version, $product_id); - # note: since admin user is not yet known, components gets a 0 for - # initialowner and this is fixed during final checks. - $dbh->do("INSERT INTO components (name, product_id, description, " . - "initialowner) " . - "VALUES (" . - "'TestComponent', $product_id, " . - "'This is a test component in the test product database. " . - "This ought to be blown away and replaced with real stuff in " . - "a finished installation of Bugzilla.', 0)"); - $dbh->do(q{INSERT INTO milestones (product_id, value, sortkey) - VALUES (?,?,?)}, - undef, $product_id, '---', 0); -} - -# Create a default classification if one does not exist -my $class_count = - $dbh->selectrow_array("SELECT COUNT(*) FROM classifications"); -if (!$class_count) { - $dbh->do("INSERT INTO classifications (name,description) " . - "VALUES('Unclassified','Unassigned to any classifications')"); -} - ########################################################################### # Update the tables to the current definition --TABLE-- ########################################################################### @@ -576,7 +529,7 @@ use constant GRANT_DERIVED => 1; # Get rid of leftover DERIVED group permissions $dbh->do("DELETE FROM user_group_map WHERE grant_type = " . GRANT_DERIVED); # Evaluate regexp-based group memberships -$sth = $dbh->prepare("SELECT profiles.userid, profiles.login_name, +my $sth = $dbh->prepare("SELECT profiles.userid, profiles.login_name, groups.id, groups.userregexp, user_group_map.group_id FROM (profiles @@ -845,9 +798,15 @@ if ($sth->rows == 0) { print "\n$login is now set up as an administrator account.\n"; } +########################################################################### +# Create default Product and Classification +########################################################################### -# -# Final checks... +Bugzilla::Install::create_default_product(); + +########################################################################### +# Final checks +########################################################################### $sth = $dbh->prepare("SELECT user_id " . "FROM groups INNER JOIN user_group_map " . @@ -856,10 +815,6 @@ $sth = $dbh->prepare("SELECT user_id " . $sth->execute; my ($adminuid) = $sth->fetchrow_array; if (!$adminuid) { die "No administrator!" } # should never get here -# when test product was created, admin was unknown -$dbh->do("UPDATE components " . - "SET initialowner = $adminuid " . - "WHERE initialowner = 0"); # Check if the default parameter for urlbase is still set, and if so, give # notification that they should go and visit editparams.cgi -- cgit v1.2.3-24-g4f1b