Exemplo n.º 1
0
    def location_configuration_finished(self, reconfigure_session=True):
        '''Continue connect setup after location configuration is done.'''
        if reconfigure_session:
            ftrack_connect.session.destroy_shared_session()
            self._session = self._setup_session()

        try:
            self.configureConnectAndDiscoverPlugins()
        except Exception as error:
            self.logger.exception(u'Error during location configuration.:')
            self._report_session_setup_error(error)
        else:
            self.focus()

        # Send verify startup event to verify that storage scenario is
        # working correctly.
        event = ftrack_api.event.base.Event(
            topic='ftrack.connect.verify-startup',
            data={
                'storage_scenario': self._session.server_information.get(
                    'storage_scenario'
                )
            }
        )
        results = self._session.event_hub.publish(event, synchronous=True)
        problems = [
            problem for problem in results if isinstance(problem, basestring)
        ]
        if problems:
            msgBox = QtWidgets.QMessageBox(parent=self)
            msgBox.setIcon(QtWidgets.QMessageBox.Warning)
            msgBox.setText('\n\n'.join(problems))
            msgBox.exec_()
Exemplo n.º 2
0
    def create_missing_asset(self):
        '''Trigger creation of missing assets.'''
        sender = self.sender()
        asset_type = sender.text()
        self._session.ensure('AssetType', {
            'short': asset_type.lower(),
            'name': asset_type
        })
        try:
            self._session.commit()
        except Exception as error:
            QtWidgets.QMessageBox().critical(self, 'ERROR', str(error))
            return

        sender.setDisabled(True)
Exemplo n.º 3
0
 def removeObject(self, objectName):
     '''Remove object with *objectName* from scene.'''
     msgBox = QtWidgets.QMessageBox()
     msgBox.setText('Remove asset.')
     msgBox.setInformativeText('Are you sure you want to remove the asset?')
     msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok
                               | QtWidgets.QMessageBox.Cancel)
     msgBox.setDefaultButton(QtWidgets.QMessageBox.Ok)
     ret = msgBox.exec_()
     if ret == QtWidgets.QMessageBox.Ok:
         self.connector.removeObject(applicationObject=objectName)
         foundItem = self.ui.AssertManagerTableWidget.findItems(
             objectName, QtCore.Qt.MatchExactly)
         self.ui.AssertManagerTableWidget.removeRow(foundItem[0].row())
         self.refreshAssetManager()
Exemplo n.º 4
0
    def _onLoggingButtonClicked(self):
        '''Handle logging button clicked.'''
        directory = get_log_directory()

        if not os.path.exists(directory):
            # Create directory if not existing.
            try:
                os.makedirs(directory)
            except OSError:
                messageBox = QtWidgets.QMessageBox(parent=self)
                messageBox.setIcon(QtWidgets.QMessageBox.Warning)
                messageBox.setText(
                    u'Could not open or create logging '
                    u'directory: {0}.'.format(directory)
                )
                messageBox.exec_()
                return

        ftrack_connect.util.open_directory(directory)
Exemplo n.º 5
0
    def doit(self):
        '''' Execute action. '''
        selection = self.getTrackItems()

        sequence = hiero.ui.activeView().sequence()
        project = sequence.project()

        if not self.configure(project, selection):
            return

        self._buildTrack(selection, sequence, project)

        if self._errors:
            msgBox = QtWidgets.QMessageBox(hiero.ui.mainWindow())
            msgBox.setWindowTitle('Build track from ftrack')
            msgBox.setText('There were problems building the track.')
            msgBox.setDetailedText('\n'.join(self._errors))
            msgBox.exec_()
            self._errors = []
Exemplo n.º 6
0
    def openDefaultPluginDirectory(self):
        '''Open default plugin directory in platform default file browser.'''

        directory = self.defaultPluginDirectory

        if not os.path.exists(directory):
            # Create directory if not existing.
            try:
                os.makedirs(directory)
            except OSError:
                messageBox = QtWidgets.QMessageBox(parent=self)
                messageBox.setIcon(QtWidgets.QMessageBox.Warning)
                messageBox.setText(
                    u'Could not open or create default plugin '
                    u'directory: {0}.'.format(directory)
                )
                messageBox.exec_()
                return

        ftrack_connect.util.open_directory(directory)
Exemplo n.º 7
0
    def validate_ftrack_processing(self, export_items, preview):
        ''' Return whether the *export_items* and processor are valid to be rendered.

        In *preview* will not go through the whole validation, and return False by default.

        '''

        task_type = self._preset.properties()['ftrack']['task_type']
        asset_type_name = self._preset.properties(
        )['ftrack']['asset_type_name']
        asset_name = self._preset.properties()['ftrack']['asset_name']

        for (export_path, preset) in self._exportTemplate.flatten():
            # Propagate properties from processor to tasks.
            preset.properties()['ftrack']['task_type'] = task_type
            preset.properties()['ftrack']['asset_type_name'] = asset_type_name
            preset.properties()['ftrack']['asset_name'] = asset_name

        if preview:
            return False
        else:
            self._validate_project_progress_widget = foundry.ui.ProgressTask(
                'Validating settings.')
            errors = {}
            missing_assets_type = []
            duplicated_components = []

            non_matching_template_items = []

            num_items = len(self._exportTemplate.flatten()) + len(export_items)
            progress_index = 0

            for exportItem in export_items:

                item = exportItem.item()

                # Skip effects track items.
                if isinstance(
                        item,
                    (hiero.core.EffectTrackItem, hiero.core.Transition)):
                    self.logger.debug('Skipping {0}'.format(item))
                    continue

                project = item.project()
                parsing_template = template_manager.get_project_template(
                    project)

                task_tags = set()
                task_types = self.schema(project).get_types('Task')

                try:
                    template_manager.match(item, parsing_template)
                except ftrack_connect_nuke_studio.exception.TemplateError:
                    self.logger.warning(
                        'Skipping {} as does not match {}'.format(
                            item, parsing_template['expression']))
                    if item not in non_matching_template_items:
                        non_matching_template_items.append(item.name())
                    continue

                if not hasattr(item, 'tags'):
                    continue

                for tag in item.tags():
                    meta = tag.metadata()
                    if meta.hasKey('type') and meta.value('type') == 'ftrack':
                        task_name = meta.value('ftrack.name')
                        filtered_task_types = [
                            task_type for task_type in task_types
                            if (task_type['name'] == task_name)
                        ]
                        if len(filtered_task_types) == 1:
                            task_tags.add(task_name)

                components = []

                for (export_path, preset) in self._exportTemplate.flatten():
                    # Build TaskData seed
                    taskData = hiero.core.TaskData(
                        preset,
                        item,
                        preset.properties()['exportRoot'],
                        export_path,
                        'v0',
                        self._exportTemplate,
                        project=item.project(),
                        resolver=self._preset.createResolver())
                    task = hiero.core.taskRegistry.createTaskFromPreset(
                        preset, taskData)

                    self.logger.info(
                        'Getting preset {} for deduplication'.format(
                            task.component_name()))

                    if task.component_name() not in components:
                        components.append(task.component_name())
                    else:
                        duplicated_components.append(
                            (task.component_name(), task))

                    progress_index += 1

                    self._validate_project_progress_widget.setProgress(
                        int(100.0 *
                            (float(progress_index) / float(num_items))))
                    asset_type_name = preset.properties(
                    )['ftrack']['asset_type_name']

                    ftrack_asset_type = self.session.query(
                        'AssetType where short is "{0}"'.format(
                            asset_type_name)).first()

                    if not ftrack_asset_type and asset_type_name not in missing_assets_type:
                        missing_assets_type.append(asset_type_name)

                    try:
                        result = self.task_type(project)
                    except FtrackProcessorValidationError as error:
                        preset_errors = errors.setdefault(self, {})
                        preset_errors.setdefault('task_type', list(task_tags))

            self._validate_project_progress_widget = None

            # Raise validation window.
            if errors or missing_assets_type or duplicated_components:
                settings_validator = FtrackSettingsValidator(
                    self.session, errors, missing_assets_type,
                    duplicated_components)

                if settings_validator.exec_() != QtWidgets.QDialog.Accepted:
                    return False

                self.validate_ftrack_processing(export_items, preview)

            # Raise notification for error parsing items.
            if non_matching_template_items:
                item_warning = QtWidgets.QMessageBox().warning(
                    None, 'Error parsing Track Items',
                    'Some items failed to parse and will not be published\n'
                    '{} do you want to continue with the others ?'.format(
                        ', '.join(non_matching_template_items)),
                    QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
                if item_warning != QtWidgets.QMessageBox.Yes:
                    return False
                else:
                    # user has been notified, and want to go ahead....
                    non_matching_template_items = []

            return True