# -*- coding: utf-8 -*- # # ITerativ GmbH # http://www.iterativ.ch/ # # Copyright (c) 2019 ITerativ GmbH. All rights reserved. # # Created on 2019-10-08 # @author: chrigu import graphene from django.conf import settings from graphene import relay from core.hep_client import HepClient, HepClientException from core.views import SetPasswordView from registration.models import License from registration.serializers import RegistrationSerializer from users.models import User, Role, UserRole, SchoolClass class PublicFieldError(graphene.ObjectType): code = graphene.String() class MutationError(graphene.ObjectType): field = graphene.String() errors = graphene.List(PublicFieldError) class Registration(relay.ClientIDMutation): class Input: firstname_input = graphene.String() lastname_input = graphene.String() email_input = graphene.String() license_key_input = graphene.String() success = graphene.Boolean() errors = graphene.List(MutationError) # todo: change for consistency @classmethod def mutate_and_get_payload(cls, root, info, **kwargs): first_name = kwargs.get('firstname_input') last_name = kwargs.get('lastname_input') email = kwargs.get('email_input') license_key = kwargs.get('license_key_input') registration_data = { 'first_name': first_name, 'last_name': last_name, 'email': email, 'license_key': license_key, } serializer = RegistrationSerializer(data=registration_data) if serializer.is_valid(): if settings.USE_LOCAL_REGISTRATION: return cls.create_local_user(serializer, info) else: hep_client = HepClient() try: email_available = hep_client.is_email_available(serializer['email']) except HepClientException: # Todo: handle error from exception (set on object, code & message) return cls(success=False, errors=None) if not email_available: errors = [MutationError(field='email', errors=['already_exists'])] return cls(success=False, errors=errors) try: response = hep_client.customer_create(serializer.data, None) except HepClientException: # Todo: handle error from exception (set on object, code & message) return cls(success=False, errors=None) # create or update local user # show verfiy page errors = [] for key, value in serializer.errors.items(): error = MutationError(field=key, errors=[]) for field_error in serializer.errors[key]: error.errors.append(PublicFieldError(code=field_error.code)) errors.append(error) return cls(success=False, errors=errors) @classmethod def create_local_user(cls, serializer, info): user = User.objects.create_user_with_random_password(serializer.data['first_name'], serializer.data['last_name'], serializer.data['email']) sb_license = License.objects.create(licensee=user, license_type=serializer.context['license_type']) if sb_license.license_type.is_teacher_license(): teacher_role = Role.objects.get(key=Role.objects.TEACHER_KEY) UserRole.objects.get_or_create(user=user, role=teacher_role) default_class_name = SchoolClass.generate_default_group_name() default_class = SchoolClass.objects.create(name=default_class_name) user.school_classes.add(default_class) else: student_role = Role.objects.get(key=Role.objects.STUDENT_KEY) UserRole.objects.get_or_create(user=user, role=student_role) password_reset_view = SetPasswordView() password_reset_view.request = info.context form = password_reset_view.form_class({'email': user.email}) if not form.is_valid(): return cls(success=False, errors=form.errors) password_reset_view.form_valid(form) return cls(success=True) class RegistrationMutations: registration = Registration.Field()