Exemple #1
0
 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)