[open-ils-commits] [GIT] Evergreen ILS branch master updated. e067e004fe0c834264bbd7d210d542ee1c42894f
Evergreen Git
git at git.evergreen-ils.org
Wed Nov 7 09:11:15 EST 2018
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".
The branch, master has been updated
via e067e004fe0c834264bbd7d210d542ee1c42894f (commit)
via 319f82d054c50c96034e5b0b06bb927140c59bf6 (commit)
via bd047bad6e42b7d2798558eeff25f9a73db1e783 (commit)
via a6593576f23078dafd54c08c73d3018ebd0488c5 (commit)
via ac48931992bb308f308f74132618bc1fbb05ea00 (commit)
from 67832d8dce6fa4e8bb0c8ce70dbf8039971d63f5 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit e067e004fe0c834264bbd7d210d542ee1c42894f
Author: Bill Erickson <berickxx at gmail.com>
Date: Tue Nov 6 16:22:43 2018 -0500
LP#1635737 Due date DST-aware thinko fix
Minor code refactor to fix thinko and syntax issues.
Signed-off-by: Bill Erickson <berickxx at gmail.com>
Signed-off-by: Dan Wells <dbw2 at calvin.edu>
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
index fab7796..73d69ef 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
@@ -2396,11 +2396,11 @@ sub create_due_date {
) || 'local';
my $due_date = $start_time ?
- DateTime->now(time_zone => $tz) :
- $due_date = DateTime::Format::ISO8601
+ DateTime::Format::ISO8601
->new
->parse_datetime(clean_ISO8601($start_time))
- ->set_time_zone($tz);
+ ->set_time_zone($tz) :
+ DateTime->now(time_zone => $tz);
# add the circ duration
$due_date->add(seconds => OpenILS::Utils::DateTime->interval_to_seconds($duration, $due_date));
commit 319f82d054c50c96034e5b0b06bb927140c59bf6
Author: Mike Rylander <mrylander at gmail.com>
Date: Mon Jul 31 15:55:34 2017 -0400
LP#1635737 Apply DST-aware timezone to context dates
Do our best to enforce the rule required by OpenSRF's interval_to_seconds
that when a context date is in use, and you care about DST awareness, you
must set the timezone to a DST-aware value, e.g., 'America/New_York'. In
most situations, 'local' will suffice for this, as the server is typically
configured with a DST-aware timezone in its environment. However, we will
look for an org unit setting called 'lib.timezone' and use that where we
can. See LP#1705524 for info on that setting.
Signed-off-by: Mike Rylander <mrylander at gmail.com>
Conflicts:
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
Signed-off-by: Dan Wells <dbw2 at calvin.edu>
Signed-off-by: Bill Erickson <berickxx at gmail.com>
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
index 990c3a7..fab7796 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
@@ -2387,15 +2387,30 @@ sub apply_modified_due_date {
sub create_due_date {
my( $self, $duration, $date_ceiling, $force_date, $start_time ) = @_;
- # for now, use the server timezone. TODO: use workstation org timezone
- my $due_date = DateTime->now(time_zone => 'local');
- $due_date = DateTime::Format::ISO8601->new->parse_datetime(clean_ISO8601($start_time)) if $start_time;
+ # Look up circulating library's TZ, or else use client TZ, falling
+ # back to server TZ
+ my $tz = $U->ou_ancestor_setting_value(
+ $self->circ_lib,
+ 'lib.timezone',
+ $self->editor
+ ) || 'local';
+
+ my $due_date = $start_time ?
+ DateTime->now(time_zone => $tz) :
+ $due_date = DateTime::Format::ISO8601
+ ->new
+ ->parse_datetime(clean_ISO8601($start_time))
+ ->set_time_zone($tz);
# add the circ duration
$due_date->add(seconds => OpenILS::Utils::DateTime->interval_to_seconds($duration, $due_date));
if($date_ceiling) {
- my $cdate = DateTime::Format::ISO8601->new->parse_datetime(clean_ISO8601($date_ceiling));
+ my $cdate = DateTime::Format::ISO8601
+ ->new
+ ->parse_datetime(clean_ISO8601($date_ceiling))
+ ->set_time_zone($tz);
+
if ($cdate > DateTime->now and ($cdate < $due_date or $U->is_true( $force_date ))) {
$logger->info("circulator: overriding due date with date ceiling: $date_ceiling");
$due_date = $cdate;
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
index cdf9a6f..da23bf3 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
@@ -186,7 +186,16 @@ sub noncat_due_date {
my $otype = $e->retrieve_config_non_cataloged_type($circ->item_type)
or return $e->die_event;
- my $duedate = $_dt_parser->parse_datetime( clean_ISO8601($circ->circ_time) );
+ my $tz = $U->ou_ancestor_setting_value(
+ $circ->circ_lib,
+ 'lib.timezone',
+ $self->editor
+ ) || 'local';
+
+ my $duedate = $_dt_parser
+ ->parse_datetime( clean_ISO8601($circ->circ_time) )
+ ->set_time_zone( $tz );
+
$duedate = $duedate
->add( seconds => interval_to_seconds($otype->circ_duration, $duedate) )
->strftime('%FT%T%z');
commit bd047bad6e42b7d2798558eeff25f9a73db1e783
Author: Dan Wells <dbw2 at calvin.edu>
Date: Fri Jul 21 14:28:16 2017 -0400
LP#1635737 Use new OpenSRF interval_to_seconds() context
Use the optional context for interval_to_seconds() to account for the
variable length of duration components. For example, "1 day" may be
shorter or longer than 24 hours during a time change event, "1 month"
may be shorter or longer depending on which month it is currently, etc.
Also, remove some timestamp munging, as that happens within
interval_to_seconds() already.
Signed-off-by: Dan Wells <dbw2 at calvin.edu>
Signed-off-by: Mike Rylander <mrylander at gmail.com>
Conflicts:
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
Signed-off-by: Dan Wells <dbw2 at calvin.edu>
Signed-off-by: Bill Erickson <berickxx at gmail.com>
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
index bf5dd0e..990c3a7 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
@@ -2387,16 +2387,12 @@ sub apply_modified_due_date {
sub create_due_date {
my( $self, $duration, $date_ceiling, $force_date, $start_time ) = @_;
- # if there is a raw time component (e.g. from postgres),
- # turn it into an interval that interval_to_seconds can parse
- $duration =~ s/(\d{2}):(\d{2}):(\d{2})/$1 h $2 m $3 s/o;
-
# for now, use the server timezone. TODO: use workstation org timezone
my $due_date = DateTime->now(time_zone => 'local');
$due_date = DateTime::Format::ISO8601->new->parse_datetime(clean_ISO8601($start_time)) if $start_time;
# add the circ duration
- $due_date->add(seconds => OpenILS::Utils::DateTime->interval_to_seconds($duration));
+ $due_date->add(seconds => OpenILS::Utils::DateTime->interval_to_seconds($duration, $due_date));
if($date_ceiling) {
my $cdate = DateTime::Format::ISO8601->new->parse_datetime(clean_ISO8601($date_ceiling));
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
index 0d576cf..cdf9a6f 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/NonCat.pm
@@ -188,7 +188,7 @@ sub noncat_due_date {
my $duedate = $_dt_parser->parse_datetime( clean_ISO8601($circ->circ_time) );
$duedate = $duedate
- ->add( seconds => interval_to_seconds($otype->circ_duration) )
+ ->add( seconds => interval_to_seconds($otype->circ_duration, $duedate) )
->strftime('%FT%T%z');
my $offset = $U->storagereq(
commit a6593576f23078dafd54c08c73d3018ebd0488c5
Author: Mike Rylander <mrylander at gmail.com>
Date: Tue Nov 6 15:27:23 2018 -0500
LP#1635737: Unit tests for DST and date math
Signed-off-by: Mike Rylander <mrylander at gmail.com>
Signed-off-by: Dan Wells <dbw2 at calvin.edu>
Signed-off-by: Bill Erickson <berickxx at gmail.com>
diff --git a/Open-ILS/src/perlmods/t/14-OpenILS-Utils.t b/Open-ILS/src/perlmods/t/14-OpenILS-Utils.t
index 636d2ab..81cf90f 100644
--- a/Open-ILS/src/perlmods/t/14-OpenILS-Utils.t
+++ b/Open-ILS/src/perlmods/t/14-OpenILS-Utils.t
@@ -14,7 +14,7 @@
# truckload to verify that everything would continue to work if
# we turn it on across the board.
-use Test::More tests => 43;
+use Test::More tests => 47;
use Test::Warn;
use DateTime::TimeZone;
use DateTime::Format::ISO8601;
@@ -121,6 +121,23 @@ is (OpenILS::Utils::DateTime::interval_to_seconds('1 hour'), 3600);
is (OpenILS::Utils::DateTime::interval_to_seconds('1 day'), 86400);
is (OpenILS::Utils::DateTime::interval_to_seconds('1 week'), 604800);
is (OpenILS::Utils::DateTime::interval_to_seconds('1 month'), 2628000);
+
+# With context, no DST change, with timezone
+is (OpenILS::Utils::DateTime::interval_to_seconds('1 month',
+ DateTime::Format::ISO8601->new->parse_datetime('2017-02-04T23:59:59-04')->set_time_zone("America/New_York")), 2419200);
+
+# With context, with DST change, with timezone
+is (OpenILS::Utils::DateTime::interval_to_seconds('1 month',
+ DateTime::Format::ISO8601->new->parse_datetime('2017-02-14T23:59:59-04')->set_time_zone("America/New_York")), 2415600);
+
+# With context, no DST change, no time zone
+is (OpenILS::Utils::DateTime::interval_to_seconds('1 month',
+ DateTime::Format::ISO8601->new->parse_datetime('2017-02-04T23:59:59-04')), 2419200);
+
+# With context, with DST change, no time zone (so, not DST-aware)
+is (OpenILS::Utils::DateTime::interval_to_seconds('1 month',
+ DateTime::Format::ISO8601->new->parse_datetime('2017-02-14T23:59:59-04')), 2419200);
+
is (OpenILS::Utils::DateTime::interval_to_seconds('1 year'), 31536000);
is (OpenILS::Utils::DateTime::interval_to_seconds('1 year 1 second'), 31536001);
commit ac48931992bb308f308f74132618bc1fbb05ea00
Author: Dan Wells <dbw2 at calvin.edu>
Date: Tue Nov 6 15:13:47 2018 -0500
LP#1635737 Add optional context to interval_to_seconds
Any given interval (e.g. "1 month") can be a different amount of
seconds depending on the context (i.e. "1 month" after February 1 is
March 1, but "1 month" after March 1 is April 1, yet March is longer
than February). This affects months all the time, but also can
affect days, hours, and even seconds once you consider DST and "leap"
times.
By giving an optional context to interval_to_seconds, you can find
the true number of seconds in, for example, "1 month", when starting
from "February 1" (the context).
Signed-off-by: Dan Wells <dbw2 at calvin.edu>
Signed-off-by: Mike Rylander <mrylander at gmail.com>
Signed-off-by: Bill Erickson <berickxx at gmail.com>
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Utils/DateTime.pm b/Open-ILS/src/perlmods/lib/OpenILS/Utils/DateTime.pm
index 05f0883..1da0951 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Utils/DateTime.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Utils/DateTime.pm
@@ -7,6 +7,7 @@ use FileHandle;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use Exporter;
use DateTime;
+use DateTime::Duration;
use DateTime::Format::ISO8601;
use DateTime::TimeZone;
@@ -53,7 +54,7 @@ sub AUTOLOAD {
return $self->{$name};
}
-=head2 $thing->interval_to_seconds('interval') OR interval_to_seconds('interval')
+=head2 $thing->interval_to_seconds('interval', ['context']) OR interval_to_seconds('interval', ['context'])
=head2 $thing->seconds_to_interval($seconds) OR seconds_to_interval($seconds)
@@ -98,31 +99,61 @@ for months (really (365 * 1d)/12 ... that may get smarter, though)
for years (this is 365 * 1d)
+Passing in an optional 'context' (DateTime object) will give you the number of seconds for the passed interval *starting from* the given date (e.g. '1 month' from a context of 'February 1' would return the number of seconds needed to get to 'March 1', not the generic calculation of 1/12 of the seconds in a normal year).
+
=back
=cut
sub interval_to_seconds {
- my $self = shift;
- my $interval = shift || $self;
+ my $class = shift; # throwaway
+ my $interval = ($class eq __PACKAGE__) ? shift : $class;
+ my $context = shift;
- $interval =~ s/(\d{2}):(\d{2}):(\d{2})/ $1 h $2 min $3 s /go;
+ $interval =~ s/(\d{2}):(\d{2}):(\d{2})/ $1 h $2 min $3 s /go;
- $interval =~ s/and/,/g;
- $interval =~ s/,/ /g;
+ $interval =~ s/and/,/g;
+ $interval =~ s/,/ /g;
- my $amount = 0;
+ my $amount;
+ if ($context) {
+ my $dur = DateTime::Duration->new();
+ while ($interval =~ /\s*([\+-]?)\s*(\d+)\s*(\w+)\s*/g) {
+ my ($sign, $count, $type) = ($1, $2, $3);
+ my $func = ($sign eq '-') ? 'subtract' : 'add';
+ if ($type =~ /^s/) {
+ $type = 'seconds';
+ } elsif ($type =~ /^m(?!o)/oi) {
+ $type = 'minutes';
+ } elsif ($type =~ /^h/) {
+ $type = 'hours';
+ } elsif ($type =~ /^d/oi) {
+ $type = 'days';
+ } elsif ($type =~ /^w/oi) {
+ $type = 'weeks';
+ } elsif ($type =~ /^mo/io) {
+ $type = 'months';
+ } elsif ($type =~ /^y/oi) {
+ $type = 'years';
+ }
+ $dur->$func($type => $count);
+ }
+ my $later = $context->clone->add_duration($dur);
+ $amount = $later->subtract_datetime_absolute($context)->in_units( 'seconds' );
+ } else {
+ $amount = 0;
while ($interval =~ /\s*([\+-]?)\s*(\d+)\s*(\w+)\s*/g) {
- my ($sign, $count, $type) = ($1, $2, $3);
- $count = "$sign$count" if ($sign);
- $amount += $count if ($type =~ /^s/);
- $amount += 60 * $count if ($type =~ /^m(?!o)/oi);
- $amount += 60 * 60 * $count if ($type =~ /^h/);
- $amount += 60 * 60 * 24 * $count if ($type =~ /^d/oi);
- $amount += 60 * 60 * 24 * 7 * $count if ($type =~ /^w/oi);
- $amount += ((60 * 60 * 24 * 365)/12) * $count if ($type =~ /^mo/io);
- $amount += 60 * 60 * 24 * 365 * $count if ($type =~ /^y/oi);
+ my ($sign, $count, $type) = ($1, $2, $3);
+ $count = "$sign$count" if ($sign);
+ $amount += $count if ($type =~ /^s/);
+ $amount += 60 * $count if ($type =~ /^m(?!o)/oi);
+ $amount += 60 * 60 * $count if ($type =~ /^h/);
+ $amount += 60 * 60 * 24 * $count if ($type =~ /^d/oi);
+ $amount += 60 * 60 * 24 * 7 * $count if ($type =~ /^w/oi);
+ $amount += ((60 * 60 * 24 * 365)/12) * $count if ($type =~ /^mo/io);
+ $amount += 60 * 60 * 24 * 365 * $count if ($type =~ /^y/oi);
}
- return $amount;
+ }
+ return $amount;
}
sub seconds_to_interval {
-----------------------------------------------------------------------
Summary of changes:
.../lib/OpenILS/Application/Circ/Circulate.pm | 29 ++++++---
.../lib/OpenILS/Application/Circ/NonCat.pm | 13 +++-
.../src/perlmods/lib/OpenILS/Utils/DateTime.pm | 65 ++++++++++++++-----
Open-ILS/src/perlmods/t/14-OpenILS-Utils.t | 19 ++++++-
4 files changed, 97 insertions(+), 29 deletions(-)
hooks/post-receive
--
Evergreen ILS
More information about the open-ils-commits
mailing list