diff options
-rwxr-xr-x | bin/fixmystreet.com/add_emergency_message | 81 | ||||
-rwxr-xr-x | bin/northamptonshire/update-emergency-message | 59 | ||||
-rw-r--r-- | perllib/FixMyStreet/Roles/Extra.pm | 20 | ||||
-rw-r--r-- | t/app/model/extra.t | 47 |
4 files changed, 178 insertions, 29 deletions
diff --git a/bin/fixmystreet.com/add_emergency_message b/bin/fixmystreet.com/add_emergency_message index 5167cea32..3cfeae83e 100755 --- a/bin/fixmystreet.com/add_emergency_message +++ b/bin/fixmystreet.com/add_emergency_message @@ -21,10 +21,15 @@ my ($opts, $usage) = describe_options( '%c %o', ['commit', 'whether to commit changes to the database' ], ['body=s', 'name of body to attach question to', { required => 1 } ], - ['code=s', 'code to use for question', { required => 1 } ], - ['question=s', 'question to ask user first', { required => 1 } ], - ['yes=s', 'yes answer to question', { required => 1 } ], - ['no=s', 'no answer to question', { required => 1 } ], + ['mode' => 'hidden' => { one_of => [ + ['questions' => 'add an emergency question'], + ['category' => 'add an emergency message'], + ], required => 1 }], + ['update' => 'only update existing messages'], + ['code=s', 'code to use for question'], + ['question=s', 'question to ask user first'], + ['yes=s', 'yes answer to question'], + ['no=s', 'no answer to question'], ['message=s', 'message to be shown if form disabled', { required => 1 } ], ['send_method=s', 'send method to restrict categories to' ], ['help|h', "print usage message and exit" ], @@ -35,27 +40,43 @@ if (!$opts->commit) { say colored("*** DRY RUN ***", 'cyan'); } -my $field = { - order => 0, - required => 'true', - protected => 'true', - code => $opts->code, - description => $opts->question, - datatype => 'singlevaluelist', - variable => 'true', - values => [ - { - key => 'yes', - name => $opts->yes, - disable => 1, - disable_message => $opts->message, - }, - { - key => 'no', - name => $opts->no, - } - ], -}; +my $field; + +if ( $opts->mode eq 'questions' ) { + die "questions, code, yes and no required" + unless $opts->questions && $opts->code && $opts->yes && $opts->no; + + $field = { + order => 0, + required => 'true', + protected => 'true', + code => $opts->code, + description => $opts->question, + datatype => 'singlevaluelist', + variable => 'true', + values => [ + { + key => 'yes', + name => $opts->yes, + disable => 1, + disable_message => $opts->message, + }, + { + key => 'no', + name => $opts->no, + } + ], + }; +} else { + $field = { + order => 0, + protected => 'true', + disable_form => 'true', + code => '_fms_disable_', + description => $opts->message, + variable => 'false', + }; +} my $body = FixMyStreet::DB->resultset("Body")->find({ name => $opts->body }); unless ($body) { @@ -66,11 +87,13 @@ unless ($body) { my $contacts = $body->contacts->not_deleted; $contacts = $contacts->search({ send_method => $opts->send_method }) if $opts->send_method; foreach my $category ($contacts->all) { - my $found = $category->update_extra_field($field); + my $found = $category->get_extra_field(code => $field->{code}); if ($found) { - say colored("Updating ", 'red') . $opts->code . " message disable form on " . $category->category . ", " . $opts->body; - } else { - say colored("Making ", 'green') . $opts->code . " message disable form on " . $category->category . ", " . $opts->body; + say colored("Updating ", 'red') . $field->{code} . " message disable form on " . $category->category . ", " . $opts->body; + $category->update_extra_field($field); + } elsif (!$opts->update) { + say colored("Making ", 'green') . $field->{code} . " message disable form on " . $category->category . ", " . $opts->body; + $category->update_extra_field($field); } if ($opts->commit) { diff --git a/bin/northamptonshire/update-emergency-message b/bin/northamptonshire/update-emergency-message new file mode 100755 index 000000000..7248e9159 --- /dev/null +++ b/bin/northamptonshire/update-emergency-message @@ -0,0 +1,59 @@ +#!/usr/bin/env perl + +# update the emergency message on NCC categories + +use strict; +use warnings; +use v5.14; + +BEGIN { + use File::Basename qw(dirname); + use File::Spec; + my $d = dirname(File::Spec->rel2abs($0)); + require "$d/../../setenv.pl"; +} + +use FixMyStreet::DB; + +use Getopt::Long; + +my ($commit, $message); +GetOptions( + 'commit' => \$commit, + 'message=s' => \$message, +); + +if (!$commit) { + say "*** DRY RUN ***"; +} + +my $northants = FixMyStreet::DB->resultset("Body")->find({ name => 'Northamptonshire County Council' }); +if ($northants) { + my @northants_contacts = $northants->contacts->all; + my $found_total = 0; + foreach my $category (@northants_contacts) { + my $extra_fields = $category->get_extra_fields; + my $found = 0; + foreach (@$extra_fields) { + next unless $_->{code} eq 'emergency'; + $found_total++; + $_->{code} = '_fms_disable_'; + $_->{description} = $message; + $_->{protected} = 'true'; + $_->{disable_form} = 'true'; + $found = 1; + } + if ($found) { + $category->set_extra_fields(@$extra_fields); + say "Updating emergency message on " . $category->category . ", Northamptonshire"; + if ($commit) { + $category->update; + } + } + } + if (!$found_total) { + say STDERR "No emergency messages found for Northamptonshire"; + } +} else { + say STDERR "Could not find Northamptonshire"; +} diff --git a/perllib/FixMyStreet/Roles/Extra.pm b/perllib/FixMyStreet/Roles/Extra.pm index 5132c3e58..530064b99 100644 --- a/perllib/FixMyStreet/Roles/Extra.pm +++ b/perllib/FixMyStreet/Roles/Extra.pm @@ -243,4 +243,24 @@ sub get_extra_field_value { return $field->{value}; } +=head2 get_extra_field + + my $field = $problem->get_extra_field(name => 'field_name'); + +Return a field stored in `_fields` in extra, or undefined if it's not present. +Can use either `name` or `code` to identify the field. + +=cut + +sub get_extra_field { + my ($self, %opts) = @_; + + my @fields = @{ $self->get_extra_fields() }; + + my $comparison = $opts{code} ? 'code' : 'name'; + + my ($field) = grep { $_->{$comparison} && $_->{$comparison} eq $opts{$comparison} } @fields; + return $field; +} + 1; diff --git a/t/app/model/extra.t b/t/app/model/extra.t index 970efc465..9adfb8f80 100644 --- a/t/app/model/extra.t +++ b/t/app/model/extra.t @@ -164,6 +164,53 @@ subtest 'Get named field values' => sub { is $report->get_extra_field_value("field1"), "value 1", "field1 has correct value"; is $report->get_extra_field_value("field 2"), "this is a test value", "field 2 has correct value"; + +$report->delete; +$user->delete; +}; + +subtest 'Get named fields' => sub { + my $user = $db->resultset('User')->create({ + email => 'test-moderation@example.com', + email_verified => 1, + name => 'Test User' + }); + my $report = $db->resultset('Problem')->create( + { + postcode => 'BR1 3SB', + bodies_str => "", + areas => "", + category => 'Other', + title => 'Good bad good', + detail => 'Good bad bad bad good bad', + used_map => 't', + name => 'Test User 2', + anonymous => 'f', + state => 'confirmed', + lang => 'en-gb', + service => '', + cobrand => 'default', + latitude => '51.4129', + longitude => '0.007831', + user_id => $user->id, + }); + + my @fields = ({ + name => "field1", + description => "This is a test field", + value => "value 1", + }, + { + code => "field 2", + description => "Another test", + value => "this is a test value", + }); + + $report->push_extra_fields(@fields); + + is_deeply $report->get_extra_field(name => "field1"), $fields[0], "field1 has correct value"; + is_deeply $report->get_extra_field(code => "field 2"), $fields[1], "field 2 has correct value"; + is $report->get_extra_field(name => "field 2"), undef, "returns undef if no match"; }; done_testing(); |