Skip to content

v2.0.1#783

Merged
ajslater merged 358 commits into
mainfrom
develop
Jun 21, 2026
Merged

v2.0.1#783
ajslater merged 358 commits into
mainfrom
develop

Conversation

@ajslater

Copy link
Copy Markdown
Owner
  • Fixes
    • The Online Tagging Status table now shows which source matched each comic,
      even ones re-tagged from a stored id or matched by both sources.
    • Tidied the Online Tagging Status table: long filenames use the full Comic
      column width before truncating.
    • Re-tagging an already-identified comic now fetches its exact Metron or
      Comic Vine issue directly instead of running a full search.
    • Tagging no longer loses a comic's stored Metron or Comic Vine id when it
      also has a web link.
    • url_path_prefix works again when set without a leading slash. Remember
      to uncomment the [server] block header in codex.toml if you are setting
      server values, like `url_path_prefix``

ajslater added 30 commits April 13, 2026 15:24
    Fix clear settings null bug, add global settings clear button

    - clearComicSettings was setting book.settings to null, causing
      Object.entries() to throw TypeError downstream in getBookSettings
    - Add null guard in getBookSettings as defense-in-depth
    - Add null guard in isClearDisabled computed
    - Add clearGlobalSettings action and clear button to Default Settings panel
    - Compare against READER_DEFAULTS to determine if global clear is disabled
ajslater and others added 29 commits May 24, 2026 23:44
…vers

Vuetify 4's v-dialog defaults to location 'center center', which activates
the connected overlay location strategy. That strategy caps width with
parseFloat(props.maxWidth), so "20em" parses to 20 and the em is dropped,
collapsing dialogs to a ~20px sliver. Convert every em-based max-width/
min-width on a v-dialog (or forwarded via $attrs) to unitless px at 16px/em.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
The UNREAD filter used Q(bookmark=None), a multi-valued relationship
test for "comic has no bookmark from anyone" rather than "no bookmark
for me". Once any user finished a comic it dropped out of every other
user's (and anonymous visitors') unread view. UNREAD now negates the
per-user finished predicate (~(my_filter & finished=True)), compiling
to a per-user NOT-EXISTS subquery.

Also harden get_my_bookmark_filter: an anonymous visitor with no
established session_key resolved to `session_id IS NULL`, which matches
every authenticated user's bookmarks. Return a match-nothing filter
instead; a session key is minted only when a bookmark is written.

Adds tests/test_bookmark_filter_isolation.py covering cross-user and
anonymous isolation for READ/UNREAD/IN_PROGRESS.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Replace a stale `ty: ignore[no-matching-overload]` with an isinstance
guard so `settings` is a Mapping before `_copy_params_into`, clearing
the `invalid-argument-type` diagnostic from `make ty`.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Skipping super() left the class-level atomic from setUpTestData
uncommitted-but-unrolled-back, leaking the codex_init() "admin"
superuser into later test classes and causing UNIQUE constraint
failures (e.g. test_bookmark_filter_isolation) in full-suite runs.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Attribute the matched source for every matched comic and tidy the table
layout in the admin Online Tagging Status table.

- Source column was empty for re-tagged comics. They win via comicbox's
  stored-id fast path, which (until comicbox a556faa) emitted no AutoWritten
  event, so codex never learned the source. With merge_all_sources a comic
  can also be auto-written by both sources, so accumulate every winning
  source (deduped, order preserved) instead of last-event-wins:
  matched_source_by_path is now dict[Path, list[str]] and the snapshot row
  field becomes won_sources (a list).
- Render one success chip per matched source; em-dash when unattributed.
- Layout: the Comic column claims all slack (width 100% + the max-width:0
  cell trick) so the filename fills the space before truncating with an
  ellipsis (full path on hover); Status and Source shrink to fit their
  content, so Source is only as wide as the widest source cell present.

Requires comicbox emitting AutoWritten on the explicit-id and stored-id
fast-path wins (comicbox a556faa).

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Give every .0 release a short hyphen-delimited title and convert the
existing ### flavor-subtitles to the same format.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Granian assigns url_path_prefix verbatim to the ASGI root_path, which
Django strips from the request path with removeprefix(). A value like
"codex" (no leading slash) never matches the "/codex/..." request path,
so path_info keeps the prefix, ServeStatic 500s on every static file,
and STATIC_URL / email verification links come out malformed.

Normalize the prefix to the root_path / SCRIPT_NAME convention (one
leading slash, no trailing slash) at the single read site, so "codex",
"/codex/", etc. all resolve to "/codex".

Co-Authored-By: Claude Opus 4.8 <[email protected]>
A bulk online-tag scan handed every comic to comicbox's search path, so
a comic codex already holds a Metron/Comic Vine issue id for was
re-searched (resolving the series by name and listing issues per
candidate) instead of fetched directly by that id.

run_session now runs _prefetch_stored_ids first: build_stored_id_map
reads numeric issue ids straight from the Identifier table (so it works
even when the id never round-tripped into the file), each identified
comic is fetched by explicit id in one API call, written through the
same BulkTagWriteTask path, and dropped from the search set. Prefetched
comics stay in path_to_pk so the status table shows them matched and
Resume skips them; unresolved ids fall back to search. Skipped on dry
runs and for sources without credentials.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
@ajslater ajslater merged commit ceed495 into main Jun 21, 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