diff options
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin.pm | 1 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Moderate.pm | 43 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Report.pm | 2 | ||||
-rw-r--r-- | t/app/controller/moderate.t | 40 |
5 files changed, 84 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 621c61192..14ec75be5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ - Admin improvements: - List number of alerts on report page #669 - viewing and managing of user alerts in admin #676 - - Allow moderation to potentially change photos. #2291 + - Allow moderation to potentially change photos/extra info. #2291 #2307 - Bugfixes: - Add perl 5.26/5.28 support. - Fix subcategory issues when visiting /report/new directly #2276 diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm index 75684c773..8aac408e4 100644 --- a/perllib/FixMyStreet/App/Controller/Admin.pm +++ b/perllib/FixMyStreet/App/Controller/Admin.pm @@ -1083,6 +1083,7 @@ sub report_edit_location : Private { # comparison. my $safe_stash = { %{$c->stash} }; $c->stash->{fetch_all_areas} = 1; + $c->stash->{area_check_action} = 'admin'; $c->forward('/council/load_and_check_areas', []); $c->forward('/report/new/setup_categories_and_bodies'); my %allowed_bodies = map { $_ => 1 } @{$problem->bodies_str_ids}; diff --git a/perllib/FixMyStreet/App/Controller/Moderate.pm b/perllib/FixMyStreet/App/Controller/Moderate.pm index d8fc38211..3b452e090 100644 --- a/perllib/FixMyStreet/App/Controller/Moderate.pm +++ b/perllib/FixMyStreet/App/Controller/Moderate.pm @@ -82,7 +82,9 @@ sub moderate_report : Chained('report') : PathPart('') : Args(0) { : ()), $c->forward('moderate_text', [ 'detail' ]), $c->forward('moderate_boolean', [ 'anonymous', 'show_name' ]), - $c->forward('moderate_boolean', [ 'photo' ]); + $c->forward('moderate_boolean', [ 'photo' ]), + $c->forward('moderate_location'), + $c->forward('moderate_extra'); # Deal with possible photo changes. If a moderate form uses a standard # photo upload field (with upload_fileid, label and file upload handlers), @@ -92,7 +94,8 @@ sub moderate_report : Chained('report') : PathPart('') : Args(0) { if ($photo_edit_form) { $c->forward('/photo/process_photo'); if ( my $photo_error = delete $c->stash->{photo_error} ) { - $c->flash->{photo_error} = $photo_error; + $c->flash->{moderate_errors} ||= []; + push @{ $c->flash->{moderate_errors} }, $photo_error; } else { my $fileid = $c->stash->{upload_fileid}; if ($fileid ne $problem->photo) { @@ -230,6 +233,42 @@ sub moderate_boolean : Private { return; } +sub moderate_extra : Private { + my ($self, $c) = @_; + + my $object = $c->stash->{comment} || $c->stash->{problem}; + my $changed; + my @extra = grep { /^extra\./ } keys %{$c->req->params}; + foreach (@extra) { + my ($field_name) = /extra\.(.*)/; + my $old = $object->get_extra_metadata($field_name) || ''; + my $new = $c->get_param($_); + if ($new ne $old) { + $object->set_extra_metadata($field_name, $new); + $changed = 1; + } + } + if ($changed) { + $object->update; + return 'extra'; + } +} + +sub moderate_location : Private { + my ($self, $c) = @_; + + my $problem = $c->stash->{problem}; + if ( !$c->forward( '/admin/report_edit_location', [ $problem ] ) ) { + # New lat/lon isn't valid, show an error + $c->flash->{moderate_errors} ||= []; + push @{ $c->flash->{moderate_errors} }, _('Invalid location. New location must be covered by the same council.'); + return; + } + + $problem->update; + return 'location'; +} + sub update : Chained('report') : PathPart('update') : CaptureArgs(1) { my ($self, $c, $id) = @_; my $comment = $c->stash->{problem}->comments->find($id); diff --git a/perllib/FixMyStreet/App/Controller/Report.pm b/perllib/FixMyStreet/App/Controller/Report.pm index d4ff0a2ca..5718bc021 100644 --- a/perllib/FixMyStreet/App/Controller/Report.pm +++ b/perllib/FixMyStreet/App/Controller/Report.pm @@ -194,7 +194,7 @@ sub load_updates : Private { $c->stash->{updates} = \@combined; if ($c->sessionid) { - foreach (qw(alert_to_reporter anonymized photo_error)) { + foreach (qw(alert_to_reporter anonymized moderate_errors)) { $c->stash->{$_} = $c->flash->{$_} if $c->flash->{$_}; } } diff --git a/t/app/controller/moderate.t b/t/app/controller/moderate.t index c2b185cde..9f6bc7450 100644 --- a/t/app/controller/moderate.t +++ b/t/app/controller/moderate.t @@ -21,6 +21,7 @@ $mech->host('www.example.org'); my $BROMLEY_ID = 2482; my $body = $mech->create_body_ok( $BROMLEY_ID, 'Bromley Council' ); +$mech->create_contact_ok( body => $body, category => 'Lost toys', email => 'losttoys@example.net' ); my $dt = DateTime->now; @@ -232,6 +233,45 @@ subtest 'Problem moderation' => sub { is $report->detail, 'Changed detail'; } }; + + subtest 'Moderate extra data' => sub { + $report->set_extra_metadata('moon', 'waxing full'); + $report->update; + my ($csrf) = $mech->content =~ /meta content="([^"]*)" name="csrf-token"/; + $mech->post_ok('http://www.example.org/moderate/report/' . $report->id, { + %problem_prepopulated, + 'extra.weather' => 'snow', + 'extra.moon' => 'waxing full', + token => $csrf, + }); + $report->discard_changes; + is $report->get_extra_metadata('weather'), 'snow'; + }; + + subtest 'Moderate location' => sub { + FixMyStreet::override_config { + MAPIT_URL => 'http://mapit.uk/', + ALLOWED_COBRANDS => 'fixmystreet', + }, sub { + my ($csrf) = $mech->content =~ /meta content="([^"]*)" name="csrf-token"/; + $mech->post_ok('http://www.example.org/moderate/report/' . $report->id, { + %problem_prepopulated, + latitude => '53', + longitude => '0.01578', + token => $csrf, + }); + $report->discard_changes; + is $report->latitude, 51.4129, 'No change when moved out of area'; + $mech->post_ok('http://www.example.org/moderate/report/' . $report->id, { + %problem_prepopulated, + latitude => '51.4021', + longitude => '0.01578', + token => $csrf, + }); + $report->discard_changes; + is $report->latitude, 51.4021, 'Updated when same body'; + }; + }; }; $mech->content_lacks('Posted anonymously', 'sanity check'); |