HPI/my/location/fallback/common.py
2023-01-27 11:46:22 -08:00

63 lines
1.8 KiB
Python

from dataclasses import dataclass
from typing import Optional
from datetime import datetime, timedelta
from ..common import Location
@dataclass
class FallbackLocation:
lat: float
lon: float
dt: datetime
duration: float # time in seconds for how long this is valid
accuracy: Optional[float] = None
elevation: Optional[float] = None
datasource: Optional[str] = None # which module provided this, useful for debugging
def to_location(self, end: bool = False) -> Location:
'''
by default the start date is used for the location
If end is True, the start date + duration is used
'''
dt: datetime = self.dt
if end:
dt += timedelta(self.duration)
return Location(
lat=self.lat,
lon=self.lon,
dt=dt,
accuracy=self.accuracy,
elevation=self.elevation,
datasource=self.datasource,
)
@classmethod
def from_end_date(
cls,
lat: float,
lon: float,
dt: datetime,
end_dt: datetime,
accuracy: Optional[float] = None,
elevation: Optional[float] = None,
datasource: Optional[str] = None,
) -> 'FallbackLocation':
'''
Create FallbackLocation from a start date and an end date
'''
if end_dt < dt:
raise ValueError('end_date must be after dt')
duration = (end_dt - dt).total_seconds()
return cls(
lat=lat,
lon=lon,
dt=dt,
duration=duration,
accuracy=accuracy,
elevation=elevation,
datasource=datasource,
)
# TODO: create estimate location which uses other fallback_locations to estimate a location