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
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
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)
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()
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_()
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()
"""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())