Skip to content

v1.12.4#769

Merged
ajslater merged 299 commits into
mainfrom
develop
May 15, 2026
Merged

v1.12.4#769
ajslater merged 299 commits into
mainfrom
develop

Conversation

@ajslater
Copy link
Copy Markdown
Owner

  • Fixes
    • Crash on Cleanup Favorites Janitor Job.
  • Features
    • Force Update Tags by individual group.

ajslater added 30 commits April 6, 2026 12:54
* bump news

* cirlcle ci no longer handles pre-release

* remove alpha scripts for circleci"

* fix lint-ci

* fix pre-relase gha

* fix default last route on start pages

* bump version

* fix default params

* alpha2
* bump news

* ignore ruff qa for debug build

* ignore shellcheck"

* lint

* minor refactors of opds v2 feed
ajslater and others added 29 commits May 10, 2026 16:00
A fresh browser visit to Codex probes /api/v3/auth/profile/ before any
session cookie exists, which Django's BaseHandler.get_response logs as
a WARNING ("Forbidden: /api/v3/auth/profile/") for every first-time
visitor. That drowns the main log in routine noise.

Add a logging.Filter on django.request that downgrades records matching
that exact "Forbidden: <path>" pattern to DEBUG, parameterized by a
small frozenset of known-noisy paths so abuse on other endpoints still
surfaces at WARNING.

Also move django.request into the loggers dict where dictConfig will
actually see it — the old top-level placement was silently ignored.
Records still flow to the root loguru handler via propagation.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add not_failed_login_filter and attach it to the stdout / codex.log
sinks so the IP-bearing line is written only to failed_logins.log.
Django's own request logger still emits a bare WARNING for each
failed attempt ("Unauthorized: /api/v3/auth/login/" etc.) so the
failure remains visible in codex.log without exposing the client IP.

Concentrating IP + username in one file makes the privacy story
easier to reason about: one file to chmod, forward to a SIEM, or
retain on its own schedule.

The inverse filter is only attached when the feature is enabled —
when disabled, no records carry the tag and the filter would be a
no-op anyway.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…n groups (#762)

The browser table-view PR (#745) routed group-row scalar / M2M sort
through ``scalar_intersection_sort_expr`` / ``m2m_intersection_sort_expr``
for every view mode. Intersection returns NULL when a group's children
disagree on the sorted field, which is correct for table view (sort
matches the intersection cell display) but blanks the order_value
caption beneath cover-mode cards for any group with mixed children.
The user reported this for Publish Date across publishers, series,
and folders.

Gate the intersection branch on ``view_mode == "table"`` so cover
mode falls back to the pre-table-view aggregate (Min/Max/Avg/Sum)
for scalars and ``sort_name`` for M2M.

Regression test reproduces the user's scenario: a "Mixed" series
with children at year=2018 and year=2024 returned orderValue=null
before; now returns "2018" (Min aggregate).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Three coupled issues prevented browsing the dev server from a second
machine on the LAN.

bin/dev-server.sh
- Drop ``export VITE_HOST=localhost`` default. It overrode Django's
  ``_vite_dev_server_host()`` auto-derivation, so even with mDNS
  resolution working, django-vite rendered ``<script
  src="http://localhost:5173/...">`` and LAN browsers tried to load
  the bundle from their own loopback.

frontend/vite.config.js
- ``server.cors.origin``: Vite 6+ defaults to a regex matching only
  ``localhost`` / loopback origins. Cross-origin fetches from the
  Django dev server (``http://<host>:9810``) to the Vite dev server
  (``http://<host>:5173``) returned ``Vary: Origin`` without
  ``Access-Control-Allow-Origin`` and the browser blocked the
  scripts. Mirror ``allowedHosts`` into a port-agnostic CORS regex.
- ``server.hmr.host``: with ``server.host: true``, Vite bakes
  ``localhost`` into the HMR client's ``directSocketHost`` /
  ``socketHost`` strings. LAN browsers then opened the HMR
  WebSocket against their own loopback and got
  ERR_CONNECTION_REFUSED. Set ``hmr.host`` to the same
  ``VITE_HOST`` / mDNS-mangled hostname Django uses for the
  ``<script src>`` so the embedded URL agrees with where the page
  actually loaded the module from.
- Include the resolved host in ``allowedHosts`` so an explicit
  ``VITE_HOST=...`` override (not matching ``os.hostname()``) is
  also trusted by Vite's host-header check and the new CORS regex.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Each MetadataText value rendered with `overflow-y: scroll`, which forces
a scrollbar even when no max-height is set. Chromium-based Edge on
Windows draws classic scrollbar arrow buttons on every forced scrollbar,
producing visible up/down chevrons next to single-line values like the
publisher, bookmark progress, and date. Other Chromium browsers don't
draw the arrows, so this only manifested on Edge.

Switch to `overflow-y: auto` so the scrollbar only appears for the two
fields that actually need it (Summary and Review, which have
`max-height: 100`). The `isOverflow` measurement still works since it
compares `clientHeight` to `scrollHeight`, which is identical under
`auto`.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Override v-window's default touch handlers in the horizontal pager so
left/right swipes route through ``routeToDirection`` instead of trying
to flip between the (disabled) v-window items. Mirrors the keyboard
arrow behavior, so RTL handling is automatic via ``normalizeDirection``.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ty (#768)

JanitorCleanupFavoritesTask was wired into janitor dispatch, nightly
queueing, and the admin task map, but missing from _SCRIBE_TASK_PRIORITY.
When the task hit the scribe queue, tuple.index() raised ValueError, the
put silently failed, and "Cleanup Orphans Favorites" stayed pending
forever.

Add it to the priority tuple and align Bookmarks/Settings ordering with
_NIGHTLY_TASK_CLASSES so the two tuples stay in sync.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ajslater ajslater merged commit ac3423e into main May 15, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant