aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStruan Donald <struan@exo.org.uk>2018-06-07 15:32:27 +0100
committerStruan Donald <struan@exo.org.uk>2018-06-11 10:32:53 +0100
commitd8c4befc47afee2da94dbc2411a849f14cd1a7f7 (patch)
tree123927066bfd6ba0022b8a9fa60cdbf97010b1f5
parentcfd510fdaa9839e01162c68ce09163f0ac9dbb30 (diff)
include automated field when editing contacts
Display fields that are automatically filled in the contact editing form otherwise the data is lost. Also include the automated field in the form. Fixes #2136
-rw-r--r--CHANGELOG.md2
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin.pm2
-rw-r--r--perllib/FixMyStreet/DB/Result/Contact.pm14
-rw-r--r--t/app/controller/admin/reportextrafields.t56
-rw-r--r--templates/web/base/admin/contact-form.html2
-rw-r--r--templates/web/base/admin/extra-metadata-form.html12
6 files changed, 83 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b1b052008..7ec954119 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,8 @@
## Releases
* Unreleased
+ - Bugfixes:
+ - Don't remove automated fields when editing contacts #2163
* v2.3.4 (7th June 2018)
- Bugfixes:
diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm
index 7d04f5ff9..95969016f 100644
--- a/perllib/FixMyStreet/App/Controller/Admin.pm
+++ b/perllib/FixMyStreet/App/Controller/Admin.pm
@@ -2145,6 +2145,8 @@ sub update_extra_fields : Private {
$meta->{variable} = $notice ? 'false' : 'true';
$meta->{description} = $c->get_param("metadata[$i].description");
$meta->{datatype_description} = $c->get_param("metadata[$i].datatype_description");
+ $meta->{automated} = $c->get_param("metadata[$i].automated")
+ if $c->get_param("metadata[$i].automated");
if ( $meta->{datatype} eq "singlevaluelist" ) {
$meta->{values} = [];
diff --git a/perllib/FixMyStreet/DB/Result/Contact.pm b/perllib/FixMyStreet/DB/Result/Contact.pm
index c544f084a..4250a20c7 100644
--- a/perllib/FixMyStreet/DB/Result/Contact.pm
+++ b/perllib/FixMyStreet/DB/Result/Contact.pm
@@ -94,14 +94,12 @@ sub category_display {
$self->translate_column('category');
}
-sub get_metadata_for_input {
+sub get_metadata_for_editing {
my $self = shift;
my $id_field = $self->id_field;
my @metadata = @{$self->get_extra_fields};
# First, ones we always want to ignore (hard-coded, old system)
@metadata = grep { $_->{code} !~ /^(easting|northing|closest_address|$id_field)$/ } @metadata;
- # Also ignore any we have with a 'server_set' automated attribute
- @metadata = grep { !$_->{automated} || $_->{automated} ne 'server_set' } @metadata;
# Just in case the extra data is in an old parsed format
foreach (@metadata) {
@@ -112,6 +110,16 @@ sub get_metadata_for_input {
return \@metadata;
}
+sub get_metadata_for_input {
+ my $self = shift;
+ my $metadata = $self->get_metadata_for_editing;
+
+ # Also ignore any we have with a 'server_set' automated attribute
+ my @metadata = grep { !$_->{automated} || $_->{automated} ne 'server_set' } @$metadata;
+
+ return \@metadata;
+}
+
sub id_field {
my $self = shift;
return $self->get_extra_metadata('id_field') || 'fixmystreet_id';
diff --git a/t/app/controller/admin/reportextrafields.t b/t/app/controller/admin/reportextrafields.t
index fb06665f4..4549eeadf 100644
--- a/t/app/controller/admin/reportextrafields.t
+++ b/t/app/controller/admin/reportextrafields.t
@@ -120,6 +120,34 @@ FixMyStreet::override_config {
$contact->update;
};
+ subtest 'check contact updating does not remove server_set' => sub {
+ $contact->set_extra_fields(({ code => 'POT', automated => 'server_set' }));
+ $contact->update;
+
+ $mech->get_ok("/admin/body/" . $body->id . "/" . $contact->category);
+ $mech->submit_form_ok( { with_fields => {
+ email => 'test4@example.com',
+ note => 'test4 note',
+ } } );
+
+ $mech->content_like(qr'test4@example.com's);
+
+ $contact->discard_changes;
+ my $meta_data = $contact->get_extra_fields;
+ is $contact->email, 'test4@example.com', 'contact updated';
+ is_deeply $meta_data, [ {
+ order => 0,
+ datatype => 'string',
+ datatype_description => '',
+ description => '',
+ required => 'false',
+ variable => 'true',
+ code => 'POT',
+ automated => 'server_set'
+ } ], "automated fields not unset";
+ };
+
+
subtest 'Create and update new ReportExtraFields' => sub {
my $extra_fields = [];
@@ -181,11 +209,39 @@ FixMyStreet::override_config {
{ name => "name1", key => "key1" },
]
};
+
$object->discard_changes;
is_deeply $object->get_extra_fields, $extra_fields, 'new list field was added';
is $object->language, "en-gb", "Correct language was set";
$mech->get_ok("/admin/reportextrafields/" . $object->id);
+ $mech->submit_form_ok({ with_fields => {
+ "metadata[2].order" => "3",
+ "metadata[2].code" => "automated_test",
+ "metadata[2].required" => undef,
+ "metadata[2].notice" => "",
+ "metadata[2].description" => "",
+ "metadata[2].datatype_description" => "",
+ "metadata[2].datatype" => "string",
+ "metadata[2].automated" => "server_set",
+ }});
+
+ push @$extra_fields, {
+ order => "3",
+ code => "automated_test",
+ required => "false",
+ variable => "true",
+ description => "",
+ datatype_description => "",
+ datatype => "string",
+ automated => "server_set",
+ };
+
+ $object->discard_changes;
+ is_deeply $object->get_extra_fields, $extra_fields, 'new automated field was added';
+ is $object->language, "en-gb", "Correct language was set";
+
+ $mech->get_ok("/admin/reportextrafields/" . $object->id);
$mech->submit_form_ok( { with_fields => {
"metadata[1].values[1].key" => "key2",
"metadata[1].values[1].name" => "name2",
diff --git a/templates/web/base/admin/contact-form.html b/templates/web/base/admin/contact-form.html
index 1157e781e..24021ebf3 100644
--- a/templates/web/base/admin/contact-form.html
+++ b/templates/web/base/admin/contact-form.html
@@ -144,5 +144,5 @@ as well.") %]
<dt>[% pair.key %]</dt> <dd>[% pair.value %]</dd>
[% END %]
</dl>
- [% INCLUDE 'admin/extra-metadata-form.html' metas=(contact.get_metadata_for_input OR []) %]
+ [% INCLUDE 'admin/extra-metadata-form.html' metas=(contact.get_metadata_for_editing OR []) %]
</form>
diff --git a/templates/web/base/admin/extra-metadata-form.html b/templates/web/base/admin/extra-metadata-form.html
index 6a88a3c1e..9264d98d9 100644
--- a/templates/web/base/admin/extra-metadata-form.html
+++ b/templates/web/base/admin/extra-metadata-form.html
@@ -6,7 +6,17 @@
<div class="admin-hint"><p>[% loc('The ordering of this field on the report page. Fields are shown in ascending order according to this value.') %]</p></div>
<label>
[% loc('Order') %]
- <input name="metadata[[% loop.index %]].order" data-field-name="order" type=text value="[% meta.order | html %]">
+ <input name="metadata[[% loop.index %]].order" data-field-name="order" type=text value="[% meta.order OR 0 | html %]">
+ </label>
+
+ <div class="admin-hint"><p>[% loc('Whether the field is displayed to the user, included as a hidden field and automatically populated, or set by the server upon Open311 submission. This field is usually set automatically.') %]</p></div>
+ <label>
+ [% loc('Automated') %]
+ <select name="metadata[[% loop.index %]].automated" data-field-name="automated" class="js-metadata-item-type">
+ <option value="" [% meta.automated == '' ? 'selected' : '' %]></option>
+ <option value="server_set" [% meta.automated == 'server_set' ? 'selected' : '' %]>[% loc('Server Set') %]</option>
+ <option value="hidden_field" [% meta.automated == 'hidden_field' ? 'selected' : '' %]>[% loc('Hidden Field') %]</option>
+ </select>
</label>
<div class="admin-hint"><p>[% loc('The code used to store this field value in the database. e.g. <code>address</code> would be available as <code>problem.extra.address</code> in the templates.') %]</p></div>