def seed(*parms, **kwparms): """ TODO doc """ item = parms[0] column = parms[1] if kwparms.get('searchby', 'key') == 'key': colkey = [norm2List(data)[0] for data in column ] #compatibilidad de apis por la via rapida elif kwparms.get('searchby') == 'value': colkey = [norm2List(data)[1] for data in column ] #compatibilidad de apis por la via rapida else: return columna = colkey.index(kwparms.get('destino')) base = kwparms.get('valor inicial') if base[-1] == '%': suma = sum(filter(None, item.getPayload())) dato = suma * s2n(base[:-1]) / 100 elif base[-1] == 'P': #promedio: dato = s2n(base[:-1]) * avg(filter(None, item.getPayload())) elif base[-1] == 'M': #mediana: dato = s2n(base[:-1]) * median(filter(None, item.getPayload())) else: dato = s2n(base) item.spi(columna, dato)
def consolida(*parms, **kwparms): """ Agrega el contenido de una o varias columnas (parametro desde) en otra (parametro hacia) y borra la columna origen. Si el destino es una lista de columnas, se agrega a la primera que encuente con valor. Si no encuentra no se ejecuta. caso que no exista ninguna columna destino con valor se agrega a la última de la lista En esta versión las columnas se identifican por la clave, por lo que necesitamos esta información de las columnas tipo = item,colkey debe usar aux_parm para especificar los parametros desde, columna(s) origen hacia, columna(s) destino searchby = (key|value) criterio de busqueda. defecto key opcionalmente puede ejecutarse como kwparm para especificar desde,hacia interactivamente """ item = parms[0] column = parms[1] if kwparms.get('searchby', 'key') == 'key': colkey = [norm2List(data)[0] for data in column ] #compatibilidad de apis por la via rapida elif kwparms.get('searchby') == 'value': colkey = [norm2List(data)[1] for data in column ] #compatibilidad de apis por la via rapida else: return desde = kwparms.get('desde') if desde is None: return hacia = kwparms.get('hacia') if hacia is None: return difuntas = [] for idx in norm2List(desde): try: difunta = colkey.index(idx) difuntas.append(difunta) except ValueError: continue if not item.gpi(difunta): continue for candidatura in norm2List(hacia): try: cakey = colkey.index(candidatura) except ValueError: continue suma = item.gpi(difunta) if item.gpi(cakey) is not None: #se presentaban en la provincia suma += item.gpi(cakey) item.spi(cakey, suma) item.spi(difunta, None) break else: #cuando no hay candidaturas destino. va a la ultima de la lista cakey = colkey.index(candidatura) item.spi(cakey, item.gpi(difunta)) item.spi(difunta, None) pass # borra la columna original TODO documentar el uso de tree if 'tree' in kwparms: for entrada in difuntas: kwparms['tree'].hideColumn(entrada + 1)
def _getDataForWidget(self, editor, item, view, dato, display): """ view, dato, display not used """ if isinstance(editor, WMultiList): inicial = [] n, i, t = getRow(item) if n.hasChildren(): for x in range(n.rowCount()): nh, ih, th = getRow(n.child(x)) inicial.append(ih.data()) return inicial, display elif i.data( ) is not None: # hay varios casos en que la lista se ha colapsado en un solo campo return osSplit(i.data()), display #aqui si merece la pena else: return [], '' elif isinstance( editor, (WComboMulti, )): # WMC siemre antes que QCB porque es una especializacion #TODO doble seleccion # TODO con insercion if self.context.get('dtype', 'atom') == 'list': aceptados = [] n, i, t = getRow(item) if n.hasChildren(): for x in range(n.rowCount()): nh, ih, th = getRow(n.child(x)) aceptados.append(ih.data()) else: aceptados = norm2List(dato) return aceptados, display elif isinstance(editor, QTextEdit): # FIXME esto tiene que mejorar. Solo me sirve para el caso de case_sql n, i, t = getRow(item) if self.context.get('dtype', 'atom') == 'list': if t: head = n else: head = n.parent() dato = None for x in range(head.rowCount()): nh, ih, th = getRow(n.child(x)) dato = '\n'.join([dato, ih.data()]) if dato else ih.data() return dato, display elif isinstance(editor, WPowerTable): result = [] for x in range(item.rowCount()): childIdx = item.index().child(x, 0) nomItem, sitem, typeItem = getRow(childIdx) datos = [nomItem.data(), branch2text(nomItem)] result.append(datos) return result, display else: return dato, display
def getDateEntry(psource, fmt, driver='sqlite'): source = norm2List(psource)[ -1] #no esta normalizado el uso de lista o parametros indivudales #DRIVERNAME try: marker = DB_DATE_QUIRKS[driver]['marker'] function = DB_DATE_QUIRKS[driver]['function'] fmask = DB_DATE_QUIRKS[driver]['function_mask'] except KeyError: print('Date conversions for driver %s still not implemented' % driver) return None #config.DELIMITER = '.' entrada = {} fmt_string = '' for char in fmt: if fmt_string != '': fmt_string += config.DELIMITER fmt_string += marker[char] element = fmask.format(function, source, fmt_string) entrada['fmt'] = 'txt' entrada['mask'] = fmt entrada['name'] = source + '_' + fmt entrada['elem'] = element return entrada
def dictLinkDef2dict(routeData, route, tablaOrig, tablaDest, fieldDef, fqnget): resultados = [] clausulaAut = routeData.detailPretty(tablaOrig, tablaDest, route) for ind, arc in enumerate(clausulaAut): #FIXME falta el caso con varios campos en la foreign key arcInfo = arc['ref'].getRow() bases = norm2List(arcInfo[2]) rels = norm2List(arcInfo[3]) clause = [] for k in range(min(len(bases), len(rels))): base = fieldDef.tr(arc['child'], bases[k]) rel = fieldDef.tr(arc['parent'], rels[k]) clause.append({'base_elem': base, 'rel_elem': rel}) arcDict = {'table': fqnget(arcInfo[1]), 'filter': '', 'clause': clause} resultados.append(arcDict) return resultados
def unsetEntries(self, lista): conjunto = norm2List(lista) for entrada in conjunto: orig = self.selecto.find(entrada) if not orig: pass else: self.unsetItem(self, orig[0])
def getChildByTypeH(parent, typeList): base = parent for tipo in norm2List(typeList): res = getChildByType(base, tipo) if not res: return None base = res return base
def setEntries(self, lista): #FIXME ¿y si ya existe? conjunto = norm2List(lista) for entrada in conjunto: orig = self.disponible.find(entrada) if not orig: self.selecto.addRow(entrada) else: self.setItem(orig[0])
def convertToList(self, item): n, i, t = getRow(item) if not i.data(): return for entrada in norm2List(i.data()): nRow = makeRow(None, entrada, None) n.appendRow(nRow) i.setData(None, Qt.EditRole) i.setData(None, Qt.UserRole + 1)
def set(self, dato): values = norm2List(dato) for value in values: pos = self.index(value) if pos > 0: item = self.model().item(pos, 0) elif pos < 1 and self.isEditable(): self.model().appendRow(self._makeItem(value)) item = self.model().item(self.model().rowCount() - 1, 0) else: return None item.setData(Qt.Checked, Qt.CheckStateRole) self.updateHdr('set', item.data(DISP))
def updateHdr(self, action, value): cabecera = self.itemData(0, DISP) if cabecera == WComboMulti.textoCabecera: elementos = set() else: elementos = set(norm2List(cabecera)) if action == 'set': elementos.add(value) else: elementos.remove(value) cabItem = self.model().item(0, 0) if len(elementos) == 0: cabItem.setData(WComboMulti.textoCabecera, DISP) else: cabItem.setData(norm2String(elementos), DISP) self.setCurrentIndex(0)
def initializeSheet(self, file): for i in range(self.sheet.rowCount()): for j in range(self.sheet.columnCount()): self.initializeCell(i, j) self.sheet.setItemPrototype(QTableWidgetItem('')) if file: for idx, elem in enumerate(norm2List(file)): #self.sheet.setItem(idx,0,QTableWidgetItem(None)) self.sheet.item(idx, 0).setText(elem) if idx == 0: self.sheet.item(idx, 0).setFlags(Qt.ItemIsEnabled) self.sheet.item(idx, 0).setBackground(QColor(Qt.gray)) if self.actualSize() >= 1: self.loadTarget() self.fieldsTarget.setEnabled(True) else: self.fieldsTarget.setEnabled(False)
def accept(self): #TODO validaciones name = self.titleText.text() schema = self.cubeTable.split('.')[0] # se supone que viene cargado baseTable = self.tablesCurrentList[self.destTable.currentIndex()] table = '{}.{}'.format(schema, baseTable) values = norm2List(self.destField.get()) # ahora el link link_via electedPath = self.destRoutes.currentText() #que valiente path = dictLinkDef2dict(self.rel, electedPath, self.cubeTable, baseTable, self.fields, self.short2long) #electedPath = '->' + electedPath.replace('\n\t','->') #electedPathDatos = self.routeData[baseTable][electedPath] #path = [] #for arc in electedPathDatos: #arcInfo = arc['ref'].getRow() #arcDict = {'table':arcInfo[1],'filter':'','clause':[{'base_elem':arcInfo[2],'rel_elem':arcInfo[3]},]} #path.append(arcDict) self.result = { 'name': name, 'class': 'o', 'prod': [ { 'name': name, 'elem': values, 'table': table, 'link via': path }, ] } super().accept()
def setModelData(self, editor, model, index): model = index.model() values = None dvalue = ivalue = None item = self.context.get('editPos') datoWidget = getWidgetData(self, editor) if isinstance(datoWidget, (list, tuple, set, dict)): values = datoWidget else: ivalue = datoWidget dvalue = datoWidget if isinstance(editor, WMultiList): if not self.generalValidation(index, editor, values): return elif isinstance(editor, (WComboMulti, )): #TODO insercion if self.context.get('dtype', 'atom') == 'list': values = norm2List(datoWidget) if not self.generalValidation(index, editor, values): return else: if not self.generalValidation(index, editor, dvalue, ivalue): return elif isinstance(editor, QTextEdit): #item = self.context.get('editPos') if self.context.get('dtype', 'atom') == 'list': n, i, t = getRow(item) if t: head = n else: head = n.parent() values = datoWidget.split('\n') if not self.generalValidation(index, editor, values): return item = head else: if not self.generalValidation(index, editor, dvalue, ivalue): return elif isinstance(editor, QDialog): if not self.generalValidation(index, editor, values): return else: if isinstance(editor, WComboBoxIdx): values = None ivalue = datoWidget[2] dvalue = datoWidget[1] elif isinstance(editor, WComboBox): values = None ivalue = datoWidget[0] dvalue = datoWidget[1] elif isinstance(editor, ( QSpinBox, QCheckBox, )): dvalue = str(ivalue) elif isinstance(editor, WPowerTable): return editor.values() elif isinstance(editor, QLineEdit) and self.context.get( 'edit_tree', {}).get('hidden', False): dvalue = '****' else: if dvalue in ('True', 'False'): ivalue = str2bool(dvalue) if not self.generalValidation(index, editor, dvalue, ivalue): return setters = list(self.context.get('edit_tree', {}).get('setters', [])) if not setters: setters = [ self._updateModel, ] if 'default' in setters: idx = setters.index('default') setters[idx] = self._updateModel for funcion in setters: if not values: item = funcion(editor, item, self.parent(), self.context, ivalue, dvalue) else: item = funcion(editor, item, self.parent(), self.context, values)
def initialValues( self, **kwparm ): #file,tablas,fields,rel,structure):pfile,tablas,fields,rel,structure=None,parent=None,): if not kwparm: return else: self.sheet.currentItemChanged.disconnect() self.sheet.itemChanged.disconnect() self.disableDetail() file = kwparm.get('pfile') tablas = kwparm.get('tablas', []) fields = kwparm.get('fields') rel = kwparm.get('rel') structure = kwparm.get('structure', {}) self.fullTables = tablas self.tables = [elem[1] for elem in tablas] iidx = self.tables.index(file) self.baseTable = self.fullTables[iidx][0] self.fields = fields self.rel = rel if not structure: self.structure = {} else: if 'prod' in structure: self.structure = structure['prod'][0] else: self.structure = structure self.name.setText(self.structure.get('name', "")) self.array = self.denorm( [elem for elem in self.structure.get('link via', [])]) #self.fileStack = [file, ] + [ elem.get('table') for elem in self.array ] self.fileStack = [ file, ] + [ elem.get('table').split('.')[-1] for elem in self.array if elem.get('table') ] for k in range(len(self.array)): line = self.array[k] line['internalLink'] = None if 'table' in line: del line['table'] if self.array: self.targetTable = self.fileStack[-1] self.targetFields = self.denorm( norm2List(self.structure.get('elem'))) else: self.targetTable = None self.targetFields = [] self.initializeSheet(self.fileStack) if len(self.array) >= 1: pos = len(self.fileStack) - 1 self.sheet.setCurrentCell(pos, 0) self.loadDetail(pos) #self.loadTarget() self.enableDetail() self.setClauseWgtSize() self.sheet.currentItemChanged.connect(self.moveSheetSel) self.sheet.itemChanged.connect(self.itemChanged)
def transfiere(*parms, **kwparms): """ Agrega parte del contenido de una o varias columnas (parametro desde) en otra (parametro hacia) y borra la columna origen. Si el destino es una lista de columnas, se agrega a la primera que encuente con valor. Si no encuentra no se ejecuta. caso que no exista ninguna columna destino con valor se agrega a la última de la lista En esta versión las columnas se identifican por la clave, por lo que necesitamos esta información de las columnas tipo = item,colkey debe usar aux_parm para especificar los parametros desde, columna(s) origen hacia, columna(s) destino porcentaje, porcentaje de la columna origen que va al destino. Sin porcentaje se asume el 100% searchby = (key|value) criterio de busqueda. defecto key opcionalmente puede ejecutarse como kwparm para especificar desde,hacia interactivamente """ item = parms[0] column = parms[1] if kwparms.get('searchby', 'key') == 'key': colkey = [norm2List(data)[0] for data in column ] #compatibilidad de apis por la via rapida elif kwparms.get('searchby') == 'value': colkey = [norm2List(data)[1] for data in column ] #compatibilidad de apis por la via rapida else: return desde = kwparms.get('desde') if desde is None: return porcentaje = kwparms.get('porcentaje') if porcentaje is None or porcentaje == '100': porcentaje = 1.0 else: porcentaje = float(porcentaje) / 100. hacia = kwparms.get('hacia') if hacia is None: return for idx in norm2List(desde): try: difunta = colkey.index(idx) except ValueError: continue if not item.gpi(difunta): continue for candidatura in norm2List(hacia): try: cakey = colkey.index(candidatura) except ValueError: continue suma = item.gpi(difunta) if type(suma) == int: pasa = int(suma * porcentaje) else: pasa = suma * porcentaje resto = suma - pasa if item.gpi(cakey) is not None: #se presentaban en la provincia pasa += item.gpi(cakey) item.spi(cakey, pasa) item.spi(difunta, resto) break else: #cuando no hay candidaturas destino. va a la ultima de la lista suma = item.gpi(difunta) if type(suma) == int: pasa = int(suma * porcentaje) else: pasa = suma * porcentaje resto = suma - pasa cakey = colkey.index(candidatura) item.spi(cakey, pasa) item.spi(difunta, resto) pass