def inicializar_ventana(self): """ Inicializa los controles de la ventana, estableciendo sus valores por defecto, deshabilitando los innecesarios, rellenando los combos, formateando el TreeView -si lo hay-... """ # Inicialización del resto de widgets: cols = (('Hora', 'gobject.TYPE_STRING', True, True, False, self.cambiar_hora), ('Cliente o institución', 'gobject.TYPE_STRING', False, True, True, None), ('Lugar', 'gobject.TYPE_STRING', True, True, False, self.cambiar_lugar), ('Motivo', 'gobject.TYPE_STRING', False, True, False, None), #self.cambiar_motivo), ('Observaciones', 'gobject.TYPE_STRING', True, True, False, self.cambiar_observaciones), ('PUID', 'gobject.TYPE_STRING', False, False, False, None)) # La última columna (oculta en la Vista) siempre es el id. utils.preparar_listview(self.wids['tv_visitas'], cols, multi=True) # ·········· C A M B I O M O D E L O T R E E V I E W ·············· # Agrego un par de columnas para destacar visualmente clientes # confirmados en la BD y visitas ya enviadas. self.wids['tv_visitas'].set_model( # Hora, Enviada, Cliente, ¿existe?, Lugar, Motivo, Observaciones, PUID gtk.ListStore(str, str, str, str, str, str, str, str, str)) # Columna hora con candado si visita enviada. # === Columna 0. Cells 0 y 1 === col_hora = self.wids['tv_visitas'].get_column(0) cellhora = col_hora.get_cell_renderers()[0] col_hora.set_attributes(cellhora, text = 0) # Cell marca visita enviada. cellcandado = gtk.CellRendererPixbuf() col_hora.pack_start(cellcandado, expand = False) col_hora.set_attributes(cellcandado, stock_id = 1) # Columna cliente con autocompletado y símbolo "OK" si existe en la BD. # === Columna 1. Cells 2 y 3 === opts_clientes = [("%s (%s)" % (c.nombre, c.cif), c.puid) for c in pclases.Cliente.select( pclases.Cliente.q.inhabilitado == False, orderBy = "nombre")] self.handler_cliente = utils.cambiar_por_combo( tv = self.wids['tv_visitas'], numcol = 1, opts = opts_clientes, clase = pclases.Visita, campo = "nombrecliente", ventana_padre = self.wids['ventana'], entry = True, numcol_model = 2) col_cliente = self.wids['tv_visitas'].get_column(1) cellcbcliente = col_cliente.get_cell_renderers()[0] cellcbcliente.disconnect(self.handler_cliente) cellcbcliente.connect("edited", self.cambiar_cliente, cellcbcliente.completion.get_model(), 2, self.wids['tv_visitas'].get_model()) # Y ahora añadir el icono celldb = gtk.CellRendererPixbuf() col_cliente.pack_start(celldb, expand = False) col_cliente.set_attributes(cellcbcliente, text = 2) col_cliente.set_attributes(celldb, stock_id = 3) # === Columna 2. Cells 4 y 5 === # Columna lugar. col_lugar = self.wids['tv_visitas'].get_column(2) celllugar = col_lugar.get_cell_renderers()[0] col_lugar.set_attributes(celllugar, text = 4) # Cell lugar geolocalizado correctamente. cellgis = gtk.CellRendererPixbuf() col_lugar.pack_start(cellgis, expand = False) col_lugar.set_attributes(cellgis, stock_id = 5) self.wids['tv_visitas'].connect("button_press_event", self.search_gis) # === Columna 3. Cell 6 === # Columna motivo con autocompletado self.handler_motivo = utils.cambiar_por_combo(self.wids['tv_visitas'], 3, [(m.motivo, m.puid) for m in pclases.MotivoVisita.select( orderBy = "motivo")], pclases.Visita, "motivoVisita", self.wids['ventana'], entry = False, numcol_model = 6) cellcbmotivo = self.wids['tv_visitas'].get_column(3 ).get_cell_renderers()[0] cellcbmotivo.disconnect(self.handler_motivo) cellcbmotivo.connect("edited", self.cambiar_motivo) # === Columna 4. Cell 7 === # Columna observaciones. col_observaciones = self.wids['tv_visitas'].get_column(4) cellobservaciones = col_observaciones.get_cell_renderers()[0] col_observaciones.set_attributes(cellobservaciones, text = 7) # ····································································· # Control de permisos de edición si visitas enviadas: for col in [self.wids['tv_visitas'].get_column(1),]: for cell in col.get_cell_renderers(): cell.connect("editing-started", self.control_permisos_enviado, self.wids['tv_visitas'].get_model()) # Comerciales visibles según usuario "logueado" comerciales = [] comerciales_del_usuario = [] if self.usuario and self.usuario.empleados: for e in self.usuario.empleados: for c in e.comerciales: comerciales_del_usuario.append(c) # También debe tener acceso a los comerciales por debajo de su nivel for c in pclases.Comercial.select(): try: activo = c.empleado.activo nivel = c.empleado.usuario.nivel except AttributeError: continue if activo and nivel > self.usuario.nivel: comerciales_del_usuario.append(c) if not comerciales_del_usuario or (self.usuario and self.usuario.nivel <= NIVEL_SUPERVISOR): comerciales = pclases.Comercial.select() else: comerciales = comerciales_del_usuario[:] opciones_comerciales = [ (c.id, c.empleado and c.empleado.get_nombre_completo() or "Comercial desconocido (%s)" % c.puid) for c in comerciales if c.empleado.activo or c in comerciales_del_usuario] opciones_comerciales.sort(key = lambda i: i[1]) utils.rellenar_lista(self.wids['cb_comercial'], opciones_comerciales) if self.objeto: utils.combo_set_from_db(self.wids['cb_comercial'], self.objeto.id) # Si ha recibido el objeto, debe tener permiso para verlo. De otro # modo... ¡me están juanqueando! (y petará). if self.fecha_recibida: hoy = self.fecha_recibida else: # Empiezo con el día actual. hoy = datetime.date.today() self.wids['calendario'].select_day(hoy.day) self.wids['calendario'].select_month(hoy.month - 1, hoy.year) # Tratamiento especial de los botones actualizar y guardar self.activar_widgets(True, chequear_permisos = False) self.wids['ventana'].resize(700, 500) # Al principio pensé que podría ser útil. Ahora me ha entrado un poco # de complejo de Jacob Nielsen y casi mejor lo quito: self.wids['b_actualizar'].set_property("visible", False)