def treeview2pdf(tv, titulo = None, fecha = None, apaisado = None, pijama = False, graficos = [], numcols_a_totalizar = [], extra_data = []): """ A partir de un TreeView crea un PDF con su contenido. 1.- Asigna un nombre de archivo en función del nombre del TreeView. 2.- Si titulo es None, asigna como título el nombre del TreeView. 3.- El ancho de los campos será el ancho relativo en porcentaje que ocupa el ancho de la columna (get_width) a la que correspondería. El título del campo será el título (get_title) de la columna. 4.- Si fecha no es None debe ser una cadena de texto. Si es None, se usará la fecha actual del sistema. 5.- Si la suma del ancho de las columnas del TreeView es superior a 800 píxeles el PDF generado será apaisado, a no ser que se fuerce mediante el parámetro "apaisado" que recibe la función. numcols_a_totalizar es una lista de índices (empezando por 0) de las columnas a las que se va a intentar convertir a número y sumar para mostrar una última línea con el texto "TOTAL" o "TOTALES" si hay más de una. extra_data son líneas que se añadirán a las que tiene el TreeView *al final* del informe (incluso detrás de los totales, si los hubiera). """ archivo = get_nombre_archivo_from_tv(tv) if titulo == None: titulo = get_titulo_from_tv(tv) campos, pdf_apaisado, cols_a_derecha, cols_centradas=get_campos_from_tv(tv) datos = get_datos_from_tv(tv) totales = dict(zip(numcols_a_totalizar, len(numcols_a_totalizar) * [0])) for fila in datos: for numcol in totales: try: totales[numcol] += utils.parse_float(fila[numcol]) except ValueError: # ¿No hay dato en esa fila? Entonces cuento # instancias. totales[numcol] += 1 #print fila, numcol, fila[numcol] if totales and datos: last_i = len(datos) - 1 # Apuntará a la última línea no nula while (last_i > 0 and reduce(lambda x, y: str(x) + str(y), datos[last_i]) == ""): last_i -= 1 if (datos[last_i] and not reduce(lambda x, y: x == y == "---" and "---", datos[last_i])): datos.append(("---", ) * len(campos)) fila = ["TOTAL"] + [""] * (len(campos) - 1) if len(totales) > 1: fila[0] = "TOTALES" for total in totales: fila[total] = utils.float2str(totales[total]) #, precision = 2, autodec = True) datos.append(fila) if extra_data and not isinstance(extra_data[0], (tuple, list)): extra_data = [extra_data] for extra in extra_data: dif_len = len(campos) - len(extra) if dif_len <> 0 and not isinstance(extra, list): extra = list(extra) if dif_len > 0: extra += [""] * dif_len elif dif_len < 0: extra = extra[:len(campos)] datos.append(extra) if fecha == None: fecha = str_fecha(datetime.date.today()) if apaisado != None: pdf_apaisado = apaisado nomarchivo = generar_pdf(archivo, titulo, campos, datos, fecha, apaisado = pdf_apaisado, cols_a_derecha = cols_a_derecha, cols_centradas = cols_centradas, pijama = pijama, graficos = graficos) return nomarchivo
def go_from_peticion(peticion): """ Construye el PDF a partir de un objeto peticion y no de sus datos sueltos. """ obra = peticion.obra cliente = obra.cliente direccion = obra.direccion if not direccion: direccion = pclases.Direccion.get_direccion_por_defecto() ciudad = direccion.ciudad provincia = ciudad.provincia datos_peticion = {"hoja": peticion.id, "fecha pedido": fecha.str_fecha(peticion.fechaSolicitud), "fecha recogida": fecha.str_fecha(peticion.fechaRecogida), "hora": fecha.str_hora_corta(peticion.horaRecogida), "observaciones": peticion.observaciones, "recibido por": peticion.usuario and peticion.usuario.nombre or ""} strobra = obra and obra.nombre or "" if obra and obra.direccion: strobra += "({0})".format(obra.direccion.get_direccion_completa()) datos_obra = {"cliente": cliente and cliente.nombre or "", "obra": obra, "solicitante": peticion and peticion.solicitante or "", "persona de contacto": peticion and peticion.contacto and peticion.contacto.get_nombre_completo() or ""} datos_material = {"material": peticion.material and peticion.material.nombre or ""} datos_ensayo = [e.nombre for e in peticion.ensayos] try: dde = pclases.get_dde() datos_de_la_empresa = [os.path.join("imagenes", dde.logo), #dde.nombre + # (dde.cif and " (" + dde.str_cif_o_nif() +": " # + dde.cif + ")" or ""), dde.direccion, "%s %s (%s), %s" % (dde.cp, dde.ciudad, dde.provincia, dde.pais), ] if dde.fax: if dde.fax.strip() == dde.telefono.strip(): datos_de_la_empresa.append("Telf. y fax: %s" % dde.telefono) else: datos_de_la_empresa.append("Telf.: %s" % (dde.telefono)) datos_de_la_empresa.append("Fax: %s" % (dde.fax)) #if dde.email: # datos_de_la_empresa.append(dde.email) except IndexError: datos_de_la_empresa = [None] nomarchivo = os.path.join(gettempdir(), "peticion_{0}_{1}.pdf".format( peticion.id, give_me_the_name_baby())) return go("Peticion {0}".format(peticion.id), nomarchivo, datos_de_la_empresa, datos_peticion, datos_obra, datos_material, datos_ensayo)