Repository navigation
Releases: applewebbo/openseat
Releases · applewebbo/openseat
Release list
v2026.3
What's New in v2026.3
✨ Features
- Association logo in HTML mail (#73): Booking and application confirmation emails now embed the association's logo inline, and the intake mails (receipt, resume link, second-parent request) get a proper HTML alternative alongside their plain-text body.
- Plain-language "What's new" page (#75): The footer's version number now links to a public, non-technical changelog instead of the raw GitHub commit list.
- Typeable date fields (#69): Birth-date and event-date fields across the site's own forms now use a typeable dd/mm/yyyy mask instead of the native mobile date picker, with a calendar button kept as a fallback.
- Minor's address autofill in check-in (#74): Adding a minor's booking by hand at check-in now copies the address from whoever signs the request, the same way the public application form already does.
- Privacy notice read-to-the-end gate: The application wizard now holds the "Continue" button until the privacy notice has actually been scrolled to its end.
- Reworded check-in and application choices (for #70): Subject-type choices in the check-in add-booking modal and the application wizard's opening step now read in third/first person consistently.
- Disaster-recovery restore drill (for #1): A new
ENVIRONMENT=restoremanagement command restores the latest backup into a disposable local database, to prove backups are actually restorable.
🐛 Bug Fixes
- Booking inline delete crash (#77): Deleting a booking from an event's inline formset in the admin no longer crashes with
AttributeError—deleted_objectsis now read after the formset is saved, not before. - Editor-added bookings lost contact info (#72): A booking added by hand from the event's admin page now keeps its contact name/email/phone, sends the same confirmation mail as a public booking, and refreshes a re-booked member's contact details instead of keeping a stale address.
- Association logo in dark mode (#71): The logo now sits on a white backing so it stays visible against a dark background, and a demo logo is seeded for fresh installs.
- Dark-mode contrast on wizard summary pages: Several intake templates used a fixed light background color that washed out in dark mode; they now use theme-aware surface tokens.
🚨 Tests
- Silenced two
django-import-exportdeprecation warnings coming from its own internals (#76). - Stopped pinning the "recent backup" fixture to a fixed calendar date.
- Added the regression test that restores 100% coverage on the age-resolution branch introduced by #72.
🛠️ Maintenance
- Updated Python dependencies, pre-commit hooks and Alpine.js to their latest versions.
- Named backup files after the project and aligned dbbackup's own cleanup count with
BACKUP_RETENTION_DAYS(for #1). - Generated the migration for the reworded choice labels (for #70).
- Aligned the Dockerfile's Tailwind CLI version with what
django-tailwind-cliexpects, avoiding a ~120MB download at container boot.
📖 Full Changelog
v2026.2
What's New in 2026.2
✨ Features
- Event creation from the frontend (#62): editors can now create an event without going through
/admin/, and the event page grew a manage/view toggle with a tightened mobile layout. - Default event location and membership form (#65): new events prefill the location and the open membership form from the association's defaults, and rich-text help text now shows an Italian-aware word count.
- Auto-generated, hidden slugs (#64):
Association.slugandEvent.slugare generated automatically on save and no longer editable or shown anywhere. - Estimated event duration (#66): the unused
Event.ends_attimestamp is replaced by an optionalduration_hoursfield, giving attendees a rough sense of length instead of an exact end time. - Collapsible navbar menu on mobile (#67): the "+ Evento" / "Account" / "Esci" links collapse behind a hamburger menu on narrow viewports and stay inline on wider screens.
- Named sender and reply-to on outbound mail (for #68): every outbound email now carries the association's name in the From header and a real reply-to address, reducing the odds of landing in spam.
🐛 Bug Fixes
- Fixed
just issue-createpassing the release-notes/issue body's file path as literal text instead of its content.
🚨 Tests
- Added coverage for a senior editor's access to check-in management (for #62).
🛠️ Maintenance
- Wired up django-devbar in dev and fixed N+1/duplicate queries on association, event and submission lookups (#61).
- Fixed stale English fuzzy strings and dropped obsolete translations (#64).
- Bumped dependencies and added coverage regression tests.
📚 Documentation
- Documented the Coolify health check command and start period.
📖 Full Changelog
v2026.1.4
What's New in 2026.1.4
✨ Features
- Coolify health check (#59): Added a
/health/endpoint (django-health-check) that checks only the database — the one dependency the web process needs to serve a request — so a broken migration or a crashed process fails the probe without also failing it on an unrelated Redis or mail hiccup. Always answers JSON, since Coolify's health check path field takes a bare path with no room for a?format=jsonquery string. - Device-driven dark theme and a shared navbar: The site now follows the visitor's OS light/dark preference. The association's brand colours get a dedicated dark-mode formula (lightened toward white instead of darkened toward black, so text stays legible on a dark background), and the logo/name/account header is now a single shared component reused across the home page, the booking/membership flow, and the account pages — so it looks and behaves the same everywhere instead of existing only on the home page.
- Pastel label colours:
just label-createnow picks a colour at random from a fixed pastel palette instead of always reusing the same default, so release labels are easier to tell apart at a glance.
🐛 Bug Fixes
- Coolify deploy webhook returning 405 (#58): The CI
deployjob called Coolify's manual deploy webhook with a plain GET request; the endpoint only accepts POST, so the push to main on 2026-08-28 never triggered a deploy. Fixed by sending an explicit POST. - Missing/wrong Italian admin translations (#57): django-import-export's own Italian catalog left some admin strings untranslated ("Select all", the selection-count message) or copied from the wrong template ("will be imported" instead of "will be exported"). Overridden in this project's own catalog.
- Missing thumbnails on past events: A missing closing
>on two event card links in the home page was silently dropping their thumbnail<img>from the DOM, found while auditing the page for the dark-theme work.
📖 Full Changelog
v2026.1.3
What's New in v2026.1.3
✨ Features
- Editor manual booking entry page (#47): Editors can now add a booking by hand from the check-in page, straight from a signed paper form — even while public bookings are closed past the automatic cutoff or once check-in is already in progress.
- Reword the already-a-member link (#50): The public event page now asks "Have you already taken part in one of our events?" instead of "Already a member?" — matching how visitors actually think about their relationship with the association.
- Import and export the member register from Django admin (#52): The register can now be imported and exported straight from the admin, in the 22-column external tracciato the association's other register-management app expects (CSV or XLSX). Import supports overwriting an existing member matched by tax code, or always appending as new.
- Show past events to logged-in editors on the home page (#53): An "Archived events" section on the home page lets editors reach a past event to manage its bookings or export its members — public visitors keep seeing only upcoming events.
- Export newly acquired members for a single event (#54): An "Esporta" button on the check-in page downloads, in CSV or XLSX, only the members who joined the register through that specific event — gated behind a new dedicated Editor+ group so export access stays separate from check-in duties.
- Province and cascading comune selection on the application form (#55): The address sections of the public application form now offer a province dropdown and a comune dropdown scoped to it (via htmx), replacing free-text city entry, backed by a self-hosted, vendored ISTAT comuni dataset.
- Autofill the minor's address from the applicant's (#56): When applying for a minor, the member's address fields are prefilled from the applicant's own address as soon as it is on file — still fully editable, with a green border marking what was copied until it is edited by hand.
- Seed demo data with more register members (#51):
seed_demonow creates around 50 standalone register members with varied join dates, plus ready-made editor and senior-editor test accounts, so exports can be exercised against a realistic register.
🐛 Bug Fixes
- Seed a tax code for members acquired through an event (#54): Demo members created through an event booking now carry a tax code and address, matching what a real submission would produce.
- Fill in missing/wrong Italian admin translations (#57): Several admin strings — the import/export summary, the register import's overwrite-or-append choice, and the admin filter sidebar — were showing up untranslated or with a copy-pasted wrong translation. The project's own locale catalog now overrides them with the correct Italian text.
🛠️ Maintenance
- Updated Python dependencies and pre-commit hooks, and fixed the
justfile'supdate_allrecipe forprek's renamedauto-update→updatesubcommand. - Closed remaining branch-coverage gaps in
events/views.py, restoring the release's 100% coverage gate.
📖 Full Changelog
v2026.1.2
What's New in v2026.1.2
✨ Features
- Editor check-in toggle (#42): editors can now open check-in on an event straight from the event page, closing public bookings manually at the door instead of only through the admin.
- Check-in roster (#43): opening check-in turns the event page into a live, htmx-searchable roster where editors confirm or undo a booking with one tap. There is no online payment yet, so confirming always records the cash membership fee.
- Suggested cost field (#45): events can now record a suggested cost, editor-only for now — a first step toward showing it on the public booking page.
- Configurable booking cutoff (#46): associations choose how public bookings close — manually at check-in, automatically at midnight before the event (the new default), or at the event's start time. Editors always see the bookings list for an event, with check-in actions appearing only once bookings are closed.
- Bookings summary card (#48): the editor's event page gains a summary card — total bookings, confirmed count, and a breakdown by age bracket, configurable per association from the admin with no deploy needed. The card refreshes live via htmx whenever a booking is confirmed or undone.
🐛 Bug Fixes
- createsuperuser needs no approval (#49): a superuser created via
manage.py createsuperuseris now active and email-verified immediately, instead of being stuck behind the same email-verification and approval gate regular sign-ups go through.
🚨 Tests
- Flaky CI test stabilized (#41): cleared the cache before allauth signup/login/reset tests so rate-limit state no longer leaks across parallel test workers.
🛠️ Maintenance
- Seeded demo data now mirrors real bookings: mostly parent-and-child applications with a snapshot birth date, a realistic mix of confirmed and pending bookings, and default age brackets (#44, #48).
- Updated Python dependencies and vendored Alpine.js 3.16.3.
- Aligned the Dockerfile's bundled Tailwind CLI version with
django-tailwind-cli.
📖 Full Changelog
v2026.1.1
What's New in v2026.1.1
✨ Features
- Branded allauth account pages (#36): login, signup, password, and email screens now carry the association's name, logo, and colours instead of allauth's generic templates, plus a new "Account" hub reachable from the home navbar for managing email and password.
- Sign-up approval gate (#37): new accounts, whether from email/password or Google, stay inactive until a superadmin approves them from the Django admin. Superadmins get an email when someone signs up; the new user gets one when they're approved.
- Toast notifications (#38): Django messages now surface as auto-dismissing toasts instead of waiting for the next page load.
- HTML allauth emails (#39): allauth's own transactional emails (confirmation, password reset/changed, email changed/removed, and the enumeration-safe "no account found" / "account already exists" mails) now ship a styled HTML alternative alongside the plain text.
🐛 Bug Fixes
- Mobile layout of the open-dates card (#40): on small screens the card now stacks image/title, date, and a full-width Book button instead of cramming them onto one row; the Book badge also switched from a plain white/dark-border outline to the association's primary colour.
🛠️ Maintenance
- Excluded allauth's
account/email/templates from the djlint inline-style check, matching the existing exemption for mail templates (for #40). - Documented that
just checkneeds a.envin step with.env.example, and that a bare$in.envgets expanded byjust(#34). - Added the GitHub and housekeeping
justrecipes the release workflow expects (#35).
🚨 Tests
- Covered approval-flow edge cases (missing user, no active superusers, already-inactive user) and the account hub view, closing a coverage gap left after #37 (for #37).
📖 Full Changelog
v2026.1
What's New in v2026.1
First release of OpenSeat: a self-hosted booking manager for non-profit
associations, covering the whole path from a public membership application to the
booking list that reaches the association the night before an event.
✨ Features
Membership intake
- Public application form: a six-step wizard that collects the applicant, the
statute and fee acceptance, the privacy notice and the image consents, ending in
a signed application sent to the board. - Applications on behalf of others: apply for oneself, for a minor child, or
for a person under guardianship, with the parental declaration recorded when it
applies. - Resumable drafts: answers are saved as they are given, a link brings the
applicant back, and a reminder goes out before a draft expires.
Events and bookings
- Member register and event bookings: the register with CSV export, and
bookings tied to the events that produced them. - Booking an event is applying to join (#15): the statute makes attendance a
members-only matter, so booking opens the application form, tied to the event
with a foreign key. - Confirm by mail, cancel from the same link: the booking is confirmed by mail
and can be called off from the link it arrived on; one mail for one act. - A booking stays a booking until confirmed into a member: the board decides
when an application becomes a register entry. - Recover a booking with the address alone: enter the address used to book and
a link comes back by mail, without ever revealing whether that address booked. - Event pages that lead with Book: pictures on events, breadcrumbs home, and
past events dropped from the home page.
Public site
- Home page carrying the association's own content and its open dates.
- Two-column footer signed with vendor and version.
Administration
- The admin themed from the association row: name, logo and palette come from
the database and reach every page, the login included. - Editor role: staff access limited to events, for whoever runs the calendar
without touching the register.
Operations
- Media on a volume, backups to object storage: nightly dump of database and
media, retention purge, and removal of media nothing references.
🐛 Bug Fixes
- Production settings behind Coolify: the app now boots correctly behind the
reverse proxy. pg_dumpinstalled: the nightly backup was failing silently while the media
backup kept succeeding.- Tailwind binary bundled: the container no longer downloads ~120 MB on first
boot, which was risking a health check timeout. - Migrated the association Meta options the migration state had drifted from.
.envcomments kept off the value line.
🛠️ Maintenance
- CI compiles the translation catalogs (#31):
.mofiles are gitignored, so
the runner only ever had the.posources and every test asserting an Italian
string saw English. Seven tests had been failing on every push. - Deploy gated on the suite (#32): a green run on
maincalls Coolify's deploy
webhook, instead of Coolify building whatever lands on the branch. - Flaky booking-link test fixed (#33): it compared a timestamped signed token
against one regenerated at assert time, and failed whenever the clock ticked
over a second between the two.
📦 Dependencies
- Alpine.js 3.15.12 → 3.16.2
- ruff 0.16.2 → 0.16.4, pytest-django 4.13.0 → 4.14.0, time-machine 3.3.1 → 3.4.0,
sqlparse 0.5.5 → 0.6.0, and the pre-commit hooks alongside them