]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 658929 - User autocomplete is very slow when there are lots of users in the profi...
authorDavid Lawrence <dlawrence@mozilla.com>
Tue, 5 Jul 2011 15:06:37 +0000 (11:06 -0400)
committerDavid Lawrence <dlawrence@mozilla.com>
Tue, 5 Jul 2011 15:06:37 +0000 (11:06 -0400)
r/a=mkanat

Bugzilla/Auth.pm
Bugzilla/DB/Schema.pm
Bugzilla/Install/DB.pm
Bugzilla/User.pm
Bugzilla/WebService/User.pm
editusers.cgi
template/en/default/admin/users/list.html.tmpl
template/en/default/global/messages.html.tmpl
token.cgi

index e6127d32add23186c0bc197e92c19d04ffa5eda3..938541f569eed1b3f8ece881028e4f4fdcc8e504 100644 (file)
@@ -86,7 +86,7 @@ sub login {
 
     # Make sure the user isn't disabled.
     my $user = $login_info->{user};
-    if ($user->disabledtext) {
+    if (!$user->is_enabled) {
         return $self->_handle_login_result({ failure => AUTH_DISABLED,
                                               user    => $user }, $type);
     }
index 1603dbc4bf24bbb98bcd1561ca1952e7ba99292d..85a430f10204b93ef31844b4944b05649e88e2fa 100644 (file)
@@ -885,6 +885,8 @@ use constant ABSTRACT_SCHEMA => {
             mybugslink     => {TYPE => 'BOOLEAN', NOTNULL => 1,
                                DEFAULT => 'TRUE'},
             extern_id      => {TYPE => 'varchar(64)'},
+            is_enabled     => {TYPE => 'BOOLEAN', NOTNULL => 1, 
+                               DEFAULT => 'TRUE'}, 
         ],
         INDEXES => [
             profiles_login_name_idx => {FIELDS => ['login_name'],
index af5ddaf82a9e2b3f4c74386c79413f9ee161ef06..af276882c279cf6e714620ace9f785b59905c352 100644 (file)
@@ -651,6 +651,9 @@ sub update_table_definitions {
 
     _populate_bug_see_also_class();
 
+    # 2011-06-15 dkl@mozilla.com - Bug 658929
+    _migrate_disabledtext_boolean();
+
     ################################################################
     # New --TABLE-- changes should go *** A B O V E *** this point #
     ################################################################
@@ -3573,6 +3576,16 @@ sub _populate_bug_see_also_class {
     $dbh->bz_commit_transaction();
 }
 
+sub _migrate_disabledtext_boolean {
+    my $dbh = Bugzilla->dbh;
+    if (!$dbh->bz_column_info('profiles', 'is_enabled')) {
+        $dbh->bz_add_column("profiles", 'is_enabled',
+                            {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 'TRUE'});
+        $dbh->do("UPDATE profiles SET is_enabled = 0 
+                  WHERE disabledtext != ''");
+    }
+}
+
 1;
 
 __END__
index 89cd7ce72472c9be3a451dc23166cfa169940e2a..d21314604a3e2f8b803bf61280f4a08fcd5dc734 100644 (file)
@@ -82,6 +82,7 @@ use constant DEFAULT_USER => {
     'showmybugslink' => 0,
     'disabledtext'   => '',
     'disable_mail'   => 0,
+    'is_enabled'     => 1, 
 };
 
 use constant DB_TABLE => 'profiles';
@@ -98,6 +99,7 @@ use constant DB_COLUMNS => (
     'profiles.disabledtext',
     'profiles.disable_mail',
     'profiles.extern_id',
+    'profiles.is_enabled', 
 );
 use constant NAME_FIELD => 'login_name';
 use constant ID_FIELD   => 'userid';
@@ -110,6 +112,7 @@ use constant VALIDATORS => {
     login_name    => \&check_login_name_for_creation,
     realname      => \&_check_realname,
     extern_id     => \&_check_extern_id,
+    is_enabled    => \&_check_is_enabled, 
 };
 
 sub UPDATE_COLUMNS {
@@ -120,11 +123,18 @@ sub UPDATE_COLUMNS {
         login_name
         realname
         extern_id
+        is_enabled
     );
     push(@cols, 'cryptpassword') if exists $self->{cryptpassword};
     return @cols;
 };
 
+use constant VALIDATOR_DEPENDENCIES => {
+    is_enabled => ['disabledtext'], 
+};
+
+use constant EXTRA_REQUIRED_FIELDS => qw(is_enabled);
+
 ################################################################################
 # Functions
 ################################################################################
@@ -178,7 +188,7 @@ sub update {
 
     # XXX Can update profiles_activity here as soon as it understands
     #     field names like login_name.
-
+    
     return $changes;
 }
 
@@ -238,11 +248,20 @@ sub _check_password {
 
 sub _check_realname { return trim($_[1]) || ''; }
 
+sub _check_is_enabled {
+    my ($invocant, $is_enabled, undef, $params) = @_;
+    # is_enabled is set automatically on creation depending on whether 
+    # disabledtext is empty (enabled) or not empty (disabled).
+    # When updating the user, is_enabled is set by calling set_disabledtext().
+    # Any value passed into this validator is ignored.
+    my $disabledtext = ref($invocant) ? $invocant->disabledtext : $params->{disabledtext};
+    return $disabledtext ? 0 : 1;
+}
+
 ################################################################################
 # Mutators
 ################################################################################
 
-sub set_disabledtext { $_[0]->set('disabledtext', $_[1]); }
 sub set_disable_mail { $_[0]->set('disable_mail', $_[1]); }
 sub set_extern_id    { $_[0]->set('extern_id', $_[1]); }
 
@@ -261,6 +280,10 @@ sub set_name {
 
 sub set_password { $_[0]->set('cryptpassword', $_[1]); }
 
+sub set_disabledtext {
+    $_[0]->set('disabledtext', $_[1]);
+    $_[0]->set('is_enabled', $_[1] ? 0 : 1);
+}
 
 ################################################################################
 # Methods
@@ -272,7 +295,7 @@ sub login { $_[0]->{login_name}; }
 sub extern_id { $_[0]->{extern_id}; }
 sub email { $_[0]->login . Bugzilla->params->{'emailsuffix'}; }
 sub disabledtext { $_[0]->{'disabledtext'}; }
-sub is_disabled { $_[0]->disabledtext ? 1 : 0; }
+sub is_enabled { $_[0]->{'is_enabled'} ? 1 : 0; }
 sub showmybugslink { $_[0]->{showmybugslink}; }
 sub email_disabled { $_[0]->{disable_mail}; }
 sub email_enabled { !($_[0]->{disable_mail}); }
@@ -1341,7 +1364,7 @@ sub match {
                       "AND group_id IN(" .
                       join(', ', (-1, @{$user->visible_groups_inherited})) . ") ";
         }
-        $query    .= " AND disabledtext = '' " if $exclude_disabled;
+        $query    .= " AND is_enabled = 1 " if $exclude_disabled;
         $query    .= $dbh->sql_limit($limit) if $limit;
 
         # Execute the query, retrieve the results, and make them into
@@ -1376,7 +1399,7 @@ sub match {
                       " AND group_id IN(" .
                 join(', ', (-1, @{$user->visible_groups_inherited})) . ") ";
         }
-        $query     .= " AND disabledtext = '' " if $exclude_disabled;
+        $query     .= " AND is_enabled = 1 " if $exclude_disabled;
         $query     .= $dbh->sql_limit($limit) if $limit;
         my $user_ids = $dbh->selectcol_arrayref($query, undef, ($str, $str));
         @users = @{Bugzilla::User->new_from_list($user_ids)};
@@ -1781,7 +1804,7 @@ sub get_userlist {
                   "AND group_id IN(" .
                   join(', ', (-1, @{$self->visible_groups_inherited})) . ")";
     }
-    $query    .= " WHERE disabledtext = '' ";
+    $query    .= " WHERE is_enabled = 1 ";
     $query    .= $dbh->sql_group_by('userid', 'login_name, realname');
 
     my $sth = $dbh->prepare($query);
index b9434059d3c193431275dddf3c553107c7a32a3f..2d9276cc327c903974368c59643365c680c8be25 100644 (file)
@@ -218,7 +218,7 @@ sub get {
                 real_name => $self->type('string', $_->name),
                 name      => $self->type('string', $_->login),
                 email     => $self->type('string', $_->email),
-                can_login => $self->type('boolean', $_->is_disabled ? 0 : 1),
+                can_login => $self->type('boolean', $_->is_enabled ? 1 : 0),
                 email_enabled     => $self->type('boolean', $_->email_enabled),
                 login_denied_text => $self->type('string', $_->disabledtext),
             }} @$in_group;
@@ -231,7 +231,7 @@ sub get {
                 real_name => $self->type('string', $_->name),
                 name      => $self->type('string', $_->login),
                 email     => $self->type('string', $_->email),
-                can_login => $self->type('boolean', $_->is_disabled ? 0 : 1),
+                can_login => $self->type('boolean', $_->is_enabled ? 1 : 0),
             }} @$in_group;
     }
 
index ad70e08a8a72a88ced838296d75c1ca90792b381..2efdd01c8dad1fd5aab93e46c8ef6d4292f9a445 100755 (executable)
@@ -77,7 +77,7 @@ if ($action eq 'search') {
     my $matchstr      = $cgi->param('matchstr');
     my $matchtype     = $cgi->param('matchtype');
     my $grouprestrict = $cgi->param('grouprestrict') || '0';
-    my $query = 'SELECT DISTINCT userid, login_name, realname, disabledtext ' .
+    my $query = 'SELECT DISTINCT userid, login_name, realname, is_enabled ' .
                 'FROM profiles';
     my @bindValues;
     my $nextCondition;
index cb05e827b0477f5fc98da88162b3d9666cbdc0bd..3f745a458f400883e35565f2bb7bd1eaf4f0ee4b 100644 (file)
@@ -69,7 +69,7 @@
 [% FOREACH thisuser = users %]
   [% IF !thisuser.realname %]
     [%# We cannot pass one class now and one class later. %]
-    [% SET classes = (thisuser.disabledtext ? "bz_inactive missing" : "missing") %]
+    [% SET classes = (thisuser.is_enabled ? "missing" : "bz_inactive missing") %]
     [% overrides.realname.login_name.${thisuser.login_name} = {
            content          => "missing"
            override_content => 1
@@ -77,7 +77,7 @@
            override_class   => 1
        }
     %]
-  [% ELSIF thisuser.disabledtext %]
+  [% ELSIF !thisuser.is_enabled %]
     [% overrides.realname.login_name.${thisuser.login_name} = {
            class          => "bz_inactive"
            override_class => 1
@@ -85,7 +85,7 @@
     %]
   [% END %]
 
-  [% IF thisuser.disabledtext %]
+  [% IF !thisuser.is_enabled %]
     [% overrides.login_name.login_name.${thisuser.login_name} = {
            class          => "bz_inactive"
            override_class => 1
index 4beb048915a605ca2c1ee48ca31f662c4958e159..01eb3265153cbe70d4d5df53b513d6df484ccd0c 100644 (file)
@@ -60,6 +60,8 @@
               A new password has been set.
             [% ELSIF field == 'disabledtext' %]
               The disable text has been modified.
+            [% ELSIF field == 'is_enabled' %]
+              The user has been [% otheruser.is_enabled ? 'enabled' : 'disabled' %].
             [% ELSIF field == 'extern_id' %]
               The user's External Login ID has been modified.
             [% ELSIF field == 'disable_mail' %]
index 56093038562799ea11a86c747f239fd27e8ca051..3522834aac0fc842222b238a524a8ba2fb614231 100755 (executable)
--- a/token.cgi
+++ b/token.cgi
@@ -114,7 +114,7 @@ if ( $action eq 'reqpw' ) {
     $user_account = Bugzilla::User->check($login_name);
 
     # Make sure the user account is active.
-    if ($user_account->is_disabled) {
+    if (!$user_account->is_enabled) {
         ThrowUserError('account_disabled',
                        {disabled_reason => get_text('account_disabled', {account => $login_name})});
     }