Esempio n. 1
0
def apply_deprecation(tag):
    """Apply a deprecation at this point in the code.

    This prevents the code from running in dev mode.

    Args:
        tag (str): deprecation tag
    """
    _age_days, _note = _read_tag(tag)
    print 'APPLYING DEPRECATION {} ({:d} days old) dev={:d}'.format(
        _note, int(_age_days), dev_mode())

    if dev_mode():
        raise _DeprecationError
Esempio n. 2
0
def _get_job_environ(local=False):
    """Get environment for psyq job.

    Args:
        local (bool): if job is being executed locally

    Returns:
        (dict): environ
    """
    _result = {}
    _result.update(psyop.env.get_bootstrap_variables())

    # Update python path
    _clean_env = psyrc.original_environment()
    _result["PYTHONPATH"] = _clean_env.get("PYTHONPATH", "")

    # Set psyq plugin path
    if dev_mode() and not local:
        _plugin_path = (
            'P:/projects/hvanderbeek_0001P/code/primary/addons/'
            'maya/modules/psyhive/scripts/psyhive/farm/psyq_plugin')
    else:
        _plugin_path = abs_path(os.path.dirname(__file__)+'/psyq_plugin')
    print "PSYQ_PLUGIN_PATH", _plugin_path
    _result["PSYQ_PLUGIN_PATH"] = _plugin_path

    return _result
Esempio n. 3
0
def _write_usage_to_kibana(name=None, catch=True, args=None, verbose=0):
    """Write usage data to kibana index.

    Args:
        name (str): override function name
        catch (bool): on fail continue and disable usage tracking
        args (tuple): args data to write to usage
        verbose (int): print process data
    """

    # Don't track farm/dev usage
    if os.environ.get('USER') == 'render' or dev_mode():
        return

    try:
        from elasticsearch import Elasticsearch
    except ImportError:
        return

    _start = time.time()
    _index_name = 'psyhive-' + datetime.datetime.utcnow().strftime('%Y.%m')
    _usage = _build_usage_dict(name=name, args=args)

    if verbose > 1:
        print _index_name
        pprint.pprint(_usage)

    # Send to kibana
    _conn = Elasticsearch([_ELASTIC_URL])
    if not _conn.ping():
        if catch:
            dprint('Failed to make connection to Elasticsearch')
            os.environ['PSYHIVE_DISABLE_USAGE'] = '1'
            return
        raise RuntimeError('Cannot connect to Elasticsearch database.')
    if not _conn.indices.exists(_index_name):
        _conn.indices.create(index=_index_name, body=_INDEX_MAPPING)
    _res = _conn.index(index=_index_name,
                       doc_type=_ES_DATA_TYPE,
                       body=_usage,
                       id=_usage.pop('_id', None))
    _usage['_id'] = _res['_id']
    _dur = time.time() - _start
    dprint('Wrote usage to kibana ({:.02f}s)'.format(_dur), verbose=verbose)
Esempio n. 4
0
    def _connect_elements(self, catch_errors_=False, verbose=0):
        """Connect qt elements to callback/context methods.

        Args:
            catch_errors_ (bool): apply error catcher to callbacks
            verbose (int): print process data
        """

        # Get list of widgets
        _widgets = self.findChildren(QtWidgets.QWidget)
        _widgets = [
            _widget for _widget in _widgets if is_pascal(_widget.objectName())
        ]
        _widgets.sort(key=operator.methodcaller('objectName'))

        for _widget in _widgets:

            _name = _widget.objectName()
            if not _name or _name.startswith('qt_'):
                continue
            lprint(_get_widget_label(_widget), verbose=verbose)

            # Connect callback
            _callback = getattr(self, '_callback__' + _name, None)
            lprint(' - CALLBACK', _callback, verbose=verbose > 1)
            if _callback:
                _connect_callback(widget=_widget,
                                  callback=_callback,
                                  verbose=verbose,
                                  catch_errors_=catch_errors_)
                lprint(' - CONNECTED CALLBACK', verbose=verbose > 1)

            # Connect context
            _context = getattr(self, '_context__' + _name, None)
            if _context:
                _widget.customContextMenuRequested.connect(
                    _build_context_fn(_context, widget=_widget))
                _widget.setContextMenuPolicy(Qt.CustomContextMenu)
                lprint(' - CONNECTING CONTEXT', _context, verbose=verbose)

        if dev_mode():
            self._catch_unconnected_callbacks()
            self._catch_duplicate_tooltips()
Esempio n. 5
0
def _handle_exception(exc, verbose=0):
    """Handle the given exception.

    Args:
        exc (Exception): exception that was raised
        verbose (int): print process data
    """

    # Handle special exceptions
    if (  # In case of FileError, jump to file
            not os.environ.get('EXC_DISABLE_FILE_ERROR') and
            isinstance(exc, FileError)):
        print '[FileError]'
        print ' - MESSAGE:', exc.message
        print ' - FILE:', exc.file_
        File(exc.file_).edit(line_n=exc.line_n)
        return
    elif isinstance(exc, qt.DialogCancelled):
        print '[DialogCancelled]'
        return
    elif isinstance(exc, SystemExit) or exc is SystemExit:
        print '[SystemExit]'
        return
    elif isinstance(exc, HandledError):
        qt.notify_warning(msg=exc.message, icon=exc.icon, title=exc.title)
        return

    if not dev_mode():
        _pass_exception_to_sentry(exc)

    # Raise error dialog
    lprint('HANDLING EXCEPTION', exc, verbose=verbose)
    lprint('MSG', exc.message, verbose=verbose)
    lprint('TYPE', type(exc), verbose=verbose)
    _traceback = Traceback()
    _traceback.pprint()
    _app = qt.get_application()
    _dialog = _ErrDialog(
        traceback_=_traceback, message=exc.message,
        type_=type(exc).__name__)
    if not host.NAME:
        _app.exec_()
Esempio n. 6
0
    def __init__(self,
                 ui_file,
                 catch_error_=True,
                 track_usage_=True,
                 dialog_stack_key=None,
                 connect_widgets=True,
                 show=True,
                 parent=None,
                 save_settings=True,
                 localise_imgs=False,
                 disable_btns_on_exec=True,
                 verbose=0):
        """Constructor.

        Args:
            ui_file (str): path to ui file
            catch_error_ (bool): apply catch error decorator to callbacks
            track_usage_ (bool): apply track usage decorator to callbacks
            dialog_stack_key (str): override dialog stack key
            connect_widgets (bool): connect widget callbacks
            show (bool): show interface
            parent (QDialog): parent dialog
            save_settings (bool): read/write settings on open/close
            localise_imgs (bool): map images to match current pipeline
            disable_btns_on_exec (bool): disable push buttons while
                they are being executed - can interfere with
                enabling/disabling buttons on the fly
            verbose (int): print process data
        """
        from psyhive import host

        if not os.path.exists(ui_file):
            raise OSError('Missing ui file ' + ui_file)

        # Remove any existing widgets
        _dialog_stack_key = dialog_stack_key or abs_path(ui_file)
        if _dialog_stack_key in sys.QT_DIALOG_STACK:
            sys.QT_DIALOG_STACK[_dialog_stack_key].delete()
        sys.QT_DIALOG_STACK[_dialog_stack_key] = self

        _args = [parent] if parent else []
        super(HUiDialog, self).__init__(*_args)

        # Load ui file
        _loader = get_ui_loader()
        assert os.path.exists(ui_file)
        _ui_file = ui_file
        if localise_imgs:
            _ui_file = _localise_ui_imgs(_ui_file)
        self.ui = _loader.load(_ui_file, self)
        self._is_widget_ui = type(self.ui) is QtWidgets.QWidget
        if self._is_widget_ui:
            _layout = self.ui.layout()
            if _layout:  # Fix maya margins override
                _layout.setContentsMargins(9, 9, 9, 9)
            self.ui.closeEvent = self.closeEvent
            self.setWindowTitle(self.ui.windowTitle())
        else:
            self.ui.rejected.connect(self.closeEvent)
            if (dev_mode() and isinstance(self.ui, QtWidgets.QDialog)
                    and host.NAME == 'maya'):
                dprint("WARNING: QDialog is unstable in maya")

        # Setup widgets
        self.widgets = self.read_widgets()
        if connect_widgets:
            self.connect_widgets(catch_error_=catch_error_,
                                 track_usage_=track_usage_,
                                 disable_btns_on_exec=disable_btns_on_exec,
                                 verbose=verbose)

        # Handle settings
        if save_settings:
            _settings_file = abs_path('{}/{}.ini'.format(
                SETTINGS_DIR,
                File(ui_file).basename))
            touch(_settings_file)  # Check settings writable
            self.settings = QtCore.QSettings(_settings_file,
                                             QtCore.QSettings.IniFormat)
            self.read_settings(verbose=verbose)
        else:
            self.settings = None

        self.redraw_ui()

        if show:
            self.show() if self._is_widget_ui else self.ui.show()
Esempio n. 7
0
"""Tools for ingesting file from outsource vendors."""

from psyhive.utils import lprint, dev_mode

from .ing_utils import parse_basename, vendor_from_path, INGESTED_TOKEN
from .ing_vendor_file import is_vendor_file, VendorFile
from .ing_psy_asset import is_psy_asset, PsyAsset

try:  # This will fail for outsource vendors
    from .ing_utils_psy import (
        ICON, map_tag_to_shot, map_file_to_psy_asset, map_tag_to_asset)
except ImportError:
    lprint('FAILED TO IMPORT ing_utils_psy', verbose=dev_mode())

try:  # This will fail for outsource vendors
    from .ing_tools import ingest_seqs
except ImportError:
    lprint('FAILED TO IMPORT ing_tools', verbose=dev_mode())

try:  # This will fail for outsource vendors
    from .ing_ingestible import Ingestible
except ImportError:
    lprint('FAILED TO IMPORT ing_ingestible', verbose=dev_mode())