From 45b240a6124c67436cea18f90e4a3330ba819441 Mon Sep 17 00:00:00 2001 From: "justdave%syndicomm.com" <> Date: Wed, 6 Jun 2001 10:16:47 +0000 Subject: Fix for bug 75482: adding the capability to deactivate a group without deleting it (prevent new bugs from being placed into that group, but don't remove the group restriction from bugs already in it). Patch by Myk Melez r= justdave@syndicomm.com --- bug_form.pl | 9 ++++++++- checksetup.pl | 18 ++++++++++++++++++ editgroups.cgi | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++----- enter_bug.cgi | 2 +- globals.pl | 11 +++++++++++ post_bug.cgi | 11 +++++++++++ 6 files changed, 100 insertions(+), 7 deletions(-) diff --git a/bug_form.pl b/bug_form.pl index 0706ede99..7801f2754 100644 --- a/bug_form.pl +++ b/bug_form.pl @@ -368,7 +368,14 @@ print " if ($::usergroupset ne '0') { - SendSQL("select bit, description, (bit & $bug{'groupset'} != 0) from groups where bit & $::usergroupset != 0 and isbuggroup != 0 order by bit"); + SendSQL("select bit, description, (bit & $bug{'groupset'} != 0) " . + "from groups where bit & $::usergroupset != 0 " . + "and isbuggroup != 0 " . + # Include active groups as well as inactive groups to which + # the bug already belongs. This way the bug can be removed + # from an inactive group but can only be added to active ones. + "and (isactive = 1 or (bit & $bug{'groupset'} != 0)) " . + "order by bit"); while (MoreSQLData()) { my ($bit, $description, $ison) = (FetchSQLData()); my $check0 = !$ison ? " SELECTED" : ""; diff --git a/checksetup.pl b/checksetup.pl index 310250e71..0da9af763 100755 --- a/checksetup.pl +++ b/checksetup.pl @@ -790,6 +790,13 @@ $table{dependencies} = # User regexp is which email addresses are initially put into this group. # This is only used when an email account is created; otherwise, profiles # may be individually tweaked to add them in and out of groups. +# +# 2001-04-10 myk@mozilla.org: +# isactive determines whether or not a group is active. An inactive group +# cannot have bugs added to it. Deactivation is a much milder form of +# deleting a group that allows users to continue to work on bugs in the group +# without enabling them to extend the life of the group by adding bugs to it. +# http://bugzilla.mozilla.org/show_bug.cgi?id=75482 $table{groups} = 'bit bigint not null, @@ -797,6 +804,7 @@ $table{groups} = description text not null, isbuggroup tinyint not null, userregexp tinytext not null, + isactive tinyint not null default 1, unique(bit), unique(name)'; @@ -2157,6 +2165,16 @@ unless (-d 'data/duplicates') { } } +# +# 2001-04-10 myk@mozilla.org: +# isactive determines whether or not a group is active. An inactive group +# cannot have bugs added to it. Deactivation is a much milder form of +# deleting a group that allows users to continue to work on bugs in the group +# without enabling them to extend the life of the group by adding bugs to it. +# http://bugzilla.mozilla.org/show_bug.cgi?id=75482 +# +AddField('groups', 'isactive', 'tinyint not null default 1'); + # 2001-04-29 jake@acutex.net - Remove oldemailtech # http://bugzilla.mozilla.org/show_bugs.cgi?id=71552 if (-d 'shadow') { diff --git a/editgroups.cgi b/editgroups.cgi index 202cd56b9..1626fc3a4 100755 --- a/editgroups.cgi +++ b/editgroups.cgi @@ -105,16 +105,17 @@ unless ($action) { print "Name"; print "Description"; print "User RegExp"; + print "Active"; print "Action"; print "\n"; - SendSQL("SELECT bit,name,description,userregexp " . + SendSQL("SELECT bit,name,description,userregexp,isactive " . "FROM groups " . "WHERE isbuggroup != 0 " . "ORDER BY bit"); while (MoreSQLData()) { - my ($bit, $name, $desc, $regexp) = FetchSQLData(); + my ($bit, $name, $desc, $regexp, $isactive) = FetchSQLData(); print "\n"; print "$bit\n"; print "\n"; @@ -123,12 +124,14 @@ unless ($action) { print "\n"; print "\n"; print "\n"; + print "\n"; + print "\n"; print "Delete\n"; print "\n"; } print "\n"; - print "\n"; + print "\n"; print "Add Group\n"; print "\n"; print "\n"; @@ -146,6 +149,11 @@ to others in the same group.

"; print "User RegExp is optional, and if filled in, will automatically grant membership to this group to anyone creating a new account with an email address that matches this regular expression.

"; + print "The Active flag determines whether or not the group is active. +If you deactivate a group it will no longer be possible for users to add bugs +to that group, although bugs already in the group will remain in the group. +Deactivating a group is a much less drastic way to stop a group from growing +than deleting the group would be.

"; print "In addition, the following groups that determine user privileges exist. You can only edit the User rexexp on these groups. You should also take care not to duplicate the Names of any of them in your user groups.

"; @@ -201,10 +209,12 @@ if ($action eq 'add') { print "New Name"; print "New Description"; print "New User RegExp"; + print "Active"; print ""; print "\n"; print "\n"; print "\n"; + print "\n"; print "\n


\n"; print "\n"; print "\n"; @@ -218,6 +228,12 @@ may not contain any spaces.

"; print "Description is what will be shown in the bug reports to members of the group where they can choose whether the bug will be restricted to others in the same group.

"; + print "The Active flag determines whether or not the group is active. +If you deactivate a group it will no longer be possible for users to add bugs +to that group, although bugs already in the group will remain in the group. +Deactivating a group is a much less drastic way to stop a group from growing +than deleting the group would be. Note: If you are creating a group, you +probably want it to be active, in which case you should leave this checked.

"; print "User RegExp is optional, and if filled in, will automatically grant membership to this group to anyone creating a new account with an email address that matches this regular expression.

"; @@ -239,6 +255,10 @@ if ($action eq 'new') { my $name = trim($::FORM{name} || ''); my $desc = trim($::FORM{desc} || ''); my $regexp = trim($::FORM{regexp} || ''); + # convert an undefined value in the inactive field to zero + # (this occurs when the inactive checkbox is not checked + # and the browser does not send the field to the server) + my $isactive = $::FORM{isactive} || 0; unless ($name) { ShowError("You must enter a name for the new group.
" . @@ -259,6 +279,14 @@ if ($action eq 'new') { exit; } + if ($isactive != 0 && $isactive != 1) { + ShowError("The active flag was improperly set. There may be " . + "a problem with Bugzilla or a bug in your browser.
" . + "Please click the Back button and try again."); + PutFooter(); + exit; + } + # Major hack for bit values... perl can't handle 64-bit ints, so I can't # just do the math to get the next available bit number, gotta handle # them as strings... also, we're actually only going to allow 63 bits @@ -304,13 +332,14 @@ if ($action eq 'new') { # Add the new group SendSQL("INSERT INTO groups ( " . - "bit, name, description, isbuggroup, userregexp" . + "bit, name, description, isbuggroup, userregexp, isactive" . " ) VALUES ( " . $bit . "," . SqlQuote($name) . "," . SqlQuote($desc) . "," . "1," . - SqlQuote($regexp) . ")" ); + SqlQuote($regexp) . "," . + $isactive . ")" ); print "OK, done.

\n"; print "Your new group was assigned bit #$bit.

"; @@ -573,6 +602,23 @@ if ($action eq 'update') { " WHERE bit=" . SqlQuote($v)); print "Group $v user regexp updated.
\n"; } + # convert an undefined value in the inactive field to zero + # (this occurs when the inactive checkbox is not checked + # and the browser does not send the field to the server) + my $isactive = $::FORM{"isactive-$v"} || 0; + if ($::FORM{"oldisactive-$v"} != $isactive) { + $chgs = 1; + if ($isactive == 0 || $isactive == 1) { + SendSQL("UPDATE groups SET isactive=$isactive" . + " WHERE bit=" . SqlQuote($v)); + print "Group $v active flag updated.
\n"; + } else { + ShowError("The value '" . $isactive . + "' is not a valid value for the active flag.
" . + "There may be a problem with Bugzilla or a bug in your browser.
" . + "Update of active flag for group $v skipped."); + } + } } } if (!$chgs) { diff --git a/enter_bug.cgi b/enter_bug.cgi index 10c328e1b..493dcadd3 100755 --- a/enter_bug.cgi +++ b/enter_bug.cgi @@ -410,7 +410,7 @@ print " if ($::usergroupset ne '0') { SendSQL("SELECT bit, description FROM groups " . "WHERE bit & $::usergroupset != 0 " . - " AND isbuggroup != 0 ORDER BY description"); + " AND isbuggroup != 0 AND isactive = 1 ORDER BY description"); while (MoreSQLData()) { my ($bit, $description) = (FetchSQLData()); # Rather than waste time with another Param check and another database diff --git a/globals.pl b/globals.pl index 81aa80e4e..e81363673 100644 --- a/globals.pl +++ b/globals.pl @@ -969,6 +969,17 @@ sub GroupExists { return $count; } +# Determines whether or not a group is active by checking +# the "isactive" column for the group in the "groups" table. +# Note: This function selects groups by bit rather than by name. +sub GroupIsActive { + my ($groupbit) = (@_); + ConnectToDatabase(); + SendSQL("select isactive from groups where bit=$groupbit"); + my $isactive = FetchOneColumn(); + return $isactive; +} + # Determines if the given bug_status string represents an "Opened" bug. This # routine ought to be paramaterizable somehow, as people tend to introduce # new states into Bugzilla. diff --git a/post_bug.cgi b/post_bug.cgi index 90ca32f52..68842b646 100755 --- a/post_bug.cgi +++ b/post_bug.cgi @@ -207,6 +207,17 @@ $query .= "now(), 0"; foreach my $b (grep(/^bit-\d*$/, keys %::FORM)) { if ($::FORM{$b}) { my $v = substr($b, 4); + $v =~ /^(\d+)$/ + || PuntTryAgain("One of the group bits submitted was invalid."); + if (!GroupIsActive($v)) { + # Prevent the user from adding the bug to an inactive group. + # Should only happen if there is a bug in Bugzilla or the user + # hacked the "enter bug" form since otherwise the UI + # for adding the bug to the group won't appear on that form. + PuntTryAgain("You can't add this bug to the inactive group " . + "identified by the bit '$v'. This shouldn't happen, " . + "so it may indicate a bug in Bugzilla."); + } $query .= " + $v"; # Carefully written so that the math is # done by MySQL, which can handle 64-bit math, # and not by Perl, which I *think* can not. -- cgit v1.2.3-24-g4f1b