v0.12.1 version update + itinerary validation fixes (#1158)

* fix(itinerary): suppress false-positive UniqueTogetherValidator in CollectionItineraryItemSerializer (#1157)

DRF 3.15 inspects `UniqueConstraint` entries from `Model._meta.constraints`
and auto-generates `UniqueTogetherValidator` objects for them, but strips
each constraint's `condition` argument in the process.

The `CollectionItineraryItem` model has two conditional constraints:
- `unique_order_per_collection_day`: unique `(collection, date, order)`
  only when `is_global=False AND date IS NOT NULL`
- `unique_order_per_collection_global`: unique `(collection, order)`
  only when `is_global=True`

Without their conditions, DRF turns the second constraint into a validator
that checks `(collection, order)` across *all* rows regardless of type.
This means adding any dated itinerary item (transportation, lodging, etc.)
with `order=0` is rejected with 400 whenever a trip-wide (global) item
already holds `order=0` for the same collection — which is almost always,
since global items start at order 0.

Fix: set `validators = []` on the serializer Meta to suppress the
incorrectly-stripped validators. The view already adjusts `order` to avoid
real conflicts within each group, and the DB-level constraints continue
to enforce conditional uniqueness correctly.

This actually fixes #1153 for me

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore(release): update version to v0.12.1 in settings, documentation, Dockerfile, and config

* fix(config): update appVersion to remove suffix and align with release v0.12.1

* docs(changelog): update v0.12.1 release notes with new features and improvements

---------

Co-authored-by: Maxim Burgerhout <maxim@wzzrd.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Sean Morley
2026-05-25 12:58:42 -04:00
committed by GitHub
parent eaa66d08fa
commit 42785f1925
6 changed files with 76 additions and 6 deletions

View File

@@ -1071,6 +1071,11 @@ class CollectionItineraryItemSerializer(CustomModelSerializer):
model = CollectionItineraryItem
fields = ['id', 'collection', 'content_type', 'object_id', 'item', 'date', 'is_global', 'order', 'start_datetime', 'end_datetime', 'created_at', 'object_name']
read_only_fields = ['id', 'created_at', 'start_datetime', 'end_datetime', 'item', 'object_name']
# DRF 3.15 generates UniqueTogetherValidator from UniqueConstraints without applying
# their conditions, causing false 400s (e.g. a dated item with order=0 is rejected
# when a global item with the same order exists). The view and DB constraints
# already enforce the correct conditional uniqueness.
validators = []
def validate(self, attrs):
data = super().validate(attrs)

View File

@@ -392,7 +392,7 @@ PUBLIC_URL = getenv('PUBLIC_URL', 'http://localhost:8000')
# ADVENTURELOG_CDN_URL = getenv('ADVENTURELOG_CDN_URL', 'https://cdn.adventurelog.app')
# Major release version of AdventureLog, not including the patch version date.
ADVENTURELOG_RELEASE_VERSION = 'v0.12.0'
ADVENTURELOG_RELEASE_VERSION = 'v0.12.1'
# https://github.com/dr5hn/countries-states-cities-database/tags
COUNTRY_REGION_JSON_VERSION = 'v3.1'

View File

@@ -53,7 +53,7 @@ export default defineConfig({
priceCurrency: "USD",
description: "Open-source version available for self-hosting.",
},
softwareVersion: "v0.12.0",
softwareVersion: "v0.12.1",
license:
"https://github.com/seanmorley15/adventurelog/blob/main/LICENSE",
screenshot:
@@ -281,6 +281,10 @@ export default defineConfig({
text: "Development Timeline",
link: "/docs/changelogs/development_timeline",
},
{
text: "v0.12.1",
link: "/docs/changelogs/v0-12-1",
},
{
text: "v0.12.0",
link: "/docs/changelogs/v0-12-0",

View File

@@ -0,0 +1,61 @@
# AdventureLog v0.12.1
Released 5-26-2026
Hi everyone!
Im excited to announce AdventureLog v0.12.1, an incremental release that improves the day-to-day experience of logging, managing, and visualizing your travels. While this update is smaller than v0.12.0, it brings meaningful quality-of-life upgrades, better reliability, and fixes bugs associated with the v0.12.0 feature update.
## ⚡ New Quick-Add Workflow
- Added the location and lodging quick-add feature to make logging places faster and more convenient. (#687)
- Quick-add pulls from Google Maps so the integration is required for it to be available on your instance
## 🗺️ Collection Map Fixes
- Fixed a bug where collection maps displayed no markers or pins even when the underlying data was correct (#1100)
## ✨ Miscellaneous
- New light and dark themes that better reflect AdventureLog
- Ability to set default basemap for the map views in the user settings page
- This is now reflected across all maps in the application
- Added OpenFreeMap Liberty as a basemap option
- Opening a location in an external map provider now searches and displays the location properly
- Enhanced API key management interface for a clearer and more usable experience
- Improved API hashing algorithm for higher security
- Various UI and workflow refinements across the app
- General stability and usability improvements
- Make it so only collection owners can edit collection details
## 🙌 Thanks to the Community
This release was shaped by an incredible amount of feedback, ideas, testing, and code contributions from the community. Thank you to everyone who opened issues, reviewed changes, tested builds, and helped refine this update.
### 💻 Code Contributors
- @HangoverHGV
- @citrusjunoss
- @lesensei
- @vorbeiei
- @mllopart
- @stephanzwicknagl
- @orhunavcu
- @bittin
- @totoroot
- @cyphra
- @Pexilo
## 💖 Support the Project
If AdventureLog helps you plan, remember, or relive your travels, consider supporting the project:
👉 https://seanmorley.com/sponsor
📖 Full Changelog:
https://github.com/seanmorley15/AdventureLog/compare/v0.12.0...v0.12.1
Happy travels!
Sean Morley (@seanmorley15)
Founder & Project Lead

View File

@@ -23,11 +23,11 @@ FROM gcr.io/distroless/nodejs22-debian12:nonroot@sha256:13593b7570658e8477de39e2
# Metadata labels for the AdventureLog image
LABEL maintainer="Sean Morley" \
version="v0.12.0" \
version="v0.12.1" \
description="AdventureLog - the ultimate self-hosted travel companion." \
org.opencontainers.image.title="AdventureLog" \
org.opencontainers.image.description="AdventureLog is a self-hosted travel companion that helps you plan, track, and share your adventures." \
org.opencontainers.image.version="v0.12.0" \
org.opencontainers.image.version="v0.12.1" \
org.opencontainers.image.authors="Sean Morley" \
org.opencontainers.image.url="https://raw.githubusercontent.com/seanmorley15/AdventureLog/refs/heads/main/brand/banner.png" \
org.opencontainers.image.source="https://github.com/seanmorley15/AdventureLog" \

View File

@@ -1,4 +1,4 @@
export let appVersion = 'v0.12.1-beta-052126';
export let versionChangelog = 'https://github.com/seanmorley15/AdventureLog/releases/tag/v0.12.0';
export let appVersion = 'v0.12.1';
export let versionChangelog = 'https://github.com/seanmorley15/AdventureLog/releases/tag/v0.12.1';
export let appTitle = 'AdventureLog';
export let copyrightYear = '2023-2026';