From 683b188b288fe43526e1649c784fa44435559655 Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Thu, 30 Apr 2020 13:51:42 +0100 Subject: Move per-row Contact lookup to the database. On admin report lists, and in front-end lists when an inspector, each row was querying the database for `category_display`. We create a new relationship for this query, and join/prefetch it wherever we request this data. Include staff joins on /around page, copying what happens on /reports to prevent more lookups there too. Also add some joins for user email in admin report list. --- perllib/FixMyStreet/App/Controller/Admin/Reports.pm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm index 7300fe676..88c4380fc 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm @@ -110,6 +110,7 @@ sub index : Path { { join => 'user', '+columns' => 'user.email', + prefetch => 'contact', rows => 50, order_by => $order, } @@ -166,7 +167,13 @@ sub index : Path { my $problems = $c->cobrand->problems->search( $query, - { order_by => $order, rows => 50 } + { + '+columns' => ['user.email'], + join => 'user', + prefetch => 'contact', + order_by => $order, + rows => 50 + } )->page( $p_page ); $c->stash->{problems} = [ $problems->all ]; $c->stash->{problems_pager} = $problems->pager; -- cgit v1.2.3 From 730d25ae7218d731590b322d4f419a7df6d4e4fb Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Thu, 30 Apr 2020 13:56:31 +0100 Subject: Add ability to disallow updates in a category. Add a tickbox to the category admin, and do not allow updates on reports made in those selected categories. --- perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index 6ae068cd9..61b486f02 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -267,15 +267,12 @@ sub update_contact : Private { $contact->send_method( $c->get_param('send_method') ); # Set flags in extra to the appropriate values - if ( $c->get_param('photo_required') ) { - $contact->set_extra_metadata_if_undefined( photo_required => 1 ); - } else { - $contact->unset_extra_metadata( 'photo_required' ); - } - if ( $c->get_param('open311_protect') ) { - $contact->set_extra_metadata( open311_protect => 1 ); - } else { - $contact->unset_extra_metadata( 'open311_protect' ); + foreach (qw(photo_required open311_protect updates_disallowed)) { + if ( $c->get_param($_) ) { + $contact->set_extra_metadata( $_ => 1 ); + } else { + $contact->unset_extra_metadata($_); + } } if ( my @group = $c->get_param_list('group') ) { @group = grep { $_ } @group; -- cgit v1.2.3 From f6d807fd5217a19ac488f652d1f0853a7891231f Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Fri, 1 May 2020 15:42:01 +0100 Subject: Add way to disallow report reopening in a category Add a tickbox to the category admin, and do not allow reopening on reports made in the selected categories. --- perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index 61b486f02..bfa74ad4e 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -267,7 +267,7 @@ sub update_contact : Private { $contact->send_method( $c->get_param('send_method') ); # Set flags in extra to the appropriate values - foreach (qw(photo_required open311_protect updates_disallowed)) { + foreach (qw(photo_required open311_protect updates_disallowed reopening_disallowed)) { if ( $c->get_param($_) ) { $contact->set_extra_metadata( $_ => 1 ); } else { -- cgit v1.2.3 From ecc5a7b9ca20418f1bdb45cdc3ce5b41a11f3593 Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Wed, 15 Apr 2020 19:12:31 +0100 Subject: Add assigned_(users|categories)_only functionality Users with assigned_categories_only will only see staff features on a report page in their assigned categories. Users will only see staff features on a report page in a category with assigned_users_only if it is in their assigned categories. --- perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 2 +- perllib/FixMyStreet/App/Controller/Admin/Users.pm | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index bfa74ad4e..07d058872 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -267,7 +267,7 @@ sub update_contact : Private { $contact->send_method( $c->get_param('send_method') ); # Set flags in extra to the appropriate values - foreach (qw(photo_required open311_protect updates_disallowed reopening_disallowed)) { + foreach (qw(photo_required open311_protect updates_disallowed reopening_disallowed assigned_users_only)) { if ( $c->get_param($_) ) { $contact->set_extra_metadata( $_ => 1 ); } else { diff --git a/perllib/FixMyStreet/App/Controller/Admin/Users.pm b/perllib/FixMyStreet/App/Controller/Admin/Users.pm index 046e19126..f4b9bd7dc 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Users.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Users.pm @@ -373,6 +373,11 @@ sub edit : Chained('user') : PathPart('') : Args(0) { my @live_contact_ids = map { $_->id } @live_contacts; my @new_contact_ids = grep { $c->get_param("contacts[$_]") } @live_contact_ids; $user->set_extra_metadata('categories', \@new_contact_ids); + if ($c->get_param('assigned_categories_only')) { + $user->set_extra_metadata(assigned_categories_only => 1); + } else { + $user->unset_extra_metadata('assigned_categories_only'); + } } else { $user->unset_extra_metadata('categories'); } -- cgit v1.2.3 From 37306b9f6f4cb9b58c5e4a7bdc12e90dff879481 Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Fri, 24 Apr 2020 17:35:50 +0100 Subject: Disable rename on unprotected Open311 categories. If you rename an Open311 category when it is not protected, it will only get reinstated/deleted by the Open311 populate script shortly after, and can cause issues due to the problem category renaming that occurs. --- perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index bfa74ad4e..3b99d7e0f 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -241,10 +241,14 @@ sub update_contact : Private { if ($current_contact && $contact->id && $contact->id != $current_contact->id) { $errors{category} = _('You cannot rename a category to an existing category'); } elsif ($current_contact && !$contact->id) { - # Changed name $contact = $current_contact; - $c->model('DB::Problem')->to_body($c->stash->{body_id})->search({ category => $current_category })->update({ category => $category }); - $contact->category($category); + # Set the flag here so we can run the editable test on it + $contact->set_extra_metadata(open311_protect => $c->get_param('open311_protect')); + if (!$contact->category_uneditable) { + # Changed name + $c->model('DB::Problem')->to_body($c->stash->{body_id})->search({ category => $current_category })->update({ category => $category }); + $contact->category($category); + } } my $email = $c->get_param('email'); -- cgit v1.2.3 From 538a26498c3516b5bc24636414911b955333f934 Mon Sep 17 00:00:00 2001 From: Struan Donald Date: Wed, 6 May 2020 17:14:10 +0100 Subject: display user detail for contributed_by in report_edit Include name, email and body rather than just user id. --- perllib/FixMyStreet/App/Controller/Admin/Reports.pm | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm index 88c4380fc..4866a657e 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm @@ -234,6 +234,26 @@ sub edit : Path('/admin/report_edit') : Args(1) { push @fields, { name => 'Duplicates', val => join( ',', @{ $problem->get_extra_metadata('duplicates') } ) }; delete $extra->{duplicates}; } + + if ( $extra->{contributed_by} ) { + my $u = $c->cobrand->users->find({id => $extra->{contributed_by}}); + if ( $u ) { + my $uri = $c->uri_for_action('admin/users/index', { search => $u->email } ); + push @fields, { + name => _('Created By'), + val => FixMyStreet::Template::SafeString->new( "@{[$u->name]} (@{[$u->email]})" ) + }; + if ( $u->from_body ) { + push @fields, { name => _('Created Body'), val => $u->from_body->name }; + } elsif ( $u->is_superuser ) { + push @fields, { name => _('Created Body'), val => _('Superuser') }; + } + } else { + push @fields, { name => 'contributed_by', val => $extra->{contributed_by} }; + } + delete $extra->{contributed_by}; + } + for my $key ( keys %$extra ) { push @fields, { name => $key, val => $extra->{$key} }; } -- cgit v1.2.3 From c80f13eeac448e99873b690411d7f6e83b07dd06 Mon Sep 17 00:00:00 2001 From: Struan Donald Date: Thu, 7 May 2020 15:10:46 +0100 Subject: admin interface for per category anonymous reporting Add an interface to enable a category to accept anonymous reports, plus the code to handle permitting this. It's only available on single body cobrand sites in the default configuration. --- perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index 7b060f2ca..52306af24 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -271,7 +271,7 @@ sub update_contact : Private { $contact->send_method( $c->get_param('send_method') ); # Set flags in extra to the appropriate values - foreach (qw(photo_required open311_protect updates_disallowed reopening_disallowed assigned_users_only)) { + foreach (qw(photo_required open311_protect updates_disallowed reopening_disallowed assigned_users_only anonymous_allowed)) { if ( $c->get_param($_) ) { $contact->set_extra_metadata( $_ => 1 ); } else { -- cgit v1.2.3 From 72809e405e690c88d0e2011802820c9ba215ef61 Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Mon, 11 May 2020 16:06:37 +0100 Subject: Consistent use of Contact groups. --- perllib/FixMyStreet/App/Controller/Admin/Templates.pm | 2 +- perllib/FixMyStreet/App/Controller/Admin/Triage.pm | 6 ++---- perllib/FixMyStreet/App/Controller/Admin/Users.pm | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Templates.pm b/perllib/FixMyStreet/App/Controller/Admin/Templates.pm index efff1b488..f933c5f8a 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Templates.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Templates.pm @@ -69,7 +69,7 @@ sub edit : Path : Args(2) { category => $_->category_display, active => $active_contacts{$_->id}, email => $_->email, - group => $_->get_extra_metadata('group') // '', + group => $_->groups, } } @live_contacts; $c->stash->{contacts} = \@all_contacts; $c->forward('/report/stash_category_groups', [ \@all_contacts, 1 ]) if $c->cobrand->enable_category_groups; diff --git a/perllib/FixMyStreet/App/Controller/Admin/Triage.pm b/perllib/FixMyStreet/App/Controller/Admin/Triage.pm index 428c35073..7cfcc93dd 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Triage.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Triage.pm @@ -90,10 +90,8 @@ sub setup_categories : Private { delete $c->stash->{categories_hash}; my %category_groups = (); for my $category (@{$c->stash->{end_options}}) { - my $group = $category->{group} // $category->get_extra_metadata('group') // ['']; - # this could be an array ref or a string - my @groups = ref $group eq 'ARRAY' ? @$group : ($group); - push( @{$category_groups{$_}}, $category ) for @groups; + my $groups = $category->groups; + push( @{$category_groups{$_}}, $category ) for @$groups; } my @category_groups = (); for my $group ( grep { $_ ne _('Other') } sort keys %category_groups ) { diff --git a/perllib/FixMyStreet/App/Controller/Admin/Users.pm b/perllib/FixMyStreet/App/Controller/Admin/Users.pm index f4b9bd7dc..5bb91341d 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Users.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Users.pm @@ -401,7 +401,7 @@ sub edit : Chained('user') : PathPart('') : Args(0) { id => $_->id, category => $_->category, active => $active_contacts{$_->id}, - group => $_->get_extra_metadata('group') // '', + group => $_->groups, } } @live_contacts; $c->stash->{contacts} = \@all_contacts; $c->forward('/report/stash_category_groups', [ \@all_contacts, 1 ]) if $c->cobrand->enable_category_groups; -- cgit v1.2.3 From 5405b213903785e0c215efcf9c7125bddbd14731 Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Tue, 7 Jul 2020 13:13:29 +0100 Subject: Better sort admin user table. Sort the table when showing search results, and show users without name at the bottom, rather than at the top. --- perllib/FixMyStreet/App/Controller/Admin/Users.pm | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Users.pm b/perllib/FixMyStreet/App/Controller/Admin/Users.pm index 5bb91341d..c73f1429b 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Users.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Users.pm @@ -47,8 +47,8 @@ sub index :Path : Args(0) { my $search = $c->get_param('search'); my $role = $c->get_param('role'); + my $users = $c->cobrand->users; if ($search || $role) { - my $users = $c->cobrand->users; my $isearch; if ($search) { $search = $self->trim($search); @@ -78,25 +78,20 @@ sub index :Path : Args(0) { join => 'user_roles', }); } - - my @users = $users->all; - $c->stash->{users} = [ @users ]; - if ($search) { - $c->forward('/admin/add_flags', [ { email => { ilike => $isearch } } ]); - } - } else { $c->forward('/auth/get_csrf_token'); $c->forward('/admin/fetch_all_bodies'); $c->cobrand->call_hook('admin_user_edit_extra_data'); # Admin users by default - my $users = $c->cobrand->users->search( - { from_body => { '!=', undef } }, - { order_by => 'name' } - ); - my @users = $users->all; - $c->stash->{users} = \@users; + $users = $users->search({ from_body => { '!=', undef } }); + } + + $users = $users->search(undef, { order_by => [ \"name = ''", 'name' ] }); + my @users = $users->all; + $c->stash->{users} = \@users; + if ($search) { + $c->forward('/admin/add_flags', [ { email => { ilike => "%$search%" } } ]); } my $rs; -- cgit v1.2.3 From 67823bc788ce744e1228a8602b9a5aa805771ced Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Fri, 10 Jul 2020 14:38:17 +0100 Subject: Centralise update creation to include fields. Given the user, we can infer the name if not provided, and the extra data if a staff user. We can also provide defaults for various other fields. Always have superuser take precedence over from_body. --- .../FixMyStreet/App/Controller/Admin/Reports.pm | 24 ++-------------------- perllib/FixMyStreet/App/Controller/Admin/Triage.pm | 17 ++------------- 2 files changed, 4 insertions(+), 37 deletions(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm index 4866a657e..48386cf3e 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm @@ -368,24 +368,10 @@ sub edit : Path('/admin/report_edit') : Args(1) { if ( $problem->state ne $old_state ) { $c->forward( '/admin/log_edit', [ $id, 'problem', 'state_change' ] ); - my $name = $c->user->moderating_user_name; - my $extra = { is_superuser => 1 }; - if ($c->user->from_body) { - delete $extra->{is_superuser}; - $extra->{is_body_user} = $c->user->from_body->id; - } - my $timestamp = \'current_timestamp'; $problem->add_to_comments( { text => $c->stash->{update_text} || '', - created => $timestamp, - confirmed => $timestamp, - user_id => $c->user->id, - name => $name, - mark_fixed => 0, - anonymous => 0, - state => 'confirmed', + user => $c->user->obj, problem_state => $problem->state, - extra => $extra } ); } $c->forward( '/admin/log_edit', [ $id, 'problem', 'edit' ] ); @@ -444,13 +430,7 @@ sub edit_category : Private { } else { $problem->add_to_comments({ text => $update_text, - created => \'current_timestamp', - confirmed => \'current_timestamp', - user_id => $c->user->id, - name => $c->user->from_body ? $c->user->from_body->name : $c->user->name, - state => 'confirmed', - mark_fixed => 0, - anonymous => 0, + user => $c->user->obj, }); } $c->forward( '/admin/log_edit', [ $problem->id, 'problem', 'category_change' ] ); diff --git a/perllib/FixMyStreet/App/Controller/Admin/Triage.pm b/perllib/FixMyStreet/App/Controller/Admin/Triage.pm index 7cfcc93dd..c5bb6628d 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Triage.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Triage.pm @@ -117,27 +117,14 @@ sub update : Private { $c->stash->{problem}->update( { state => 'confirmed' } ); $c->forward( '/admin/log_edit', [ $problem->id, 'problem', 'triage' ] ); - my $name = $c->user->moderating_user_name; - my $extra = { is_superuser => 1 }; - if ($c->user->from_body) { - delete $extra->{is_superuser}; - $extra->{is_body_user} = $c->user->from_body->id; - } - + my $extra; $extra->{triage_report} = 1; $extra->{holding_category} = $current_category; $extra->{new_category} = $new_category; - my $timestamp = \'current_timestamp'; my $comment = $problem->add_to_comments( { text => "Report triaged from $current_category to $new_category", - created => $timestamp, - confirmed => $timestamp, - user_id => $c->user->id, - name => $name, - mark_fixed => 0, - anonymous => 0, - state => 'confirmed', + user => $c->user->obj, problem_state => $problem->state, extra => $extra, whensent => \'current_timestamp', -- cgit v1.2.3 From 34dd7c253d337ea922049390dc6ba44b8686e516 Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Wed, 29 Jul 2020 15:19:58 +0100 Subject: Prefetch user bodies in admin user search. --- perllib/FixMyStreet/App/Controller/Admin/Users.pm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Users.pm b/perllib/FixMyStreet/App/Controller/Admin/Users.pm index c73f1429b..9fd4cd32d 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Users.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Users.pm @@ -64,7 +64,7 @@ sub index :Path : Args(0) { -or => [ email => { ilike => $isearch }, phone => { ilike => $isearch }, - name => { ilike => $isearch }, + 'me.name' => { ilike => $isearch }, from_body => $search_n, ] } @@ -87,7 +87,10 @@ sub index :Path : Args(0) { $users = $users->search({ from_body => { '!=', undef } }); } - $users = $users->search(undef, { order_by => [ \"name = ''", 'name' ] }); + $users = $users->search(undef, { + prefetch => 'from_body', + order_by => [ \"me.name = ''", 'me.name' ], + }); my @users = $users->all; $c->stash->{users} = \@users; if ($search) { -- cgit v1.2.3 From bd42d6a1fcb6c8e6d89413e0ee22617625d95bad Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Wed, 29 Jul 2020 09:03:56 +0100 Subject: Add database index for full text search. --- .../FixMyStreet/App/Controller/Admin/Reports.pm | 46 +++++++--------------- 1 file changed, 15 insertions(+), 31 deletions(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm index 48386cf3e..052230643 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm @@ -50,6 +50,8 @@ sub index : Path { return if $c->cobrand->call_hook(report_search_query => $query, $p_page, $u_page, $order); + my $problems = $c->cobrand->problems; + if (my $search = $c->get_param('search')) { $search = $self->trim($search); @@ -62,9 +64,6 @@ sub index : Path { $c->stash->{searched} = $search; - my $search_n = 0; - $search_n = int($search) if $search =~ /^\d+$/; - my $like_search = "%$search%"; my $parsed = FixMyStreet::SMS->parse_username($search); @@ -92,20 +91,10 @@ sub index : Path { 'me.external_id' => { like => "%$1%" } ]; } else { - $query->{'-or'} = [ - 'me.id' => $search_n, - 'user.email' => { ilike => $like_search }, - 'user.phone' => { ilike => $like_search }, - 'me.external_id' => { ilike => $like_search }, - 'me.name' => { ilike => $like_search }, - 'me.title' => { ilike => $like_search }, - detail => { ilike => $like_search }, - bodies_str => { like => $like_search }, - cobrand_data => { like => $like_search }, - ]; + $problems = $problems->search_text($search); } - my $problems = $c->cobrand->problems->search( + $problems = $problems->search( $query, { join => 'user', @@ -119,6 +108,7 @@ sub index : Path { $c->stash->{problems} = [ $problems->all ]; $c->stash->{problems_pager} = $problems->pager; + my $updates = $c->cobrand->updates; if ($valid_email) { $query = [ 'user.email' => { ilike => $like_search }, @@ -133,24 +123,18 @@ sub index : Path { 'me.problem_id' => int($1), ]; } elsif ($search =~ /^area:(\d+)$/) { - $query = []; + $query = 0; } else { - $query = [ - 'me.id' => $search_n, - 'problem.id' => $search_n, - 'user.email' => { ilike => $like_search }, - 'user.phone' => { ilike => $like_search }, - 'me.name' => { ilike => $like_search }, - text => { ilike => $like_search }, - 'me.cobrand_data' => { ilike => $like_search }, - ]; + $updates = $updates->search_text($search); + $query = 1; } - if (@$query) { - my $updates = $c->cobrand->updates->search( - { - -or => $query, - }, + $query = { -or => $query } if ref $query; + + if ($query) { + $query = undef unless ref $query; + $updates = $updates->search( + $query, { '+columns' => ['user.email'], join => 'user', @@ -165,7 +149,7 @@ sub index : Path { } else { - my $problems = $c->cobrand->problems->search( + $problems = $problems->search( $query, { '+columns' => ['user.email'], -- cgit v1.2.3 From 52b1410f91669fab5f22cae9a9d9a040a0144c9a Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Fri, 31 Jul 2020 15:27:42 +0100 Subject: Add extra ordering to search query to force full text index use. --- perllib/FixMyStreet/App/Controller/Admin/Reports.pm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm index 052230643..e3a425632 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm @@ -92,6 +92,9 @@ sub index : Path { ]; } else { $problems = $problems->search_text($search); + # The below is added so that PostgreSQL does not try and use other indexes + # besides the full text search. It should have no impact on results shown. + $order = [ $order, { -desc => "me.id" }, { -desc => "me.created" } ]; } $problems = $problems->search( @@ -109,6 +112,7 @@ sub index : Path { $c->stash->{problems_pager} = $problems->pager; my $updates = $c->cobrand->updates; + $order = { -desc => 'me.id' }; if ($valid_email) { $query = [ 'user.email' => { ilike => $like_search }, @@ -126,6 +130,7 @@ sub index : Path { $query = 0; } else { $updates = $updates->search_text($search); + $order = [ $order, { -desc => "me.created" } ]; $query = 1; } @@ -140,7 +145,7 @@ sub index : Path { join => 'user', prefetch => [qw/problem/], rows => 50, - order_by => { -desc => 'me.id' } + order_by => $order, } )->page( $u_page ); $c->stash->{updates} = [ $updates->all ]; -- cgit v1.2.3 From 7af4f2cc87cd6ff55501bb2856193a03fe72158c Mon Sep 17 00:00:00 2001 From: M Somerville Date: Wed, 5 Aug 2020 15:56:10 +0100 Subject: Add database index for user full text search. --- perllib/FixMyStreet/App/Controller/Admin/Users.pm | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Users.pm b/perllib/FixMyStreet/App/Controller/Admin/Users.pm index 9fd4cd32d..a05e737ab 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Users.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Users.pm @@ -49,26 +49,11 @@ sub index :Path : Args(0) { my $role = $c->get_param('role'); my $users = $c->cobrand->users; if ($search || $role) { - my $isearch; if ($search) { $search = $self->trim($search); $search =~ s/^<(.*)>$/$1/; # In case email wrapped in <...> $c->stash->{searched} = $search; - - $isearch = '%' . $search . '%'; - my $search_n = 0; - $search_n = int($search) if $search =~ /^\d+$/; - - $users = $users->search( - { - -or => [ - email => { ilike => $isearch }, - phone => { ilike => $isearch }, - 'me.name' => { ilike => $isearch }, - from_body => $search_n, - ] - } - ); + $users = $users->search_text($search); } if ($role) { $c->stash->{role_selected} = $role; -- cgit v1.2.3 From d9cf470f321dc334391a35405a527521a3b605d5 Mon Sep 17 00:00:00 2001 From: Dave Arter Date: Mon, 24 Aug 2020 16:34:59 +0100 Subject: [Hackney] Allow editing & addition of contacts with special destination addresses This adds a cobrand hook to validate the email address provided when editing a contact in the admin. --- perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index 52306af24..f88ad0051 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -255,7 +255,9 @@ sub update_contact : Private { $email =~ s/\s+//g; my $send_method = $c->get_param('send_method') || $contact->body->send_method || ""; my $email_unchanged = $contact->email && $email && $contact->email eq $email; - unless ( $send_method eq 'Open311' || $email_unchanged ) { + my $cobrand = $contact->body->get_cobrand_handler; + my $cobrand_valid = $cobrand && $cobrand->call_hook(validate_contact_email => $email); + unless ( $send_method eq 'Open311' || $email_unchanged || $cobrand_valid ) { $errors{email} = _('Please enter a valid email') unless is_valid_email_list($email) || $email eq 'REFUSED'; } -- cgit v1.2.3 From bf90bf71fbac2c8e1be96646715182f876eccd57 Mon Sep 17 00:00:00 2001 From: M Somerville Date: Fri, 2 Oct 2020 14:14:17 +0100 Subject: =?UTF-8?q?Don=E2=80=99t=20strip=20all=20spaces=20from=20Open311?= =?UTF-8?q?=20categories.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If a category’s send method is Open311, only strip spaces from the ends of the code. We are aware of active Open311 servers that have codes with spaces in the middle. --- perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index f88ad0051..670336c14 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -252,8 +252,12 @@ sub update_contact : Private { } my $email = $c->get_param('email'); - $email =~ s/\s+//g; my $send_method = $c->get_param('send_method') || $contact->body->send_method || ""; + if ($send_method eq 'Open311') { + $email =~ s/^\s+|\s+$//g; + } else { + $email =~ s/\s+//g; + } my $email_unchanged = $contact->email && $email && $contact->email eq $email; my $cobrand = $contact->body->get_cobrand_handler; my $cobrand_valid = $cobrand && $cobrand->call_hook(validate_contact_email => $email); -- cgit v1.2.3 From 043bce556a17545c2c26386d8368f47ba8f541e6 Mon Sep 17 00:00:00 2001 From: M Somerville Date: Wed, 7 Oct 2020 12:06:54 +0100 Subject: Show all category history even if category renamed --- perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index 670336c14..f1a6f938b 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -151,8 +151,7 @@ sub category : Chained('body') : PathPart('') { my $history = $c->model('DB::ContactsHistory')->search( { - body_id => $c->stash->{body_id}, - category => $c->stash->{contact}->category + contact_id => $c->stash->{contact}->id, }, { order_by => ['contacts_history_id'] -- cgit v1.2.3 From 9150a5f72725d58055f9b5e60d339a781f9440f1 Mon Sep 17 00:00:00 2001 From: Struan Donald Date: Fri, 16 Oct 2020 15:11:50 +0100 Subject: allow bulk removal of staff status from users Bulk option to remove body, roles and permisions, and disable login in admin for users. Fixes mysociety/fixmystreet-commercial#2025 --- perllib/FixMyStreet/App/Controller/Admin/Users.pm | 30 ++++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Users.pm b/perllib/FixMyStreet/App/Controller/Admin/Users.pm index a05e737ab..7ebfb9bbd 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Users.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Users.pm @@ -29,17 +29,29 @@ sub index :Path : Args(0) { if ($c->req->method eq 'POST') { my @uids = $c->get_param_list('uid'); - my @role_ids = $c->get_param_list('roles'); my $user_rs = FixMyStreet::DB->resultset("User")->search({ id => \@uids }); - foreach my $user ($user_rs->all) { - $user->admin_user_body_permissions->delete; - $user->user_roles->search({ - role_id => { -not_in => \@role_ids }, - })->delete; - foreach my $role (@role_ids) { - $user->user_roles->find_or_create({ - role_id => $role, + if ( $c->get_param('remove-staff') ) { + foreach my $user ($user_rs->all) { + $user->update({ + from_body => undef, + email_verified => 0, + phone_verified => 0, }); + $user->user_roles->delete; + $user->admin_user_body_permissions->delete; + } + } else { + my @role_ids = $c->get_param_list('roles'); + foreach my $user ($user_rs->all) { + $user->admin_user_body_permissions->delete; + $user->user_roles->search({ + role_id => { -not_in => \@role_ids }, + })->delete; + foreach my $role (@role_ids) { + $user->user_roles->find_or_create({ + role_id => $role, + }); + } } } $c->stash->{status_message} = _('Updated!'); -- cgit v1.2.3 From cfda101b3006f12280a41adc4b28ca555b867556 Mon Sep 17 00:00:00 2001 From: Struan Donald Date: Fri, 23 Oct 2020 14:28:38 +0100 Subject: prevent editing of category names with hardcoded flag If a category has hardcoded set to 1 in it's extra metadata then prevent the name being edited in the admin. This is to avoid issues where the name of the category is used in e.g. layers or other configuration and changing it breaks things. Also includes admin interface for setting this that is restricted to super users only. Fixes mysociety/fixmystreet-commercial#1992 --- perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index f1a6f938b..31a717a9c 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -283,6 +283,13 @@ sub update_contact : Private { $contact->unset_extra_metadata($_); } } + if ( $c->user->is_superuser ) { + if ( $c->get_param('hardcoded') ) { + $contact->set_extra_metadata( hardcoded => 1 ); + } else { + $contact->unset_extra_metadata('hardcoded'); + } + } if ( my @group = $c->get_param_list('group') ) { @group = grep { $_ } @group; if (scalar @group == 0) { -- cgit v1.2.3 From 2e1c10996a0a08b9bf50af05300fef5c253854e7 Mon Sep 17 00:00:00 2001 From: M Somerville Date: Mon, 5 Oct 2020 14:16:42 +0100 Subject: [Bromley] Nuanced template resolution codes. Have the response template external status code be a combination of resolution code, task type ID, and task state. --- perllib/FixMyStreet/App/Controller/Admin/Templates.pm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Templates.pm b/perllib/FixMyStreet/App/Controller/Admin/Templates.pm index f933c5f8a..9fb401e2b 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Templates.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Templates.pm @@ -100,7 +100,10 @@ sub edit : Path : Args(2) { $template->text( $c->get_param('text') ); $template->state( $c->get_param('state') ); - $template->external_status_code( $c->get_param('external_status_code') ); + + my $ext_code = $c->cobrand->call_hook('admin_templates_external_status_code_hook'); + $ext_code ||= $c->get_param('external_status_code'); + $template->external_status_code($ext_code); if ( $template->state && $template->external_status_code ) { $c->stash->{errors} ||= {}; -- cgit v1.2.3 From 628de40b877974eb553e0910753f2d4cd983d9de Mon Sep 17 00:00:00 2001 From: M Somerville Date: Fri, 13 Nov 2020 14:24:54 +0000 Subject: Add GitHub Actions. We now have Image::Magick, so make sure that is handled better. --- perllib/FixMyStreet/App/Controller/Admin/Reports.pm | 1 + 1 file changed, 1 insertion(+) (limited to 'perllib/FixMyStreet/App/Controller/Admin') diff --git a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm index e3a425632..20801e0cf 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Reports.pm @@ -4,6 +4,7 @@ use namespace::autoclean; BEGIN { extends 'Catalyst::Controller'; } +use utf8; use List::MoreUtils 'uniq'; use FixMyStreet::SMS; use Utils; -- cgit v1.2.3