56 lines
2.3 KiB
Python
56 lines
2.3 KiB
Python
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}'))
|