diff options
Diffstat (limited to 'perllib/FixMyStreet/DB/ResultSet')
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/Body.pm | 11 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/Contact.pm | 15 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/DefectType.pm | 32 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/ReportExtraFields.pm | 25 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm | 24 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm | 27 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/State.pm | 84 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/UserPlannedReport.pm | 12 |
8 files changed, 198 insertions, 32 deletions
diff --git a/perllib/FixMyStreet/DB/ResultSet/Body.pm b/perllib/FixMyStreet/DB/ResultSet/Body.pm index 6802ed604..e79d038b1 100644 --- a/perllib/FixMyStreet/DB/ResultSet/Body.pm +++ b/perllib/FixMyStreet/DB/ResultSet/Body.pm @@ -14,4 +14,15 @@ sub for_areas { return $result; } +sub all_translated { + my $rs = shift; + my $schema = $rs->result_source->schema; + my @bodies = $rs->search(undef, { + '+columns' => { 'msgstr' => 'translations.msgstr' }, + join => 'translations', + bind => [ 'name', $schema->lang, 'body' ], + })->all; + return @bodies; +} + 1; diff --git a/perllib/FixMyStreet/DB/ResultSet/Contact.pm b/perllib/FixMyStreet/DB/ResultSet/Contact.pm index f402b5461..8ef6d1ac5 100644 --- a/perllib/FixMyStreet/DB/ResultSet/Contact.pm +++ b/perllib/FixMyStreet/DB/ResultSet/Contact.pm @@ -10,13 +10,18 @@ sub me { join('.', shift->current_source_alias, shift || q{}) } $rs = $rs->not_deleted(); -Filter down to not deleted contacts - which have C<deleted> set to false; +Filter down to not deleted contacts (so active or inactive). =cut sub not_deleted { my $rs = shift; - return $rs->search( { $rs->me('deleted') => 0 } ); + return $rs->search( { $rs->me('state') => { '!=' => 'deleted' } } ); +} + +sub active { + my $rs = shift; + $rs->search( { $rs->me('state') => [ 'unconfirmed', 'confirmed' ] } ); } sub summary_count { @@ -25,9 +30,9 @@ sub summary_count { return $rs->search( $restriction, { - group_by => ['confirmed'], - select => [ 'confirmed', { count => 'id' } ], - as => [qw/confirmed confirmed_count/] + group_by => ['state'], + select => [ 'state', { count => 'id' } ], + as => [qw/state state_count/] } ); } diff --git a/perllib/FixMyStreet/DB/ResultSet/DefectType.pm b/perllib/FixMyStreet/DB/ResultSet/DefectType.pm index a873ef252..b2ef77f7c 100644 --- a/perllib/FixMyStreet/DB/ResultSet/DefectType.pm +++ b/perllib/FixMyStreet/DB/ResultSet/DefectType.pm @@ -3,20 +3,26 @@ use base 'DBIx::Class::ResultSet'; use strict; use warnings; +use Moo; +use HTML::Entities; -sub for_bodies { - my ($rs, $bodies, $category) = @_; - my $attrs = { - 'me.body_id' => $bodies, - }; - if ($category) { - $attrs->{'contact.category'} = [ $category, undef ]; - } - $rs->search($attrs, { - order_by => 'name', - join => { 'contact_defect_types' => 'contact' }, - distinct => 1, - }); +with('FixMyStreet::Roles::ContactExtra'); + +sub join_table { + return 'contact_defect_types'; +} + +sub map_extras { + my ($rs, @ts) = @_; + return map { + my $meta = $_->get_extra_metadata(); + my %extra = map { $_ => encode_entities($meta->{$_}) } keys %$meta; + { + id => $_->id, + name => encode_entities($_->name), + extra => \%extra + } + } @ts; } 1; diff --git a/perllib/FixMyStreet/DB/ResultSet/ReportExtraFields.pm b/perllib/FixMyStreet/DB/ResultSet/ReportExtraFields.pm new file mode 100644 index 000000000..1348df3c2 --- /dev/null +++ b/perllib/FixMyStreet/DB/ResultSet/ReportExtraFields.pm @@ -0,0 +1,25 @@ +package FixMyStreet::DB::ResultSet::ReportExtraFields; +use base 'DBIx::Class::ResultSet'; + +use strict; +use warnings; + +sub for_cobrand { + my ( $rs, $cobrand ) = @_; + + my $result = $rs->search( + { cobrand => [ undef, $cobrand->moniker, '' ] } + ); + return $result; +} + +sub for_language { + my ( $rs, $language ) = @_; + + my $result = $rs->search( + { language => [ undef, $language, '' ] } + ); + return $result; +} + +1; diff --git a/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm b/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm index aa9c426f4..89bb4dfd7 100644 --- a/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm +++ b/perllib/FixMyStreet/DB/ResultSet/ResponsePriority.pm @@ -3,20 +3,18 @@ use base 'DBIx::Class::ResultSet'; use strict; use warnings; +use Moo; +use HTML::Entities; -sub for_bodies { - my ($rs, $bodies, $category) = @_; - my $attrs = { - 'me.body_id' => $bodies, - }; - if ($category) { - $attrs->{'contact.category'} = [ $category, undef ]; - } - $rs->search($attrs, { - order_by => 'name', - join => { 'contact_response_priorities' => 'contact' }, - distinct => 1, - }); +with('FixMyStreet::Roles::ContactExtra'); + +sub join_table { + return 'contact_response_priorities'; +} + +sub map_extras { + my ($rs, @ts) = @_; + return map { { id => $_->id, name => encode_entities($_->name) } } @ts; } 1; diff --git a/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm b/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm new file mode 100644 index 000000000..aa070daa3 --- /dev/null +++ b/perllib/FixMyStreet/DB/ResultSet/ResponseTemplate.pm @@ -0,0 +1,27 @@ +package FixMyStreet::DB::ResultSet::ResponseTemplate; +use base 'DBIx::Class::ResultSet'; + +use Moo; +use HTML::Entities; + +with('FixMyStreet::Roles::ContactExtra'); + +sub join_table { + return 'contact_response_templates'; +} + +sub name_column { + 'title'; +} + +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; + $out; + } @ts; +} + +1; + diff --git a/perllib/FixMyStreet/DB/ResultSet/State.pm b/perllib/FixMyStreet/DB/ResultSet/State.pm new file mode 100644 index 000000000..ac13ec2a4 --- /dev/null +++ b/perllib/FixMyStreet/DB/ResultSet/State.pm @@ -0,0 +1,84 @@ +package FixMyStreet::DB::ResultSet::State; +use base 'DBIx::Class::ResultSet'; + +use strict; +use warnings; +use Memcached; + +sub _hardcoded_states { + my $rs = shift; + # These are translated on use, not here + my $open = $rs->new({ id => -1, label => 'confirmed', type => 'open', name => "Open" }); + my $closed = $rs->new({ id => -2, label => 'closed', type => 'closed', name => "Closed" }); + return ($open, $closed); +} + +# As states will change rarely, and then only through the admin, +# we cache these in the package on first use, and clear on update. + +sub clear { + Memcached::set('states', ''); +} + +sub states { + my $rs = shift; + + my $states = Memcached::get('states'); + if ($states) { + # Need to reattach schema + $states->[0]->result_source->schema( $rs->result_source->schema ) if $states->[0]; + return $states; + } + + # Pick up and cache any translations + my $q = $rs->result_source->schema->resultset("Translation")->search({ + tbl => 'state', + col => 'name', + }); + my %trans; + $trans{$_->object_id}{$_->lang} = { id => $_->id, msgstr => $_->msgstr } foreach $q->all; + + my @states = ($rs->_hardcoded_states, $rs->search(undef, { order_by => 'label' })->all); + $_->translated->{name} = $trans{$_->id} || {} foreach @states; + $states = \@states; + Memcached::set('states', $states); + return $states; +} + +# Some functions to provide filters on the above data + +sub open { [ $_[0]->_filter(sub { $_->type eq 'open' }) ] } +sub closed { [ $_[0]->_filter(sub { $_->type eq 'closed' }) ] } +sub fixed { [ $_[0]->_filter(sub { $_->type eq 'fixed' }) ] } + +# We sometimes have only a state label to display, no associated object. +# This function can be used to return that label's display name. + +sub display { + my ($rs, $label, $single_fixed) = @_; + my $unchanging = { + unconfirmed => _("Unconfirmed"), + hidden => _("Hidden"), + partial => _("Partial"), + 'fixed - council' => _("Fixed - Council"), + 'fixed - user' => _("Fixed - User"), + }; + my $translate_now = { + confirmed => _("Open"), + closed => _("Closed"), + }; + $label = 'fixed' if $single_fixed && $label =~ /^fixed - (council|user)$/; + return $unchanging->{$label} if $unchanging->{$label}; + my ($state) = $rs->_filter(sub { $_->label eq $label }); + return $label unless $state; + $state->name($translate_now->{$label}) if $translate_now->{$label}; + return $state->msgstr; +} + +sub _filter { + my ($rs, $fn) = @_; + my $states = $rs->states; + grep &$fn, @$states; +} + +1; diff --git a/perllib/FixMyStreet/DB/ResultSet/UserPlannedReport.pm b/perllib/FixMyStreet/DB/ResultSet/UserPlannedReport.pm index 7e16e2dd3..460a4912e 100644 --- a/perllib/FixMyStreet/DB/ResultSet/UserPlannedReport.pm +++ b/perllib/FixMyStreet/DB/ResultSet/UserPlannedReport.pm @@ -6,7 +6,17 @@ use warnings; sub active { my $rs = shift; - $rs->search({ removed => undef }); + + # If we have been prefetched we can't use `active` as that'll blow away the + # cache and query the DB due to the `removed IS NULL` clause. So let's do + # the filtering here instead, if the query has been prefetched. + if ( $rs->get_cache ) { + my @users = grep { !defined($_->removed) } $rs->all; + $rs->set_cache(\@users); + $rs; + } else { + $rs->search({ removed => undef }); + } } sub for_report { |