Rev 1295 | Blame | Compare with Previous | Last modification | View Log | RSS feed
################################################################################ Codestriker: Copyright (c) 2001, 2002 David Sitsky. All rights reserved.# sits@users.sourceforge.net## This program is free software; you can redistribute it and modify it under# the terms of the GPL.# Action object for the submission of changing multiple comment states.package Codestriker::Action::SubmitEditCommentsState;use strict;use Codestriker::Action::ViewTopicComments;use Codestriker::TopicListeners::Manager;# Attempt to change the comment states, in particular the metrics associated# with them.sub process($$$) {my ($type, $http_input, $http_response) = @_;my $query = $http_response->get_query();# Extract the values from the action.my $topicid = $http_input->get('topic');my $email = $http_input->get('email');if (Codestriker::Model::Topic::exists($topicid) == 0) {# Topic no longer exists, most likely its been deleted.$http_response->error("Topic no longer exists.");return;}my $topic = Codestriker::Model::Topic->new($topicid);# Any feedback messages to the user.my $feedback = "";# Indicate if changes were made to stale comments.my $stale = 0;# The number of commentstates changed.my $comments_processed = 0;# Determine the mapping of comment state to version numbers, recorded# in the form submission, to ensure the versions being changed aren't# stale.my %comment_state_version_map = ();my %comment_state_new_map = ();foreach my $param_name ($query->param()) {foreach my $metric (@{$Codestriker::comment_state_metrics}) {my $metric_name = $metric->{name};my $prefix = "comment_state_metric\\|$metric_name";if ($param_name =~ /^($prefix\|\-?\d+\|\-?\d+\|\d+)\|(\d+)$/) {$comment_state_version_map{$1} = $2;$comment_state_new_map{$1} = $query->param($param_name);}}}# Go through all of the commentstate records, and change anything that# needs changing.my @topic_comments = $topic->read_comments();my %processed_commentstates = ();foreach my $comment (@topic_comments) {my $key = $comment->{filenumber} . "|" . $comment->{fileline} . "|" .$comment->{filenew};if (! exists $processed_commentstates{$key}) {# For each metric, see if there is a new value posted for this# comment state.my $state_changed = 0;my $num_metrics_changed_for_comment_state = 0;foreach my $metric (@{$Codestriker::comment_state_metrics}) {my $select_form_name ="comment_state_metric|" . $metric->{name} . "|" . $key;# Check if this metric has a new value associated with it.my $current_metric_value =$comment->{metrics}->{$metric->{name}};my $new_metric_value =$comment_state_new_map{$select_form_name};if (defined $new_metric_value &&$new_metric_value ne $current_metric_value) {# Change the specific metric for this commentstate record.my $version =$comment_state_version_map{$select_form_name} +$num_metrics_changed_for_comment_state;my $rc = $comment->change_state($metric->{name},$new_metric_value,$version);if ($rc == $Codestriker::OK) {$state_changed = 1;$num_metrics_changed_for_comment_state++;Codestriker::TopicListeners::Manager::comment_state_change($email, $metric->{name},$current_metric_value,$new_metric_value, $topic,$comment);} elsif ($rc == $Codestriker::STALE_VERSION) {$stale = 1;}}}if ($state_changed) {$comments_processed++;}# Indicate that this commentstate has been processed for all# metrics.$processed_commentstates{$key} = 1;}}# These message could be made more helpful in the future, but for now...if ($stale) {$feedback = "Some comments could not be updated as they have been " ."modified by another user.";} else {if ($comments_processed == 1) {$feedback = "Comment was successfully updated.";} elsif ($comments_processed > 1) {$feedback = "$comments_processed comments were successfully updated.";}}# Direct control to the list comment action class, with the appropriate# feedback message.$http_input->{feedback} = $feedback;Codestriker::Action::ViewTopicComments->process($http_input,$http_response);}1;