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