diff options
Diffstat (limited to 'perllib/FixMyStreet/DB/ResultSet')
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/Comment.pm | 8 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/Contact.pm | 11 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/DefectType.pm | 2 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/Nearby.pm | 21 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/Problem.pm | 54 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm | 8 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm | 2 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/User.pm | 5 |
8 files changed, 80 insertions, 31 deletions
diff --git a/perllib/FixMyStreet/DB/ResultSet/Comment.pm b/perllib/FixMyStreet/DB/ResultSet/Comment.pm index 034b86a40..ea38b3e14 100644 --- a/perllib/FixMyStreet/DB/ResultSet/Comment.pm +++ b/perllib/FixMyStreet/DB/ResultSet/Comment.pm @@ -4,12 +4,18 @@ use base 'DBIx::Class::ResultSet'; use strict; use warnings; +use Moo; +with 'FixMyStreet::Roles::FullTextSearch'; +__PACKAGE__->load_components('Helper::ResultSet::Me'); +sub text_search_columns { qw(id problem_id name text) } +sub text_search_nulls { qw(name) } +sub text_search_translate { '/.' } + sub to_body { my ($rs, $bodies) = @_; return FixMyStreet::DB::ResultSet::Problem::to_body($rs, $bodies, 1); } - sub timeline { my ( $rs ) = @_; diff --git a/perllib/FixMyStreet/DB/ResultSet/Contact.pm b/perllib/FixMyStreet/DB/ResultSet/Contact.pm index 801d20cc0..accdbb7de 100644 --- a/perllib/FixMyStreet/DB/ResultSet/Contact.pm +++ b/perllib/FixMyStreet/DB/ResultSet/Contact.pm @@ -5,7 +5,7 @@ use strict; use warnings; use POSIX qw(strcoll); -sub me { join('.', shift->current_source_alias, shift || q{}) } +__PACKAGE__->load_components('Helper::ResultSet::Me'); =head2 not_deleted @@ -90,13 +90,4 @@ sub summary_count { ); } -sub group_lookup { - my $rs = shift; - map { - my $group = $_->get_extra_metadata('group') || ''; - $group = join(',', ref $group ? @$group : $group); - $_->category => $group - } $rs->all; -} - 1; diff --git a/perllib/FixMyStreet/DB/ResultSet/DefectType.pm b/perllib/FixMyStreet/DB/ResultSet/DefectType.pm index 5b1247129..c4c11042f 100644 --- a/perllib/FixMyStreet/DB/ResultSet/DefectType.pm +++ b/perllib/FixMyStreet/DB/ResultSet/DefectType.pm @@ -12,7 +12,7 @@ sub join_table { } sub map_extras { - my ($rs, @ts) = @_; + my ($rs, $params, @ts) = @_; return map { my $meta = $_->get_extra_metadata(); my %extra = map { $_ => $meta->{$_} } keys %$meta; diff --git a/perllib/FixMyStreet/DB/ResultSet/Nearby.pm b/perllib/FixMyStreet/DB/ResultSet/Nearby.pm index 2ebe309e3..af1142c3a 100644 --- a/perllib/FixMyStreet/DB/ResultSet/Nearby.pm +++ b/perllib/FixMyStreet/DB/ResultSet/Nearby.pm @@ -17,16 +17,16 @@ sub nearby { } my $params = { - state => [ keys %{$args{states}} ], + 'problem.state' => [ keys %{$args{states}} ], }; - $params->{id} = { -not_in => $args{ids} } + $params->{problem_id} = { -not_in => $args{ids} } if $args{ids}; - $params->{category} = $args{categories} if $args{categories} && @{$args{categories}}; + $params->{'problem.category'} = $args{categories} if $args{categories} && @{$args{categories}}; $params->{$c->stash->{report_age_field}} = { '>=', \"current_timestamp-'$args{report_age}'::interval" } if $args{report_age}; - FixMyStreet::DB::ResultSet::Problem->non_public_if_possible($params, $c); + FixMyStreet::DB::ResultSet::Problem->non_public_if_possible($params, $c, 'problem'); $rs = $c->cobrand->problems_restriction($rs); @@ -34,11 +34,22 @@ sub nearby { $params = { %$params, %{$args{extra}} } if $args{extra}; my $attrs = { - prefetch => 'problem', + prefetch => { problem => [] }, bind => [ $args{latitude}, $args{longitude}, $args{distance} ], order_by => [ 'distance', { -desc => 'created' } ], rows => $args{limit}, }; + if ($c->user_exists) { + if ($c->user->from_body || $c->user->is_superuser) { + push @{$attrs->{prefetch}{problem}}, 'contact'; + } + if ($c->user->has_body_permission_to('planned_reports')) { + push @{$attrs->{prefetch}{problem}}, 'user_planned_reports'; + } + if ($c->user->has_body_permission_to('report_edit_priority') || $c->user->has_body_permission_to('report_inspect')) { + push @{$attrs->{prefetch}{problem}}, 'response_priority'; + } + } my @problems = mySociety::Locale::in_gb_locale { $rs->search( $params, $attrs )->all }; return \@problems; diff --git a/perllib/FixMyStreet/DB/ResultSet/Problem.pm b/perllib/FixMyStreet/DB/ResultSet/Problem.pm index e23cf78e1..a7c365c1e 100644 --- a/perllib/FixMyStreet/DB/ResultSet/Problem.pm +++ b/perllib/FixMyStreet/DB/ResultSet/Problem.pm @@ -8,6 +8,13 @@ use Memcached; use mySociety::Locale; use FixMyStreet::DB; +use Moo; +with 'FixMyStreet::Roles::FullTextSearch'; +__PACKAGE__->load_components('Helper::ResultSet::Me'); +sub text_search_columns { qw(id external_id bodies_str name title detail) } +sub text_search_nulls { qw(external_id bodies_str) } +sub text_search_translate { '/.' } + my $site_key; sub set_restriction { @@ -26,30 +33,31 @@ sub body_query { # Edits PARAMS in place to either hide non_public reports, or show them # if user is superuser (all) or inspector (correct body) sub non_public_if_possible { - my ($rs, $params, $c) = @_; + my ($rs, $params, $c, $table) = @_; + $table ||= 'me'; if ($c->user_exists) { my $only_non_public = $c->stash->{only_non_public} ? 1 : 0; if ($c->user->is_superuser) { # See all reports, no restriction - $params->{non_public} = 1 if $only_non_public; + $params->{"$table.non_public"} = 1 if $only_non_public; } elsif ($c->user->has_body_permission_to('report_inspect') || $c->user->has_body_permission_to('report_mark_private')) { if ($only_non_public) { $params->{'-and'} = [ - non_public => 1, + "$table.non_public" => 1, $rs->body_query($c->user->from_body->id), ]; } else { $params->{'-or'} = [ - non_public => 0, + "$table.non_public" => 0, $rs->body_query($c->user->from_body->id), ]; } } else { - $params->{non_public} = 0; + $params->{"$table.non_public"} = 0; } } else { - $params->{non_public} = 0; + $params->{"$table.non_public"} = 0; } } @@ -71,13 +79,26 @@ sub _cache_timeout { FixMyStreet->config('CACHE_TIMEOUT') // 3600; } +sub recent_completed { + my $rs = shift; + $rs->_recent_in_states('completed', [ + FixMyStreet::DB::Result::Problem->fixed_states(), + FixMyStreet::DB::Result::Problem->closed_states() + ]); +} + sub recent_fixed { my $rs = shift; - my $key = "recent_fixed:$site_key"; + $rs->_recent_in_states('fixed', [ FixMyStreet::DB::Result::Problem->fixed_states() ]); +} + +sub _recent_in_states { + my ($rs, $state_key, $states) = @_; + my $key = "recent_$state_key:$site_key"; my $result = Memcached::get($key); unless ($result) { $result = $rs->search( { - state => [ FixMyStreet::DB::Result::Problem->fixed_states() ], + state => $states, lastupdate => { '>', \"current_timestamp-'1 month'::interval" }, } )->count; Memcached::set($key, $result, _cache_timeout()); @@ -175,22 +196,33 @@ sub around_map { my ( $rs, $c, %p) = @_; my $attr = { order_by => $p{order}, + rows => $c->cobrand->reports_per_page, }; - $attr->{rows} = $c->cobrand->reports_per_page; + if ($c->user_exists) { + if ($c->user->from_body || $c->user->is_superuser) { + push @{$attr->{prefetch}}, 'contact'; + } + if ($c->user->has_body_permission_to('planned_reports')) { + push @{$attr->{prefetch}}, 'user_planned_reports'; + } + if ($c->user->has_body_permission_to('report_edit_priority') || $c->user->has_body_permission_to('report_inspect')) { + push @{$attr->{prefetch}}, 'response_priority'; + } + } unless ( $p{states} ) { $p{states} = FixMyStreet::DB::Result::Problem->visible_states(); } my $q = { - state => [ keys %{$p{states}} ], + 'me.state' => [ keys %{$p{states}} ], latitude => { '>=', $p{min_lat}, '<', $p{max_lat} }, longitude => { '>=', $p{min_lon}, '<', $p{max_lon} }, }; $q->{$c->stash->{report_age_field}} = { '>=', \"current_timestamp-'$p{report_age}'::interval" } if $p{report_age}; - $q->{category} = $p{categories} if $p{categories} && @{$p{categories}}; + $q->{'me.category'} = $p{categories} if $p{categories} && @{$p{categories}}; $rs->non_public_if_possible($q, $c); diff --git a/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm b/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm index 96f7cf7a0..af605afa6 100644 --- a/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm +++ b/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm @@ -12,8 +12,12 @@ sub join_table { } sub map_extras { - my ($rs, @ts) = @_; - return map { { id => $_->id, name => $_->name } } @ts; + my ($rs, $params, @ts) = @_; + my $current = $params->{problem} && $params->{problem}->response_priority_id || 0; + return + map { { id => $_->id, name => $_->name } } + grep { !$_->deleted || $_->id == $current } + @ts; } 1; diff --git a/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm b/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm index 46fcba153..88ecc2f94 100644 --- a/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm +++ b/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm @@ -14,7 +14,7 @@ sub name_column { } sub map_extras { - my ($rs, @ts) = @_; + my ($rs, $params, @ts) = @_; return map { my $out = { id => $_->text, name => $_->title }; $out->{state} = $_->state if $_->state; diff --git a/perllib/FixMyStreet/DB/ResultSet/User.pm b/perllib/FixMyStreet/DB/ResultSet/User.pm index 9a8a50559..baae024bf 100644 --- a/perllib/FixMyStreet/DB/ResultSet/User.pm +++ b/perllib/FixMyStreet/DB/ResultSet/User.pm @@ -5,6 +5,11 @@ use strict; use warnings; use Moo; +with 'FixMyStreet::Roles::FullTextSearch'; +__PACKAGE__->load_components('Helper::ResultSet::Me'); +sub text_search_columns { qw(id name email phone) } +sub text_search_nulls { qw(name email phone) } +sub text_search_translate { '@.' } # The database has a partial unique index on email (when email_verified is # true), and phone (when phone_verified is true). In the code, we can only |