Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
299 commits
Select commit Hold shift + click to select a range
88ae04a
docker tag script better than the one in ci/
ajslater Apr 6, 2026
95d24ef
update deps
ajslater Apr 6, 2026
c8ffdd0
far saner param initialization for browsers and opds start pages
ajslater Apr 6, 2026
4ae504d
update dpes & bump alpha version
ajslater Apr 6, 2026
0fd9b1c
v1.10.5a0 (#551)
ajslater Apr 7, 2026
cba000e
regular version 1.10.5
ajslater Apr 7, 2026
9380888
Merge branch 'main' into develop
ajslater Apr 7, 2026
bb2dfa7
remove develop circleci builds
ajslater Apr 7, 2026
ff2d7d3
adjust variable name
ajslater Apr 7, 2026
20b82a2
bump version to 6 alpha 0
ajslater Apr 7, 2026
bcd4cf4
fix default params for feed_views in opds 2
ajslater Apr 7, 2026
f8d7192
debug logging for django crash
ajslater Apr 7, 2026
d45b1b1
v1.10.6a0 (#553)
ajslater Apr 7, 2026
1f034cd
regular v1.10.6 version
ajslater Apr 7, 2026
0d328cf
Merge branch 'develop' of github.com:ajslater/codex into develop
ajslater Apr 7, 2026
f9939f3
Merge branch 'main' into develop
ajslater Apr 7, 2026
5360e82
fix docker-tag-latest cscript
ajslater Apr 7, 2026
ec0eee2
ignore gh token file
ajslater Apr 7, 2026
837ed69
try to log more request errors
ajslater Apr 7, 2026
c7b3edf
reconfigure logging to hopefully be more verbose about request errors…
ajslater Apr 7, 2026
bb9aa03
update deps and bump to alpha version
ajslater Apr 7, 2026
63eb55f
bump news (#555)
ajslater Apr 7, 2026
68b5c44
v1.10.7
ajslater Apr 7, 2026
4e845b2
bump news
ajslater Apr 7, 2026
125b061
update devenv
ajslater Apr 7, 2026
1811aa3
update devevn and deps
ajslater Apr 7, 2026
d0203e6
fix pm script
ajslater Apr 7, 2026
6761799
move django-check to test category
ajslater Apr 7, 2026
ccc3b15
workflow build frontend and collect static for prodcution build. fix …
ajslater Apr 7, 2026
575f3ca
bump version and news 1.10.8
ajslater Apr 7, 2026
2a4be92
fix dev-module script
ajslater Apr 7, 2026
a9b9c54
fix news
ajslater Apr 7, 2026
c4f42eb
explain news
ajslater Apr 7, 2026
03edb5b
Merge branch 'main' into develop
ajslater Apr 7, 2026
4d07d2a
Merge branch 'main' into develop
ajslater Apr 8, 2026
499e853
fix opds clear search setting
ajslater Apr 8, 2026
1968845
fix clear search button
ajslater Apr 8, 2026
188c890
Merge branch 'main' into develop
ajslater Apr 8, 2026
382ea9b
use a registry cache instead of gha cache for the dist-builder
ajslater Apr 8, 2026
68926b9
gha use more env vars for image names. retain python dist for 2 days.
ajslater Apr 8, 2026
cab90ff
new quick deploy gha script. update deps & devenv.
ajslater Apr 9, 2026
9179cd1
silence watchfiles 5 second timeout debug message
ajslater Apr 9, 2026
299d24d
consolidate null values const
ajslater Apr 9, 2026
384d6f0
make scope private
ajslater Apr 9, 2026
929ac98
update devenv
ajslater Apr 10, 2026
3f23d63
update deps. migrate to unhead v3
ajslater Apr 10, 2026
ca2b99a
update deps
ajslater Apr 12, 2026
ac23fb6
fix creating reader global settings
ajslater Apr 12, 2026
b118359
fix caching
ajslater Apr 12, 2026
a9bab2a
rename codex build-dist to codex-ci
ajslater Apr 12, 2026
498a2d0
fix image name. make gha steps depend on each other more.
ajslater Apr 12, 2026
00307e2
fix gha syntax errors
ajslater Apr 12, 2026
0e62ca4
Merge branch 'main' into develop
ajslater Apr 12, 2026
1a0865a
names for gha steps
ajslater Apr 13, 2026
8d73870
use ghcr.io for python-debian base
ajslater Apr 13, 2026
ce3c806
update deps
ajslater Apr 13, 2026
aea24a4
format dockerfile
ajslater Apr 13, 2026
928084a
picopt treestamps
ajslater Apr 13, 2026
34325e8
fix custom covers not importing. v1.10.11
ajslater Apr 13, 2026
8364163
fix custom covers count in admin view
ajslater Apr 13, 2026
84a958e
bump news for custom cover count fix
ajslater Apr 13, 2026
d28662c
update deps
ajslater Apr 13, 2026
97daa11
Merge branch 'main' into develop
ajslater Apr 13, 2026
9abd4fd
codex identification in server tag and opds generator tag
ajslater Apr 14, 2026
67a823f
update deps
ajslater Apr 14, 2026
2791819
force no entries on opds start page
ajslater Apr 14, 2026
fe6ef60
common opds start page mixin. emtpy group objects on start page
ajslater Apr 14, 2026
68f1c65
update deps. typechecking.
ajslater Apr 15, 2026
c2a37bf
api change q to search
ajslater Apr 15, 2026
62baa9e
standardize search param as 'search' instead of 'q' or other variations
ajslater Apr 15, 2026
045293d
remove errant icecream
ajslater Apr 15, 2026
44a9d32
clear settings on backend
ajslater Apr 15, 2026
ceba72d
Squashed commit of the following:
ajslater Apr 15, 2026
ee330e1
simplify settings class hierarchy
ajslater Apr 15, 2026
8e57ae4
rename select-many store to browser-select-many
ajslater Apr 15, 2026
afd71d2
switch to bun. updated devenv
ajslater Apr 16, 2026
0eb4799
add a claude md
ajslater Apr 16, 2026
4bff1ee
use frozenattrdict to speed up configuration
ajslater Apr 16, 2026
49c508f
fix rename of browserSelectMany store
ajslater Apr 23, 2026
b297064
auth token help
ajslater Apr 23, 2026
505baf3
fix sort-ignores to make deterministic across shells with different l…
ajslater Apr 23, 2026
fabd716
fix crash on settings not being raw
ajslater Apr 20, 2026
74a506c
another gaurd for getMetadta()
ajslater Apr 22, 2026
c6ae79b
remove keys from unhead meta headers
ajslater Apr 20, 2026
2cf3e49
fix unhead description for admin tabs"
ajslater Apr 22, 2026
889b99d
fix overzealous lazy importer
ajslater Apr 21, 2026
b192b59
fix lazyImportEnabled variable in metadata-activator
ajslater Apr 21, 2026
31baf54
fix metadata activator from bad cherry pick
ajslater Apr 23, 2026
2a46944
fix errant quote
ajslater Apr 23, 2026
a7d0c86
fix typechecking
ajslater Apr 23, 2026
2ae90fc
update devenv & deps
ajslater Apr 23, 2026
49284b4
bump news
ajslater Apr 23, 2026
8a396f0
fix import bug linking folders
ajslater Apr 20, 2026
d6dcbe4
fix possible batching crashes. adjust import variables for throughput
ajslater Apr 20, 2026
b3ec926
batch comic updates
ajslater Apr 20, 2026
65f2b05
move INTERNAL_IPS setting to general django area
ajslater Apr 23, 2026
e0719d1
fix typechecking issue
ajslater Apr 23, 2026
8901560
update deps
ajslater Apr 23, 2026
0885048
bump version to v1.10.12
ajslater Apr 23, 2026
40ce697
fix redirect on OPDS alternate view with metadata
ajslater Apr 23, 2026
6d20994
minor change to browser empty page for better first time experience
ajslater Apr 23, 2026
77174e4
allow browsing to comics with any top group in opds
ajslater Apr 23, 2026
7dfd33b
bring project up to speed with bun and no package-lock.json
ajslater Apr 23, 2026
c0edcc7
Merge branch 'main' into develop
ajslater Apr 23, 2026
23c3ac2
fix browser paginator
ajslater Apr 24, 2026
d59ae4f
bump news for browser paginaor fix
ajslater Apr 24, 2026
8c23450
fix search combobox clearing
ajslater Apr 24, 2026
6bab5e8
uppercase book close button
ajslater Apr 27, 2026
17df41a
version v1.10.13. update deps
ajslater Apr 27, 2026
59f52ae
fix pdfs not displaying
ajslater Apr 27, 2026
731b59a
fix csp for pdfs
ajslater Apr 27, 2026
e511828
fix OPDS FK constraint failure when session row is missing (#607)
ajslater Apr 27, 2026
7264de8
extend session-key validation to bookmark + reader-settings paths (#608)
ajslater Apr 27, 2026
251b09e
format
ajslater Apr 27, 2026
0b51523
bump news
ajslater Apr 27, 2026
8063871
Merge branch 'main' into develop
ajslater Apr 27, 2026
ae40799
Stats: fix user_registered_count / auth_group_count always-zero bug (…
ajslater Apr 27, 2026
8861b9f
defaults for dockerfile ARGs
ajslater Apr 28, 2026
62dc95b
format'
ajslater Apr 28, 2026
982a507
Frontend correctness: 10 bug fixes from sub-plan 01 (#647)
ajslater Apr 28, 2026
517a41c
news for cherry pick
ajslater Apr 28, 2026
a214681
OPDS auth: send WWW-Authenticate + opds-authentication content-type o…
ajslater Apr 28, 2026
e0fb6a1
fix typing inheritence with drf perms
ajslater Apr 28, 2026
d796b40
bump version to v1.10.14
ajslater Apr 28, 2026
14c3d32
update picopt treestamps
ajslater Apr 28, 2026
6625743
fix typing import error
ajslater Apr 28, 2026
4ade941
fix vulture ignorelist
ajslater Apr 28, 2026
8e36cef
readd the mistakenly removed vulture_ignorelist
ajslater Apr 28, 2026
4dcffb0
Merge branch 'main' into develop
ajslater Apr 28, 2026
7924207
v1.10.15 fix show order bug. update deps
ajslater May 1, 2026
90e0cb3
fix nightly job manual expansion
ajslater May 1, 2026
ce5d1b6
fix news version number
ajslater May 1, 2026
ea2d589
Merge branch 'main' into develop
ajslater May 1, 2026
8975999
V1.11 performance (#714)
ajslater May 4, 2026
158c29e
use comicbox 3
ajslater May 4, 2026
d6a2c6c
Merge branch 'develop' of github.com:ajslater/codex into develop
ajslater May 4, 2026
de2c237
update version to v1.11.0
ajslater May 4, 2026
f6b99b7
Merge branch 'main' into develop
ajslater May 4, 2026
c429b9a
v1.11.1 fix anonymous user crash on midddleware setting timezone
ajslater May 4, 2026
50a4102
middleware: use ``session.aget`` in the async path of CodexMiddleware…
ajslater May 4, 2026
22c9ffd
update devenv
ajslater May 4, 2026
6d1558b
Merge branch 'main' into develop
ajslater May 4, 2026
8e13ca1
frontend: use static import for useCommonStore in api/v3/base.js (#719)
ajslater May 4, 2026
95ac80f
format news and picopt treestamps
ajslater May 4, 2026
a24d6f9
reader: restore scroll-to-top on horizontal page change with cacheBoo…
ajslater May 4, 2026
9d8b70d
Fix reader not scrolling to top of page
ajslater May 4, 2026
95716be
add folder view default feature to news
ajslater May 4, 2026
b5878fd
reader: default cache_book to False; reset global override on upgrade…
ajslater May 4, 2026
8e84ba9
browser: collapse browser pane to a single scroller (#723)
ajslater May 4, 2026
bf20a20
bump news. update deps
ajslater May 4, 2026
6a1741b
update deps
ajslater May 4, 2026
ce4782b
Merge branch 'main' into develop
ajslater May 4, 2026
0d65678
metadata: include ids in current-group list field (#725)
ajslater May 5, 2026
ab3679d
update version and bump news v1.11.3
ajslater May 5, 2026
6c211d0
metadata: extract group_list helper for GroupSerializer queryset shap…
ajslater May 5, 2026
afe14e1
frontend: simplify vuetify-items, remove ES2024 dependency (#727)
ajslater May 5, 2026
768d6aa
frontend(api/v3): cleanup pass — dead code, mutations, conventions (#…
ajslater May 5, 2026
8853970
frontend: move vuetify-items.js out of api/v3/ (#729)
ajslater May 5, 2026
58d6294
frontend(api/v3): convert default exports to named exports (#730)
ajslater May 5, 2026
4f5b3c6
Merge branch 'main' into develop
ajslater May 5, 2026
7014ab6
v1.11.4 fix firefox scrollbar
ajslater May 5, 2026
dca5365
update deps
ajslater May 5, 2026
0dbd42e
build(icons): replace cairosvg+inkscape with resvg-py (#733)
ajslater May 5, 2026
8bdbd52
update deps
ajslater May 5, 2026
9f532b4
format svg
ajslater May 5, 2026
8b76180
regenerate and optimize svg
ajslater May 5, 2026
f49e04f
format svg
ajslater May 5, 2026
f8feb7b
move build icons to a seperate step outide of build where it's done v…
ajslater May 5, 2026
b798f6c
Merge branch 'main' into develop
ajslater May 5, 2026
5263f71
format makefiles
ajslater May 6, 2026
ff5cf0c
fix links in readmes and organize OPDS clients
ajslater May 6, 2026
5129326
fix doubled "waiting for manual poll" log on every poll cycle (#734)
ajslater May 7, 2026
1254af4
update version to 1.11.5 & deps
ajslater May 7, 2026
2eb7e3f
fix snapshot inode-collision corruption + cleanup migration (#735)
ajslater May 7, 2026
82be7ce
refresh stale Comic.stat across inode rotations without re-import (#736)
ajslater May 7, 2026
8ed35f7
ty ignore
ajslater May 7, 2026
b69cd0b
update deps
ajslater May 7, 2026
b7a706f
bump news for fs fix
ajslater May 7, 2026
debbbfc
fix Ctrl+C hang from cover ProcessPoolExecutor (#714 regression) (#737)
ajslater May 8, 2026
5fa5f55
update deps
ajslater May 8, 2026
119f729
fix dev Vite HMR blocked by CSP / allowedHosts mismatch (#738)
ajslater May 8, 2026
85943ee
mangle DHCP-assigned FQDNs down to mDNS .local form (#739)
ajslater May 8, 2026
8572935
reader: add ?hide_text=1 to suppress visible OCR text on PDF pages (#…
ajslater May 9, 2026
25e0d00
Revert "reader: add ?hide_text=1 to suppress visible OCR text on PDF …
ajslater May 9, 2026
b3decfc
update deps
ajslater May 9, 2026
de1d732
fix dev Vite HMR still blocked by stale service worker CSP (#742)
ajslater May 9, 2026
1630a5c
fix local hmr server
ajslater May 9, 2026
814a5b4
add fixes to news
ajslater May 9, 2026
ff84a29
bump comicbox version
ajslater May 9, 2026
49862d6
Merge branch 'main' into develop
ajslater May 9, 2026
12d1239
reader: serve image-dominant PDF pages as <img>, drop full-PDF mode (…
ajslater May 9, 2026
ecd3e3d
Add browser table view (#745)
ajslater May 9, 2026
3449bd4
remove old tasks
ajslater May 9, 2026
4c8db45
bump news and version to v1.12.0
ajslater May 9, 2026
93015d3
update deps
ajslater May 9, 2026
b090a8d
format
ajslater May 9, 2026
e1a69f0
fix complexipy warnings in browser table-view dispatch helpers (#746)
ajslater May 9, 2026
639f936
split consolidated 0041 into separate phantom-cleanup + table-view mi…
ajslater May 9, 2026
26235aa
add table view to readme features
ajslater May 9, 2026
31a9c96
fix radon complexity warnings across browser table-view code + tests …
ajslater May 9, 2026
d4b9fb8
fix `make ty` warnings in browser table-view code (#749)
ajslater May 9, 2026
2349194
add per-user favorites (#750)
ajslater May 9, 2026
c3659fe
update deps
ajslater May 9, 2026
3f44a08
format
ajslater May 9, 2026
b4bf05b
fix type checking
ajslater May 9, 2026
5af21e9
speling
ajslater May 9, 2026
cfbac48
add smart canonical-order column insertion in browser table column pi…
ajslater May 9, 2026
bbb9f3d
filter orphan keys from generated browser choices json (#752)
ajslater May 9, 2026
2957e79
fix codespell config silently skipping all files (#753)
ajslater May 9, 2026
15efb19
remove old tasks
ajslater May 9, 2026
99e04c5
fix spelnig
ajslater May 9, 2026
c3ad4a7
remove ignore words frome codespell
ajslater May 9, 2026
8964deb
fix codespell skips
ajslater May 9, 2026
57ac98a
audit and fix tool ignore/skip configs (#754)
ajslater May 10, 2026
bb56f23
v1.12.0a0 (#755)
ajslater May 10, 2026
6e30091
restore regular v1.12.0 version
ajslater May 10, 2026
d4b6e71
remove old dev uv sources
ajslater May 10, 2026
248fcae
update devenv
ajslater May 10, 2026
48ff676
update deps
ajslater May 10, 2026
d2f0a4d
Merge branch 'main' into develop
ajslater May 10, 2026
f0cc758
Add optional failed-login log for fail2ban et al. (#757)
ajslater May 10, 2026
23e8441
bump version and news for fail2ban support. v1.12.1
ajslater May 10, 2026
490e005
bump news for new comicbox & comicfn2dict
ajslater May 10, 2026
10d5662
update features section
ajslater May 10, 2026
c68ee16
adjust news
ajslater May 10, 2026
6008813
add toml reference to readme
ajslater May 10, 2026
f16dab1
Downgrade routine anon-403s on /api/v3/auth/profile/ to DEBUG (#759)
ajslater May 10, 2026
9256b08
Merge branch 'develop' of github.com:ajslater/codex into develop
ajslater May 10, 2026
4548ffd
bump news
ajslater May 10, 2026
37b51ca
Keep failed-login IPs out of the main log (#760)
ajslater May 10, 2026
7681470
Merge branch 'develop' of github.com:ajslater/codex into develop
ajslater May 10, 2026
ec0ba2e
Merge branch 'main' into develop
ajslater May 11, 2026
12dbb4f
fix(browser): restore card-mode order_value caption for mixed-childre…
ajslater May 11, 2026
0ba4022
designate fenced log message in README
ajslater May 11, 2026
a29ceb5
bump news and version 1.12.2
ajslater May 11, 2026
0cde9c9
Merge branch 'main' into develop
ajslater May 11, 2026
61f14ed
fix(dev): make Vite dev server reachable from LAN browsers (#764)
ajslater May 12, 2026
9f9024e
fix(metadata): drop unneeded scrollbar on MetadataText values (#765)
ajslater May 12, 2026
b6acbf5
bump version to v1.12.3 & news
ajslater May 12, 2026
7536979
Merge branch 'develop' of github.com:ajslater/codex into develop
ajslater May 12, 2026
5a33971
feat(reader): swipe to turn pages on touch devices (#766)
ajslater May 12, 2026
4849da9
bump news
ajslater May 12, 2026
8d864ea
update deps
ajslater May 12, 2026
0ffbe5d
Merge branch 'main' into develop
ajslater May 12, 2026
e3c1c8a
update deps
ajslater May 14, 2026
c3a525b
force update tags by individual group. bump news & version to 1.12.4
ajslater May 15, 2026
cc26dd1
update deps
ajslater May 15, 2026
b96a386
fix(librarian): register JanitorCleanupFavoritesTask in scribe priori…
ajslater May 15, 2026
6304399
bump news
ajslater May 15, 2026
010e914
speling
ajslater May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ width: 128px;
border-radius: 128px;
" />

## v1.12.4

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

## v1.12.3

- Fixes
Expand Down
38 changes: 38 additions & 0 deletions codex/librarian/scribe/force_updater.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
"""Force a metadata re-import for an explicit set of comic pks."""

from collections import defaultdict

from codex.librarian.scribe.importer.tasks import ImportTask
from codex.librarian.scribe.tasks import ForceUpdateComicsTask
from codex.librarian.worker import WorkerBase
from codex.models.comic import Comic


class ForceUpdater(WorkerBase):
"""Dispatch ImportTasks scoped to a caller-supplied set of comic pks."""

def force_update(self, task: ForceUpdateComicsTask) -> None:
"""Group comic pks by library and dispatch a forced ImportTask per library."""
if not task.comic_pks:
self.log.debug("Force update called with no comic pks.")
return

comics = Comic.objects.filter(pk__in=task.comic_pks).only("path", "library_id")
library_path_map: defaultdict[int, set[str]] = defaultdict(set)
for comic in comics:
library_path_map[comic.library_id].add(comic.path) # pyright: ignore[reportAttributeAccessIssue]

total = 0
for library_id, paths in library_path_map.items():
files_modified = frozenset(paths)
if not files_modified:
continue
import_task = ImportTask(
library_id=library_id,
files_modified=files_modified,
force_import_metadata=True,
check_metadata_mtime=False,
)
self.librarian_queue.put(import_task)
total += len(files_modified)
self.log.info(f"Force update queued for {total} comics.")
6 changes: 5 additions & 1 deletion codex/librarian/scribe/priority.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
JanitorCleanCoversTask,
JanitorCleanFKsTask,
JanitorCleanupBookmarksTask,
JanitorCleanupFavoritesTask,
JanitorCleanupSessionsTask,
JanitorCleanupSettingsTask,
JanitorCodexUpdateTask,
Expand All @@ -29,6 +30,7 @@
SearchIndexSyncTask,
)
from codex.librarian.scribe.tasks import (
ForceUpdateComicsTask,
ImportAbortTask,
LazyImportComicsTask,
ScribeTask,
Expand All @@ -47,14 +49,16 @@
JanitorFTSIntegrityCheckTask,
JanitorFTSRebuildTask,
JanitorImportForceAllFailedTask,
ForceUpdateComicsTask,
ImportTask,
LazyImportComicsTask,
UpdateGroupsTask,
JanitorCleanFKsTask,
JanitorCleanCoversTask,
JanitorCleanupSessionsTask,
JanitorCleanupSettingsTask,
JanitorCleanupBookmarksTask,
JanitorCleanupSettingsTask,
JanitorCleanupFavoritesTask,
SearchIndexClearTask,
SearchIndexCleanStaleTask,
SearchIndexSyncTask,
Expand Down
7 changes: 7 additions & 0 deletions codex/librarian/scribe/scribed.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from queue import PriorityQueue
from typing import Final, override

from codex.librarian.scribe.force_updater import ForceUpdater
from codex.librarian.scribe.importer.importer import ComicImporter
from codex.librarian.scribe.importer.tasks import ImportTask
from codex.librarian.scribe.janitor.adopt_folders import OrphanFolderAdopter
Expand All @@ -22,6 +23,7 @@
)
from codex.librarian.scribe.tasks import (
CleanupAbortTask,
ForceUpdateComicsTask,
ImportAbortTask,
LazyImportComicsTask,
SearchIndexSyncAbortTask,
Expand Down Expand Up @@ -74,6 +76,11 @@ def process_item(self, item) -> None:
self.log, self.librarian_queue, self.db_write_lock
)
worker.lazy_import(task)
case ForceUpdateComicsTask():
worker = ForceUpdater(
self.log, self.librarian_queue, self.db_write_lock
)
worker.force_update(task)
case UpdateGroupsTask():
worker = TimestampUpdater(
self.log, self.librarian_queue, self.db_write_lock
Expand Down
7 changes: 7 additions & 0 deletions codex/librarian/scribe/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ class LazyImportComicsTask(ScribeTask):
pks: frozenset[int]


@dataclass
class ForceUpdateComicsTask(ScribeTask):
"""Force a metadata re-import for a specific set of comic pks."""

comic_pks: frozenset[int]


class ImportAbortTask(ScribeTask):
"""Abort Import."""

Expand Down
9 changes: 9 additions & 0 deletions codex/urls/api/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from codex.views.browser.browser import BrowserView
from codex.views.browser.choices import BrowserChoicesAvailableView, BrowserChoicesView
from codex.views.browser.download import GroupDownloadView
from codex.views.browser.force_update import ForceUpdateView
from codex.views.browser.metadata import MetadataView
from codex.views.browser.saved_settings import (
SavedBrowserSettingsListView,
Expand Down Expand Up @@ -81,4 +82,12 @@
LazyImportView.as_view(),
name="import",
),
#
#
# Force Update Tags
path(
"<int_list:pks>/force_update",
ForceUpdateView.as_view(),
name="force_update",
),
]
2 changes: 1 addition & 1 deletion codex/views/browser/filters/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
# ``comic__folders`` (download) rather than ``parent_folder`` (FK).
# Mirrors the branches in :meth:`GroupFilterView._get_rel_for_pks`.
_M2M_FOLDER_GROUP_TARGETS: Final[frozenset[str]] = frozenset(
{"cover", "choices", "bookmark", "download"}
{"cover", "choices", "bookmark", "download", "force_update"}
)

# Group codes whose transitive-favorite clauses introduce m2m JOINs on
Expand Down
2 changes: 1 addition & 1 deletion codex/views/browser/filters/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
GROUP_RELATION,
)

_GROUP_REL_TARGETS: Final = frozenset({"cover", "choices", "bookmark"})
_GROUP_REL_TARGETS: Final = frozenset({"cover", "choices", "bookmark", "force_update"})
_PK_REL_TARGETS: Final = frozenset({"metadata", "mtime"})


Expand Down
52 changes: 52 additions & 0 deletions codex/views/browser/force_update.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"""Force update browser view: re-import metadata for a filtered comic set."""

from collections.abc import Sequence
from types import MappingProxyType
from typing import override

from drf_spectacular.utils import extend_schema
from rest_framework.permissions import BasePermission, IsAdminUser
from rest_framework.response import Response

from codex.librarian.mp_queue import LIBRARIAN_QUEUE
from codex.librarian.scribe.tasks import ForceUpdateComicsTask
from codex.models.comic import Comic
from codex.serializers.mixins import OKSerializer
from codex.views.browser.filters.filter import BrowserFilterView


class ForceUpdateView(BrowserFilterView):
"""Force a metadata re-import for every comic under a group + filters."""

permission_classes: Sequence[type[BasePermission]] = (IsAdminUser,)
serializer_class = OKSerializer
TARGET: str = "force_update"

def __init__(self, *args, **kwargs) -> None:
"""Init acl properties."""
super().__init__(*args, **kwargs)
self.init_group_acl()

@property
@override
def params(self):
"""Retrieve params from the request without saving them to settings."""
if self._params is None:
params = self.load_params_from_settings()
self._params = MappingProxyType(params)
return self._params

@extend_schema(request=None, responses=serializer_class)
def post(self, *_args, **_kwargs) -> Response:
"""Enqueue a force-update task for every comic matching the filters."""
group = self.kwargs.get("group")
pks = self.kwargs.get("pks")
comic_pks = frozenset(
self.get_filtered_queryset(Comic, group=group, pks=pks).values_list(
"pk", flat=True
)
)
if comic_pks:
task = ForceUpdateComicsTask(comic_pks=comic_pks)
LIBRARIAN_QUEUE.put(task)
return Response()
1 change: 1 addition & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export default defineConfig([
ignoreContent: [
"notify_groups_changed",
"notify_failed_imports_changed",
"ForceUpdateConfirmDialog",
],
},
],
Expand Down
Loading