Select Git revision
0057_upgrades.py
Forked from
KIF / AKPlanning
Source project has a limited visibility.
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},
)