From 36b5893ba963132cfcfa394aa1a67badeb3aa53e Mon Sep 17 00:00:00 2001 From: Max Kanat-Alexander Date: Sun, 7 Feb 2010 13:12:31 -0800 Subject: Bug 496488: Hooks for creating, updating, and deleting groups r=mkanat, a=mkanat (module owner) --- Bugzilla/Group.pm | 14 +++++++++++++ Bugzilla/Hook.pm | 46 +++++++++++++++++++++++++++++++++++++++++ extensions/Example/Extension.pm | 45 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+) diff --git a/Bugzilla/Group.pm b/Bugzilla/Group.pm index c936593bc..65df4ee81 100644 --- a/Bugzilla/Group.pm +++ b/Bugzilla/Group.pm @@ -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; } diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm index 44b5c3c58..13e435e86 100644 --- a/Bugzilla/Hook.pm +++ b/Bugzilla/Hook.pm @@ -454,6 +454,52 @@ changed flags, and search for a specific condition like C. =back +=head2 group_before_delete + +This happens in L, 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 - The L being deleted. + +=back + +=head2 group_end_of_create + +This happens at the end of L, after all other +changes are made to the database. This occurs inside a database transaction. + +Params: + +=over + +=item C - The changed L object, with all fields set +to their updated values. + +=back + +=head2 group_end_of_update + +This happens at the end of L, after all other +changes are made to the database. This occurs inside a database transaction. + +Params: + +=over + +=item C - The changed L object, with all fields set +to their updated values. + +=item C - 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 diff --git a/extensions/Example/Extension.pm b/extensions/Example/Extension.pm index c0e44aa59..1a483ad53 100644 --- a/extensions/Example/Extension.pm +++ b/extensions/Example/Extension.pm @@ -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}; -- cgit v1.2.3-24-g4f1b