def terminate(n_intervals, nav): OFF = '86400000' # str(24*60*60*1000) update once per day ON = '500' # str(1*1000) update every second nav = utils.UrlNav(*json.loads(nav)) if qparse.Compiler(nav.test_id).running: log.debug('[%d], %s running, refresh ON', n_intervals, nav.test_id) return ON log.debug('[%d], %s terminated, refresh OFF', n_intervals, nav.test_id) return OFF
def set_active_link(clicks, nav, menu_items): 'set active classname on menuitem if its page is current' nav = utils.UrlNav(*json.loads(nav)) for item in menu_items: prop = item['props'] href = prop.get('href', None) prop['className'] = 'active' if href == nav.page_id else '' log.debug('returning %s', len(menu_items)) return menu_items
def update_modal(nvals, nav, kids): 'display QueryHandler.msgs while it is running' nav = utils.UrlNav(*json.loads(nav)) log.debug('[%s] update_modal', nvals) qh = QueryHandler.find(nav.test_id) if qh and qh.running: log.debug(' - return %s QueryHandler.msgs', len(qh.msgs)) return html.Pre('\n'.join(qh.msgs)) log.debug(' - returning %s kids', len(kids)) return kids
def toggle_updates(style, nvals, nav): 'stop updating if there is no QueryHandler for nav anymore' ON = '500' # once/second OFF = '86400000' # once/day nav = utils.UrlNav(*json.loads(nav)) qh = QueryHandler.find(nav.test_id) rv = ON if qh and qh.running else OFF msg = 'running -> ON' if qh and qh.running else 'not found -> OFF' log.debug('QueryHandler(%s) - %s', nav.test_id, msg) return rv
def goto_page(nav, controls): 'navigate to page using app nav contents' nav = utils.UrlNav(*json.loads(nav)) # if nav else {} log.debug('nav %s', nav) cache = [x['props'] for x in controls if x['props']['id'] == nav.controls] cache = cache[0].get('children', None) if len(cache) else None page_cache = json.loads(cache) if cache else None page = PAGES.get(nav.page_id, None) if page is None: return html.Div('404 - {!r} - not found'.format(nav.page_id)) log.debug('layout(%s)', nav.page_id) return page.layout(nav, page_cache)
def urlparms(href): 'turn href into dict with mantra-fields' # Mantra uses the following scheme: # - url = scheme://usr:pwd@netloc:8050/path;param?query=arg#frag # - parts after path are optional # - param, if present, is always a unique test_id # - qry=arg[;q2=arg2,..], if any, is meaningful only to app_<path> # - frag, if any, is a single fragment, meaningful only to app_<path> # - examples: # - /compile;test_id # - /run;test_id?q=<nr> # - parsed.query := dict, repeated <param>=arg collapse into last one seen href = href if href else '/' log.debug('href %s', href) parsed = urllib.parse.urlparse(href) nav = { 'href': href, 'scheme': parsed.scheme, 'netloc': parsed.netloc, 'path': parsed.path if parsed.path else '/', 'param': parsed.params if parsed.params else '', 'query': dict(urllib.parse.parse_qs(parsed.query)), 'fragments': parsed.fragment, 'username': parsed.username, 'password': parsed.password, 'hostname': parsed.hostname, 'port': parsed.port, } # mantra specifics test_id = parsed.params if parsed.params else '' nav['page_id'] = parsed.path if parsed.path else '/' nav['test_id'] = test_id nav['controls'] = utils.get_domid('controls', parsed.path) nav['vars'] = utils.get_domid('vars', parsed.path) # log.debug('nav %s', nav) urlnav = utils.UrlNav(href, dict(urllib.parse.parse_qs(parsed.query)), parsed.fragment, parsed.path if parsed.path else '/', parsed.params if parsed.params else '', utils.get_domid('controls', parsed.path), utils.get_domid('vars', parsed.path)) log.debug('%s, page_id %s', href, urlnav.page_id) return urlnav
def progress(intervals, nav, progress): 'display compiler log file periodically' nav = utils.UrlNav(*json.loads(nav)) if nav.test_id is None: return html.Div('No Compile target: {}?'.format(nav.test_id)) c = qparse.Compiler(nav.test_id) if not c.running and intervals == 0: log.debug('Starting compiler for %s', nav.test_id) c.start(nav, cfg) # first time around, start compiler time.sleep(1) # give thread chance to start if c.running: log.debug('[%s] %s running', intervals, c.job) try: with open(c.logfile, 'r') as fh: rv = fh.readlines() progress = html.Pre(''.join(rv)) except OSError: log.error('%s not found/readable', c.logfile) return html.Div('error reading compiler log file %s' % c.logfile) return html.Div(children=[progress])