From b7754d8737fc1813a697a2b590220036c65095c6 Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Wed, 9 Sep 2020 16:19:12 +0200 Subject: [PATCH] Command line exporter: support multiple and all events (#1766) --- src/pretix/base/management/commands/export.py | 71 ++++++++++++++----- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/src/pretix/base/management/commands/export.py b/src/pretix/base/management/commands/export.py index b496cb0a12..4760a2d7bb 100644 --- a/src/pretix/base/management/commands/export.py +++ b/src/pretix/base/management/commands/export.py @@ -1,6 +1,7 @@ import json import sys +import pytz from django.core.management.base import BaseCommand from django.utils.timezone import override from django_scopes import scope @@ -8,45 +9,83 @@ from tqdm import tqdm from pretix.base.i18n import language from pretix.base.models import Event, Organizer -from pretix.base.signals import register_data_exporters +from pretix.base.signals import ( + register_data_exporters, register_multievent_data_exporters, +) class Command(BaseCommand): help = "Run an exporter to get data out of pretix" def add_arguments(self, parser): - parser.add_argument('organizer_slug', nargs=1, type=str) - parser.add_argument('event_slug', nargs=1, type=str) - parser.add_argument('export_provider', nargs=1, type=str) - parser.add_argument('output_file', nargs=1, type=str) + parser.add_argument('organizer_slug', type=str) + + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('event_slug', nargs="?", type=str) + group.add_argument('--all-events', action='store_true') + group.add_argument('--event_slugs', nargs="+", type=str) + + parser.add_argument('export_provider', type=str) + parser.add_argument('output_file', type=str) parser.add_argument('--parameters', action='store', type=str, help='JSON-formatted parameters') + parser.add_argument('--locale', action='store', type=str, help='...') + parser.add_argument('--timezone', action='store', type=str, help='...') def handle(self, *args, **options): try: - o = Organizer.objects.get(slug=options['organizer_slug'][0]) + o = Organizer.objects.get(slug=options['organizer_slug']) except Organizer.DoesNotExist: self.stderr.write(self.style.ERROR('Organizer not found.')) sys.exit(1) + locale = options.get("locale", None) + timezone = pytz.timezone(options['timezone']) if options.get('timezone') else None + with scope(organizer=o): - try: - e = o.events.get(slug=options['event_slug'][0]) - except Event.DoesNotExist: - self.stderr.write(self.style.ERROR('Event not found.')) - sys.exit(1) + if options['event_slug']: + try: + e = o.events.get(slug=options['event_slug']) + except Event.DoesNotExist: + self.stderr.write(self.style.ERROR('Event not found.')) + sys.exit(1) + if not locale: + locale = e.settings.locale + if not timezone: + timezone = e.settings.timezone + signal_result = register_data_exporters.send(e) + else: + e = o.events.all() + if options['event_slugs']: + e = e.filter(slug__in=options['event_slugs']) + not_found = set(options['event_slugs']).difference(event.slug for event in e) + if not_found: + self.stderr.write(self.style.ERROR('The following events were not found: {}'.format(", ".join(not_found)))) + sys.exit(1) + if not e.exists(): + self.stderr.write(self.style.ERROR('No events found.')) + sys.exit(1) + + if not locale: + locale = e.first().settings.locale + self.stderr.write(self.style.WARNING( + "Guessing locale '{}' based on event '{}'.".format(locale, e.first().slug))) + if not timezone: + timezone = e.first().settings.timezone + self.stderr.write(self.style.WARNING( + "Guessing timezone '{}' based on event '{}'.".format(timezone, e.first().slug))) + signal_result = register_multievent_data_exporters.send(o) pbar = tqdm(total=100) def report_status(val): pbar.update(round(val, 2) - pbar.n) - with language(e.settings.locale), override(e.settings.timezone): - responses = register_data_exporters.send(e) - for receiver, response in responses: + with language(locale), override(timezone): + for receiver, response in signal_result: ex = response(e, report_status) - if ex.identifier == options['export_provider'][0]: + if ex.identifier == options['export_provider']: params = json.loads(options.get('parameters') or '{}') - with open(options['output_file'][0], 'wb') as f: + with open(options['output_file'], 'wb') as f: try: ex.render(form_data=params, output_file=f) except TypeError: