Skip to content
Snippets Groups Projects
Select Git revision
  • 8756ce4204c6799a538d357b7d55d9a0b4a1bce8
  • main default protected
  • renovate/configure
  • placed_paid
4 results

tasks.py

Blame
  • Luca's avatar
    Luca authored and Felix Schäfer committed
    8756ce42
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    tasks.py 2.28 KiB
    import logging
    import requests
    from celery.exceptions import MaxRetriesExceededError
    from pretix.base.models import Order, OrderPosition
    from pretix.base.services.tasks import TransactionAwareProfiledEventTask
    from pretix.celery_app import app
    
    logger = logging.getLogger(__name__)
    
    
    @app.task(
        base=TransactionAwareProfiledEventTask,
        bind=True,
        max_retries=10,
        retry_backoff=True,
        retry_backoff_max=3600,
    )
    def keycloak_create_user(self, event: int, order: int, order_position: int):
        order_position = OrderPosition.objects.get(pk=order_position)
    
        username = order_position.meta_info_data.get("question_form_data", {}).get(
            "keycloak_create_user_keycloak_username"
        )
    
        if not username:
            return
    
        order = Order.objects.get(pk=order)
        server = event.settings.keycloak_create_user_realm_url
        token = event.settings.keycloak_create_user_authorization_token
        payload = {
            "username": username,
            "email": order_position.order.email,
            "enabled": True,
        }
    
        try:
            r = requests.post(
                "{}/users".format(server),
                headers={
                    "Authorization": "Bearer {}".format(token),
                },
                json=payload,
            )
            r.raise_for_status()
        except (requests.ConnectionError, requests.HTTPError) as e:
            if r.status_code in (400, 403):
                order.log_action(
                    "pretix_keycloak_create_user.error",
                    data={
                        "error": "HTTP Code {} ({})".format(
                            r.status_code, r.json()["error"]
                        ),
                    },
                )
            else:
                try:
                    if r.status_code == 429:
                        backoff = r.json()["retry_after_ms"] / 1000
                        self.retry(countdown=backoff)
                    else:
                        self.retry()
                except MaxRetriesExceededError:
                    order.log_action(
                        "pretix_keycloak_create_user.error",
                        data={
                            "error": "HTTP Code {}".format(r.status_code),
                        },
                    )
                    raise e
        else:
            order.log_action(
                "pretix_keycloak_create_user.created_user",
                data={"username": username},
            )