Snippets

Lucas Correia API Example - Create test project

Created by Lucas Correia

File create_test_project.py Added

  • Ignore whitespace
  • Hide word diff
+# :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
+    )
HTTPS SSH

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