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 {
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.
#
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;
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;
=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
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.
#
use Data::Dumper;
+# See bugmail_relationships.
+use constant REL_EXAMPLE => -127;
+
our $VERSION = '1.0';
sub attachment_process_data {
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) = @_;
use lib qw(. lib);
use Bugzilla;
+use Bugzilla::BugMail;
use Bugzilla::Constants;
use Bugzilla::Search;
use Bugzilla::Util;
# 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"))