From e1fa35e9f488edf69348bf99fedc364bbc202f62 Mon Sep 17 00:00:00 2001 From: ajurna Date: Wed, 27 May 2020 13:32:20 +0100 Subject: [PATCH] multiple fixes for queries that stop duplicates from being created. --- comic/management/commands/scan_comics.py | 21 ++++++++++++++++----- comic/util.py | 16 +++++++++------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/comic/management/commands/scan_comics.py b/comic/management/commands/scan_comics.py index 892ba19..db31e13 100644 --- a/comic/management/commands/scan_comics.py +++ b/comic/management/commands/scan_comics.py @@ -46,10 +46,21 @@ class Command(BaseCommand): if isdir(os.path.join(comic_dir, file)): if self.OUTPUT: logger.info(f"Scanning Directory {file}") - if directory: - next_directory, created = Directory.objects.get_or_create(name=file, parent=directory) - else: - next_directory, created = Directory.objects.get_or_create(name=file, parent__isnull=True) + try: + if directory: + next_directory, created = Directory.objects.get_or_create(name=file, parent=directory) + else: + 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: next_directory.save() self.scan_directory(next_directory) @@ -61,7 +72,7 @@ class Command(BaseCommand): try: book = ComicBook.objects.get(file_name=file, directory=directory) 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') book = books.first() extra_books = books.exclude(id=book.id) diff --git a/comic/util.py b/comic/util.py index bc6afce..03baffe 100644 --- a/comic/util.py +++ b/comic/util.py @@ -138,16 +138,18 @@ def generate_directory(user, directory=False): 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) - dir_list_obj = dir_list_obj.filter(comicbook__comicstatus__user=user).annotate( - total=Count('comicbook'), - total_read=Count('comicbook__comicstatus', Q(comicbook__comicstatus__finished=True)) + dir_list_obj = dir_list_obj.annotate( + total=Count('comicbook', distinct=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( - total_pages=Count('comicpage'), + file_list_obj = file_list_obj.annotate( + total_pages=Count('comicpage', distinct=True), last_read_page=F('comicstatus__last_read_page'), 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: df = DirFile()