summaryrefslogtreecommitdiffstats
path: root/extensions/MyDashboard/Extension.pm
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/MyDashboard/Extension.pm')
-rw-r--r--extensions/MyDashboard/Extension.pm112
1 files changed, 112 insertions, 0 deletions
diff --git a/extensions/MyDashboard/Extension.pm b/extensions/MyDashboard/Extension.pm
index 082f1c562..51e774b5b 100644
--- a/extensions/MyDashboard/Extension.pm
+++ b/extensions/MyDashboard/Extension.pm
@@ -12,10 +12,13 @@ use strict;
use base qw(Bugzilla::Extension);
use Bugzilla;
+use Bugzilla::Status 'is_open_state';
+
use Bugzilla::Constants;
use Bugzilla::Search::Saved;
use Bugzilla::Extension::MyDashboard::Queries qw(QUERY_DEFS);
+use Bugzilla::Extension::MyDashboard::BugInterest;
our $VERSION = BUGZILLA_VERSION;
@@ -45,6 +48,33 @@ sub db_schema_abstract_schema {
mydashboard_user_id_idx => ['user_id'],
],
};
+
+ $schema->{'bug_interest'} = {
+ FIELDS => [
+ id => { TYPE => 'MEDIUMSERIAL',
+ NOTNULL => 1,
+ PRIMARYKEY => 1 },
+
+ bug_id => { TYPE => 'INT3',
+ NOTNULL => 1,
+ REFERENCES => { TABLE => 'bugs',
+ COLUMN => 'bug_id',
+ DELETE => 'CASCADE' } },
+
+ user_id => { TYPE => 'INT3',
+ NOTNOLL => 1,
+ REFERENCES => { TABLE => 'profiles',
+ COLUMN => 'userid' } },
+
+ modification_time => { TYPE => 'DATETIME',
+ NOTNULL => 1 }
+ ],
+ INDEXES => [
+ bug_interest_idx => { FIELDS => [qw(bug_id user_id)],
+ TYPE => 'UNIQUE' },
+ bug_interest_user_id_idx => ['user_id']
+ ],
+ };
}
###########
@@ -53,6 +83,7 @@ sub db_schema_abstract_schema {
BEGIN {
*Bugzilla::Search::Saved::in_mydashboard = \&_in_mydashboard;
+ *Bugzilla::Component::watcher_ids = \&_component_watcher_ids;
}
sub _in_mydashboard {
@@ -65,6 +96,22 @@ sub _in_mydashboard {
return $self->{'in_mydashboard'};
}
+sub _component_watcher_ids {
+ my ($self) = @_;
+ my $dbh = Bugzilla->dbh;
+
+ my $query = "SELECT user_id FROM component_watch
+ WHERE product_id = ?
+ AND (component_id = ?
+ OR component_id IS NULL
+ OR ? LIKE CONCAT(component_prefix, '%'))";
+
+ $self->{watcher_ids} ||= $dbh->selectcol_arrayref($query, undef,
+ $self->product_id, $self->id, $self->name);
+
+ return $self->{watcher_ids};
+}
+
#############
# Templates #
#############
@@ -123,4 +170,69 @@ sub webservice {
$dispatch->{MyDashboard} = "Bugzilla::Extension::MyDashboard::WebService";
}
+sub bug_end_of_create {
+ my ($self, $args) = @_;
+ my ($bug, $params, $timestamp) = @$args{qw(bug params timestamp)};
+ my $user = Bugzilla->user;
+
+ # Anyone added to the CC list of a bug is now interested in that bug.
+ foreach my $cc_user (@{ $bug->cc_users }) {
+ next $user->id == $cc_user->id;
+ Bugzilla::Extension::MyDashboard::BugInterest->mark($cc_user->id, $bug->id, $timestamp);
+ }
+
+ # Anyone that is watching a component is interested when a bug is filed into the component.
+ foreach my $watcher_id (@{ $bug->component_obj->watcher_ids }) {
+ Bugzilla::Extension::MyDashboard::BugInterest->mark($watcher_id, $bug->id, $timestamp);
+ }
+}
+
+sub bug_end_of_update {
+ my ($self, $args) = @_;
+ my ($bug, $old_bug, $changes, $timestamp) = @$args{qw(bug old_bug changes timestamp)};
+ my $user = Bugzilla->user;
+
+ # Anyone added to the CC list of a bug is now interested in that bug.
+ my %old_cc = map { $_->id => $_ } grep { defined } @{ $old_bug->cc_users };
+ my @added = grep { not $old_cc{ $_->id } } grep { defined } @{ $bug->cc_users };
+ foreach my $cc_user (@added) {
+ next $user->id == $cc_user->id;
+ Bugzilla::Extension::MyDashboard::BugInterest->mark($cc_user->id, $bug->id, $timestamp);
+ }
+
+ # Anyone that is watching a component is interested when a bug is filed into the component.
+ if ($changes->{product} or $changes->{component}) {
+ # All of the watchers would be interested in this bug update
+ foreach my $watcher_id (@{ $bug->component_obj->watcher_ids }) {
+ Bugzilla::Extension::MyDashboard::BugInterest->mark($watcher_id, $bug->id, $timestamp);
+ }
+ }
+
+ if ($changes->{bug_status}) {
+ my ($old_status, $new_status) = @{ $changes->{bug_status} };
+ if (is_open_state($old_status) && !is_open_state($new_status)) {
+ my @related_bugs = (@{ $bug->blocks_obj }, @{ $bug->depends_on_obj });
+ my %involved;
+
+ foreach my $related_bug (@related_bugs) {
+ my @users = grep { defined } $related_bug->assigned_to,
+ $related_bug->reporter,
+ $related_bug->qa_contact,
+ @{ $related_bug->cc_users };
+
+ foreach my $involved_user (@users) {
+ $involved{ $involved_user->id }{ $related_bug->id } = 1;
+ }
+ }
+ foreach my $involved_user_id (keys %involved) {
+ foreach my $related_bug_id (keys %{$involved{$involved_user_id}}) {
+ Bugzilla::Extension::MyDashboard::BugInterest->mark($involved_user_id,
+ $related_bug_id,
+ $timestamp);
+ }
+ }
+ }
+ }
+}
+
__PACKAGE__->NAME;