Spaces:
Sleeping
Sleeping
| from datetime import date, datetime, timedelta | |
| from typing import List | |
| import pytz | |
| import re | |
| def clamp_days(n: int, min_v=1, max_v=30): | |
| return max(min_v, min(max_v, n)) | |
| def to_iso(d: date) -> str: | |
| return d.strftime("%Y-%m-%d") | |
| def parse_date_str(s: str) -> date: | |
| return datetime.strptime(s, "%Y-%m-%d").date() | |
| def compute_return_date(start: date, days: int) -> date: | |
| days = clamp_days(days) | |
| return start + timedelta(days=days) | |
| def format_price(amount: str, currency: str = "PKR") -> str: | |
| try: | |
| f = float(amount) | |
| return f"{currency} {f:,.0f}" | |
| except Exception: | |
| return f"{currency} {amount}" | |
| def day_list(start: date, days: int) -> List[date]: | |
| days = clamp_days(days) | |
| return [start + timedelta(days=i) for i in range(days)] | |
| def as_local(dt: datetime, tz="Asia/Karachi") -> datetime: | |
| return dt.astimezone(pytz.timezone(tz)) | |
| def is_iata_code(s: str) -> bool: | |
| return bool(re.fullmatch(r"[A-Z]{3}", s or "")) |