Skip to content

v1.12.7 - #778

Merged
ajslater merged 331 commits into
mainfrom
develop
May 25, 2026
Merged

ajslater merged 331 commits into
mainfrom
develop

Conversation

@ajslater

Copy link
Copy Markdown
Owner
  • Fixes
    • Fix folder custom covers.
    • Fix AUTH_REMOTE_USER for api endpoints.

ajslater and others added 29 commits May 20, 2026 13:15
compute_group_intersections issued Count(F("bookmark_updated_at")) against
Comic, but the column is a per-user-filtered Max(bookmark__updated_at)
aggregate — not a Comic field — so Django raised FieldError as soon as a
group page was rendered in table view with the Last Read column visible.

Drop the broken scalar-paths entry and extend
_annotate_bookmark_updated_at to attach the existing aggregate to group
querysets in table view; the cell display reads it via getattr. bmua_is_max
stays bound to the primary branch so the JsonGroupArray fallback keeps
covering Comic rows that didn't get the scalar.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add a small central registry in codex/librarian/fs/filters.py
(_IGNORED_BASENAMES + _IGNORED_BASENAME_PREFIXES) consulted by both
the poller's DiskSnapshot walker and the watchfiles filter via
is_ignored_basename / is_ignored_path. Seeded with the "." prefix so
hidden trees (.git, .DS_Store, .Trashes, .Spotlight-V100, …) are
pruned from every traversal; extending the registry to cover @eadir,
__MACOSX, Thumbs.db, desktop.ini, etc. is a one-line edit with no
walker or filter changes.

CodexWatchFilter now takes the watched library_paths so the check
can run relative to each library root — libraries whose own path is
hidden (/Users/aj/.archive/comics) still poll their contents. The
filter is also rebuilt per watch-loop iteration so a restart()
propagates path-set updates instead of freezing them at process
startup. expand_dir_added prunes ignored directories in place via
the os.walk dirnames idiom so freshly-added trees never enqueue
events from inside a hidden subtree.

Pre-existing rows imported before this filter existed remain in
the DB until cleaned by hand or by a future janitor pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Plain click still toggles a single card / row and sets it as the
anchor. Shift-click extends from the anchor to the target through
the page's displayed order, filling the range with selected = true
(not a toggle — matches Gmail / Finder / VS Code). The target
becomes the new anchor so successive shift-clicks chain naturally.

Anchor lives in the browser-select-many store (lastAnchorKey) and
invalidates implicitly: a findIndex == -1 on either endpoint
(post-paginate, post-sort, post-reload) falls back to a plain
toggle, so callers never need to clear the anchor on navigation.
clearSelection / deactivate also reset it.

A new private _visibleItems() helper is the single source of truth
for "displayed order" — rows in table mode, groups + books in
cover mode — and selectAll now uses it too. The range can span the
groups + books boundary naturally in cover mode.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
vite-plugin-dynamic-base 1.4.1 dropped the leading `/` it used to add
inside template-element replacements. The codex publicPath stripped
APP_PATH's leading slash with `.substring(1)` to avoid a double `/`
with the old behavior; under 1.4.1 the strip made chunk URLs
relative, so deep routes like /admin/libraries fetched chunks from
/admin/static/... and got HTML from the Django catch-all, breaking
the admin panel and any lazy-loaded route.

Bump version to 1.12.6 and add news entry.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
a709a74 added a "." prefix to _IGNORED_BASENAME_PREFIXES so the
poller's walker, the watchfiles filter, and expand_dir_added all
skip hidden files before any cover predicate runs. User-supplied
folder covers named .codex-cover.jpg / .png / .webp / ... are
dotfiles by name but legitimate covers, so the dotfile filter
swallowed them and broke custom folder covers from v1.12.5 on.

is_ignored_basename now exempts a basename when match_folder_cover
claims it. .DS_Store, .git, .Trashes, .codex-cover (no extension),
.codex-cover.txt etc. still get filtered.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
DRF's ``SessionAuthentication`` enforces CSRF on unsafe methods, which
rejects proxy-authenticated API clients that legitimately carry no CSRF
token. Add ``HttpRemoteUserAuthentication`` (subclass of DRF's stock
``RemoteUserAuthentication`` reading ``HTTP_REMOTE_USER`` instead of
``REMOTE_USER``) and conditionally prepend it to
``DEFAULT_AUTHENTICATION_CLASSES`` when ``CODEX_AUTH_REMOTE_USER`` is
enabled, so proxy-forwarded ``Remote-User`` API requests authenticate
through the existing ``RemoteUserBackend`` without hitting CSRF.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ajslater
ajslater merged commit 9c16363 into main May 25, 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