import datetime
This commit is contained in:
		
							parent
							
								
									199eb82bce
								
							
						
					
					
						commit
						82de51109f
					
				| 
						 | 
				
			
			@ -1,8 +1,8 @@
 | 
			
		|||
"""Types."""
 | 
			
		||||
 | 
			
		||||
import datetime
 | 
			
		||||
import typing
 | 
			
		||||
from dataclasses import dataclass, field
 | 
			
		||||
from datetime import date, datetime, timezone
 | 
			
		||||
 | 
			
		||||
from pycountry.db import Country
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -10,13 +10,14 @@ import agenda
 | 
			
		|||
from agenda import format_list_with_ampersand
 | 
			
		||||
 | 
			
		||||
StrDict = dict[str, typing.Any]
 | 
			
		||||
DateOrDateTime = datetime.datetime | datetime.date
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def as_date(d: datetime | date) -> date:
 | 
			
		||||
def as_date(d: DateOrDateTime) -> datetime.date:
 | 
			
		||||
    """Convert datetime to date."""
 | 
			
		||||
    if isinstance(d, datetime):
 | 
			
		||||
    if isinstance(d, datetime.datetime):
 | 
			
		||||
        return d.date()
 | 
			
		||||
    assert isinstance(d, date)
 | 
			
		||||
    assert isinstance(d, datetime.date)
 | 
			
		||||
    return d
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -24,7 +25,7 @@ def as_date(d: datetime | date) -> date:
 | 
			
		|||
class Trip:
 | 
			
		||||
    """Trip."""
 | 
			
		||||
 | 
			
		||||
    start: date
 | 
			
		||||
    start: datetime.date
 | 
			
		||||
    travel: list[StrDict] = field(default_factory=list)
 | 
			
		||||
    accommodation: list[StrDict] = field(default_factory=list)
 | 
			
		||||
    conferences: list[StrDict] = field(default_factory=list)
 | 
			
		||||
| 
						 | 
				
			
			@ -38,21 +39,21 @@ class Trip:
 | 
			
		|||
        )
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def end(self) -> date | None:
 | 
			
		||||
    def end(self) -> datetime.date | None:
 | 
			
		||||
        """End date for trip."""
 | 
			
		||||
        max_conference_end = (
 | 
			
		||||
            max(as_date(item["end"]) for item in self.conferences)
 | 
			
		||||
            if self.conferences
 | 
			
		||||
            else date.min
 | 
			
		||||
            else datetime.date.min
 | 
			
		||||
        )
 | 
			
		||||
        assert isinstance(max_conference_end, date)
 | 
			
		||||
        assert isinstance(max_conference_end, datetime.date)
 | 
			
		||||
 | 
			
		||||
        arrive = [item["arrive"].date() for item in self.travel if "arrive" in item]
 | 
			
		||||
        travel_end = max(arrive) if arrive else date.min
 | 
			
		||||
        assert isinstance(travel_end, date)
 | 
			
		||||
        travel_end = max(arrive) if arrive else datetime.date.min
 | 
			
		||||
        assert isinstance(travel_end, datetime.date)
 | 
			
		||||
 | 
			
		||||
        max_date = max(max_conference_end, travel_end)
 | 
			
		||||
        return max_date if max_date != date.min else None
 | 
			
		||||
        return max_date if max_date != datetime.date.min else None
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def countries(self) -> list[Country]:
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +86,7 @@ class Holiday:
 | 
			
		|||
 | 
			
		||||
    name: str
 | 
			
		||||
    country: str
 | 
			
		||||
    date: date
 | 
			
		||||
    date: datetime.date
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
| 
						 | 
				
			
			@ -93,40 +94,42 @@ class Event:
 | 
			
		|||
    """Event."""
 | 
			
		||||
 | 
			
		||||
    name: str
 | 
			
		||||
    date: date | datetime
 | 
			
		||||
    end_date: date | datetime | None = None
 | 
			
		||||
    date: DateOrDateTime
 | 
			
		||||
    end_date: DateOrDateTime | None = None
 | 
			
		||||
    title: str | None = None
 | 
			
		||||
    url: str | None = None
 | 
			
		||||
    going: bool | None = None
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def as_datetime(self) -> datetime:
 | 
			
		||||
    def as_datetime(self) -> datetime.datetime:
 | 
			
		||||
        """Date/time of event."""
 | 
			
		||||
        d = self.date
 | 
			
		||||
        t0 = datetime.min.time()
 | 
			
		||||
        t0 = datetime.datetime.min.time()
 | 
			
		||||
        return (
 | 
			
		||||
            d
 | 
			
		||||
            if isinstance(d, datetime)
 | 
			
		||||
            else datetime.combine(d, t0).replace(tzinfo=timezone.utc)
 | 
			
		||||
            if isinstance(d, datetime.datetime)
 | 
			
		||||
            else datetime.datetime.combine(d, t0).replace(tzinfo=datetime.timezone.utc)
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def has_time(self) -> bool:
 | 
			
		||||
        """Event has a time associated with it."""
 | 
			
		||||
        return isinstance(self.date, datetime)
 | 
			
		||||
        return isinstance(self.date, datetime.datetime)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def as_date(self) -> date:
 | 
			
		||||
    def as_date(self) -> datetime.date:
 | 
			
		||||
        """Date of event."""
 | 
			
		||||
        return self.date.date() if isinstance(self.date, datetime) else self.date
 | 
			
		||||
        return (
 | 
			
		||||
            self.date.date() if isinstance(self.date, datetime.datetime) else self.date
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def end_as_date(self) -> date:
 | 
			
		||||
    def end_as_date(self) -> datetime.date:
 | 
			
		||||
        """Date of event."""
 | 
			
		||||
        return (
 | 
			
		||||
            (
 | 
			
		||||
                self.end_date.date()
 | 
			
		||||
                if isinstance(self.end_date, datetime)
 | 
			
		||||
                if isinstance(self.end_date, datetime.datetime)
 | 
			
		||||
                else self.end_date
 | 
			
		||||
            )
 | 
			
		||||
            if self.end_date
 | 
			
		||||
| 
						 | 
				
			
			@ -136,14 +139,22 @@ class Event:
 | 
			
		|||
    @property
 | 
			
		||||
    def display_time(self) -> str | None:
 | 
			
		||||
        """Time for display on web page."""
 | 
			
		||||
        return self.date.strftime("%H:%M") if isinstance(self.date, datetime) else None
 | 
			
		||||
        return (
 | 
			
		||||
            self.date.strftime("%H:%M")
 | 
			
		||||
            if isinstance(self.date, datetime.datetime)
 | 
			
		||||
            else None
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def display_timezone(self) -> str | None:
 | 
			
		||||
        """Timezone for display on web page."""
 | 
			
		||||
        return self.date.strftime("%z") if isinstance(self.date, datetime) else None
 | 
			
		||||
        return (
 | 
			
		||||
            self.date.strftime("%z")
 | 
			
		||||
            if isinstance(self.date, datetime.datetime)
 | 
			
		||||
            else None
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def delta_days(self, today: date) -> str:
 | 
			
		||||
    def delta_days(self, today: datetime.date) -> str:
 | 
			
		||||
        """Return number of days from today as a string."""
 | 
			
		||||
        delta = (self.as_date - today).days
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +169,7 @@ class Event:
 | 
			
		|||
    @property
 | 
			
		||||
    def display_date(self) -> str:
 | 
			
		||||
        """Date for display on web page."""
 | 
			
		||||
        if isinstance(self.date, datetime):
 | 
			
		||||
        if isinstance(self.date, datetime.datetime):
 | 
			
		||||
            return self.date.strftime("%a, %d, %b %Y %H:%M %z")
 | 
			
		||||
        else:
 | 
			
		||||
            return self.date.strftime("%a, %d, %b %Y")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue