from datetime import date, datetime
from typing import Any, Dict, Optional, cast
from LOGS.Auxiliary.Tools import Tools
from LOGS.Entity.SerializableContent import SerializableContent
[docs]
class DateTimeRange(SerializableContent):
"""Represents a range of two datetime values"""
_start: Optional[datetime] = None
_end: Optional[datetime] = None
def __init__(
self, ref=None, start: Optional[datetime] = None, end: Optional[datetime] = None
):
if isinstance(ref, (list, tuple)):
ref = {
"start": (ref[0] if len(ref) > 0 else None),
"end": (ref[1] if len(ref) > 1 else None),
}
super().__init__(ref=ref)
if start is not None:
self.start = start
if end is not None:
self.end = end
[docs]
def toDict(self) -> Dict[str, Any]:
return cast(
Dict[str, Any],
[
Tools.datetimeToUTCString(self.start),
Tools.datetimeToUTCString(self.end),
],
)
[docs]
def fromDict(self, ref) -> None:
if isinstance(ref, dict):
if "start" in ref and isinstance(ref["start"], date):
ref["start"] = datetime(
ref["start"].year,
ref["start"].month,
ref["start"].day,
)
if "end" in ref and isinstance(ref["end"], date):
ref["end"] = datetime(
ref["end"].year,
ref["end"].month,
ref["end"].day,
23,
59,
59,
999000,
)
super().fromDict(ref)
def __str__(self) -> str:
return f"<DateTimeRange [{self.start}, {self.end}]>"
@property
def start(self) -> Optional[datetime]:
return self._start
@start.setter
def start(self, value: Optional[datetime]):
self._start = Tools.checkAndConvert(
value, datetime, "DateTimeRange.start", allowNone=True
)
@property
def end(self) -> Optional[datetime]:
return self._end
@end.setter
def end(self, value: Optional[datetime]):
self._end = Tools.checkAndConvert(
value, datetime, "DateTimeRange.end", allowNone=True
)