aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/App/Controller/Report/Update.pm
diff options
context:
space:
mode:
authorZarino Zappia <mail@zarino.co.uk>2016-08-03 16:15:19 +0100
committerMatthew Somerville <matthew-github@dracos.co.uk>2016-08-10 09:33:39 +0100
commite0308e6af55a95f8c6e26e331434ea61259b18b9 (patch)
tree86d97dd8a4f9a87557db7f518fb291aac30ae652 /perllib/FixMyStreet/App/Controller/Report/Update.pm
parent0c31945416238d7eb06543c107214adfd4b83734 (diff)
Feature to create report as body/other user.
This allows users who have the correct permissions to add reports on behalf of the body or another user. We enable editing of the email box by default, so that if JavaScript isn't available, someone can still change the email for the 'another user' option. For mysociety/fixmystreetforcouncils#10 and mysociety/fixmystreetforcouncils#11
Diffstat (limited to 'perllib/FixMyStreet/App/Controller/Report/Update.pm')
-rw-r--r--perllib/FixMyStreet/App/Controller/Report/Update.pm39
1 files changed, 34 insertions, 5 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Report/Update.pm b/perllib/FixMyStreet/App/Controller/Report/Update.pm
index d03797f56..705e6ee99 100644
--- a/perllib/FixMyStreet/App/Controller/Report/Update.pm
+++ b/perllib/FixMyStreet/App/Controller/Report/Update.pm
@@ -109,8 +109,15 @@ sub process_user : Private {
my $update = $c->stash->{update};
- if ( $c->user_exists ) {
+ # Extra block to use 'last'
+ if ( $c->user_exists ) { {
my $user = $c->user->obj;
+
+ if ($c->stash->{contributing_as_another_user} = $user->contributing_as('another_user', $c, $update->problem->bodies_str)) {
+ # Act as if not logged in (and it will be auto-confirmed later on)
+ last;
+ }
+
my $name = $c->get_param('name');
$user->name( Utils::trim_text( $name ) ) if $name;
my $title = $c->get_param('fms_extra_title');
@@ -119,8 +126,14 @@ sub process_user : Private {
$user->title( Utils::trim_text( $title ) );
}
$update->user( $user );
+
+ # Just in case, make sure the user will have a name
+ if ($c->stash->{contributing_as_body}) {
+ $user->name($user->from_body->name) unless $user->name;
+ }
+
return 1;
- }
+ } }
# Extract all the params to a hash to make them easier to work with
my %params = map { $_ => $c->get_param($_) }
@@ -254,16 +267,23 @@ sub process_update : Private {
Utils::cleanup_text( $params{update}, { allow_multiline => 1 } );
my $name = Utils::trim_text( $params{name} );
- my $anonymous = $c->get_param('may_show_name') ? 0 : 1;
$params{reopen} = 0 unless $c->user && $c->user->id == $c->stash->{problem}->user->id;
my $update = $c->stash->{update};
$update->text($params{update});
- $update->name($name);
+
$update->mark_fixed($params{fixed} ? 1 : 0);
$update->mark_open($params{reopen} ? 1 : 0);
- $update->anonymous($anonymous);
+
+ $c->stash->{contributing_as_body} = $c->user_exists && $c->user->contributing_as('body', $c, $update->problem->bodies_str);
+ if ($c->stash->{contributing_as_body}) {
+ $update->name($c->user->from_body->name);
+ $update->anonymous(0);
+ } else {
+ $update->name($name);
+ $update->anonymous($c->get_param('may_show_name') ? 0 : 1);
+ }
if ( $params{state} ) {
$params{state} = 'fixed - council'
@@ -431,6 +451,10 @@ sub save_update : Private {
$update->user->insert();
}
$update->confirm();
+ } elsif ( $c->forward('/report/new/created_as_someone_else', [ $update->problem->bodies_str ]) ) {
+ # If created on behalf of someone else, we automatically confirm it,
+ # but we don't want to update the user account
+ $update->confirm();
} elsif ( !$update->user->in_storage ) {
# User does not exist.
$c->forward('tokenize_user', [ $update ]);
@@ -474,6 +498,11 @@ sub redirect_or_confirm_creation : Private {
if ( $update->confirmed ) {
$c->forward( 'update_problem' );
$c->forward( 'signup_for_alerts' );
+ if ($c->stash->{contributing_as_another_user}) {
+ $c->send_email( 'other-updated.txt', {
+ to => [ [ $update->user->email, $update->name ] ],
+ } );
+ }
$c->stash->{template} = 'tokens/confirm_update.html';
return 1;
}