Add cli command to export a set of invoices or receipts by id
authorMagnus Hagander <magnus@hagander.net>
Wed, 19 Feb 2025 18:29:48 +0000 (19:29 +0100)
committerMagnus Hagander <magnus@hagander.net>
Wed, 19 Feb 2025 18:33:56 +0000 (19:33 +0100)
postgresqleu/invoices/management/commands/export_invoices.py [new file with mode: 0644]

diff --git a/postgresqleu/invoices/management/commands/export_invoices.py b/postgresqleu/invoices/management/commands/export_invoices.py
new file mode 100644 (file)
index 0000000..3182d12
--- /dev/null
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+#
+# Export invoices to PDF files
+#
+# Copyright (C) 2025, PostgreSQL Europe
+#
+from django.core.management.base import BaseCommand
+
+import base64
+import os
+import sys
+
+from postgresqleu.invoices.models import Invoice
+
+
+class Command(BaseCommand):
+    help = 'Export invoices by id'
+
+    def add_arguments(self, parser):
+        parser.add_argument('--invoice', action='store_true')
+        parser.add_argument('--receipt', action='store_true')
+        parser.add_argument('directory')
+        parser.add_argument('idlist', nargs='+', type=int)
+
+    def handle(self, *args, **options):
+        if not os.path.isdir(options['directory']):
+            print('{} is not a directory.'.format(options['directory']))
+            sys.exit(1)
+
+        if not (options['invoice'] or options['receipt']):
+            print("Must specify at least one of --invoice and --receipt")
+            sys.exit(1)
+
+        invoices = Invoice.objects.filter(id__in=options['idlist'])
+        if len(invoices) != len(options['idlist']):
+            # Missing some invoices!
+            print("Can't find invoices with ids {}".format(", ".join(
+                (str(i) for i in set(options['idlist']).difference(set([i.id for i in invoices])))
+            )))
+            sys.exit(1)
+
+        for i in invoices:
+            if options['invoice']:
+                with open(os.path.join(options['directory'], 'invoice_{}.pdf'.format(i.id)), 'wb') as f:
+                    f.write(base64.b64decode(i.pdf_invoice))
+            if options['receipt']:
+                with open(os.path.join(options['directory'], 'receipt_{}.pdf'.format(i.id)), 'wb') as f:
+                    f.write(base64.b64decode(i.pdf_receipt))
+
+        print("Exported {} invoices.".format(len(invoices)))