From 38a75cdb259b37e42313e8202eee6bee3f5c4868 Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Fri, 4 Mar 2016 18:46:53 +0000 Subject: Remember user's last anonymous state. If a user is logged in, use their last report/update to set the default anonymity state. --- perllib/FixMyStreet/DB/Result/User.pm | 10 ++++ t/app/model/user.t | 61 ++++++++++++++++++++++ .../web/base/report/new/form_user_loggedin.html | 2 +- .../report/new/form_user_loggedout_by_email.html | 2 +- templates/web/base/report/update/form_name.html | 3 +- templates/web/base/user/_anonymity.html | 11 ++++ .../web/eastsussex/report/new/after_name.html | 4 +- templates/web/eastsussex/report/update-form.html | 4 +- 8 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 t/app/model/user.t create mode 100644 templates/web/base/user/_anonymity.html diff --git a/perllib/FixMyStreet/DB/Result/User.pm b/perllib/FixMyStreet/DB/Result/User.pm index ddf986c47..6bce415a6 100644 --- a/perllib/FixMyStreet/DB/Result/User.pm +++ b/perllib/FixMyStreet/DB/Result/User.pm @@ -104,6 +104,16 @@ __PACKAGE__->add_columns( use mySociety::EmailUtil; +sub latest_anonymity { + my $self = shift; + my $p = $self->problems->search(undef, { order_by => { -desc => 'id' } } )->first; + my $c = $self->comments->search(undef, { order_by => { -desc => 'id' } } )->first; + my $p_created = $p ? $p->created->epoch : 0; + my $c_created = $c ? $c->created->epoch : 0; + my $obj = $p_created >= $c_created ? $p : $c; + return $obj ? $obj->anonymous : 0; +} + =head2 check_for_errors $error_hashref = $user->check_for_errors(); diff --git a/t/app/model/user.t b/t/app/model/user.t new file mode 100644 index 000000000..24e5d2d98 --- /dev/null +++ b/t/app/model/user.t @@ -0,0 +1,61 @@ +use strict; +use warnings; + +use Test::More; + +use FixMyStreet::TestMech; +use FixMyStreet::DB; + +my $mech = FixMyStreet::TestMech->new(); +$mech->log_in_ok('test@example.com'); + +my ($problem) = $mech->create_problems_for_body(1, '2504', 'Title', { anonymous => 'f' }); +is $problem->user->latest_anonymity, 0, "User's last report was not anonymous"; + +FixMyStreet::override_config { + ALLOWED_COBRANDS => [ { fixmystreet => '.' } ], + MAPIT_URL => 'http://mapit.mysociety.org/', +}, sub { + $mech->get_ok('/around?pc=sw1a1aa'); + $mech->follow_link_ok( { text_regex => qr/skip this step/i, }, "follow 'skip this step' link" ); + $mech->content_like(qr/may_show_name[^>]*checked/); +}; + +($problem) = $mech->create_problems_for_body(1, '2504', 'Title', { anonymous => 't' }); +is $problem->user->latest_anonymity, 1, "User's last report was anonymous"; + +create_update($problem, anonymous => 'f'); +is $problem->user->latest_anonymity, 0, "User's last update was not anonyous"; + +create_update($problem, anonymous => 't'); +is $problem->user->latest_anonymity, 1, "User's last update was anonymous"; + +FixMyStreet::override_config { + ALLOWED_COBRANDS => [ { fixmystreet => '.' } ], + MAPIT_URL => 'http://mapit.mysociety.org/', +}, sub { + $mech->get_ok('/around?pc=sw1a1aa'); + $mech->follow_link_ok( { text_regex => qr/skip this step/i, }, "follow 'skip this step' link" ); + $mech->content_like(qr/may_show_name[^>c]*>/); +}; + +END { + $mech->delete_user( $problem->user ) if $problem; + done_testing(); +} + +sub create_update { + my ($problem, %params) = @_; + my $dt = DateTime->now()->add(hours => 1); + return FixMyStreet::App->model('DB::Comment')->find_or_create({ + problem_id => $problem->id, + user_id => $problem->user_id, + name => 'Other User', + mark_fixed => 'false', + text => 'This is some update text', + state => 'confirmed', + anonymous => 'f', + created => $dt->ymd . ' ' . $dt->hms, + %params, + }); +} diff --git a/templates/web/base/report/new/form_user_loggedin.html b/templates/web/base/report/new/form_user_loggedin.html index 848d331d4..a39200c72 100644 --- a/templates/web/base/report/new/form_user_loggedin.html +++ b/templates/web/base/report/new/form_user_loggedin.html @@ -4,8 +4,8 @@ [% INCLUDE 'report/new/extra_name.html' %] + [% PROCESS 'user/_anonymity.html' anonymous = report.anonymous %] - [% name_public = report.anonymous==0 OR (c.cobrand.default_show_name AND report.anonymous=='') %]