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