mirror of
https://github.com/ajurna/cbwebreader.git
synced 2026-11-02 10:36:55 +00:00
**Refactor directory scanning and add scan task support**
- Added a new `scan_directory` task to enable folder scans as asynchronous tasks while maintaining compatibility with the immediate backend. - Introduced the `reconcile` function, replacing `generate_directory` for improved separation of concerns between database writes and read operations. - Established a unique constraint on `Directory` (`one_directory_name_per_parent`) to prevent duplicate directories under the same parent. - Added a "Scan" button to the frontend for re-reading folders from disk, along with new task invocation endpoints in the API. - Updated tests across modules to validate the new `scan_directory` task, unique constraints, and database indexing logic. - Improved cleanup logic for stale files, directories, and thumbnails to handle concurrent operations efficiently. - Simplified `scan_comics` management command by removing user dependency and aligning it with the new `reconcile` function. - Enhanced frontend components (`TheComicReader`, `TheComicList`, and others) to include lifecycle method cleanups, prevent memory leaks, and handle task-based scans.
This commit is contained in:
1 parent
4d0ba750ad
commit
ce809ed1a9
18 files changed
+364
-81
No files matched your search
@@ -0,0 +1,38 @@
|
||||
# Generated by Django 6.1.2 on 2026-10-13 12:51
|
||||
|
||||
from collections import defaultdict
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
def merge_duplicate_directories(apps, schema_editor) -> None:
|
||||
"""Scans could insert the same directory twice, so fold duplicates together
|
||||
before the unique constraint is added, otherwise the migration fails on data
|
||||
the bug has already created."""
|
||||
Directory = apps.get_model('comic', 'Directory')
|
||||
ComicBook = apps.get_model('comic', 'ComicBook')
|
||||
|
||||
groups = defaultdict(list)
|
||||
for directory in Directory.objects.order_by('id'):
|
||||
groups[(directory.parent_id, directory.name)].append(directory)
|
||||
|
||||
for group in groups.values():
|
||||
keeper = group[0]
|
||||
for duplicate in group[1:]:
|
||||
ComicBook.objects.filter(directory=duplicate).update(directory=keeper)
|
||||
duplicate.delete()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('comic', '0050_delete_comicpage'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(merge_duplicate_directories, migrations.RunPython.noop),
|
||||
migrations.AddConstraint(
|
||||
model_name='directory',
|
||||
constraint=models.UniqueConstraint(fields=('parent', 'name'), name='one_directory_name_per_parent'),
|
||||
),
|
||||
]
|
||||
Reference in new issue
Block a user