コード例 #1
0
ファイル: treeview2pdf.py プロジェクト: pacoqueen/cican
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
コード例 #2
0
ファイル: pedido.py プロジェクト: pacoqueen/cican
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)