def ht_remoteHtableViewStore(self, table=None, caption_field=None, condition=None, condition_kwargs=None, caption=None, dbstore=None, columns=None, related_kwargs=None, **kwargs): b = Bag() tblobj = self.db.table(table) caption = caption or tblobj.name_plural condition_kwargs = condition_kwargs or dict() condition_kwargs.update(dictExtract(kwargs, 'condition_')) v = TableHandlerTreeResolver(_page=self, table=table, caption_field=caption_field, condition=condition, dbstore=dbstore, columns=columns, related_kwargs=related_kwargs, condition_kwargs=condition_kwargs) b.setItem('root', v, caption=caption, child_count=1, pkey='', treeIdentifier='_root_') return b
def ht_moveHierarchical(self, table=None, pkey=None, into_pkey=None, parent_id=None, into_parent_id=None, modifiers=None): tblobj = self.db.table(table) if not modifiers: into_pkey = into_pkey or None tblobj.batchUpdate(dict(parent_id=into_pkey), where='$id=:pkey', pkey=pkey) self.db.commit() elif (modifiers == 'Shift' or modifiers == 'Shift,Meta') and ( into_parent_id == parent_id) and tblobj.column('_row_count') is not None: where = '$parent_id=:p_id' if parent_id else '$parent_id IS NULL' f = tblobj.query(where=where, p_id=parent_id, for_update=True, order_by='$_row_count', addPkeyColumn=False).fetch() b = Bag([(r['id'], dict(r)) for r in f]) pref = '>' if modifiers == 'Shift' else '<' b.setItem(pkey, b.pop(pkey), _position='%s%s' % (pref, into_pkey)) for k, r in enumerate(b.values()): counter = k + 1 if r['_row_count'] != counter: old_rec = dict(r) r['_row_count'] = counter tblobj.update(r, old_rec) self.db.commit()
def load(self): page = self._page mailbox_tblobj = page.db.table('email.mailbox') where = '$parent_id IS NULL' if self.parent_id: where = '$parent_id=:p_id' #sottopratiche elif self.account_id: where = '$account_id =:a_id AND $parent_id IS NULL' elif self.user_id: where = 'user_id=:u_id AND $parent_id IS NULL' else: where = '$parent_id IS NULL AND $user_id IS NULL AND $account_id IS NULL' q = mailbox_tblobj.query(where=where, p_id=self.parent_id, columns='*,$child_count', a_id=self.account_id, u_id=self.user_id, order_by='$system_code,$name') result = Bag() mailboxes = q.fetch() for mb in mailboxes: record = dict(mb) caption = mb['name'] pkey = record['id'] result.setItem(pkey, MailboxResolver(_page=page, parent_id=pkey), caption=caption, child_count=record['child_count'], pkey=pkey, account_id=record['account_id'], system_code=record['system_code'], parent_id=self.parent_id) return result
def _buildSiteMenu_prepare(self, menubag, basepath=None): basepath = basepath or [] result = Bag() for node in menubag.nodes: value = node.getStaticValue() attributes = {} attributes.update(node.getAttr()) currbasepath = basepath if 'basepath' in attributes: newbasepath = attributes.pop('basepath') if newbasepath.startswith('/'): currbasepath = [self.site.home_uri + newbasepath[1:]] else: currbasepath = basepath + [newbasepath] if isinstance(value, Bag): value = self._buildSiteMenu_prepare(value, currbasepath) else: value = None filepath = attributes.get('file') if filepath: if not filepath.startswith('/'): attributes['file'] = os.path.join(*(currbasepath + [filepath])) else: attributes['file'] = self.site.home_uri + filepath.lstrip('/') result.setItem(node.label, value, attributes) return result
def rpc_getNewEvent(self): b = Bag() b.setItem( 'id2', None, { 'id': 'id2', 'date': '2008-12-26::D', 'start_time': "2008-12-26 13:00:00::DH", 'end_time': "2008-12-26 15:00:00::DH", 'all_day': False, 'repeated': False, 'title': "Title 2", 'description': "This is the body of entry with id: id3 and title: Title 3", 'event_type': "reminder,meeting" }) b.setItem( "2008-12-27", None, { 'id': 'id4', 'date': "2008-12-27::D", 'start_time': "2008-12-27 16:00:00::DH", 'end_time': "2008-12-27 17:00:00::DH", 'all_day': False, 'repeated': False, 'title': "Title 4", 'description': "This is the body of entry with id: id3 and title: Title 3", 'event_type': "reminder,meeting" }) return b
def get_datachanges(self, page_id, user=None, local_datachanges=None): """add??? :param page_id: add??? :param user: add???. Default value is ``None`` :param local_datachanges: add???. Default value is ``None`` :returns: add??? """ result = Bag() local_datachanges = local_datachanges or [] with self.register.pageStore(page_id) as pagestore: external_datachanges = list(pagestore.datachanges) or [] subscriptions = pagestore.getItem('_subscriptions') or Bag() pagestore.reset_datachanges() store_datachanges = [] for storename, storesubscriptions in subscriptions.items(): store = self.register.userStore(user) if storename == 'user' else self.register.stores(storename) with store: self._get_storechanges(store, storesubscriptions.items(), page_id, store_datachanges) for j, change in enumerate(external_datachanges + local_datachanges + store_datachanges): result.setItem('sc_%i' % j, change.value, change_path=change.path, change_reason=change.reason, change_fired=change.fired, change_attr=change.attributes, change_ts=change.change_ts, change_delete=change.delete) return result
def load(self): page = self._page mailbox_tblobj = page.db.table('email.mailbox') where = '$parent_id IS NULL' if self.parent_id: where='$parent_id=:p_id' #sottopratiche elif self.account_id: where = '$account_id =:a_id AND $parent_id IS NULL' elif self.user_id: where='user_id=:u_id AND $parent_id IS NULL' else: where = '$parent_id IS NULL AND $user_id IS NULL AND $account_id IS NULL' q = mailbox_tblobj.query(where=where,p_id=self.parent_id,columns='*,$child_count', a_id=self.account_id,u_id=self.user_id,order_by='$system_code,$name') result = Bag() mailboxes = q.fetch() for mb in mailboxes: record = dict(mb) caption = mb['name'] pkey = record['id'] result.setItem(pkey,MailboxResolver(_page=page,parent_id=pkey), caption=caption, child_count=record['child_count'],pkey=pkey, account_id=record['account_id'],system_code=record['system_code'], parent_id=self.parent_id) return result
def queryFromQueryBase(self): result = Bag() querybase = self.queryBase() op_not = querybase.get('op_not', 'yes') column = querybase.get('column') column_dtype = None if column: column_dtype = self.tblobj.column(column).getAttr('dtype') not_caption = ' ' if op_not == 'yes' else '!!not' result.setItem( 'c_0', querybase.get('val'), { 'op': querybase.get('op'), 'column': column, 'op_caption': '!!%s' % self.db.whereTranslator.opCaption(querybase.get('op')), 'not': op_not, 'not_caption': not_caption, 'column_dtype': column_dtype, 'column_caption': self.app._relPathToCaption(self.maintable, column) }) return result
def main(self,root,**kwargs): tblnuts = self.db.table('glbl.nuts') b = Bag() root_id = tblnuts.readColumns(columns='$id',where='$code=:c',c='IT') z = tblnuts.query(where="""$hierarchical_pkey LIKE :p || '%%'""",p=root_id, order_by='$hierarchical_pkey',columns='$hierarchical_pkey,$code,$description,$level').fetch() comuni_gruped = self.db.table('glbl.comune').query(columns='$codice_comune,$sigla_provincia,$denominazione,$superficie,$popolazione_residente,@sigla_provincia.nome AS nome_provincia', addPkeyColumn=False).fetchGrouped('nome_provincia') for r in z: r = dict(r) v = Bag() b.setItem(r['hierarchical_pkey'].replace('/','.'), v,**r) if r['level'] == 3 and r['description'] in comuni_gruped: for c in comuni_gruped[r['description']]: c['level'] = r['level']+1 v.setItem(c['codice_comune'],None,**dict(c)) root.data('albero_comuni_z',b) root.dataFormula('albero_comuni','albero_comuni.deepCopy()',albero_comuni='=albero_comuni_z',_onStart=1000) bc = root.borderContainer() left = bc.contentPane(region='left',width='600px',splitter=True) bc.contentPane(region='center',background='red') tree = left.treeGrid(storepath='albero_comuni') tree.column('descrizione',name='Descrizione', contentCb="""return this.attr.description || (this.attr.codice_comune +'-'+ this.attr.denominazione)""") tree.column('superficie',dtype='L',size=60,emptyValue=0,name='Sup.') tree.column('popolazione_residente',dtype='L',size=60,emptyValue=0,name='Pop.') bc.contentPane(region='bottom',height='150px',splitter=True,background='green')
def testmerge(self): newbag = Bag() newbag.setItem('Henry', self.fullbag['friends.Henry'], role='documentation and tests') newbag.setItem('Xavier', 'Mr Xavier', role='documentation manager', age=26) allflagstrue = self.fullbag['office'].merge(newbag) #all flags true allflagsfalse = self.fullbag['office'].merge(newbag, upd_values=False, add_values=False, upd_attr=False, add_attr=False) self.assertEqual(allflagsfalse.asString(), self.fullbag['office'].asString()) notupdatevalues = self.fullbag['office'].merge(newbag, upd_values=False) self.assertTrue(isinstance(self.fullbag['office.Xavier'], Bag)) notaddvalues = self.fullbag['office'].merge(newbag, add_values=False) self.assertEqual(len(self.fullbag['office'].items()), len(notaddvalues.items())) notupdateattrs = self.fullbag['office'].merge(newbag, upd_attr=False) self.assertEqual(self.fullbag['office.Xavier?a:role'], notupdateattrs['Xavier?a:role']) notaddattrs = self.fullbag['office'].merge(newbag, add_attr=False) self.assertFalse(notaddattrs.getAttr('Xavier', 'age', default=False))
def table_script_resource_tree_data(self, table=None, res_type=None): #pkg,tblname = table.split('.') tblobj = self.db.table(table) pkg = tblobj.pkg.name tblname = tblobj.name result = Bag() resources = self.site.resource_loader.resourcesAtPath( page=self, pkg=None, path='tables/_default/%s' % res_type) resources_pkg = self.site.resource_loader.resourcesAtPath( page=self, pkg=pkg, path='tables/%s/%s' % (tblname, res_type)) resources_custom = self.site.resource_loader.resourcesAtPath( page=self, pkg=self.package.name, path='tables/_packages/%s/%s/%s' % (pkg, tblname, res_type)) resources.update(resources_pkg) resources.update(resources_custom) forbiddenNodes = [] def cb(node, _pathlist=None): has_parameters = False if node.attr['file_ext'] == 'py': resmodule = gnrImport(node.attr['abs_path']) tags = getattr(resmodule, 'tags', '') if tags and not self.application.checkResourcePermission( tags, self.userTags): if node.label == '_doc': forbiddenNodes.append('.'.join(_pathlist)) return caption = getattr(resmodule, 'caption', node.label) description = getattr(resmodule, 'description', '') description = getattr(resmodule, 'needSelection', True) if node.label == '_doc': result.setAttr( '.'.join(_pathlist), dict(caption=caption, description=description, tags=tags, has_parameters=has_parameters)) else: mainclass = getattr(resmodule, 'Main', None) assert mainclass, 'Main class is mandatory in tablescript resource' has_parameters = hasattr(mainclass, 'parameters_pane') result.setItem('.'.join(_pathlist + [node.label]), None, caption=caption, description=description, resource=node.attr['rel_path'][:-3], has_parameters=has_parameters) pl = [] resources.walk(cb, _pathlist=pl) if '_common' in result: n = result.popNode('_common') if len(result): result.setItem('r_zz', None, caption='-') result.setItem(n.label, n.value, n.attr) for forbidden in forbiddenNodes: result.pop(forbidden) return result
def rpc_getItems(self, url=None, **kwargs): rss = Bag(url)['rss.channel'].digest('#v') rows = Bag() for i, item in enumerate(rss): if isinstance(item, Bag): rows.setItem('n_%i' % i, None, title=item['title'], link=item['link'], description=item['description']) return rows
def getProcessesBag(self, columns=None, userName=None, processName=None, memPerc=None, cpuPerc=None): columns = (columns or 'pid,name').split(',') result = Bag() for p in psutil.process_iter(): if userName and userName != p.username: continue if processName and not re.match(processName, p.name): continue d = p.as_dict() d['create_time'] = datetime.datetime.fromtimestamp( d['create_time']) d['cpu_percent'] = d['cpu_percent'] or 0. d['memory_percent'] = d['memory_percent'] or 0. if memPerc and d['memory_percent'] < memPerc: continue if cpuPerc and d['cpu_percent'] < cpuPerc: continue row = Bag([(k, d[k]) for k in columns if k in d]) result.setItem('p_%s' % p.pid, row) return result
def getSyncTables(self, _querystring=None, _id=None, **kwargs): result = Bag() if _id: tableobj = self.db.table(_id) tblattr = tableobj.attributes caption = tableobj.fullname result.setItem( _id.replace('.', '_'), None, caption=caption, multidb='complete' if tblattr['multidb'] == '*' else 'partial', tablename=caption, _pkey=caption) return result, dict(columns='tablename,multidb', headers='Table,Multidb') if _querystring: _querystring = _querystring.replace('*', '') for pkgobj in self.db.packages.values(): for tableobj in pkgobj.tables.values(): tblattr = tableobj.attributes caption = tableobj.fullname if tblattr.get('multidb') and _querystring in caption: result.setItem('%s_%s' % (pkgobj.id, tableobj.name), None, caption=caption, multidb='complete' if tblattr['multidb'] == '*' else 'partial', tablename=caption, _pkey=caption) return result, dict(columns='tablename,multidb', headers='Table,Multidb')
def getTemplate(self, letterhead_id=None, name=None): if not (name or letterhead_id): return Bag() result = Bag() if letterhead_id: pkeys = self.letterheadChain(letterhead_id) f = self.query(where='$id IN :pkeys', pkeys=pkeys, columns='*,$data').fetchAsDict('id') if not f: return result for i, pkey in enumerate(pkeys): result.setItem('layer_%i' % i, Bag(f[pkey]['data'])) if f[letterhead_id]['next_letterhead_id']: result['next_letterhead'] = self.getTemplate( f[letterhead_id]['next_letterhead_id']) return result else: templatelist = name.split(',') f = self.query(where='$name IN :names', names=templatelist, columns='name,version,data').fetchAsDict(key='name') if not f: return result for i, name in enumerate(templatelist): result.setItem('layer_%i' % i, Bag(f[name]['data'])) return result
def _columnPythonCode(self,col,relation=None): attributes = Bag() col = col.deepcopy() name = col.pop('name') dtype = col.pop('dtype') size = col.pop('size') name_long = col.pop('name_long') name_short = col.pop('name_short') tag = col.pop('tag') #column,formulaColumn,aliasColumn,pyColumn if dtype and dtype not in ('A','T','C'): attributes['dtype'] = dtype if size: attributes['size'] = size attributes.setItem('name_long', name_long or name,localized=True) if name_short: attributes.setItem('name_short', name_short,localized=True) attributes.update(col) relationCode = '' if relation and relation['relation']: relationCode = '.%s' %self._relationPythonCode(relation) coltype = 'column' if attributes['sql_formula'] or attributes['select'] or attributes['exists']: coltype = 'formulaColumn' elif attributes['relation_path']: coltype = 'aliasColumn' elif attributes['pymethod']: coltype = 'pyColumn' return "tbl.%s('%s'%s)%s" % (coltype,name, self.bagToArgString(attributes),relationCode)
def tableTreeBag(self, packages=None, omit=None, tabletype=None): """add??? :param packages: add???. Default value is ``None`` :param omit: add???. Default value is ``None`` :param tabletype: add???. Default value is ``None`` :returns: add??? """ result = Bag() for pkg, pkgobj in self.packages.items(): if (pkg in packages and omit) or (not pkg in packages and not omit): continue pkgattr = dict(pkgobj.attributes) pkgattr['caption'] = pkgobj.attributes.get('name_long', pkg) result.setItem(pkg, Bag(), **pkgattr) for tbl, tblobj in pkgobj.tables.items(): tblattr = dict(tblobj.attributes) if tabletype and tblattr.get('tabletype') != tabletype: continue tblattr['caption'] = tblobj.attributes.get('name_long', pkg) result[pkg].setItem(tbl, None, **tblattr) if len(result[pkg]) == 0: result.pop(pkg) return result
def _columnPythonCode(self, col, relation=None): attributes = Bag() col = col.deepcopy() name = col.pop('name') dtype = col.pop('dtype') size = col.pop('size') name_long = col.pop('name_long') name_short = col.pop('name_short') tag = col.pop('tag') #column,formulaColumn,aliasColumn,pyColumn if dtype and dtype not in ('A', 'T', 'C'): attributes['dtype'] = dtype if size: attributes['size'] = size attributes.setItem('name_long', name_long or name, localized=True) if name_short: attributes.setItem('name_short', name_short, localized=True) attributes.update(col) relationCode = '' if relation and relation['relation']: relationCode = '.%s' % self._relationPythonCode(relation) coltype = 'column' if attributes['sql_formula'] or attributes['select'] or attributes[ 'exists']: coltype = 'formulaColumn' elif attributes['relation_path']: coltype = 'aliasColumn' elif attributes['pymethod']: coltype = 'pyColumn' return "tbl.%s('%s'%s)%s" % ( coltype, name, self.bagToArgString(attributes), relationCode)
def result_bag(self, result): error = getattr(self, 'error', None) page = self.page envelope = Bag() resultAttrs = {} if isinstance(result, tuple): resultAttrs = result[1] if len(result) == 3 and isinstance(result[2], Bag): page.setInClientData(result[2]) result = result[0] if resultAttrs is not None: envelope['resultType'] = 'node' if error: envelope['error'] = error if isinstance(result, page.domSrcFactory): resultAttrs['__cls'] = 'domsource' if page.isLocalizer(): envelope['_localizerStatus'] = '*_localizerStatus*' envelope.setItem('result', result, _attributes=resultAttrs) dataChanges = self.page.collectClientDatachanges() if dataChanges: envelope.setItem('dataChanges', dataChanges) page.response.content_type = "text/xml" xmlresult = envelope.toXml(unresolved=True, translate_cb=page.localizer.translateText, omitUnknownTypes=True, catalog=page.catalog) if page.isLocalizer(): xmlresult = xmlresult.replace('*_localizerStatus*', page.localizer.status) return xmlresult
def configDefault_CORE(self, record=None): stressbag = record['stress_tracks'] stressbag['p'] = Bag(dict(track_name='Physical', n_boxes=2, code='p', skill='PHYSIQUE', extra_box_1=1, extra_box_2=3, extra_box_3=None)) stressbag['m'] = Bag(dict(track_name='Mental', n_boxes=2, code='m', skill='WILL', extra_box_1=1, extra_box_2=3, extra_box_3=None)) record.update(dict(pc_phases=3, game_creation=True, use_phases=True)) if record['use_approaches']: record.update(dict( approach_set='STD')) else: consequences_slots = Bag(record['consequences_slots']) consequences_slots.setItem('mild2', Bag(dict(code='m2', shifts=2, label='Mild opt.', skill='PHYSIQUE', lv=5)), _position=1) record.update(dict(stunt_sets='STD', skill_sets='STD', skill_cap=4, consequences_slots=consequences_slots))
def storeBottoni(self, selected_pkey=None, **kwargs): tbl_prodotto_tipo = self.db.table('fatt.prodotto_tipo') where = """(CASE WHEN :selected_pkey IS NULL THEN $parent_id IS NULL ELSE $parent_id = :selected_pkey END) AND ($child_count>0 OR @prodotti.id IS NOT NULL) """ template = "%(descrizione)s" f = tbl_prodotto_tipo.query(where=where, selected_pkey=selected_pkey).fetch() _class = 'bottone bottone_tipo_prodotto' isFinalValue = False if not f: f = self.db.table('fatt.prodotto').query( where='$prodotto_tipo_id=:selected_pkey', selected_pkey=selected_pkey).fetch() template = "Codice:%(codice)s<br/>%(descrizione)s<br/>P.U.:%(prezzo_unitario)2f" _class = 'bottone bottone_prodotto' isFinalValue = True result = Bag() for i, r in enumerate(f): result.setItem('r_%s' % i, template % r, pkey=r['pkey'], isFinalValue=isFinalValue, _class=_class) return result
def _maintenance_get_items(self, items, child_name=None,exclude_guest=None, **kwargs): result = Bag() now = datetime.now() for item in items: item = dict(item) key = item['register_item_id'] item.pop('data',None) if exclude_guest and ( key.startswith('guest_') or item.get('user','').startswith('guest_')): continue _customClasses = [] item['_pkey'] = key item['alive'] = True item['age'] = (now - item.get('start_ts')).seconds item['last_refresh_age'] = (now - item.get('last_refresh_ts',item['start_ts'])).seconds item['last_event_age'] = (now - item.get('last_user_ts',item['start_ts'])).seconds item['last_rpc_age'] = (now - item.get('last_rpc_ts',item['start_ts'])).seconds if item['last_refresh_age'] > 60: item['alive'] = False _customClasses.append('disconnected') elif item['last_event_age'] > 60: _customClasses.append('inactive') #if child_name and not item[child_name]: # _customClasses.append('no_children') item.pop('datachanges', None) #if child_name is None: # self.maintenance_cellServerProfile(item) result.setItem(key, None, _customClasses=' '.join(_customClasses), **item) return result
def getTestData(self, n=None, count=None, interval=None, dtstart=None, series=None, datamode=None): result = Bag() if n: g = xrange(1, n) else: g = rrule.rrule(rrule.MINUTELY, count=count, interval=interval, dtstart=dtstart) j = 0 for i in g: attr = OrderedDict(c_0=i) for k, s in enumerate(series): attr['c_%s' % (k + 1)] = randint(*s) if datamode == 'value': result.setItem('r_%s' % j, Bag(attr)) else: result.setItem('r_%s' % j, None, attr) j += 1 return result
def onLoading(self, record, newrecord, loadingParameters, recInfo): tags = record['auth_tags'] b = Bag() if tags: for n, tag in enumerate(tags.split(',')): b.setItem('r%i.tagname' % n, tag) record.setItem('tag_bag', b, _bag_md5=tags)
def getTableContraints(self, table=None, schema=None): """Get a (list of) dict containing details about a column or all the columns of a table. Each dict has those info: name, position, default, dtype, length, notnull Every other info stored in information_schema.columns is available with the prefix '_mysql_'""" sql = """SELECT constraint_type,column_name,tc.table_name,tc.table_schema,tc.constraint_name FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS cu ON cu.constraint_name=tc.constraint_name WHERE constraint_type='UNIQUE' %s%s;""" filtertable = "" if table: filtertable = " AND tc.table_name=:table" filterschema = "" if schema: filterschema = " AND tc.table_schema=:schema" result = self.dbroot.execute(sql % (filtertable, filterschema), dict(schema=schema, table=table)).fetchall() res_bag = Bag() for row in result: row = dict(row) res_bag.setItem( '%(table_schema)s.%(table_name)s.%(column_name)s' % row, row['constraint_name']) return res_bag
class DojoApiReader(object): discard = ['provides', 'resources', 'mixins'] discard = [] def __init__(self, apipath, resultpath=None): self.resultpath = resultpath or os.path.dirname(apipath) self.source = Bag(apipath)['javascript'] self.apibag = Bag() for node in self.source: attr = dict(node.attr) value = node.value location = attr.pop('location') if isinstance(value, Bag): value = self.convertObject(value) if location in self.apibag: print 'redefining object:', location else: self.write(location, value, attr) self.apibag.setItem(location, value, attr) def write(self, location, obj, attr): destpath = [self.resultpath, 'objects' ] + location.split('.') + 'obj.xml' if attr: print attr destpath = os.path.join(**destpath) obj.toXml(destpath, autocreate=True) def convertObject(self, src): result = Bag() for node in src: label = node.label if label in self.discard: continue attr = dict(node.attr) value = node.value if label == 'mixins': label = 'mixins_%s' % attr.get('scope', 'undefined_scope') if isinstance(value, Bag): value = self.convertItems(value) if label in result: print 'redefining:', label result.setItem(label, value, attr) return result def convertItems(self, items): result = Bag() for k, node in enumerate(items): label = node.label value = node.value attr = dict(node.attr) if label == 'method': label = attr.get('name') if label == 'property': label = attr.get('name') else: label = 'r_%i' % k if label: result.setItem(label, value, attr) return result
class StaticHandlerManager(object): """ This class handles the StaticHandlers""" def __init__(self, site): self.site = site self.statics = Bag() def addAllStatics(self, module=None): """inspect self (or other modules) for StaticHandler subclasses and do addStatic for each""" module = module or sys.modules[self.__module__] def is_StaticHandler(cls): return inspect.isclass(cls) and issubclass(cls, StaticHandler) and cls is not StaticHandler statichandler_classes = inspect.getmembers(module, is_StaticHandler) for statichandler in statichandler_classes: self.add(statichandler[1]) def add(self, static_handler_factory, **kwargs): static_handler = static_handler_factory(self.site, **kwargs) self.statics.setItem(static_handler.prefix, static_handler, **kwargs) def get(self, static_name): return self.statics[static_name] def static_dispatcher(self, path_list, environ, start_response, download=False, **kwargs): handler = self.get(path_list[0][1:]) if handler: return handler.serve(path_list, environ, start_response, download=download, **kwargs) else: return self.site.not_found_exception(environ, start_response)
def getMoverTableRows(self,tablerow=None,movercode=None,**kwargs): pkeys = tablerow['pkeys'].keys() table = tablerow['table'] objtype = tablerow['objtype'] tblobj = self.db.table(table) columns,mask = tblobj.rowcaptionDecode(tblobj.rowcaption) if columns: columns = ','.join(columns) f = tblobj.query(where='$pkey IN :pkeys',pkeys=tablerow['pkeys'].keys(),columns=columns).fetch() result = Bag() for r in f: result.setItem(r['pkey'],None,_pkey=r['pkey'],db_caption=tblobj.recordCaption(record=r),_customClasses='mover_db') indexpath = self.page.site.getStaticPath('user:temp','mover','index.xml') if os.path.isfile(indexpath): indexbag = Bag(indexpath) moverrows = indexbag.getItem('records.%s' %movercode) if not moverrows: return result for pkey in pkeys: rownode = moverrows.getNode(pkey) if rownode: xml_caption=rownode.attr['caption'] if not pkey in result: result.setItem(pkey,None,_pkey=pkey,xml_caption=xml_caption,_customClasses='mover_xml',objtype=objtype,table=tablerow['reftable']) else: result.getNode(pkey).attr.update(xml_caption=xml_caption,_customClasses='mover_both',objtype=objtype,table=tablerow['reftable']) return result
def fh_slotbar_form_add(self, pane, parentForm=True, defaults=None, **kwargs): menupath = None if defaults: menubag = Bag() for i, (caption, default_kw) in enumerate(defaults): menubag.setItem('r_%i' % i, None, caption=caption, default_kw=default_kw) pane.data('.addrow_menu_store', menubag) menupath = '.addrow_menu_store' pane.slotButton('!!Add', action='this.form.newrecord($1.default_kw);', menupath=menupath, iconClass="iconbox add_record", parentForm=parentForm, **kwargs) else: pane.formButton('!!Add', topic='navigationEvent', command='add', iconClass="iconbox add_record", parentForm=parentForm, **kwargs)
def te_renderTemplate(self, templateBuilder, record_id=None, extraData=None, locale=None,contentOnly=False,**kwargs): record = Bag() if record_id: record = templateBuilder.data_tblobj.record(pkey=record_id, virtual_columns=templateBuilder.virtual_columns).output('bag') else: record = templateBuilder.data_tblobj.record(pkey='*sample*',ignoreMissing=True, virtual_columns=templateBuilder.virtual_columns).output('sample') if extraData: record.update(extraData) locale = locale or templateBuilder.locale formats = templateBuilder.formats or dict() masks = templateBuilder.masks or dict() editcols = templateBuilder.editcols or dict() df_templates = templateBuilder.df_templates or dict() dtypes = templateBuilder.dtypes or dict() record.setItem('_env_', Bag(self.db.currentEnv)) #record.setItem('_template_', templateBuilder.doctemplate_info) htmlContent = templateReplace(templateBuilder.doctemplate,record, safeMode=True,noneIsBlank=False,locale=locale, formats=formats,masks=masks,editcols=editcols,df_templates=df_templates, dtypes=dtypes,localizer=self.localizer, urlformatter=self.externalUrl) if contentOnly: return htmlContent body = templateBuilder(htmlContent=htmlContent, record=record,page_debug='silver',**kwargs) return body
def getTableContraints(self, table=None, schema=None): """Get a (list of) dict containing details about a column or all the columns of a table. Each dict has those info: name, position, default, dtype, length, notnull Every other info stored in information_schema.columns is available with the prefix '_pg_'""" sql = """SELECT CONSTRAINT_TYPE,COLUMN_NAME,TC.TABLE_NAME,TC.TABLE_SCHEMA,TC.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS CU ON CU.CONSTRAINT_NAME=TC.CONSTRAINT_NAME WHERE CONSTRAINT_TYPE='UNIQUE' %s%s;""" filtertable = "" if table: filtertable = " AND TC.TABLE_NAME=:table" filterschema = "" if schema: filterschema = " AND TC.TABLE_SCHEMA=:schema" result = self.dbroot.execute(sql % (filtertable,filterschema), dict(schema=schema, table=table)).fetchall() res_bag = Bag() for row in result: row=dict(row) res_bag.setItem('%(TABLE_SCHEMA)s.%(TABLE_NAME)s.%(COLUMN_NAME)s'%row,row['CONSTRAINT_NAME']) return res_bag
def test_2_rrc(self, pane): """First test description""" pane.data('.dati', self.getDati()) pane.dataController('SET .gridstore = dati.deepCopy();', dati='=.dati', _fired='^loadBag') frame = pane.bagGrid( frameCode='rrc', title='remoteRowController test', struct=self.gridstruct_2, height='300px', table='glbl.localita', storepath='.gridstore', grid_remoteRowController=self.test_remoteRowController, default_descrizione='riga acquisto', grid_remoteRowController_defaults=dict(provincia='MI', qty=8), grid_menuPath='aaa') b = Bag() b.setItem('m_1', None, caption='poppo', action='ciao') pane.data('aaa', b) bar = frame.bottom.slotBar('loadbtn,testbtn') bar.loadbtn.button('Load', fire='.loadBag') bar.testbtn.button('Test', action=""" var t = new gnr.GnrBag(); t.setItem('r2',null,{city:'roma',address:'corso como'}); t.setBackRef(); var v = t.getItem('r2.city?=#z') console.log('xxxx',v) """)
def fgr_slotbar_addrow( self, pane, _class="iconbox add_row", disabled="^.disabledButton", enable=None, delay=300, defaults=None, **kwargs ): kwargs.setdefault("visible", enable) menupath = None if defaults: menubag = Bag() for i, (caption, default_kw) in enumerate(defaults): menubag.setItem("r_%i" % i, None, caption=caption, default_kw=default_kw) pane.data(".addrow_menu_store", menubag) menupath = ".addrow_menu_store" return pane.slotButton( label="!!Add", publish="addrow", iconClass=_class, disabled=disabled, _delay=delay, menupath=menupath, **kwargs )
def _pe_getLetterhead(self, letterhead_id=None, **kwargs): letterheadtbl = self.db.table('adm.htmltemplate') next_letterhead_id = None if ',' in letterhead_id: letterhead_id, next_letterhead_id = letterhead_id.split(',') else: next_letterhead_id = letterheadtbl.readColumns( pkey=letterhead_id, columns='$next_letterhead_id') result = Bag() base = letterheadtbl.getHtmlBuilder(letterhead_pkeys=letterhead_id) base.finalize(base.body) basehtml = base.root.getItem('#0.#1').toXml( omitRoot=True, autocreate=True, forcedTagAttr='tag', docHeader=' ', addBagTypeAttr=False, typeattrs=False, self_closed_tags=['meta', 'br', 'img']) result.setItem('page_base', basehtml) if next_letterhead_id: next = letterheadtbl.getHtmlBuilder( letterhead_pkeys=next_letterhead_id) base.finalize(next.body) nexthtml = next.root.getItem('#0.#1').toXml( omitRoot=True, autocreate=True, forcedTagAttr='tag', docHeader=' ', addBagTypeAttr=False, typeattrs=False, self_closed_tags=['meta', 'br', 'img']) result.setItem('page_next', nexthtml) return result
def _maintenance_get_items(self, items, child_name=None,exclude_guest=None, **kwargs): result = Bag() now = datetime.now() for key, item in items.items(): item = dict(item) item.pop('data',None) if exclude_guest and ( key.startswith('guest_') or item.get('user','').startswith('guest_')): continue _customClasses = [] item['_pkey'] = key item['alive'] = True item['age'] = (now - item['start_ts']).seconds last_refresh_ts = item.get('last_refresh_ts') or item['start_ts'] last_user_ts = item.get('last_user_ts') or item['start_ts'] last_rpc_ts = item.get('last_rpc_ts') or item['start_ts'] item['last_refresh_age'] = (now - last_refresh_ts).seconds item['last_event_age'] = (now - last_user_ts).seconds item['last_rpc_age'] = (now - last_rpc_ts).seconds if item['last_refresh_age'] > 60: item['alive'] = False _customClasses.append('disconnected') elif item['last_event_age'] > 60: _customClasses.append('inactive') #if child_name and not item[child_name]: # _customClasses.append('no_children') item.pop('datachanges', None) #if child_name is None: # self.maintenance_cellServerProfile(item) result.setItem(key, None, _customClasses=' '.join(_customClasses), **item) return result
def ht_htableViewStore(self,pane,table=None,storepath='.store',caption_field=None,condition=None,caption=None, dbstore=None,root_id=None,columns=None,related_kwargs=None,resolved=False,**kwargs): b = Bag() tblobj = self.db.table(table) caption = caption or tblobj.name_plural if condition: d = pane.dataRpc(storepath,self.ht_remoteHtableViewStore, table=table, caption_field=caption_field, condition=condition, childname='store',caption=caption,dbstore=dbstore, columns=columns,related_kwargs=related_kwargs, **kwargs) return d v = TableHandlerTreeResolver(_page=self,table=table,caption_field=caption_field,dbstore=dbstore,related_kwargs=related_kwargs, root_id=root_id,columns=columns) b.setItem('root',v,caption=tblobj.name_long, child_count=1,pkey='',treeIdentifier='_root_') if resolved: def cb(self,*args,**kwargs): pass b.walk(cb) d = pane.data(storepath,b,childname='store',caption=caption,table=table) return d
def connected_users_bag(self, exclude=None, exclude_guest=True, max_age=600): users = self.page.site.register.users() result = Bag() exclude = exclude or [] now = datetime.now() if isinstance(exclude, basestring): exclude = exclude.split(',') for user, arguments in users.items(): if user in exclude: continue row = dict() if exclude_guest and user.startswith('guest_') or user == self.page.user: continue _customClasses = [] row['_pkey'] = user row['iconClass'] = 'greenLight' last_refresh_ts = arguments.get('last_refresh_ts') or arguments['start_ts'] last_user_ts = arguments.get('last_user_ts') or arguments['start_ts'] last_refresh_age = (now - last_refresh_ts).seconds last_event_age = (now - last_user_ts).seconds if last_refresh_age > 60: _customClasses.append('user_disconnected') row['iconClass'] = 'grayLight' elif last_event_age>300: _customClasses.append('user_away') row['iconClass'] = 'redLight' elif last_event_age > 60: _customClasses.append('user_idle') row['iconClass'] = 'yellowLight' row['_customClasses'] = _customClasses row['caption'] = arguments['user_name'] or user row.update(arguments) row.pop('datachanges', None) result.setItem(user, None, **row) return result
def getTableContraints(self, table=None, schema=None): """Get a (list of) dict containing details about a column or all the columns of a table. Each dict has those info: name, position, default, dtype, length, notnull Every other info stored in information_schema.columns is available with the prefix '_mysql_'""" sql = """SELECT constraint_type,column_name,tc.table_name,tc.table_schema,tc.constraint_name FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS cu ON cu.constraint_name=tc.constraint_name WHERE constraint_type='UNIQUE' %s%s;""" filtertable = "" if table: filtertable = " AND tc.table_name=:table" filterschema = "" if schema: filterschema = " AND tc.table_schema=:schema" result = self.dbroot.execute(sql % (filtertable,filterschema), dict(schema=schema, table=table)).fetchall() res_bag = Bag() for row in result: row=dict(row) res_bag.setItem('%(table_schema)s.%(table_name)s.%(column_name)s'%row,row['constraint_name']) return res_bag
def _buildSiteMenu_prepare(self, menubag, basepath=None): basepath = basepath or [] result = Bag() for node in menubag.nodes: value = node.getStaticValue() attributes = {} attributes.update(node.getAttr()) currbasepath = basepath if 'basepath' in attributes: newbasepath = attributes.pop('basepath') if newbasepath.startswith('/'): currbasepath = [self.site.home_uri + newbasepath[1:]] else: currbasepath = basepath + [newbasepath] if isinstance(value, Bag): value = self._buildSiteMenu_prepare(value, currbasepath) else: value = None filepath = attributes.get('file') if filepath: if not filepath.startswith('/'): attributes['file'] = os.path.join(*(currbasepath + [filepath])) else: attributes[ 'file'] = self.site.home_uri + filepath.lstrip('/') result.setItem(node.label, value, attributes) return result
def te_menuTemplates(self,table=None): result = Bag() from_userobject = self.db.table('adm.userobject').userObjectMenu(table,'template') #todo for n in from_userobject: result.setItem(n.label,None,tplmode='userobject',**n.attr) result.setItem('__newtpl__',None,caption='!!New Template') return result
def fgr_slotbar_addrow(self, pane, _class='iconbox add_row', disabled='^.disabledButton', enable=None, delay=300, defaults=None, **kwargs): kwargs.setdefault('visible', enable) menupath = None if defaults: menubag = None menupath = '.addrow_menu_store' if isinstance(defaults, Bag): menubag = defaults elif isinstance(defaults, basestring): menupath = defaults else: menubag = Bag() for i, (caption, default_kw) in enumerate(defaults): menubag.setItem('r_%i' % i, None, caption=caption, default_kw=default_kw) if menubag: pane.data('.addrow_menu_store', menubag) return pane.slotButton(label='!!Add', childname='addButton', publish='addrow', iconClass=_class, disabled=disabled, _delay=delay, menupath=menupath, **kwargs)
class DojoApiReader(object): discard = ['provides', 'resources', 'mixins'] discard = [] def __init__(self, apipath, resultpath=None): self.resultpath = resultpath or os.path.dirname(apipath) self.source = Bag(apipath)['javascript'] self.apibag = Bag() for node in self.source: attr = dict(node.attr) value = node.value location = attr.pop('location') if isinstance(value, Bag): value = self.convertObject(value) if location in self.apibag: print 'redefining object:', location else: self.write(location, value, attr) self.apibag.setItem(location, value, attr) def write(self, location, obj, attr): destpath = [self.resultpath, 'objects'] + location.split('.') + 'obj.xml' if attr: print attr destpath = os.path.join(**destpath) obj.toXml(destpath, autocreate=True) def convertObject(self, src): result = Bag() for node in src: label = node.label if label in self.discard: continue attr = dict(node.attr) value = node.value if label == 'mixins': label = 'mixins_%s' % attr.get('scope', 'undefined_scope') if isinstance(value, Bag): value = self.convertItems(value) if label in result: print 'redefining:', label result.setItem(label, value, attr) return result def convertItems(self, items): result = Bag() for k, node in enumerate(items): label = node.label value = node.value attr = dict(node.attr) if label == 'method': label = attr.get('name') if label == 'property': label = attr.get('name') else: label = 'r_%i' % k if label: result.setItem(label, value, attr) return result
def rpc_saveRecordCluster(self, data, table=None, _nocommit=False, rowcaption=None, _autoreload=False, **kwargs): """add??? :param data: add??? :param table: add???. Default value is ``None`` :param _nocommit: boolean. add???. Default value is ``False`` :param rowcaption: add???. Default value is ``None`` :param _autoreload: boolean. add???. Default value is ``False`` :returns: add??? """ #resultAttr = None #todo define what we put into resultAttr resultAttr = {} onSavingMethod = 'onSaving' onSavedMethod = 'onSaved' maintable = getattr(self, 'maintable') table = table or maintable tblobj = self.db.table(table) if table != maintable: onSavingMethod = 'onSaving_%s' % table.replace('.', '_') onSavedMethod = 'onSaved_%s' % table.replace('.', '_') onSavingHandler = getattr(self, onSavingMethod, None) onSavedHandler = getattr(self, onSavedMethod, None) node = data.getNode('record') recordCluster = node.value recordClusterAttr = node.getAttr() onSavedKwargs = dict() if onSavingHandler: onSavedKwargs = onSavingHandler( recordCluster, recordClusterAttr, resultAttr=resultAttr) or {} virtual_columns = self.pageStore().getItem( 'tables.%s.virtual_columns' % table) if virtual_columns: for virtual_col in virtual_columns.keys(): recordCluster.pop(virtual_col, None) record = tblobj.writeRecordCluster(recordCluster, recordClusterAttr) if onSavedHandler: onSavedHandler(record, resultAttr=resultAttr, **onSavedKwargs) if not _nocommit: self.db.commit() if not 'caption' in resultAttr: resultAttr['caption'] = tblobj.recordCaption(record, rowcaption=rowcaption) pkey = record[tblobj.pkey] if _autoreload: result = Bag() result.setItem('pkey', pkey, **resultAttr) keyToLoad = pkey if _autoreload is True else _autoreload record, recInfo = self.app.rpc_getRecord(pkey=keyToLoad, table=table) result.setItem('loadedRecord', record, **recInfo) return result else: return (pkey, resultAttr)
def buildViews(self): """TODO""" elements = self.dbroot.adapter.listElements('views', schema=self.schema) children = Bag(self.children) for element in elements: if not element in children: children.setItem(element, None, tag='view') return SqlTableList(parent=self.structparent, name=self.name, attrs=self.attrs, children=children)
def test_2_filtering(self,pane): fb = pane.formbuilder(cols=1,border_spacing='3px') b = Bag() b.setItem('r1',None,caption='Foo',id='A') b.setItem('r2',None,caption='Bar',id='B') b.setItem('r3',None,caption='Spam',id='C') fb.data('.store',b) fb.filteringSelect(value='^.tbag',lbl='Test bag 1',storepath='.store')
def commandMenu(self): b=Bag() b.setItem('make', None, action='genro.mypane.updateContent()') b.setItem('crea', None) b.setItem('-', None) b.setItem('trasforma.basso', None, caption=u'Giù', dir='d') b.setItem('trasforma.alto', None, caption='Su', dir='u') return b
def griddata(self): result = Bag() result.setItem("r1", None, code="CA", caption="California") result.setItem("r2", None, code="IL", caption="Illinois", disabled=True) result.setItem("r3", None, code="NY", caption="New York", checked="^.checked") result.setItem("r4", None, code="TX", caption="Texas", disabled="^.disabled") result.setItem("r5", None, code="AL", caption="Alabama") return result
def griddata(self): result=Bag() result.setItem('r1',None,code='CA',caption='California') result.setItem('r2',None,code='IL',caption='Illinois',disabled=True) result.setItem('r3',None,code='NY',caption='New York',checked='^.checked') result.setItem('r4',None,code='TX',caption='Texas',disabled='^.disabled') result.setItem('r5',None,code='AL',caption='Alabama') return result
def remoteRowControllerBatch(self, handlerName=None, rows=None, **kwargs): handler = self.getPublicMethod("rpc", handlerName) result = Bag() if not handler: return for r in rows: result.setItem(r.label, handler(row=r.value, row_attr=r.attr, **kwargs)) return result
def test_update(self): b = Bag(BAG_DATA) c = Bag() c.setItem('hobbie.sport', 'soccer', role='forward') c.setItem('name', 'John K.') b.update(c) assert b['name'] == 'John K.' assert b.getAttr('hobbie.sport', 'role') == 'forward'
def tableMenu(self,currPkg=None): if not currPkg: return lookup_tables = self.getLookupTable(pkg=currPkg) result = Bag() for t in lookup_tables: result.setItem(t.fullname.replace('.','_'),Bag(code=t.fullname,description=t.name_long)) return result
def rpc_getLoadedFiles(self, uploadPath=None, **kwargs): path = self.site.getStaticPath(uploadPath) result = Bag() b = DirectoryResolver(path) for i, n in enumerate( [(t[1], t[2]) for t in b.digest('#a.file_ext,#a.file_name,#a.abs_path') if t[0] == 'xls']): result.setItem('r_%i' % i, None, filename=n[0], filepath=n[1]) return result
def prepareSkills(self, game_record): result = Bag() cap = game_record['skill_cap'] for i in range(cap): #slots = cap - i rate = i+1 result.setItem('lv%i'%rate,'') return result