aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/DB
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/FixMyStreet/DB')
-rw-r--r--perllib/FixMyStreet/DB/Result/Nearby.pm33
-rw-r--r--perllib/FixMyStreet/DB/Result/Problem.pm9
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Nearby.pm50
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Problem.pm23
4 files changed, 114 insertions, 1 deletions
diff --git a/perllib/FixMyStreet/DB/Result/Nearby.pm b/perllib/FixMyStreet/DB/Result/Nearby.pm
new file mode 100644
index 000000000..d3d228788
--- /dev/null
+++ b/perllib/FixMyStreet/DB/Result/Nearby.pm
@@ -0,0 +1,33 @@
+package FixMyStreet::DB::Result::Nearby;
+
+# Thanks to http://www.perlmonks.org/?node_id=633800
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Core';
+use Moose;
+use namespace::clean -except => [ 'meta' ];
+
+__PACKAGE__->table( 'NONE' );
+__PACKAGE__->add_columns(
+ "problem_id",
+ { data_type => "integer", is_nullable => 0 },
+ "distance",
+ { data_type => "double precision", is_nullable => 0 },
+);
+__PACKAGE__->belongs_to(
+ "problem",
+ "FixMyStreet::DB::Result::Problem",
+ { id => "problem_id" },
+ { is_deferrable => 1 },
+);
+
+# Make a new ResultSource based on the User class
+__PACKAGE__->result_source_instance
+ ->name( \'problem_find_nearby(?,?,?)' );
+
+# we need the inline_constructor bit as we don't inherit from Moose
+__PACKAGE__->meta->make_immutable( inline_constructor => 0 );
+
+1;
diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm
index f496fb062..f1665ccba 100644
--- a/perllib/FixMyStreet/DB/Result/Problem.pm
+++ b/perllib/FixMyStreet/DB/Result/Problem.pm
@@ -134,7 +134,7 @@ sub whensent_local {
return $self->whensent
? $self->whensent->set_time_zone($tz)
- : $self->confirmed;
+ : $self->whensent;
}
sub lastupdate_local {
@@ -145,6 +145,13 @@ sub lastupdate_local {
: $self->lastupdate;
}
+around service => sub {
+ my ( $orig, $self ) = ( shift, shift );
+ my $s = $self->$orig(@_);
+ $s =~ s/_/ /g;
+ return $s;
+};
+
=head2 check_for_errors
$error_hashref = $problem->check_for_errors();
diff --git a/perllib/FixMyStreet/DB/ResultSet/Nearby.pm b/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
new file mode 100644
index 000000000..3b3a3d90b
--- /dev/null
+++ b/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
@@ -0,0 +1,50 @@
+package FixMyStreet::DB::ResultSet::Nearby;
+use base 'DBIx::Class::ResultSet';
+
+use strict;
+use warnings;
+
+sub nearby {
+ my ( $rs, $c, $dist, $ids, $limit, $mid_lat, $mid_lon, $interval ) = @_;
+
+ my $params = {
+ state => [ 'confirmed', 'fixed' ],
+ };
+ $params->{'current_timestamp-lastupdate'} = { '<', \"'$interval'::interval" }
+ if $interval;
+ $params->{id} = { -not_in => $ids }
+ if $ids;
+ $params = {
+ %{ $c->cobrand->problems_clause },
+ %$params
+ } if $c->cobrand->problems_clause;
+
+ my $attrs = {
+ join => 'problem',
+ columns => [
+ 'problem.id', 'problem.title', 'problem.latitude',
+ 'problem.longitude', 'distance', 'problem.state',
+ 'problem.confirmed'
+ ],
+ bind => [ $mid_lat, $mid_lon, $dist ],
+ order_by => [ 'distance', { -desc => 'created' } ],
+ rows => $limit,
+ };
+
+ my @problems = mySociety::Locale::in_gb_locale { $rs->search( $params, $attrs )->all };
+ return \@problems;
+}
+
+# XXX Not currently used, so not migrating at present.
+#sub fixed_nearby {
+# my ($dist, $mid_lat, $mid_lon) = @_;
+# mySociety::Locale::in_gb_locale { select_all(
+# "select id, title, latitude, longitude, distance
+# from problem_find_nearby(?, ?, $dist) as nearby, problem
+# where nearby.problem_id = problem.id and state='fixed'
+# site_restriction
+# order by lastupdate desc", $mid_lat, $mid_lon);
+# }
+#}
+
+1;
diff --git a/perllib/FixMyStreet/DB/ResultSet/Problem.pm b/perllib/FixMyStreet/DB/ResultSet/Problem.pm
index af850ecd0..ea146cd54 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Problem.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Problem.pm
@@ -63,6 +63,29 @@ sub recent {
return $result;
}
+# Problems around a location
+
+sub around_map {
+ my ( $rs, $min_lat, $max_lat, $min_lon, $max_lon, $interval, $limit ) = @_;
+ my $attr = {
+ order_by => { -desc => 'created' },
+ columns => [
+ 'id', 'title' ,'latitude', 'longitude', 'state', 'confirmed'
+ ],
+ };
+ $attr->{rows} = $limit if $limit;
+
+ my $q = {
+ state => [ 'confirmed', 'fixed' ],
+ latitude => { '>=', $min_lat, '<', $max_lat },
+ longitude => { '>=', $min_lon, '<', $max_lon },
+ };
+ $q->{'current_timestamp - lastupdate'} = { '<', \"'$interval'::interval" };
+
+ my @problems = mySociety::Locale::in_gb_locale { $rs->search( $q, $attr )->all };
+ return \@problems;
+}
+
# Admin functions
sub timeline {