skillbox/server/users/mutations_public.py

110 lines
3.6 KiB
Python

# -*- coding: utf-8 -*-
#
# ITerativ GmbH
# http://www.iterativ.ch/
#
# Copyright (c) 2019 ITerativ GmbH. All rights reserved.
#
# Created on 2019-10-01
# @author: chrigu <christian.cueni@iterativ.ch>
import graphene
from django.conf import settings
from django.contrib.auth import authenticate, login
from graphene import relay
from core.hep_client import HepClient, HepClientUnauthorizedException, HepClientException
from registration.models import License
from users.models import MagentoToken, User, Role, UserRole, SchoolClass
class LoginError(graphene.ObjectType):
field = graphene.String()
class Login(relay.ClientIDMutation):
class Input:
username_input = graphene.String()
password_input = graphene.String()
success = graphene.Boolean()
errors = graphene.List(LoginError) # todo: change for consistency
@classmethod
def mutate_and_get_payload(cls, root, info, **kwargs):
username = kwargs.get('username_input')
if settings.USE_LOCAL_REGISTRATION:
password = kwargs.get('password_input')
user = authenticate(username=username, password=password)
if user is None:
return cls.return_login_error('invalid_credentials')
else:
hep_client = HepClient()
token = kwargs.get('token')
try:
user_data = hep_client.customer_me(token)
except HepClientUnauthorizedException:
return cls.return_login_error('invalid_credentials')
except HepClientException:
return cls.return_login_error('unknown_error')
try:
user = User.objects.get(email=username)
except User.DoesNotExist:
user = User.objects.create_user_from_hep(user_data)
#todo is this needed?
magento_token, created = MagentoToken.objects.get_or_create(user=user)
magento_token.token = token
magento_token.save()
try:
if not hep_client.is_email_verified(user_data):
return cls.return_login_error('email_not_verified')
except HepClientException:
return cls.return_login_error('unknown_error')
try:
license = License.objects.get(licensee=user)
# Todo how handle invalid license? Cron Job? How to select correct license? Save all licenses? History?
except License.DoesNotExist:
try:
product = hep_client.myskillbox_product_for_customer(settings.HEP_ADMIN_TOKEN, user.hep_id)
except HepClientException:
return cls.return_login_error('unknown_error')
if product:
license = License.objects.create_license_for_role(user, product['activated'],
product['raw'], product['edition'])
# todo handle no license case
else:
return cls.return_login_error('no_valid_license')
UserRole.objects.create_role_for_user(user, license.for_role.key)
if license.for_role.key == Role.objects.TEACHER_KEY:
SchoolClass.create_default_group_for_teacher(user)
if not license.is_valid():
return cls.return_login_error('no_valid_license')
login(info.context, user)
return cls(success=True, errors=[])
@classmethod
def return_login_error(cls, message):
error = LoginError(field=message)
return cls(success=False, errors=[error])
class UserMutations:
login = Login.Field()