Reusable Django time block & recurrence engine.
Project description
timeblocks
A reusable Django library for creating and managing time blocks using safe, deterministic recurrence rules.
Designed for scheduling systems where correctness, idempotency, and data safety matter.
Why timeblocks?
Most scheduling implementations break when:
- recurrence rules change
- slots are regenerated
- bookings must be preserved
- timezones drift
- duplicate slots appear
timeblocks solves these problems by enforcing strict invariants:
- slots are generated from immutable templates
- destructive operations are explicit and scoped
- locked (booked) slots are never modified
- regeneration is safe and idempotent
- all datetime values are normalized to UTC
Core Concepts
SlotSeries (template)
A SlotSeries defines how slots should exist:
- start date
- time window
- recurrence rule
- termination condition
It does not generate slots by itself.
Slot (instance)
A Slot is a concrete time interval generated from a series.
Slots may be:
- open
- locked (e.g. booked)
- soft-deleted (historical)
Supported Recurrence Types
NONE— single occurrenceDAILY— every N daysWEEKLY— specific weekdays (e.g. Mon/Wed/Fri)WEEKDAY_MON_FRI— Monday to Friday
Additional recurrence types can be added safely without breaking existing data.
Installation
pip install timeblocks
Add to Django settings:
INSTALLED_APPS = [
...
"django.contrib.contenttypes",
"timeblocks",
]
Run migrations:
python manage.py migrate
Basic Usage
from datetime import date, time
from timeblocks.services.series_service import SeriesService
series = SeriesService.create_series(
owner=user,
data={
"start_date": date(2025, 1, 1),
"start_time": time(9, 0),
"end_time": time(10, 0),
"timezone": "UTC",
"recurrence_type": "DAILY",
"interval": 1,
"end_type": "AFTER_OCCURRENCES",
"occurrence_count": 5,
},
)
This will create:
- one
SlotSeries - five
Slotrows - all timestamps normalized to UTC
Regenerating Slots
When a recurrence rule changes, regenerate safely:
from timeblocks.services.series_service import SeriesService
SeriesService.regenerate_series(
series=series,
scope="future", # or "all"
)
Regeneration Rules
- locked slots are never touched
- soft-deleted slots are preserved
- scope controls blast radius
- operation is atomic
Cancelling a Series
from timeblocks.services.series_service import SeriesService
SeriesService.cancel_series(series=series)
Effects:
- series is deactivated
- future unlocked slots are soft-deleted
- past and locked slots remain intact
Safety Guarantees
timeblocks enforces the following invariants:
- no duplicate slots per series
- locked slots are immutable
- destructive operations are explicit
- all writes are transactional
- no database-specific constraints are required
What timeblocks Does NOT Do
- booking logic
- permissions
- notifications
- UI or API views
These belong in your application layer.
Compatibility
- Django >= 3.2
- Python >= 3.8
- Database-agnostic (PostgreSQL, MySQL, SQLite)
Versioning & Upgrades
timeblocks follows semantic versioning.
- PATCH releases fix bugs without changing behavior
- MINOR releases add new recurrence types or capabilities
- MAJOR releases may change behavior or contracts
Breaking changes are always documented in the changelog.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file timeblocks-0.1.0.tar.gz.
File metadata
- Download URL: timeblocks-0.1.0.tar.gz
- Upload date:
- Size: 11.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39d66f88cea9c0a63ffbb21aad964f8c8b34646f453030843fe07e89d8753f64
|
|
| MD5 |
3d20276dc1b50fe06e2fb83b80b7e0ab
|
|
| BLAKE2b-256 |
2655c6163a15439f760b72ed0b31d207f26979f3b43edebb41d008917e256c42
|
File details
Details for the file timeblocks-0.1.0-py3-none-any.whl.
File metadata
- Download URL: timeblocks-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b53962a76e8c8b4a9cf62d28847a5aab21e34047384ca329c895d5e77beae183
|
|
| MD5 |
6dd17375b4f477a813efcb91cfcdb64c
|
|
| BLAKE2b-256 |
3f666378205282a1171f14859d5415610b55690194899dafa8626053eae2f71b
|