From a7196a73cec5af3aa91f0af93d6316df1db7f433 Mon Sep 17 00:00:00 2001 From: Max Kanat-Alexander Date: Thu, 11 Feb 2010 12:32:08 -0800 Subject: Bug 545715: New Hook: bugmail_relationships r=mkanat, a=mkanat (module owner) --- Bugzilla/BugMail.pm | 25 ++++++++++++------------- Bugzilla/Constants.pm | 14 ++++++++++++-- Bugzilla/Hook.pm | 27 +++++++++++++++++++++++++++ Bugzilla/User.pm | 4 +++- extensions/Example/Extension.pm | 25 +++++++++++++++++++++---- userprefs.cgi | 4 +++- 6 files changed, 78 insertions(+), 21 deletions(-) diff --git a/Bugzilla/BugMail.pm b/Bugzilla/BugMail.pm index b718f4199..204c4ba9a 100644 --- a/Bugzilla/BugMail.pm +++ b/Bugzilla/BugMail.pm @@ -55,17 +55,6 @@ use constant FORMAT_2_SIZE => [19,55]; use constant BIT_DIRECT => 1; use constant BIT_WATCHING => 2; -# We need these strings for the X-Bugzilla-Reasons header -# Note: this hash uses "," rather than "=>" to avoid auto-quoting of the LHS. -use constant REL_NAMES => { - REL_ASSIGNEE , "AssignedTo", - REL_REPORTER , "Reporter", - REL_QA , "QAcontact", - REL_CC , "CC", - REL_VOTER , "Voter", - REL_GLOBAL_WATCHER, "GlobalWatcher" -}; - # We use this instead of format because format doesn't deal well with # multi-byte languages. sub multiline_sprintf { @@ -100,6 +89,15 @@ sub three_columns { return multiline_sprintf(FORMAT_TRIPLE, \@_, FORMAT_3_SIZE); } +sub relationships { + my $ref = RELATIONSHIPS; + # Clone it so that we don't modify the constant; + my %relationships = %$ref; + Bugzilla::Hook::process('bugmail_relationships', + { relationships => \%relationships }); + return %relationships; +} + # This is a bit of a hack, basically keeping the old system() # cmd line interface. Should clean this up at some point. # @@ -615,8 +613,9 @@ sub sendMail { push(@reasons_watch, $relationship) if ($bits & BIT_WATCHING); } - my @headerrel = map { REL_NAMES->{$_} } @reasons; - my @watchingrel = map { REL_NAMES->{$_} } @reasons_watch; + my %relationships = relationships(); + my @headerrel = map { $relationships{$_} } @reasons; + my @watchingrel = map { $relationships{$_} } @reasons_watch; push(@headerrel, 'None') unless @headerrel; push(@watchingrel, 'None') unless @watchingrel; push @watchingrel, map { user_id_to_login($_) } @$watchingRef; diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm index 948ff5337..8ab7455ff 100644 --- a/Bugzilla/Constants.pm +++ b/Bugzilla/Constants.pm @@ -298,8 +298,18 @@ use constant REL_CC => 3; use constant REL_VOTER => 4; use constant REL_GLOBAL_WATCHER => 5; -use constant RELATIONSHIPS => REL_ASSIGNEE, REL_QA, REL_REPORTER, REL_CC, - REL_VOTER, REL_GLOBAL_WATCHER; +# We need these strings for the X-Bugzilla-Reasons header +# Note: this hash uses "," rather than "=>" to avoid auto-quoting of the LHS. +# This should be accessed through Bugzilla::BugMail::relationships() instead +# of being accessed directly. +use constant RELATIONSHIPS => { + REL_ASSIGNEE , "AssignedTo", + REL_REPORTER , "Reporter", + REL_QA , "QAcontact", + REL_CC , "CC", + REL_VOTER , "Voter", + REL_GLOBAL_WATCHER, "GlobalWatcher" +}; # Used for global events like EVT_FLAG_REQUESTED use constant REL_ANY => 100; diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm index cf718c94f..a02a04921 100644 --- a/Bugzilla/Hook.pm +++ b/Bugzilla/Hook.pm @@ -398,6 +398,33 @@ instead of as a string.) =back +=head2 bugmail_relationships + +There are various sorts of "relationships" that a user can have to a bug, +such as Assignee, CC, etc. If you want to add a new type of relationship, +you should use this hook. + +Params: + +=over + +=item C + +A hashref, where the keys are numbers and the values are strings. + +The keys represent a numeric identifier for the relationship. The +numeric identifier should be a negative number between -1 and -127. +The number must be unique across all extensions. (Negative numbers +are used so as not to conflict with relationship identifiers in Bugzilla +itself.) + +The value is the "name" of this relationship that will show up in email +headers in bugmails. The "name" should be short and should contain no +spaces. + +=back + + =head2 colchange_columns This happens in F right after the list of possible display diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm index e0c5b132f..240fcfcdb 100644 --- a/Bugzilla/User.pm +++ b/Bugzilla/User.pm @@ -1568,7 +1568,9 @@ sub create { my $user = $class->SUPER::create(@_); # Turn on all email for the new user - foreach my $rel (RELATIONSHIPS) { + require Bugzilla::BugMail; + my %relationships = Bugzilla::BugMail::relationships(); + foreach my $rel (keys %relationships) { foreach my $event (POS_EVENTS, NEG_EVENTS) { # These "exceptions" define the default email preferences. # diff --git a/extensions/Example/Extension.pm b/extensions/Example/Extension.pm index fd75cbf64..6acf3e135 100644 --- a/extensions/Example/Extension.pm +++ b/extensions/Example/Extension.pm @@ -36,6 +36,9 @@ use Bugzilla::Extension::Example::Util; use Data::Dumper; +# See bugmail_relationships. +use constant REL_EXAMPLE => -127; + our $VERSION = '1.0'; sub attachment_process_data { @@ -193,14 +196,28 @@ sub bugmail_recipients { my ($self, $args) = @_; my $recipients = $args->{recipients}; my $bug = $args->{bug}; + + my $user = + new Bugzilla::User({ name => Bugzilla->params->{'maintainer'} }); + if ($bug->id == 1) { - # Uncomment the line below to add the second user in the Bugzilla - # database to the recipients list of every bugmail sent out about - # bug 1 as though that user were on the CC list. - #$recipients->{2}->{+REL_CC} = 1; + # Uncomment the line below to add the maintainer to the recipients + # list of every bugmail from bug 1 as though that the maintainer + # were on the CC list. + #$recipients->{$user->id}->{+REL_CC} = 1; + + # And this line adds the maintainer as though he had the "REL_EXAMPLE" + # relationship from the bugmail_relationships hook below. + #$recipients->{$user->id}->{+REL_EXAMPLE} = 1; } } +sub bugmail_relationships { + my ($self, $args) = @_; + my $relationships = $args->{relationships}; + $relationships->{+REL_EXAMPLE} = 'Example'; +} + sub colchange_columns { my ($self, $args) = @_; diff --git a/userprefs.cgi b/userprefs.cgi index e6ee8fb8a..194469a00 100755 --- a/userprefs.cgi +++ b/userprefs.cgi @@ -27,6 +27,7 @@ use strict; use lib qw(. lib); use Bugzilla; +use Bugzilla::BugMail; use Bugzilla::Constants; use Bugzilla::Search; use Bugzilla::Util; @@ -261,7 +262,8 @@ sub SaveEmail { # relationship/event matrix. # Note: the database holds only "off" email preferences, as can be implied # from the name of the table - profiles_nomail. - foreach my $rel (RELATIONSHIPS) { + my %relationships = Bugzilla::BugMail::relationships(); + foreach my $rel (keys %relationships) { # Positive events: a ticked box means "send me mail." foreach my $event (POS_EVENTS) { if (defined($cgi->param("email-$rel-$event")) -- cgit v1.2.3-24-g4f1b