39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
|
"""Time utilities"""
|
||
|
import datetime
|
||
|
|
||
|
from django.core.exceptions import ValidationError
|
||
|
from django.utils.translation import gettext_lazy as _
|
||
|
|
||
|
ALLOWED_KEYS = (
|
||
|
"days",
|
||
|
"seconds",
|
||
|
"microseconds",
|
||
|
"milliseconds",
|
||
|
"minutes",
|
||
|
"hours",
|
||
|
"weeks",
|
||
|
)
|
||
|
|
||
|
|
||
|
def timedelta_string_validator(value: str):
|
||
|
"""Validator for Django that checks if value can be parsed with `timedelta_from_string`"""
|
||
|
try:
|
||
|
timedelta_from_string(value)
|
||
|
except ValueError as exc:
|
||
|
raise ValidationError(
|
||
|
_("%(value)s is not in the correct format of 'hours=3;minutes=1'."),
|
||
|
params={"value": value},
|
||
|
) from exc
|
||
|
|
||
|
|
||
|
def timedelta_from_string(expr: str) -> datetime.timedelta:
|
||
|
"""Convert a string with the format of 'hours=1;minute=3;seconds=5' to a
|
||
|
`datetime.timedelta` Object with hours = 1, minutes = 3, seconds = 5"""
|
||
|
kwargs = {}
|
||
|
for duration_pair in expr.split(";"):
|
||
|
key, value = duration_pair.split("=")
|
||
|
if key.lower() not in ALLOWED_KEYS:
|
||
|
continue
|
||
|
kwargs[key.lower()] = float(value)
|
||
|
return datetime.timedelta(**kwargs)
|