예제 #1
0
from django import forms
from django.dispatch import receiver
from django.template.loader import get_template
from django.utils.translation import ugettext_lazy as _
from django.urls import resolve, reverse
from django_gravatar.helpers import get_gravatar_url
from pretix.base.signals import event_copy_data
from pretix.presale.signals import (question_form_fields, front_page_bottom,
                                    process_response, html_head)
from pretix.control.signals import nav_event_settings
from pretix.base.models import Order, OrderPosition, QuestionAnswer
from pretix.base.settings import settings_hierarkey

settings_hierarkey.add_default('public_registrations_items', [], list)
settings_hierarkey.add_default('public_registrations_questions', [], list)
settings_hierarkey.add_default('public_registrations_show_attendee_name',
                               False, bool)
settings_hierarkey.add_default('public_registrations_show_item_name', False,
                               bool)


@receiver(html_head, dispatch_uid="public_registrations_html_head")
def add_public_registrations_html_head(sender, request=None, **kwargs):
    url = resolve(request.path_info)
    if "event.index" not in url.url_name: return ""
    cached = sender.cache.get('public_registrations_html_head')
    if cached is None:
        cached = get_template("pretix_public_registrations/head.html").render()
    sender.cache.set('public_registrations_html_head', cached)
    return cached
예제 #2
0
        reverse(
            'plugins:pretix_stretchgoals:control',
            kwargs={
                'event': request.event.slug,
                'organizer': request.organizer.slug,
            },
        ),
        'active':
        url.namespace == 'plugins:pretix_stretchgoals',
    }]


@receiver(signal=event_copy_data, dispatch_uid="stretchgoals_copy_data")
def event_copy_data_receiver(sender, other, item_map, **kwargs):
    other.settings._h.add_type(
        QuerySet,
        lambda queryset: ','.join([str(element.pk) for element in queryset]),
        lambda pk_list: Item.objects.filter(pk__in=pk_list.split(',')
                                            if pk_list else []))
    initial_items = other.settings.get('stretchgoals_items',
                                       as_type=QuerySet) or []
    if isinstance(initial_items, str) and initial_items:
        initial_items = [int(i) for i in initial_items.split(',')]
    else:
        initial_items = [i.pk for i in initial_items]
    sender.settings.stretchgoals_items = ','.join(
        str(item_map.get(i).pk) for i in initial_items if i in item_map)


settings_hierarkey.add_default('stretchgoals_public_text', '', LazyI18nString)
예제 #3
0
        reverse('plugins:pretix_venueless:settings',
                kwargs={
                    'event': request.event.slug,
                    'organizer': request.organizer.slug,
                }),
        'active':
        url.namespace == 'plugins:pretix_venueless',
    }]


@receiver(signal=event_copy_data, dispatch_uid="venueless_event_copy_data")
def event_copy_data_r(sender, other, item_map, **kwargs):
    sender.settings['venueless_items'] = [
        item_map[item].pk
        for item in other.settings.get('venueless_items', default=[])
        if item in item_map
    ]


@receiver(signal=item_copy_data, dispatch_uid="venueless_item_copy_data")
def item_copy_data_r(sender, source, target, **kwargs):
    items = sender.settings.get('venueless_items') or []
    items.append(target.pk)
    sender.settings['venueless_items'] = items


settings_hierarkey.add_default('venueless_start', None, RelativeDateWrapper)
settings_hierarkey.add_default('venueless_allow_pending', 'False', bool)
settings_hierarkey.add_default('venueless_all_items', 'True', bool)
settings_hierarkey.add_default('venueless_items', '[]', list)
예제 #4
0
        'failed':
        _('Payment failed.'),
        'paid':
        _('Payment succeeded.'),
        'expired':
        _('Payment expired.'),
        'disabled':
        _('Payment method disabled since we were unable to refresh the access token. Please '
          'contact support.'),
    }
    text = plains.get(logentry.action_type[20:], None)
    if text:
        return _('Mollie reported an event: {}').format(text)


settings_hierarkey.add_default('payment_mollie_method_cc', True, bool)


@receiver(register_global_settings, dispatch_uid='mollie_global_settings')
def register_global_settings(sender, **kwargs):
    return OrderedDict([
        ('payment_mollie_connect_client_id',
         forms.CharField(
             label=_('Mollie Connect: Client ID'),
             required=False,
             validators=(MollieKeyValidator('app_'), ),
         )),
        ('payment_mollie_connect_client_secret',
         forms.CharField(
             label=_('Mollie Connect: Client secret'),
             required=False,
예제 #5
0
        return {}
    return {
        'ml_newsletter':
        forms.BooleanField(
            label=rich_text_snippet(sender.settings.newsletter_ml_text),
            required=False,
        )
    }


@receiver(signal=logentry_display,
          dispatch_uid="newsletter_ml_logentry_display")
def pretixcontrol_logentry_display(sender, logentry, **kwargs):
    if not logentry.action_type.startswith('pretix_newsletter_ml'):
        return

    plains = {
        'pretix_newsletter_ml.subscribe':
        _("A subscribe request for the mailing list has been sent."),
    }

    if logentry.action_type in plains:
        return plains[logentry.action_type]


settings_hierarkey.add_default(
    'newsletter_ml_text',
    LazyI18nString.from_gettext(
        gettext_noop("Yes, I want to receive the organizer's newsletter")),
    LazyI18nString)
예제 #6
0
    if logentry.action_type == "pretix_vacc_autosched.created":
        url = reverse(
            "control:event.order",
            kwargs={
                "event": d.get("event_slug"),
                "organizer": logentry.organizer.slug,
                "code": d.get("order"),
            },
        )
        return mark_safe(
            _("This order has been scheduled as the second dose for order {order}"
              ).format(order='<a href="{}">{}</a>'.format(url,
                                                          d.get("order")), ))


settings_hierarkey.add_default("vacc_autosched_mail", False, bool)
settings_hierarkey.add_default("vacc_autosched_self_service", False, bool)
settings_hierarkey.add_default(
    "vacc_autosched_self_service_info",
    "",
    LazyI18nString,
)
settings_hierarkey.add_default(
    "vacc_autosched_self_service_order_info",
    "",
    LazyI18nString,
)
settings_hierarkey.add_default(
    "vacc_autosched_subject",
    LazyI18nString.from_gettext(
        gettext_noop("Your second dose: {scheduled_datetime}")),
예제 #7
0
        ]

    fee_percent = sender.settings.get('service_fee_percent', as_type=Decimal)
    if fee_percent:
        fees = fees + ['{} % {}'.format(fee_percent, gettext('per order'))]

    if fee_per_ticket or fee_abs or fee_percent:
        return '<p>%s</p>' % gettext(
            'A service fee of {} will be added on top of each order.').format(
                ' {} '.format(gettext('plus')).join(fees))


@receiver(order_meta_from_request, dispatch_uid="servicefees_order_meta")
def order_meta_signal(sender: Event, request: HttpRequest, **kwargs):
    meta = {}
    try:
        from pretix_resellers.utils import ResellerException, get_reseller_and_user
    except ImportError:
        pass
    else:
        try:
            reseller, user = get_reseller_and_user(request)
            meta['servicefees_reseller_id'] = reseller.pk
        except ResellerException:
            pass
    return meta


settings_hierarkey.add_default('service_fee_skip_addons', 'True', bool)
settings_hierarkey.add_default('service_fee_skip_free', 'True', bool)
예제 #8
0
            data['data']['object']['failure_message'])
    elif event_type == 'charge.dispute.created':
        text = _('Dispute created. Reason: {}').format(
            data['data']['object']['reason'])
    elif event_type == 'charge.dispute.updated':
        text = _('Dispute updated. Reason: {}').format(
            data['data']['object']['reason'])
    elif event_type == 'charge.dispute.closed':
        text = _('Dispute closed. Status: {}').format(
            data['data']['object']['status'])

    if text:
        return _('Stripe reported an event: {}').format(text)


settings_hierarkey.add_default('payment_stripe_method_cc', True, bool)
settings_hierarkey.add_default('payment_stripe_cc_3ds_mode', 'recommended',
                               str)


@receiver(register_global_settings, dispatch_uid='stripe_global_settings')
def register_global_settings(sender, **kwargs):
    return OrderedDict([
        ('payment_stripe_connect_client_id',
         forms.CharField(
             label=_('Stripe Connect: Client ID'),
             required=False,
             validators=(StripeKeyValidator('ca_'), ),
         )),
        ('payment_stripe_connect_secret_key',
         forms.CharField(
예제 #9
0
from pretix.base.signals import logentry_display, logentry_object_link, order_paid
from pretix.control.signals import nav_event, nav_event_settings, order_search_forms
from pretix.presale.signals import order_info, order_info_top

from .utils import get_valid_swap_types

BOOLEAN_SETTINGS = [
    "swap_orderpositions",
    "swap_orderpositions_specific",
    "cancel_orderpositions",
    "cancel_orderpositions_specific",
    "cancel_orderpositions_verified_only",
]

for settings_name in BOOLEAN_SETTINGS:
    settings_hierarkey.add_default(settings_name, "False", bool)
settings_hierarkey.add_default("swap_cancellation_fee", "0.00", Decimal)


@receiver(nav_event_settings, dispatch_uid="swap_nav_settings")
def navbar_settings(sender, request, **kwargs):
    url = resolve(request.path_info)
    return [{
        "label":
        "Swap",
        "icon":
        "random",
        "url":
        reverse(
            "plugins:pretix_swap:settings",
            kwargs={
예제 #10
0
from pretix.base.services.mail import render_mail
from pretix.base.settings import settings_hierarkey
from pretix.base.signals import order_canceled, order_changed, order_paid, order_placed
from pretix.control.signals import nav_event_settings

TWILIO_TEMPLATES = [
    "twilio_text_signature",
    "twilio_text_order_placed",
    "twilio_text_order_free",
    "twilio_text_order_changed",
    "twilio_text_order_canceled",
    "twilio_text_order_paid",
]

for settings_name in TWILIO_TEMPLATES:
    settings_hierarkey.add_default(settings_name, "", LazyI18nString)


@receiver(nav_event_settings, dispatch_uid="twilio_nav_settings")
def navbar_settings(sender, request, **kwargs):
    url = resolve(request.path_info)
    return [{
        "label":
        "Twilio",
        "url":
        reverse(
            "plugins:pretix_twilio:settings",
            kwargs={
                "event": request.event.slug,
                "organizer": request.organizer.slug,
            },
예제 #11
0
import logging
from collections import OrderedDict

from django.dispatch import receiver
from pretix.base.settings import settings_hierarkey
from pretix.base.signals import (
    register_global_settings,
    register_payment_providers,
)

from .formfields.settings import get_settings_form_fields

logger = logging.getLogger(__name__)


@receiver(register_payment_providers, dispatch_uid="payment_qpaypro")
def register_payment_provider(sender, **kwargs):
    from .payment import (QPayProSettingsHolder, QPayProCC,
                          QPayProVisaEnCuotas)

    return [QPayProSettingsHolder, QPayProCC, QPayProVisaEnCuotas]


settings_hierarkey.add_default('payment_qpaypro_method_creditcard', True, bool)


@receiver(register_global_settings, dispatch_uid='qpaypro_global_settings')
def register_global_setting(sender, **kwargs):
    return OrderedDict(
        get_settings_form_fields('payment_qpaypro_general_', False))
예제 #12
0
                   f.xmldata)

    def shred_data(self):
        self.event.sepa_exports.update(xmldata="<shredded></shredded>")


@receiver(register_data_shredders, dispatch_uid="sepadebit_shredders")
def register_shredder(sender, **kwargs):
    return [
        PaymentLogsShredder,
    ]


settings_hierarkey.add_default(
    "payment_sepadebit_pre_notification_mail_subject",
    LazyI18nString.from_gettext(
        gettext_noop("Upcomming debit of {debit_amount_with_currency}")),
    LazyI18nString,
)

settings_hierarkey.add_default(
    "payment_sepadebit_pre_notification_mail_body",
    LazyI18nString.from_gettext(
        gettext_noop(
            "Hello,\n\n"
            "you ordered a ticket for {event}.\n\n"
            "We will debit your bank account {iban} on or shortly after {due_date}. The payment will appear on your bank statement as {creditor_name} with reference {reference} and creditor identifier {creditor_id}.\n\n"
            "You can change your order details and view the status of your order at\n"
            "{url}\n\n"
            "Best regards,\n"
            "Your {event} team")),
    LazyI18nString,
예제 #13
0
from django.dispatch import receiver
from django.utils.translation import gettext_noop
from i18nfield.strings import LazyI18nString
from rest_framework import serializers

from pretix.base.settings import settings_hierarkey
from pretix.base.signals import register_payment_providers, api_event_settings_fields


@receiver(register_payment_providers, dispatch_uid="payment_cash")
def register_payment_provider(sender, **kwargs):
    from .payment import CashPayment
    return CashPayment


@receiver(api_event_settings_fields,
          dispatch_uid="cashpayment_api_event_settings_fields")
def api_event_settings_fields(sender, **kwargs):
    return {
        'payment_cashpayment__enabled':
        serializers.BooleanField(required=False),
    }


settings_hierarkey.add_default(
    'payment_cashpayment_information_text',
    LazyI18nString.from_gettext(
        gettext_noop("You can pay your order by cash at the venue.")),
    LazyI18nString)
예제 #14
0
    if event_type in plains:
        text = plains[event_type]
    elif event_type == 'charge.failed':
        text = _('Charge failed. Reason: {}').format(data['data']['object']['failure_message'])
    elif event_type == 'charge.dispute.created':
        text = _('Dispute created. Reason: {}').format(data['data']['object']['reason'])
    elif event_type == 'charge.dispute.updated':
        text = _('Dispute updated. Reason: {}').format(data['data']['object']['reason'])
    elif event_type == 'charge.dispute.closed':
        text = _('Dispute closed. Status: {}').format(data['data']['object']['status'])

    if text:
        return _('Stripe reported an event: {}').format(text)


settings_hierarkey.add_default('payment_stripe_method_cc', True, bool)
settings_hierarkey.add_default('payment_stripe_cc_3ds_mode', 'recommended', str)


@receiver(register_global_settings, dispatch_uid='stripe_global_settings')
def register_global_settings(sender, **kwargs):
    return OrderedDict([
        ('payment_stripe_connect_client_id', forms.CharField(
            label=_('Stripe Connect: Client ID'),
            required=False,
            validators=(
                StripeKeyValidator('ca_'),
            ),
        )),
        ('payment_stripe_connect_secret_key', forms.CharField(
            label=_('Stripe Connect: Secret key'),
예제 #15
0

@receiver(register_mail_placeholders, dispatch_uid="cwa_mail_placeholders")
def base_placeholders(sender, **kwargs):
    ph = [
        SimpleFunctionalMailTextPlaceholder(
            "cwa_url",
            ["event", "position"],
            lambda event, position: generate_url(event, position.subevent)[0],
            lambda event: generate_url(event, event.subevents.first())[0],
        ),
    ]
    return ph


settings_hierarkey.add_default("cwa_mode", "daily", str)
settings_hierarkey.add_default("cwa_default_length", None, int)
settings_hierarkey.add_default("cwa_location_type", "0", str)
settings_hierarkey.add_default("cwa_checkin_email", "True", bool)
settings_hierarkey.add_default(
    "cwa_checkin_email_subject",
    LazyI18nString.from_gettext(
        gettext_noop("Welcome! Remember to check in with Corona Warn App")),
    LazyI18nString,
)
settings_hierarkey.add_default(
    "cwa_checkin_email_body",
    LazyI18nString.from_gettext(
        gettext_noop(
            "Hello,\n\n"
            "now that you've arrived, we kindly ask you to check in with Corona Warn App by clicking the following link:\n\n"
예제 #16
0
    if event_type in plains:
        text = plains[event_type]
    elif event_type == 'charge.failed':
        text = _('Charge failed. Reason: {}').format(data['data']['object']['failure_message'])
    elif event_type == 'charge.dispute.created':
        text = _('Dispute created. Reason: {}').format(data['data']['object']['reason'])
    elif event_type == 'charge.dispute.updated':
        text = _('Dispute updated. Reason: {}').format(data['data']['object']['reason'])
    elif event_type == 'charge.dispute.closed':
        text = _('Dispute closed. Status: {}').format(data['data']['object']['status'])

    if text:
        return _('Stripe reported an event: {}').format(text)


settings_hierarkey.add_default('payment_stripe_method_cc', True, bool)
settings_hierarkey.add_default('payment_stripe_reseller_moto', False, bool)


@receiver(register_global_settings, dispatch_uid='stripe_global_settings')
def register_global_settings(sender, **kwargs):
    return OrderedDict([
        ('payment_stripe_connect_client_id', forms.CharField(
            label=_('Stripe Connect: Client ID'),
            required=False,
            validators=(
                StripeKeyValidator('ca_'),
            ),
        )),
        ('payment_stripe_connect_secret_key', SecretKeySettingsField(
            label=_('Stripe Connect: Secret key'),
예제 #17
0
def periodic_task(sender, **kwargs):
    Event_SettingsStore = get_model('pretixbase',
                                    'Event_SettingsStore')  # NoQA
    events = list(
        Event.objects.filter(
            id__in=Event_SettingsStore.objects.filter(
                key='pretix_atfconsent_checkinlist',
                value__isNull=False).values_list('object_id', flat=True),
            plugins__contains='pretix_atfconsent',
        ).values_list('pk', flat=True))

    for eventpk in events:
        consent_to_checkin.apply(args=(eventpk, ))


settings_hierarkey.add_default('pretix_atfconsent_enabled', False, bool)
settings_hierarkey.add_default(
    'pretix_atfconsent_explanation',
    LazyI18nString.from_gettext(
        gettext_noop(
            "Due to the evolving nature of our event, the following information was not yet available at the time "
            "when you registered for this event.\r\n"
            "\r\n"
            "Please take a moment of your time to read through the provided information and confirm that you agree "
            "with the posted information.\r\n"
            "\r\n"
            "Should you not agree with the conditions outlined, we will unfortunately have to cancel your. In this case "
            "you will be provided with a full refund.\r\n"
            "\r\n"
            "If you would like to actively dispute the conditions below and not wait for us to cancel your order due to "
            "non-agreement of the conditions outlined below, feel free to contact us directly at any time."
예제 #18
0
    from .payment import (SaferpayBancontact, SaferpayBanktransfer, SaferpayCC,
                          SaferpayEPS, SaferpayGiropay, SaferpayIdeal,
                          SaferpayPaydirekt, SaferpayPayPal,
                          SaferpayPostfinanceCard, SaferpayPostfinanceEfinance,
                          SaferpaySepadebit, SaferpaySettingsHolder,
                          SaferpaySofort)

    return [
        SaferpayBancontact, SaferpayBanktransfer, SaferpayCC, SaferpayEPS,
        SaferpayGiropay, SaferpayIdeal, SaferpayPaydirekt, SaferpayPayPal,
        SaferpayPostfinanceCard, SaferpayPostfinanceEfinance,
        SaferpaySepadebit, SaferpaySettingsHolder, SaferpaySofort
    ]


@receiver(signal=logentry_display, dispatch_uid="saferpay_logentry_display")
def pretixcontrol_logentry_display(sender, logentry, **kwargs):
    if not logentry.action_type.startswith('pretix_saferpay.event'):
        return

    plains = {
        'paid': _('Payment captured.'),
        'authorized': _('Payment authorized.'),
    }
    text = plains.get(logentry.action_type[22:], None)
    if text:
        return _('Saferpay reported an event: {}').format(text)


settings_hierarkey.add_default('payment_saferpay_method_cc', True, bool)
예제 #19
0
    if logentry.action_type == "pretix_vacc_autosched.created":
        url = reverse(
            "control:event.order",
            kwargs={
                "event": d.get("event_slug"),
                "organizer": logentry.organizer.slug,
                "code": d.get("order"),
            },
        )
        return mark_safe(
            _("This order has been scheduled as the second dose for order {order}"
              ).format(order='<a href="{}">{}</a>'.format(url,
                                                          d.get("order")), ))


settings_hierarkey.add_default("vacc_autosched_mail", False, bool)
settings_hierarkey.add_default(
    "vacc_autosched_subject",
    LazyI18nString.from_gettext(
        gettext_noop("Your second dose: {scheduled_datetime}")),
    LazyI18nString,
)
settings_hierarkey.add_default(
    "vacc_autosched_body",
    LazyI18nString.from_gettext(
        gettext_noop(
            "Hello,\n\n"
            "we scheduled your second dose for {scheduled_datetime}.\n\n"
            "Please find additional information in your ticket attached.\n\n"
            "Best regards,\n"
            "Your {event} team")),
예제 #20
0
    # ops = OrderPosition.objects.filter(meta_info__contains='"googlepaypass"')
    # for op in ops:
    #     comms = Comms(op.event.settings.get('googlepaypasses_credentials'))
    #     meta_info = json.loads(op.meta_info or '{}')
    #     object_id = meta_info['googlepaypass']
    #
    #     item = comms.get_item(ObjectType.eventTicketObject, object_id)
    #
    #     if item and not item['hasUsers']:
    #         tasks.shred_object(op.pk)

    return


settings_hierarkey.add_default(
    'ticketoutput_googlepaypasses_disclaimer_text',
    LazyI18nString.from_gettext(ugettext_noop(
        "Please be aware, that contrary to other virtual wallets/passes (like Apple Wallet), Google Pay Passes are not "
        "handled offline. Every pass that is created, has to be transmitted to Google Inc.\r\n"
        "\r\n"
        "By clicking the **Save to phone**-button below, we will transfer some of your personal information, which is "
        "necessary to provide you with your Google Pay Pass, to Google Inc.\r\n"
        "\r\n"
        "Please be aware, that there is no way to delete the data, once it has been transmitted.\r\n"
        "\r\n"
        "However we will anonymize all passes that are not linked to a device on a regular, best effort basis. While "
        "this will remove your personal information from the pass, we cannot guarantee that Google is not keeping a "
        "history of the previous passes.")),
    LazyI18nString
)
예제 #21
0
    plains = {
        "pretix_newsletter_manual.request": _(
            "A newsletter subscription has been requested."
        ),
    }

    if logentry.action_type in plains:
        return plains[logentry.action_type]


@receiver(register_data_exporters, dispatch_uid="newsletter_manual_exporters")
def register_data_exporter(sender, **kwargs):
    return RequestListExporter


@receiver(
    register_multievent_data_exporters, dispatch_uid="newsletter_manual_exporters_multi"
)
def register_data_exporter_multi(sender, **kwargs):
    return RequestListExporter


settings_hierarkey.add_default(
    "newsletter_manual_text",
    LazyI18nString.from_gettext(
        ugettext_noop("Yes, I want to receive the organizer's newsletter")
    ),
    LazyI18nString,
)