Esempio n. 1
0
 def inicializar_ventana(self):
     """
     Inicializa los controles de la ventana, construyendo 
     los modelos para los TreeView, etc.
     Si se recibe «columnas», que sea una lista de nombres de columnas en 
     el orden en que se deben mostrar en la ventana; tanto de columnas 
     normales como de relaciones (claves ajenas y múltiples).
     """
     if self.columnas is None:
         self.columnas = [c.name for c in self.clase.sqlmeta.columnList]
     cols = []
     # Nombre, tipo de datos, editable, ordenable, buscable, func. edición.
     for nombre_col in self.columnas:
         sqlcol = self.clase.search_col_by_name(nombre_col)
         tipo_gobject = utils.ui.sqltype2gobject(sqlcol)
         col=(labelize(nombre_col), tipo_gobject, False, True, False, None)
         cols.append(col)
     cols.append(("PUID", "gobject.TYPE_STRING", False, False, False, None))
     try:
         tv = self.wids['tv_datos']
     except KeyError:
         tv = None # No es "estándar" y tiene su propio TreeView
     if tv:
         utils.ui.preparar_treeview(tv, cols)
         tv.connect("row-activated", _abrir_en_ventana_nueva, 
                    self.__usuario, GALACTUS, None, self.clase)
         self.build_totales()
         self.build_filtros()
         self.build_agrupar_por()
         self.build_widget_grafico()
     try:
         self.wids['label_notas'].set_text("\nIntroduzca filtro en la "
             "parte superior y pulse actualizar.\n")
     except KeyError:
         pass    # Tampoco tiene label...
Esempio n. 2
0
 def build_filtros(self):
     c = self.wids['vbox_filtros']
     for campo in self.filtros:
         sqlcampo = self.clase.sqlmeta.columns[campo]
         wfiltro, contenedor = build_filtro(sqlcampo)
         inner = gtk.HBox()
         inner.add(gtk.Label(labelize(campo)))
         try:
             inner.add(contenedor)
         except TypeError:   # No lleva contenedor
             inner.add(wfiltro)
         self.wids[wfiltro.name] = wfiltro
         try:    # Valor por defecto para el filtro
             escribir_valor(sqlcampo, 
                            self.filtros_defecto[wfiltro.name], 
                            self.wids[wfiltro.name])
         except KeyError:    # No hay valor para el filtro
             pass
         c.add(inner)
     c.show_all()
Esempio n. 3
0
 def build_agrupar_por(self):
     """
     Construye un combo para agrupar por algún campo en concreto. Toma por 
     defecto el valor pasado al constructor.
     """
     c = self.wids['vbox_filtros']
     cb_agrupar_por = gtk.ComboBox()
     self.wids['cb_agrupar_por'] = cb_agrupar_por
     utils.ui.rellenar_lista(cb_agrupar_por, 
         enumerate([labelize(i) for i in self.columnas]))
     if self.agrupar_por:    # Valor por defecto
         for i, col in enumerate(self.columnas):
             if col == self.agrupar_por:
                 utils.ui.combo_set_from_db(self.wids['cb_agrupar_por'], i)
     cb_agrupar_por.connect("changed", self.__store_agrupar)
     box_agrupar = gtk.HBox()
     box_agrupar.pack_start(gtk.Label("Agrupar resultados por"))
     box_agrupar.pack_start(cb_agrupar_por)
     box_agrupar.show_all()
     c.add(box_agrupar)
Esempio n. 4
0
 def rellenar_resultados(self):
     vpro = VentanaProgreso(padre = self.wids['ventana'])
     txtpro = self.clase.__name__
     vpro.set_valor(0.0, txtpro)
     vpro.mostrar()
     model = self.wids['tv_datos'].get_model()
     try:
         tot = len(self.resultados)
     except TypeError:
         tot = self.resultados.count()
     if tot*len(self.columnas) > NUMERO_ARBITRARIAMENTE_GRANDE:
         self.wids['tv_datos'].freeze_child_notify()
         self.wids['tv_datos'].set_model(None)
     model.clear()
     i = 0.0
     padres = {}
     for registro in self.resultados:
         vpro.set_valor(i / tot, "[%d/%d] %s (%s)" % (
             i, tot, txtpro, registro.get_puid()))
         i += 1
         fila = []
         for columna in self.columnas:
             valor = getattr(registro, columna)
             valor = humanizar(valor, registro.sqlmeta.columns[columna])
             fila.append(valor)
         fila.append(registro.get_puid())
         if not self.agrupar_por:
             model.append(None, (fila))  # Es un treeview plano que usaré 
                             # como listview. Por eso el nodo padre es None.
         else:
             try:
                 padre = padres[getattr(registro, self.agrupar_por)]
             except KeyError:    # Primera vez que aparece este padre.
                 valor_cabecera = getattr(registro, self.agrupar_por)
                 puid = None
                 if isinstance(self.clase.sqlmeta.columns[self.agrupar_por],
                               pclases.SOForeignKey):
                     valor_cabecera = getattr(registro, 
                         self.agrupar_por.replace("ID", ""))   # CHAPU
                     try:
                         puid = valor_cabecera.get_puid()
                         valor_cabecera = valor_cabecera.get_info()
                     except AttributeError:  # Es None
                         valor_cabecera = "Sin %s" % (
                             labelize(self.agrupar_por))
                         puid = None
                 fila_padre = [valor_cabecera]
                 for i in range(len(self.columnas) - 1):
                     fila_padre.append("")
                 fila_padre.append(puid)
                 padre = padres[getattr(registro, self.agrupar_por)] \
                     = model.append(None, (fila_padre))
             model.append(padre, (fila))
             # Actualizo totales numéricos del padre:
             ncell = 0
             for columna in self.columnas:
                 valor_hijo_columna = getattr(registro, columna)
                 sqlcolumna = registro.sqlmeta.columns[columna]
                 if (isinstance(valor_hijo_columna, (int, float)) and 
                     not isinstance(sqlcolumna, pclases.SOForeignKey)):
                     try:
                         nuevo_valor_padre = utils.numero._float(
                             model[padre][ncell]) 
                     except ValueError:
                         nuevo_valor_padre = 0
                     nuevo_valor_padre += valor_hijo_columna
                     nuevo_valor_padre = utils.numero.float2str(
                         nuevo_valor_padre)
                     model[padre][ncell] = nuevo_valor_padre
                 ncell += 1
     self.actualizar_totales()
     if tot*len(self.columnas) > NUMERO_ARBITRARIAMENTE_GRANDE:
         self.wids['tv_datos'].set_model(model)
         self.wids['tv_datos'].thaw_child_notify()
     vpro.ocultar()