1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
"""Calculate repetitions of icalendar components."""
from __future__ import annotations
from typing import TYPE_CHECKING
import x_wr_timezone
from recurring_ical_events.adapters import (
AbsoluteAlarmAdapter,
ComponentAdapter,
EventAdapter,
JournalAdapter,
TodoAdapter,
)
from recurring_ical_events.constants import DATE_MAX, DATE_MAX_DT, DATE_MIN, DATE_MIN_DT
from recurring_ical_events.errors import (
BadRuleStringFormat,
InvalidCalendar,
PeriodEndBeforeStart,
)
from recurring_ical_events.examples import example_calendar
from recurring_ical_events.query import T_COMPONENTS, CalendarQuery
from recurring_ical_events.selection import (
Alarms,
AllKnownComponents,
ComponentsWithName,
SelectComponents,
)
from .occurrence import AlarmOccurrence, Occurrence, OccurrenceID
from .series import (
AbsoluteAlarmSeries,
AlarmSeriesRelativeToEnd,
AlarmSeriesRelativeToStart,
Series,
)
if TYPE_CHECKING:
from icalendar.cal import Component
def of(
a_calendar: Component,
keep_recurrence_attributes=False,
components: T_COMPONENTS = ("VEVENT",),
skip_bad_series: bool = False, # noqa: FBT001
calendar_query: type[CalendarQuery] = CalendarQuery,
) -> CalendarQuery:
"""Create a query for recurring components in a_calendar.
If the argument is a calendar, this will also correct
times according to ``X-WR-TIMEZONE``.
Arguments:
a_calendar: an :class:`icalendar.cal.Calendar` component like
:class:`icalendar.cal.Calendar`.
keep_recurrence_attributes: Whether to keep attributes that are only used
to calculate the recurrence (``RDATE``, ``EXDATE``, ``RRULE``).
components: A list of component type names of which the recurrences
should be returned. This can also be instances of :class:`SelectComponents`.
Examples: ``("VEVENT", "VTODO", "VJOURNAL", "VALARM")``
skip_bad_series: Whether to skip series of components that contain
errors. You can use :attr:`CalendarQuery.suppressed_errors` to
specify which errors to skip.
calendar_query: The :class:`CalendarQuery` class to use.
"""
a_calendar = x_wr_timezone.to_standard(a_calendar)
return calendar_query(
a_calendar, keep_recurrence_attributes, components, skip_bad_series
)
__all__ = [
"DATE_MAX",
"DATE_MAX_DT",
"DATE_MIN",
"DATE_MIN_DT",
"AbsoluteAlarmAdapter",
"AbsoluteAlarmSeries",
"AlarmOccurrence",
"AlarmSeriesRelativeToEnd",
"AlarmSeriesRelativeToStart",
"Alarms",
"AllKnownComponents",
"BadRuleStringFormat",
"CalendarQuery",
"ComponentAdapter",
"ComponentsWithName",
"EventAdapter",
"InvalidCalendar",
"JournalAdapter",
"Occurrence",
"OccurrenceID",
"PeriodEndBeforeStart",
"SelectComponents",
"Series",
"TodoAdapter",
"example_calendar",
"of",
]
|