diff options
Diffstat (limited to 'perllib/FixMyStreet/App/Controller/Questionnaire.pm')
-rwxr-xr-x | perllib/FixMyStreet/App/Controller/Questionnaire.pm | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Questionnaire.pm b/perllib/FixMyStreet/App/Controller/Questionnaire.pm new file mode 100755 index 000000000..986543e9d --- /dev/null +++ b/perllib/FixMyStreet/App/Controller/Questionnaire.pm @@ -0,0 +1,228 @@ +package FixMyStreet::App::Controller::Questionnaire; + +use Moose; +use namespace::autoclean; +#use Utils; +#use Error qw(:try); +#use CrossSell; +#use mySociety::Locale; + +BEGIN { extends 'Catalyst::Controller'; } + +=head1 NAME + +FixMyStreet::App::Controller::Questionnaire - Catalyst Controller + +=head1 DESCRIPTION + +Catalyst Controller. + +=head1 METHODS + +=cut + +sub load_questionnaire : Private { + my ( $self, $c ) = @_; + + my $questionnaire = $c->model('DB::Questionnaire')->find( + { id => $c->stash->{id} }, + { prefetch => 'problem' } + ); + $c->stash->{questionnaire} = $questionnaire; + + my $problem_id = $questionnaire->problem_id; + + if ( $questionnaire->whenanswered ) { + my $problem_url = $c->uri_for( "/report/$problem_id" ); + my $contact_url = $c->uri_for( "/contact" ); + $c->stash->{message} = sprintf(_("You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"), $contact_url, $problem_url); + $c->stash->{template} = 'questionnaire/error.html'; + $c->detach; + } + + # FIXME problem fetched information + # extract(epoch from confirmed) as time, extract(epoch from whensent-confirmed) as whensent + # state in ('confirmed','fixed') + $c->stash->{problem} = $questionnaire->problem; + # throw Error::Simple(_("I'm afraid we couldn't locate your problem in the database.\n")) unless $problem; + + $c->stash->{answered_ever_reported} = $c->model('DB::Questionnaire')->count( + { 'problem.user_id' => $c->stash->{problem}->user_id, + ever_reported => { '!=', undef }, + }, + { join => 'problem' } + ); +} + +sub submit : Path('submit') { + my ( $self, $c ) = @_; + + $c->forward( '/tokens/load_questionnaire_id', [ $c->req->params->{token} ] ); + $c->forward( 'load_questionnaire' ); + + my $questionnaire = $c->stash->{questionnaire}; + my $problem = $questionnaire->problem; + + $c->stash->{num_questionnaire} = $c->model('DB::Questionnaire')->count( + { problem_id => $problem->id } + ); + + map { $c->stash->{$_} = $c->req->params->{$_} || '' } qw(been_fixed reported another update); + # EHA questionnaires done for you + if ($c->cobrand->moniker eq 'emptyhomes') { + $c->stash->{another} = $c->stash->{num_questionnaire}==1 ? 'Yes' : 'No'; + } + + my @errors; + push @errors, _('Please state whether or not the problem has been fixed') unless $c->stash->{been_fixed}; + my $ask_ever_reported = $c->cobrand->ask_ever_reported; + if ($ask_ever_reported) { + push @errors, _('Please say whether you\'ve ever reported a problem to your council before') unless $c->stash->{reported} || $c->stash->{answered_ever_reported}; + } + push @errors, _('Please indicate whether you\'d like to receive another questionnaire') + if ($c->stash->{been_fixed} eq 'No' || $c->stash->{been_fixed} eq 'Unknown') && !$c->stash->{another}; + push @errors, _('Please provide some explanation as to why you\'re reopening this report') + if $c->stash->{been_fixed} eq 'No' && $problem->state eq 'fixed' && !$c->stash->{update}; + if (@errors) { + $c->stash->{errors} = [ @errors ]; + $c->detach( 'display' ); + } + +# my $fh = $q->upload('photo'); +# my $image; +# if ($fh) { +# my $err = Page::check_photo($q, $fh); +# push @errors, $err if $err; +# try { +# $image = Page::process_photo($fh) unless $err; +# } catch Error::Simple with { +# my $e = shift; +# push(@errors, "That image doesn't appear to have uploaded correctly ($e), please try again."); +# }; +# } +# push @errors, _('Please provide some text as well as a photo') +# if $image && !$input{update}; +# return display_questionnaire($q, @errors) if @errors; +# +# my $new_state = ''; +# $new_state = 'fixed' if $input{been_fixed} eq 'Yes' && $problem->{state} eq 'confirmed'; +# $new_state = 'confirmed' if $input{been_fixed} eq 'No' && $problem->{state} eq 'fixed'; +# +# # Record state change, if there was one +# dbh()->do("update problem set state=?, lastupdate=ms_current_timestamp() +# where id=?", {}, $new_state, $problem->{id}) +# if $new_state; +# +# # If it's not fixed and they say it's still not been fixed, record time update +# dbh()->do("update problem set lastupdate=ms_current_timestamp() +# where id=?", {}, $problem->{id}) +# if $input{been_fixed} eq 'No' && $problem->{state} eq 'confirmed'; +# +# # Record questionnaire response +# my $reported = $input{reported} +# ? ($input{reported} eq 'Yes' ? 't' : ($input{reported} eq 'No' ? 'f' : undef)) +# : undef; +# dbh()->do('update questionnaire set whenanswered=ms_current_timestamp(), +# ever_reported=?, old_state=?, new_state=? where id=?', {}, +# $reported, $problem->{state}, $input{been_fixed} eq 'Unknown' +# ? 'unknown' +# : ($new_state ? $new_state : $problem->{state}), +# $questionnaire->{id}); +# +# # Record an update if they've given one, or if there's a state change +# my $name = $problem->{anonymous} ? undef : $problem->{name}; +# my $update = $input{update} ? $input{update} : _('Questionnaire filled in by problem reporter'); +# Utils::workaround_pg_bytea("insert into comment +# (problem_id, name, email, website, text, state, mark_fixed, mark_open, photo, lang, cobrand, cobrand_data, confirmed) +# values (?, ?, ?, '', ?, 'confirmed', ?, ?, ?, ?, ?, ?, ms_current_timestamp())", 7, +# $problem->{id}, $name, $problem->{email}, $update, +# $new_state eq 'fixed' ? 't' : 'f', $new_state eq 'confirmed' ? 't' : 'f', +# $image, $mySociety::Locale::lang, $cobrand, $c->cobrand->extra_data +# ) +# if $new_state || $input{update}; +# +# # If they've said they want another questionnaire, mark as such +# dbh()->do("update problem set send_questionnaire = 't' where id=?", {}, $problem->{id}) +# if ($input{been_fixed} eq 'No' || $input{been_fixed} eq 'Unknown') && $input{another} eq 'Yes'; +# dbh()->commit(); +# +# my $out; +# my $message; +# my $advert_outcome = 1; +# if ($input{been_fixed} eq 'Unknown') { +# $message = _(<<EOF); +# <p>Thank you very much for filling in our questionnaire; if you +# get some more information about the status of your problem, please come back to the +# site and leave an update.</p> +# EOF +# } elsif ($new_state eq 'confirmed' || (!$new_state && $problem->{state} eq 'confirmed')) { +# my $wtt_url = Cobrand::writetothem_url($cobrand, $c->cobrand->extra_data); +# $wtt_url = "http://www.writetothem.com" if (! $wtt_url); +# $message = sprintf(_(<<EOF), $wtt_url); +# <p style="font-size:150%%">We're sorry to hear that. We have two suggestions: why not try +# <a href="%s">writing direct to your councillor(s)</a> +# or, if it's a problem that could be fixed by local people working together, +# why not <a href="http://www.pledgebank.com/new">make and publicise a pledge</a>? +# </p> +# EOF +# $advert_outcome = 0; +# } else { +# $message = _(<<EOF); +# <p style="font-size:150%">Thank you very much for filling in our questionnaire; glad to hear it's been fixed.</p> +# EOF +# } +# $out = $message; +# my $display_advert = Cobrand::allow_crosssell_adverts($cobrand); +# if ($display_advert && $advert_outcome) { +# $out .= CrossSell::display_advert($q, $problem->{email}, $problem->{name}, +# council => $problem->{council}); +# } +# my %vars = (message => $message); +# my $template_page = Page::template_include('questionnaire-completed', $q, Page::template_root($q), %vars); +# return $template_page if ($template_page); +# return $out; +} + +# Sent here from email token action. Simply load and display questionnaire. +sub index : Private { + my ( $self, $c ) = @_; + $c->forward( 'load_questionnaire' ); + $c->forward( 'display' ); +} + +# Displays the questionnaire, either after bad submission or from email token +sub display : Private { + my ( $self, $c ) = @_; + + $c->stash->{template} = 'questionnaire/index.html'; + + my $problem = $c->stash->{questionnaire}->problem; + + my $problem_text = ''; # Page::display_problem_text($c->fake_q, $problem); # FIXME This needs to be in the template + $c->stash->{updates} = ''; # FIXME Should be database ResultSet of problem's pdates + $c->stash->{map_start_html} = FixMyStreet::Map::display_map( + $c->fake_q, + latitude => $problem->latitude, + longitude => $problem->longitude, + pins => [ [ $problem->latitude, $problem->longitude, $problem->state eq 'fixed' ? 'green' : 'red' ] ], + pre => $problem_text, + ); + $c->stash->{map_js} = FixMyStreet::Map::header_js(); + $c->stash->{cobrand_form_elements} = $c->cobrand->form_elements('questionnaireForm'); +} + +=head1 AUTHOR + +Matthew Somerville + +=head1 LICENSE + +Copyright (c) 2011 UK Citizens Online Democracy. All rights reserved. +Licensed under the Affero GPL. + +=cut + +__PACKAGE__->meta->make_immutable; + +1; + |