aboutsummaryrefslogtreecommitdiffstats
path: root/perllib
diff options
context:
space:
mode:
Diffstat (limited to 'perllib')
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin/ExorDefects.pm16
-rw-r--r--perllib/FixMyStreet/App/Controller/Dashboard.pm19
-rw-r--r--perllib/FixMyStreet/App/Controller/JSON.pm22
-rw-r--r--perllib/FixMyStreet/Cobrand/Bromley.pm25
-rw-r--r--perllib/FixMyStreet/DateRange.pm72
5 files changed, 109 insertions, 45 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Admin/ExorDefects.pm b/perllib/FixMyStreet/App/Controller/Admin/ExorDefects.pm
index d965dd8f2..0026acb9c 100644
--- a/perllib/FixMyStreet/App/Controller/Admin/ExorDefects.pm
+++ b/perllib/FixMyStreet/App/Controller/Admin/ExorDefects.pm
@@ -5,6 +5,7 @@ use namespace::autoclean;
use DateTime;
use Try::Tiny;
use FixMyStreet::Integrations::ExorRDI;
+use FixMyStreet::DateRange;
BEGIN { extends 'Catalyst::Controller'; }
@@ -43,15 +44,16 @@ sub download : Path('download') : Args(0) {
$c->detach( '/page_error_404_not_found', [] );
}
- my $parser = DateTime::Format::Strptime->new( pattern => '%Y-%m-%d' );
- my $start_date = $parser-> parse_datetime ( $c->get_param('start_date') );
- my $end_date = $parser-> parse_datetime ( $c->get_param('end_date') ) ;
- my $one_day = DateTime::Duration->new( days => 1 );
+ my $range = FixMyStreet::DateRange->new(
+ start_date => $c->get_param('start_date'),
+ end_date => $c->get_param('end_date'),
+ parser => DateTime::Format::Strptime->new( pattern => '%Y-%m-%d' ),
+ );
my $params = {
- start_date => $start_date,
- inspection_date => $start_date,
- end_date => $end_date + $one_day,
+ start_date => $range->start,
+ inspection_date => $range->start,
+ end_date => $range->end,
user => $c->get_param('user_id'),
mark_as_processed => 0,
};
diff --git a/perllib/FixMyStreet/App/Controller/Dashboard.pm b/perllib/FixMyStreet/App/Controller/Dashboard.pm
index 5bc82444d..a7de23ce3 100644
--- a/perllib/FixMyStreet/App/Controller/Dashboard.pm
+++ b/perllib/FixMyStreet/App/Controller/Dashboard.pm
@@ -7,6 +7,7 @@ use JSON::MaybeXS;
use Path::Tiny;
use Text::CSV;
use Time::Piece;
+use FixMyStreet::DateRange;
BEGIN { extends 'Catalyst::Controller'; }
@@ -161,16 +162,16 @@ sub construct_rs_filter : Private {
$where{"$table_name.state"} = [ FixMyStreet::DB::Result::Problem->visible_states() ];
}
- my $dtf = $c->model('DB')->storage->datetime_parser;
-
- my $start_date = $dtf->parse_datetime($c->stash->{start_date});
- $where{"$table_name.confirmed"} = { '>=', $dtf->format_datetime($start_date) };
+ my $days30 = DateTime->now(time_zone => FixMyStreet->time_zone || FixMyStreet->local_time_zone)->subtract(days => 30);
+ $days30->truncate( to => 'day' );
- if (my $end_date = $c->stash->{end_date}) {
- my $one_day = DateTime::Duration->new( days => 1 );
- $end_date = $dtf->parse_datetime($end_date) + $one_day;
- $where{"$table_name.confirmed"} = [ -and => $where{"$table_name.confirmed"}, { '<', $dtf->format_datetime($end_date) } ];
- }
+ my $range = FixMyStreet::DateRange->new(
+ start_date => $c->stash->{start_date},
+ start_default => $days30,
+ end_date => $c->stash->{end_date},
+ formatter => $c->model('DB')->storage->datetime_parser,
+ );
+ $where{"$table_name.confirmed"} = $range->sql;
$c->stash->{params} = \%where;
my $rs = $updates ? $c->cobrand->updates : $c->cobrand->problems;
diff --git a/perllib/FixMyStreet/App/Controller/JSON.pm b/perllib/FixMyStreet/App/Controller/JSON.pm
index 762e3c115..e1e135054 100644
--- a/perllib/FixMyStreet/App/Controller/JSON.pm
+++ b/perllib/FixMyStreet/App/Controller/JSON.pm
@@ -8,6 +8,7 @@ use JSON::MaybeXS;
use DateTime;
use DateTime::Format::ISO8601;
use List::MoreUtils 'uniq';
+use FixMyStreet::DateRange;
=head1 NAME
@@ -50,16 +51,19 @@ sub problems : Local {
}
# convert the dates to datetimes and trap errors
- my $iso8601 = DateTime::Format::ISO8601->new;
- my $start_dt = eval { $iso8601->parse_datetime($start_date); };
- my $end_dt = eval { $iso8601->parse_datetime($end_date); };
- unless ( $start_dt && $end_dt ) {
+ my $range = FixMyStreet::DateRange->new(
+ start_date => $start_date,
+ end_date => $end_date,
+ parser => DateTime::Format::ISO8601->new,
+ formatter => $c->model('DB')->schema->storage->datetime_parser,
+ );
+ unless ($range->start && $range->end) {
$c->stash->{error} = 'Invalid dates supplied';
return;
}
# check that the dates are sane
- if ( $start_dt > $end_dt ) {
+ if ($range->start >= $range->end) {
$c->stash->{error} = 'Start date after end date';
return;
}
@@ -80,14 +84,8 @@ sub problems : Local {
$date_col = 'lastupdate';
}
- my $dt_parser = $c->model('DB')->schema->storage->datetime_parser;
-
- my $one_day = DateTime::Duration->new( days => 1 );
my $query = {
- $date_col => {
- '>=' => $dt_parser->format_datetime($start_dt),
- '<=' => $dt_parser->format_datetime($end_dt + $one_day),
- },
+ $date_col => $range->sql,
state => [ @state ],
};
$query->{category} = $category if $category;
diff --git a/perllib/FixMyStreet/Cobrand/Bromley.pm b/perllib/FixMyStreet/Cobrand/Bromley.pm
index e59b18522..950431e85 100644
--- a/perllib/FixMyStreet/Cobrand/Bromley.pm
+++ b/perllib/FixMyStreet/Cobrand/Bromley.pm
@@ -7,6 +7,7 @@ use utf8;
use DateTime::Format::W3CDTF;
use DateTime::Format::Flexible;
use Try::Tiny;
+use FixMyStreet::DateRange;
sub council_area_id { return 2482; }
sub council_area { return 'Bromley'; }
@@ -385,27 +386,17 @@ sub munge_load_and_group_problems {
}
# Date range
- my $dtf = $c->model('DB')->storage->datetime_parser;
- my $dtp = DateTime::Format::Flexible->new;
my $start_default = DateTime->today(time_zone => FixMyStreet->time_zone || FixMyStreet->local_time_zone)->subtract(months => 3);
$c->stash->{start_date} = $c->get_param('start_date') || $start_default->strftime('%Y-%m-%d');
$c->stash->{end_date} = $c->get_param('end_date');
- my $start_date = try {
- $dtp->parse_datetime($c->stash->{start_date}, european => 1);
- } catch {
- $start_default;
- };
- $where->{'me.confirmed'} = { '>=', $dtf->format_datetime($start_date) };
-
- my $end_date = try {
- $dtp->parse_datetime($c->stash->{end_date}, european => 1);
- };
- if ($end_date) {
- my $one_day = DateTime::Duration->new( days => 1 );
- $end_date += $one_day;
- $where->{'me.confirmed'} = [ -and => $where->{'me.confirmed'}, { '<', $dtf->format_datetime($end_date) } ];
- }
+ my $range = FixMyStreet::DateRange->new(
+ start_date => $c->stash->{start_date},
+ start_default => $start_default,
+ end_date => $c->stash->{end_date},
+ formatter => $c->model('DB')->storage->datetime_parser,
+ );
+ $where->{'me.confirmed'} = $range->sql;
delete $filter->{rows};
diff --git a/perllib/FixMyStreet/DateRange.pm b/perllib/FixMyStreet/DateRange.pm
new file mode 100644
index 000000000..bc4f4e1af
--- /dev/null
+++ b/perllib/FixMyStreet/DateRange.pm
@@ -0,0 +1,72 @@
+package FixMyStreet::DateRange;
+
+use DateTime;
+use DateTime::Format::Flexible;
+use Moo;
+use Try::Tiny;
+
+my $one_day = DateTime::Duration->new( days => 1 );
+
+has start_date => ( is => 'ro' );
+
+has start_default => ( is => 'ro' );
+
+has end_date => ( is => 'ro' );
+
+has parser => (
+ is => 'ro',
+ default => sub { DateTime::Format::Flexible->new }
+);
+
+has formatter => (
+ is => 'lazy',
+ default => sub {
+ my $self = shift;
+ return $self->parser;
+ }
+);
+
+sub _dt {
+ my ($self, $date) = @_;
+ my %params;
+ $params{european} = 1 if $self->parser->isa('DateTime::Format::Flexible');
+ my $d = try {
+ $self->parser->parse_datetime($date, %params)
+ };
+ return $d;
+}
+
+sub start {
+ my $self = shift;
+ $self->_dt($self->start_date) || $self->start_default
+}
+
+sub end {
+ my $self = shift;
+ my $d = $self->_dt($self->end_date);
+ $d += $one_day if $d;
+ return $d;
+}
+
+sub _formatted {
+ my ($self, $dt) = @_;
+ return unless $dt;
+ $self->formatter->format_datetime($dt);
+}
+
+sub start_formatted { $_[0]->_formatted($_[0]->start) }
+sub end_formatted { $_[0]->_formatted($_[0]->end) }
+
+sub sql {
+ my ($self, $default) = @_;
+ my $sql = {};
+ if (my $start = $self->start_formatted) {
+ $sql->{'>='} = $start;
+ }
+ if (my $end = $self->end_formatted) {
+ $sql->{'<'} = $end;
+ }
+ return $sql;
+}
+
+1;