All Activity

This stream auto-updates     

  1. Yesterday
  2. Hi, New version is on its way. Where we have the following enhancement on Overview: "Color your timeline content based on project, type, status or priority" More information in the release notes. Regards, Johan
  3. Hi @Jakub Trllo, you have almost answered yourself the question: >> It's probably because every time is used `custom_attributes` key on entity, api is querying values of custom attributes? It is quite possible that is what causing your slowdown. If you don't need / care about what the previous value was you can think of turning off the auto_popluate using the context manager for it. You can find further information here. Let us know how it goes! L.
  4. Hi, New version is on its way. Among other things, support has been added to upload attachments when adding feedback in a review. Regards, Johan
  5. Last week
  6. But i don't know what does it involve to expand the supported functions. It is just an idea that could help Cheers again
  7. So here is the very beginning of an expression i have so far : {func.CONCAT( func.SUBSTRING( self.graph_label, 1, func.LOCATE(' ',self.graph_label)-1 ), '_', func.SUBSTRING( self.graph_label, func.LOCATE(' ', self.graph_label)+1, func.LOCATE(' ', self.graph_label, func.LOCATE(' ', self.graph_label) ) ) ) } So for the attribute Label "Parisian Aged Ground Pavement" it give me the attribute Name "Parisian_Aged Gro" but i still have caps This is just a very beginning, not complete 😛 With REPLACE AND LOWER, i would have something like that : {func.LOWER(func.REPLACE(self.graph_label, ' ', '_'))} Regards
  8. Hello, thanks for your response. Yes i saw the list of supported functions before create this thread, that is why i said that <<it would be nice to have>> some other "test editing" functions. We have some dependencies between hundreds asset's names ans label attributes, so it would be useful to automatically create strings. eg: if we have this kind of Label attribute, manually typed : "Parisian Aged Ground Pavement" we would like to be able to make a "Name" expression attribute that would automatically format it like this: "parisian_aged_ground_pavement" I guess i can replace the " " by the "_" with the existing supported functions (it would be anyway more simple with a "REPLACE" function) but not possible to convert caps to lowercase. I propose this because we have hundreds assets to manage on each project. Cheers and as i am quite new to ftrack i would like to congrats everyone for your incredible tool ! Team begin using it and seems to really like it Eric ps: sorry for my english, i hope to be understandable
  9. Hi @Julian Martinz , we'll be looking soon on providing something off the shelf. Your approach seems the on the right track though ! L.
  10. Hey Lorenzo, thanks for the reply. I think @JPrydz mentioned that concept before. You don't happen to have a code example ready? Or at least a draft or a hint? After a short glance at the location class I'd start by overriding/extending the add_component method and implement the logic there. Does that sound sensible? Best, Julian
  11. Hi, I'll extend the question. Is possible to set custom attributes for multiple entities at once? ISSUE: I have dictionary where key represents id of ftrack entity and value represents a value of one specific custom attribute. I would like to set them all at once (or as fast as possible in other words). NOTE: I have also ftrack entities at the moment I need to change values of the custom attribute. But when I'll use `entity["custom_attributes"]["{specific_key}"] = value` to change value it takes on average 0,2 second (60 seconds for whole project). It's probably because every time is used `custom_attributes` key on entity, api is querying values of custom attributes? I assume that it is not possible to use UPDATE of INSERT queries, right? Thanks, Jakub EDITED: Found out that session has recorded_operations where I can put UpdateEntityOperation. With this it takes less then 0.1 for whole project, GREAT Is this usage "kosher"?
  12. Hi Konstantin, Thanks for the feedback. I have reported this as a bug. Regards, Lucas
  13. Hi @Julian Martinz if you want to use either one or the other in the same project you might have to think of creating what I would call a proxy location. This location would accept both (or more) the locations you want to use and through logical gates you can redirect the publish to what you want, either based on task, component or any other logic that suits you. Hope it helps. L.
  14. We are incredibly pleased to announce that today, Cospective, creator of the Academy Award and Emmy-winning synchronized remote review tool cineSync, has joined forces with ftrack! We have enjoyed a close working relationship with Cospective since 2015. During that time, we’ve developed a deep integration that links cineSync with ftrack Studio, and a working relationship with the Cospective team that has flourished over the years. We’ve partnered with Cospective at industry events, shared many meals, and grown as both friends and colleagues. For us, Cospective was the natural choice for a partner. The company mirrors ftrack in its professionalism, creative aspirations, and spirit of innovation, and in cineSync, Cospective has built a robust and industry-changing product that continues to find new ways to simplify and streamline workflows for creative professionals all around the world. Cospective’s ambitions align very firmly with our own, and we are extraordinarily proud to bring both its people and products under the ftrack umbrella. You can learn more about this landmark acquisition and what it means for this new chapter in the ftrack (and Cospective!) story below. Read the full story about ftrack's acquisition of Cospective
  15. Earlier
  16. Is there an option to revert a location to default after setting it up to be unmanaged with the ftrack_api.mixin() method? I have to publish components to the same location during a session. Some of them are already where they belong so I want to add them through the unmanaged location. For others (especially those created by the official plugins // publishers) I'd like to rely on the default behaviour. - Julian
  17. Hey Lorenzo, Thats basically what I was planning to do (except for the threading part in the action .. but guess that's the only viable way). Thanks for the reply. - Julian
  18. Hi @narvi, the latest perforce location plugin can be downloaded from this address. For what concerns S3 there's an example built on top of the legacy api here but still has to be ported to the new one. This is something on our todo list to port it over. Hope it helps. L.
  19. JPrydz

    Faster querying

    Hi Jakub, Thanks for updating the thread. Regards Johan
  20. Also ftrackWidget is not suitable to handle action widgets as it does not handle content.selection in onWidgetLoad(), is there chance this to be fixed?
  21. Thank you for your reply Jakub. My problem was much simpler than I thought. I can have unlimited forms as I want, and its results always just updates the event['data']['values'] with the latest form. So once form a is done I just store the event['data']['values'] into a temp var. and then call it once i need to use it to populate the next form. Thanks!
  22. Lorenzo Angeli


    Windows, Linux, Osx Download 0.7.0 Documentation Changes since last version changed : Pip compatibility for version 19.3.0 or higher. changed: Defer the Qt import when loading scenario. new : Use instead of the bundled QtExt with Connect. new : Support publish of file sequences. fixed: Perforce modules cannot be imported and used in DCC application. new : Provide default file encode mapping based on the file extension. new : Enforce perforce username to be the same as the ftrack user logged in. Requirement Accessible Helix Server What to expect to work Storage setup User preferences setup Publish Versioning Aim for testing Publish from any application Import/Update version through connect's asset management system Known Issues and limitations There are known issues at the moment with Nuke Studio integration.
  23. I got it myself, it look like some dependencies missed in production configuration in ftrack-spark-components.
  24. So neither s3 nor perforce integrations are working at this point, right?
  25. Hi, I think one pssibility is to use "hidden" item in interface items (, where you can store if you are in widget A or widget B so you can regonize from "values" of event which values are you procesing at the moment. Another possibility is to register multiple callbaks. Callback A will always trigger callback B but if item is Sequence then will trigger mid-widget. Example c ode in attachment (not tested nor runned!). Jakub
  26. Hello all! I am trying to create multiple forms that open up consecutively and parse the values from one form and use it in the next one. Here is the Ftrack Hiearchy structure EpisodicS2└-- Episode1 └-- Sequence 1 <--- ( A ), ( B ) └-- Shot 1 └-- Task 1 <--- ( B ) └-- Task 2 <--- ( B ) └-- Task..10 I have created 2 forms. Form A and Form B. If I run the action on an Sequence type item it should open a Dialog Form A, and once that is submitted it should gather the values from Form A and popup another dialog, Form B. If I run the action on some selected tasks, instead of a Sequence, I would like it to skip Form A, and just open up Form B. If I run this action on Sequence, data['values'] does not show me the values from Form B, it just tries to grab the information from Form A. How can I update data['values'] so that it gets the values from Form B? This only works correctly if I run it on a task or selected tasks. But it does not work when I run it on a Sequence. In the example below, I have a line that prints data['values']. Inside the main_ui(). So I guess the question is how do I clear the data values from the first Dialog box? class LuxCIS(object): '''Custom action.''' label = 'Create CIS' identifier = 'create.cis' description = 'Creates a sequence CIS from selected items' icon = '' def __init__(self, session): '''Initialise action.''' super(LuxCIS, self).__init__() self.session = session self.logger = logging.getLogger( __name__ + '.' + self.__class__.__name__ ) self.template_files = [] def register(self): try: ftrack.EVENT_HUB.subscribe( ' and source.user.username={0}'.format( getpass.getuser() ), ) ftrack.EVENT_HUB.subscribe( 'topic=ftrack.action.launch and source.user.username={0} ' 'and data.actionIdentifier={1}'.format( getpass.getuser(), self.identifier ), self.launch ) except: self.session.event_hub.subscribe( '', ) self.session.event_hub.subscribe( 'topic=ftrack.action.launch and data.actionIdentifier={0}'.format( self.identifier), self.launch ) def discover(self, event): '''Return action config if triggered on a single asset version.''' data = event['data'] # If selection contains more than one item return early since # this action can only handle a single version. selection = data.get('selection', [])'Got selection: {0}'.format(selection)) #if len(selection) != 1 or selection[0]['entityType'] != 'assetversion': # return return { 'items': [{ 'label': self.label, 'description': self.description, 'actionIdentifier': self.identifier, 'icon': self.icon }] } def main_ui(self,event,items): #for i in self.items: print i, i['name'] #Get global ftrack settings for project and sequence from the first item #Get all information for each task and shot associated #populate a UI using the gathered information #master_dict = self.get_items(items) data = event['data'] ui = [{ 'value': '<hr>', 'type': 'label' },{ 'value': '<i><b>Hey poulate me! i found tasks!</b></i>', 'type': 'label' },{ 'label': 'My Enumerator', 'type': 'enumerator', 'name': 'my_enumerator', 'data': [ { 'label': 'Option 1', 'value': 'opt1' }, { 'label': 'Option 2', 'value': 'opt2' } ] },{ 'value': '<hr>', 'type': 'label' }] if 'values' in event['data']: # do something with values print data['values'] # This should now display the values from the second UI form. return { 'success':True, 'message':"Mission didn't fail unsuccesfully!"} return {'items':ui} def launch(self, event): '''Callback method for custom action.''' self.template_files = [] items=[] data = event['data'] selection = data.get('selection', []) session = ftrack_api.Session() template_files_dir = "L:/HAL/LUX_SLATE/nuke_templates" if os.path.isdir(template_files_dir): self.template_files = [i for i in os.listdir(template_files_dir) if i[-3:] == '.nk'] #gather shot items from selection for entity in selection: item = session.query('select id from TypedContext where id is {0}'.format(entity['entityId'])).first() items.append(item) #if just 1 item is selected if len(items) == 1: #If the single selected item is a sequence, get all the tasks under the sequence if items[0]['object_type']['name'] == 'Sequence': get_task_types = session.query('select name from Task where ancestors any(id="{0}")'.format(entity['entityId'])).all() task_types = [] for t in get_task_types: temp_t = {'label':t['name'], 'value':t['name']} if temp_t not in task_types: task_types.append(temp_t) cis_sequence_settings = [{ 'value': '<hr>', 'type': 'label' },{ 'value': '<i><b>What type of tasks should I create the CIS from?</b></i>', 'type': 'label' },{ 'label': 'Task Type', 'type': 'enumerator', 'value': task_types[0]['label'], 'name': 'cis_task_types', 'data': task_types },{ 'value': '<hr>', 'type': 'label' }] if 'values' in data: values = data['values'] task_type = values['cis_task_types'] items = session.query('select id from Task where name is "{1}" and ancestors any(id="{0}")'.format( entity['entityId'], task_type )).all() return self.main_ui(event, items) return {'items':cis_sequence_settings} #if the item is not a sequence, could be shot, task, etc.... or even project else: return self.main_ui(event, items) #if more than one item is selected else: return self.main_ui(event, items) 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 action = LuxCIS(session) action.register() if __name__ == '__main__': logging.basicConfig(level=logging.INFO) session = ftrack_api.Session() register(session) # Wait for events. session.event_hub.wait() Sorry for the convuluded question, let me know if there is anything I can clarify. Thank you very much in advance. Ali
  27. Jakub Trllo

    Faster querying

    Hi, I have a question: Is there any faster possibility of getting all entities from project than with code below? ```PYTHON # ft_project_id - Project's ID entities_query = ( "select id, name, parent_id, link, custom_attributes" " from TypedContext where project_id is \"{}\"" ) all_project_entities = session.query( entities_query.format(ft_project_id) ).all() ``` It's actually pretty fast (0.027s/entity) but with 4500 entities in project it takes 2 minutes. EDITED: Found out that when custom_attributes are not in query it is much faster (from 2 minutes -> 6 seconds), so it was my fault. Thanks, Jakub
  1. Load more activity