aggregate calendar router
This commit is contained in:
parent
36caa6db89
commit
0de6b1d416
4 changed files with 66 additions and 14 deletions
|
@ -37,22 +37,13 @@ class ImageConfig(BaseModel):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class CalAggregateConfig(BaseModel):
|
|
||||||
"""
|
|
||||||
Sections "[[calendar.aggregate]]" in "config.txt".
|
|
||||||
"""
|
|
||||||
|
|
||||||
name: str = "All Events"
|
|
||||||
calendars: list[str]
|
|
||||||
|
|
||||||
|
|
||||||
class CalendarConfig(BaseModel):
|
class CalendarConfig(BaseModel):
|
||||||
"""
|
"""
|
||||||
Section "[calendar]" in "config.txt".
|
Section "[calendar]" in "config.txt".
|
||||||
"""
|
"""
|
||||||
|
|
||||||
future_days: int = 365
|
future_days: int = 365
|
||||||
aggregate: list[CalAggregateConfig] = []
|
aggregate: dict[str, list[str]] = {}
|
||||||
|
|
||||||
|
|
||||||
class Config(BaseModel):
|
class Config(BaseModel):
|
||||||
|
@ -79,9 +70,7 @@ class Config(BaseModel):
|
||||||
|
|
||||||
except RemoteResourceNotFound:
|
except RemoteResourceNotFound:
|
||||||
cfg = cls()
|
cfg = cls()
|
||||||
cfg.calendar.aggregate.append(
|
cfg.calendar.aggregate["All Events"] = list(await caldav_list())
|
||||||
CalAggregateConfig(calendars=await caldav_list()),
|
|
||||||
)
|
|
||||||
|
|
||||||
buffer = BytesIO()
|
buffer = BytesIO()
|
||||||
toml_dump(cfg.dict(), buffer)
|
toml_dump(cfg.dict(), buffer)
|
||||||
|
|
|
@ -7,12 +7,13 @@ This file: Main API router definition.
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
|
|
||||||
from ..settings import SETTINGS
|
from ..settings import SETTINGS
|
||||||
from . import calendar, image, text
|
from . import cal_aggregate, calendar, image, text
|
||||||
|
|
||||||
main_router = APIRouter(prefix=f"/{SETTINGS.api_v1_prefix}")
|
main_router = APIRouter(prefix=f"/{SETTINGS.api_v1_prefix}")
|
||||||
main_router.include_router(text.router)
|
main_router.include_router(text.router)
|
||||||
main_router.include_router(image.router)
|
main_router.include_router(image.router)
|
||||||
main_router.include_router(calendar.router)
|
main_router.include_router(calendar.router)
|
||||||
|
main_router.include_router(cal_aggregate.router)
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"main_router",
|
"main_router",
|
||||||
|
|
|
@ -9,6 +9,7 @@ from typing import Iterator, Protocol
|
||||||
from fastapi import HTTPException, status
|
from fastapi import HTTPException, status
|
||||||
from webdav3.exceptions import RemoteResourceNotFound
|
from webdav3.exceptions import RemoteResourceNotFound
|
||||||
|
|
||||||
|
from ..config import Config
|
||||||
from ..dav_common import caldav_list, webdav_list
|
from ..dav_common import caldav_list, webdav_list
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +75,18 @@ class CalendarNameLister:
|
||||||
return await caldav_list()
|
return await caldav_list()
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class CalAggregateLister:
|
||||||
|
"""
|
||||||
|
Can be called to create an iterator containing CalAggregate names.
|
||||||
|
"""
|
||||||
|
|
||||||
|
async def __call__(self) -> Iterator[str]:
|
||||||
|
cfg = await Config.get()
|
||||||
|
|
||||||
|
return iter(cfg.calendar.aggregate.keys())
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class PrefixFinder:
|
class PrefixFinder:
|
||||||
"""
|
"""
|
||||||
|
|
49
api/ovdashboard_api/routers/cal_aggregate.py
Normal file
49
api/ovdashboard_api/routers/cal_aggregate.py
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
"""
|
||||||
|
Router "cal_aggregate" provides:
|
||||||
|
|
||||||
|
- listing aggregate calendars
|
||||||
|
- finding aggregate calendars by name prefix
|
||||||
|
- getting aggregate calendar events by name prefix
|
||||||
|
"""
|
||||||
|
|
||||||
|
from typing import Iterator
|
||||||
|
|
||||||
|
from fastapi import APIRouter, Depends
|
||||||
|
from ovdashboard_api.config import Config
|
||||||
|
|
||||||
|
from ..dav_calendar import CalEvent, DavCalendar
|
||||||
|
from ._common import CalAggregateLister, PrefixFinder, PrefixUnique
|
||||||
|
|
||||||
|
router = APIRouter(prefix="/aggregate", tags=["calendar"])
|
||||||
|
|
||||||
|
_lister = CalAggregateLister()
|
||||||
|
_finder = PrefixFinder(_lister)
|
||||||
|
_unique = PrefixUnique(_finder)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/list", response_model=list[str])
|
||||||
|
async def list_aggregate_calendars(
|
||||||
|
names: Iterator[str] = Depends(_lister),
|
||||||
|
) -> list[str]:
|
||||||
|
return list(names)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/find/{prefix}", response_model=list[str])
|
||||||
|
async def find_aggregate_calendars(
|
||||||
|
names: Iterator[str] = Depends(_finder),
|
||||||
|
) -> list[str]:
|
||||||
|
return list(names)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/get/{prefix}", response_model=list[CalEvent])
|
||||||
|
async def get_aggregate_calendar(
|
||||||
|
name: Iterator[str] = Depends(_unique),
|
||||||
|
) -> list[CalEvent]:
|
||||||
|
cfg = await Config.get()
|
||||||
|
aggregate = cfg.calendar.aggregate[name]
|
||||||
|
|
||||||
|
return sorted([
|
||||||
|
event
|
||||||
|
for calendar_name in aggregate
|
||||||
|
for event in (await DavCalendar(calendar_name).events)
|
||||||
|
])
|
Loading…
Reference in a new issue