def process(self, context): ftrack_log = logging.getLogger('ftrack_api') ftrack_log.setLevel(logging.WARNING) ftrack_log = logging.getLogger('ftrack_api_old') ftrack_log.setLevel(logging.WARNING) # Collect session session = ftrack_api.Session() context.data["ftrackSession"] = session # Collect task project = os.environ.get('AVALON_PROJECT', '') asset = os.environ.get('AVALON_ASSET', '') task = os.environ.get('AVALON_TASK', None) self.log.debug(task) if task: result = session.query('Task where\ project.full_name is "{0}" and\ name is "{1}" and\ parent.name is "{2}"'.format(project, task, asset)).one() context.data["ftrackTask"] = result else: result = session.query('TypedContext where\ project.full_name is "{0}" and\ name is "{1}"'.format(project, asset)).one() context.data["ftrackEntity"] = result self.log.info(result)
def process(self, context): # Collect session session = ftrack_api.Session() context.data["ftrackSession"] = session # Collect task project = os.environ.get('AVALON_PROJECT', '') asset = os.environ.get('AVALON_ASSET', '') task = os.environ.get('AVALON_TASK', '') result = session.query('Task where\ project.full_name is "{0}" and\ name is "{1}" and\ parent.name is "{2}"'.format(project, task, asset)).one() context.data["ftrackTask"] = result
def on_start(self): project_name = io.Session['AVALON_PROJECT'] project_query = 'Project where full_name is "{}"'.format(project_name) if self.session is None: session = ftrack_api.Session() self.session = session else: session = self.session ft_project = session.query(project_query).one() schema_name = ft_project['project_schema']['name'] # Load config schemas_items = get_current_project_settings().get('ftrack', {}).get( 'project_schemas', {} ) # Get info if it is silo project self.silos = io.distinct("silo") if self.silos and None in self.silos: self.silos = None key = "default" if schema_name in schemas_items: key = schema_name self.config_data = schemas_items[key] # set outlink input_outlink = self.data['inputs']['outlink'] checkbox_outlink = self.data['inputs']['outlink_cb'] outlink_text = io.Session.get('AVALON_ASSET', '') checkbox_outlink.setChecked(True) if outlink_text == '': outlink_text = '< No context >' checkbox_outlink.setChecked(False) checkbox_outlink.hide() input_outlink.setText(outlink_text) # load asset build types self.load_assetbuild_types() # Load task templates self.load_task_templates() self.data["model"]["assets"].refresh() self.on_asset_changed()
def on_start(self): project_name = io.Session['AVALON_PROJECT'] project_query = 'Project where full_name is "{}"'.format(project_name) if self.session is None: session = ftrack_api.Session() self.session = session else: session = self.session ft_project = session.query(project_query).one() schema_name = ft_project['project_schema']['name'] # Load config preset_path = pypelib.get_presets_path() schemas_items = [preset_path, 'ftrack', 'project_schemas'] schema_dir = os.path.sep.join(schemas_items) config_file = 'default.json' for filename in os.listdir(schema_dir): if filename.startswith(schema_name): config_file = filename break config_file = os.path.sep.join([schema_dir, config_file]) with open(config_file) as data_file: self.config_data = json.load(data_file) # set outlink input_outlink = self.data['inputs']['outlink'] checkbox_outlink = self.data['inputs']['outlink_cb'] outlink_text = io.Session.get('AVALON_ASSET', '') checkbox_outlink.setChecked(True) if outlink_text == '': outlink_text = '< No context >' checkbox_outlink.setChecked(False) checkbox_outlink.hide() input_outlink.setText(outlink_text) # load asset build types self.load_assetbuild_types() # Load task templates self.load_task_templates() self.data["model"]["assets"].refresh() self.on_asset_changed()
def create_asset(self): name_input = self.data['inputs']['name'] name = name_input.text() test_name = name.replace(' ', '') error_message = None message = QtWidgets.QMessageBox(self) message.setWindowTitle("Some errors has occured") message.setIcon(QtWidgets.QMessageBox.Critical) # TODO: show error messages on any error if self.valid_parent is not True and test_name == '': error_message = "Name is not set and Parent is not selected" elif self.valid_parent is not True: error_message = "Parent is not selected" elif test_name == '': error_message = "Name is not set" if error_message is not None: message.setText(error_message) message.show() return test_name_exists = io.find({ 'type': 'asset', 'name': name }) existing_assets = [x for x in test_name_exists] if len(existing_assets) > 0: message.setText("Entered Asset name is occupied") message.show() return checkbox_app = self.data['inputs']['open_app'] if checkbox_app is not None and checkbox_app.isChecked() is True: task_view = self.data["view"]["tasks"] task_model = self.data["model"]["tasks"] try: index = task_view.selectedIndexes()[0] task_name = task_model.itemData(index)[0] except Exception: message.setText("Please select task") message.show() return # Get ftrack session if self.session is None: session = ftrack_api.Session() self.session = session else: session = self.session # Get Ftrack project entity project_name = io.Session['AVALON_PROJECT'] project_query = 'Project where full_name is "{}"'.format(project_name) try: ft_project = session.query(project_query).one() except Exception: message.setText("Ftrack project was not found") message.show() return # Get Ftrack entity of parent ft_parent = None assets_model = self.data["model"]["assets"] selected = assets_model.get_selected_assets() parent = io.find_one({"_id": selected[0], "type": "asset"}) asset_id = parent.get('data', {}).get('ftrackId', None) asset_entity_type = parent.get('data', {}).get('entityType', None) asset_query = '{} where id is "{}"' if asset_id is not None and asset_entity_type is not None: try: ft_parent = session.query(asset_query.format( asset_entity_type, asset_id) ).one() except Exception: ft_parent = None if ft_parent is None: ft_parent = self.get_ftrack_asset(parent, ft_project) if ft_parent is None: message.setText("Parent's Ftrack entity was not found") message.show() return asset_build_combo = self.data['inputs']['assetbuild'] asset_type_name = asset_build_combo.currentText() asset_type_query = 'Type where name is "{}"'.format(asset_type_name) try: asset_type = session.query(asset_type_query).one() except Exception: message.setText("Selected Asset Build type does not exists") message.show() return for children in ft_parent['children']: if children['name'] == name: message.setText("Entered Asset name is occupied") message.show() return task_template_combo = self.data['inputs']['tasktemplate'] task_template = task_template_combo.currentText() tasks = [] for template in self.config_data['task_templates']: if template['name'] == task_template: tasks = template['task_types'] break available_task_types = [] task_types = ft_project['project_schema']['_task_type_schema'] for task_type in task_types['types']: available_task_types.append(task_type['name']) not_possible_tasks = [] for task in tasks: if task not in available_task_types: not_possible_tasks.append(task) if len(not_possible_tasks) != 0: message.setText(( "These Task types weren't found" " in Ftrack project schema:\n{}").format( ', '.join(not_possible_tasks)) ) message.show() return # Create asset build asset_build_data = { 'name': name, 'project_id': ft_project['id'], 'parent_id': ft_parent['id'], 'type': asset_type } new_entity = session.create('AssetBuild', asset_build_data) task_data = { 'project_id': ft_project['id'], 'parent_id': new_entity['id'] } for task in tasks: type = session.query('Type where name is "{}"'.format(task)).one() task_data['type_id'] = type['id'] task_data['name'] = task session.create('Task', task_data) av_project = io.find_one({'type': 'project'}) hiearchy_items = [] hiearchy_items.extend(self.get_avalon_parent(parent)) hiearchy_items.append(parent['name']) hierarchy = os.path.sep.join(hiearchy_items) new_asset_data = { 'ftrackId': new_entity['id'], 'entityType': new_entity.entity_type, 'visualParent': parent['_id'], 'tasks': tasks, 'parents': hiearchy_items, 'hierarchy': hierarchy } new_asset_info = { 'parent': av_project['_id'], 'name': name, 'schema': "openpype:asset-3.0", 'type': 'asset', 'data': new_asset_data } # Backwards compatibility (add silo from parent if is silo project) if self.silos: new_asset_info["silo"] = parent["silo"] try: schema.validate(new_asset_info) except Exception: message.setText(( 'Asset information are not valid' ' to create asset in avalon database' )) message.show() session.rollback() return io.insert_one(new_asset_info) session.commit() outlink_cb = self.data['inputs']['outlink_cb'] if outlink_cb.isChecked() is True: outlink_input = self.data['inputs']['outlink'] outlink_name = outlink_input.text() outlink_asset = io.find_one({ 'type': 'asset', 'name': outlink_name }) outlink_ft_id = outlink_asset.get('data', {}).get('ftrackId', None) outlink_entity_type = outlink_asset.get( 'data', {} ).get('entityType', None) if outlink_ft_id is not None and outlink_entity_type is not None: try: outlink_entity = session.query(asset_query.format()).one() except Exception: outlink_entity = None if outlink_entity is None: outlink_entity = self.get_ftrack_asset( outlink_asset, ft_project ) if outlink_entity is None: message.setText("Outlink's Ftrack entity was not found") message.show() return link_data = { 'from_id': new_entity['id'], 'to_id': outlink_entity['id'] } session.create('TypedContextLink', link_data) session.commit() if checkbox_app is not None and checkbox_app.isChecked() is True: origin_asset = api.Session.get('AVALON_ASSET', None) origin_task = api.Session.get('AVALON_TASK', None) asset_name = name task_view = self.data["view"]["tasks"] task_model = self.data["model"]["tasks"] try: index = task_view.selectedIndexes()[0] except Exception: message.setText("No task is selected. App won't be launched") message.show() return task_name = task_model.itemData(index)[0] try: api.update_current_task(task=task_name, asset=asset_name) self.open_app() finally: if origin_task is not None and origin_asset is not None: api.update_current_task( task=origin_task, asset=origin_asset ) message.setWindowTitle("Asset Created") message.setText("Asset Created successfully") message.setIcon(QtWidgets.QMessageBox.Information) message.show()
def process(self, context): ftrack_log = logging.getLogger('ftrack_api') ftrack_log.setLevel(logging.WARNING) ftrack_log = logging.getLogger('ftrack_api_old') ftrack_log.setLevel(logging.WARNING) # Collect session session = ftrack_api.Session(auto_connect_event_hub=True) self.log.debug("Ftrack user: \"{0}\"".format(session.api_user)) context.data["ftrackSession"] = session # Collect task project_name = os.environ.get('AVALON_PROJECT', '') asset_name = os.environ.get('AVALON_ASSET', '') task_name = os.environ.get('AVALON_TASK', None) # Find project entity project_query = 'Project where full_name is "{0}"'.format(project_name) self.log.debug("Project query: < {0} >".format(project_query)) project_entity = list(session.query(project_query).all()) if len(project_entity) == 0: raise AssertionError( "Project \"{0}\" not found in Ftrack.".format(project_name)) # QUESTION Is possible to happen? elif len(project_entity) > 1: raise AssertionError( ("Found more than one project with name \"{0}\" in Ftrack." ).format(project_name)) project_entity = project_entity[0] self.log.debug("Project found: {0}".format(project_entity)) # Find asset entity entity_query = ('TypedContext where project_id is "{0}"' ' and name is "{1}"').format(project_entity["id"], asset_name) self.log.debug("Asset entity query: < {0} >".format(entity_query)) asset_entities = [] for entity in session.query(entity_query).all(): # Skip tasks if entity.entity_type.lower() != "task": asset_entities.append(entity) if len(asset_entities) == 0: raise AssertionError( ("Entity with name \"{0}\" not found" " in Ftrack project \"{1}\".").format(asset_name, project_name)) elif len(asset_entities) > 1: raise AssertionError( ("Found more than one entity with name \"{0}\"" " in Ftrack project \"{1}\".").format(asset_name, project_name)) asset_entity = asset_entities[0] self.log.debug("Asset found: {0}".format(asset_entity)) # Find task entity if task is set if task_name: task_query = ( 'Task where name is "{0}" and parent_id is "{1}"').format( task_name, asset_entity["id"]) self.log.debug("Task entity query: < {0} >".format(task_query)) task_entity = session.query(task_query).first() if not task_entity: self.log.warning( "Task entity with name \"{0}\" was not found.".format( task_name)) else: self.log.debug("Task entity found: {0}".format(task_entity)) else: task_entity = None self.log.warning("Task name is not set.") context.data["ftrackProject"] = project_entity context.data["ftrackEntity"] = asset_entity context.data["ftrackTask"] = task_entity