Move functions out of web_view.py

This commit is contained in:
Edward Betts 2024-07-07 11:32:03 +01:00
parent e66945a825
commit a873060949
3 changed files with 77 additions and 75 deletions

View file

@ -1,23 +1,56 @@
"""Utility functions."""
import datetime
from datetime import date, datetime, timezone
DateOrDateTime = datetime.datetime | datetime.date
DateOrDateTime = datetime | date
def as_date(d: DateOrDateTime) -> datetime.date:
def as_date(d: DateOrDateTime) -> date:
"""Convert datetime to date."""
if isinstance(d, datetime.datetime):
if isinstance(d, datetime):
return d.date()
assert isinstance(d, datetime.date)
assert isinstance(d, date)
return d
def as_datetime(d: DateOrDateTime) -> datetime.datetime:
def as_datetime(d: DateOrDateTime) -> datetime:
"""Date/time of event."""
t0 = datetime.datetime.min.time()
t0 = datetime.min.time()
return (
d
if isinstance(d, datetime.datetime)
else datetime.datetime.combine(d, t0).replace(tzinfo=datetime.timezone.utc)
if isinstance(d, datetime)
else datetime.combine(d, t0).replace(tzinfo=timezone.utc)
)
def human_readable_delta(future_date: date) -> str | None:
"""
Calculate the human-readable time delta for a given future date.
Args:
future_date (date): The future date as a datetime.date object.
Returns:
str: Human-readable time delta.
"""
# Ensure the input is a future date
if future_date <= date.today():
return None
# Calculate the delta
delta = future_date - date.today()
# Convert delta to a more human-readable format
months, days = divmod(delta.days, 30)
weeks, days = divmod(days, 7)
# Formatting the output
parts = []
if months > 0:
parts.append(f"{months} months")
if weeks > 0:
parts.append(f"{weeks} weeks")
if days > 0:
parts.append(f"{days} days")
return " ".join(parts) if parts else None