def saveUDP(regBase, data, cUDP):

    try:
        UdpModel = getDjangoModel(cUDP.udpTable)
    except:
        raise Exception('UdpError: Invalid model ' + UdpModel)

    # si keyField no esta definido implica una relacion MD
    if not cUDP.keyField:
        try:
            Qs = eval('regBase.' + cUDP.udpTable.lower() + '_set.all()')
        except:
            raise Exception('UdpError:  related_name  set not found ' +
                            cUDP.udpTable.lower())

    else:
        keyValue = data.get(cUDP.keyField)
        keyValue = smart_str(keyValue)

        if not keyValue:
            raise Exception('UdpError: Key not found ' + cUDP.keyField +
                            ' in masterReg')

        Qs = UdpModel.objects
        Qs = addFilter(Qs, {cUDP.propertyRef: keyValue})

    for key in data:
        key = smart_str(key)
        if (not key.startswith(cUDP.propertyPrefix + '__')):
            continue
        UdpCode = key[len(cUDP.propertyPrefix) + 2:]

        QsUdp = addFilter(Qs, {cUDP.propertyName: UdpCode})
        if QsUdp.exists():
            rUdp = QsUdp[0]
        else:
            rUdp = UdpModel()
            if not cUDP.keyField:
                setattr(rUdp, cUDP.propertyRef, regBase)
            else:
                # Fix: deberia ser un parametro
                setattr(rUdp, cUDP.propertyRef + '_id', keyValue)

            setattr(rUdp, cUDP.propertyName, UdpCode)

        # Genera el ISO para la fecha y valores estandares para numeros y booleanos
        sAux = smart_str(data[key])
        if sAux == 'None':
            sAux = ''
        setattr(rUdp, cUDP.propertyValue, sAux)
        rUdp.save()
def saveUDP(regBase, data, cUDP):

    try:
        UdpModel = getDjangoModel(cUDP.udpTable)
    except:
        raise Exception("UdpError: Invalid model " + UdpModel)

    # si keyField no esta definido implica una relacion MD
    if not cUDP.keyField:
        try:
            Qs = eval("regBase." + cUDP.udpTable.lower() + "_set.all()")
        except:
            raise Exception("UdpError:  related_name  set not found " + cUDP.udpTable.lower())

    else:
        keyValue = data.get(cUDP.keyField)
        keyValue = smart_str(keyValue)

        if not keyValue:
            raise Exception("UdpError: Key not found " + cUDP.keyField + " in masterReg")

        Qs = UdpModel.objects
        Qs = addFilter(Qs, {cUDP.propertyRef: keyValue})

    for key in data:
        key = smart_str(key)
        if not key.startswith(cUDP.propertyPrefix + "__"):
            continue
        UdpCode = key[len(cUDP.propertyPrefix) + 2 :]

        QsUdp = addFilter(Qs, {cUDP.propertyName: UdpCode})
        if QsUdp.exists():
            rUdp = QsUdp[0]
        else:
            rUdp = UdpModel()
            if not cUDP.keyField:
                setattr(rUdp, cUDP.propertyRef, regBase)
            else:
                # Fix: deberia ser un parametro
                setattr(rUdp, cUDP.propertyRef + "_id", keyValue)

            setattr(rUdp, cUDP.propertyName, UdpCode)

        # Genera el ISO para la fecha y valores estandares para numeros y booleanos
        sAux = smart_str(data[key])
        if sAux == "None":
            sAux = ""
        setattr(rUdp, cUDP.propertyValue, sAux)
        rUdp.save()
def readUdps(rowdict, regBase, cUDP, udpList, udpTypes):

    if cUDP.keyField:
        # si la creacion del detalle no es relacional,
        # se requiere hacer un verdadero Query sobre udpTable
        UdpModel = getDjangoModel(cUDP.udpTable)
        keyValue = rowdict.get(cUDP.keyField, '')
        if not keyValue:
            raise Exception('UdpError: Key not found ' + cUDP.keyField +
                            ' in masterReg')

        keyValue = smart_str(keyValue)
        bAux = True
        Qs = UdpModel.objects
        Qs = addFilter(Qs, {cUDP.propertyRef: keyValue})
        cllUDP = Qs.all()

    else:
        # Si no hay keyField, hace el query basado en el registro maestro
        try:
            bAux = eval('regBase.' + cUDP.udpTable.lower() + '_set.exists()')
            cllUDP = eval('regBase.' + cUDP.udpTable.lower() + '_set.all()')
        except:
            raise Exception('UdpError:  related_name  set not found ' +
                            cUDP.udpTable.lower())

    if bAux:

        for lUDP in cllUDP:
            udpName = cUDP.propertyPrefix + '__' + getattr(
                lUDP, cUDP.propertyName, '')
            if udpName in udpList:
                sAux = getattr(lUDP, cUDP.propertyValue, '')
                sAux = getTypedValue(sAux, udpTypes[udpName])
                sAux = smart_str(sAux)

                if udpTypes[udpName] == 'html' and type(
                        sAux).__name__ == 'string':
                    sAux = sAux.replace('\n', '<br>').replace('\r', '<br>')
                    sAux = sAux.replace('<br><br>', '<br>')
                    sAux = sAux.replace('<td><br>',
                                        '<td>').replace('</td><br>', '</td>')
                    sAux = sAux.replace('<th><br>',
                                        '<th>').replace('</th><br>', '</th>')
                    sAux = sAux.replace('<tr><br>',
                                        '<tr>').replace('</tr><br>', '</tr>')
                    sAux = sAux.replace('<br><td>',
                                        '<td>').replace('<br></td>', '</td>')
                    sAux = sAux.replace('<br><th>',
                                        '<th>').replace('<br></th>', '</th>')
                    sAux = sAux.replace('<br><tr>',
                                        '<tr>').replace('<br></tr>', '</tr>')

                rowdict[udpName] = sAux
示例#4
0
def sheetConfigRep(request):
    """ Reporte basado en la definicion de plantillas ( sheets )
    """

    if not request.user.is_authenticated():
        return JsonError('readOnly User')

    if request.method != 'POST':
        return JsonError('invalid message')

    """  1.
    Recibe  opcion, plantilla base,  Qs ( lista de ids )
    La plantilla de base sera solicitada al usuario, si se deja en blanco usara el sheetSelector o el default
    Los detalles no tienen selector, siempre se usara el template marcado en el detalle.
    """

    viewCode  = request.POST.get('viewCode', '')
    sheetName    = request.POST.get('sheetName', '')
    selectedKeys = request.POST.get('selectedKeys', [])

    selectedKeys = json.loads( selectedKeys )

    protoMeta, Qs = getReportBase( viewCode )

    # Si no hay lista, los trae todos
    if type( selectedKeys ).__name__ == type([]).__name__ and  selectedKeys.__len__() > 0:
        pFilter = { 'pk__in' : selectedKeys }
        Qs = addFilter( Qs, pFilter   )

    #  template FirstPage
    pSheet = getSheetConf ( protoMeta, sheetName )
    sheetName = pSheet.get( 'name' , 'Auto')

    #  Obtiene el template FirstPage
    templateFp = pSheet.get( 'templateFp' , '<span ' +  sheetName + '.firstPage></span>')
    templateFp = templateFp + pSheet.get( 'templateBb' , '<span ' +  sheetName + '.BeforeBlock></span>')

    templateLp = pSheet.get( 'templateAb' , '<span ' +  sheetName + '.AfterBlock></span>')
    templateLp = templateLp + pSheet.get( 'templateLp' , '<span ' +  sheetName + '.lastPage></span>')

    templateEr = pSheet.get( 'templateEr' , pSheet.get( 'template', '' ) )

    #  Variables de titulo
    templateFp = getReport( ['reportTitle'], templateFp, {'reportTitle' : pSheet.get( 'title', sheetName )} )

    # Crea la clase del reporte
    MyReport = SheetReportFactory()

    # Envia al reporte la hoja para manejar los detalles, el QSet, y los templates
    MyReport.getReport(  Qs, templateFp, templateEr, templateLp, protoMeta, pSheet.get( 'sheetDetails' , [] ))

    # retorna el reporte
    return HttpResponse(MyReport.myReport )
示例#5
0
def sheetConfigRep(request):
    """ Reporte basado en la definicion de plantillas ( sheets )
    """

    if not request.user.is_authenticated():
        return JsonError('readOnly User')

    if request.method != 'POST':
        return JsonError('invalid message')

    """  1.
    Recibe  opcion, plantilla base,  Qs ( lista de ids )
    La plantilla de base sera solicitada al usuario, si se deja en blanco usara el sheetSelector o el default
    Los detalles no tienen selector, siempre se usara el template marcado en el detalle.
    """

    viewCode  = request.POST.get('viewCode', '')
    sheetName    = request.POST.get('sheetName', '')
    selectedKeys = request.POST.get('selectedKeys', [])

    selectedKeys = json.loads( selectedKeys )

    protoMeta, Qs = getReportBase( viewCode )

    # Si no hay lista, los trae todos
    if type( selectedKeys ).__name__ == type([]).__name__ and  selectedKeys.__len__() > 0:
        pFilter = { 'pk__in' : selectedKeys }
        Qs = addFilter( Qs, pFilter   )

    #  template FirstPage
    pSheet = getSheetConf ( protoMeta, sheetName )
    sheetName = pSheet.get( 'name' , 'Auto')

    #  Obtiene el template FirstPage
    templateFp = pSheet.get( 'templateFp' , '<span ' +  sheetName + '.firstPage></span>')
    templateFp = templateFp + pSheet.get( 'templateBb' , '<span ' +  sheetName + '.BeforeBlock></span>')

    templateLp = pSheet.get( 'templateAb' , '<span ' +  sheetName + '.AfterBlock></span>')
    templateLp = templateLp + pSheet.get( 'templateLp' , '<span ' +  sheetName + '.lastPage></span>')

    templateEr = pSheet.get( 'templateEr' , pSheet.get( 'template', '' ) )

    #  Variables de titulo
    templateFp = getReport( ['reportTitle'], templateFp, {'reportTitle' : pSheet.get( 'title', sheetName )} )

    # Crea la clase del reporte
    MyReport = SheetReportFactory()

    # Envia al reporte la hoja para manejar los detalles, el QSet, y los templates
    MyReport.getReport(  Qs, templateFp, templateEr, templateLp, protoMeta, pSheet.get( 'sheetDetails' , [] ))

    # retorna el reporte
    return HttpResponse(MyReport.myReport )
示例#6
0
def readUdps( rowdict, regBase , cUDP, udpList,  udpTypes ):

    if cUDP.keyField: 
        # si la creacion del detalle no es relacional, 
        # se requiere hacer un verdadero Query sobre udpTable                    
        UdpModel = getDjangoModel( cUDP.udpTable )
        keyValue = rowdict.get( cUDP.keyField , '' )
        if not keyValue: 
            raise Exception( 'UdpError: Key not found ' + cUDP.keyField  + ' in masterReg') 
    
        keyValue = smart_str( keyValue )
        bAux = True
        Qs = UdpModel.objects
        Qs = addFilter( Qs, { cUDP.propertyRef  : keyValue  } )
        cllUDP = Qs.all()


    else:
        # Si no hay keyField, hace el query basado en el registro maestro
        try:  
            bAux = eval ( 'regBase.' + cUDP.udpTable.lower() + '_set.exists()' )
            cllUDP = eval ( 'regBase.' + cUDP.udpTable.lower() + '_set.all()' ) 
        except:  
            raise Exception( 'UdpError:  related_name  set not found ' + cUDP.udpTable.lower() ) 

    if bAux: 
        
        for lUDP in cllUDP:
            udpName = cUDP.propertyPrefix + '__' + getattr( lUDP, cUDP.propertyName  , '') 
            if udpName in udpList:
                sAux = getattr( lUDP, cUDP.propertyValue, '' )
                sAux = getTypedValue ( sAux , udpTypes[ udpName ])
                sAux = smart_str( sAux )
                
                if udpTypes[ udpName ] == 'html' and type( sAux ).__name__=='string'  : 
                    sAux = sAux.replace( '\n', '<br>').replace( '\r', '<br>')  
                    sAux = sAux.replace( '<br><br>', '<br>')
                    sAux = sAux.replace( '<td><br>', '<td>').replace( '</td><br>', '</td>')
                    sAux = sAux.replace( '<th><br>', '<th>').replace( '</th><br>', '</th>')
                    sAux = sAux.replace( '<tr><br>', '<tr>').replace( '</tr><br>', '</tr>')
                    sAux = sAux.replace( '<br><td>', '<td>').replace( '<br></td>', '</td>')
                    sAux = sAux.replace( '<br><th>', '<th>').replace( '<br></th>', '</th>')
                    sAux = sAux.replace( '<br><tr>', '<tr>').replace( '<br></tr>', '</tr>')
    
                rowdict[ udpName ] =  sAux 
def readUdps(rowdict, regBase, cUDP, udpList, udpTypes):

    if cUDP.keyField:
        # si la creacion del detalle no es relacional,
        # se requiere hacer un verdadero Query sobre udpTable
        UdpModel = getDjangoModel(cUDP.udpTable)
        keyValue = rowdict.get(cUDP.keyField, "")
        if not keyValue:
            raise Exception("UdpError: Key not found " + cUDP.keyField + " in masterReg")

        keyValue = smart_str(keyValue)
        bAux = True
        Qs = UdpModel.objects
        Qs = addFilter(Qs, {cUDP.propertyRef: keyValue})
        cllUDP = Qs.all()

    else:
        # Si no hay keyField, hace el query basado en el registro maestro
        try:
            bAux = eval("regBase." + cUDP.udpTable.lower() + "_set.exists()")
            cllUDP = eval("regBase." + cUDP.udpTable.lower() + "_set.all()")
        except:
            raise Exception("UdpError:  related_name  set not found " + cUDP.udpTable.lower())

    if bAux:

        for lUDP in cllUDP:
            udpName = cUDP.propertyPrefix + "__" + getattr(lUDP, cUDP.propertyName, "")
            if udpName in udpList:
                sAux = getattr(lUDP, cUDP.propertyValue, "")
                sAux = getTypedValue(sAux, udpTypes[udpName])
                sAux = smart_str(sAux)

                if udpTypes[udpName] == "html" and type(sAux).__name__ == "string":
                    sAux = sAux.replace("\n", "<br>").replace("\r", "<br>")
                    sAux = sAux.replace("<br><br>", "<br>")
                    sAux = sAux.replace("<td><br>", "<td>").replace("</td><br>", "</td>")
                    sAux = sAux.replace("<th><br>", "<th>").replace("</th><br>", "</th>")
                    sAux = sAux.replace("<tr><br>", "<tr>").replace("</tr><br>", "</tr>")
                    sAux = sAux.replace("<br><td>", "<td>").replace("<br></td>", "</td>")
                    sAux = sAux.replace("<br><th>", "<th>").replace("<br></th>", "</th>")
                    sAux = sAux.replace("<br><tr>", "<tr>").replace("<br></tr>", "</tr>")

                rowdict[udpName] = sAux
示例#8
0
    def getReport( self , Qs, templateBefore, templateERow, templateAfter, protoMeta, sheetDetails ):
        """ Construye el reporte en bloques recursivos ( basado en sheetDetails )
        # recibe :
        # myReport      : Reporte en curso
        # Qs            : QuerySet ya preparado
        # Templates     : Los templates son diferentes dependiendo la definicion del modelo
        # protoMeta     : Se requiere para llamar Q2Dict
        # sheetDetails  : Detalles a iterar
        """

        # Inicializa el conteo de filas del Bloque
        blockRowCount = 0

        # Envia el QSet  obtiene una lista
        pList = Q2Dict(protoMeta , Qs , False  )

        # prepara las variables q participan en cada template
        bfProps = getProperties( protoMeta['fields'], templateBefore )
        erProps = getProperties( protoMeta['fields'], templateERow )
        afProps = getProperties( protoMeta['fields'], templateAfter )

        #Al comenzar lee  template  beforeDetail
        if  pList.__len__()  > 0:
            row = pList[0]
        else: row = {}
        self.myReport += getReport( bfProps, templateBefore, row  )

        # Recorre los registros
        for row in pList:

            blockRowCount += 1
            self.rowCount += 1

            # Lee registro a registro y  remplaza el template html con la info correspondiente
            self.myReport += getReport( erProps, templateERow, row  )

            # Loop Se Procesan cada uno de los detalles( M-D segun la definciion del detalle de la opcion, segun el criterio de sortIndicado. campo1, campo2-
            for detail in sheetDetails:

                detailName = detail.get('name' )
                detailName = detail.get('detailName', detailName  )

                templateBb = detail.get( 'templateBb' , '<span ' +  detailName + '.BeforeDet></span>')
                templateAb = detail.get( 'templateAb' , '<span ' +  detailName + '.AfterDet></span>')
                templateEr = detail.get( 'templateEr' , '<span ' +  detailName + '.EveryRow></span>')


                # Obtiene la conf del detalle
                detailConf = getDetailConf( protoMeta, detailName  )
                if detailConf == None: continue

                # Obtiene la meta y el QSet
                protoMetaDet, QsDet  = getReportBase( detailConf[ 'conceptDetail' ] )

                # filtra el QSet de acuardo a los criterios del detalle
                masterField = detailConf[ 'masterField' ]
                idMaster =  row[ masterField.replace( 'pk', 'id') ]
                pFilter = { detailConf['detailField']  : idMaster  }
                QsDet = addFilter( QsDet, pFilter   )

                self.getReport(  QsDet, templateBb, templateEr, templateAb, protoMetaDet, detail[ 'sheetDetails' ] )

        # Al finalizar el template AfterDetail
        self.myReport += getReport( afProps, templateAfter, row  )
示例#9
0
    def getReport( self , Qs, templateBefore, templateERow, templateAfter, protoMeta, sheetDetails ):
        """ Construye el reporte en bloques recursivos ( basado en sheetDetails )
        # recibe :
        # myReport      : Reporte en curso
        # Qs            : QuerySet ya preparado
        # Templates     : Los templates son diferentes dependiendo la definicion del modelo
        # protoMeta     : Se requiere para llamar Q2Dict
        # sheetDetails  : Detalles a iterar
        """

        # Inicializa el conteo de filas del Bloque
        blockRowCount = 0

        # Envia el QSet  obtiene una lista
        pList = Q2Dict(protoMeta , Qs , False  )

        # prepara las variables q participan en cada template
        bfProps = getProperties( protoMeta['fields'], templateBefore )
        erProps = getProperties( protoMeta['fields'], templateERow )
        afProps = getProperties( protoMeta['fields'], templateAfter )

        #Al comenzar lee  template  beforeDetail
        if  pList.__len__()  > 0:
            row = pList[0]
        else:
            row = {}
        self.myReport += getReport( bfProps, templateBefore, row  )

        # Recorre los registros
        for row in pList:

            blockRowCount += 1
            self.rowCount += 1

            # Lee registro a registro y  remplaza el template html con la info correspondiente
            self.myReport += getReport( erProps, templateERow, row  )

            # Loop Se Procesan cada uno de los detalles( M-D segun la definciion del detalle de la opcion, segun el criterio de sortIndicado. campo1, campo2-
            for detail in sheetDetails:

                detailName = detail.get('name' )
                detailName = detail.get('detailName', detailName  )

                templateBb = detail.get( 'templateBb' , '<span ' +  detailName + '.BeforeDet></span>')
                templateAb = detail.get( 'templateAb' , '<span ' +  detailName + '.AfterDet></span>')
                templateEr = detail.get( 'templateEr' , '<span ' +  detailName + '.EveryRow></span>')


                # Obtiene la conf del detalle
                detailConf = getDetailConf( protoMeta, detailName  )
                if detailConf == None :
                    continue

                # Obtiene la meta y el QSet
                protoMetaDet, QsDet  = getReportBase( detailConf[ 'conceptDetail' ] )

                # filtra el QSet de acuardo a los criterios del detalle
                masterField = detailConf[ 'masterField' ]
                idMaster =  row[ masterField.replace( 'pk', 'id') ]
                pFilter = { detailConf['detailField']  : idMaster  }
                QsDet = addFilter( QsDet, pFilter   )

                self.getReport(  QsDet, templateBb, templateEr, templateAb, protoMetaDet, detail[ 'sheetDetails' ] )

        # Al finalizar el template AfterDetail
        self.myReport += getReport( afProps, templateAfter, row  )