Conversation
ajslater
commented
May 25, 2026
Owner
- Fixes
- Fix folder custom covers.
- Fix AUTH_REMOTE_USER for api endpoints.
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.