示例#1
0
 def buscar(self,boton):
     vpro = VentanaActividad(texto = "Buscando cobros...")
     vpro.mostrar()
     vpro.mover()
     # Primero: cobros que no son pagarés ni confirmings (transferencias,
     # efectivo, etc.). En estos la fecha sí es real.
     if not self.inicio:
         cobros = pclases.Cobro.select(pclases.AND(
                 pclases.Cobro.q.fecha < self.fin,
                 pclases.Cobro.q.pagareCobro == None, 
                 pclases.Cobro.q.confirming == None), 
             orderBy = 'fecha')
     else:
         cobros = pclases.Cobro.select(pclases.AND(
                 pclases.Cobro.q.fecha >= self.inicio,
                 pclases.Cobro.q.fecha < self.fin, 
                 pclases.Cobro.q.pagareCobro == None, 
                 pclases.Cobro.q.confirming == None), 
             orderBy = 'fecha')
     vpro.mover()
     # DONE: Hay que meter los cobros reales entre las fechas de la
     # consulta. Así que cuando es pagaré o confirming, no me puedo fiar
     # de la fecha del registro cobro. Tengo que buscar por la fechaCobrado
     # del objeto pagaré o confirming.
     # Segundo: confirmings cuya fecha __real__ sea la del filtro.
     confirmings = buscar_efectos(self.inicio, self.fin, pclases.Confirming)
     vpro.mover()
     # Tercero: pagarés cuya fecha __real__ de cobro sea la del filtro.
     pagares = buscar_efectos(self.inicio, self.fin, pclases.PagareCobro)
     vpro.mover()
     # Cuarto y último: Vencimientos. Pero esto solo vale para la primera
     # pestaña (que creo que voy a quitar en la siguiente revisión).
     if not self.inicio:
         vencimientos = pclases.VencimientoCobro.select(
                 pclases.VencimientoCobro.q.fecha < self.fin, 
                 orderBy = 'fecha')
     else:
         vencimientos = pclases.VencimientoCobro.select(pclases.AND(
                 pclases.VencimientoCobro.q.fecha >= self.inicio,
                 pclases.VencimientoCobro.q.fecha < self.fin), 
             orderBy = 'fecha')
     vpro.mover()
     elementos = {}
     vpro.mover()
     for selectres in cobros, vencimientos, pagares, confirmings:
         for item in selectres:
             vpro.mover()
             try:
                 item_fecha = item.fecha
             except AttributeError:
                 item_fecha = item.fechaCobrado
             if item_fecha not in elementos:
                 elementos[item_fecha] = {'cobros': [], 
                                          'vencimientos': [], 
                                          'logic': []}
             if isinstance(item, pclases.VencimientoCobro):
                 seccion = "vencimientos"
             else:
                 seccion = 'cobros'
             if hasattr(item, "cobros"): # Es un pagaré o confirming
                 for c in item.cobros:
                     # Todos los cobros del pagaré comparten la misma fecha
                     # efectiva de cobro del propio pagaré.
                     elementos[item_fecha][seccion].append(c)
             else:
                 elementos[item_fecha][seccion].append(item)
     # for item in self.buscar_vencimientos_logic(self.inicio, self.fin):
     #     if item['fecha'] not in elementos:
     #         elementos[item['fecha']] = {'cobros': [], 'vencimientos': [],
     #                                     'logic': []}
     #     elementos[item['fecha']]['logic'].append(item)
     self.rellenar_tabla(elementos, vpro)
     self.rellenar_cesce(cobros, pagares, confirmings, vpro)
     vpro.ocultar()
示例#2
0
def _info(exctyp, value, tb):
    # DONE: Si se puede enviar por correo, enviar por correo y no abrir 
    # siquiera la ventana. O guardar a log o algo así si no se puede. Lo de 
    # preguntar al usuario se tiene que quedar como última opción, porque 
    # siempre pasan del tema. Solo mostrar una ventana si no se puede continuar 
    # la ejecución del programa de ninguna de las maneras.
    trace = None
    dialog = gtk.MessageDialog(parent=None, flags=0, 
                                type=gtk.MESSAGE_WARNING, 
                                buttons=gtk.BUTTONS_NONE)
    dialog.set_title(_("Bug Detected"))
    if gtk.check_version(2, 4, 0) is not None:
        dialog.set_has_separator(False)

    primary = _("<big><b>A programming error has been detected during the execution of this program.</b></big>")
    secondary = _("It probably isn't fatal, but should be reported to the developers nonetheless.")

    try:
        setsec = dialog.format_secondary_text
    except AttributeError:
        raise
        dialog.vbox.get_children()[0].get_children()[1].set_markup('%s\n\n%s' 
            % (primary, secondary))
        #lbl.set_property("use-markup", True)
    else:
        del setsec
        dialog.set_markup(primary)
        dialog.format_secondary_text(secondary)

    try:
        email = feedback #@UndefinedVariable
        dialog.add_button(_("Report..."), 3)
        autosend = True
    except NameError:
        # could ask for an email address instead...
        autosend = False
    dialog.add_button(_("Details..."), 2)
    dialog.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
    dialog.add_button(gtk.STOCK_QUIT, 1)
    dialog.add_button(_("Close all"), 4)

    while True:
        if not autosend:
            resp = dialog.run()
        else:
            resp = 3    # Emulo que se ha pulsado el botón.
        if resp == 3:
            vpro = VentanaActividad(
                texto = "Enviando informe de error. Por favor, espere...\n"
                        "(Si esta ventana persiste, reinicie la aplicación)")
            # TODO: PLAN: Si la ventana lleva más de un minuto sin enviar el
            # correo, ya no lo hará casi seguro. Cerrarla programáticamente.
            vpro.mostrar()
            vpro.mover()
            if trace == None:
                trace = analyse(exctyp, value, tb)
            vpro.mover()
            # TODO: prettyprint, deal with problems in sending feedback, &tc
            try:
                server = smtphost #@UndefinedVariable
            except NameError:
                server = 'localhost'
            vpro.mover()
            msgmail = MIMEMultipart("alternative")
            msgmail["Subject"] = "Geotex-INN -- Excepción capturada"
            msgmail["From"] = email
            msgmail["To"] = "Soporte G-INN"
            traza = trace.getvalue()
            message = 'From: %s"\nTo: %s\nSubject: Geotex-INN'\
                      ' -- Excepción capturada.\n\n%s'%(msgmail["From"], 
                                                        msgmail["To"], 
                                                        traza)
            text_version = message
            html_version = prettyprint_html(traza)
            ferrname = traza.split("\n")[-1].split(":")[0]
            if not ferrname:
                ferrname = "error_ginn"
            #import re
            #regexpline = re.compile("line [0-9]+")
            #try:
            #    linea = regexplline.findall(traza)[-1]
            #except IndexError:
            #    pass
            #else:
            #    ferrname += "_" + linea.replace(" ", "_")
            # XXX: Test del HTML. En el navegador se ve fetén, pero en el 
            #      thunderbird no carga el prettyPrint()
            #      Tristeza infinita.
            if False:
                tempfile = open("/tmp/%s.html" % ferrname, "w")
                tempfile.write(html_version)
                tempfile.close()
                os.system("xdg-open /tmp/%s.html" % ferrname)
            # XXX
            part1 = MIMEText(text_version, "plain")
            part2 = MIMEText(html_version, "html")
            msgmail.attach(part1)
            msgmail.attach(part2)
            adjunto = MIMEBase("text", "html")
            adjunto.set_payload(html_version)
            encoders.encode_base64(adjunto)
            adjunto.add_header("Content-Disposition", 
                               "attachment;filename=%s.html" % (ferrname))
            msgmail.attach(adjunto)
            vpro.mover()
            # Aparte de enviarlo por correo, si tengo consola, vuelco.
            try:
                sys.stderr.write("\n")
                sys.stderr.write("="*79)
                sys.stderr.write(datetime.datetime.now().strftime(
                    "%Y%m%d %H:%M:%S").center(80))
                sys.stderr.write("="*79)
                sys.stderr.write("\n")
                sys.stderr.write(message)
                sys.stderr.write("\n")
            except:
                pass
            s = SMTP()
            vpro.mover()
            try:
                s.connect(server, port) #@UndefinedVariable
            except NameError:
                s.connect(server)
            vpro.mover()
            try:
                passoteword = password #@UndefinedVariable
            except NameError:
                pass
            vpro.ocultar()
            try:
                try:
                    if not passoteword:
                        txt="Introduzca contraseña del servidor de correo %s"%(
                            server)
                        passoteword = fdialogo(titulo = "CONTRASEÑA:", 
                                               texto = txt, 
                                               pwd = True) 
                        if passoteword == None:
                            continue
                except NameError, msg:
                    txt="Introduzca contraseña del servidor de correo %s"%(
                        server)
                    passoteword = fdialogo(titulo = "CONTRASEÑA:", 
                                                        texto = txt, 
                                                        pwd = True) 
                    if passoteword == None:
                        continue
                vpro.mostrar()
                vpro.mover()
                try:
                    if ssl: #@UndefinedVariable
                        s.ehlo()
                        s.starttls()
                        s.ehlo()
                except NameError, msg:
                    pass    # No hay variable ssl. No cifrado.
                vpro.mover()
                try:
                    s.login(email, passoteword)
                except SMTPException:
                    print msg
                    pass    # Servidor no necesita autenticación.
                vpro.mover()
            except NameError, msg:
                pass    # No se ha especificado contraseña, será que no