-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathmutations.py
More file actions
76 lines (60 loc) · 2.62 KB
/
mutations.py
File metadata and controls
76 lines (60 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from urllib.parse import urljoin
from api.context import Info
from privacy_policy.record import record_privacy_policy_acceptance
import strawberry
from django.conf import settings
from api.permissions import IsAuthenticated
from api.pretix.types import CreateOrderErrors, CreateOrderInput
from conferences.models.conference import Conference
from pretix import create_order
from pretix.exceptions import PretixError
from billing.models import BillingAddress as BillingAddressModel
@strawberry.type
class CreateOrderResult:
payment_url: str
@strawberry.type
class Error:
message: str
@strawberry.type
class OrdersMutations:
@strawberry.mutation(permission_classes=[IsAuthenticated])
def create_order(
self, info: Info, conference: str, input: CreateOrderInput
) -> CreateOrderResult | CreateOrderErrors:
conference_obj = Conference.objects.get(code=conference)
if errors := input.validate(conference_obj):
return errors
BillingAddressModel.objects.update_or_create(
user=info.context.request.user,
organizer_id=conference_obj.organizer_id,
is_business=input.invoice_information.is_business,
defaults={
"company_name": input.invoice_information.company,
"user_given_name": input.invoice_information.given_name,
"user_family_name": input.invoice_information.family_name,
"zip_code": input.invoice_information.zipcode,
"city": input.invoice_information.city,
"address": input.invoice_information.street,
"country": input.invoice_information.country,
"vat_id": input.invoice_information.vat_id,
"fiscal_code": input.invoice_information.fiscal_code or "",
"sdi": input.invoice_information.sdi or "",
"pec": input.invoice_information.pec or "",
},
)
try:
pretix_order = create_order(conference_obj, input)
except PretixError as e:
return CreateOrderErrors.with_error("non_field_errors", str(e))
record_privacy_policy_acceptance(
info.context.request, conference_obj, "checkout-order"
)
return_url = urljoin(
settings.FRONTEND_URL,
f"/{input.locale}/orders/{pretix_order.code}/confirmation",
)
if pretix_order.payment_url is None:
return CreateOrderResult(payment_url=return_url)
payment_url = pretix_order.payment_url
payment_url += f"?return_url={return_url}"
return CreateOrderResult(payment_url=payment_url)