summaryrefslogtreecommitdiffstats
path: root/extensions/Needinfo/Extension.pm
diff options
context:
space:
mode:
authorDave Lawrence <dlawrence@mozilla.com>2012-09-17 18:39:39 +0200
committerDave Lawrence <dlawrence@mozilla.com>2012-09-17 18:39:39 +0200
commit40a4bbb0e6a57e7f8f2b0bc5a59235ab33392f91 (patch)
tree63e46a03a55f1f52d91b1632becaa6003f1312dd /extensions/Needinfo/Extension.pm
parent84a62d37eb8f83f1edb287abc530b5c9967a1218 (diff)
downloadbugzilla-40a4bbb0e6a57e7f8f2b0bc5a59235ab33392f91.tar.gz
bugzilla-40a4bbb0e6a57e7f8f2b0bc5a59235ab33392f91.tar.xz
Bug 778731 - Add email flag to NEEDINFO state
r=glob
Diffstat (limited to 'extensions/Needinfo/Extension.pm')
-rw-r--r--extensions/Needinfo/Extension.pm167
1 files changed, 167 insertions, 0 deletions
diff --git a/extensions/Needinfo/Extension.pm b/extensions/Needinfo/Extension.pm
new file mode 100644
index 000000000..4ffabcb55
--- /dev/null
+++ b/extensions/Needinfo/Extension.pm
@@ -0,0 +1,167 @@
+# 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::Needinfo;
+
+use strict;
+
+use base qw(Bugzilla::Extension);
+
+use Bugzilla::Bug;
+use Bugzilla::User;
+use Bugzilla::Flag;
+use Bugzilla::FlagType;
+
+our $VERSION = '0.01';
+
+sub install_update_db {
+ my ($self, $args) = @_;
+ my $dbh = Bugzilla->dbh;
+
+ if (@{ Bugzilla::FlagType::match({ name => 'needinfo' }) }) {
+ return;
+ }
+
+ print "Creating needinfo flag ... " .
+ "enable the Needinfo feature by editing the flag's properties.\n";
+
+ # Initially populate the list of exclusions as __Any__:__Any__ to
+ # allow admin to decide which products to enable the flag for.
+ my $flagtype = Bugzilla::FlagType->create({
+ name => 'needinfo',
+ description => "Set this flag when the bug is in need of additional information",
+ target_type => 'bug',
+ cc_list => '',
+ sortkey => 1,
+ is_active => 1,
+ is_requestable => 1,
+ is_requesteeble => 1,
+ is_multiplicable => 0,
+ request_group => '',
+ grant_group => '',
+ inclusions => [],
+ exclusions => ['0:0'],
+ });
+}
+
+# Clear the needinfo? flag if comment is being given by
+# requestee or someone used the override flag.
+sub bug_end_of_update {
+ my ($self, $args) = @_;
+ my $bug = $args->{bug};
+ my $old_bug = $args->{old_bug};
+ my $timestamp = $args->{timestamp};
+ my $changes = $args->{changes};
+
+ my $user = Bugzilla->user;
+ my $cgi = Bugzilla->cgi;
+ my $params = Bugzilla->input_params;
+
+ return if $params->{needinfo_done};
+
+ my $needinfo = delete $params->{needinfo};
+ my $needinfo_from = delete $params->{needinfo_from};
+ my $needinfo_role = delete $params->{needinfo_role};
+ my $override = delete $params->{needinfo_override};
+ my $is_private = $params->{'comment_is_private'};
+
+ # Set the needinfo flag if user is requesting more information
+ my @new_flags;
+ my $needinfo_requestee;
+
+ if ($user->in_group('canconfirm') && $needinfo) {
+ foreach my $type (@{ $bug->flag_types }) {
+ next if $type->name ne 'needinfo';
+ next if @{ $type->{flags} };
+
+ my $needinfo_flag = { type_id => $type->id, status => '?' };
+
+ # Use assigned_to as requestee
+ if ($needinfo_role eq 'assigned_to') {
+ $needinfo_flag->{requestee} = $bug->assigned_to->login;
+ }
+ # Use reporter as requestee
+ elsif ( $needinfo_role eq 'reporter') {
+ $needinfo_flag->{requestee} = $bug->reporter->login;
+ }
+ # Use qa_contact as requestee
+ elsif ($needinfo_role eq 'qa_contact') {
+ $needinfo_flag->{requestee} = $bug->qa_contact->login;
+ }
+ # Use user specified requestee
+ elsif ($needinfo_role eq 'other' && $needinfo_from) {
+ Bugzilla::User->check($needinfo_from);
+ $needinfo_flag->{requestee} = $needinfo_from;
+ }
+
+ if ($needinfo) {
+ push(@new_flags, $needinfo_flag);
+ last;
+ }
+ }
+ }
+
+ # Clear the flag if bug is being closed or if additional
+ # information was given as requested
+ my @flags;
+ foreach my $flag (@{ $bug->flags }) {
+ next if $flag->type->name ne 'needinfo';
+ my $clear_needinfo = 0;
+
+ # Clear if somehow the flag has been set to +/-
+ $clear_needinfo = 1 if $flag->status ne '?';
+
+ # Clear if current user has selected override
+ $clear_needinfo = 1 if $override;
+
+ # Clear if bug is being closed
+ if (($bug->bug_status ne $old_bug->bug_status)
+ && !$old_bug->status->is_open)
+ {
+ $clear_needinfo = 1;
+ }
+
+ # Clear if comment provided by the proper requestee
+ if ($bug->{added_comments}
+ && (!$flag->requestee || $flag->requestee->login eq Bugzilla->user->login)
+ && (!$is_private || $flag->setter->is_insider))
+ {
+ $clear_needinfo = 1;
+ }
+
+ if ($clear_needinfo) {
+ push(@flags, { id => $flag->id, status => 'X' });
+ }
+ }
+
+ if (@flags || @new_flags) {
+ $bug->set_flags(\@flags, \@new_flags);
+ my ($removed, $added) = Bugzilla::Flag->update_flags($bug, $old_bug, $timestamp);
+ if ($removed || $added) {
+ my $field = 'flagtypes.name';
+ $removed ||= '';
+ $added ||= '';
+ LogActivityEntry($bug->id, $field, $removed, $added, $user->id, $timestamp);
+
+ # Do not overwrite other flag changes
+ if ($changes->{$field}) {
+ if ($changes->{$field}->[0]) {
+ $removed = $changes->{$field}->[0] . ",$removed";
+ }
+ if ($changes->{$field}->[1]) {
+ $added = $changes->{$field}->[1] . ",$added";
+ }
+ }
+ $changes->{$field} = [$removed, $added];
+ }
+ }
+
+ # Set needinfo_done param to true so as to not loop back here
+ $params->{needinfo_done} = 1;
+ Bugzilla->input_params($params);
+}
+
+__PACKAGE__->NAME;