Skip to main content

stapel-calendar

CI coverage pypi downloads python license llms.txt

Calendar and scheduling: events with participants and RSVP, RFC 5545 recurring series (virtual expansion, on-demand materialization, per-instant cancellation and reschedule), availability windows with free/busy and bookable slot computation, ICS export, and event-driven reminders.

Part of the Stapel framework — composable Django apps that deploy as a monolith or as microservices without changing module code.

Install

pip install stapel-calendar

At a glance

Fact Value
Version 0.5.0
Python >=3.11 (3.11, 3.12, 3.13, 3.14)
HTTP operations 10
Config axes 1
Usage surface 31
Extension points 5
Error codes 49
Fleet dependencies stapel-auth (optional) · stapel-core · stapel-notifications (optional)

Documentation

OpenAPI · capabilities.json · llms.txt (for agents)

What this is

A generic calendar core — Event / Participant / RSVP, an RFC 5545 recurrence engine (RRULE via python-dateutil, virtual expansion + on-demand materialization), availability (working windows, free/busy, slots) and ICS export. Two flavors of one domain — meetings and bookings — share this core; everything app-specific lives behind seams.

Quick start

INSTALLED_APPS = [
    # ...
    "stapel_calendar",
]

# urls.py
path("calendar/", include("stapel_calendar.urls"))

Concepts

  • Event — a scheduled thing (meeting/booking/appointment) with tz-aware start/end, an owner and an opaque scope_key. No FK to any host concept (org, room) — scoping and resources are seams.
  • Recurrence — the series master stores a canonical RRULE. Occurrences are virtual until they gain their own state (an RSVP or a resource), at which point they are materialized (persisted) on demand.
  • Availability — recurring working windows minus busy events give open booking slots.
from stapel_calendar import services

series = services.create_event(
    owner=user, title="Standup",
    start=start, end=end,
    recurrence_type="weekdays",            # -> FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR
)
occurrences = services.expand_event(series, range_start, range_end)  # virtual
services.materialize(series, occurrence_start)  # persist one + emit hook
busy = services.free_busy(user, range_start, range_end)
slots = services.compute_slots(user, range_start, range_end, slot_minutes=30)

Settings

All configuration lives in the STAPEL_CALENDAR namespace (dict setting, flat setting, or env var — resolved lazily):

Key Default Meaning
SCOPE_PROVIDER …scope.DefaultScopeProvider Resolve/filter the opaque scope_key
REMINDER_POLICY …reminders.DefaultReminderPolicy When/what to remind
PRESETS {} Custom recurrence presets (merged over built-ins)
REMINDER_OFFSETS [10] Minutes before start to remind
REMINDER_SCAN_WINDOW_SECONDS 60 Reminder cron granularity
DEFAULT_EXPANSION_HORIZON_DAYS 90 Default range end
MAX_EXPANSION_OCCURRENCES 1000 Expansion safety cap
DEFAULT_SLOT_MINUTES 30 Default slot length

comm surface

Kind Name Contract
Emit calendar.occurrence.materialized An occurrence was persisted — subscribe to attach a resource
Emit calendar.event.reminder_due A reminder is due — deliver it
Function calendar.free_busy {user_id, start, end, scope_key?} -> {busy: [...]}

Extension points

See MODULE.md — the agent-facing map of every fork-free seam (the resource hook, reminder policy, scope provider, recurrence presets, serializer seams, settings).

Development

pip install -e . && pip install pytest pytest-django ruff
./setup-hooks.sh
pytest tests/

License

MIT — see LICENSE.


This page is assembled by stapel-readme from docs/readme.md plus the contract artifacts in docs/. Edit the prose in docs/readme.md; the badges, facts and links above and below it are generated — do not hand-edit README.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stapel_calendar-0.5.0.tar.gz (87.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stapel_calendar-0.5.0-py3-none-any.whl (75.0 kB view details)

Uploaded Python 3

File details

Details for the file stapel_calendar-0.5.0.tar.gz.

File metadata

  • Download URL: stapel_calendar-0.5.0.tar.gz
  • Upload date:
  • Size: 87.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for stapel_calendar-0.5.0.tar.gz
Algorithm Hash digest
SHA256 1b989008602acc2c4b42bc04ef3296d203c0a42e3e41f2f2c892198a4ff910f9
MD5 4bf08509729de43831f4990313a310e5
BLAKE2b-256 583606092d4c5bb2ccd2b3ad7d0ea32cc3403c1181e6c8135f96c0c7bc15d7fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_calendar-0.5.0.tar.gz:

Publisher: publish.yml on usestapel/stapel-calendar

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file stapel_calendar-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: stapel_calendar-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 75.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for stapel_calendar-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6dc78d714802123cf09c766204155134717f08c419074d175da3bd7a93da43a8
MD5 f115e300dba35a8d7384b1af4fe3c60c
BLAKE2b-256 71442d6c69a1146a4c56a38310e831a2ae30c546702607edec807a2dd97c6cde

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_calendar-0.5.0-py3-none-any.whl:

Publisher: publish.yml on usestapel/stapel-calendar

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.9

2 files

0.3.8

2 files

0.3.5

2 files

0.3.4

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.2.2

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page