import graphene from graphene import relay from api.utils import get_errors, get_object from books.models import Module from books.schema.queries import ModuleNode class UpdateSolutionVisibility(relay.ClientIDMutation): class Input: slug = graphene.String() enabled = graphene.Boolean() success = graphene.Boolean() solutions_enabled = graphene.Boolean() errors = graphene.List(graphene.String) @classmethod def mutate_and_get_payload(cls, root, info, **args): try: slug = args.get('slug') enabled = args.get('enabled') user = info.context.user if 'users.can_manage_school_class_content' not in user.get_role_permissions(): raise PermissionError() module = Module.objects.get(slug=slug) if enabled: module.solutions_enabled_by.add(user) else: module.solutions_enabled_by.remove(user) module.save() return cls(success=True, solutions_enabled=enabled) except PermissionError: errors = ["You don't have the permission to do that."] except Exception as e: errors = ['Error: {}'.format(e)] return cls(success=False, solutions_enabled=None, errors=errors) class UpdateLastModule(relay.ClientIDMutation): class Input: # todo: use slug here too id = graphene.ID() module = graphene.Field(ModuleNode) errors = graphene.List(graphene.String) @classmethod def mutate_and_get_payload(cls, root, info, **args): try: user = info.context.user id = args.get('id') module = get_object(Module, id) if not module: raise Module.DoesNotExist user.last_module = module user.save() return cls(module=module) except Module.DoesNotExist: return cls(errors=['Module not found']) except Exception as e: errors = ['Error: {}'.format(e)] return cls(errors=errors)