diff options
author | Matthew Somerville <matthew-github@dracos.co.uk> | 2018-05-23 16:28:37 +0100 |
---|---|---|
committer | Matthew Somerville <matthew-github@dracos.co.uk> | 2018-05-23 16:28:37 +0100 |
commit | 31f1e1088de48d40175e36a67ea89234084b6c18 (patch) | |
tree | 99f5f696286d21f932ea631d86523024b101203f | |
parent | 507daabec76ceb56f783b9c07eec2c786349702d (diff) | |
parent | 6150cdcb32474102370a4be4d730ca55c1a74e7e (diff) |
Merge branch 'quote-the-template-nevermore'
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/DefectType.pm | 5 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm | 3 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm | 5 | ||||
-rw-r--r-- | t/app/model/defecttype.t | 21 | ||||
-rw-r--r-- | t/app/model/responsepriority.t | 18 | ||||
-rw-r--r-- | t/app/model/responsetemplate.t | 28 | ||||
-rw-r--r-- | templates/web/base/report/_inspect.html | 6 | ||||
-rw-r--r-- | web/cobrands/fixmystreet/staff.js | 6 |
9 files changed, 43 insertions, 50 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 4813d7597..079740aed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ - Stop double-escaping title in alert-update email. - Use inspection states in response template admin. - Fixed CSS padding/overflow bug during sidebar "drawer" animations. #2132 + - Response template containing double quote now works. - Admin improvements: - Inspectors can set non_public status of reports. #1992 - Default start date is shown on the dashboard. diff --git a/perllib/FixMyStreet/DB/ResultSet/DefectType.pm b/perllib/FixMyStreet/DB/ResultSet/DefectType.pm index b2ef77f7c..5b1247129 100644 --- a/perllib/FixMyStreet/DB/ResultSet/DefectType.pm +++ b/perllib/FixMyStreet/DB/ResultSet/DefectType.pm @@ -4,7 +4,6 @@ use base 'DBIx::Class::ResultSet'; use strict; use warnings; use Moo; -use HTML::Entities; with('FixMyStreet::Roles::ContactExtra'); @@ -16,10 +15,10 @@ sub map_extras { my ($rs, @ts) = @_; return map { my $meta = $_->get_extra_metadata(); - my %extra = map { $_ => encode_entities($meta->{$_}) } keys %$meta; + my %extra = map { $_ => $meta->{$_} } keys %$meta; { id => $_->id, - name => encode_entities($_->name), + name => $_->name, extra => \%extra } } @ts; diff --git a/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm b/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm index 89bb4dfd7..96f7cf7a0 100644 --- a/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm +++ b/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm @@ -4,7 +4,6 @@ use base 'DBIx::Class::ResultSet'; use strict; use warnings; use Moo; -use HTML::Entities; with('FixMyStreet::Roles::ContactExtra'); @@ -14,7 +13,7 @@ sub join_table { sub map_extras { my ($rs, @ts) = @_; - return map { { id => $_->id, name => encode_entities($_->name) } } @ts; + return map { { id => $_->id, name => $_->name } } @ts; } 1; diff --git a/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm b/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm index aa070daa3..46fcba153 100644 --- a/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm +++ b/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm @@ -2,7 +2,6 @@ package FixMyStreet::DB::ResultSet::ResponseTemplate; use base 'DBIx::Class::ResultSet'; use Moo; -use HTML::Entities; with('FixMyStreet::Roles::ContactExtra'); @@ -17,8 +16,8 @@ sub name_column { sub map_extras { my ($rs, @ts) = @_; return map { - my $out = { id => encode_entities($_->text), name => encode_entities($_->title) }; - $out->{state} = encode_entities($_->state) if $_->state; + my $out = { id => $_->text, name => $_->title }; + $out->{state} = $_->state if $_->state; $out; } @ts; } diff --git a/t/app/model/defecttype.t b/t/app/model/defecttype.t index 4f380db59..e924129e2 100644 --- a/t/app/model/defecttype.t +++ b/t/app/model/defecttype.t @@ -99,27 +99,6 @@ subtest 'by_categories returns defect types for an area with multiple bodies' => is scalar @$pavements, 3, 'Pavements have 3 defect types'; }; -subtest 'by_categories encodes HTML entities' => sub { - my $apostrophe_defect_type = FixMyStreet::App->model('DB::DefectType')->find_or_create( - { - body_id => $oxfordshire->id, - name => 'This defect type\'s name has an apostrophe', - description => 'This defect type is for all categories' - } - ); - $apostrophe_defect_type->set_extra_metadata('defect_code' => 'Here\'s an apostrophe'); - $apostrophe_defect_type->update(); - - my @contacts = FixMyStreet::DB->resultset('Contact')->not_deleted->search( { body_id => [ $oxfordshire->id ] } )->all; - my $defect_types = FixMyStreet::App->model('DB::DefectType')->by_categories($area_id, @contacts); - my $traffic_lights = decode_json($defect_types->{'Traffic lights'}); - my $defect_type = @$traffic_lights[2]; - is $defect_type->{name}, 'This defect type's name has an apostrophe'; - is $defect_type->{extra}->{defect_code}, 'Here's an apostrophe'; - -}; - - END { done_testing(); } diff --git a/t/app/model/responsepriority.t b/t/app/model/responsepriority.t index 03c5bccae..4e624bf07 100644 --- a/t/app/model/responsepriority.t +++ b/t/app/model/responsepriority.t @@ -78,24 +78,6 @@ subtest 'by_categories returns all response priorities for an area with multiple is scalar @$traffic_lights, 2, 'Traffic lights have 2 defect types'; }; -subtest 'by_categories encodes HTML entities' => sub { - FixMyStreet::App->model('DB::ResponsePriority')->find_or_create( - { - body_id => $other_body->id, - name => 'This priority\'s name has an apostrophe', - description => 'This priority is for all categories' - } - ); - - my @contacts = FixMyStreet::DB->resultset('Contact')->not_deleted->search( { body_id => [ $oxfordshire->id ] } )->all; - my $priorities = FixMyStreet::App->model('DB::ResponsePriority')->by_categories($area_id, @contacts); - - my $traffic_lights = decode_json($priorities->{'Traffic lights'}); - use Data::Dumper; - my $priority = @$traffic_lights[2]; - is $priority->{name}, 'This priority's name has an apostrophe'; -}; - END { $mech->delete_body( $other_body ); $mech->delete_body( $oxfordshire ); diff --git a/t/app/model/responsetemplate.t b/t/app/model/responsetemplate.t new file mode 100644 index 000000000..fbabc1c12 --- /dev/null +++ b/t/app/model/responsetemplate.t @@ -0,0 +1,28 @@ +use FixMyStreet::TestMech; +use JSON::MaybeXS; + +my $mech = FixMyStreet::TestMech->new; +my $area_id = 2651; + +my $body = $mech->create_body_ok($area_id, 'Edinburgh Council'); +my $c1 = $mech->create_contact_ok(category => 'Potholes', body_id => $body->id, email => 'p'); +my $c2 = $mech->create_contact_ok(category => 'Graffiti', body_id => $body->id, email => 'g'); +my $t1 = FixMyStreet::DB->resultset('ResponseTemplate')->create({ body_id => $body->id, title => "Title 1", text => "Text 1" }); +my $t2 = FixMyStreet::DB->resultset('ResponseTemplate')->create({ body_id => $body->id, title => "Title 2", text => "Text 2", state => 'investigating' }); +my $t3 = FixMyStreet::DB->resultset('ResponseTemplate')->create({ body_id => $body->id, title => "Title 3", text => "Text 3" }); +$t1->add_to_contacts($c1); +$t2->add_to_contacts($c2); + +my @contacts = FixMyStreet::DB->resultset('Contact')->not_deleted->search( { body_id => [ $body->id ] } )->all; + +subtest 'by_categories returns allresponse templates grouped by category' => sub { + my $templates = FixMyStreet::App->model('DB::ResponseTemplate')->by_categories($area_id, @contacts); + my $potholes = decode_json($templates->{Potholes}); + my $graffiti = decode_json($templates->{Graffiti}); + + is scalar @$potholes, 2, 'Potholes have 2 templates'; + is scalar @$graffiti, 2, 'Graffiti has 2 templates'; + is $graffiti->[0]->{state}, 'investigating', 'Graffiti first template has right state'; +}; + +done_testing; diff --git a/templates/web/base/report/_inspect.html b/templates/web/base/report/_inspect.html index a81510f22..222780dcb 100644 --- a/templates/web/base/report/_inspect.html +++ b/templates/web/base/report/_inspect.html @@ -72,9 +72,9 @@ cat_prefix = "category_" _ cat_prefix _ "_" %] <p data-category="[% cat_name | html %]" [%~ IF cat_name != problem.category %] class="hidden"[% END %] - data-priorities='[% priorities_by_category.$cat_name %]' - data-defect-types='[% category_defect_types.$cat_name %]' - data-templates='[% templates_by_category.$cat_name %]'> + data-priorities='[% priorities_by_category.$cat_name | html %]' + data-defect-types='[% category_defect_types.$cat_name | html %]' + data-templates='[% templates_by_category.$cat_name | html %]'> [% IF cat_name == problem.category %] [% INCLUDE 'report/new/category_extras_fields.html' metas=category_extras.$cat_name hide_notices=1 show_hidden=1 %] [% ELSE %] diff --git a/web/cobrands/fixmystreet/staff.js b/web/cobrands/fixmystreet/staff.js index 134f57a7f..0dd635437 100644 --- a/web/cobrands/fixmystreet/staff.js +++ b/web/cobrands/fixmystreet/staff.js @@ -232,6 +232,9 @@ $.extend(fixmystreet.set_up, { opts.state = opts.state || $inspect_form.find('[name=state]').val(); var selector = "[data-category='" + opts.category + "']"; var data = $inspect_form.find(selector).data('templates') || []; + if (data.constructor !== Array) { + return; + } data = $.grep(data, function(d, i) { if (!d.state || d.state == opts.state) { return true; @@ -243,6 +246,9 @@ $.extend(fixmystreet.set_up, { function populateSelect($select, data, label_formatter) { $select.find('option:gt(0)').remove(); + if (data.constructor !== Array) { + return; + } $.each(data, function(k,v) { var label = window.fixmystreet.utils[label_formatter](v); var $opt = $('<option></option>').attr('value', v.id).text(label); |