allow to edit files
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from typing import Optional
|
||||
import re
|
||||
|
||||
PRESET_H = re.compile(r"^(\d+)h$")
|
||||
PRESET_D = re.compile(r"^(\d+)d$")
|
||||
|
||||
def parse_expires(value: str | None) -> datetime | None:
|
||||
"""Parse expiration presets or ISO datetime."""
|
||||
if not value or value == "never":
|
||||
return None
|
||||
|
||||
value = value.strip()
|
||||
if not value:
|
||||
return None
|
||||
|
||||
if m := PRESET_H.match(value):
|
||||
return datetime.now(timezone.utc) + timedelta(hours=int(m.group(1)))
|
||||
if m := PRESET_D.match(value):
|
||||
return datetime.now(timezone.utc) + timedelta(days=int(m.group(1)))
|
||||
try:
|
||||
return datetime.fromisoformat(value.replace("Z", "+00:00")).astimezone(timezone.utc)
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def ensure_utc(dt:datetime):
|
||||
"""Ensure a timezone-aware UTC datetime or None."""
|
||||
if dt is None:
|
||||
return None
|
||||
if dt.tzinfo is None:
|
||||
return dt.replace(tzinfo=timezone.utc)
|
||||
return dt.astimezone(timezone.utc)
|
||||
Reference in New Issue
Block a user