+
+ def print_guess(self, dry_run=True, force=False):
+ from collections import defaultdict
+ from pipes import quote
+ import re
+
+ def read_slug(slug):
+ res = []
+ res.append((re.compile(ur'__?(przedmowa)$'), -1))
+ res.append((re.compile(ur'__?(cz(esc)?|ksiega|rozdzial)__?(?P<n>\d*)$'), None))
+ res.append((re.compile(ur'__?(rozdzialy__?)?(?P<n>\d*)-'), None))
+
+ for r, default in res:
+ m = r.search(slug)
+ if m:
+ start = m.start()
+ try:
+ return int(m.group('n')), slug[:start]
+ except IndexError:
+ return default, slug[:start]
+ return None, slug
+
+ def file_to_title(fname):
+ """ Returns a title-like version of a filename. """
+ parts = (p.replace('_', ' ').title() for p in fname.split('__'))
+ return ' / '.join(parts)
+
+ merges = defaultdict(list)
+ slugs = []
+ for b in Book.objects.all():
+ slugs.append(b.slug)
+ n, ns = read_slug(b.slug)
+ if n is not None:
+ merges[ns].append((n, b))
+
+ conflicting_slugs = []
+ for slug in sorted(merges.keys()):
+ merge_list = sorted(merges[slug])
+ if len(merge_list) < 2:
+ continue
+
+ merge_slugs = [b.slug for i, b in merge_list]
+ if slug in slugs and slug not in merge_slugs:
+ conflicting_slugs.append(slug)
+
+ title = file_to_title(slug)
+ 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:')
+ else:
+ print self.style.ERROR('# ERROR: Conflicting slugs:')
+ for slug in conflicting_slugs:
+ print '#', slug
+
+