From bf2bf3ae23bc635d3a60e68009f72fdb86176603 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Mon, 14 Oct 2024 09:00:06 -0400 Subject: [PATCH] phoebe-server style updates --- client-server/phoebe-server | 216 ++++++++++++++++-------------------- 1 file changed, 98 insertions(+), 118 deletions(-) diff --git a/client-server/phoebe-server b/client-server/phoebe-server index bcf2360fe..8997905cd 100644 --- a/client-server/phoebe-server +++ b/client-server/phoebe-server @@ -108,7 +108,8 @@ _dir_tmpimages = os.path.join(tempfile.gettempdir(), 'phoebe-server-tmpimages') try: _ui_path = subprocess.check_output('phoebe -u', shell=True).decode('utf-8') -except: +except subprocess.CalledProcessError: + print("could not find phoebe-ui executable, will use ui.phoebe-project.org instead") _ui_path = None if not os.path.exists(_dir_tmpimages): @@ -166,7 +167,7 @@ class LogItem(object): @property def undo_description(self): if self.undo_func is None: - return None # nothing to undo + return None # nothing to undo else: return "undo {} with {}".format(self.redo_str, self.undo_str) @@ -193,9 +194,8 @@ class Log(object): undo_func, undo_args, undo_kwargs, timestamp, clientid)) - def get_last_undo(self): - for i,logitem in reversed(list(enumerate(self._logitems))): + for i, logitem in reversed(list(enumerate(self._logitems))): if logitem.undo_func is not None: return i, logitem return None, None @@ -219,7 +219,6 @@ class Log(object): return script - def bundle_memory_cleanup(stale_limit_seconds=600): # TODO: its possible to get an entry in _clients_per_bundle that isn't # available here. The error message is raised in the UI and redirects @@ -231,7 +230,8 @@ def bundle_memory_cleanup(stale_limit_seconds=600): stale_for = (now-last_access).total_seconds() clients = app._clients_per_bundle.get(bundleid, []) active_clients = [c for c in clients if c in app._clients] - if app._verbose: print("bundle_memory_cleanup: {} stale for {}/{} seconds with {} active clients and {} total clients".format(bundleid, stale_for, stale_limit_seconds, len(active_clients), len(clients))) + if app._verbose: + print("bundle_memory_cleanup: {} stale for {}/{} seconds with {} active clients and {} total clients".format(bundleid, stale_for, stale_limit_seconds, len(active_clients), len(clients))) # we'll delete if any of the following # * no active clients and past the stale limit # * no clients at all and stale for 30 seconds (in the case of closing where the client sent a deregister signal) @@ -322,10 +322,8 @@ def crossdomain(origin=None, methods=None, headers=None, def _client_types_for_bundle(bundleid): return [c.split('-')[0] for c in app._clients_per_bundle.get(bundleid, [])] - ############################ BUNDLE MANIPULATION ############################### - def _get_bundle_json(bundleid, do_jsonify=True): b = app._bundles.get(bundleid) app._last_access_per_bundle[bundleid] = datetime.now() @@ -421,7 +419,6 @@ def _param_json_overview(param): p['advanced_filter'] = advanced_filter - for k,v in param.meta.items(): if k in ['history', 'plugin']: continue @@ -430,7 +427,7 @@ def _param_json_overview(param): return p def _param_json_detailed(param): - p = {'description': param.description} + p = {'description': param.description} if param.__class__.__name__ == 'ConstraintParameter': p['related_to'] = {p.uniqueid: p.twig for p in param.vars.to_list()} @@ -444,7 +441,6 @@ def _param_json_detailed(param): p['constraint'] = {p.uniqueid: p.twig for p in [param.is_constraint]} if hasattr(param, 'is_constraint') and param.is_constraint is not None else {} p['constrains'] = {p.uniqueid: p.twig for p in param.constrains} if hasattr(param, 'constrains') else {} - if param.__class__.__name__ in ['FloatParameter']: p['distributions'] = {p.uniqueid: p.twig for p in param.get_distribution_parameters(follow_constraints=True).to_list()} p['is_adjustable'] = param.context in ['component', 'dataset', 'system', 'feature'] and not len(param.constrained_by) @@ -481,7 +477,6 @@ def _param_json_detailed(param): return p - def _sort_tags(group, tags): if group=='contexts': # try to order contexts in same order as shown in UI.. then fill in with the rest @@ -500,8 +495,8 @@ def _get_failed_constraints(b): affected_params += [cp.uniqueid] + [cpc.uniqueid for cpc in cp.constrains_indirect] return affected_params - ############################ HTTP ROUTES ###################################### + def _get_request(request): if request.content_type == 'application/json': return request.get_json() @@ -550,7 +545,6 @@ def info(): elif parse(client_version) < parse('1.1.0'): client_warning = 'client does not support adding or editing servers' - info = app._includeinfo if app._maxcomputations or app._disable_solvers: msgs = [] @@ -584,8 +578,8 @@ def new_bundle(type): type: 'binary:detached' """ j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("new_bundle(type={})".format(type)) @@ -595,7 +589,8 @@ def new_bundle(type): b = getattr(phoebe, constructor)(**kwargs) except Exception as err: return _get_response({'success': False, 'error': str(err)}, api=True) - if app._debug: raise + if app._debug: + raise else: b.set_value(qualifier='auto_add_figure', context='setting', value=True) b.set_value(qualifier='auto_remove_figure', context='setting', value=True) @@ -654,28 +649,32 @@ def open_bundle(type): try: bundle_data = data['json'] except Exception as err: - if app._verbose: print("failed with error: {}".format(err)) + if app._verbose: + print("failed with error: {}".format(err)) return _get_response({'success': False, 'error': "could not read json data ({})".format(err)}, api=True) - if app._debug: raise + if app._debug: + raise try: b = phoebe.Bundle(bundle_data) except Exception as err: - if app._verbose: print("failed to load bundle with error: {}".format(err)) + if app._verbose: + print("failed to load bundle with error: {}".format(err)) return _get_response({'success': False, 'error': "failed to load bundle with error: "+str(err)}, api=True) - if app._debug: raise + if app._debug: + raise elif type == 'load:legacy': try: b = phoebe.from_legacy(request.files['file']) except Exception as err: return _get_response({'success': False, 'error': "file not recognized as bundle or legacy phoebe file. Error: {}".format(str(err))}, api=True) - if app._debug: raise + if app._debug: + raise else: return _get_response({'success': False, 'error': "import with type={} not supported".format(type)}, api=True) - bundleid = data.get('bundleid', None) if app._verbose: print("trying bundleid={}".format(bundleid)) @@ -692,8 +691,8 @@ def json_bundle(bundleid): """ """ j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("json_bundle(bundleid={})".format(bundleid)) @@ -760,7 +759,8 @@ def export_script(bundleid): f.write(log.get_export_script()) except Exception as err: f.close() - if app._debug: raise + if app._debug: + raise return _get_response({'success': False, 'error': str(err)}) else: @@ -768,7 +768,6 @@ def export_script(bundleid): return send_file(ef.name, as_attachment=True, attachment_filename='{}.py'.format(bundleid)) - @app.route('/export_compute//', defaults={'model': None}, methods=['GET', 'POST']) @app.route('/export_compute///', methods=['GET', 'POST']) @crossdomain(origin='*') @@ -776,8 +775,8 @@ def export_compute(bundleid, compute, model=None): """ """ j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("export_compute(bundleid={}, compute={})".format(bundleid, compute)) @@ -791,7 +790,7 @@ def export_compute(bundleid, compute, model=None): ef = tempfile.NamedTemporaryFile(prefix="export_compute", suffix=".py") - script_fname=ef.name + script_fname = ef.name try: b.export_compute(script_fname, out_fname=None, compute=compute, model=model) except Exception as err: @@ -806,8 +805,8 @@ def export_solver(bundleid, solver, solution=None): """ """ j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("export_solver(bundleid={}, solver={})".format(bundleid, solver)) @@ -821,7 +820,7 @@ def export_solver(bundleid, solver, solution=None): ef = tempfile.NamedTemporaryFile(prefix="export_solver", suffix=".py") - script_fname=ef.name + script_fname = ef.name try: b.export_solver(script_fname, out_fname=None, solver=solver, solution=solution) except Exception as err: @@ -835,8 +834,8 @@ def export_params(bundleid, params): """ """ j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("export_arrays(bundleid={}, params={})".format(bundleid, params)) @@ -854,21 +853,18 @@ def export_params(bundleid, params): return send_file(ef.name, as_attachment=True, attachment_filename='{}_export_arrays.csv'.format(bundleid)) - - @app.route('/bundle/', methods=['GET', 'POST']) @crossdomain(origin='*') def bundle(bundleid): """ """ j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("bundle(bundleid={})".format(bundleid)) - if bundleid not in app._bundles.keys(): return _get_response({'success': False, 'error': 'bundle not found with bundleid={}'.format(bundleid)}, api=True) @@ -895,8 +891,8 @@ def parameter(bundleid, uniqueid): """ """ j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("parameter(bundleid={}, uniqueid={})".format(bundleid, uniqueid)) @@ -911,7 +907,8 @@ def parameter(bundleid, uniqueid): param = b.get_parameter(uniqueid=str(uniqueid), check_visible=False, check_advanced=False, check_default=False) except: return _get_response({'success': False, 'error': 'could not find parameter with uniqueid={}'.format(uniqueid)}, api=True) - if app._debug: raise + if app._debug: + raise data = _param_json_detailed(param) @@ -923,8 +920,8 @@ def adjustable_parameters(bundleid): """ """ j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("adjustable_parameters(bundleid={})".format(bundleid)) @@ -945,8 +942,8 @@ def run_checks(bundleid, run_checks_method, label): """ """ j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("run_checks(bundleid={}, run_checks_method={}, label={})".format(bundleid, run_checks_method, label)) @@ -966,9 +963,9 @@ def run_checks(bundleid, run_checks_method, label): @app.route('/nparray/', methods=['GET', 'POST']) @crossdomain(origin='*') def nparray(input): - j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #j = _get_request(request) + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("nparray(input={}))".format(input)) @@ -1009,9 +1006,9 @@ def nparray(input): @app.route('/distl//', methods=['GET', 'POST']) @crossdomain(origin='*') def distl_convert(input, current_face_value): - j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #j = _get_request(request) + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("distl(input={}))".format(input)) @@ -1022,7 +1019,8 @@ def distl_convert(input, current_face_value): dist = distl.from_json(input) except: return _get_response({'success': False, 'error': 'could not convert to valid distl object with err: {}'.format(str(err))}, api=True) - if app._debug: raise + if app._debug: + raise if isinstance(dist, distl._distl.BaseAroundGenerator): dist = dist(current_face_value) @@ -1046,9 +1044,9 @@ def distl_convert(input, current_face_value): @app.route("//figure/", methods=['GET', 'POST']) def serve_figure(bundleid, figure): - j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #j = _get_request(request) + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None fname = '{}_{}.png'.format(bundleid, figure) if app._verbose: @@ -1057,9 +1055,9 @@ def serve_figure(bundleid, figure): @app.route("//figure_afig/", methods=['GET', 'POST']) def serve_figure_afig(bundleid, figure): - j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #j = _get_request(request) + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None fname = '{}_{}.afig'.format(bundleid, figure) if app._verbose: @@ -1068,9 +1066,9 @@ def serve_figure_afig(bundleid, figure): @app.route('//distribution_plot//', methods=['GET', 'POST']) def serve_distribution_plot(bundleid, parameter_uniqueid, distribution): - j = _get_request(request) - clientid = j.get('clientid', None) if j is not None else None - client_version = j.get('client_version', None) if j is not None else None + #j = _get_request(request) + #clientid = j.get('clientid', None) if j is not None else None + #client_version = j.get('client_version', None) if j is not None else None if app._verbose: print("serve_distribution_plot", bundleid, distribution, parameter_uniqueid) @@ -1091,7 +1089,7 @@ def serve_distribution_plot(bundleid, parameter_uniqueid, distribution): fname = '{}_dist_{}_{}.png'.format(bundleid, parameter_uniqueid, distribution) plt.clf() figure = plt.figure(figsize=(4,4)) - out = dist.plot() + _ = dist.plot() plt.tight_layout() plt.savefig(os.path.join(_dir_tmpimages, fname)) plt.close(figure) @@ -1102,7 +1100,8 @@ def serve_distribution_plot(bundleid, parameter_uniqueid, distribution): @app.route('/bootstrap/', methods=['GET']) @app.route('/fontawesome/', methods=['GET']) def ui_file(static_file=None, bootstrap_file=None, fa_file=None): - if _ui_path is None: return None + if _ui_path is None: + return None base = os.path.dirname(_ui_path) if static_file: @@ -1117,7 +1116,6 @@ def ui_file(static_file=None, bootstrap_file=None, fa_file=None): return send_from_directory(dir, fname) - # NOTE: this MUST be the last defined route because of the catch-all @app.route('/', methods=['GET', 'POST']) @app.route('/', methods=['GET', 'POST']) @@ -1128,8 +1126,6 @@ def ui(path=''): base, fname = os.path.dirname(_ui_path), os.path.basename(_ui_path) return send_from_directory(base, fname) - - ############################# WEBSOCKET ROUTES ################################ ########## SOCKET ERRORS @@ -1144,8 +1140,6 @@ def error_handler(err): emit('msg', {'success': False, 'id': None, 'level': 'error', 'msg': 'websocket: '+str(err)}, broadcast=False) - - ########## CLIENT MANAGEMENT @socketio.on('connect') def connect(): @@ -1159,14 +1153,12 @@ def disconnect(): if app._verbose: print('Client disconnected') - # emit('disconnect', {'success': True, 'data': {'clients': app._clients, 'parentid': app._parent}}) - @socketio.on('register client') def register_client(msg): clientid = msg.get('clientid', None) - client_version = msg.get('client_version', None) + #client_version = msg.get('client_version', None) bundleid = msg.get('bundleid', None) requestid = msg.get('requestid', None) @@ -1200,9 +1192,9 @@ def register_client(msg): @socketio.on('deregister client') def deregister_client(msg): clientid = msg.get('clientid', None) - client_version = msg.get('client_version', None) + #client_version = msg.get('client_version', None) bundleid = msg.get('bundleid', None) - requestid = msg.get('requestid', None) + #requestid = msg.get('requestid', None) if app._verbose: print("deregister_client(clientid={}, bundleid={})".format(clientid, bundleid)) @@ -1224,10 +1216,10 @@ def deregister_client(msg): @socketio.on('kill') def kill(msg): - clientid = msg.get('clientid', None) - client_version = msg.get('client_version', None) - bundleid = msg.get('bundleid', None) - requestid = msg.get('requestid', None) + #clientid = msg.get('clientid', None) + #client_version = msg.get('client_version', None) + #bundleid = msg.get('bundleid', None) + #requestid = msg.get('requestid', None) secret = msg.get('secret', None) if app._secret is None: @@ -1240,7 +1232,8 @@ def kill(msg): emit('{}:errors:python', {'success': False, 'error': 'incorrect secret'}, broadcast=False) return - if app._verbose: print("killing from API call with matching secret") + if app._verbose: + print("killing from API call with matching secret") socketio.stop() exit() @@ -1255,7 +1248,8 @@ def _run_checks(b, bundleid, run_checks_method='run_checks', run_checks_kwargs={ b.run_failed_constraints() except Exception as err: emit('{}:errors:react'.format(bundleid), {'success': True, 'level': 'warning', 'error': str(err)}, broadcast=False) - if app._debug: raise + if app._debug: + raise return # if len(b._failed_constraints): # msg = 'Constraints for the following parameters failed to run: {}. Affected values will not be updated until the constraints can succeed.'.format(', '.join([b.get_parameter(uniqueid=c, check_visible=False).constrained_parameter.uniquetwig for c in b._failed_constraints])) @@ -1276,7 +1270,6 @@ def _update_figures(b, bundleid, affected_ps=None): if app._verbose: print("_update_figures: ", bundleid) - if affected_ps is None: figures = b.figures @@ -1316,14 +1309,12 @@ def _update_figures(b, bundleid, affected_ps=None): if b.get_value(qualifier='time_source', figure=figure, context='figure', check_visible=False) == 'default': figures.append(figure) - - current_time = str(datetime.now()) + #current_time = str(datetime.now()) figure_update_times = {} for figure in figures: if app._verbose: print("_update_figures: calling run_figure on figure: {}".format(figure)) try: - # if True: afig, mplfig = b.run_figure(figure=figure, save=os.path.join(_dir_tmpimages, '{}_{}.png'.format(bundleid, figure))) render_kwargs = {'render': 'draw'} # TODO: we need to keep all things sent to draw @@ -1339,7 +1330,8 @@ def _update_figures(b, bundleid, affected_ps=None): except Exception as err: if app._verbose: print("_update_figures error: {}".format(str(err))) - if app._debug: raise + if app._debug: + raise # notify the client that the figure is now failing (and probably shouldn't be shown) figure_update_times[figure] = 'failed' # remove any existing cached file so that loading won't work @@ -1363,8 +1355,8 @@ def undo(msg): # NOTE: these are intentionally get instead of pop bundleid = msg.get('bundleid') requestid = msg.get('requestid', None) - clientid = msg.get('clientid', None) - client_version = msg.get('client_version', None) + #clientid = msg.get('clientid', None) + #client_version = msg.get('client_version', None) if bundleid not in app._bundles.keys(): err = 'bundle not found with bundleid={}'.format(bundleid) @@ -1387,7 +1379,7 @@ def undo(msg): emit('{}:errors:python'.format(bundleid), {'success': False, 'requestid': requestid, 'error': err}, broadcast=False) return - for k,v in logitem.undo_kwargs.items(): + for k, v in logitem.undo_kwargs.items(): msg[k] = v if logitem.undo_func in ['set_value', 'set_value_all', 'set_quantity', 'set_quantity_all']: @@ -1406,8 +1398,6 @@ def undo(msg): undo_ind, undo_description = app._log_per_bundle[bundleid].get_last_undo_ind_description() emit('{}:undo:react'.format(bundleid), {'requestid': requestid, 'undo_description': undo_description, 'undo_ind': undo_ind}) - - @socketio.on('set_value') def set_value(msg): if app._verbose: @@ -1416,7 +1406,7 @@ def set_value(msg): bundleid = msg.pop('bundleid') requestid = msg.pop('requestid', None) clientid = msg.pop('clientid', None) - client_version = msg.pop('client_version', None) + #client_version = msg.pop('client_version', None) if bundleid not in app._bundles.keys(): err = 'bundle not found with bundleid={}'.format(bundleid) @@ -1426,7 +1416,6 @@ def set_value(msg): emit('{}:errors:python'.format(bundleid), {'success': False, 'requestid': requestid, 'error': err}, broadcast=False) return - b = app._bundles[bundleid] app._last_access_per_bundle[bundleid] = datetime.now() @@ -1445,7 +1434,8 @@ def set_value(msg): print("set_value {} error on filter: {}".format(msg, str(err))) emit('{}:errors:react'.format(bundleid), {'success': False, 'requestid': requestid, 'error': str(err)}, broadcast=False) emit('{}:errors:python'.format(bundleid), {'success': False, 'requestid': requestid, 'error': str(err)}, broadcast=False) - if app._debug: raise + if app._debug: + raise return if len(ps_filter.to_list()) == 1: @@ -1460,7 +1450,7 @@ def set_value(msg): else: redo_func = 'set_value_all' # TODO: something similar to uniquetags - redo_kwargs = {k:v for k,v in ps_filter.meta.items() if v is not None} + redo_kwargs = {k: v for k, v in ps_filter.meta.items() if v is not None} undo_func = None undo_kwargs = {} @@ -1487,12 +1477,9 @@ def set_value(msg): undo_kwargs=undo_kwargs, clientid=clientid) - - ps_list = ps_constraints + ps_filter.to_list() if 'web' in client_types or 'desktop' in client_types: - # we need to also include parameters in which the visibility has changed ps_list += [p for p in b.to_list(check_visible=False, check_default=False, check_advanced=False) if p.is_visible!=is_visible_before.get(p.uniqueid, None)] @@ -1525,7 +1512,6 @@ def set_value(msg): emit('{}:changes:python'.format(bundleid), packet, broadcast=True) - # TODO: now that set_default_unit_all returns a PS, we could use bundle_method # instead? - need to see what needs to be done from the python-client side @socketio.on('set_default_unit') @@ -1536,7 +1522,7 @@ def set_default_unit(msg): bundleid = msg.pop('bundleid') requestid = msg.pop('requestid', None) clientid = msg.pop('clientid', None) - client_version = msg.pop('client_version', None) + #client_version = msg.pop('client_version', None) if bundleid not in app._bundles.keys(): err = 'bundle not found with bundleid={}'.format(bundleid) @@ -1546,7 +1532,6 @@ def set_default_unit(msg): emit('{}:errors:python'.format(bundleid), {'success': False, 'requestid': requestid, 'error': err}, broadcast=False) return - b = app._bundles[bundleid] app._last_access_per_bundle[bundleid] = datetime.now() @@ -1564,18 +1549,20 @@ def set_default_unit(msg): print("set_default_unit {} error: {}".format(msg, str(err))) emit('{}:errors:react'.format(bundleid), {'success': False, 'requestid': requestid, 'error': str(err)}, broadcast=False) emit('{}:errors:python'.format(bundleid), {'success': False, 'requestid': requestid, 'error': str(err)}, broadcast=False) - if app._debug: raise + if app._debug: + raise return try: - ps_filter = b.filter(**{k:v for k,v in msg.items() if k not in ['unit']}) + ps_filter = b.filter(**{k: v for k, v in msg.items() if k not in ['unit']}) ps_list = ps_filter.to_list() except Exception as err: if app._verbose: print("set_default_unit {} error on filter: {}".format(msg, str(err))) emit('{}:errors:react'.format(bundleid), {'success': False, 'requestid': requestid, 'error': str(err)}, broadcast=False) emit('{}:errors:python'.format(bundleid), {'success': False, 'requestid': requestid, 'error': str(err)}, broadcast=False) - if app._debug: raise + if app._debug: + raise return else: if len(ps_filter.to_list()) == 1: @@ -1584,7 +1571,7 @@ def set_default_unit(msg): else: redo_func = 'set_default_unit_all' # TODO: something similar to uniquetags - redo_kwargs = {k:v for k,v in ps_filter.meta.items() if v is not None} + redo_kwargs = {k: v for k, v in ps_filter.meta.items() if v is not None} redo_kwargs['unit'] = msg.get('unit') @@ -1593,7 +1580,6 @@ def set_default_unit(msg): redo_kwargs=redo_kwargs, clientid=clientid) - if 'web' in client_types or 'desktop' in client_types: param_list = sorted([_param_json_overview(param) for param in ps_list], key=lambda p: p['qualifier']) param_dict = OrderedDict((p.pop('uniqueid'), p) for p in param_list) @@ -1623,7 +1609,7 @@ def bundle_method(msg): bundleid = msg.pop('bundleid', None) requestid = msg.pop('requestid', None) clientid = msg.pop('clientid', None) - client_version = msg.pop('client_version', None) + #client_version = msg.pop('client_version', None) if bundleid is None: emit('{}:errors:react', {'success': False, 'requestid': requestid, 'error': "must provide bundleid"}, broadcast=False) @@ -1638,7 +1624,6 @@ def bundle_method(msg): emit('{}:errors:python'.format(bundleid), {'success': False, 'requestid': requestid, 'error': err}, broadcast=False) return - b = app._bundles[bundleid] app._last_access_per_bundle[bundleid] = datetime.now() @@ -1690,7 +1675,7 @@ def bundle_method(msg): redo_kwargs = msg.copy() if 'uniqueid' in redo_kwargs.keys(): filter_param = b.get_parameter(uniqueid=redo_kwargs.pop('uniqueid'), check_visible=False, check_default=False) - for k,v in filter_param.uniquetags.items(): + for k, v in filter_param.uniquetags.items(): redo_kwargs[k] = v try: @@ -1699,7 +1684,8 @@ def bundle_method(msg): except Exception as err: if app._verbose: print("bundle_method ERROR ({}): {}".format(msg, str(err))) - if app._debug: raise + if app._debug: + raise if method=='attach_job' and 'Expecting object' in str(err): # then its likely the object just hasn't been completely written to @@ -1710,7 +1696,6 @@ def bundle_method(msg): emit('{}:errors:react'.format(bundleid), {'success': False, 'requestid': requestid, 'error': str(err)}, broadcast=False) emit('{}:errors:python'.format(bundleid), {'success': False, 'requestid': requestid, 'error': str(err)}, broadcast=False) - if method=='attach_job' and ('web' in client_types or 'desktop' in client_types): # then we still need to emit the change the the status of the job parameter so the client stops polling pjo = _param_json_overview(b.get_parameter(uniqueid=msg.get('uniqueid'), check_visible=False, check_default=False)) @@ -1718,7 +1703,6 @@ def bundle_method(msg): packet = {'success': True, 'requestid': requestid, 'parameters': param_dict} emit('{}:changes:react'.format(bundleid), packet, broadcast=True) - return if method.split('_')[0] == 'add': @@ -1743,7 +1727,6 @@ def bundle_method(msg): ps_list += param_constraint.vars.to_list() b.run_delayed_constraints() - # handle any deleted parameters removed_params_list = [param.uniqueid for param in ps_list if param._bundle is None] @@ -1761,7 +1744,6 @@ def bundle_method(msg): # and so have the available entries for as_distributions packet['params_allow_dist'] = {p.uniqueid: p.twig for p in b.filter(context=['component', 'system', 'dataset', 'feature'], check_visible=True).to_list() if p.__class__.__name__ in ['FloatParameter', 'FloatArrayParameter']} - if method.split('_')[0] == 'add' and method not in ['add_constraint']: context = method.split('_')[1] packet['add_filter'] = {context: getattr(ps.filter(context=context, check_visible=False), context)} @@ -1798,7 +1780,6 @@ def bundle_method(msg): emit('{}:changes:python'.format(bundleid), packet, broadcast=True) - @socketio.on('rerun_all_figures') def rerun_all_figures(msg): if app._verbose: @@ -1806,8 +1787,8 @@ def rerun_all_figures(msg): bundleid = msg.pop('bundleid', None) requestid = msg.pop('requestid', None) - clientid = msg.pop('clientid', None) - client_version = msg.pop('client_version', None) + #clientid = msg.pop('clientid', None) + #client_version = msg.pop('client_version', None) if bundleid is None: emit('errors', {'success': False, 'error': "must provide bundleid"}, broadcast=False) @@ -1821,7 +1802,6 @@ def rerun_all_figures(msg): emit('{}:errors:python'.format(bundleid), {'success': False, 'requestid': requestid, 'error': err}, broadcast=False) return - b = app._bundles[bundleid] app._last_access_per_bundle[bundleid] = datetime.now()