diff options
Diffstat (limited to 'extensions/LastResolved/Extension.pm')
-rw-r--r-- | extensions/LastResolved/Extension.pm | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/extensions/LastResolved/Extension.pm b/extensions/LastResolved/Extension.pm new file mode 100644 index 000000000..ad0519387 --- /dev/null +++ b/extensions/LastResolved/Extension.pm @@ -0,0 +1,113 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. + +package Bugzilla::Extension::LastResolved; + +use strict; + +use base qw(Bugzilla::Extension); + +use Bugzilla::Bug qw(LogActivityEntry); +use Bugzilla::Util qw(format_time); +use Bugzilla::Constants; +use Bugzilla::Field; +use Bugzilla::Install::Util qw(indicate_progress); + +our $VERSION = '0.01'; + +sub install_update_db { + my ($self, $args) = @_; + my $last_resolved = Bugzilla::Field->new({'name' => 'cf_last_resolved'}); + if (!$last_resolved) { + Bugzilla::Field->create({ + name => 'cf_last_resolved', + description => 'Last Resolved', + type => FIELD_TYPE_DATETIME, + mailhead => 0, + enter_bug => 0, + obsolete => 0, + custom => 1, + buglist => 1, + }); + _migrate_last_resolved(); + } +} + +sub _migrate_last_resolved { + my $dbh = Bugzilla->dbh; + my $field_id = get_field_id('bug_status'); + my $resolved_activity = $dbh->selectall_arrayref( + "SELECT bugs_activity.bug_id, bugs_activity.bug_when, bugs_activity.who + FROM bugs_activity + WHERE bugs_activity.fieldid = ? + AND bugs_activity.added = 'RESOLVED' + ORDER BY bugs_activity.bug_when", + undef, $field_id); + + my $count = 1; + my $total = scalar @$resolved_activity; + my %current_last_resolved; + foreach my $activity (@$resolved_activity) { + indicate_progress({ current => $count++, total => $total, every => 25 }); + my ($id, $new, $who) = @$activity; + my $old = $current_last_resolved{$id} ? $current_last_resolved{$id} : ""; + $dbh->do("UPDATE bugs SET cf_last_resolved = ? WHERE bug_id = ?", undef, $new, $id); + LogActivityEntry($id, 'cf_last_resolved', $old, $new, $who, $new); + $current_last_resolved{$id} = $new; + } +} + +sub bug_check_can_change_field { + my ($self, $args) = @_; + my ($field, $priv_results) = @$args{qw(field priv_results)}; + if ($field eq 'cf_last_resolved') { + push (@$priv_results, PRIVILEGES_REQUIRED_EMPOWERED); + } +} + +sub bug_end_of_update { + my ($self, $args) = @_; + my $dbh = Bugzilla->dbh; + my ($bug, $old_bug, $timestamp, $changes) = + @$args{qw(bug old_bug timestamp changes)}; + if ($changes->{'bug_status'}) { + # If the bug has been resolved then update the cf_last_resolved + # value to the current timestamp if cf_last_resolved exists + if ($bug->bug_status eq 'RESOLVED') { + $dbh->do("UPDATE bugs SET cf_last_resolved = ? WHERE bug_id = ?", + undef, $timestamp, $bug->id); + my $old_value = $bug->cf_last_resolved || ''; + LogActivityEntry($bug->id, 'cf_last_resolved', $old_value, + $timestamp, Bugzilla->user->id, $timestamp); + } + } +} + +sub bug_fields { + my ($self, $args) = @_; + my $fields = $args->{'fields'}; + push (@$fields, 'cf_last_resolved') +} + +sub object_columns { + my ($self, $args) = @_; + my ($class, $columns) = @$args{qw(class columns)}; + if ($class->isa('Bugzilla::Bug')) { + push(@$columns, 'cf_last_resolved'); + } +} + +sub buglist_columns { + my ($self, $args) = @_; + my $columns = $args->{columns}; + $columns->{'cf_last_resolved'} = { + name => 'bugs.cf_last_resolved', + title => 'Last Resolved', + }; +} + +__PACKAGE__->NAME; |