diff options
Diffstat (limited to 'extensions/EditComments/Extension.pm')
-rw-r--r-- | extensions/EditComments/Extension.pm | 355 |
1 files changed, 183 insertions, 172 deletions
diff --git a/extensions/EditComments/Extension.pm b/extensions/EditComments/Extension.pm index e2ace3f23..b7c398967 100644 --- a/extensions/EditComments/Extension.pm +++ b/extensions/EditComments/Extension.pm @@ -28,33 +28,36 @@ our $VERSION = '0.01'; ################ sub db_schema_abstract_schema { - my ($self, $args) = @_; - my $schema = $args->{schema}; - - $schema->{'longdescs_activity'} = { - FIELDS => [ - comment_id => {TYPE => 'INT', NOTNULL => 1, - REFERENCES => {TABLE => 'longdescs', - COLUMN => 'comment_id', - DELETE => 'CASCADE'}}, - who => {TYPE => 'INT3', NOTNULL => 1, - REFERENCES => {TABLE => 'profiles', - COLUMN => 'userid', - DELETE => 'CASCADE'}}, - change_when => {TYPE => 'DATETIME', NOTNULL => 1}, - old_comment => {TYPE => 'LONGTEXT', NOTNULL => 1}, - ], - INDEXES => [ - longdescs_activity_comment_id_idx => ['comment_id'], - longdescs_activity_change_when_idx => ['change_when'], - longdescs_activity_comment_id_change_when_idx => [qw(comment_id change_when)], - ], - }; + my ($self, $args) = @_; + my $schema = $args->{schema}; + + $schema->{'longdescs_activity'} = { + FIELDS => [ + comment_id => { + TYPE => 'INT', + NOTNULL => 1, + REFERENCES => + {TABLE => 'longdescs', COLUMN => 'comment_id', DELETE => 'CASCADE'} + }, + who => { + TYPE => 'INT3', + NOTNULL => 1, + REFERENCES => {TABLE => 'profiles', COLUMN => 'userid', DELETE => 'CASCADE'} + }, + change_when => {TYPE => 'DATETIME', NOTNULL => 1}, + old_comment => {TYPE => 'LONGTEXT', NOTNULL => 1}, + ], + INDEXES => [ + longdescs_activity_comment_id_idx => ['comment_id'], + longdescs_activity_change_when_idx => ['change_when'], + longdescs_activity_comment_id_change_when_idx => [qw(comment_id change_when)], + ], + }; } sub install_update_db { - my $dbh = Bugzilla->dbh; - $dbh->bz_add_column('longdescs', 'edit_count', { TYPE => 'INT3', DEFAULT => 0 }); + my $dbh = Bugzilla->dbh; + $dbh->bz_add_column('longdescs', 'edit_count', {TYPE => 'INT3', DEFAULT => 0}); } #################### @@ -62,36 +65,33 @@ sub install_update_db { #################### sub page_before_template { - my ($self, $args) = @_; + my ($self, $args) = @_; - return if $args->{'page_id'} ne 'editcomments.html'; + return if $args->{'page_id'} ne 'editcomments.html'; - my $vars = $args->{'vars'}; - my $user = Bugzilla->user; - my $params = Bugzilla->input_params; + my $vars = $args->{'vars'}; + my $user = Bugzilla->user; + my $params = Bugzilla->input_params; - # validate group membership - my $edit_comments_group = Bugzilla->params->{edit_comments_group}; - if (!$edit_comments_group || !$user->in_group($edit_comments_group)) { - ThrowUserError('auth_failure', { group => $edit_comments_group, - action => 'view', - object => 'editcomments' }); - } + # validate group membership + my $edit_comments_group = Bugzilla->params->{edit_comments_group}; + if (!$edit_comments_group || !$user->in_group($edit_comments_group)) { + ThrowUserError('auth_failure', + {group => $edit_comments_group, action => 'view', object => 'editcomments'}); + } - my $bug_id = $params->{bug_id}; - my $bug = Bugzilla::Bug->check($bug_id); + my $bug_id = $params->{bug_id}; + my $bug = Bugzilla::Bug->check($bug_id); - my $comment_id = $params->{comment_id}; + my $comment_id = $params->{comment_id}; - my ($comment) = grep($_->id == $comment_id, @{ $bug->comments }); - if (!$comment - || ($comment->is_private && !$user->is_insider)) - { - ThrowUserError("edit_comment_invalid_comment_id", { comment_id => $comment_id }); - } + my ($comment) = grep($_->id == $comment_id, @{$bug->comments}); + if (!$comment || ($comment->is_private && !$user->is_insider)) { + ThrowUserError("edit_comment_invalid_comment_id", {comment_id => $comment_id}); + } - $vars->{'bug'} = $bug; - $vars->{'comment'} = $comment; + $vars->{'bug'} = $bug; + $vars->{'comment'} = $comment; } ################## @@ -99,88 +99,94 @@ sub page_before_template { ################## BEGIN { - no warnings 'redefine'; - *Bugzilla::Comment::activity = \&_get_activity; - *Bugzilla::Comment::edit_count = \&_edit_count; - *Bugzilla::WebService::Bug::_super_translate_comment = \&Bugzilla::WebService::Bug::_translate_comment; - *Bugzilla::WebService::Bug::_translate_comment = \&_new_translate_comment; + no warnings 'redefine'; + *Bugzilla::Comment::activity = \&_get_activity; + *Bugzilla::Comment::edit_count = \&_edit_count; + *Bugzilla::WebService::Bug::_super_translate_comment + = \&Bugzilla::WebService::Bug::_translate_comment; + *Bugzilla::WebService::Bug::_translate_comment = \&_new_translate_comment; } sub _new_translate_comment { - my ($self, $comment, $filters) = @_; + my ($self, $comment, $filters) = @_; - my $comment_hash = $self->_super_translate_comment($comment, $filters); + my $comment_hash = $self->_super_translate_comment($comment, $filters); - if (filter_wants $filters, 'raw_text') { - $comment_hash->{raw_text} = $self->type('string', $comment->body); - } + if (filter_wants $filters, 'raw_text') { + $comment_hash->{raw_text} = $self->type('string', $comment->body); + } - return $comment_hash; + return $comment_hash; } sub _edit_count { return $_[0]->{'edit_count'}; } sub _get_activity { - my ($self, $activity_sort_order) = @_; + my ($self, $activity_sort_order) = @_; - return $self->{'activity'} if $self->{'activity'}; + return $self->{'activity'} if $self->{'activity'}; - my $dbh = Bugzilla->dbh; - my $query = 'SELECT longdescs_activity.comment_id AS id, profiles.userid, ' . - $dbh->sql_date_format('longdescs_activity.change_when', '%Y.%m.%d %H:%i:%s') . ' + my $dbh = Bugzilla->dbh; + my $query + = 'SELECT longdescs_activity.comment_id AS id, profiles.userid, ' + . $dbh->sql_date_format('longdescs_activity.change_when', '%Y.%m.%d %H:%i:%s') + . ' AS time, longdescs_activity.old_comment AS old FROM longdescs_activity INNER JOIN profiles ON profiles.userid = longdescs_activity.who WHERE longdescs_activity.comment_id = ?'; - $query .= " ORDER BY longdescs_activity.change_when DESC"; - my $sth = $dbh->prepare($query); - $sth->execute($self->id); - - # We are shifting each comment activity body 1 back. The reason this - # has to be done is that the longdescs_activity table stores the comment - # body that the comment was before the edit, not the actual new version - # of the comment. - my @activity; - my $new_comment; - my $last_old_comment; - my $count = 0; - while (my $change_ref = $sth->fetchrow_hashref()) { - my %change = %$change_ref; - $change{'author'} = Bugzilla::User->new({ id => $change{'userid'}, cache => 1 }); - if ($count == 0) { - $change{new} = $self->body; - } - else { - $change{new} = $new_comment; - } - $new_comment = $change{old}; - $last_old_comment = $change{old}; - push (@activity, \%change); - $count++; + $query .= " ORDER BY longdescs_activity.change_when DESC"; + my $sth = $dbh->prepare($query); + $sth->execute($self->id); + + # We are shifting each comment activity body 1 back. The reason this + # has to be done is that the longdescs_activity table stores the comment + # body that the comment was before the edit, not the actual new version + # of the comment. + my @activity; + my $new_comment; + my $last_old_comment; + my $count = 0; + while (my $change_ref = $sth->fetchrow_hashref()) { + my %change = %$change_ref; + $change{'author'} = Bugzilla::User->new({id => $change{'userid'}, cache => 1}); + if ($count == 0) { + $change{new} = $self->body; } + else { + $change{new} = $new_comment; + } + $new_comment = $change{old}; + $last_old_comment = $change{old}; + push(@activity, \%change); + $count++; + } + + return [] if !@activity; + + # Store the original comment as the first or last entry + # depending on sort order + push( + @activity, + { + author => $self->author, + body => $last_old_comment, + time => $self->creation_ts, + original => 1 + } + ); - return [] if !@activity; - - # Store the original comment as the first or last entry - # depending on sort order - push(@activity, { - author => $self->author, - body => $last_old_comment, - time => $self->creation_ts, - original => 1 - }); - - $activity_sort_order - ||= Bugzilla->user->settings->{'comment_sort_order'}->{'value'}; + $activity_sort_order + ||= Bugzilla->user->settings->{'comment_sort_order'}->{'value'}; - if ($activity_sort_order eq "oldest_to_newest") { - @activity = reverse @activity; - } + if ($activity_sort_order eq "oldest_to_newest") { + @activity = reverse @activity; + } - $self->{'activity'} = \@activity; + $self->{'activity'} = \@activity; - return $self->{'activity'}; + return $self->{'activity'}; } ######### @@ -188,86 +194,91 @@ sub _get_activity { ######### sub object_columns { - my ($self, $args) = @_; - my ($class, $columns) = @$args{qw(class columns)}; - if ($class->isa('Bugzilla::Comment')) { - if (Bugzilla->dbh->bz_column_info($class->DB_TABLE, 'edit_count')) { - push @$columns, 'edit_count'; - } + my ($self, $args) = @_; + my ($class, $columns) = @$args{qw(class columns)}; + if ($class->isa('Bugzilla::Comment')) { + if (Bugzilla->dbh->bz_column_info($class->DB_TABLE, 'edit_count')) { + push @$columns, 'edit_count'; } + } } sub bug_end_of_update { - my ($self, $args) = @_; - - # Silently return if not in the proper group - # or if editing comments is disabled - my $user = Bugzilla->user; - my $edit_comments_group = Bugzilla->params->{edit_comments_group}; - return if (!$edit_comments_group || !$user->in_group($edit_comments_group)); - - my $bug = $args->{bug}; - my $timestamp = $args->{timestamp}; - my $params = Bugzilla->input_params; - my $dbh = Bugzilla->dbh; - - my $updated = 0; - foreach my $param (grep(/^edit_comment_textarea_/, keys %$params)) { - my ($comment_id) = $param =~ /edit_comment_textarea_(\d+)$/; - next if !detaint_natural($comment_id); - - # The comment ID must belong to this bug. - my ($comment_obj) = grep($_->id == $comment_id, @{ $bug->comments}); - next if (!$comment_obj || ($comment_obj->is_private && !$user->is_insider)); - - my $new_comment = $comment_obj->_check_thetext($params->{$param}); - - my $old_comment = $comment_obj->body; - next if $old_comment eq $new_comment; - - trick_taint($new_comment); - $dbh->do("UPDATE longdescs SET thetext = ?, edit_count = edit_count + 1 - WHERE comment_id = ?", - undef, $new_comment, $comment_id); - Bugzilla->memcached->clear({ table => 'longdescs', id => $comment_id }); - - # Log old comment to the longdescs activity table - $timestamp ||= $dbh->selectrow_array("SELECT NOW()"); - $dbh->do("INSERT INTO longdescs_activity " . - "(comment_id, who, change_when, old_comment) " . - "VALUES (?, ?, ?, ?)", - undef, ($comment_id, $user->id, $timestamp, $old_comment)); - - $comment_obj->{thetext} = $new_comment; - - $updated = 1; - } - - $bug->_sync_fulltext( update_comments => 1 ) if $updated; + my ($self, $args) = @_; + + # Silently return if not in the proper group + # or if editing comments is disabled + my $user = Bugzilla->user; + my $edit_comments_group = Bugzilla->params->{edit_comments_group}; + return if (!$edit_comments_group || !$user->in_group($edit_comments_group)); + + my $bug = $args->{bug}; + my $timestamp = $args->{timestamp}; + my $params = Bugzilla->input_params; + my $dbh = Bugzilla->dbh; + + my $updated = 0; + foreach my $param (grep(/^edit_comment_textarea_/, keys %$params)) { + my ($comment_id) = $param =~ /edit_comment_textarea_(\d+)$/; + next if !detaint_natural($comment_id); + + # The comment ID must belong to this bug. + my ($comment_obj) = grep($_->id == $comment_id, @{$bug->comments}); + next if (!$comment_obj || ($comment_obj->is_private && !$user->is_insider)); + + my $new_comment = $comment_obj->_check_thetext($params->{$param}); + + my $old_comment = $comment_obj->body; + next if $old_comment eq $new_comment; + + trick_taint($new_comment); + $dbh->do( + "UPDATE longdescs SET thetext = ?, edit_count = edit_count + 1 + WHERE comment_id = ?", undef, $new_comment, $comment_id + ); + Bugzilla->memcached->clear({table => 'longdescs', id => $comment_id}); + + # Log old comment to the longdescs activity table + $timestamp ||= $dbh->selectrow_array("SELECT NOW()"); + $dbh->do( + "INSERT INTO longdescs_activity " + . "(comment_id, who, change_when, old_comment) " + . "VALUES (?, ?, ?, ?)", + undef, + ($comment_id, $user->id, $timestamp, $old_comment) + ); + + $comment_obj->{thetext} = $new_comment; + + $updated = 1; + } + + $bug->_sync_fulltext(update_comments => 1) if $updated; } sub config_modify_panels { - my ($self, $args) = @_; - push @{ $args->{panels}->{groupsecurity}->{params} }, { - name => 'edit_comments_group', - type => 's', - choices => \&get_all_group_names, - default => 'admin', - checker => \&check_group + my ($self, $args) = @_; + push @{$args->{panels}->{groupsecurity}->{params}}, + { + name => 'edit_comments_group', + type => 's', + choices => \&get_all_group_names, + default => 'admin', + checker => \&check_group }; } sub webservice { - my ($self, $args) = @_; - my $dispatch = $args->{dispatch}; - $dispatch->{EditComments} = "Bugzilla::Extension::EditComments::WebService"; + my ($self, $args) = @_; + my $dispatch = $args->{dispatch}; + $dispatch->{EditComments} = "Bugzilla::Extension::EditComments::WebService"; } sub db_sanitize { - my $dbh = Bugzilla->dbh; - print "Deleting edited comment histories...\n"; - $dbh->do("DELETE FROM longdescs_activity"); - $dbh->do("UPDATE longdescs SET edit_count=0"); + my $dbh = Bugzilla->dbh; + print "Deleting edited comment histories...\n"; + $dbh->do("DELETE FROM longdescs_activity"); + $dbh->do("UPDATE longdescs SET edit_count=0"); } __PACKAGE__->NAME; |