def mutate_and_get_payload(cls,
                               root,
                               info,
                               owner,
                               labbook_name,
                               description_content,
                               client_mutation_id=None):
        username = get_logged_in_username()
        lb = LabBook(author=get_logged_in_author())
        lb.from_name(username, owner, labbook_name)
        lb.description = description_content

        with lb.lock_labbook():
            lb.git.add(os.path.join(lb.root_dir, '.gigantum/labbook.yaml'))
            commit = lb.git.commit('Updating description')

            # Create detail record
            adr = ActivityDetailRecord(ActivityDetailType.LABBOOK, show=False)
            adr.add_value('text/plain', "Updated description of LabBook")

            # Create activity record
            ar = ActivityRecord(ActivityType.LABBOOK,
                                message="Updated description of LabBook",
                                linked_commit=commit.hexsha,
                                tags=["labbook"],
                                show=False)
            ar.add_detail_object(adr)

            # Store
            ars = ActivityStore(lb)
            ars.create_activity_record(ar)
        return SetLabbookDescription(success=True)
def savehook(username, owner, labbook_name):
    try:
        redis_conn = redis.Redis(db=1)
        lb_key = '-'.join(
            ['gmlb', username, owner, labbook_name, 'jupyter-token'])
        changed_file = request.args.get('file')
        jupyter_token = request.args.get('jupyter_token')
        logger.info(
            f"Received save hook for {changed_file} in {username}/{owner}/{labbook_name}"
        )
        r = redis_conn.get(lb_key.encode())
        if r is None:
            logger.error(f"Could not find redis key `{lb_key}`")
            abort(400)
        if r.decode() != jupyter_token:
            raise ValueError("Incoming jupyter token must match key in Redis")
        lb = LabBook(author=get_logged_in_author())
        lb.from_name(username, owner, labbook_name)
        logger.info(f"Jupyter save hook saving {changed_file} from {str(lb)}")
        with lb.lock_labbook():
            lb.sweep_uncommitted_changes()
        return 'success'
    except Exception as err:
        logger.error(err)
        return abort(400)