aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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>