Introduces per-page markets (Phase 2):
- MarketPlace model with soft-delete and unique slug index
- NavTop gains market_id FK to scope nav hierarchy per market
- Migration with backfill creates default 'suma-market' for existing market page
- market_url_for() cross-app URL helper
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PostgreSQL json type doesn't support equality operators needed by
DISTINCT. Use EXISTS subquery instead and cast to jsonb.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce page_configs table for per-page feature flags (calendar, market)
and future SumUp credentials. Add page_config relationship to Post model.
Remove duplicate CartItem definition from cart_item.py (canonical stays in market.py).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
has_access('settings.home') checks for a coop-only endpoint that doesn't
exist in market/cart/events services. Replace with g.rights.admin which
is set by the shared user_loader across all services.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Calendar blueprints moved to standalone events service — blog app no
longer registers these routes. Replace all url_for/has_access references
from blog.post.calendars.X to calendars.X across 38 shared calendar
templates. Also replace blog.post.post_detail cross-links with coop_url()
for cross-service navigation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
HTMX blocks cross-origin hx-get requests, causing
htmx:invalidPath. Calendar links to events service must
be regular <a> tags without hx-get.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Calendar routes no longer exist in blog service. Post nav,
entry items, blog cards, and header templates now link to
events service via events_url() helper.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Calendar routes moved to events service, so blog can no
longer use url_for('blog.post.calendars...').
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Calendar templates extend post/index.html but don't provide a
post context variable. Wrap post-specific meta in an if guard
so pages without post still get basic meta from meta_base.html.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>