mirror of
https://github.com/ajurna/cbwebreader.git
synced 2025-12-06 14:17:19 +00:00
optimised directory listing query
This commit is contained in:
@@ -26,3 +26,5 @@ MIDDLEWARE = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
SILK_ENABLED = True
|
SILK_ENABLED = True
|
||||||
|
|
||||||
|
SILKY_PYTHON_PROFILER = True
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ from django.contrib.auth.models import User
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.transaction import atomic
|
from django.db.transaction import atomic
|
||||||
from django.utils.http import urlsafe_base64_encode
|
from django.utils.http import urlsafe_base64_encode
|
||||||
from PyPDF4 import PdfFileReader
|
import PyPDF4
|
||||||
|
import PyPDF4.utils
|
||||||
|
|
||||||
|
|
||||||
from comic import rarfile
|
from comic import rarfile
|
||||||
|
|
||||||
@@ -31,6 +33,9 @@ class Directory(models.Model):
|
|||||||
parent = models.ForeignKey("Directory", null=True, blank=True, on_delete=models.CASCADE)
|
parent = models.ForeignKey("Directory", null=True, blank=True, on_delete=models.CASCADE)
|
||||||
selector = models.UUIDField(unique=True, default=uuid.uuid4, db_index=True)
|
selector = models.UUIDField(unique=True, default=uuid.uuid4, db_index=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
ordering = ['name']
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "Directory: {0}; {1}".format(self.name, self.parent)
|
return "Directory: {0}; {1}".format(self.name, self.parent)
|
||||||
|
|
||||||
@@ -263,10 +268,12 @@ class ComicBook(models.Model):
|
|||||||
cbx = zipfile.ZipFile(comic_full_path)
|
cbx = zipfile.ZipFile(comic_full_path)
|
||||||
except zipfile.BadZipFile:
|
except zipfile.BadZipFile:
|
||||||
cbx = None
|
cbx = None
|
||||||
|
pdf_file = None
|
||||||
if not cbx:
|
if not cbx:
|
||||||
pdf_file = PdfFileReader(comic_full_path)
|
try:
|
||||||
else:
|
pdf_file = PyPDF4.PdfFileReader(comic_full_path)
|
||||||
pdf_file = None
|
except PyPDF4.utils.PyPdfError:
|
||||||
|
pass
|
||||||
if not pdf_file and not cbx:
|
if not pdf_file and not cbx:
|
||||||
return comic_file_name
|
return comic_file_name
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from os import listdir, path
|
from os import listdir, path
|
||||||
|
|
||||||
|
from django.db.models import Count, Q
|
||||||
from django.db.transaction import atomic
|
from django.db.transaction import atomic
|
||||||
from django.utils.http import urlsafe_base64_encode
|
from django.utils.http import urlsafe_base64_encode
|
||||||
|
|
||||||
@@ -94,7 +95,7 @@ class DirFile:
|
|||||||
self.icon = "fa-folder-open"
|
self.icon = "fa-folder-open"
|
||||||
self.selector = urlsafe_base64_encode(directory.selector.bytes)
|
self.selector = urlsafe_base64_encode(directory.selector.bytes)
|
||||||
self.location = "/comic/{0}/".format(self.selector)
|
self.location = "/comic/{0}/".format(self.selector)
|
||||||
self.label = generate_dir_status(user, directory)
|
self.label = generate_dir_status(directory.total, directory.total_read)
|
||||||
self.type = "directory"
|
self.type = "directory"
|
||||||
|
|
||||||
def populate_comic(self, comic, user):
|
def populate_comic(self, comic, user):
|
||||||
@@ -140,6 +141,12 @@ def generate_directory(user, directory=False):
|
|||||||
else:
|
else:
|
||||||
dir_list_obj = Directory.objects.filter(name__in=dir_list, parent__isnull=True)
|
dir_list_obj = Directory.objects.filter(name__in=dir_list, parent__isnull=True)
|
||||||
file_list_obj = ComicBook.objects.filter(file_name__in=file_list, directory__isnull=True)
|
file_list_obj = ComicBook.objects.filter(file_name__in=file_list, directory__isnull=True)
|
||||||
|
|
||||||
|
dir_list_obj = dir_list_obj.annotate(total=Count('comicbook'),
|
||||||
|
total_read=Count('comicbook__comicstatus',
|
||||||
|
Q(comicbook__comicstatus__finished=True,
|
||||||
|
comicbook__comicstatus__user=user)))
|
||||||
|
|
||||||
for directory_obj in dir_list_obj:
|
for directory_obj in dir_list_obj:
|
||||||
df = DirFile()
|
df = DirFile()
|
||||||
df.populate_directory(directory_obj, user)
|
df.populate_directory(directory_obj, user)
|
||||||
@@ -157,6 +164,8 @@ def generate_directory(user, directory=False):
|
|||||||
else:
|
else:
|
||||||
directory_obj = Directory(name=directory_name)
|
directory_obj = Directory(name=directory_name)
|
||||||
directory_obj.save()
|
directory_obj.save()
|
||||||
|
directory_obj.total = 0
|
||||||
|
directory_obj.total_read = 0
|
||||||
df = DirFile()
|
df = DirFile()
|
||||||
df.populate_directory(directory_obj, user)
|
df.populate_directory(directory_obj, user)
|
||||||
files.append(df)
|
files.append(df)
|
||||||
@@ -185,17 +194,14 @@ def generate_label(book, status):
|
|||||||
return label_text
|
return label_text
|
||||||
|
|
||||||
|
|
||||||
def generate_dir_status(user, directory):
|
def generate_dir_status(total, total_read):
|
||||||
cb_list = ComicBook.objects.filter(directory=directory)
|
|
||||||
total = cb_list.count()
|
|
||||||
total_read = ComicStatus.objects.filter(user=user, comic__in=cb_list, finished=True).count()
|
|
||||||
if total == 0:
|
if total == 0:
|
||||||
return '<center><span class="label label-default">Empty</span></center>'
|
return '<center><span class="label label-default">Empty</span></center>'
|
||||||
elif total == total_read:
|
elif total == total_read:
|
||||||
return '<center><span class="label label-success">All Read</span></center>'
|
return '<center><span class="label label-success">All Read</span></center>'
|
||||||
elif total_read == 0:
|
elif total_read == 0:
|
||||||
return '<center><span class="label label-default">Unread</span></center>'
|
return '<center><span class="label label-default">Unread</span></center>'
|
||||||
return '<center><span class="label label-primary">{0}/{1}</span></center>'.format(total_read, total)
|
return f'<center><span class="label label-primary">{total_read}/{total}</span></center>'
|
||||||
|
|
||||||
|
|
||||||
def get_ordered_dir_list(folder):
|
def get_ordered_dir_list(folder):
|
||||||
|
|||||||
Reference in New Issue
Block a user