Mike 10 Posted June 22, 2016 Report Share Posted June 22, 2016 - I'm trying to get the create folder example working in my current project, but I'm getting this error: register() takes no arguments (1 given) - I know that when the register() method is defined it should be written like this: def register(self ): etc... - However, there doesn't seem to be a register method being declared within the CreateFoldersAction class. Does this method get inherited from ftrack.Action? -Also, I haven't made any changes to the code and I've set up my hierarchy like so: Thanks! Link to post Share on other sites
Mike 10 Posted June 22, 2016 Author Report Share Posted June 22, 2016 I fixed the error by going inside templates.py and changing def register(): to def register(self): Action isn't working right now though, still looking into that. Link to post Share on other sites
Mike 10 Posted June 30, 2016 Author Report Share Posted June 30, 2016 I still can't get this action to work. I want this action to also work in connect, so I'm trying to translate it into a connect action. Here's a list of issues: 1) I'm having a lot of trouble with figuring out how to get the 'prefix' data from my location. I have the location plugin working (I can see that it's creating the location in the web app settings) and I gave it a DiskAccessor on a local server. I'm just not sure how to get location data from the event. I know there's a command, get_file_system_path, but the examples I've seen require a component to get the path. Also, I can query a location by hard-coding the name into the query, but I'd like to know if there is a more procedural method. 2) No matter where I put this block of code... # Discover templates. templatesPath = os.path.abspath( os.path.join(os.path.dirname(__file__), 'templates') ) templates = lucidity.discover_templates(paths=[templatesPath]) It causes a login error for ftrack. The lucidity package is installed and imports into the module. Here's my hook so far: import os import logging import ftrack import ftrack_api import lucidity mb_log = os.getenv('MB_LOG_DIR') logger = logging.getLogger() handler = logging.FileHandler('%s/action.log' % mb_log) formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) class CreateFoldersAction(object): '''Custom action.''' label = '_Create Folders' identifier = 'mb.create.folder.action' description = 'Creates local serverside master directory of selection' icon = 'http://i.imgur.com/oTRLLtD.png' def __init__( self, session, #prefix, #templates ): '''Initialise action.''' super(CreateFoldersAction, self).__init__() self.session = session #self.templates = templates logger.info('Create folders init') def register(self): '''Register action.''' self.session.event_hub.subscribe( 'topic=ftrack.action.discover and source.user.username={0}'.format( self.session.api_user ), self.discover ) self.session.event_hub.subscribe( 'topic=ftrack.action.launch and data.actionIdentifier={0} and ' 'source.user.username={1}'.format( self.identifier, self.session.api_user ), self.launch ) def discover(self, event): '''Discover the action.''' selection = event['data'].get('selection', []) logger.info(u'Selection entity: {0}'.format(selection)) if len(selection) != 1: return # Validate selection for item in selection: logger.info(u'Validating entity: {0}'.format(item)) # Entities in the project hierarchy are valid, unless they are leafs # (ObjectType is Task) if item.get('entityType') == 'task': entity = ftrack.Task(item.get('entityId')) if not entity or entity.getObjectType() == 'Task': return #elif item.get('entityType') == 'show': # continue # Something invalid encountered, return no actions. else: return return { 'items': [{ 'label': self.label, 'description': self.description, 'actionIdentifier': self.identifier, 'icon': self.icon }] } def launch(self, event): '''Callback method for custom action.''' selection = event['data'].get('selection', []) logger.info(u'Selection create folders: {0}'.format(selection)) for item in selection: entity = ftrack.Task(item.get('entityId')) logger.info(u'Creating folders for: {0}'.format(entity)) self.createFoldersFromEntity(entity) location = self.session.query("Location where name is my.location") logger.info(u'Location create folders: {0}'.format(location)) return { 'success': True, 'message': 'Creating folders...' } def createFoldersFromEntity(self, entity): '''Generate folder structure from *entity*. Entity is assumed to be either a project, episode, sequence or shot. ''' # Get all shots on the entity. shots = entity.getChildren('Shot', depth=None) # Loop over all shots and generate the data that should be passed to the # templates. for shot in shots: data = { 'project': { 'name': entity.getProject().get('name') }, 'shot': { 'name': shot.get('name') } } # Pass the data to each template and create the folders unless they # already exist. for template in self.templates: try: templatePath = template.format(data) except lucidity.error.FormatError: print('Not enough information provided for this template.') continue # Raise error if path is absolute since it will not be joined # with prefix correctly. if os.path.isabs(templatePath): raise ValueError('Template path should be relative.') fullPath = os.path.join(self.prefix, templatePath) try: os.makedirs(fullPath) except OSError as error: if error.errno != errno.EEXIST: raise def register(session, **kw): '''Register plugin.''' # Validate that session is an instance of ftrack_api.Session. If not, # assume that register is being called from an incompatible API # and return without doing anything. if not isinstance(session, ftrack_api.Session): # Exit to avoid registering this plugin again. return logger.info('Registering create folders action') ## Discover templates. #templatesPath = os.path.abspath( # os.path.join(os.path.dirname(__file__), 'templates') #) #templates = lucidity.discover_templates(paths=[templatesPath]) action = CreateFoldersAction( session, #prefix, #templates ) action.register() logger.info('Registered create folders action: {0}'.format(action)) if __name__ == '__main__': session = ftrack_api.Session() register(session) # Wait for events. session.event_hub.wait() Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now