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
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 )
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
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 )
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 )