import graphene from django.contrib.auth import update_session_auth_hash from graphene import relay from users.inputs import PasswordUpdateInput from users.serializers import PasswordSerialzer class FieldError(graphene.ObjectType): code = graphene.String() class UpdateError(graphene.ObjectType): field = graphene.String() errors = graphene.List(FieldError) class UpdatePassword(relay.ClientIDMutation): class Input: password_input = graphene.Argument(PasswordUpdateInput) success = graphene.Boolean() errors = graphene.List(UpdateError) @classmethod def mutate_and_get_payload(cls, root, info, **kwargs): user = info.context.user password_data = kwargs.get('password_input') serializer = PasswordSerialzer(data=password_data, context=user) if serializer.is_valid(): user.set_password(password_data['new_password']) user.save() update_session_auth_hash(info.context, user) return cls(success=True) errors = [] for key, value in serializer.errors.items(): error = UpdateError(field=key, errors=[]) for field_error in serializer.errors[key]: error.errors.append(FieldError(code=field_error.code)) errors.append(error) return cls(success=False, errors=errors) class ProfileMutations: update_password = UpdatePassword.Field()