Merge pull request #77

* added timestamp to comicstatus.

* added timestamp to comicstatus.
This commit is contained in:
2022-09-19 12:18:46 +01:00
committed by GitHub
parent 01e73cc9b3
commit 2647a0e31e
20 changed files with 463 additions and 304 deletions

View File

@@ -1,17 +1,19 @@
import mimetypes
import zipfile
from itertools import chain
from pathlib import Path
from typing import NamedTuple, List
from typing import NamedTuple, List, Optional, Union
import rarfile
from django.conf import settings
from django.contrib.auth.models import User
from django.db.models import Count, Q, F, Case, When, PositiveSmallIntegerField
from django.db.models import Count, Q, F, Case, When, PositiveSmallIntegerField, QuerySet
from comic import models
from comic.errors import NotCompatibleArchive
def generate_directory(user: User, directory=None):
def generate_directory(user: User, directory: Optional[models.Directory] = None) -> List[QuerySet]:
dir_path = Path(settings.COMIC_BOOK_VOLUME, directory.path) if directory else settings.COMIC_BOOK_VOLUME
files = []
@@ -37,7 +39,6 @@ def generate_directory(user: User, directory=None):
models.ComicStatus.objects.bulk_create(new_status)
file_db_query = file_db_query.annotate(
total=Count('comicpage', distinct=True),
progress=F('comicstatus__last_read_page') + 1,
finished=F('comicstatus__finished'),
unread=F('comicstatus__unread'),
@@ -60,7 +61,7 @@ def generate_directory(user: User, directory=None):
return files
def clean_directories(directories, dir_path, directory=None):
def clean_directories(directories: QuerySet, dir_path: Path, directory: Optional[models.Directory] = None) -> None:
dir_db_set = set(Path(settings.COMIC_BOOK_VOLUME, x.path) for x in directories)
dir_list = set(x for x in sorted(dir_path.glob('*')) if x.is_dir())
# Create new directories db instances
@@ -72,7 +73,7 @@ def clean_directories(directories, dir_path, directory=None):
models.Directory.objects.get(name=stale_directory.name, parent=directory).delete()
def clean_files(files, user, dir_path, directory=None):
def clean_files(files: QuerySet, user: User, dir_path: Path, directory: Optional[models.Directory] = None) -> None:
file_list = set(x for x in sorted(dir_path.glob('*')) if x.is_file())
files_db_set = set(Path(dir_path, x.file_name) for x in files)
@@ -80,34 +81,23 @@ def clean_files(files, user, dir_path, directory=None):
books_to_add = []
for new_comic in file_list - files_db_set:
if new_comic.suffix.lower() in settings.SUPPORTED_FILES:
books_to_add.append(
models.ComicBook(file_name=new_comic.name, directory=directory)
)
new_book = models.ComicBook(file_name=new_comic.name, directory=directory)
archive, archive_type = new_book.get_archive()
try:
if archive_type == 'archive':
new_book.page_count = len(get_archive_files(archive))
elif archive_type == 'pdf':
new_book.page_count = archive.page_count
except NotCompatibleArchive:
pass
books_to_add.append(new_book)
models.ComicBook.objects.bulk_create(books_to_add)
pages_to_add = []
status_to_add = []
for book in books_to_add:
status_to_add.append(models.ComicStatus(user=user, comic=book))
try:
archive, archive_type = book.get_archive()
if archive_type == 'archive':
pages_to_add.extend([
models.ComicPage(
Comic=book, index=idx, page_file_name=page.file_name, content_type=page.mime_type
) for idx, page in enumerate(get_archive_files(archive))
])
elif archive_type == 'pdf':
pages_to_add.extend([
models.ComicPage(
Comic=book, index=idx, page_file_name=idx + 1, content_type='application/pdf'
) for idx in range(archive.page_count)
])
except NotCompatibleArchive:
pass
models.ComicStatus.objects.bulk_create(status_to_add)
models.ComicPage.objects.bulk_create(pages_to_add)
# Remove stale comic instances
for stale_comic in files_db_set - file_list:
@@ -119,7 +109,7 @@ class ArchiveFile(NamedTuple):
mime_type: str
def get_archive_files(archive) -> List[ArchiveFile]:
def get_archive_files(archive: Union[zipfile.ZipFile, rarfile.RarFile]) -> List[ArchiveFile]:
return [
ArchiveFile(x, mimetypes.guess_type(x)[0]) for x in sorted(archive.namelist())
if not x.endswith('/') and mimetypes.guess_type(x)[0]