X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/1405761d13e0ba62db4b1f9a9d5fa1472142b6d0..e426e2dba8a5e280cda8074eb71f7bb43d8b1f40:/apps/catalogue/management/commands/importbooks.py diff --git a/apps/catalogue/management/commands/importbooks.py b/apps/catalogue/management/commands/importbooks.py index 637e2148f..6461feb26 100644 --- a/apps/catalogue/management/commands/importbooks.py +++ b/apps/catalogue/management/commands/importbooks.py @@ -10,11 +10,14 @@ from django.conf import settings from django.core.management.base import BaseCommand from django.core.management.color import color_style from django.core.files import File +from librarian.picture import ImageStore +from wolnelektury_core.management.profile import profile from catalogue.models import Book from picture.models import Picture -from search import Index +from search.index import Index + class Command(BaseCommand): option_list = BaseCommand.option_list + ( @@ -44,13 +47,11 @@ class Command(BaseCommand): file_base, ext = os.path.splitext(file_path) book = Book.from_xml_file(file_path, overwrite=options.get('force'), dont_build=dont_build, - search_index=options.get('search_index'), - search_index_reuse=True, search_index_tags=False) for ebook_format in Book.ebook_formats: if os.path.isfile(file_base + '.' + ebook_format): getattr(book, '%s_file' % ebook_format).save( - '%s.%s' % (book.slug, ebook_format), + '%s.%s' % (book.slug, ebook_format), File(file(file_base + '.' + ebook_format)), save=False ) @@ -58,18 +59,25 @@ class Command(BaseCommand): print "Importing %s.%s" % (file_base, ebook_format) book.save() - def import_picture(self, file_path, options): - picture = Picture.from_xml_file(file_path, overwrite=options.get('force')) + def import_picture(self, file_path, options, continue_on_error=True): + try: + image_store = ImageStore(os.path.dirname(file_path)) + picture = Picture.from_xml_file(file_path, image_store=image_store, overwrite=options.get('force')) + except Exception, ex: + if continue_on_error: + print "%s: %s" % (file_path, ex) + return + else: + raise ex return picture + # @profile def handle(self, *directories, **options): from django.db import transaction self.style = color_style() verbose = options.get('verbose') - force = options.get('force') - show_traceback = options.get('traceback', False) import_picture = options.get('import_picture') wait_until = None @@ -80,82 +88,78 @@ class Command(BaseCommand): time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(wait_until)), wait_until - time.time()) + index = None if options.get('search_index') and not settings.NO_SEARCH_INDEX: index = Index() - index.open() try: index.index_tags() - finally: - index.close() + index.index.commit() + except Exception, e: + index.index.rollback() + raise e # Start transaction management. - transaction.commit_unless_managed() - transaction.enter_transaction_management() - transaction.managed(True) - - files_imported = 0 - files_skipped = 0 - - for dir_name in directories: - if not os.path.isdir(dir_name): - print self.style.ERROR("%s: Not a directory. Skipping." % dir_name) - else: - # files queue - files = sorted(os.listdir(dir_name)) - postponed = {} - while files: - file_name = files.pop(0) - file_path = os.path.join(dir_name, file_name) - file_base, ext = os.path.splitext(file_path) - - # Skip files that are not XML files - if not ext == '.xml': - continue - - if verbose > 0: - print "Parsing '%s'" % file_path - else: - sys.stdout.write('.') - sys.stdout.flush() - - # Import book files - try: - if import_picture: - self.import_picture(file_path, options) + with transaction.atomic(): + + files_imported = 0 + files_skipped = 0 + + for dir_name in directories: + if not os.path.isdir(dir_name): + print self.style.ERROR("%s: Not a directory. Skipping." % dir_name) + else: + # files queue + files = sorted(os.listdir(dir_name)) + postponed = {} + while files: + file_name = files.pop(0) + file_path = os.path.join(dir_name, file_name) + file_base, ext = os.path.splitext(file_path) + + # Skip files that are not XML files + if not ext == '.xml': + continue + + if verbose > 0: + print "Parsing '%s'" % file_path else: - self.import_book(file_path, options) - files_imported += 1 - transaction.commit() - - except (Book.AlreadyExists, Picture.AlreadyExists): - print self.style.ERROR('%s: Book or Picture already imported. Skipping. To overwrite use --force.' % - file_path) - files_skipped += 1 - - except Book.DoesNotExist, e: - if file_name not in postponed or postponed[file_name] < files_imported: - # push it back into the queue, maybe the missing child will show up - if verbose: - print self.style.NOTICE('Waiting for missing children') - files.append(file_name) - postponed[file_name] = files_imported - else: - # we're in a loop, nothing's being imported - some child is really missing - raise e - - # Print results - print - print "Results: %d files imported, %d skipped, %d total." % ( - files_imported, files_skipped, files_imported + files_skipped) - print - - if wait_until: - print 'Waiting...' - try: - time.sleep(wait_until - time.time()) - except IOError: - print "it's already too late" - - transaction.commit() - transaction.leave_transaction_management() - + sys.stdout.write('.') + sys.stdout.flush() + + # Import book files + try: + if import_picture: + self.import_picture(file_path, options) + else: + self.import_book(file_path, options) + + files_imported += 1 + + except (Book.AlreadyExists, Picture.AlreadyExists): + print self.style.ERROR('%s: Book or Picture already imported. Skipping. To overwrite use --force.' % + file_path) + files_skipped += 1 + + except Book.DoesNotExist, e: + if file_name not in postponed or postponed[file_name] < files_imported: + # push it back into the queue, maybe the missing child will show up + if verbose: + print self.style.NOTICE('Waiting for missing children') + files.append(file_name) + postponed[file_name] = files_imported + else: + # we're in a loop, nothing's being imported - some child is really missing + raise e + + # Print results + print + print "Results: %d files imported, %d skipped, %d total." % ( + files_imported, files_skipped, files_imported + files_skipped) + print + + if wait_until: + print 'Waiting...' + try: + time.sleep(wait_until - time.time()) + except IOError: + print "it's already too late"