Newer
Older
from django.contrib.auth.models import User
from django.utils.text import slugify
from django.utils.translation import gettext as _
import graphene
from graphene_django import DjangoObjectType
from templated_email import send_templated_mail
from aleksis.apps.postbuero.models import MailAddress
from aleksis.apps.postbuero.schema import MailAddressInputType
from aleksis.core.models import Activity, Person
from aleksis.core.schema.base import PermissionsTypeMixin
from aleksis.core.schema.person import PersonInputType
from aleksis.core.schema.user import UserInputType
from aleksis.core.util.core_helpers import get_site_preferences
from ..models import Event, EventRegistration, Terms, Voucher
class EventRegistrationType(PermissionsTypeMixin, DjangoObjectType):
class Meta:
model = EventRegistration
class PaymentInputType(graphene.InputObjectType):
payment_method = graphene.String(required=True)
voucher_code = graphene.String(required=False)
amount = graphene.Int(required=True)
class EventRegistrationInputType(graphene.InputObjectType):
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
email = graphene.Field(MailAddressInputType, required=False)
person = graphene.Field(PersonInputType, required=False)
user = graphene.Field(UserInputType, required=False)
school = graphene.String(required=False)
school_place = graphene.String(required=False)
school_class = graphene.String(required=False)
payment = graphene.Field(PaymentInputType, required=False)
medical_information = graphene.String(required=False)
comment = graphene.String(required=False)
additional_fields = graphene.JSONString(required=False)
terms = graphene.JSONString(required=False)
retraction_consent = graphene.Boolean(required=True)
class SendEventRegistrationMutation(graphene.Mutation):
class Arguments:
event = graphene.ID(required=True)
event_registration = EventRegistrationInputType(required=True)
ok = graphene.Boolean()
def mutate(self, info, event: graphene.ID, event_registration: EventRegistrationInputType, **kwargs):
event = Event.objects.get(pk=event)
print(event_registration)
# Create user
if event_registration is not None:
user = User.objects.create(
username=event_registration["user"]["username"],
email=event_registration["user"]["email"],
)
user.set_password(event_registration["user"]["password"])
user.save()
else:
user = self.request.user
person, created = Person.objects.get_or_create(
user=user,
defaults={
"email": event_registration["person"]["email"],
"first_name": event_registration["person"]["first_name"],
"last_name": event_registration["person"]["last_name"],
},
)
# Store contact information in database
for field_name in ["date_of_birth", "sex", "address", "mobile_number"]:
if event_registration["person"] is not None and event_registration["person"][field_name] != "":
if field_name == "address":
for addr_field in ["street", "housenumber", "postal_code", "place"]:
setattr(person, addr_field, event_registration["person"]["address"][addr_field])
else:
setattr(person, field_name, event_registration["person"][field_name])
person.save()
if event_registration["person"] is not None:
for guardian_data in event_registration["person"]["guardians"]:
guardian, created = Person.objects.get_or_create(
defaults={
"mobile_number": guardian_data["mobile_number"],
},
first_name=guardian_data["first_name"],
last_name=guardian_data["last_name"],
email=guardian_data["email"],
)
person.guardians.add(guardian)
person.save()
if event_registration["email"] is not None:
_mail_address = MailAddress.objects.create(
local_part=event_registration["email"]["local_part"],
domain=event_registration["email"]["domain"],
)
_mail_address.person = person
_mail_address.save()
school_details = {}
for field_name in ["school", "school_class", "school_place"]:
if event_registration[field_name] is not None:
school_details[field_name] = event_registration[field_name]
registration = EventRegistration.objects.create(
managed_by_app_label="",
event=event,
person=person,
medical_information=event_registration["medical_information"],
**school_details,
)
for field in event.additional_fields.all():
registration.extended_data[
slugify(field.title).replace("-", "_")
] = event_registration["additional_fields"][field.title]
for field in event_registration["terms"]:
if not field.startswith("consent_"):
continue
pk = int(field.split("_")[1])
term = Terms.objects.get(id=pk)
registration.accepted_terms.add(term)
registration.cost = event.cost
if event.max_cost is not None and event.max_cost > 0:
amount = event_registration["payment"].amount
if amount < event.cost:
voucher_amount = event.cost - amount
discount = voucher_amount / event.cost
Voucher.objects.create(
person=person,
event=event,
used=True,
discount=discount,
)
elif amount > event.cost:
registration.donation = amount - event.cost
# TODO Implement existing voucher handling
invoice = registration.get_invoice()
invoice.variant = event_registration["payment"]["payment_method"]
invoice.save()
registration.save()
context = {}
context["registration"] = registration
# send_templated_mail(
# template_name="event_registered",
# from_email=get_site_preferences()["mail__address"],
# recipient_list=[get_site_preferences()["paweljong__event_notification_recipient"]],
# headers={
# "reply_to": [
# person.email,
# person.guardians.first().email,
# ],
# "X-Zammad-Customer-Email": person.email,
# },
# context=context,
# )
_act = Activity(
title=_("You registered for an event"),
description=_("You registered for the event %s" % event.display_name),
app="Paweljong",
user=person,
)
if event_registration["retraction_consent"]:
return SendEventRegistrationMutation(ok=True)
return SendEventRegistrationMutation(ok=False)