diff options
Diffstat (limited to 'perllib')
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin/ExorDefects.pm | 16 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Dashboard.pm | 19 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/JSON.pm | 22 | ||||
-rw-r--r-- | perllib/FixMyStreet/Cobrand/Bromley.pm | 25 | ||||
-rw-r--r-- | perllib/FixMyStreet/DateRange.pm | 72 |
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; |