Add configuration rules, refactor settings management, and enhance import functionality
- 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.
This commit is contained in:
37
utils/handover.py
Normal file
37
utils/handover.py
Normal file
@@ -0,0 +1,37 @@
|
||||
"""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)
|
||||
Reference in New Issue
Block a user