示例#1
0
 def intentar_guardar_objeto_anterior_antes_de_actualizar(self, 
                                                          objeto_anterior):
     """
     Primero verifica si hay cambios pendientes de guardar en la ventana 
     actual antes de actualizar el objeto en pantalla.
     La forma de hacerlo es mirar si b_guardar está habilitado. 
     En ese caso intenta guardar los cambios del objeto anterior antes 
     de sustituirlo en pantalla por el nuevo (que es lo que se está 
     intentando "actualizar" en realidad, el self.objeto que aún no está 
     en pantalla).
     Devuelve True si se ha guardado y se puede continuar la actualización 
     del nuevo objeto para mostrarlo en pantalla o False si se debe 
     interrumpir y dejar que el usuario guarde o descarte antes de pasar 
     a otro objeto como self.objeto.
     """
     if not self.objeto: # Evito falsas alarmas al abrir ventanas.
         res = False
     else:
         res = True
         if ("b_guardar" in self.wids.keys() 
            and self.wids['b_guardar'] != None 
            and self.wids['b_guardar'].get_property("sensitive") 
            and objeto_anterior != None
            and objeto_anterior != self.objeto): # Importantísimo esto 
             # último. A veces se da al abrir ventanas lentas desde otras.
             print "Cambios pendientes de guardar... ¡PERO EL OBJETO YA "\
                   "HA CAMBIADO!" 
             #print self.objeto.id, objeto_anterior.id
             respuesta =  ui.dialogo('Hay cambios pendientes de guardar.\n'
                                     '¿Desea hacerlo ahora?', 
                                     '¿GUARDAR CAMBIOS?', 
                                     padre = self.wids['ventana'],
                                     icono = gtk.STOCK_DIALOG_WARNING,
                                     cancelar = True, 
                                     defecto = "Cancelar")
             if respuesta:
                 try:
                     tmp = self.objeto
                     self.objeto = objeto_anterior
                     #self.guardar(None) 
                     # Puede no llamarse así el callback, mejor simular el 
                     # click.
                     self.wids['b_guardar'].clicked()
                     objeto_anterior = self.objeto
                     self.objeto = tmp
                 except:
                     ui.dialogo_info(titulo = 'NO SE PUDO GUARDAR', 
                         texto = 'Los cambios no se pudieron guardar '
                                 'automáticamente.\nDebe hacerlo de f'
                                 'orma manual',
                         padre = self.wids['ventana'])
             elif respuesta == gtk.RESPONSE_CANCEL:  
                 # Cancelará el resto de eventos siempre que sea posible. 
                 # No va a poder cancelar una cadena de acciones 
                 # "programáticamente" definida (por ejemplo, no cancelará 
                 # la asignación de un contador a un cliente en clientes.py,
                 # aunque sí cancelará la acción de guardar información 
                 # modificada y tal).
                 res = False
     return res
示例#2
0
 def actualizar_ventana(self, widget = None, objeto_anterior = None):
     """
     Actualiza el contenido de los controles de la ventana
     para que muestren todos los datos del objeto actual.
     widget no se usa. Se recibe para el caso en que se llama a 
     la función desde un botón.
     objeto_anterior es un objeo de pclases. Sería el que se 
     muestra en pantalla justo antes de llamar a actualizar_ventana
     y recargar los datos. Si se recibe y hay cambios pendientes de
     guardar, el contenido de la ventana se guarda en ese objeto
     ANTES de mostrar el nuevo (o el mismo con nueva información) 
     en los widgets de pantalla.
     """
     if "ventana" in self.wids.keys() and self.wids['ventana'] != None:
         cursor_reloj = gtk.gdk.Cursor(gtk.gdk.WATCH)
         self.wids['ventana'].window.set_cursor(cursor_reloj)
         ui.set_unset_urgency_hint(self.wids['ventana'], False)
         while gtk.events_pending(): gtk.main_iteration(False)
     seguir = self.intentar_guardar_objeto_anterior_antes_de_actualizar(
                 objeto_anterior)
     if seguir:
         if self.objeto != None:
             try:
                 # Empiezo a probar actualización profunda de cachés y demás 
                 # para evitar errores de concurrencia (espero que no 
                 # sobrecargue mucho la red)
                 # refrescar_cache_sqlobject()           
                     # Actualiza (sync) _todos_ los objetos de pclases 
                     # en memoria.
                 self.actualizar_objeto_y_enlaces(
                     actualizar_ventana_tambien = False) 
                     # Actualiza (sync) el objeto de la ventana y 
                     # todas sus relaciones.
                 # self.objeto.sync()   
                     # Por si acaso hay cambios remotos que aún no han 
                     # llegado al objeto.
                 self.rellenar_widgets()
                 self.objeto.make_swap() # Me mantengo sincronizado con mi caché local.
             except sqlobject.SQLObjectNotFound:
                 ui.dialogo_info(titulo = 'REGISTRO ELIMINADO', 
                   texto = 'El registro ha sido borrado desde otro puesto.', 
                   padre = self.wids['ventana'])
                 self.objeto = None
             try:
                 self.wids['b_actualizar'].set_sensitive(False)
             except KeyError:
                 pass    # No hay botón de actualizar. "Passssa nara".
         #print "I like big butts"
         try:
             self.activar_widgets(self.objeto != None)
         except AttributeError:
             pass
         except Exception, msg:
             print "ventana.py::actualizar_ventana -> "\
                   "Excepción al activar_widgets.", msg
示例#3
0
 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 ui.dialogo('Hay cambios pendientes de guardar.\n¿Desea'
                       ' hacerlo ahora?', 
                       '¿GUARDAR CAMBIOS?', 
                       padre = self.wids['ventana'], 
                       icono = gtk.STOCK_SAVE, 
                       defecto = "Sí"):
             try:
                 self.guardar(None)
             except:
                 ui.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 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 \
            ui.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 ui.dialogo('¿Desea salir de la ventana actual?', 
                                  'SALIR', 
                                  padre = self.wids['ventana'],
                                  icono = gtk.STOCK_QUIT)
示例#4
0
 def aviso_actualizacion(self):
     """
     Muestra una ventana modal con el mensaje de objeto 
     actualizado.
     """
     # TODO: OJO: Si la ventana abre otra ventana y se cierra la primera, 
     # pero la segunda no, es posible que se intente ejecutar esta función. 
     # Por ejemplo: abrir partes_de_fabricacion_balas.py y el depurador 
     # (Ctr+Alt+q). Cambiar un valor del parte desde ipython y cerrar el 
     # parte pero no el depurador. En consola aparecerá el WARNING del 
     # except.
     try:
         self.wids['b_actualizar'].set_sensitive(True)
         ui.dialogo_info(titulo = 'ACTUALIZAR',
             texto = 'Los datos han sido modificados remotamente.\nDebe '
                     'actualizar la información mostrada en pantalla.\nP'
                     'ulse el botón «Actualizar»',
             padre = self.wids['ventana'])
     except Exception, msg:
         if pclases.DEBUG:
             print "WARNING: Botón «Actualizar» o "\
                   "self.wids['ventana'] no encontrado. "\
                   "Excepción: %s""" % (msg)