Skip to content
Snippets Groups Projects
Commit c76ea69a authored by magicfelix's avatar magicfelix
Browse files

Add SendEventRegistrationMutation

parent 1fd9f0b8
No related branches found
No related tags found
1 merge request!78Resolve "Rewrite registration wizard"
Pipeline #195966 canceled
mutation sendOrder( mutation sendEventRegistration(
$event: ID! $event: ID!
$eventRegistration: EventRegistrationInputType! $eventRegistration: EventRegistrationInputType!
) { ) {
......
...@@ -4,22 +4,23 @@ import graphene ...@@ -4,22 +4,23 @@ import graphene
from graphene_django import DjangoObjectType from graphene_django import DjangoObjectType
from graphql import GraphQLError from graphql import GraphQLError
from aleksis.core.schema.base import FilterOrderList
from aleksis.core.util.core_helpers import get_site_preferences
from aleksis.apps.tezor.models.base import Client from aleksis.apps.tezor.models.base import Client
from aleksis.apps.tezor.models.invoice import InvoiceGroup from aleksis.apps.tezor.models.invoice import InvoiceGroup
from aleksis.apps.tezor.schema.client import PaymentVariantChoiceType from aleksis.apps.tezor.schema.client import PaymentVariantChoiceType
from aleksis.core.schema.base import FilterOrderList
from aleksis.core.util.core_helpers import get_site_preferences
from ..models import Event
from .checkpoint import CheckpointCheckInMutation from .checkpoint import CheckpointCheckInMutation
from .event import EventType from .event import EventType
from .event_additional_field import ( from .event_additional_field import (
EventAdditionalFieldBatchCreateMutation, EventAdditionalFieldBatchCreateMutation,
EventAdditionalFieldBatchDeleteMutation, EventAdditionalFieldBatchDeleteMutation,
EventAdditionalFieldBatchPatchMutation, EventAdditionalFieldBatchPatchMutation,
EventAdditionalFieldType EventAdditionalFieldType,
) )
from .event_registration import SendEventRegistrationMutation
from .terms import TermsType from .terms import TermsType
from ..models import Event
class Query(graphene.ObjectType): class Query(graphene.ObjectType):
...@@ -66,3 +67,5 @@ class Mutation(graphene.ObjectType): ...@@ -66,3 +67,5 @@ class Mutation(graphene.ObjectType):
create_event_additional_fields = EventAdditionalFieldBatchCreateMutation.Field() create_event_additional_fields = EventAdditionalFieldBatchCreateMutation.Field()
delete_event_additional_fields = EventAdditionalFieldBatchDeleteMutation.Field() delete_event_additional_fields = EventAdditionalFieldBatchDeleteMutation.Field()
update_event_additional_fields = EventAdditionalFieldBatchPatchMutation.Field() update_event_additional_fields = EventAdditionalFieldBatchPatchMutation.Field()
send_event_registration = SendEventRegistrationMutation.Field()
from django.contrib.auth.models import User
from django.utils.text import slugify
from django.utils.translation import gettext as _
import graphene import graphene
from graphene_django import DjangoObjectType 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.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 EventRegistration from ..models import Event, EventRegistration, Terms, Voucher
class EventRegistrationType(PermissionsTypeMixin, DjangoObjectType): class EventRegistrationType(PermissionsTypeMixin, DjangoObjectType):
...@@ -11,16 +22,165 @@ class EventRegistrationType(PermissionsTypeMixin, DjangoObjectType): ...@@ -11,16 +22,165 @@ class EventRegistrationType(PermissionsTypeMixin, DjangoObjectType):
model = EventRegistration 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): class EventRegistrationInputType(graphene.InputObjectType):
full_name = graphene.String(required=True) email = graphene.Field(MailAddressInputType, required=False)
email = graphene.String(required=True) person = graphene.Field(PersonInputType, required=False)
notes = graphene.String(required=False) user = graphene.Field(UserInputType, required=False)
shipping_option = graphene.ID(required=True) school = graphene.String(required=False)
payment_option = graphene.ID(required=True) school_place = graphene.String(required=False)
items = graphene.List(OrderItemInputType, required=True) school_class = graphene.String(required=False)
shipping_full_name = graphene.String(required=False) payment = graphene.Field(PaymentInputType, required=False)
second_address_row = graphene.String(required=False) medical_information = graphene.String(required=False)
street = graphene.String(required=False) comment = graphene.String(required=False)
housenumber = graphene.String(required=False) additional_fields = graphene.JSONString(required=False)
plz = graphene.String(required=False) terms = graphene.JSONString(required=False)
place = graphene.String(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)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment