mirror of
https://github.com/pretix/pretix.git
synced 2026-05-07 15:34:02 +00:00
119 lines
4.5 KiB
Python
119 lines
4.5 KiB
Python
from rest_framework import serializers
|
|
from rest_framework.reverse import reverse
|
|
|
|
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
|
from pretix.base.models import (
|
|
Checkin, Invoice, InvoiceAddress, InvoiceLine, Order, OrderPosition,
|
|
QuestionAnswer,
|
|
)
|
|
from pretix.base.signals import register_ticket_outputs
|
|
|
|
|
|
class InvoiceAdddressSerializer(I18nAwareModelSerializer):
|
|
class Meta:
|
|
model = InvoiceAddress
|
|
fields = ('last_modified', 'company', 'name', 'street', 'zipcode', 'city', 'country', 'vat_id')
|
|
|
|
|
|
class AnswerSerializer(I18nAwareModelSerializer):
|
|
class Meta:
|
|
model = QuestionAnswer
|
|
fields = ('question', 'answer', 'options')
|
|
|
|
|
|
class CheckinSerializer(I18nAwareModelSerializer):
|
|
class Meta:
|
|
model = Checkin
|
|
fields = ('datetime',)
|
|
|
|
|
|
class OrderDownloadsField(serializers.Field):
|
|
def to_representation(self, instance: Order):
|
|
if instance.status != Order.STATUS_PAID:
|
|
return []
|
|
|
|
request = self.context['request']
|
|
res = []
|
|
responses = register_ticket_outputs.send(instance.event)
|
|
for receiver, response in responses:
|
|
provider = response(instance.event)
|
|
if provider.is_enabled:
|
|
res.append({
|
|
'output': provider.identifier,
|
|
'url': reverse('api-v1:order-download', kwargs={
|
|
'organizer': instance.event.organizer.slug,
|
|
'event': instance.event.slug,
|
|
'code': instance.code,
|
|
'output': provider.identifier,
|
|
}, request=request)
|
|
})
|
|
return res
|
|
|
|
|
|
class PositionDownloadsField(serializers.Field):
|
|
def to_representation(self, instance: OrderPosition):
|
|
if instance.order.status != Order.STATUS_PAID:
|
|
return []
|
|
if instance.addon_to_id and not instance.order.event.settings.ticket_download_addons:
|
|
return []
|
|
if not instance.item.admission and not instance.order.event.settings.ticket_download_nonadm:
|
|
return []
|
|
|
|
request = self.context['request']
|
|
res = []
|
|
responses = register_ticket_outputs.send(instance.order.event)
|
|
for receiver, response in responses:
|
|
provider = response(instance.order.event)
|
|
if provider.is_enabled:
|
|
res.append({
|
|
'output': provider.identifier,
|
|
'url': reverse('api-v1:orderposition-download', kwargs={
|
|
'organizer': instance.order.event.organizer.slug,
|
|
'event': instance.order.event.slug,
|
|
'pk': instance.pk,
|
|
'output': provider.identifier,
|
|
}, request=request)
|
|
})
|
|
return res
|
|
|
|
|
|
class OrderPositionSerializer(I18nAwareModelSerializer):
|
|
checkins = CheckinSerializer(many=True)
|
|
answers = AnswerSerializer(many=True)
|
|
downloads = PositionDownloadsField(source='*')
|
|
order = serializers.SlugRelatedField(slug_field='code', read_only=True)
|
|
|
|
class Meta:
|
|
model = OrderPosition
|
|
fields = ('id', 'order', 'positionid', 'item', 'variation', 'price', 'attendee_name', 'attendee_email',
|
|
'voucher', 'tax_rate', 'tax_value', 'secret', 'addon_to', 'checkins', 'downloads', 'answers')
|
|
|
|
|
|
class OrderSerializer(I18nAwareModelSerializer):
|
|
invoice_address = InvoiceAdddressSerializer()
|
|
positions = OrderPositionSerializer(many=True)
|
|
downloads = OrderDownloadsField(source='*')
|
|
|
|
class Meta:
|
|
model = Order
|
|
fields = ('code', 'status', 'secret', 'email', 'locale', 'datetime', 'expires', 'payment_date',
|
|
'payment_provider', 'payment_fee', 'payment_fee_tax_rate', 'payment_fee_tax_value',
|
|
'total', 'comment', 'invoice_address', 'positions', 'downloads')
|
|
|
|
|
|
class InlineInvoiceLineSerializer(I18nAwareModelSerializer):
|
|
class Meta:
|
|
model = InvoiceLine
|
|
fields = ('description', 'gross_value', 'tax_value', 'tax_rate')
|
|
|
|
|
|
class InvoiceSerializer(I18nAwareModelSerializer):
|
|
order = serializers.SlugRelatedField(slug_field='code', read_only=True)
|
|
refers = serializers.SlugRelatedField(slug_field='invoice_no', read_only=True)
|
|
lines = InlineInvoiceLineSerializer(many=True)
|
|
|
|
class Meta:
|
|
model = Invoice
|
|
fields = ('order', 'invoice_no', 'is_cancellation', 'invoice_from', 'invoice_to', 'date', 'refers', 'locale',
|
|
'introductory_text', 'additional_text', 'payment_provider_text', 'footer_text', 'lines')
|