]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 545715: New Hook: bugmail_relationships
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Thu, 11 Feb 2010 20:32:08 +0000 (12:32 -0800)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Thu, 11 Feb 2010 20:32:08 +0000 (12:32 -0800)
r=mkanat, a=mkanat (module owner)

Bugzilla/BugMail.pm
Bugzilla/Constants.pm
Bugzilla/Hook.pm
Bugzilla/User.pm
extensions/Example/Extension.pm
userprefs.cgi

index b718f4199daaa2bd2283fbea7ce3247e730f5f86..204c4ba9a052cf6b1626aba9946ed3cc6f255356 100644 (file)
@@ -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;
index 948ff5337811949c4a812a550e31468c89d42ac8..8ab7455ff602fe6e7c9c33dcd82166f82ee104fc 100644 (file)
@@ -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;
index cf718c94f38d5e740cd134a236410c568135ab04..a02a049211a83bdea6378061f53a09722e9589c9 100644 (file)
@@ -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
index e0c5b132f9b0ff275aa1635bbc972a4a8388ec22..240fcfcdb7fce4f101009827a355dff156d4238f 100644 (file)
@@ -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.
             # 
index fd75cbf6454b18df8cd330416e97b7351ac74db4..6acf3e13589a4b11ca2a24410bec706bb768cbfd 100644 (file)
@@ -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) = @_;
     
index e6ee8fb8a0012f22959b1f33a8027c8ad7497e8c..194469a009073e5e72effbe7819b7214d42525f3 100755 (executable)
@@ -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"))