Search the Community

Showing results for tags 'action'.

More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


  • Company news
    • General announcements
  • ftrack Studio (main app)
    • General discussion
    • Feature requests
    • API
    • Help
    • Actions and Widgets
    • ftrack Go
  • ftrack Review
    • General discussion
    • Feature requests
    • Help
  • Connect and plugins
    • General discussion
    • Connect package releases
    • Feature requests
    • Help
    • Connect plugins releases
  • Advisory Forum
  • Tech preview
    • API
    • New integrations
    • Studio overview
    • ftrack Review


There are no results to display.

Find results in...

Find results that contain...

Date Created

  • Start


Last Updated

  • Start


Filter by number of...


  • Start





Website URL







Found 13 results

  1. Hi, I'm trying to create an Action to launch a tree widget similar to the one used to create Links between Objects. This is to help me copy Task structure from another Project. I tried querying all descendant items from a Project but it's taking a little bit of time and the Links widget seems to be pretty fast and is structured in a hierarchy. I couldn't find any straight answer to use a widget with Python Actions. If it can't be done this way, is there any other way to copy structure? Because we do it so often it would be easier to have a quick shortcut without going back and forth. Task Templates is not helping much since it seems to create only Tasks without any hierarchy.
  2. Hello, I'm new to Ftrack and I'm trying to write an action that displays info about what is selected (type, name, id etc). Mainly this is for us developers because I couldn't see a way to see the id of an object on the web front end. The problem I'm having is that whatever I select returns task as the entityType, whether it is a task or not. If you then query the session with the correct type and the entityId, you get a result otherwise you get None. My workaround for this would be to query every type until I got a result but in order to that I need a list of object types. How can I get that? Thanks, Dan
  3. Hey there! I'm hoping to get an example/explanation of this Tip on I input the same label and set the "variant" attribute on 2 of my actions to different strings, but there are still 2 icons appearing, labeled with the same name. What is the actual outcome of this when done correctly? Is there an example you can provide so I can troubleshoot what I'm doing wrong? Thanks!
  4. Hi! can i use some action for compliting tasks after approved minestone? i have some tasks that connect with minestone. all tasks Completed, before starting minestone. i need to have some action or something else, that will change status of all connecting tasks to "Clients approved" after approving minestone. Thank you! P.S. i'm from STB, ukrainian TV-Channel
  5. After the action deletes the objects, the page needs to be reloaded in order to get the right view is there a way to auto refresh the site?
  6. Hi, I've created an event listener to require comments when logging time on certain tasks, and thought I should share it with the community. It shows the usage of triggering and handling an actions UI based on an event. Please let me know if you have any comments or feedback. You can find the snippet on bitbucket. Event listener: Require timelog comments The event listener can be used to require comments when logging time against certain tasks from the ftrack interface. The event listener will trigger an Action UI to require timelog comments if the custom attribute require_comments is set on the timelog context. Configuration You can configure the following in the script: REQUIRE_COMMENTS_ATTRIBUTE The name of the custom attribute, that can be used to control if a task requires timelog comments. Running the event listener You can run the event listener from the command line:: python You can also register the event listener as a plugin. For more information, see the links below. Read more Find more information in our documentation: * Developing: Events * Event: Action - trigger interface * Event: Update * Tracking time * Python API: Configuring plugins * Python API: Environment variables
  7. Hi, i run in strange issue lately. During setup of new Action somehow happens, that one version of this action "baked", sorry for this expression, but i cant find better. This ghost action appears, even if there is no ftrack-connect running. At first I thought that it was just duplicated action, caused by wrong register setup (the action appears twice). But after i renamed label, it stayed there with previous name. Everybody sees this non-existing action, even with no ftrack-connect running (in that case this is the only available action). It obviously starts my old code, but the script file itself no longer exists on the server. If i run ftrack-connect with console, every action is properly registered and there is no mention about this "ghost" action. Is there anyway how to discover from where this action is coming? Is there any kind of cache of actions directly in the ftrack-web (i mean on website)? For example where is stored "Recent" actions? Do you have any idea what happend? Thank you for any help
  8. Hi all, I created an action with a form to let user change some options. It is working fine BUT I would like to set a default value for an enum field and don't see how in the doc. If it is not possible I would like to indicate a required field to the user... Here is the data I send to ftrack for creating the form: ```'items': [ {'value': '## You are about to ship the list: {} ##'.format(flist.getName()), 'type': 'label'}, {'label': 'Action', 'type': 'enumerator', 'name': 'action', 'data': [ {'label': 'Export 1', 'value': 'myval1'}, {'label': 'Export 2', 'value': 'myval2'} ]}, ], ``` Thanks for any help, Jerome
  9. I have written a custom action to upload a reference movie clip to a shot in ftrack. Once the action is launched, it creates a movie from images on disk and then uploads this movie as an attachment to the shot. After the action is launched, the movie creation and upload runs asynchronously. What's the best way to give feedback to the user regarding the asynchronous processes? I can output messages to the terminal, but an artist may not look at their terminal or even have it open. How can I do I give feedback in the ftrack web UI? Thanks, Natasha
  10. Mike

    Unreal Engine action

    I'm messing around with connect and I'm finally getting some things to work, like launching Houdini. That tutorial was great because it showed the structure so I was able to just plop it in my project and it worked. I was then able to follow through the doc guide and change things around to see how it was all working. I'd like to go a step further and try to apply what I've learned so I can launch Unreal Engine 4 (UE4). I don't have any real plans or needs for totally integrating it into ftrack, I'd just like to see if I can launch it. Here is my project hierarchy right now. I'd like to consolidate it a bit more, but whenever I move a module everything ends up breaking. Here is what I have to launch unreal. I feel like it should work, but the action doesn't show up inside of Connect. Thanks for any help! PS Sorry for the formatting, the white text turns black and I can't see the options to change the colors. # :coding: utf-8 # :copyright: Copyright (c) 2015 ftrack import logging import sys import pprint import os import ftrack import ftrack_connect.application 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 UnrealAction(object): '''Launch Unreal action.''' # Unique action identifier. identifier = 'mb-unreal-launch-action' def __init__(self, applicationStore, launcher): '''Initialise action with *applicationStore* and *launcher*. *applicationStore* should be an instance of :class:`ftrack_connect.application.ApplicationStore`. *launcher* should be an instance of :class:`ftrack_connect.application.ApplicationLauncher`. ''' super(UnrealAction, self).__init__() self.logger = logging.getLogger( __name__ + '.' + self.__class__.__name__ ) self.applicationStore = applicationStore self.launcher = launcher if self.identifier is None: raise ValueError('The action must be given an identifier.') def register(self): '''Register action to respond to discover and launch events.''' ftrack.EVENT_HUB.subscribe( '', ) ftrack.EVENT_HUB.subscribe( 'topic=ftrack.action.launch and data.actionIdentifier={0}'.format( self.identifier ), self.launch ) def discover(self, event): '''Return available actions based on *event*. Each action should contain actionIdentifier - Unique identifier for the action label - Nice name to display in ftrack variant - Variant or version of the application. icon(optional) - predefined icon or URL to an image applicationIdentifier - Unique identifier to identify application in store. ''' items = [] applications = self.applicationStore.applications applications = sorted( applications, key=lambda application: application['label'] ) for application in applications: applicationIdentifier = application['identifier'] label = application['label'] items.append({ 'actionIdentifier': self.identifier, 'label': label, 'variant': application.get('variant', None), 'description': application.get('description', None), 'icon': application.get('icon', 'default'), 'applicationIdentifier': applicationIdentifier }) return { 'items': items } def launch(self, event): '''Callback method for Unreal action.''' applicationIdentifier = ( event['data']['applicationIdentifier'] ) context = event['data'].copy() return self.launcher.launch( applicationIdentifier, context ) class ApplicationStore(ftrack_connect.application.ApplicationStore): '''Store used to find and keep track of available applications.''' def _discoverApplications(self): '''Return a list of applications that can be launched from this host. ''' applications = [] if sys.platform == 'darwin': prefix = ['/', 'Applications'] applications.extend(self._searchFilesystem( expression=prefix + [ 'Unreal*', '' ], label='Unreal', variant='{version}', applicationIdentifier='unreal_{version}' )) elif sys.platform == 'win32': prefix = ['C:\\', 'Program Files (x86)'] self.logger.debug( 'Prefix:\n{0}'.format( pprint.pformat(prefix) ) ) applications.extend(self._searchFilesystem( expression=( prefix + ['Epic Games', '4.12', 'Engine', 'Binaries', 'Win64', 'UE4Editor.exe'] ), label='Unreal Engine', variant='{version}', applicationIdentifier='unreal_{version}' )) expression=( prefix + ['Epic Games', '4.12', 'Engine', 'Binaries', 'Win64', 'UE4Editor.exe'] ), self.logger.debug( 'Expression:\n{0}'.format( pprint.pformat(expression) ) ) self.logger.debug( 'Discovered applications:\n{0}'.format( pprint.pformat(applications) ) ) return applications class ApplicationLauncher(ftrack_connect.application.ApplicationLauncher): '''Custom launcher to modify environment before launch.''' def _getApplicationEnvironment( self, application, context=None ): '''Override to modify environment before launch.''' # Make sure to call super to retrieve original environment # which contains the selection and ftrack API. environment = super( ApplicationLauncher, self )._getApplicationEnvironment(application, context) # Append or Prepend values to the environment. # Note that if you assign manually you will overwrite any # existing values on that variable. # Add my custom path to the UNREAL_SCRIPT_PATH. environment = ftrack_connect.application.appendPath( 'path/to/my/custom/scripts', 'UNREAL_SCRIPT_PATH', environment ) # Set an internal user id of some kind. environment = ftrack_connect.application.appendPath( 'my-unique-user-id-123', 'STUDIO_SPECIFIC_USERID', environment ) # Always return the environment at the end. return environment def register(registry, **kw): '''Register hooks.''' # Validate that registry is the correct ftrack.Registry. If not, # assume that register is being called with another purpose or from a # new or incompatible API and return without doing anything. if registry is not ftrack.EVENT_HANDLERS: # Exit to avoid registering this plugin again. return # Create store containing applications. applicationStore = ApplicationStore() # Create a launcher with the store containing applications. launcher = ApplicationLauncher( applicationStore ) # Create action and register to respond to discover and launch actions. action = UnrealAction(applicationStore, launcher) action.register()
  11. Hi, I've created custom actions, but i've no way to change the icons displayed by the server. How am i supposed to do ? (Ftrack is hosted in local) Regard
  12. - 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!
  13. Hi I have an action, that creates folders and opens them as an explorer window. This action may not always complete successfully if certain things are not set up correctly. So I want to be able to notify the user that the action has failed. There is a 5 sec time out on actions that presents them as failed if there isn't a reply. Unfortunately as the action can at times take longer than 5secs before it can be determined if it ran OK or not, so I had to reply before doing my stuff. `self.session.event_hub.publish_reply(event,data)` That's all fine, but now I need to provide a further message back to the user to say "actually its not worked and here's why". I thought seeing as it doesn't seem possible to send further replies, (presumably because the webpage stops looking after its received one), I could just show a `PySide.QtGui.QMessageBox` with my message. However it seems I can't as the environment my action is running in, already has a QApplication started, and my action is running in a thread that is not the Main GUi Thread. Are there any suggestions on how I could either use QT or in some way provide visual feedback to the user about what has happened? One thought I had which is not Ideal, but could be work able is to Popen a separate Python thread which can launch my window and receive cmd args about msg, but the msg might cover multiple lines making that not so practical. I did consider using a job but It just didn't feel quite right the action normally takes less than 5 secs. Thanks Phil