from django.core.management.base import BaseCommand, CommandError from dokumente.models import Dokument from dokumente.docx_utils import build_standard_docx import os class Command(BaseCommand): help = 'Export a Dokument (or all active Dokumente) as Word (.docx) files' def add_arguments(self, parser): parser.add_argument( '--nummer', type=str, help='Document number to export (e.g. R0129). Omit to export all active documents.', ) parser.add_argument( '--output', type=str, default='.', help='Output directory (default: current directory)', ) def handle(self, *args, **options): output_dir = options['output'] os.makedirs(output_dir, exist_ok=True) if options['nummer']: try: dokumente = [Dokument.objects.prefetch_related( 'autoren', 'pruefende', 'vorgaben__thema', 'vorgaben__referenzen', 'vorgaben__checklistenfragen', 'vorgaben__vorgabekurztext_set__abschnitttyp', 'vorgaben__vorgabelangtext_set__abschnitttyp', 'geltungsbereich_set__abschnitttyp', 'einleitung_set__abschnitttyp', 'changelog__autoren', ).get(nummer=options['nummer'])] except Dokument.DoesNotExist: raise CommandError(f"Dokument with nummer '{options['nummer']}' not found.") else: dokumente = Dokument.objects.filter(aktiv=True).prefetch_related( 'autoren', 'pruefende', 'vorgaben__thema', 'vorgaben__referenzen', 'vorgaben__checklistenfragen', 'vorgaben__vorgabekurztext_set__abschnitttyp', 'vorgaben__vorgabelangtext_set__abschnitttyp', 'geltungsbereich_set__abschnitttyp', 'einleitung_set__abschnitttyp', 'changelog__autoren', ).order_by('nummer') for dokument in dokumente: doc = build_standard_docx(dokument) filename = os.path.join(output_dir, f'{dokument.nummer}.docx') doc.save(filename) self.stdout.write(self.style.SUCCESS(f'Exported {dokument.nummer} → {filename}'))