Commit a7196a73 authored by Max Kanat-Alexander's avatar Max Kanat-Alexander

Bug 545715: New Hook: bugmail_relationships

r=mkanat, a=mkanat (module owner)
parent 5721ab05
...@@ -55,17 +55,6 @@ use constant FORMAT_2_SIZE => [19,55]; ...@@ -55,17 +55,6 @@ use constant FORMAT_2_SIZE => [19,55];
use constant BIT_DIRECT => 1; use constant BIT_DIRECT => 1;
use constant BIT_WATCHING => 2; 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 # We use this instead of format because format doesn't deal well with
# multi-byte languages. # multi-byte languages.
sub multiline_sprintf { sub multiline_sprintf {
...@@ -100,6 +89,15 @@ sub three_columns { ...@@ -100,6 +89,15 @@ sub three_columns {
return multiline_sprintf(FORMAT_TRIPLE, \@_, FORMAT_3_SIZE); 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() # This is a bit of a hack, basically keeping the old system()
# cmd line interface. Should clean this up at some point. # cmd line interface. Should clean this up at some point.
# #
...@@ -615,8 +613,9 @@ sub sendMail { ...@@ -615,8 +613,9 @@ sub sendMail {
push(@reasons_watch, $relationship) if ($bits & BIT_WATCHING); push(@reasons_watch, $relationship) if ($bits & BIT_WATCHING);
} }
my @headerrel = map { REL_NAMES->{$_} } @reasons; my %relationships = relationships();
my @watchingrel = map { REL_NAMES->{$_} } @reasons_watch; my @headerrel = map { $relationships{$_} } @reasons;
my @watchingrel = map { $relationships{$_} } @reasons_watch;
push(@headerrel, 'None') unless @headerrel; push(@headerrel, 'None') unless @headerrel;
push(@watchingrel, 'None') unless @watchingrel; push(@watchingrel, 'None') unless @watchingrel;
push @watchingrel, map { user_id_to_login($_) } @$watchingRef; push @watchingrel, map { user_id_to_login($_) } @$watchingRef;
......
...@@ -298,8 +298,18 @@ use constant REL_CC => 3; ...@@ -298,8 +298,18 @@ use constant REL_CC => 3;
use constant REL_VOTER => 4; use constant REL_VOTER => 4;
use constant REL_GLOBAL_WATCHER => 5; use constant REL_GLOBAL_WATCHER => 5;
use constant RELATIONSHIPS => REL_ASSIGNEE, REL_QA, REL_REPORTER, REL_CC, # We need these strings for the X-Bugzilla-Reasons header
REL_VOTER, REL_GLOBAL_WATCHER; # 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 # Used for global events like EVT_FLAG_REQUESTED
use constant REL_ANY => 100; use constant REL_ANY => 100;
......
...@@ -398,6 +398,33 @@ instead of as a string.) ...@@ -398,6 +398,33 @@ instead of as a string.)
=back =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<relationships>
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 =head2 colchange_columns
This happens in F<colchange.cgi> right after the list of possible display This happens in F<colchange.cgi> right after the list of possible display
......
...@@ -1568,7 +1568,9 @@ sub create { ...@@ -1568,7 +1568,9 @@ sub create {
my $user = $class->SUPER::create(@_); my $user = $class->SUPER::create(@_);
# Turn on all email for the new user # 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) { foreach my $event (POS_EVENTS, NEG_EVENTS) {
# These "exceptions" define the default email preferences. # These "exceptions" define the default email preferences.
# #
......
...@@ -36,6 +36,9 @@ use Bugzilla::Extension::Example::Util; ...@@ -36,6 +36,9 @@ use Bugzilla::Extension::Example::Util;
use Data::Dumper; use Data::Dumper;
# See bugmail_relationships.
use constant REL_EXAMPLE => -127;
our $VERSION = '1.0'; our $VERSION = '1.0';
sub attachment_process_data { sub attachment_process_data {
...@@ -193,14 +196,28 @@ sub bugmail_recipients { ...@@ -193,14 +196,28 @@ sub bugmail_recipients {
my ($self, $args) = @_; my ($self, $args) = @_;
my $recipients = $args->{recipients}; my $recipients = $args->{recipients};
my $bug = $args->{bug}; my $bug = $args->{bug};
my $user =
new Bugzilla::User({ name => Bugzilla->params->{'maintainer'} });
if ($bug->id == 1) { if ($bug->id == 1) {
# Uncomment the line below to add the second user in the Bugzilla # Uncomment the line below to add the maintainer to the recipients
# database to the recipients list of every bugmail sent out about # list of every bugmail from bug 1 as though that the maintainer
# bug 1 as though that user were on the CC list. # were on the CC list.
#$recipients->{2}->{+REL_CC} = 1; #$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 { sub colchange_columns {
my ($self, $args) = @_; my ($self, $args) = @_;
......
...@@ -27,6 +27,7 @@ use strict; ...@@ -27,6 +27,7 @@ use strict;
use lib qw(. lib); use lib qw(. lib);
use Bugzilla; use Bugzilla;
use Bugzilla::BugMail;
use Bugzilla::Constants; use Bugzilla::Constants;
use Bugzilla::Search; use Bugzilla::Search;
use Bugzilla::Util; use Bugzilla::Util;
...@@ -261,7 +262,8 @@ sub SaveEmail { ...@@ -261,7 +262,8 @@ sub SaveEmail {
# relationship/event matrix. # relationship/event matrix.
# Note: the database holds only "off" email preferences, as can be implied # Note: the database holds only "off" email preferences, as can be implied
# from the name of the table - profiles_nomail. # 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." # Positive events: a ticked box means "send me mail."
foreach my $event (POS_EVENTS) { foreach my $event (POS_EVENTS) {
if (defined($cgi->param("email-$rel-$event")) if (defined($cgi->param("email-$rel-$event"))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment