Skip to content

Commit 3d48858

Browse files
authored
v0.11.0 (#184)
1 parent ce761b3 commit 3d48858

File tree

123 files changed

+3701
-3062
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

123 files changed

+3701
-3062
lines changed

.circleci/config.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ jobs:
4747
- run:
4848
command: ./docker/docker-build-image.sh codex-dist-builder
4949
name: Build Distribution Builder Image
50+
- run:
51+
command: ./docker/docker-compose-exit.sh codex-backend-lint
52+
name: "Backend: Lint"
5053
- run:
5154
command: ./docker/docker-compose-exit.sh codex-frontend-lint
5255
name: "Frontend: Lint"
@@ -60,10 +63,7 @@ jobs:
6063
name: "Frontend: Build"
6164
- run:
6265
command: ./docker/docker-compose-exit.sh codex-backend-test
63-
name: "Backend: Lint & Test"
64-
- run:
65-
command: ./docker/docker-compose-exit.sh codex-backend-lint
66-
name: "Backend: Extra Linters"
66+
name: "Backend: Test"
6767
- store_test_results:
6868
path: test-results/pytest
6969
- store_artifacts:

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ jspm_packages/
143143
.env
144144
.env-*
145145
.env.pushover
146+
.pypirc
146147
.venv
147148
.DS_Store
148149
build

NEWS.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
# 📰 Codex News
22

3+
## v0.11.0
4+
5+
- Features
6+
7+
- Librarian tasks in progress appear in the settings side drawer for adminstratiors.
8+
- Covers are now created on demand by the browser, rather than on import.
9+
- Browser Read filter.
10+
11+
- Fixes
12+
13+
- Bookmark progress bar updates in browser after closing book.
14+
- Metadata web links fix.
15+
316
## v0.10.10
417

518
- Features
619

720
- Reader nav toolbar shows position in series.
821

9-
- Fix
22+
- Fixes
1023

1124
- Fix inability to log in when Enable Non Users admin flag is unset.
1225
- Simplify Admin Library delete confirmation page to prevent OOM crash.

builder-requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
poetry==1.1.13
1+
poetry==1.1.14

codex/admin.py

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,11 @@
1414
from django.utils.html import format_html
1515
from django.utils.safestring import SafeText
1616

17-
from codex.librarian.queue_mp import (
18-
LIBRARIAN_QUEUE,
19-
BroadcastNotifierTask,
20-
CreateComicCoversLibrariesTask,
21-
DelayedTasks,
22-
PollLibrariesTask,
23-
PurgeComicCoversLibrariesTask,
24-
WatchdogSyncTask,
25-
)
17+
from codex.librarian.covers.tasks import CoverRemoveForLibrariesTask
18+
from codex.librarian.queue_mp import LIBRARIAN_QUEUE, DelayedTasks
19+
from codex.librarian.watchdog.tasks import WatchdogPollLibrariesTask, WatchdogSyncTask
2620
from codex.models import AdminFlag, FailedImport, Folder, Library
21+
from codex.notifier.tasks import LIBRARY_CHANGED_TASK
2722
from codex.settings.logging import get_logger
2823

2924

@@ -95,7 +90,7 @@ def _check_list_display_item(self, obj, item, label):
9590
("Watchdog", {"fields": ("events", "poll", "poll_every", "last_poll")}),
9691
("Auth", {"fields": ("groups",)}),
9792
)
98-
actions = ("poll", "force_poll", "regen_comic_covers")
93+
actions = ("poll", "force_poll", "remove_comic_covers")
9994
empty_value_display = "Never"
10095
list_display = (
10196
"path",
@@ -124,7 +119,7 @@ def get_queryset(self, request):
124119
def queue_poll(queryset, force):
125120
"""Queue a poll task for the library."""
126121
pks = queryset.values_list("pk", flat=True)
127-
task = PollLibrariesTask(pks, force)
122+
task = WatchdogPollLibrariesTask(pks, force)
128123
LIBRARIAN_QUEUE.put(task)
129124

130125
def poll(self, request, queryset):
@@ -139,17 +134,19 @@ def force_poll(self, request, queryset):
139134

140135
force_poll.short_description = "Update all comics in selected libraries"
141136

142-
def regen_comic_covers(self, _, queryset):
137+
def remove_comic_covers(self, _, queryset):
143138
"""Regenerate all covers."""
144139
pks = queryset.values_list("pk", flat=True)
145-
LIBRARIAN_QUEUE.put(CreateComicCoversLibrariesTask(pks))
140+
LIBRARIAN_QUEUE.put(CoverRemoveForLibrariesTask(pks))
146141

147-
regen_comic_covers.short_description = "Recreate comic covers in selected libraries"
142+
remove_comic_covers.short_description = (
143+
"Remove comic covers from selected libraries"
144+
)
148145

149146
def _on_change(self, _, created=False):
150147
"""Events for when the library has changed."""
151148
cache.clear()
152-
tasks = (BroadcastNotifierTask("LIBRARY_CHANGED"), WatchdogSyncTask())
149+
tasks = (LIBRARY_CHANGED_TASK, WatchdogSyncTask())
153150
task = DelayedTasks(2, tasks)
154151
LIBRARIAN_QUEUE.put(task)
155152

@@ -169,7 +166,7 @@ def save_model(self, request, obj: Library, form, change):
169166
def delete_model(self, request, obj):
170167
"""Stop watching on delete."""
171168
pks = frozenset([obj.pk])
172-
task = PurgeComicCoversLibrariesTask(pks)
169+
task = CoverRemoveForLibrariesTask(pks)
173170
LIBRARIAN_QUEUE.put(task)
174171
super().delete_model(request, obj)
175172
cache.clear()
@@ -178,9 +175,11 @@ def delete_model(self, request, obj):
178175
def delete_queryset(self, request, queryset):
179176
"""Bulk delete."""
180177
pks = frozenset(queryset.values_list("pk", flat=True))
181-
task = PurgeComicCoversLibrariesTask(pks)
178+
task = CoverRemoveForLibrariesTask(pks)
182179
LIBRARIAN_QUEUE.put(task)
183-
super().delete_queryset(request, queryset)
180+
for library in queryset:
181+
# so deletes will cascade
182+
library.delete()
184183
cache.clear()
185184
self._on_change(None)
186185

@@ -198,7 +197,6 @@ def get_deleted_objects(self, objs, request):
198197
perms_needed = set()
199198
protected = []
200199
return to_delete, model_count, perms_needed, protected
201-
# return super().get_deleted_objects(objs, request)
202200

203201

204202
@register(AdminFlag)
@@ -230,8 +228,7 @@ def _on_change(self):
230228
# Heavy handed refresh everything, but simple.
231229
# Folder View could only change the group view and let the ui decide
232230
# Registration only needs to change the enable flag
233-
task = BroadcastNotifierTask("LIBRARY_CHANGED")
234-
LIBRARIAN_QUEUE.put(task)
231+
LIBRARIAN_QUEUE.put(LIBRARY_CHANGED_TASK)
235232

236233

237234
@register(FailedImport)
@@ -267,7 +264,7 @@ def get_queryset(self, request):
267264
def poll(self, request, queryset):
268265
"""Poll for new comics."""
269266
pks = queryset.values_list("library__pk", flat=True)
270-
task = PollLibrariesTask(frozenset(pks), False)
267+
task = WatchdogPollLibrariesTask(frozenset(pks), False)
271268
LIBRARIAN_QUEUE.put(task)
272269

273270
poll.short_description = "Poll selected failed imports' libraries for changes"

codex/asgi.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
# Must setup up the django environment before importing django models
1919
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "codex.settings.settings")
20-
# os.environ["PYTHONASYNCIODEBUG"] = "1"
2120
connect_signals()
2221
django.setup()
2322

codex/img/missing-cover.svg

Lines changed: 112 additions & 0 deletions
Loading

codex/img/missing-cover.webp

9.99 KB
Loading

0 commit comments

Comments
 (0)