- Introduced a new configuration file `.cursorrules` to define coding standards, error handling, testing requirements, and project-specific guidelines. - Refactored `config.py` to implement a `Settings` dataclass for better management of environment variables, improving testability and maintainability. - Updated the import duty schedule handler to utilize session management with `session_scope`, ensuring proper database session handling. - Enhanced the import service to streamline the duty schedule import process, improving code organization and readability. - Added new service layer functions to encapsulate business logic related to group duty pinning and duty schedule imports. - Updated README documentation to reflect the new configuration structure and improved import functionality.
38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
"""Handover time parsing for duty schedule import."""
|
|
|
|
import re
|
|
from datetime import datetime, timezone
|
|
|
|
# HH:MM or HH:MM:SS, optional space + timezone (IANA or "UTC")
|
|
HANDOVER_TIME_RE = re.compile(
|
|
r"^\s*(\d{1,2}):(\d{2})(?::(\d{2}))?\s*(?:\s+(\S+))?\s*$", re.IGNORECASE
|
|
)
|
|
|
|
|
|
def parse_handover_time(text: str) -> tuple[int, int] | None:
|
|
"""Parse handover time string to (hour_utc, minute_utc). Returns None on failure."""
|
|
m = HANDOVER_TIME_RE.match(text)
|
|
if not m:
|
|
return None
|
|
hour = int(m.group(1))
|
|
minute = int(m.group(2))
|
|
# second = m.group(3) ignored
|
|
tz_str = (m.group(4) or "").strip()
|
|
if not tz_str or tz_str.upper() == "UTC":
|
|
return (hour % 24, minute)
|
|
try:
|
|
from zoneinfo import ZoneInfo
|
|
except ImportError:
|
|
try:
|
|
from backports.zoneinfo import ZoneInfo # type: ignore
|
|
except ImportError:
|
|
return None
|
|
try:
|
|
tz = ZoneInfo(tz_str)
|
|
except Exception:
|
|
return None
|
|
# Build datetime in that tz and convert to UTC
|
|
dt = datetime(2000, 1, 1, hour, minute, 0, tzinfo=tz)
|
|
utc = dt.astimezone(timezone.utc)
|
|
return (utc.hour, utc.minute)
|