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];
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;
......
......@@ -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;
......
......@@ -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<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
This happens in F<colchange.cgi> right after the list of possible display
......
......@@ -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.
#
......
......@@ -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) = @_;
......
......@@ -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"))
......
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