def salir(self, boton, event=None, mostrar_ventana=False): """ Muestra una ventana de confirmación y sale de la ventana cerrando el bucle local de gtk_main. Si mostrar_ventana es False, sale directamente sin preguntar al usuario. """ try: b_guardar = self.wids['b_guardar'] except KeyError: b_guardar = None if b_guardar != None and b_guardar.get_property('sensitive'): # Hay cambios pendientes de guardar. if utils.dialogo('Hay cambios pendientes de guardar.\n¿Desea hace' 'rlo ahora?', '¿GUARDAR CAMBIOS?', padre = self.wids['ventana'], icono = gtk.STOCK_SAVE, #defecto = "Sí"): # CWT: A veces en BlancoPe # abren la ventana de productos para buscar # un precio y le dan al botón antes de que se # carguen los datos, provocando que se detecte # como un falso cambio de datos de la ventana # (todo blanco) respecto a la caché (datos # reales de la BD). Al darle a ENTER, # responden Sí por defecto -hasta ahora- y # sobreescriben con blanco todos los datos del # registro en la base de datos. defecto = "No"): try: self.guardar(None) except: utils.dialogo_info(titulo = 'NO SE PUDO GUARDAR', texto = 'Los cambios no se pudieron gua' 'rdar automáticamente.\nDebe ha' 'cerlo de forma manual', padre = self.wids['ventana']) return True # Si devuelvo False, None, etc... continúa la # cadena de eventos y destruye la ventana. # Devuelvo True para cancelar el cierre de la # ventana. if event == None: # Me ha invocado el botón if not mostrar_ventana or \ utils.dialogo('¿Desea salir de la ventana actual?', 'SALIR', padre = self.wids['ventana'], icono = gtk.STOCK_QUIT): self.wids['ventana'].destroy() return False else: return True else: if not mostrar_ventana or not \ utils.dialogo('¿Desea salir de la ventana actual?', 'SALIR', padre=self.wids['ventana'], icono=gtk.STOCK_QUIT): return False else: return True
def salir(self, boton, event = None, mostrar_ventana = True, ventana = None): """ Muestra una ventana de confirmación y sale de la ventana cerrando el bucle local de gtk_main. Si mostrar_ventana es False, sale directamente sin preguntar al usuario. """ res = False if event == None: # Me ha invocado el botón if (not mostrar_ventana or utils.dialogo('¿Desea cerrar el menú principal?', 'SALIR', padre = ventana, icono = gtk.STOCK_QUIT)): ventana.destroy() self.logger.warning("LOGOUT: %s" % (self.usuario.usuario)) res = False else: res = True else: res = (not mostrar_ventana or not utils.dialogo('¿Desea cerrar el menú principal?', 'SALIR', padre = ventana, icono = gtk.STOCK_QUIT)) if not res: self.logger.warning("LOGOUT: %s" % (self.usuario.usuario)) return res
def __init__(self, objeto = None, usuario = None): """ Constructor. objeto puede ser un objeto de pclases con el que comenzar la ventana (en lugar del primero de la tabla, que es el que se muestra por defecto). """ import informes, tempfile exportar_a_csv_a = None if utils.dialogo(titulo = "FILTRAR EXISTENCIAS NULAS", texto = "¿Desea filtrar ignorando los productos con" " existencias a cero?"): func_informe = geninformes.repuestos_no_nulos else: func_informe = geninformes.repuestos if utils.dialogo(titulo = "EXPORTAR A CSV", texto = "A continuación se generará el informe en " "PDF.\n¿Desa también que se exporte a CSV?", defecto = "No", tiempo = 10): exportar_a_csv_a = os.path.join(tempfile.gettempdir(), "csv_repuestos_%s" % ( mx.DateTime.localtime().strftime("%Y%m%d"))) pdfs = func_informe(exportar_a_csv_a = exportar_a_csv_a) for pdf in pdfs: informes.abrir_pdf(pdf)
def __init__(self, objeto = None, usuario = None): """ Constructor. objeto puede ser un objeto de pclases con el que comenzar la ventana (en lugar del primero de la tabla, que es el que se muestra por defecto). """ import informes, tempfile exportar_a_csv_a = None if utils.dialogo(titulo = "FILTRAR EXISTENCIAS NULAS", texto = "¿Desea filtrar ignorando los productos con existencias a cero?"): func_informe = geninformes.existencias_no_nulas #informes.abrir_pdf(geninformes.existencias_no_nulas(exportar_a_csv_a = "/tmp/t.csv")) else: #informes.abrir_pdf(geninformes.existencias()) func_informe = geninformes.existencias # informes.abrir_pdf(geninformes._existencias()) if utils.dialogo(titulo = "EXPORTAR A CSV", texto = "A continuación se generará el informe en PDF.\n¿Desa también que se exporte a CSV?", defecto = "No", tiempo = 10): exportar_a_csv_a = os.path.join(tempfile.gettempdir(), "csv_existencias_%s" % ( datetime.date.today().strftime("%Y%m%d"))) informes.abrir_pdf(func_informe(exportar_a_csv_a = exportar_a_csv_a))
def pedir_unidad(self, productoCompra): """ Pide la unidad del descuento y comprueba que sea correcta. Recibe el producto de compra para mostrar el valor por defecto. """ txt = """ Introduzca las unidades para el descuento de materiales. Por ejemplo: % (porcentaje en las unidades del material por peso de producto terminado). ud / 5 ud (unidad del material por cada 5 unidades de producto terminado). m / kg (metro de material por kilo de producto). kg / 5.5 m (kg de material por cada 5.5 metros de producto). NOTA: La unidad del materal que se descuenta debe ser la misma que consta en catálogo, pedidos de compra, etc. """ defecto = "%s / ud" % (productoCompra.unidad) res = utils.dialogo_entrada(titulo = "INTRODUZCA UNIDAD", texto = txt, padre = self.wids['ventana'], valor_por_defecto = defecto) if not comprobar_unidad(res): utils.dialogo(titulo = "FORMATO INCORRECTO", texto = "El texto introducido %s no tiene el formato correcto." % (res), padre = self.wids['ventana']) res = None return res
def imprimir(self,boton): """ Prepara la vista preliminar para la impresión del informe """ fechastr = self.wids['e_fecha'].get_text() fecha = utils.parse_fecha(fechastr) fechastr = utils.str_fecha(fecha) fechas = pclases.HistorialExistenciasA.get_fechas_cacheadas() if fecha not in fechas: res = utils.dialogo( titulo = "EXISTENCIAS NO CACHEADAS. ¿CONTINUAR?", texto = "La fecha seleccionada no se encuentra precalculada.\n" "Esto implica que el recuento de existencias puede\n" "demorarse incluso horas. Durante este tiempo es \n" "posible que la aplicación no responda.\n\n" "¿Está seguro de que desea continuar?", padre = self.wids['ventana']) else: res = utils.dialogo(titulo = "¿CONTINUAR?", texto = "La operación puede demorarse durante algún tiempo\n" "y dar la impresión de que la aplicación no responde.\n" "¿Desea continuar?", padre = self.wids['ventana']) if not res: return vpro = ventana_progreso.VentanaProgreso(padre = self.wids['ventana']) self.wids['ventana'].window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) vpro.mostrar() act = 0.0 tot = 2 + pclases.Almacen.select().count() msgtexto = 'Calculando existencias a %s.' % fechastr vpro.set_valor(act/tot, msgtexto) vpro._ventana.realize() vpro._ventana.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) while gtk.events_pending(): gtk.main_iteration(False) import informes try: vpro.set_valor(act/tot, msgtexto) informes.abrir_pdf(geninformes.existencias_productos('rollos', fechastr, hasta = fecha)) act += 1 vpro.set_valor(act/tot, msgtexto) informes.abrir_pdf(geninformes.existencias_productos('balas', fechastr, hasta = fecha)) act += 1 vpro.set_valor(act/tot, msgtexto) for a in pclases.Almacen.select(orderBy = "id"): informes.abrir_pdf(geninformes.existencias_productos('rollos', fechastr, hasta = fecha, almacen = a)) act += 1 vpro.set_valor(act/tot, msgtexto) informes.abrir_pdf(geninformes.existencias_productos('balas', fechastr, hasta = fecha, almacen = a)) act += 1 vpro.set_valor(act/tot, msgtexto) finally: vpro.ocultar() vpro._ventana.window.set_cursor(None) self.wids['ventana'].window.set_cursor(None)
def aceptar(self, boton): res = None model, iter = self.wids['tv_logic'].get_selection().get_selected() if iter != None: id = model[iter][-1] res = pclases.LogicMovimientos.get(id) self.wids['ventana'].destroy() else: utils.dialogo(titulo = "¿CERRAR?", texto = "No ha seleccionado ningún asiento.\n¿Desea cerrar la ventana?", padre = self.wids['ventana']) self.objeto = res return res
def borrar_albaran(self, boton): """ Elimina el albarán de la BD y revierte las existencias de las entradas. """ if utils.dialogo('Se eliminará el albarán actual y todas sus relaciones con ventas, pedidos, etc.\n¿Está seguro?', 'BORRAR ALBARÁN', padre = self.wids['ventana']): albaran = self.objeto if len([ldc for ldc in albaran.lineasDeCompra if ldc.silo != None]) > 0: res = utils.dialogo(titulo = "DESCARGAR SILOS", texto = "¿Anular también las cargas en silo implicados en el albarán?", cancelar = True, icono = gtk.STOCK_DIALOG_WARNING, defecto = False) else: res = False if res != gtk.RESPONSE_CANCEL: if res: for ldc in albaran.lineasDeCompra: if ldc.silo != None: cs = ldc.cargaSilo ldc.cargaSilo = None cs.destroySelf() for linea in albaran.lineasDeCompra: producto = linea.productoCompra if linea.productoCompra.controlExistencias: # XXX DEBUG #print linea.productoCompra.existencias # XXX EODEBUG producto.sync() producto.existencias -= linea.cantidad if producto.existencias < 0: producto.existencias = 0 # En este caso, si la cantidad absoluta de # existencias es cero, como debería ser un campo # calculado pongo a cero las existencias de todos # los almacenes para ese producto (pues ese # debería ser el origen del cálculo). for sa in producto.stocksAlmacen: sa.existencias = 0 sa.syncUpdate() producto.syncUpdate() producto.sync() # XXX DEBUG #print linea.productoCompra.existencias # XXX EODEBUG albaran.notificador.set_func(lambda : None) albaran.destroy_en_cascada() self.ir_a_primero()
def salir(self, boton, event = None, mostrar_ventana = True): """ Muestra una ventana de confirmación y sale de la ventana cerrando el bucle local de gtk_main. Si mostrar_ventana es False, sale directamente sin preguntar al usuario. """ try: b_guardar = self.wids['b_guardar'] except KeyError: b_guardar = None if b_guardar != None and b_guardar.get_property('sensitive'): # Hay cambios pendientes de guardar. if utils.dialogo('Hay cambios pendientes de guardar.\n¿Desea hace' 'rlo ahora?', '¿GUARDAR CAMBIOS?', padre = self.wids['ventana'], icono = gtk.STOCK_SAVE, defecto = "Sí"): try: self.guardar(None) except: utils.dialogo_info(titulo = 'NO SE PUDO GUARDAR', texto = 'Los cambios no se pudieron gua' 'rdar automáticamente.\nDebe ha' 'cerlo de forma manual', padre = self.wids['ventana']) return True # Si devuelvo False, None, etc... continúa la # cadena de eventos y destruye la ventana. # Devuelvo True para cancelar el cierre de la # ventana. if event == None: # Me ha invocado el botón if not mostrar_ventana or \ utils.dialogo('¿Desea salir de la ventana actual?', 'SALIR', padre = self.wids['ventana'], icono = gtk.STOCK_QUIT): self.wids['ventana'].destroy() return False else: return True else: return not mostrar_ventana or \ not utils.dialogo('¿Desea salir de la ventana actual?', 'SALIR', padre = self.wids['ventana'], icono = gtk.STOCK_QUIT)
def crear_muestra_ok_cancel(self, dialogo, respuesta, lote, partida, loteCem): if respuesta == gtk.RESPONSE_ACCEPT: codigo = dialogo.vbox.get_children()[2].get_text() observaciones = dialogo.vbox.get_children()[4].get_text() m = pclases.Muestra(lote = lote, loteCem = loteCem, partida = partida, codigo = codigo, observaciones = observaciones, pendiente = True, envio = mx.DateTime.localtime(), recepcion = None) if utils.dialogo(titulo = "MUESTRA ENVIADA", texto = "Muestra creada, enviada y pendiente para su análisis en laboratorio.\n¿Desea enviar una alerta?", padre = self.wids['ventana']): usuarios = [(u.id, u.usuario) for u in pclases.Usuario.select(orderBy = 'usuario')] usuario = utils.dialogo_combo(titulo = "SELECCIONE USUARIO", texto = "Seleccione del desplegable inferior al usuario que quiere alertar acerda de la muestra.", ops = usuarios, padre = self.wids['ventana']) if usuario != None: user = pclases.Usuario.get(usuario) if m.codigo: msj = "La muestra %s está " % m.codigo else: msj = "Tiene una muestra " msj += "pendiente de analizar." user.enviar_mensaje(msj)
def ir_a_siguiente(self,widget): """ Hace que el siguiente registro (ordenados por ID interno) sea el objeto activo """ if self.wids['b_guardar'] != None and self.wids['b_guardar'].get_property('sensitive'): # Hay cambios pendientes de guardar. if utils.dialogo('Hay cambios pendientes de guardar.\n¿Desea hacerlo ahora?', '¿GUARDAR CAMBIOS?'): try: self.guardar(None) except: utils.dialogo_info(titulo = 'NO SE PUDO GUARDAR', texto = 'Los cambios no se pudieron guardar automáticamente.\nDebe hacerlo de forma manual', padre = self.wids['ventana']) return producto = self.objeto try: siguiente = pclases.ProductoVenta.select(pclases.AND(pclases.ProductoVenta.q.camposEspecificosEspecialID != None, pclases.ProductoVenta.q.id > producto.id),orderBy='id')[0] except IndexError: utils.dialogo_info(texto = "El elemento seleccionado es el último registrado en el sistema", titulo="ERROR", padre = self.wids['ventana']) return self.objeto = siguiente self.actualizar_ventana()
def imprimir(self, boton): """ Prepara la vista preliminar para la impresión del informe. """ resp = utils.dialogo(titulo = "¿IMPRIMIR DESGLOSE?", texto = "Puede imprimir un resumen o todo el contenido de la consulta\n¿Desea imprimir toda la información desglosada?", padre = self.wids['ventana']) if resp: tv = self.wids['tv_datos'] tv.expand_all() while gtk.events_pending(): gtk.main_iteration(False) else: tv = self.wids['tv_datos'] tv.collapse_all() while gtk.events_pending(): gtk.main_iteration(False) from consulta_ventas_por_producto import convertir_a_listview tv = convertir_a_listview(tv) strfecha = "De %s a %s" % (self.wids['e_fechainicio'].get_text(), self.wids['e_fechafin'].get_text()) abrir_pdf(treeview2pdf(tv, titulo = "Beneficio sobre tarifa", fecha = strfecha, extra_data = ( ["Facturado: ", self.wids['e_total'].get_text()], ["Facturación sin IVA: ", self.wids['e_siniva'].get_text()], ["Beneficio neto: ", self.wids['e_beneficio'].get_text()])))
def borrar(self, widget): """ Elimina el pagare en pantalla. """ pagare = self.objeto if pagare != None: if utils.dialogo(titulo = 'BORRAR PAGARÉ', texto = '¿Está seguro de eliminar el pagare actual?', padre = self.wids['ventana']): pagare.notificador.set_func(lambda : None) try: for c in pagare.cobros: c.destroySelf() pagare.destroySelf() self.objeto = None self.ir_a_primero() except: txt = """ El pagare no se eliminó completamente. Tal vez el pagaré o los vencimientos de facturas relacionados estén siendo referenciados por otros elementos de la aplicación. Contacte con el administrador. Información de depuración: """ for c in pagare.cobros: txt += "ID cobro: %d.\n" % c.id txt += "ID pagaré: %d\n" % pagare.id utils.dialogo_info(titulo = 'ERROR: NO SE PUDO BORRAR', texto = txt, padre = self.wids['ventana'])
def drop_consumo_por_producto(self, boton): """ Elimina el consumo o consumos seleccionados en el TreeView. """ texto = """ Si ha seleccionado un consumo se eliminará el consumo completo. Si seleccionó uno o varios productos, se eliminarán del consumo al que pertenece, por lo que ya no empleará el material relacionado cuando se fabriquen artículos del mismo. ¿Está seguro de querer continuar? """ model, paths = self.wids['tv_consumos'].get_selection().get_selected_rows() if paths and utils.dialogo(titulo = "¿ELIMINAR?", texto = texto, padre = self.wids['ventana']): for path in paths: if model[path].parent == None: id_consumo = model[path][-1] consumo_adicional_por_producto = pclases.ConsumoAdicional.get(id_consumo) try: for p in consumo_adicional_por_producto.productosVenta: consumo_adicional_por_producto.removeProductoVenta(p) consumo_adicional_por_producto.destroySelf() except pclases.psycopg_ProgrammingError, msg: utils.dialogo_info(titulo = "ERROR: INFORME A LOS DESARROLLADORES", texto = "Ocurrió un error al eliminar el consumo.\nDEBUG: Traza de la excepción:\n%s" % (msg), padre = self.wids['ventana']) else: id_consumo = model[path].parent[-1] idproductov = model[path][-1] consumo_adicional_por_producto = pclases.ConsumoAdicional.get(id_consumo) productov = pclases.ProductoVenta.get(idproductov) consumo_adicional_por_producto.removeProductoVenta(productov) self.rellenar_consumos_adicionales_por_producto()
def descargar_de_terminal(self, boton): """ lee los códigos almacenados en el terminal lector de códigos de barras y: * si es un diccionario de partidas de carga y números de bala, crea una partida de carga (si no existían) por cada una de las claves del diccionario y relaciona con las mismas las balas de la lista. finalmente, crea un albarán interno con todas esas balas (uno por partida)y abre una ventana de partida de carga (esta) y una de albarán de salida por cada partida de carga y albarán interno procesado con éxito. * si es una lista de balas, las agrega a la partida de carga actual y crea el albarán interno. """ self.logger.warning("%sconsumo_balas_partida::descargar_de_terminal -> Iniciando descarga de balas consumidas/a consumir automática." % (self.usuario and self.usuario.usuario + ": " or "")) datos = None cancelar = False while datos == None and not cancelar: datos = utils.descargar_phaser(logger = self.logger) if datos == None: cancelar = not utils.dialogo(titulo = "¿VOLVER A INTENTAR?", texto = "Se ha superado el tiempo de espera.\n¿Desea continuar?\n\n(Pulse SÍ para volver a intentar o NO para cancelar la operación.)", padre = self.wids['ventana']) elif isinstance(datos, (type([]), type(()))): self.descargar_y_meter_balas_en_partida_carga_actual(datos) elif isinstance(datos, type({})): for partida_carga in datos: if partida_carga == self.objeto: self.descargar_y_meter_balas_en_partida_carga_actual(datos[partida_carga]) else: self.descargar_y_meter_balas_en_partida_carga(partida_carga, datos[partida_carga])
def borrar_producto(self, widget): """ Elimina el producto de la tabla pero NO intenta eliminar ninguna de sus relaciones, de forma que si se incumple alguna restricción de la BD, cancelará la eliminación y avisará al usuario. """ producto = self.objeto if not utils.dialogo('¿Eliminar el producto?', 'BORRAR'): return if producto.articulos != [] or producto.precios != []: utils.dialogo_info('PRODUCTO NO ELIMINADO', 'El producto está implicado en operaciones que impiden su borrado.', padre = self.wids['ventana']) else: producto.notificador.desactivar() campos = producto.camposEspecificosBala try: producto.destroySelf() campos.destroySelf() except: utils.dialogo_info(titulo = "NO SE PUEDE ELIMINAR", texto = "El producto no se puede eliminar. Verifique que no\ntiene ventas o producción relacionada.", padre = self.wids['ventana']) else: self.objeto = None self.ir_a_primero()
def cambiar_precio_ldp(self, cell, path, texto): """ Cambia el precio de la LDP conforme al texto recibido. """ try: precio = utils._float(texto) except: utils.dialogo_info(titulo = "ERROR", texto = 'El texto "%s" no es un número.' % (texto), padre = self.wids['ventana']) else: model = self.wids['tv_ldps'].get_model() ldp = pclases.LineaDePedido.get(model[path][-1]) if ldp.precio != precio: ldp.precio = precio if ldp.get_lineas_de_venta() != [] \ and utils.dialogo(titulo = "¿CAMBIAR PRECIO PRODUCTOS SERVIDOS?", texto = """ Al cambiar el precio de una parte del presupuesto ofertado, se cambian automáticamente los precios de los pedidos involucrados. También puede cambiar los albaranes y facturas si el pedido ya ha sido servido. ¿Desea cambiar el precio de todos los artículos servidos de este producto? Si lo hace, se cambiará también en la factura en caso de que se haya facturado el albarán o albaranes correspondientes. """, padre = self.wids['ventana']): for ldv in ldp.get_lineas_de_venta(): ldv.precio = ldp.precio self.rellenar_tablas()
def set_factura(self, boton): """ Busca un vencimiento de una factura y lo agrega al recibo actual. """ recibo = self.objeto if self.cliente == None: idcliente = self.buscar_cliente() if idcliente == None: return self.cliente = pclases.Cliente.get(idcliente) cliente = self.cliente facturas = self.buscar_factura(cliente) if facturas == None: return if len(facturas) == 0: if utils.dialogo(titulo = "¿BUSCAR EN FACTURAS PAGADAS?", texto = "No se han encontrado facturas pendient" "es de cobro que satisfagan el criterio" " de búsqueda.\n¿Desea volver a buscar " "incluyendo facturas pagadas?", padre = self.wids['ventana']): facturas = self.buscar_factura(cliente, filtrar_pagadas = False) for factura in facturas: vencimiento = self.buscar_vencimiento(factura) if vencimiento == None: continue recibo.fechaVencimiento = vencimiento.fecha recibo.fechaLibramiento = factura.fecha observaciones = "Recibo bancario número %d con fecha de emisión %s." % (self.objeto.numrecibo, utils.str_fecha(self.objeto.fechaLibramiento)) vencimiento.observaciones += observaciones vencimiento.recibo = recibo self.actualizar_ventana()
def borrar(self, widget): """ Elimina el objeto de la tabla pero NO intenta eliminar ninguna de sus relaciones, de forma que si se incumple alguna restricción de la BD, cancelará la eliminación y avisará al usuario. """ XXXobjeto = self.objeto if not utils.dialogo('¿Eliminar el XXX?', 'BORRAR', padre = self.wids['ventana']): return if XXXobjeto.pagos != []: utils.dialogo_info('XXX NO ELIMINADO', 'El XXX está implicado en operaciones que impiden su borrado.', padre = self.wids['ventana']) else: XXXobjeto.notificador.desactivar() try: XXXobjeto.destroySelf() except Exception, e: self.logger.error("XXXskel.py::borrar -> XXX ID %d no se pudo eliminar. Excepción: %s." % (XXXobjeto.id, e)) utils.dialogo_info(titulo = "XXX NO BORRADO", texto = "El XXX no se pudo eliminar.\n\nSe generó un informe de error en el «log» de la aplicación.", padre = self.wids['ventana']) self.actualizar_ventana() return self.objeto = None self.ir_a_primero()
def borrar(self, boton): """ Borra el registro activo. """ if utils.dialogo(titulo = "¿BORRAR?", texto = "¿Desea eliminar el recibo en pantalla?", padre = self.wids['ventana']): try: for vto in self.objeto.vencimientosCobro: vto.recibo = None txtrcbo = "Recibo bancario número %d con fecha de emisión %s." % (self.objeto.numrecibo, utils.str_fecha(self.objeto.fechaLibramiento)) if txtrcbo in vto.observaciones: vto.observaciones = vto.observaciones.replace(txtrcbo, "") else: # Se ha cambiado la fecha o el número del recibo # después de haber incluido el vencimiento if "Recibo bancario" in vto.observaciones: vto.observaciones = vto.observaciones[:vto.observaciones.index("Recibo bancario")] else: # No sé lo que habrá hecho el usuario con las observaciones, reinicio al texto de forma de pago original: try: vto.observaciones = vto.get_factura_o_prefactura().cliente.textoformacobro except AttributeError, msg: # No tiene factura, o la factura no tiene cliente. Dejo las observaciones que tuviera. txterror = "%srecibos::drop_factura -> El vencimientoCobro ID %d no tiene factura, o su factura no tiene cliente. Mensaje de la excepción: %s" % (self.usuario and self.usuario.usuario + ": " or "", vto.id, msg) self.logger.warning(txterror) self.objeto.destroySelf() except Exception, msg: utils.dialogo_info(titulo = "ERROR", texto = "El registro no se pudo eliminar", padre = self.wids['ventana']) self.logger.error("%srecibos::borrar -> No se pudo eliminar el recibo ID %d. Excepcion: %s" % (self.usuario and self.usuario.usuario + ": " or "", self.objeto and self.objeto.id or 0, msg))
def drop(self, w): model, iter = self.wids["tv_pruebas"].get_selection().get_selected() if iter != None and utils.dialogo(titulo="BORRAR PRUEBA", texto="¿Está seguro?"): id = model[iter][-1] prueba = pclases.PruebaTenacidad.get(id) prueba.destroySelf() self.rellenar_pruebas()
def set_partida(self, boton): """ Hace activa una partida seleccionada para agregarle balas, imprimir su consumo, etc... """ try: max_partida = pclases.PartidaCarga._connection.queryOne("SELECT MAX(numpartida) FROM partida_carga")[0] max_partida = "%d" % (max_partida + 1) except: max_partida = "" codigo = utils.dialogo_entrada(titulo = '¿NÚMERO DE PARTIDA?', texto = 'Introduzca el número de partida de carga:', padre = self.wids['ventana'], valor_por_defecto = max_partida) if codigo == None: return try: try: codigo = int(codigo.upper().replace("PC", "")) partida = pclases.PartidaCarga.select(pclases.PartidaCarga.q.numpartida == codigo)[0] except ValueError: partida = pclases.PartidaCarga.select(pclases.PartidaCarga.q.codigo == codigo)[0] self.objeto = partida self.actualizar_ventana() except TypeError: return except IndexError: codigo = `codigo` # CHAPU if codigo.strip() != "" and utils.dialogo(titulo='¿CREAR PARTIDA?', texto='No se encontró la partida %s.\n¿Desea crear una nueva?' % (codigo), padre = self.wids['ventana']): self.nueva_partida(codigo)
def borrar_producto(self, widget): """ Elimina el producto de la tabla pero NO intenta eliminar ninguna de sus relaciones, de forma que si se incumple alguna restricción de la BD, cancelará la eliminación y avisará al usuario. """ producto = self.objeto if not utils.dialogo('¿Eliminar el producto?', 'BORRAR', padre = self.wids['ventana']): return if producto.articulos != [] or producto.precios != []: utils.dialogo_info('PRODUCTO NO ELIMINADO', 'El producto está implicado en operaciones que impiden su borrado.', padre = self.wids['ventana']) else: producto.notificador.desactivar() producto.camposEspecificosEspecial.notificador.desactivar() cee = producto.camposEspecificosEspecial producto.camposEspecificosEspecial = None try: producto.destroySelf() except: producto.camposEspecificosEspecial = cee utils.dialogo_info(titulo = "PRODUCTO NO BORRADO", texto = "El producto no se pudo eliminar", padre = self.wids['ventana']) self.actualizar_ventana() return cee.destroySelf() self.objeto = None self.ir_a_primero()
def borrar(self, widget): """ Elimina la cuenta de la tabla pero NO intenta eliminar ninguna de sus relaciones, de forma que si se incumple alguna restricción de la BD, cancelará la eliminación y avisará al usuario. """ if not utils.dialogo('¿Eliminar %s?'%self.clase.sqlmeta.table.lower(), 'BORRAR', padre = self.wids['ventana']): return self.objeto.notificador.desactivar() try: self.objeto.destroySelf() except Exception, e: self.logger.error("grupos_alumnos.py::borrar -> %s ID %d no se " "pudo eliminar. Excepción: %s." % ( self.objeto.sqlmeta.table, self.objeto.id, e)) utils.dialogo_info( titulo = "%s NO BORRADO" % self.clase.sqlmeta.table.upper(), texto = "%s no se pudo eliminar.\n\nSe generó un informe de " "error en el «log» de la aplicación." % ( self.clase.sqlmeta.table.title()), padre = self.wids['ventana']) self.actualizar_ventana() return
def drop(self, w): model, iter = self.wids['tv_pruebas'].get_selection().get_selected() if iter != None and utils.dialogo(titulo = 'BORRAR PRUEBA', texto = '¿Está seguro?'): id = model[iter][-1] prueba = claseprueba.get(id) prueba.destroySelf() self.rellenar_pruebas()
def sugerir_productos(self, txt): """ Intenta sugerir productos según el corrector Norving. """ dirutils = os.path.join("..", "utils") if dirutils not in sys.path: sys.path.append(dirutils) import spelling palabras = [] for pc in pclases.ProductoCompra.select(): palabras.append(pc.codigo.lower()) palabras.append(pc.descripcion.lower()) for pc in pclases.ProductoVenta.select(): palabras.append(pc.codigo.lower()) palabras.append(pc.descripcion.lower()) palabras = " ".join(palabras) corrector = spelling.SpellCorrector(palabras) sugerencia = corrector.correct(txt.lower()) if sugerencia != txt: res = utils.dialogo(titulo = "SUGERENCIA DE BÚSQUEDA", texto="No se encontró «%s», ¿tal vez quiso decir «%s»?" % ( txt, sugerencia), padre = self.wids['ventana']) if res: res = ([p for p in utils.buscar_productos_compra(sugerencia)]+ [p for p in utils.buscar_productos_venta(sugerencia)]) else: res = [] else: raise ValueError, "Sin alternativas que sugerir." return res
def borrar(self, widget): """ Elimina la cuenta de la tabla pero NO intenta eliminar ninguna de sus relaciones, de forma que si se incumple alguna restricción de la BD, cancelará la eliminación y avisará al usuario. """ cuenta = self.objeto if not utils.dialogo('¿Eliminar la cuenta?', 'BORRAR', padre = self.wids['ventana']): return if cuenta.pagos != []: utils.dialogo_info('CUENTA NO ELIMINADA', 'La cuenta está implicada en operaciones que impiden su borrado.', padre = self.wids['ventana']) else: cuenta.notificador.desactivar() try: cuenta.destroySelf() except Exception, e: self.logger.error("cuentas_destino::borrar -> Cuenta ID %d no se pudo eliminar. Excepción: %s." % (cuenta.id, e)) utils.dialogo_info(titulo = "CUENTA NO BORRADA", texto = "La cuenta no se pudo eliminar.\n\nSe generó un informe de error en el «log» de la aplicación.", padre = self.wids['ventana']) self.actualizar_ventana() return self.objeto = None self.ir_a_primero()
def imprimir(self, boton): """ Prepara la vista preliminar para la impresión del informe. """ resp = utils.dialogo(titulo = "¿IMPRIMIR DESGLOSE?", texto = "Puede imprimir un resumen o todo el " "contenido de la consulta\n" "¿Desea imprimir toda la información " "desglosada?", padre = self.wids['ventana']) if resp: tv = self.wids['tv_datos'] tv.expand_all() while gtk.events_pending(): gtk.main_iteration(False) colstotales = [] else: tv = self.wids['tv_datos'] tv.collapse_all() while gtk.events_pending(): gtk.main_iteration(False) from consulta_ventas_por_producto import convertir_a_listview tv = convertir_a_listview(tv) colstotales = [2, 3, 4] strfecha = "De %s a %s" % (self.wids['e_fechainicio'].get_text(), self.wids['e_fechafin'].get_text()) abrir_pdf(treeview2pdf(tv, titulo = "Beneficio sobre tarifa (tickets)", fecha = strfecha, numcols_a_totalizar = colstotales))
def __init__(self, objeto = None, usuario = None): """ Constructor. objeto puede ser un objeto de pclases con el que comenzar la ventana (en lugar del primero de la tabla, que es el que se muestra por defecto). """ if utils.dialogo(titulo = "¿EXPORTAR A CSV?", texto = "¿Quiere generar también un archivo CSV por " "cada PDF que se cree a continuación?", defecto = False, tiempo = 15): csv = True ruta_csv = tempfile.NamedTemporaryFile(suffix = ".csv").name else: csv = False ruta_csv = None import informes informes.abrir_pdf(geninformes.existencias_productos( 'rollos', "%s, %s" % (utils.str_fecha(time.localtime()), time.strftime("%H:%M")), ruta_csv = ruta_csv)) if pclases.Almacen.select().count() > 1: for a in pclases.Almacen.select(): if csv: ruta_csv = tempfile.NamedTemporaryFile( suffix = "_%s.csv" % a.nombre, delete = False).name informes.abrir_pdf( geninformes.existencias_productos('rollos', "%s, %s" % ( utils.str_fecha(time.localtime()), time.strftime("%H:%M")), almacen = a, ruta_csv = ruta_csv))
def borrar_empleado(self, widget): """ Elimina el empleado de la tabla pero NO intenta eliminar ninguna de sus relaciones, de forma que si se incumple alguna restricción de la BD, cancelará la eliminación y avisará al usuario. """ empleado = self.objeto if not utils.dialogo('Se borrará el empleado actual.\n¿Está seguro?', '¿BORRAR EMPLEADO?', padre = self.wids['ventana']): return if empleado != None: empleado.notificador.set_func(lambda : None) actividades = empleado.actividades[:] documentos = empleado.documentos[:] fotos = empleado.fotos[:] grupos = empleado.gruposAlumnos[:] for lista in (actividades, documentos, fotos, grupos): for objeto in lista: objeto.empleado = None try: empleado.destroySelf() except: utils.dialogo_info('EMPLEADO NO ELIMINADO', 'No se pudo eliminar el empleado.', padre = self.wids['ventana']) for lista in (actividades, documentos, fotos, grupos): for objeto in lista: objeto.empleado = empleado else: self.ir_a_primero()