Snippets

Lucas Correia API Example - Create test project

Created by Lucas Correia
# :coding: utf-8
# :copyright: Copyright (c) 2020 ftrack
import logging
import random

import ftrack_api

logger = logging.getLogger('create_test_project')

COMMIT_BATCH_SIZE = 50


def create_item(session, entity_template, parent_id, context, counter=0):
    counter += 1
    if counter % COMMIT_BATCH_SIZE == 0:
        logger.info('Committing')
        session.commit()

    entity_type = entity_template['type']
    resolved_data = {}
    for key, value in entity_template['data'].iteritems():
        resolved_data[key] = value(context) if callable(value) else value

    if 'parent_id' in session.types[entity_type].attributes.keys():
        resolved_data['parent_id'] = parent_id

    if 'context_id' in session.types[entity_type].attributes.keys():
        resolved_data['context_id'] = parent_id

    if 'project_id' in session.types[entity_type].attributes.keys():
        resolved_data['project_id'] = context['project_id']

    logger.info('Creating entity {:03d}: {}'.format(counter, entity_type))
    entity = session.create(
        entity_type,
        resolved_data
    )

    parent_id = entity['id']
    for child_template in entity_template.get('children', []):
        for index in range(child_template.get('count', 1)):
            context['index'] = index
            counter = create_item(session, child_template, parent_id, context, counter)
    return counter


def create_project_structure(session, project, structure):
    entity_template = structure[0]
    parent_id = project['id']
    context = {
        'index': 1,
        'project_id': project['id'],
        'project': project,
        'project_schema': project['project_schema'],
        'task_type_ids': [
            entity['id'] for entity in project['project_schema'].get_types('Task')
        ],
        'task_status_ids': [
            entity['id'] for entity in project['project_schema'].get_statuses('Task', project['project_schema'].get_types('Task')[0])
        ]
    }
    counter = 0
    for index in range(entity_template.get('count', 1)):
        context['index'] = index
        counter = create_item(
            session,
            entity_template,
            parent_id,
            context,
            counter
        )

    session.commit()
    logger.info('Project creation complete: {}'.format(counter))



structure = [{
    'type': 'Episode',
    'count': 10,
    'data': {
        'name': lambda context: 'Episode {:02d}'.format(context['index']),
    },
    'children': [{
        'type': 'Shot',
        'count': 20,
        'data': {
            'name': lambda context: 'SH_{:02d}0'.format(context['index']),
        },
        'children': [{
            'type': 'Task',
            'count': 10,
            'data': {
                'name': lambda context: 'Task {:02d}'.format(context['index']),
                'type_id': lambda context: random.choice(
                    context['task_type_ids']
                ),
                'status_id': lambda context: random.choice(
                    context['task_status_ids']
                ),
            }
        }]
    }]
}]



if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    session = ftrack_api.Session()
    project = session.get('Project', '733617da-5c67-11ea-a34d-42290381088f')
    create_project_structure(
        session,
        project,
        structure
    )

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.