99 lines
3.4 KiB
Python
99 lines
3.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
#
|
|
# ITerativ GmbH
|
|
# http://www.iterativ.ch/
|
|
#
|
|
# Copyright (c) 2019 ITerativ GmbH. All rights reserved.
|
|
#
|
|
# Created on 2019-10-08
|
|
# @author: chrigu <christian.cueni@iterativ.ch>
|
|
import graphene
|
|
from django.conf import settings
|
|
from graphene import relay
|
|
|
|
from core.hep_client import HepClient, HepClientException, HepClientUnauthorizedException
|
|
from core.views import SetPasswordView
|
|
from registration.models import License
|
|
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):
|
|
confirmation_key = kwargs.get('confirmationKey')
|
|
|
|
hep_client = HepClient()
|
|
|
|
try:
|
|
user_data = hep_client.customer_activate(confirmation_key)
|
|
except HepClientUnauthorizedException:
|
|
return cls.return_login_error('invalid_credentials')
|
|
except HepClientException:
|
|
return cls.return_login_error('unknown_error')
|
|
|
|
try:
|
|
user = User.objects.get(hep_id=user_data['id'])
|
|
except User.DoesNotExist:
|
|
user = User.objects.create_user_from_hep(user_data)
|
|
|
|
# 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()
|