示例#1
0
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)
示例#2
0
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)
示例#3
0
    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
示例#4
0
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
示例#5
0
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
示例#6
0
 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])
示例#7
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
示例#8
0
 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])
示例#9
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)
示例#10
0
 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))
示例#11
0
    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)
示例#12
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)
示例#13
0
    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()
示例#14
0
    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)
示例#15
0
    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)
示例#16
0
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