]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 496488: Hooks for creating, updating, and deleting groups
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Sun, 7 Feb 2010 21:14:14 +0000 (13:14 -0800)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Sun, 7 Feb 2010 21:14:14 +0000 (13:14 -0800)
r=mkanat, a=mkanat (module owner)

Bugzilla/Group.pm
Bugzilla/Hook.pm
extensions/Example/Extension.pm

index c936593bc4408a7e82bff9f617645c59563eb4ea..65df4ee816bbaee759a2003c257cf360482b4885 100644 (file)
@@ -195,6 +195,8 @@ sub set_icon_url    { $_[0]->set('icon_url', $_[1]);    }
 
 sub update {
     my $self = shift;
+    my $dbh = Bugzilla->dbh;
+    $dbh->bz_start_transaction();
     my $changes = $self->SUPER::update(@_);
 
     if (exists $changes->{name}) {
@@ -214,6 +216,10 @@ sub update {
                                   && $changes->{isactive}->[1]);
 
     $self->_rederive_regexp() if exists $changes->{userregexp};
+
+    Bugzilla::Hook::process('group_end_of_update', 
+                            { group => $self, changes => $changes });
+    $dbh->bz_commit_transaction();
     return $changes;
 }
 
@@ -269,12 +275,15 @@ sub remove_from_db {
     my $self = shift;
     my $dbh = Bugzilla->dbh;
     $self->check_remove(@_);
+    $dbh->bz_start_transaction();
+    Bugzilla::Hook::process('group_before_delete', { group => $self });
     $dbh->do('DELETE FROM whine_schedules
                WHERE mailto_type = ? AND mailto = ?',
               undef, MAILTO_GROUP, $self->id);
     # All the other tables will be handled by foreign keys when we
     # drop the main "groups" row.
     $self->SUPER::remove_from_db(@_);
+    $dbh->bz_commit_transaction();
 }
 
 # Add missing entries in bug_group_map for bugs created while
@@ -375,6 +384,8 @@ sub create {
     print get_text('install_group_create', { name => $params->{name} }) . "\n" 
         if Bugzilla->usage_mode == USAGE_MODE_CMDLINE;
 
+    $dbh->bz_start_transaction();
+
     my $group = $class->SUPER::create(@_);
 
     # Since we created a new group, give the "admin" group all privileges
@@ -392,6 +403,9 @@ sub create {
     }
 
     $group->_rederive_regexp() if $group->user_regexp;
+
+    Bugzilla::Hook::process('group_end_of_create', { group => $group });
+    $dbh->bz_commit_transaction();
     return $group;
 }
 
index 44b5c3c5841a625037d0204533689ecbb62da6e7..13e435e86ef233e77b6e5d72e417c9d1478cabfb 100644 (file)
@@ -454,6 +454,52 @@ changed flags, and search for a specific condition like C<added eq 'review-'>.
 
 =back
 
+=head2 group_before_delete
+
+This happens in L<Bugzilla::Group/remove_from_db>, after we've confirmed
+that the group can be deleted, but before any rows have actually
+been removed from the database. This occurs inside a database
+transaction.
+
+Params:
+
+=over
+
+=item C<group> - The L<Bugzilla::Group> being deleted.
+
+=back
+
+=head2 group_end_of_create
+
+This happens at the end of L<Bugzilla::Group/create>, after all other
+changes are made to the database. This occurs inside a database transaction.
+
+Params:
+
+=over
+
+=item C<group> - The changed L<Bugzilla::Group> object, with all fields set
+to their updated values.
+
+=back
+
+=head2 group_end_of_update
+
+This happens at the end of L<Bugzilla::Group/update>, after all other 
+changes are made to the database. This occurs inside a database transaction.
+
+Params:
+
+=over
+
+=item C<group> - The changed L<Bugzilla::Group> object, with all fields set 
+to their updated values.
+
+=item C<changes> - The hash of changed fields. 
+C<< $changes->{$field} = [$old, $new] >>
+
+=back
+
 =head2 install_before_final_checks
 
 Allows execution of custom code before the final checks are done in 
index c0e44aa5986466e186d03c1bb8d46add9060ffda..1a483ad536e2b0d2e79db8aeb28114ff474aadfa 100644 (file)
@@ -246,6 +246,51 @@ sub flag_end_of_update {
     # warn $result;
 }
 
+sub group_before_delete {
+    my ($self, $args) = @_;
+    # This code doesn't actually *do* anything, it's just here to show you
+    # how to use this hook.
+
+    my $group = $args->{'group'};
+    my $group_id = $group->id;
+    # Uncomment this line to see a line in your webserver's error log whenever
+    # you file a bug.
+    # warn "Group $group_id is about to be deleted!";
+}
+
+sub group_end_of_create {
+    my ($self, $args) = @_;
+    # This code doesn't actually *do* anything, it's just here to show you
+    # how to use this hook.
+    my $group = $args->{'group'};
+
+    my $group_id = $group->id;
+    # Uncomment this line to see a line in your webserver's error log whenever
+    # you create a new group.
+    #warn "Group $group_id has been created!";
+}
+
+sub group_end_of_update {
+    my ($self, $args) = @_;
+    # This code doesn't actually *do* anything, it's just here to show you
+    # how to use this hook.
+
+    my ($group, $changes) = @$args{qw(group changes)};
+
+    foreach my $field (keys %$changes) {
+        my $used_to_be = $changes->{$field}->[0];
+        my $now_it_is  = $changes->{$field}->[1];
+    }
+
+    my $group_id = $group->id;
+    my $num_changes = scalar keys %$changes;
+    my $result = 
+        "There were $num_changes changes to fields on group $group_id.";
+    # Uncomment this line to see $result in your webserver's error log whenever
+    # you update a group.
+    #warn $result;
+}
+
 sub install_before_final_checks {
     my ($self, $args) = @_;
     print "Install-before_final_checks hook\n" unless $args->{silent};