Skip to content
Snippets Groups Projects
signals.py 3.4 KiB
Newer Older
Luca's avatar
Luca committed
import json
from django import forms
from django.dispatch import receiver
from django.urls import resolve, reverse
from django.utils.translation import gettext_noop, ugettext_lazy as _
from i18nfield.strings import LazyI18nString
from pretix.base.settings import settings_hierarkey
from pretix.base.signals import (
    order_modified,
    order_placed,
)
from pretix.base.templatetags.rich_text import rich_text_snippet
from pretix.control.signals import nav_event_settings
from pretix.presale.signals import question_form_fields

from .tasks import keycloak_create_user

settings_hierarkey.add_default("keycloak_create_user_items", [], list)
settings_hierarkey.add_default("keycloak_create_user_authorization_token", "", str)
settings_hierarkey.add_default("keycloak_create_user_realm_url", "", str)
settings_hierarkey.add_default(
    "keycloak_create_user_hint",
    LazyI18nString.from_gettext(
        gettext_noop("Your keycloak user will be created.")
    ),
    LazyI18nString,
)
settings_hierarkey.add_default(
    "keycloak_create_user_reason",
    "",
    LazyI18nString,
)


@receiver(question_form_fields, dispatch_uid="keycloak_create_user_questions")
def add_keycloak_username_question(sender, position, **kwargs):
    if str(position.item.pk) not in sender.settings.get("keycloak_create_user_items"):
        return {}

    if (
        not sender.settings.keycloak_create_user_authorization_token
        and not sender.settings.keycloak_create_user_realm_url
    ):
        return {}

    return {
        "keycloak_create_user_keycloak_username": forms.RegexField(
            label=_("Username"),
            required=False,
            regex="[a-z0-9._=/-]+",
            strip=True,
            error_messages={
                "invalid": _("Enter a valid username")
            },
            help_text=rich_text_snippet(sender.settings.keycloak_create_user_hint),
        )
    }


@receiver(order_placed, dispatch_uid="keycloak_create_user_order_placed")
@receiver(order_modified, dispatch_uid="keycloak_create_user_order_modified")
def keycloak_create_user_create_async(sender, order, **kwargs):
    if (
        not sender.settings.keycloak_create_user_authorization_token
        and not sender.settings.keycloak_create_user_realm_url
    ):
        return

    for order_position in order.positions.all():
        if str(order_position.item.pk) not in sender.settings.get(
            "keycloak_create_user_items"
        ):
            continue

        if not order_position.meta_info_data.get("question_form_data", {}).get(
            "keycloak_create_user_keycloak_username"
        ):
            continue

        keycloak_create_user.apply_async(
                args=(
                    sender.pk,
                    order.pk,
                    order_position.pk
                )
            )


@receiver(nav_event_settings, dispatch_uid="keycloak_create_user_keycloak_username_nav_settings")
def navbar_settings(sender, request=None, **kwargs):
    url = resolve(request.path_info)
    return [
        {
            "label": _("Create User"),
            "url": reverse(
                "plugins:pretix_keycloak_create_user:settings",
                kwargs={
                    "event": request.event.slug,
                    "organizer": request.organizer.slug,
                },
            ),
            "active": url.namespace == "plugins:pretix_keycloak_create_user"
            and url.url_name == "settings",
        }
    ]