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)
 |