made generate_directory use atomic transactions. this increases performance significantly on unviewed directories.

This commit is contained in:
ajurna@gmail.com
2016-04-14 10:00:38 +01:00
parent 00ea3d1d87
commit a2f3e76bb2

View File

@@ -1,6 +1,7 @@
from collections import OrderedDict from collections import OrderedDict
from os import path, listdir from os import path, listdir
from django.db.transaction import atomic
from django.utils.http import urlsafe_base64_encode from django.utils.http import urlsafe_base64_encode
from .models import ComicBook, Setting, ComicStatus, Directory from .models import ComicBook, Setting, ComicStatus, Directory
@@ -105,55 +106,56 @@ def generate_directory(user, directory=False):
else: else:
dir_path = '' dir_path = ''
ordered_dir_list = get_ordered_dir_list(base_dir) ordered_dir_list = get_ordered_dir_list(base_dir)
for file_name in ordered_dir_list: with atomic():
df = DirFile() for file_name in ordered_dir_list:
df.name = file_name df = DirFile()
if path.isdir(path.join(base_dir, dir_path, file_name)): df.name = file_name
try: if path.isdir(path.join(base_dir, dir_path, file_name)):
if directory: try:
d = Directory.objects.get(name=file_name, if directory:
parent=directory) d = Directory.objects.get(name=file_name,
else: parent=directory)
d = Directory.objects.get(name=file_name, else:
parent__isnull=True) d = Directory.objects.get(name=file_name,
except Directory.DoesNotExist: parent__isnull=True)
if directory: except Directory.DoesNotExist:
d = Directory(name=file_name, if directory:
parent=directory) d = Directory(name=file_name,
else: parent=directory)
d = Directory(name=file_name) else:
d.save() d = Directory(name=file_name)
df.isdir = True d.save()
df.icon = 'glyphicon-folder-open' df.isdir = True
df.selector = urlsafe_base64_encode(d.selector.bytes).decode() df.icon = 'glyphicon-folder-open'
df.location = '/comic/{0}/'.format(df.selector) df.selector = urlsafe_base64_encode(d.selector.bytes).decode()
df.label = generate_dir_status(user, d) df.location = '/comic/{0}/'.format(df.selector)
df.type = 'directory' df.label = generate_dir_status(user, d)
elif file_name.lower()[-4:] in ['.rar', '.zip', '.cbr', '.cbz']: df.type = 'directory'
df.iscb = True elif file_name.lower()[-4:] in ['.rar', '.zip', '.cbr', '.cbz']:
df.icon = 'glyphicon-book' df.iscb = True
try: df.icon = 'glyphicon-book'
if directory: try:
book = ComicBook.objects.get(file_name=file_name, if directory:
directory=directory) book = ComicBook.objects.get(file_name=file_name,
else: directory=directory)
book = ComicBook.objects.get(file_name=file_name, else:
directory__isnull=True) book = ComicBook.objects.get(file_name=file_name,
except ComicBook.DoesNotExist: directory__isnull=True)
book = ComicBook.process_comic_book(file_name, directory) except ComicBook.DoesNotExist:
book = ComicBook.process_comic_book(file_name, directory)
status, created = ComicStatus.objects.get_or_create(comic=book, user=user) status, created = ComicStatus.objects.get_or_create(comic=book, user=user)
if created: if created:
status.save() status.save()
last_page = status.last_read_page last_page = status.last_read_page
df.selector = urlsafe_base64_encode(book.selector.bytes).decode() df.selector = urlsafe_base64_encode(book.selector.bytes).decode()
df.location = '/comic/read/{0}/{1}/'.format(df.selector, df.location = '/comic/read/{0}/{1}/'.format(df.selector,
last_page) last_page)
df.cur_page = last_page df.cur_page = last_page
df.label = generate_label(book, status) df.label = generate_label(book, status)
df.type = 'book' df.type = 'book'
files.append(df) files.append(df)
return files return files