From 0284798a8cc4987c84805634a7a84d5d853a2168 Mon Sep 17 00:00:00 2001 From: Byron Jones Date: Tue, 24 Jan 2012 15:13:22 +0800 Subject: Bug 240437: Add a "last seen date" column to the profiles table r=LpSolit, a=LpSolit --- Bugzilla.pm | 6 ++++ Bugzilla/DB/Schema.pm | 1 + Bugzilla/Install/DB.pm | 3 ++ Bugzilla/User.pm | 43 ++++++++++++++++++++------ editusers.cgi | 3 +- template/en/default/admin/users/edit.html.tmpl | 11 +++++++ template/en/default/admin/users/list.html.tmpl | 3 ++ 7 files changed, 59 insertions(+), 11 deletions(-) diff --git a/Bugzilla.pm b/Bugzilla.pm index 801ac8dfa..cbc9ec1ec 100644 --- a/Bugzilla.pm +++ b/Bugzilla.pm @@ -371,6 +371,12 @@ sub login { $class->set_user($authenticated_user); } + if ($class->sudoer) { + $class->sudoer->update_last_seen_date(); + } else { + $class->user->update_last_seen_date(); + } + return $class->user; } diff --git a/Bugzilla/DB/Schema.pm b/Bugzilla/DB/Schema.pm index eda4653e7..436258122 100644 --- a/Bugzilla/DB/Schema.pm +++ b/Bugzilla/DB/Schema.pm @@ -869,6 +869,7 @@ use constant ABSTRACT_SCHEMA => { extern_id => {TYPE => 'varchar(64)'}, is_enabled => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 'TRUE'}, + last_seen_date => {TYPE => 'DATETIME'}, ], INDEXES => [ profiles_login_name_idx => {FIELDS => ['login_name'], diff --git a/Bugzilla/Install/DB.pm b/Bugzilla/Install/DB.pm index 771d7e4f2..b9460cc31 100644 --- a/Bugzilla/Install/DB.pm +++ b/Bugzilla/Install/DB.pm @@ -647,6 +647,9 @@ sub update_table_definitions { # 2011-06-15 dkl@mozilla.com - Bug 658929 _migrate_disabledtext_boolean(); + # 2011-11-01 glob@mozilla.com - Bug 240437 + $dbh->bz_add_column('profiles', 'last_seen_date', {TYPE => 'DATETIME'}); + # 2011-10-11 miketosh - Bug 690173 _on_delete_set_null_for_audit_log_userid(); diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm index 23b08c63a..93142b3b7 100644 --- a/Bugzilla/User.pm +++ b/Bugzilla/User.pm @@ -65,16 +65,21 @@ use constant DB_TABLE => 'profiles'; # that you passed in for "name" to new(). That's because historically # Bugzilla::User used "name" for the realname field. This should be # fixed one day. -use constant DB_COLUMNS => ( - 'profiles.userid', - 'profiles.login_name', - 'profiles.realname', - 'profiles.mybugslink AS showmybugslink', - 'profiles.disabledtext', - 'profiles.disable_mail', - 'profiles.extern_id', - 'profiles.is_enabled', -); +sub DB_COLUMNS { + my $dbh = Bugzilla->dbh; + return ( + 'profiles.userid', + 'profiles.login_name', + 'profiles.realname', + 'profiles.mybugslink AS showmybugslink', + 'profiles.disabledtext', + 'profiles.disable_mail', + 'profiles.extern_id', + 'profiles.is_enabled', + $dbh->sql_date_format('last_seen_date', '%Y-%m-%d') . ' AS last_seen_date', + ), +} + use constant NAME_FIELD => 'login_name'; use constant ID_FIELD => 'userid'; use constant LIST_ORDER => NAME_FIELD; @@ -258,6 +263,23 @@ sub set_disabledtext { $_[0]->set('is_enabled', $_[1] ? 0 : 1); } +sub update_last_seen_date { + my $self = shift; + return unless $self->id; + my $dbh = Bugzilla->dbh; + my $date = $dbh->selectrow_array( + 'SELECT ' . $dbh->sql_date_format('NOW()', '%Y-%m-%d')); + + if (!$self->last_seen_date or $date ne $self->last_seen_date) { + $self->{last_seen_date} = $date; + # We don't use the normal update() routine here as we only + # want to update the last_seen_date column, not any other + # pending changes + $dbh->do("UPDATE profiles SET last_seen_date = ? WHERE userid = ?", + undef, $date, $self->id); + } +} + ################################################################################ # Methods ################################################################################ @@ -272,6 +294,7 @@ sub is_enabled { $_[0]->{'is_enabled'} ? 1 : 0; } sub showmybugslink { $_[0]->{showmybugslink}; } sub email_disabled { $_[0]->{disable_mail}; } sub email_enabled { !($_[0]->{disable_mail}); } +sub last_seen_date { $_[0]->{last_seen_date}; } sub cryptpassword { my $self = shift; # We don't store it because we never want it in the object (we diff --git a/editusers.cgi b/editusers.cgi index 80c83f1c1..b4b86b880 100755 --- a/editusers.cgi +++ b/editusers.cgi @@ -64,7 +64,8 @@ if ($action eq 'search') { my $matchtype = $cgi->param('matchtype'); my $grouprestrict = $cgi->param('grouprestrict') || '0'; my $enabled_only = $cgi->param('enabled_only') || '0'; - my $query = 'SELECT DISTINCT userid, login_name, realname, is_enabled ' . + my $query = 'SELECT DISTINCT userid, login_name, realname, is_enabled, ' . + $dbh->sql_date_format('last_seen_date', '%Y-%m-%d') . ' AS last_seen_date ' . 'FROM profiles'; my @bindValues; my $nextCondition; diff --git a/template/en/default/admin/users/edit.html.tmpl b/template/en/default/admin/users/edit.html.tmpl index 0f5e79f5b..b75f8400d 100644 --- a/template/en/default/admin/users/edit.html.tmpl +++ b/template/en/default/admin/users/edit.html.tmpl @@ -101,6 +101,17 @@ [% END %] + + + Last Login: + + [% IF otheruser.last_seen_date %] + [% otheruser.last_seen_date FILTER html %] + [% ELSE %] + never + [% END %] + +

diff --git a/template/en/default/admin/users/list.html.tmpl b/template/en/default/admin/users/list.html.tmpl index 15cb15c2b..ff23b7727 100644 --- a/template/en/default/admin/users/list.html.tmpl +++ b/template/en/default/admin/users/list.html.tmpl @@ -35,6 +35,9 @@ {name => 'realname' heading => 'Real name' } + {name => 'last_seen_date' + heading => 'Last Login' + } {heading => 'Account History' content => 'View' contentlink => 'editusers.cgi?action=activity' _ -- cgit v1.2.3-24-g4f1b