Commit Graph

120 Commits

Author SHA1 Message Date
ed878bbdae Merge pull request 'feat(comments): v2 — HTMX, Turnstile, reactions, design refresh' (#44) from feature/comments-v2 into main
Some checks failed
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / deploy (push) Has been skipped
CI / nightly-e2e (push) Failing after 1m47s
Reviewed-on: #44
Reviewed-by: codex_a <codex_a@linteldigital.com>
2026-03-04 00:04:42 +00:00
Mark
0eddb9696a fix: validate parent_id in error path, rebuild Tailwind CSS
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Successful in 1m29s
CI / pr-e2e (pull_request) Successful in 1m44s
- Defensively parse parent_id in _render_htmx_error: coerce to int,
  fallback to main form if non-numeric or parent not found
- Rebuild Tailwind CSS to include new utility classes from templates
- Add test for tampered parent_id falling back to main form

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-04 00:00:23 +00:00
Mark
c01fc14258 fix: resolve review round 2, E2E failures, and mypy error
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m30s
CI / ci (pull_request) Failing after 1m48s
Review blocker A — form error swap and false success:
- Change HTMX contract so forms target their own container (outerHTML)
  instead of appending to #comments-list
- Use OOB swaps to append approved comments to the correct target
- Add success/error message display inside form templates
- Remove hx-on::after-request handlers (no longer needed)

Review blocker B — reply rendering shape:
- Create _reply.html partial with compact reply markup
- Approved replies via HTMX now use compact template + OOB swap
  into parent's .replies-container
- Reply form errors render inside reply form container

E2E test fixes:
- Update 4 failing tests to wait for inline HTMX messages instead
  of redirect-based URL assertions
- Add aria-label='Comment form errors' to form error display
- Rename test_reply_submission_redirects to
  test_reply_submission_shows_moderation_message

Mypy internal error workaround:
- Add mypy override for apps.comments.views (django-stubs triggers
  internal error on ORM annotate() chain with mypy 1.11.2)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 23:47:12 +00:00
Mark
88ce59aecc fix: resolve 5 PR review blockers for comments v2
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Failing after 2m7s
CI / ci (pull_request) Failing after 2m43s
1. Reply HTMX target: server sends HX-Retarget/HX-Reswap headers to
   insert replies inside parent comment's .replies-container div
2. Empty thread swap target: always render #comments-list container
   even when no approved comments exist
3. Reaction hydration: add _annotate_reaction_counts() helper that
   hydrates reaction_counts and user_reacted on comments in
   get_context(), comment_poll(), and single-comment responses
4. HTMX error swap: return 200 instead of 422 for form errors since
   HTMX 2 doesn't swap 4xx responses by default
5. Vary header: use patch_vary_headers() instead of direct assignment
   to avoid overwriting existing Vary directives

Also fixes _get_session_key() to handle missing session attribute
(e.g. from RequestFactory in performance tests).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 23:24:20 +00:00
Mark
a118df487d fix(comments): resolve ruff lint errors
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Failing after 1m39s
CI / pr-e2e (pull_request) Failing after 2m4s
Remove unused imports (urlencode, F) and fix import sort order in
test_v2.py.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 22:56:38 +00:00
Mark
d0a550fee6 feat(comments): v2 — HTMX, Turnstile, reactions, design refresh
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Failing after 37s
CI / pr-e2e (pull_request) Failing after 2m58s
- Extract comment templates into reusable partials (_comment.html,
  _comment_form.html, _comment_list.html, _reply_form.html, etc.)
- Add HTMX progressive enhancement: inline form submission with
  partial responses, delta polling for live updates, form reset on
  success, success/moderation toast feedback
- Integrate Cloudflare Turnstile for invisible bot protection:
  server-side token validation with hostname check, fail-closed on
  errors/timeouts, feature-flagged via TURNSTILE_SECRET_KEY env var
- Auto-approve comments that pass Turnstile; keep manual approval
  as fallback when Turnstile is disabled (model default stays False)
- Add CommentReaction model with UniqueConstraint for session-based
  anonymous reactions (heart/thumbs-up), toggle support, separate
  rate-limit bucket (20/min)
- Add comment poll endpoint (GET /comments/poll/<id>/?after_id=N)
  for HTMX delta polling without duplicates
- Update CSP middleware to allow challenges.cloudflare.com in
  script-src, connect-src, and frame-src
- Self-host htmx.min.js (v2.0.4) to minimize CSP surface area
- Add django-htmx middleware and requests to dependencies
- Add Unapprove bulk action to Wagtail admin for moderation
- Extend PII purge command to anonymize reaction session_key
- Design refresh: neon glow avatars, solid hover shadows, gradient
  section header, cyan reply borders, grid-pattern empty state,
  neon-pink focus glow on form inputs
- Add turnstile_site_key to template context via context processor
- 18 new tests covering HTMX contracts, Turnstile success/failure/
  timeout/hostname-mismatch, polling deltas, reaction toggle/dedup/
  rate-limit, CSP headers, and PII purge extension

Closes #43

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 22:52:59 +00:00
cc25d2ad2e Merge pull request 'feat: implement article search with PostgreSQL full-text search' (#42) from feature/article-search into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 26s
Reviewed-on: #42
Reviewed-by: codex_a <codex_a@linteldigital.com>
2026-03-03 21:58:07 +00:00
Mark
99b06d1f3b chore: rebuild Tailwind CSS for search template classes
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Successful in 1m21s
CI / pr-e2e (pull_request) Successful in 1m34s
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 21:30:26 +00:00
Mark
906206d4cd feat: implement article search with PostgreSQL full-text search
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Failing after 1m21s
CI / pr-e2e (pull_request) Successful in 1m33s
- Configure Wagtail database search backend with English search config
- Add django.contrib.postgres to INSTALLED_APPS for full PG FTS support
- Expand ArticlePage.search_fields: body_text (excl. code blocks),
  AutocompleteField(title), RelatedFields(tags), FilterFields
- Add search view at /search/?q= with query guards (strip, max 200 chars,
  empty/whitespace handling) and pagination preserving query param
- Replace nav Subscribe CTA with compact search box (desktop + mobile)
- Add search box to article index page alongside category/tag filters
- Create search results template reusing article_card component
- Add update_index to deploy entrypoint for automated reindexing
- Update existing tests for nav change, add comprehensive search tests

Closes #41

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 21:25:11 +00:00
eebd5c9978 Merge pull request 'feat: improve Wagtail admin editor experience for articles' (#40) from feature/improve-editor-experience into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 25s
Reviewed-on: #40
Reviewed-by: codex_a <codex_a@linteldigital.com>
2026-03-03 20:46:30 +00:00
Mark
2acb194d40 Add E2E_MODE=1 to CI E2E containers for admin user seeding
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Successful in 1m19s
CI / pr-e2e (pull_request) Successful in 1m33s
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 20:42:33 +00:00
Mark
b897447296 Address PR review feedback
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Successful in 1m19s
CI / pr-e2e (pull_request) Failing after 2m13s
- Gate e2e-admin superuser behind E2E_MODE env var (security)
- Add status and tag filters to ArticleFilterSet
- Set default_ordering to -published_date on listing viewset
- Add summary to ArticlePage.search_fields for search support
- Add 4 new tests for filters, ordering, and search fields

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 20:37:58 +00:00
Mark
d387bf4f03 Rebuild Tailwind CSS for new dashboard panel template
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m30s
CI / ci (pull_request) Successful in 1m31s
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 20:04:02 +00:00
Mark
be8d6d4a12 fix: resolve ruff/mypy lint errors and fix E2E test failures
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Failing after 1m19s
CI / pr-e2e (pull_request) Successful in 1m31s
- Use datetime.timedelta instead of timezone.timedelta (mypy)
- Fix import ordering (ruff I001)
- Fix admin sidebar E2E selector: use #wagtail-sidebar (Wagtail 7)
- Set deterministic published_date on seeded E2E articles for stable ordering
- Fix nightly test strict-mode violation: exact=True for Comments heading

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 14:24:01 +00:00
Mark
2b1e7ff4eb fix: resolve ruff lint errors (unused imports, import sorting)
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Failing after 28s
CI / pr-e2e (pull_request) Failing after 1m37s
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 14:10:10 +00:00
Mark
2c94040221 feat: improve Wagtail admin editor experience for articles
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Failing after 9s
CI / pr-e2e (pull_request) Failing after 1m38s
- Add published_date field to ArticlePage with auto-populate from
  first_published_at on first publish, plus data migration backfill
- Surface go_live_at/expire_at scheduling fields in editor panels
- Reorganise ArticlePage editor with TabbedInterface (Content,
  Metadata, Publishing, SEO tabs)
- Add Articles PageListingViewSet to admin menu with custom columns
  (author, category, published date, status) and category/author filters
- Add Articles summary dashboard panel showing drafts, scheduled,
  and recently published articles
- Update all front-end queries and RSS feeds to use published_date
- Add 10 unit tests and 4 E2E tests for new admin features

Closes #39

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 14:07:27 +00:00
2d93555c60 Merge pull request 'Fix Comments admin 500 on snippet index' (#38) from fix/comments-admin-500-issue-37 into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 25s
Reviewed-on: #38
Reviewed-by: codex_a <codex_a@linteldigital.com>
2026-03-03 13:31:40 +00:00
Mark
73b023dca2 Fix comments snippet admin 500
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Successful in 1m15s
CI / pr-e2e (pull_request) Successful in 1m36s
Use an explicit Wagtail Column for pending_in_article in CommentViewSet list_display and add a regression test for /cms/snippets/comments/comment/.

Fixes #37

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 13:21:01 +00:00
6555fdc41e Merge pull request 'Implement category taxonomy and navigation (Issue #35)' (#36) from feature/category-navigation-system into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 25s
Reviewed-on: #36
Reviewed-by: codex_a <codex_a@linteldigital.com>
2026-03-03 13:03:26 +00:00
Mark
e8b835e6fc Make Playwright cache runner-agnostic
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m17s
CI / ci (pull_request) Successful in 1m22s
Replace hardcoded /opt/playwright-tools mount with a persistent Docker volume cache and install Chromium into that cache before E2E jobs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 12:56:37 +00:00
Mark
04a55844fd Fix empty-category nav and route behavior
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Successful in 1m17s
CI / pr-e2e (pull_request) Failing after 44s
Use category-state-driven queries for nav and category listing routes, and add regression tests for empty but valid categories.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 12:39:47 +00:00
Mark
f7ca4bc44b Fix mypy relation resolution in CI
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m16s
CI / ci (pull_request) Successful in 1m23s
Disable reverse manager generation on ArticlePage.category and switch category selection to id-based queries so CI mypy can resolve models reliably.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 11:37:20 +00:00
Mark
7669a5049c Fix lint and E2E filter regression
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Failing after 19s
CI / pr-e2e (pull_request) Failing after 44s
Wrap long lines for Ruff and restore a single 'All' tag-reset link to avoid Playwright strict-mode collisions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 11:29:21 +00:00
Mark
e2f71a801c Add category taxonomy and navigation integration
Some checks failed
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / ci (pull_request) Failing after 14s
CI / pr-e2e (pull_request) Failing after 1m19s
Implements Issue #35 with category snippets, article category routing, category-aware templates, and category RSS feeds with tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-03 11:20:07 +00:00
49baf6a37d Merge pull request 'fix: align templates with wireframe styling' (#34) from fix/wireframe-styling-audit into main
Some checks failed
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / deploy (push) Has been skipped
CI / nightly-e2e (push) Failing after 44s
Reviewed-on: #34
2026-03-02 23:21:56 +00:00
Mark
d65a802afb fix: align templates with wireframe styling
All checks were successful
CI / deploy (pull_request) Has been skipped
CI / nightly-e2e (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m14s
CI / ci (pull_request) Successful in 1m20s
- Fix article header tag borders: replace broken border-current/20
  (Tailwind can't apply opacity to currentColor) with per-tag border
  colour classes via new get_tag_border_css filter
- Add calendar icon before article date in article header
- Add clock icon before read time in article header and home featured
- Match article card footer to wireframe (remove extra min-read span)
- Add rounded-md to code block matching wireframe

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 20:07:40 +00:00
6342133851 Merge pull request 'feat: replace hardcoded navigation with CMS-managed models' (#33) from feature/navigation-overhaul into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 25s
Reviewed-on: #33
Reviewed-by: codex_b <codex_b@linteldigital.com>
2026-03-02 19:52:00 +00:00
Mark
d3687779a2 fix: address review feedback — URLField→CharField, safe reverse migration
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m14s
CI / ci (pull_request) Successful in 1m20s
- Change SocialMediaLink.url and NavigationMenuItem.link_url from
  URLField to CharField(max_length=500) to support internal paths
  like /feed/ that fail URLField validation
- Replace destructive reverse_seed (deleted ALL rows) with
  RunPython.noop to prevent data loss on rollback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 19:36:27 +00:00
Mark
1c5ba6cf90 feat: replace hardcoded navigation with CMS-managed models
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m15s
CI / ci (pull_request) Successful in 1m20s
Replace static nav/footer links with Wagtail-managed NavigationMenuItem
and SocialMediaLink orderables on SiteSettings. Unpublished pages are
automatically excluded from rendering, fixing the dead-link problem.

- Extend SiteSettings with site_name, tagline, footer_description,
  copyright_text branding fields
- Add NavigationMenuItem orderable (link_page/link_url, show_in_header,
  show_in_footer, sort_order) with automatic live-page filtering
- Add SocialMediaLink orderable with platform icon templates
- New template tags: get_nav_items, get_social_links
- Update nav.html and footer.html to render from CMS data
- Data migration seeds existing hardcoded values for zero-change deploy
- Update seed_e2e_content command for test/dev environments
- 18 new tests covering models, template tags, and rendered output

Closes #32

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 19:07:35 +00:00
22d596d666 Merge pull request 'ci: re-trigger deploy after fixing PROD_SSH_HOST secret' (#31) from ci/retrigger-deploy into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 25s
Reviewed-on: #31
2026-03-02 18:25:17 +00:00
Mark
987f308e06 ci: re-trigger deploy after fixing PROD_SSH_HOST secret
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m10s
CI / ci (pull_request) Successful in 1m14s
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 18:22:50 +00:00
bcc9305a00 Merge pull request 'feat: add SVG favicon matching header logo' (#30) from fix/favicon into main
Some checks failed
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Failing after 32s
Reviewed-on: #30
2026-03-02 18:15:30 +00:00
Mark
62ff7f5792 feat: add SVG favicon matching header logo
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m13s
CI / ci (pull_request) Successful in 1m15s
Create a static SVG favicon replicating the nav logo — a forward slash
on a dark (#09090b) square with the brand light (#fafafa) text colour.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 18:14:10 +00:00
ad271aa817 Merge pull request 'fix: match tag colours to wireframe neon style' (#29) from fix/tag-neon-colours into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 22s
Reviewed-on: #29
2026-03-02 17:13:04 +00:00
Mark
8a97b6e2a0 fix: match tag colours to wireframe neon style
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m11s
CI / ci (pull_request) Successful in 1m16s
Update TagMetadata CSS classes to use brand colours with translucent
backgrounds matching the wireframe design:
- cyan:    bg-brand-cyan/10 text-brand-cyan
- pink:    bg-brand-pink/10 text-brand-pink
- neutral: bg-zinc-800 text-white (dark: bg-zinc-100 text-black)

Previously used muted Tailwind defaults (bg-cyan-100/text-cyan-900)
which appeared as soft pastels instead of the intended neon look.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 17:10:38 +00:00
43e7068110 Merge pull request 'fix: include blog models in Tailwind content scan for tag colours' (#28) from fix/tag-colour-safelist into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 23s
Reviewed-on: #28
2026-03-02 16:29:55 +00:00
Mark
6bae864c1e fix: include blog models in Tailwind content scan for tag colours
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m11s
CI / ci (pull_request) Successful in 1m16s
Tag colour classes (bg-cyan-100, text-cyan-900, etc.) are generated
dynamically in TagMetadata.get_css_classes() in apps/blog/models.py.
Tailwind's content scanner only covered HTML templates, so these classes
were purged from the CSS build — rendering tags as white-on-white.

Add apps/blog/models.py to the Tailwind content array so the JIT
compiler detects and retains the dynamic colour classes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 16:28:06 +00:00
17d30a4073 Merge pull request 'fix: upgrade Pillow to 12.x for native AVIF support' (#27) from fix/pillow-avif-support into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 1m24s
Reviewed-on: #27
2026-03-02 16:15:54 +00:00
Mark
0818f71566 fix: upgrade Pillow to 12.x for native AVIF support
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m38s
CI / ci (pull_request) Successful in 2m9s
Pillow 11.0.x did not include native AVIF support — that was added in
11.1.0. The ~=11.0.0 pin restricted upgrades to 11.0.x, so the
libavif-dev system package installed in the Dockerfile was never used
(pip installs pre-compiled wheels that bundle their own libraries).

Bump to Pillow ~=12.1 which ships native AVIF encoding/decoding in its
PyPI wheels out of the box.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 16:10:26 +00:00
3799d76bed Merge pull request 'fix(docker): add libavif-dev for AVIF image upload support' (#26) from fix/avif-support into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 1m33s
Reviewed-on: #26
2026-03-02 16:00:17 +00:00
Mark
fbe8546b37 fix(docker): add libavif-dev for AVIF image upload support
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 2m53s
CI / ci (pull_request) Successful in 3m27s
Pillow 11 supports AVIF natively but requires libavif to be installed
at the system level. Without it, uploading AVIF images via Wagtail's
image chooser causes an unhandled 500 error.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 15:52:57 +00:00
a59d21cfcb Merge pull request 'fix(csp): skip restrictive CSP on Wagtail/Django admin paths' (#25) from fix/csp-wagtail-admin into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 23s
Reviewed-on: #25
2026-03-02 15:36:12 +00:00
Mark
43594777e0 fix(csp): skip restrictive CSP on Wagtail/Django admin paths
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m11s
CI / ci (pull_request) Successful in 1m22s
The SecurityHeadersMiddleware applied a strict style-src policy to all
responses, blocking inline styles that Wagtail admin relies on for
layout. Skip the custom CSP for /cms/ and /django-admin/ paths.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 15:34:09 +00:00
f7c89be05c Merge pull request 'fix(makefile): point DC at prod compose file' (#24) from fix/makefile-prod-compose into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 25s
Reviewed-on: #24
2026-03-02 15:03:15 +00:00
Mark
2e7949ac23 fix(makefile): point DC at prod compose file
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m11s
CI / ci (pull_request) Successful in 1m23s
The Makefile used bare 'docker compose' which picks up the dev
docker-compose.yml when run from the app directory on prod. Point
it at the absolute path to docker-compose.prod.yml instead.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-02 15:01:27 +00:00
f5c2f87820 Merge pull request 'feat: add Makefile for Docker and Django ops' (#23) from feat/makefile into main
Some checks failed
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / deploy (push) Has been skipped
CI / nightly-e2e (push) Failing after 54s
Reviewed-on: #23
2026-03-01 14:26:51 +00:00
codex_a
abbc3c3d1d feat: add Makefile for Docker and Django ops
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m13s
CI / ci (pull_request) Successful in 1m25s
Covers:
- Docker: build, up, run, down, restart, logs, ps, bash, psql
- Django: migrate, makemigrations, showmigrations, createsuperuser,
  collectstatic, shell, dbshell
- Tailwind: install, build, watch
- Testing: pytest unit and E2E targets
- Custom commands: seed, check-content, purge-comments

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-01 14:24:13 +00:00
c028a83bef Merge pull request 'fix: nav/footer wireframe alignment, honeypot CSP fix, comment E2E coverage' (#22) from fix/ui-cleanup into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 25s
Reviewed-on: #22
2026-03-01 12:35:20 +00:00
codex_a
155c8f7569 fix: nav/footer wireframe, honeypot CSP, explore topics, comment E2E coverage
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m11s
CI / ci (pull_request) Successful in 1m25s
- Replace nav inline newsletter form with Subscribe CTA link per wireframe
- Remove newsletter form from footer; add Connect section with social/RSS links
- Fix honeypot inputs using hidden attribute (inline style blocked by CSP)
- Add available_tags to HomePage.get_context for Explore Topics section
- Add data-comment-form attribute to main comment form for reliable locating
- Seed approved comment in E2E content for reply flow testing
- Expand test_comments.py: moderation message, not-immediately-visible,
  missing fields, reply form visible, reply submission
- Make COMMENT_RATE_LIMIT_PER_MINUTE configurable; set 100 in dev to prevent
  E2E test exhaustion; update rate limit unit test with override_settings
- Update newsletter/home E2E tests to reflect nav form removal
- Update unit test to assert no nav/footer newsletter forms

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-01 12:17:55 +00:00
d83f7db57c Merge pull request 'fix: migrate STATICFILES_STORAGE to STORAGES (Django 5.2)' (#21) from fix/storages-django52 into main
All checks were successful
CI / ci (push) Has been skipped
CI / pr-e2e (push) Has been skipped
CI / nightly-e2e (push) Has been skipped
CI / deploy (push) Successful in 25s
Reviewed-on: #21
2026-03-01 11:51:04 +00:00