X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/5913c54d19b8f6775633176032161d49f9b2f1aa..6b0f855c770066db9b5b3fa11a9af64c4b8c60bd:/src/catalogue/management/commands/merge_books.py diff --git a/src/catalogue/management/commands/merge_books.py b/src/catalogue/management/commands/merge_books.py index 82bd622d..cebf73bc 100644 --- a/src/catalogue/management/commands/merge_books.py +++ b/src/catalogue/management/commands/merge_books.py @@ -1,6 +1,6 @@ -# -*- coding: utf-8 -*- - -from optparse import make_option +# This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# import sys from django.contrib.auth.models import User @@ -24,23 +24,28 @@ def common_prefix(texts): class Command(BaseCommand): - option_list = BaseCommand.option_list + ( - make_option('-s', '--slug', dest='new_slug', metavar='SLUG', - help='New slug of the merged book (defaults to common part of all slugs).'), - make_option('-t', '--title', dest='new_title', metavar='TITLE', - help='New title of the merged book (defaults to common part of all titles).'), - make_option('-q', '--quiet', action='store_false', dest='verbose', default=True, - help='Less output'), - make_option('-g', '--guess', action='store_true', dest='guess', default=False, - help='Try to guess what merges are needed (but do not apply them).'), - make_option('-d', '--dry-run', action='store_true', dest='dry_run', default=False, - help='Dry run: do not actually change anything.'), - make_option('-f', '--force', action='store_true', dest='force', default=False, - help='On slug conflict, hide the original book to archive.'), - ) help = 'Merges multiple books into one.' args = '[slug]...' + def add_arguments(self, parser): + self.add_argument( + '-s', '--slug', dest='new_slug', metavar='SLUG', + help='New slug of the merged book (defaults to common part of all slugs).') + self.add_argument( + '-t', '--title', dest='new_title', metavar='TITLE', + help='New title of the merged book (defaults to common part of all titles).') + self.add_argument( + '-q', '--quiet', action='store_false', dest='verbose', default=True, + help='Less output') + self.add_argument( + '-g', '--guess', action='store_true', dest='guess', default=False, + help='Try to guess what merges are needed (but do not apply them).') + self.add_argument( + '-d', '--dry-run', action='store_true', dest='dry_run', default=False, + help='Dry run: do not actually change anything.') + self.add_argument( + '-f', '--force', action='store_true', dest='force', default=False, + help='On slug conflict, hide the original book to archive.') def print_guess(self, dry_run=True, force=False): from collections import defaultdict @@ -49,9 +54,9 @@ class Command(BaseCommand): def read_slug(slug): res = [] - res.append((re.compile(ur'__?(przedmowa)$'), -1)) - res.append((re.compile(ur'__?(cz(esc)?|ksiega|rozdzial)__?(?P\d*)$'), None)) - res.append((re.compile(ur'__?(rozdzialy__?)?(?P\d*)-'), None)) + res.append((re.compile(r'__?(przedmowa)$'), -1)) + res.append((re.compile(r'__?(cz(esc)?|ksiega|rozdzial)__?(?P\d*)$'), None)) + res.append((re.compile(r'__?(rozdzialy__?)?(?P\d*)-'), None)) for r, default in res: m = r.search(slug) @@ -87,20 +92,20 @@ class Command(BaseCommand): conflicting_slugs.append(slug) title = file_to_title(slug) - print "./manage.py merge_books %s%s--title=%s --slug=%s \\\n %s\n" % ( + print("./manage.py merge_books %s%s--title=%s --slug=%s \\\n %s\n" % ( '--dry-run ' if dry_run else '', '--force ' if force else '', quote(title), slug, " \\\n ".join(merge_slugs) - ) + )) if conflicting_slugs: if force: - print self.style.NOTICE('# These books will be archived:') + print(self.style.NOTICE('# These books will be archived:')) else: - print self.style.ERROR('# ERROR: Conflicting slugs:') + print(self.style.ERROR('# ERROR: Conflicting slugs:')) for slug in conflicting_slugs: - print '#', slug + print('#', slug) def handle(self, *slugs, **options): @@ -116,13 +121,13 @@ class Command(BaseCommand): if guess: if slugs: - print "Please specify either slugs, or --guess." + print("Please specify either slugs, or --guess.") return else: self.print_guess(dry_run, force) return if not slugs: - print "Please specify some book slugs" + print("Please specify some book slugs") return # Start transaction management. @@ -147,13 +152,13 @@ class Command(BaseCommand): if dry_run and verbose: - print self.style.NOTICE('DRY RUN: nothing will be changed.') - print + print(self.style.NOTICE('DRY RUN: nothing will be changed.')) + print() if verbose: - print "New title:", self.style.NOTICE(new_title) - print "New slug:", self.style.NOTICE(new_slug) - print + print("New title:", self.style.NOTICE(new_title)) + print("New slug:", self.style.NOTICE(new_slug)) + print() for i, book in enumerate(books): chunk_titles = [] @@ -172,12 +177,12 @@ class Command(BaseCommand): chunk_slugs.append(new_chunk_slug) if verbose: - print "title: %s // %s -->\n %s // %s\nslug: %s / %s -->\n %s / %s" % ( + print("title: %s // %s -->\n %s // %s\nslug: %s / %s -->\n %s / %s" % ( book.title, chunk.title, new_title, new_chunk_title, book.slug, chunk.slug, - new_slug, new_chunk_slug) - print + new_slug, new_chunk_slug)) + print() if not dry_run: try: @@ -193,9 +198,9 @@ class Command(BaseCommand): # FIXME: there still may be a conflict conflict.slug = '.' + conflict.slug conflict.save() - print self.style.NOTICE('Book with slug "%s" moved to "%s".' % (new_slug, conflict.slug)) + print(self.style.NOTICE('Book with slug "%s" moved to "%s".' % (new_slug, conflict.slug))) else: - print self.style.ERROR('ERROR: Book with slug "%s" exists.' % new_slug) + print(self.style.ERROR('ERROR: Book with slug "%s" exists.' % new_slug)) return if i: