-def get_entity(entityId, entityType):
- '''Return entity based on *entityId* and *entityType*.'''
+import ftrack_action_handler.action
- if entityType == ftrack.Project._type:
- entity = ftrack.Project(entityId)
- elif entityType == ftrack.Task._type:
- entity = ftrack.Task(entityId)
- elif entityType == 'assetversion':
- entity = ftrack.AssetVersion(entityId)
- u'Entity ({0}, {1}) not a valid type, skipping..'
- .format(entityId, entityType)
-class EditMetaData(ftrack.Action):
+class EditMetaData(ftrack_action_handler.action.BaseAction):
+ '''Edit meta data action.'''
identifier = 'ftrack.edit.meta.data'
- def discover(self, event):
- '''Return if action is valid.'''
- selection = event['data']['selection']
+ description = 'Edit meta data on entity'
- # If selection contains more than one item return early since
- # metadata cannot be edited for several entites at the same time.
- self.logger.info('Got selection: {0}'.format(selection))
- if (len(selection) != 1):
+ def validate_selection(self, session, entities):
+ '''Return if *entities* is a valid selection.'''
+ if (len(entities) != 1):
+ # If entities contains more than one item return early since
+ # metadata cannot be edited for several entites at the same time.
- selection[0]['entityId'], selection[0]['entityType']
+ entity_type, entity_id = entities[0]
+ entity_type not in session.types or
+ 'metadata' not in session.types[entity_type].attributes.keys()
+ # Return False if the target entity does not have a metadata
- 'actionIdentifier': self.identifier
- def launch(self, event):
- '''Launch edit meta data action.'''
- selection = event['data']['selection']
+ def discover(self, session, entities, event):
+ '''Return True if action is valid.'''
+ self.logger.info('Got selection: {0}'.format(entities))
+ return self.validate_selection(session, entities)
+ def interface(self, session, entities, event):
+ '''Return interface.'''
+ values = event['data'].get('values', {})
+ entity_type, entity_id = entities[0]
+ entity = session.get(entity_type, entity_id)
+ # Refresh metadata collection.
+ session.populate(entity, 'metadata.key, metadata.value')
+ for key, value in entity['metadata'].items():
+ 'value': '*No metadata found on entity.*'
+ def launch(self, session, entities, event):
+ '''Launch edit meta data action.'''
input_values = event['data']['values']
- selection[0]['entityId'], selection[0]['entityType']
+ entity_type, entity_id = entities[0]
+ entity = session.get(entity_type, entity_id)
- for key in input_values.keys():
- entity.setMeta(key, input_values[key])
- metaKeys = entity.metaKeys()
+ for key, value in input_values.items():
+ if entity['metadata'][key] != value:
+ # Only update if changed.
+ entity['metadata'][key] = value
- for metaKey in metaKeys:
- 'value': entity.getMeta(metaKey)
- 'value': '*No metadata found on entity.*'
+ # Commit failed, rollback session and re-raise.
-def register(registry, **kw):
- '''Register action. Called when used as an event plugin.'''
- logger = logging.getLogger(
- 'ftrack.edit.meta.data'
+def register(session, **kw):
+ '''Register plugin. Called when used as an plugin.'''
- # Validate that registry is an instance of ftrack.Registry. If not,
- # assume that register is being called from a new or incompatible API and
+ # Validate that session is an instance of ftrack_api.Session. If not,
+ # assume that register is being called from an old or incompatible API and
# return without doing anything.
- if not isinstance(registry, ftrack.Registry):
- 'Not subscribing plugin as passed argument {0!r} is not an '
- 'ftrack.Registry instance.'.format(registry)
+ if not isinstance(session, ftrack_api.session.Session):
- action = EditMetaData()
+ action_handler = EditMetaData(session)
+ action_handler.register()
def main(arguments=None):
logging.basicConfig(level=loggingLevels[namespace.verbosity])
- action = EditMetaData()
+ session = ftrack_api.Session()
- ftrack.EVENT_HUB.wait()
+ 'Registered actions and listening for events. Use Ctrl-C to abort.'
+ session.event_hub.wait()
if __name__ == '__main__':