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