icalendar.cal.calendar module#
RFC 5545 iCalendar component.
- class icalendar.cal.calendar.Calendar(*args, **kwargs)[source]#
Bases:
ComponentThe "VCALENDAR" object is a collection of calendar information. This information can include a variety of components, such as "VEVENT", "VTODO", "VJOURNAL", "VFREEBUSY", "VTIMEZONE", or any other type of calendar component.
Examples
Create a new Calendar:
>>> from icalendar import Calendar >>> calendar = Calendar.new(name="My Calendar") >>> print(calendar.calendar_name) My Calendar
Set keys to upper for initial dict.
- add_missing_timezones(first_date=datetime.date(1970, 1, 1), last_date=datetime.date(2038, 1, 1))[source]#
Add all missing VTIMEZONE components.
This adds all the timezone components that are required. VTIMEZONE components are inserted at the beginning of the calendar to ensure they appear before other components that reference them.
Note
Timezones that are not known will not be added.
- Parameters:
>>> from icalendar import Calendar, Event >>> from datetime import datetime >>> from zoneinfo import ZoneInfo >>> calendar = Calendar() >>> event = Event() >>> calendar.add_component(event) >>> event.start = datetime(1990, 10, 11, 12, tzinfo=ZoneInfo("Europe/Berlin")) >>> calendar.timezones [] >>> calendar.add_missing_timezones() >>> calendar.timezones[0].tz_name 'Europe/Berlin' >>> calendar.get_missing_tzids() # check that all are added set()
- property availabilities: list[Availability]#
All
Availabilitycomponents in the calendar.This is a shortcut to get all availabilities. Modifications do not change the calendar. Use
Component.add_component.
- property calendar_name: str | None#
The display name of this calendar, per RFC 7986 Section 5.3.
Implements both the
NAMEproperty (from RFC 7986) and the widely-usedX-WR-CALNAMEextension for broader client compatibility.Multiple language variants can be stored by setting this property more than once, each with a different
LANGUAGEparameter value.Example
Set the name of the calendar.
>>> from icalendar import Calendar >>> calendar = Calendar() >>> calendar.calendar_name = "My Calendar" >>> print(calendar.to_ical()) BEGIN:VCALENDAR NAME:My Calendar X-WR-CALNAME:My Calendar END:VCALENDAR
See also
- property calscale: str#
The calendar scale for date and time values in this iCalendar object.
Defined in RFC 5545 Section 3.7.1. The only value currently defined is
"GREGORIAN"(the default). When this property is absent, Gregorian is assumed.Per RFC 7529, non-Gregorian calendar systems are expressed via
RRULEtransformations rather than a differentCALSCALEvalue.Example
>>> from icalendar import Calendar >>> cal = Calendar() >>> cal.calscale 'GREGORIAN'
See also
- canonical_order = ('VERSION', 'PRODID', 'CALSCALE', 'METHOD', 'DESCRIPTION', 'X-WR-CALDESC', 'NAME', 'X-WR-CALNAME')#
- property categories: list[str]#
This property defines the categories for a component.
The categories property is used to specify categories or subtypes of the calendar component. The categories are useful to search for a calendar component of a particular type and category.
Within the calendar components, specify categories as a list of strings. You can get, set, and delete categories for a component.
This property can be used in icalendar through its Python attributes of:
The categories property for
Event,Journal, andTodocomplies with RFC 5545 Section 3.8.1.2, and forCalendarwith RFC 7986 Section 5.6.Note
At present, icalendar doesn't take the LANGUAGE parameter as defined in RFC 5545 Section 3.2.10 into account.
Example
Create an event, add categories to it, print its ical representation, append another category, and finally compare the result against its expected value.
>>> from icalendar import Event >>> event = Event() >>> event.categories = ["Work", "Meeting"] >>> print(event.to_ical()) BEGIN:VEVENT CATEGORIES:Work,Meeting END:VEVENT >>> event.categories.append("Lecture") >>> event.categories == ["Work", "Meeting", "Lecture"] True
See also
- property color: str#
A CSS3 color name or value used to visually distinguish this calendar, per RFC 7986 Section 5.9.
Implements both
COLOR(from RFC 7986) andX-APPLE-CALENDAR-COLOR. The value is a case-insensitive CSS3 color name (e.g."turquoise") or a hex code (e.g."#ffffff"), drawn from the CSS3 color specification.Since RFC 7986, individual
VEVENT,VTODO, andVJOURNALsubcomponents may also carry their own color.Example
>>> from icalendar import Calendar >>> calendar = Calendar() >>> calendar.color = "black" >>> print(calendar.to_ical()) BEGIN:VCALENDAR COLOR:black END:VCALENDAR
See also
- property description: str | None#
A human-readable description of this calendar's content, per RFC 7986 Section 5.2.
Implements both
DESCRIPTION(from RFC 7986) andX-WR-CALDESCfor broader calendar client compatibility.Multiple language variants can be stored by setting this property more than once with different
LANGUAGEparameter values.Example
Add a description to a calendar.
>>> from icalendar import Calendar >>> calendar = Calendar() >>> calendar.description = "This is a calendar" >>> print(calendar.to_ical()) BEGIN:VCALENDAR DESCRIPTION:This is a calendar X-WR-CALDESC:This is a calendar END:VCALENDAR
See also
- property events: list[Event]#
All event components in the calendar.
This is a shortcut to get all events. Modifications do not change the calendar. Use
Component.add_component.>>> from icalendar import Calendar >>> calendar = Calendar.example() >>> event = calendar.events[0] >>> event.start datetime.date(2022, 1, 1) >>> print(event["SUMMARY"]) New Year's Day
- classmethod example(name='example')[source]#
Return the calendar example with the given name.
- Return type:
- property freebusy: list[FreeBusy]#
All FreeBusy components in the calendar.
This is a shortcut to get all FreeBusy. Modifications do not change the calendar. Use
Component.add_component.
- get_missing_tzids()[source]#
The set of missing timezone component tzids.
To create a RFC 5545 compatible calendar, all of these timezones should be added.
UTC is excluded: per RFC 5545 Section 3.2.19, UTC datetimes use the
Zsuffix and never require a VTIMEZONE component.
- get_used_tzids()[source]#
The set of TZIDs in use.
This goes through the whole calendar to find all occurrences of timezone information like the TZID parameter in all attributes.
>>> from icalendar import Calendar >>> calendar = Calendar.example("timezone_rdate") >>> calendar.get_used_tzids() {'posix/Europe/Vaduz'}
Even if you use UTC, this will not show up.
- property images: list[Image]#
IMAGE specifies an image associated with the calendar or a calendar component.
- Description:
This property specifies an image for an iCalendar object or a calendar component via a URI or directly with inline data that can be used by calendar user agents when presenting the calendar data to a user. Multiple properties MAY be used to specify alternative sets of images with, for example, varying media subtypes, resolutions, or sizes. When multiple properties are present, calendar user agents SHOULD display only one of them, picking one that provides the most appropriate image quality, or display none. The "DISPLAY" parameter is used to indicate the intended display mode for the image. The "ALTREP" parameter, defined in RFC 5545, can be used to provide a "clickable" image where the URI in the parameter value can be "launched" by a click on the image in the calendar user agent.
- Conformance:
This property can be specified multiple times in an iCalendar object or in "VEVENT", "VTODO", or "VJOURNAL" calendar components.
Note
At the present moment, this property is read-only. If you require a setter, please open an issue or a pull request.
- property journals: list[Journal]#
All journal components in the calendar.
This is a shortcut to get all journals. Modifications do not change the calendar. Use
Component.add_component.
- property method: str#
The iTIP scheduling method associated with this calendar object, per RFC 5545 Section 3.7.2.
When present,
METHODindicates that this object is part of a scheduling transaction (e.g., a meeting invitation or cancellation). Scheduling methods are defined by RFC 5546 (iTIP), with values such as"REQUEST","REPLY","CANCEL", and"PUBLISH".When used inside a MIME message, this value must match the
methodparameter of theContent-Typeheader. If absent, the calendar is treated as a plain data snapshot with no scheduling semantics.Example
>>> from icalendar import Calendar >>> cal = Calendar() >>> cal.method = "REQUEST" >>> str(cal.method) 'REQUEST'
- multiple: ClassVar[tuple[()]] = ('CATEGORIES', 'DESCRIPTION', 'NAME')#
These properties may occur more than once.
- name: ClassVar[str | None] = 'VCALENDAR'#
The name of the component.
This is defined in each component class.
Example
>>> from icalendar import Calendar >>> cal = Calendar.new() >>> cal.name 'VCALENDAR'
- classmethod new(calscale=None, categories=(), color=None, concepts=None, description=None, language=None, last_modified=None, links=None, method=None, name=None, organization=None, prodid=None, refresh_interval=None, refids=None, related_to=None, source=None, subcomponents=None, uid=None, url=None, version='2.0')[source]#
Create a new Calendar with all required properties.
This creates a new Calendar in accordance with RFC 5545 and RFC 7986.
- Parameters:
categories (
Sequence[str]) – Thecategoriesof the calendar.concepts (
list[vUri|str] |str|vUri|None) – Theconceptsof the calendar.description (
str|None) – Thedescriptionof the calendar.language (
str|None) – The language for the calendar. Used to generate localized prodid.last_modified (
date|datetime|None) – Thelast_modifiedof the calendar.links (
str|vUri|vUid|vXmlReference|None|list[str|vUri|vUid|vXmlReference]) – Thelinksof the calendar.name (
str|None) – Thecalendar_nameof the calendar.organization (
str|None) – The organization name. Used to generate prodid if not provided.prodid (
str|None) – Theprodidof the component. If None and organization is provided, generates a prodid in format "-//organization//name//language".refresh_interval (
timedelta|None) – Therefresh_intervalof the calendar.related_to (
None|str|vText|vUri|vUid|list[str|vText|vUri|vUid]) –related_toof the calendar.subcomponents (
Iterable[Component] |None) – The subcomponents of the calendar.uid (
str|UUID|None) – Theuidof the calendar. If None, this is set to a newuuid.uuid4().
- Returns:
- Raises:
InvalidCalendar – If the content is not valid according to RFC 5545.
Warning
As time progresses, we will be stricter with the validation.
- property prodid: str#
The product identifier for the software that created this iCalendar object.
Defined in RFC 5545 Section 3.7.3 and required exactly once per calendar object.
The value should be a globally unique string. The conventional format is a Formal Public Identifier (FPI), e.g.
-//My Company//My Product//EN, but any unique string is acceptable.Example
Set a custom product identifier on a new calendar.
>>> from icalendar import Calendar >>> cal = Calendar() >>> cal.prodid = "-//MyApp//MyCalendar//EN" >>> str(cal.prodid) '-//MyApp//MyCalendar//EN'
See also
- property refresh_interval: timedelta | None#
A suggested minimum polling interval for fetching updates to this calendar, per RFC 7986 Section 5.7.
Returns a
timedeltaorNonewhen not set. Calendar clients should not poll more frequently than this interval. The value must be a positive duration.- Raises:
ValueError – When setting a non-positive (zero or negative) duration.
TypeError – When setting a value that is not a
timedeltaorNone.
Example
>>> from datetime import timedelta >>> from icalendar import Calendar >>> cal = Calendar() >>> cal.refresh_interval = timedelta(hours=1) >>> cal.refresh_interval datetime.timedelta(seconds=3600)
See also
- singletons: ClassVar[tuple[()]] = ('PRODID', 'VERSION', 'CALSCALE', 'METHOD', 'COLOR')#
These properties must appear only once.
- property source: str#
A URI from where calendar data can be refreshed.
- Description:
This property identifies a location where a client can retrieve updated data for the calendar. Clients SHOULD honor any specified "REFRESH-INTERVAL" value when periodically retrieving data. Note that this property differs from the "URL" property in that "URL" is meant to provide an alternative representation of the calendar data rather than the original location of the data.
- Conformance:
This property can be specified once in an iCalendar object.
Example
The following is an example of this property:
SOURCE;VALUE=URI:https://example.com/holidays.ics
- property timezones: list[Timezone]#
Return the timezones components in this calendar.
>>> from icalendar import Calendar >>> calendar = Calendar.example("pacific_fiji") >>> [timezone.tz_name for timezone in calendar.timezones] ['custom_Pacific/Fiji']
Note
This is a read-only property.
- property todos: list[Todo]#
All todo components in the calendar.
This is a shortcut to get all todos. Modifications do not change the calendar. Use
Component.add_component.
- property uid: str#
UID specifies the persistent, globally unique identifier for a component.
We recommend using
uuid.uuid4()to generate new values.- Returns:
The value of the UID property as a string or
""if no value is set.
- Description:
The "UID" itself MUST be a globally unique identifier. The generator of the identifier MUST guarantee that the identifier is unique.
This is the method for correlating scheduling messages with the referenced "VEVENT", "VTODO", or "VJOURNAL" calendar component. The full range of calendar components specified by a recurrence set is referenced by referring to just the "UID" property value corresponding to the calendar component. The "RECURRENCE-ID" property allows the reference to an individual instance within the recurrence set.
This property is an important method for group-scheduling applications to match requests with later replies, modifications, or deletion requests. Calendaring and scheduling applications MUST generate this property in "VEVENT", "VTODO", and "VJOURNAL" calendar components to assure interoperability with other group- scheduling applications. This identifier is created by the calendar system that generates an iCalendar object.
Implementations MUST be able to receive and persist values of at least 255 octets for this property, but they MUST NOT truncate values in the middle of a UTF-8 multi-octet sequence.
RFC 7986 states that UID can be used, for example, to identify duplicate calendar streams that a client may have been given access to. It can be used in conjunction with the "LAST-MODIFIED" property also specified on the "VCALENDAR" object to identify the most recent version of a calendar.
- Conformance:
RFC 5545 states that the "UID" property can be specified on "VEVENT", "VTODO", and "VJOURNAL" calendar components. RFC 7986 modifies the definition of the "UID" property to allow it to be defined in an iCalendar object. RFC 9074 adds a "UID" property to "VALARM" components to allow a unique identifier to be specified. The value of this property can then be used to refer uniquely to the "VALARM" component.
This property can be specified once only.
- Security:
RFC 7986 states that UID values MUST NOT include any data that might identify a user, host, domain, or any other security- or privacy-sensitive information. It is RECOMMENDED that calendar user agents now generate "UID" values that are hex-encoded random Universally Unique Identifier (UUID) values as defined in Sections 4.4 and 4.5 of RFC 4122. You can use the
uuidmodule to generate new UUIDs.- Compatibility:
For Alarms,
X-ALARMUIDis also considered.
Examples
The following is an example of such a property value:
5FC53010-1267-4F8E-BC28-1D7AE55A7C99.Set the UID of a calendar:
>>> from icalendar import Calendar >>> from uuid import uuid4 >>> calendar = Calendar() >>> calendar.uid = uuid4() >>> print(calendar.to_ical()) BEGIN:VCALENDAR UID:d755cef5-2311-46ed-a0e1-6733c9e15c63 END:VCALENDAR
- property url: str#
A Uniform Resource Locator (URL) associated with the iCalendar object.
- Description:
This property may be used in a calendar component to convey a location where a more dynamic rendition of the calendar information associated with the calendar component can be found. This memo does not attempt to standardize the form of the URI, nor the format of the resource pointed to by the property value. If the URL property and Content-Location MIME header are both specified, they MUST point to the same resource.
- Conformance:
This property can be specified once in the "VEVENT", "VTODO", "VJOURNAL", or "VFREEBUSY" calendar components. Since RFC 7986, this property can also be defined on a "VCALENDAR".
Example
The following is an example of this property:
URL:http://example.com/pub/calendars/jsmith/mytime.ics
- validate()[source]#
Validate that the calendar has required properties and components.
This method can be called explicitly to validate a calendar before output.
- Raises:
IncompleteComponent – If the calendar lacks required properties or components.
- property version: str#
The iCalendar specification version required to interpret this object.
Defined in RFC 5545 Section 3.7.4 and required exactly once per calendar object. The value
"2.0"indicates RFC 5545 compliance, which is the default used by this library. A range such as"1.0;2.0"may indicate minimum and maximum supported versions.Example
>>> from icalendar import Calendar >>> cal = Calendar() >>> cal.version = "2.0" >>> str(cal.version) '2.0'