Package: django-cal
django-calDjango app to enable exporting of events to iCalendar files.
Imitates behavior of django.contrib.syndication and is based uponvobject. Heavy inspiration came fromChristian JoergensenandDerek Willis.This project is loosely maintained and contributions will be happily accepted, but no feature
developments are planned. New maintainers are welcome.django-calrequires at least Django 3.2 and Python 3.8.DocumentationOverviewPlease see Django's syndication feed framework documentation, django_cal imitates its
behavior:https://docs.djangoproject.com/en/dev/ref/contrib/syndication/.Installationpip install django-calSetting it upDefine a custom Events class, and then wire it up directly in yoururls.py.from testapp.events import Testevents

    urlpatterns = patterns(
    "",
    (r"^ical$", Testevents()),
    )Defining event propertiesThe following parameters work analogous to how they're implemented in
django.contrib.syndication. That means, the framework checks in the following
order:self.$param(obj),self.$param(),self.$param;objbeing the object
returned byself.get_object.items           Returns the list of events.
                Must be set.
filename        Filename of the file returned in the view.
                Optional, defaults to 'events.ics'.
cal_name        Name of the calendar.
                Optional, defaults to None.
cal_desc        Description of the calendar.
                Optional, defaults to None.

item_summary    The "title" of the item.
                Optional, defaults to unicode representation of item.

item_end        Duration or end time of item.
item_duration   Optional, defaults to None. Must not define both.

item_rruleset   Optional, defaults to None.
                Should return dateutil.rruleset instance
                for recurrent events.

item_url        Optional, default calls item.get_absolute_url()
                Should return a URL with the fully-qualified domain and
                protocol (e.g. 'http://www.example.com/blog/') or an
                absolute path (e.g. '/events/'). If only a path is
                present, the 'django.contrib.sites' app will be used
                to insert the domain of the current site.
                Note: To find the current site, 'django.contrib.sites'
                      must be in your settings.INSTALLED_APPS (it is
                      there by default)

item_uid        All correspond to their vEvent equivalents.
item_start      All optional, all default to None.
item_description
item_categories
item_comment
item_location
item_last_modified
item_createdDuration of eventsdjango-cal imitates vobject behavior regarding start and end of events. In short:
Use Date objects for all-day events, DateTime for more granular control.
Define either duration or end time, never both.TimezonesIf you need timezone support, usepytz.timezoneto create an "aware" datetime object foritem_startanditem_endand set it to UTC. A user reported that Gmail, Outlook,
Apple Mail, etc. are properly displaying it in the user's local timezone upon receipt.Example::from pytz import timezone

# dt is a naive datetime object known to represent US/Eastern time
loc_dt = timezone('US/Eastern').localize(dt)
utc = timezone('UTC')
aware_datetime = loc_dt.astimezone(utc)Complex behaviorself.get_objectcan be overridden to allow for more complex events, as is possible forsyndication feeds.Contributor notesSet up dev environmentIn a virtual env:$ pip install .[tests]
$ pre-commit installUpload a new versionUploading a new wheel happens withhatchlingandtwine:First, update version number inpyproject.toml.$ bumpver update --patch
$ python3 -m pip install --upgrade build twine
$ rm dist/* && python3 -m build
$ python3 -m twine upload dist/*
$ git push --tags