mirror of
https://github.com/home-assistant/core.git
synced 2025-12-05 15:38:11 +00:00
107 lines
3.3 KiB
Python
107 lines
3.3 KiB
Python
"""Workday Calendar."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import date, datetime, timedelta
|
|
|
|
from holidays import HolidayBase
|
|
|
|
from homeassistant.components.calendar import CalendarEntity, CalendarEvent
|
|
from homeassistant.const import CONF_NAME
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
|
from homeassistant.util import dt as dt_util
|
|
|
|
from . import WorkdayConfigEntry
|
|
from .const import CONF_EXCLUDES, CONF_OFFSET, CONF_WORKDAYS
|
|
from .entity import BaseWorkdayEntity
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
entry: WorkdayConfigEntry,
|
|
async_add_entities: AddConfigEntryEntitiesCallback,
|
|
) -> None:
|
|
"""Set up the Holiday Calendar config entry."""
|
|
days_offset: int = int(entry.options[CONF_OFFSET])
|
|
excludes: list[str] = entry.options[CONF_EXCLUDES]
|
|
sensor_name: str = entry.options[CONF_NAME]
|
|
workdays: list[str] = entry.options[CONF_WORKDAYS]
|
|
obj_holidays = entry.runtime_data
|
|
|
|
async_add_entities(
|
|
[
|
|
WorkdayCalendarEntity(
|
|
obj_holidays,
|
|
workdays,
|
|
excludes,
|
|
days_offset,
|
|
sensor_name,
|
|
entry.entry_id,
|
|
)
|
|
],
|
|
)
|
|
|
|
|
|
class WorkdayCalendarEntity(BaseWorkdayEntity, CalendarEntity):
|
|
"""Representation of a Workday Calendar."""
|
|
|
|
def __init__(
|
|
self,
|
|
obj_holidays: HolidayBase,
|
|
workdays: list[str],
|
|
excludes: list[str],
|
|
days_offset: int,
|
|
name: str,
|
|
entry_id: str,
|
|
) -> None:
|
|
"""Initialize WorkdayCalendarEntity."""
|
|
super().__init__(
|
|
obj_holidays,
|
|
workdays,
|
|
excludes,
|
|
days_offset,
|
|
name,
|
|
entry_id,
|
|
)
|
|
self._attr_unique_id = entry_id
|
|
self._attr_event = None
|
|
self.event_list: list[CalendarEvent] = []
|
|
self._name = name
|
|
|
|
def update_data(self, now: datetime) -> None:
|
|
"""Update data."""
|
|
event_list = []
|
|
start_date = date(now.year, 1, 1)
|
|
end_number_of_days = date(now.year + 1, 12, 31) - start_date
|
|
for i in range(end_number_of_days.days + 1):
|
|
future_date = start_date + timedelta(days=i)
|
|
if self.date_is_workday(future_date):
|
|
event = CalendarEvent(
|
|
summary=self._name,
|
|
start=future_date,
|
|
end=future_date,
|
|
)
|
|
event_list.append(event)
|
|
self.event_list = event_list
|
|
|
|
@property
|
|
def event(self) -> CalendarEvent | None:
|
|
"""Return the next upcoming event."""
|
|
sorted_list: list[CalendarEvent] | None = (
|
|
sorted(self.event_list, key=lambda e: e.start) if self.event_list else None
|
|
)
|
|
if not sorted_list:
|
|
return None
|
|
return [d for d in sorted_list if d.start >= dt_util.utcnow().date()][0]
|
|
|
|
async def async_get_events(
|
|
self, hass: HomeAssistant, start_date: datetime, end_date: datetime
|
|
) -> list[CalendarEvent]:
|
|
"""Get all events in a specific time frame."""
|
|
return [
|
|
workday
|
|
for workday in self.event_list
|
|
if start_date.date() <= workday.start <= end_date.date()
|
|
]
|