diff --git a/Bugzilla/Product.pm b/Bugzilla/Product.pm index 8303c8773..293870f88 100644 --- a/Bugzilla/Product.pm +++ b/Bugzilla/Product.pm @@ -168,6 +168,7 @@ sub update my $self = shift; my $dbh = Bugzilla->dbh; + # This is for future when we'll have a single "save" (create/update) method my $is_new = !$self->id; # Don't update the DB if something goes wrong below -> transaction. @@ -277,31 +278,7 @@ sub update my $new_settings = $self->group_controls; my $timestamp = $dbh->selectrow_array('SELECT NOW()'); - if (Bugzilla->config->{forbid_open_products}) - { - my $has_mandatory = 0; - my $has_entry = 0; - foreach my $gid (keys %$new_settings) - { - if ($new_settings->{$gid}->{entry}) - { - $has_entry = 1; - } - if ($new_settings->{$gid}->{membercontrol} == CONTROLMAPMANDATORY && - $new_settings->{$gid}->{othercontrol} == CONTROLMAPMANDATORY) - { - $has_mandatory = 1; - } - } - if (!$has_mandatory) - { - ThrowUserError('product_mandatory_group_required'); - } - if (!$has_entry) - { - ThrowUserError('product_entry_group_required'); - } - } + $self->check_open_product; foreach my $gid (keys %$new_settings) { @@ -440,6 +417,37 @@ sub update return $changes; } +sub check_open_product +{ + my $self = shift; + if (Bugzilla->params->{forbid_open_products}) + { + my $new_settings = $self->group_controls; + my $has_mandatory = 0; + my $has_entry = 0; + foreach my $gid (keys %$new_settings) + { + if ($new_settings->{$gid}->{entry}) + { + $has_entry = 1; + } + if ($new_settings->{$gid}->{membercontrol} == CONTROLMAPMANDATORY && + $new_settings->{$gid}->{othercontrol} == CONTROLMAPMANDATORY) + { + $has_mandatory = 1; + } + } + if (!$has_mandatory) + { + ThrowUserError('product_mandatory_group_required'); + } + if (!$has_entry) + { + ThrowUserError('product_entry_group_required'); + } + } +} + sub remove_from_db { my ($self, $params) = @_; @@ -660,9 +668,9 @@ sub _create_bug_group # Associate the new group and new product. $dbh->do( - 'INSERT INTO group_control_map (group_id, product_id, membercontrol, othercontrol, editcomponents)'. - ' VALUES (?, ?, ?, ?, ?)', undef, $group->id, $self->id, - ($create_admin_group ? (0, 0, 1) : (CONTROLMAPMANDATORY, CONTROLMAPMANDATORY, 0)) + 'INSERT INTO group_control_map (group_id, product_id, membercontrol, othercontrol, editcomponents, entry)'. + ' VALUES (?, ?, ?, ?, ?, ?)', undef, $group->id, $self->id, + ($create_admin_group ? (0, 0, 1, 0) : (CONTROLMAPMANDATORY, CONTROLMAPMANDATORY, 0, 1)) ); # Grant current user permission to edit the new group and include him in it diff --git a/editproducts.cgi b/editproducts.cgi index 6b69efff5..85189dc65 100755 --- a/editproducts.cgi +++ b/editproducts.cgi @@ -189,6 +189,9 @@ if ($action eq 'new') $create_params{maxvotesperbug} = $ARGS->{maxvotesperbug}; $create_params{votestoconfirm} = $ARGS->{votestoconfirm}; } + + Bugzilla->dbh->bz_start_transaction(); + my $product = Bugzilla::Product->create(\%create_params); # Create groups and series for the new product, if requested. @@ -200,9 +203,11 @@ if ($action eq 'new') $product->_create_bug_group(1, $new_bug_group); } $product->_create_series() if $ARGS->{createseries}; - + $product->check_open_product(); delete_token($token); + Bugzilla->dbh->bz_commit_transaction(); + $vars->{message} = 'product_created'; $vars->{product} = $product; if ($useclassification)