Make PoP start and end dates inclusive.

Also removes the clock class.

Makes PoP date ranges inclusive such that a task order with:
-  a start date on or after the current date
and
- an end date on or before the current date
should be considered valid.

This commit also removes the Clock class. This class had two methods as
shortcuts for common uses of pendlum functions. But it wasn't being used
in very many places, and it took up about the same space as

    from pendulum import today()
    ...
    today(tz="UTC").date()

If we want to add this back in, it might be a good idea to extend it for
other time functions we have sprinkled around, like the random date
functions in our tests
This commit is contained in:
graham-dds 2019-12-30 13:43:59 -05:00
parent f4e1b668f2
commit aabedbcac4
4 changed files with 24 additions and 24 deletions

View File

@ -276,7 +276,7 @@ def existing_crl_modification_time(crl):
prev_time = os.path.getmtime(crl) prev_time = os.path.getmtime(crl)
buffered = prev_time + MODIFIED_TIME_BUFFER buffered = prev_time + MODIFIED_TIME_BUFFER
mod_time = prev_time if pendulum.now().timestamp() < buffered else buffered mod_time = prev_time if pendulum.now().timestamp() < buffered else buffered
dt = pendulum.from_timestamp(mod_time, tz="GMT") dt = pendulum.from_timestamp(mod_time, tz="UTC")
return dt.format("ddd, DD MMM YYYY HH:mm:ss zz") return dt.format("ddd, DD MMM YYYY HH:mm:ss zz")
else: else:

View File

@ -9,7 +9,7 @@ from atst.models.base import Base
import atst.models.types as types import atst.models.types as types
import atst.models.mixins as mixins import atst.models.mixins as mixins
from atst.models.attachment import Attachment from atst.models.attachment import Attachment
from atst.utils.clock import Clock from pendulum import today
class Status(Enum): class Status(Enum):
@ -117,17 +117,17 @@ class TaskOrder(Base, mixins.TimestampsMixin):
@property @property
def status(self): def status(self):
today = Clock.today() todays_date = today(tz="UTC").date()
if not self.is_completed and not self.is_signed: if not self.is_completed and not self.is_signed:
return Status.DRAFT return Status.DRAFT
elif self.is_completed and not self.is_signed: elif self.is_completed and not self.is_signed:
return Status.UNSIGNED return Status.UNSIGNED
elif today < self.start_date: elif todays_date < self.start_date:
return Status.UPCOMING return Status.UPCOMING
elif today >= self.end_date: elif todays_date > self.end_date:
return Status.EXPIRED return Status.EXPIRED
elif self.start_date <= today < self.end_date: elif self.start_date <= todays_date <= self.end_date:
return Status.ACTIVE return Status.ACTIVE
@property @property
@ -141,7 +141,7 @@ class TaskOrder(Base, mixins.TimestampsMixin):
@property @property
def days_to_expiration(self): def days_to_expiration(self):
if self.end_date: if self.end_date:
return (self.end_date - Clock.today()).days return (self.end_date - today(tz="UTC").date()).days
@property @property
def total_obligated_funds(self): def total_obligated_funds(self):

View File

@ -1,11 +0,0 @@
import pendulum
class Clock(object):
@classmethod
def today(cls, tz="UTC"):
return pendulum.today(tz=tz).date()
@classmethod
def now(cls, tz="UTC"):
return pendulum.now(tz=tz)

View File

@ -87,17 +87,28 @@ class TestTaskOrderStatus:
@patch("atst.models.TaskOrder.is_completed", new_callable=PropertyMock) @patch("atst.models.TaskOrder.is_completed", new_callable=PropertyMock)
@patch("atst.models.TaskOrder.is_signed", new_callable=PropertyMock) @patch("atst.models.TaskOrder.is_signed", new_callable=PropertyMock)
def test_active_status(self, is_signed, is_completed, start_date, end_date): def test_active_status(self, is_signed, is_completed, start_date, end_date):
# Given that I have a signed TO and today is within its start_date and end_date today = pendulum.today(tz="UTC").date()
today = pendulum.today().date()
to = TaskOrderFactory.create()
start_date.return_value = today.subtract(days=1)
end_date.return_value = today.add(days=1)
is_signed.return_value = True is_signed.return_value = True
is_completed.return_value = True is_completed.return_value = True
# Given that I have a signed TO and today is within its start_date and end_date
to_1 = TaskOrderFactory.create()
start_date.return_value = today.subtract(days=1)
end_date.return_value = today.add(days=1)
# Its status should be active # Its status should be active
assert to.status == Status.ACTIVE assert to_1.status == Status.ACTIVE
# A period of performance's start and end dates are inclusive, so a TO
# should be active on its start and end dates
to_2 = TaskOrderFactory.create()
start_date.return_value = today
end_date.return_value = today
is_signed.return_value = True
is_completed.return_value = True
assert to_2.status == Status.ACTIVE
@patch("atst.models.TaskOrder.end_date", new_callable=PropertyMock) @patch("atst.models.TaskOrder.end_date", new_callable=PropertyMock)
@patch("atst.models.TaskOrder.start_date", new_callable=PropertyMock) @patch("atst.models.TaskOrder.start_date", new_callable=PropertyMock)