multiple fixes for queries that stop duplicates from being created.

This commit is contained in:
ajurna
2020-05-27 13:32:20 +01:00
parent f6611fbe6b
commit e1fa35e9f4
2 changed files with 25 additions and 12 deletions

View File

@@ -46,10 +46,21 @@ class Command(BaseCommand):
if isdir(os.path.join(comic_dir, file)): if isdir(os.path.join(comic_dir, file)):
if self.OUTPUT: if self.OUTPUT:
logger.info(f"Scanning Directory {file}") logger.info(f"Scanning Directory {file}")
try:
if directory: if directory:
next_directory, created = Directory.objects.get_or_create(name=file, parent=directory) next_directory, created = Directory.objects.get_or_create(name=file, parent=directory)
else: else:
next_directory, created = Directory.objects.get_or_create(name=file, parent__isnull=True) next_directory, created = Directory.objects.get_or_create(name=file, parent__isnull=True)
except Directory.MultipleObjectsReturned:
if directory:
next_directories = Directory.objects.filter(name=file, parent=directory)
else:
next_directories = Directory.objects.filter(name=file, parent__isnull=True)
next_directories = next_directories.order_by('id')
next_directory = next_directories.first()
next_directories.exclude(id=next_directory.id).delete()
logger.error(f'Duplicate Directory {file}')
created = False
if created: if created:
next_directory.save() next_directory.save()
self.scan_directory(next_directory) self.scan_directory(next_directory)
@@ -61,7 +72,7 @@ class Command(BaseCommand):
try: try:
book = ComicBook.objects.get(file_name=file, directory=directory) book = ComicBook.objects.get(file_name=file, directory=directory)
except ComicBook.MultipleObjectsReturned: except ComicBook.MultipleObjectsReturned:
logger.error(f'Duplicate Record {file}') logger.error(f'Duplicate Comic {file}')
books = ComicBook.objects.filter(file_name=file, directory=directory).order_by('id') books = ComicBook.objects.filter(file_name=file, directory=directory).order_by('id')
book = books.first() book = books.first()
extra_books = books.exclude(id=book.id) extra_books = books.exclude(id=book.id)

View File

@@ -138,16 +138,18 @@ def generate_directory(user, directory=False):
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.filter(comicbook__comicstatus__user=user).annotate( dir_list_obj = dir_list_obj.annotate(
total=Count('comicbook'), total=Count('comicbook', distinct=True),
total_read=Count('comicbook__comicstatus', Q(comicbook__comicstatus__finished=True)) total_read=Count('comicbook__comicstatus', Q(comicbook__comicstatus__finished=True,
comicbook__comicstatus__user=user), distinct=True)
) )
file_list_obj = file_list_obj.filter(comicstatus__user=user).annotate( file_list_obj = file_list_obj.annotate(
total_pages=Count('comicpage'), total_pages=Count('comicpage', distinct=True),
last_read_page=F('comicstatus__last_read_page'), last_read_page=F('comicstatus__last_read_page'),
finished=F('comicstatus__finished'), finished=F('comicstatus__finished'),
unread=F('comicstatus__unread') unread=F('comicstatus__unread'),
) user=F('comicstatus__user')
).filter(Q(user__isnull=True) | Q(user=user.id))
for directory_obj in dir_list_obj: for directory_obj in dir_list_obj:
df = DirFile() df = DirFile()