diff --git a/src/pretix/base/__init__.py b/src/pretix/base/__init__.py index 3017e2b18f..ccd0c92624 100644 --- a/src/pretix/base/__init__.py +++ b/src/pretix/base/__init__.py @@ -8,6 +8,7 @@ class PretixBaseConfig(AppConfig): def ready(self): from . import exporter # NOQA from . import payment # NOQA + from . import exporters # NOQA from .services import export, mail, tickets, cart, orders, cleanup # NOQA try: diff --git a/src/pretix/base/exporter.py b/src/pretix/base/exporter.py index 5f59a073e4..9566eada49 100644 --- a/src/pretix/base/exporter.py +++ b/src/pretix/base/exporter.py @@ -1,15 +1,5 @@ -import json -from collections import OrderedDict - -from django import forms -from django.core.serializers.json import DjangoJSONEncoder -from django.dispatch import receiver -from django.utils.translation import ugettext as _ from typing import Tuple -from pretix.base.models import Order -from pretix.base.signals import register_data_exporters - class BaseExporter: """ @@ -79,124 +69,3 @@ class BaseExporter: tasks. """ raise NotImplementedError() # NOQA - - -class JSONExporter(BaseExporter): - identifier = 'json' - verbose_name = 'JSON' - - def render(self, form_data): - jo = { - 'event': { - 'name': str(self.event.name), - 'slug': self.event.slug, - 'organizer': { - 'name': str(self.event.organizer.name), - 'slug': self.event.organizer.slug - }, - 'categories': [ - { - 'id': category.id, - 'name': str(category.name) - } for category in self.event.categories.all() - ], - 'items': [ - { - 'id': item.id, - 'name': str(item.name), - 'category': item.category_id, - 'price': item.default_price, - 'admission': item.admission, - 'active': item.active, - 'variations': [ - { - 'id': variation.id, - 'active': variation.active, - 'price': variation.default_price if variation.default_price is not None else item.default_price, - 'name': str(variation) - } for variation in item.variations.all() - ] - } for item in self.event.items.all().prefetch_related('variations') - ], - 'questions': [ - { - 'id': question.id, - 'question': str(question.question), - 'type': question.type - } for question in self.event.questions.all() - ], - 'orders': [ - { - 'code': order.code, - 'status': order.status, - 'user': order.email, - 'datetime': order.datetime, - 'payment_fee': order.payment_fee, - 'total': order.total, - 'positions': [ - { - 'id': position.id, - 'item': position.item_id, - 'variation': position.variation_id, - 'price': position.price, - 'attendee_name': position.attendee_name, - 'secret': position.secret, - 'answers': [ - { - 'question': answer.question_id, - 'answer': answer.answer - } for answer in position.answers.all() - ] - } for position in order.positions.all() - ] - } for order in - self.event.orders.all().prefetch_related('positions', 'positions__answers') - ], - 'quotas': [ - { - 'id': quota.id, - 'size': quota.size, - 'items': [item.id for item in quota.items.all()], - 'variations': [variation.id for variation in quota.variations.all()], - } for quota in self.event.quotas.all().prefetch_related('items', 'variations') - ] - } - } - - return 'pretixdata.json', 'application/json', json.dumps(jo, cls=DjangoJSONEncoder) - - -class MailExporter(BaseExporter): - identifier = 'mailaddrs' - verbose_name = _('Email addresses (text file)') - - def render(self, form_data: dict): - qs = self.event.orders.filter(status__in=form_data['status']) - addrs = qs.values('email') - data = "\r\n".join(set(a['email'] for a in addrs)) - return 'pretixemails.txt', 'text/plain', data.encode("utf-8") - - @property - def export_form_fields(self): - return OrderedDict( - [ - ('status', - forms.MultipleChoiceField( - label=_('Filter by status'), - initial=[Order.STATUS_PENDING, Order.STATUS_PAID], - choices=Order.STATUS_CHOICE, - widget=forms.CheckboxSelectMultiple, - required=False - )), - ] - ) - - -@receiver(register_data_exporters, dispatch_uid="exporter_json") -def register_json_export(sender, **kwargs): - return JSONExporter - - -@receiver(register_data_exporters, dispatch_uid="exporter_mail") -def register_mail_export(sender, **kwargs): - return MailExporter diff --git a/src/pretix/base/exporters/__init__.py b/src/pretix/base/exporters/__init__.py new file mode 100644 index 0000000000..aeb78729ed --- /dev/null +++ b/src/pretix/base/exporters/__init__.py @@ -0,0 +1,2 @@ +from .json import * # noqa +from .mail import * # noqa diff --git a/src/pretix/base/exporters/json.py b/src/pretix/base/exporters/json.py new file mode 100644 index 0000000000..9bb87b3db0 --- /dev/null +++ b/src/pretix/base/exporters/json.py @@ -0,0 +1,98 @@ +import json + +from django.core.serializers.json import DjangoJSONEncoder +from django.dispatch import receiver + +from ..exporter import BaseExporter +from ..signals import register_data_exporters + + +class JSONExporter(BaseExporter): + identifier = 'json' + verbose_name = 'JSON' + + def render(self, form_data): + jo = { + 'event': { + 'name': str(self.event.name), + 'slug': self.event.slug, + 'organizer': { + 'name': str(self.event.organizer.name), + 'slug': self.event.organizer.slug + }, + 'categories': [ + { + 'id': category.id, + 'name': str(category.name) + } for category in self.event.categories.all() + ], + 'items': [ + { + 'id': item.id, + 'name': str(item.name), + 'category': item.category_id, + 'price': item.default_price, + 'admission': item.admission, + 'active': item.active, + 'variations': [ + { + 'id': variation.id, + 'active': variation.active, + 'price': variation.default_price if variation.default_price is not None else + item.default_price, + 'name': str(variation) + } for variation in item.variations.all() + ] + } for item in self.event.items.all().prefetch_related('variations') + ], + 'questions': [ + { + 'id': question.id, + 'question': str(question.question), + 'type': question.type + } for question in self.event.questions.all() + ], + 'orders': [ + { + 'code': order.code, + 'status': order.status, + 'user': order.email, + 'datetime': order.datetime, + 'payment_fee': order.payment_fee, + 'total': order.total, + 'positions': [ + { + 'id': position.id, + 'item': position.item_id, + 'variation': position.variation_id, + 'price': position.price, + 'attendee_name': position.attendee_name, + 'secret': position.secret, + 'answers': [ + { + 'question': answer.question_id, + 'answer': answer.answer + } for answer in position.answers.all() + ] + } for position in order.positions.all() + ] + } for order in + self.event.orders.all().prefetch_related('positions', 'positions__answers') + ], + 'quotas': [ + { + 'id': quota.id, + 'size': quota.size, + 'items': [item.id for item in quota.items.all()], + 'variations': [variation.id for variation in quota.variations.all()], + } for quota in self.event.quotas.all().prefetch_related('items', 'variations') + ] + } + } + + return 'pretixdata.json', 'application/json', json.dumps(jo, cls=DjangoJSONEncoder) + + +@receiver(register_data_exporters, dispatch_uid="exporter_json") +def register_json_export(sender, **kwargs): + return JSONExporter diff --git a/src/pretix/base/exporters/mail.py b/src/pretix/base/exporters/mail.py new file mode 100644 index 0000000000..db0e4f58c5 --- /dev/null +++ b/src/pretix/base/exporters/mail.py @@ -0,0 +1,40 @@ +from collections import OrderedDict + +from django import forms +from django.dispatch import receiver +from django.utils.translation import ugettext as _ + +from ..exporter import BaseExporter +from ..models import Order +from ..signals import register_data_exporters + + +class MailExporter(BaseExporter): + identifier = 'mailaddrs' + verbose_name = _('Email addresses (text file)') + + def render(self, form_data: dict): + qs = self.event.orders.filter(status__in=form_data['status']) + addrs = qs.values('email') + data = "\r\n".join(set(a['email'] for a in addrs)) + return 'pretixemails.txt', 'text/plain', data.encode("utf-8") + + @property + def export_form_fields(self): + return OrderedDict( + [ + ('status', + forms.MultipleChoiceField( + label=_('Filter by status'), + initial=[Order.STATUS_PENDING, Order.STATUS_PAID], + choices=Order.STATUS_CHOICE, + widget=forms.CheckboxSelectMultiple, + required=False + )), + ] + ) + + +@receiver(register_data_exporters, dispatch_uid="exporter_mail") +def register_mail_export(sender, **kwargs): + return MailExporter