def __init__(self, objeto = None, usuario = None, fini = None, ffin = None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     Ventana.__init__(self, 'facturacion_por_cliente_y_fechas.glade', 
                      objeto, usuario = usuario)
     connections = {'b_salir/clicked': self.salir,
                    'b_imprimir/clicked': self.imprimir, 
                    'cbe_cliente/changed': self.cambiar_cliente, 
                    'b_fechaini/clicked': self.cambiar_fechaini, 
                    'b_fechafin/clicked': self.cambiar_fechafin, 
                    'b_export/clicked': self.exportar_a_csv, }
                     #'tv_facturas/row-expanded': self.expandir_subramas}  
     self.add_connections(connections)
     self.wids['tv_facturas'].connect("row-expanded", 
                                      self.expandir_subramas)
     self.inicializar_ventana()
     if fini:
         self.wids['e_fechaini'].set_text(utils.str_fecha(fini))
     if ffin:
         self.wids['e_fechafin'].set_text(utils.str_fecha(ffin))
     if objeto != None:
         utils.combo_set_from_db(self.wids['cbe_cliente'], objeto.id)
     gtk.main()
 def rellenar_widgets(self):
     """
     Introduce la información del albaran actual
     en los widgets.
     No se chequea que sea != None, así que
     hay que tener cuidado de no llamar a 
     esta función en ese caso.
     """
     albaran = self.objeto
     self.wids['e_numalbaran'].set_text(albaran.numalbaran)
     self.wids['e_fecha'].set_text(utils.str_fecha(albaran.fecha))
     self.rellenar_tabla(self.wids['tv_ldvs'])
     if albaran.proveedorID == None:
         self.wids['cmbe_proveedor'].set_active(-1)
         self.wids['cmbe_proveedor'].child.set_text("")
     else:
         utils.combo_set_from_db(self.wids['cmbe_proveedor'], albaran.proveedorID)
     self.wids['e_facturas'].set_text(", ".join([f.numfactura for f in albaran.facturasCompra]))
     self.wids['e_pedidos'].set_text(", ".join([p.numpedido for p in albaran.pedidosCompra]))
     self.suspender(self.wids['cbe_almacen'])
     utils.combo_set_from_db(self.wids['cbe_almacen'], 
                             self.objeto.almacenID, 
                             forced_value = self.objeto.almacen 
                                 and self.objeto.almacen.nombre or None)
     self.revivir(self.wids['cbe_almacen'])
     self.objeto.make_swap()
Example #3
0
 def rellenar_widgets(self):
     """
     Introduce la información de la cuenta actual
     en los widgets.
     No se chequea que sea != None, así que
     hay que tener cuidado de no llamar a 
     esta función en ese caso.
     """
     adaptadores = self.adaptador.get_adaptadores()
     for col in adaptadores.keys():
         adaptadores[col]['mostrar'](self.objeto)
     self.objeto.mostrar_imagen_en(self.wids['plano'], MAX = 200)
     self.objeto.make_swap()
     self.wids['ventana'].set_title(self.objeto.get_info())
     # Por defecto pongo la campaña que coincida con la fecha actual (si 
     # la hay, la primera que encuentre) como campaña activa.
     hoy = mx.DateTime.localtime()
     campannas = pclases.Campanna.select(pclases.AND(
         pclases.Campanna.q.fechaInicio <= hoy, 
         pclases.Campanna.q.fechaFin >= hoy))
     if campannas.count():
         campanna = campannas[0]
         utils.combo_set_from_db(self.wids['cb_campanna'], campanna.id)
         # HACK: WORKAROUND: Debería lanzarse él solito con el changed 
         #                   del combo...
         self.rellenar_tablas(self.wids['cb_campanna'])
 def __init__(self, objeto = None, usuario = None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     global fin
     Ventana.__init__(self, 'consulta_pedidos_clientes.glade', objeto, usuario = usuario)
     connections = {'b_salir/clicked': self.salir,
                    'b_buscar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_fecha_inicio/clicked': self.set_inicio,
                    'b_fecha_fin/clicked': self.set_fin,
                    'b_exportar/clicked': self.exportar}
     self.add_connections(connections)
     utils.rellenar_lista(self.wids['cmbe_cliente'], [(c.id, c.nombre) for c in pclases.Cliente.select(orderBy='nombre')])
     cols = (('Código', 'gobject.TYPE_STRING', False, True, False, None),
             ('Descripción', 'gobject.TYPE_STRING', False,True,False,None),
             ('Precio s/IVA', 'gobject.TYPE_STRING', False,True,False,None),
             ('ID', 'gobject.TYPE_STRING', False, False, False, None))
     utils.preparar_listview(self.wids['tv_datos'], cols)
     col = self.wids['tv_datos'].get_column(2)
     for cell in col.get_cell_renderers():
         cell.set_property("xalign", 1)
     self.wids['tv_datos'].connect("row-activated", self.abrir_producto)
     temp = time.localtime()
     self.fin = str(temp[0])+'/'+str(temp[1])+'/'+str(temp[2])
     self.wids['e_fecha_fin'].set_text(utils.str_fecha(temp))
     if objeto != None:
         utils.combo_set_from_db(self.wids["cmbe_cliente"], objeto.id)
         self.wids["b_buscar"].clicked()
     self.wids['hbox4'].set_property("visible", False)
     self.wids['ventana'].set_title("Productos facturados al cliente")
     gtk.main()
 def rellenar_widgets(self):
     """
     Introduce la información del albaran actual
     en los widgets.
     No se chequea que sea != None, así que
     hay que tener cuidado de no llamar a 
     esta función en ese caso.
     """
     self.wids['b_guardar'].set_sensitive(False) 
         # Deshabilito el guardar antes de actualizar para 
         # evitar "falsos positivos".
     albaran = self.objeto
     if albaran == None: 
         return
     self.wids['e_numalbaran'].set_text(albaran.numalbaran)
     self.wids['e_fecha'].set_text(utils.str_fecha(albaran.fecha))
     self.wids['ch_bloqueado'].set_active(self.objeto.bloqueado)
     self.suspender(self.wids['cbe_almacen'])
     utils.combo_set_from_db(self.wids['cbe_almacen'], 
                             self.objeto.almacenOrigenID, 
                             forced_value = self.objeto.almacenOrigen 
                                 and self.objeto.almacenOrigen.nombre 
                                 or None)
     self.revivir(self.wids['cbe_almacen'])
     self.rellenar_ldvs()
     self.wids['b_guardar'].set_sensitive(False) 
         # Deshabilito el guardar antes de actualizar para 
         # evitar "falsos positivos".
     self.objeto.make_swap()
Example #6
0
 def __init__(self, mes = None, anno = None, ldp = None, solo_lectura = False, usuario = None):
     """
     Constructor. objeto puede ser un objeto de pclases  de la 
     línea de producción con la que comenzar la ventana.
     """
     self.escritura = not solo_lectura
     Ventana.__init__(self, 'calendario_laboral.glade', None, usuario = usuario)
     connections = {'b_salir/clicked': self.salir
                    }
     self.add_connections(connections)
     self.cal = []   # Los Gtk.Table no tienen método para acceder a los hijos por fila y columna (flipa!).
                     # Así que los iré guardando aquí para poderlos crear y destruir sobre la marcha.
     utils.rellenar_lista(self.wids['cbe_linea'], 
                          [(l.id, l.nombre) for l in pclases.LineaDeProduccion.select(orderBy='nombre')])
     if mes == None:
         mes = mx.DateTime.localtime().month
     if anno == None:
         anno = mx.DateTime.localtime().year
     self.wids['sp_mes'].set_value(mes)
     self.wids['sp_anno'].set_value(anno)
     self.wids['cbe_linea'].connect('changed', self.rellenar_widgets)
     self.wids['sp_mes'].connect('value-changed', self.rellenar_widgets)
     self.wids['sp_anno'].connect('value-changed', self.rellenar_widgets)
     if ldp == None:
         utils.combo_set_from_db(self.wids['cbe_linea'], pclases.LineaDeProduccion.select(orderBy='nombre')[0].id)
     else:
         utils.combo_set_from_db(self.wids['cbe_linea'], ldp.id)
     gtk.main()
Example #7
0
 def set_valor(self, w, nombrecampo, tipocampo):
     # valor = self.objeto._SO_getValue(nombrecampo)
     get_valor = getattr(self.objeto, '_SO_get_%s' % (nombrecampo))
     valor = get_valor()
     if isinstance(tipocampo, pclases.SOStringCol):  # Cadena: el widget es un entry
         if valor != None:
             w.set_text(valor)
         else:
             w.set_text("")
     elif isinstance(tipocampo, pclases.SOIntCol):   # Entero: el widget es un entry
         try:
             w.set_text("%d" % valor)
         except TypeError:
             w.set_text("0")
     elif isinstance(tipocampo, pclases.SOBoolCol):  # Boolean: el widget es un checkbox
         w.set_active(valor)
     elif isinstance(tipocampo, pclases.SOForeignKey):  # Entero-clave ajena: el widget es un comboboxentry
         utils.combo_set_from_db(w, valor)
     elif isinstance(tipocampo, pclases.SOCol):      # Clase base, casi seguro Float: el widget es un entry
         if valor != None:
             try:
                 w.set_text(utils.float2str(valor))
             except ValueError:
                 w.set_text('0')
     else:
         txt = "categorias_laborales.py: No se pudo establecer el valor %s para %s." % (valor, w)
         print txt
         self.logger.error(txt)
Example #8
0
 def ir_a(self, objeto = None):
     if not objeto:
         self.ir_a_primero()
     else:
         # El comercial:
         self.objeto = objeto
         utils.combo_set_from_db(self.wids['cb_comercial'], self.objeto.id)
         self.actualizar_ventana()
 def __init__(self, objeto = None, usuario = None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     global fin
     Ventana.__init__(self, 'consulta_ventas.glade', objeto, usuario = usuario)
     connections = {'b_salir/clicked': self.salir,
                    'b_buscar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_fecha_inicio/clicked': self.set_inicio,
                    'b_fecha_fin/clicked': self.set_fin}
     self.add_connections(connections)
     cols = (('Cliente','gobject.TYPE_STRING',False,True,False,None),
             ('Factura','gobject.TYPE_STRING',False,True,True,None),
             ('Fecha','gobject.TYPE_STRING',False,True,False,None),
             ('Total','gobject.TYPE_STRING',False,True,False,None),
             ('Beneficio','gobject.TYPE_STRING',False,True,False,None),
             ('Pendiente','gobject.TYPE_STRING',False,True,False,None),
             ('Id','gobject.TYPE_INT64',False,False,False,None))
     utils.preparar_treeview(self.wids['tv_datos'], cols)
     self.wids['tv_datos'].connect("row-activated", self.abrir_prefactura)
     self.wids['tv_datos'].get_column(3).get_cell_renderers()[0].set_property('xalign', 1) 
     self.wids['tv_datos'].get_column(4).get_cell_renderers()[0].set_property('xalign', 1) 
     self.wids['tv_datos'].get_column(5).get_cell_renderers()[0].set_property('xalign', 1) 
     temp = time.localtime()
     self.fin = str(temp[0])+'/'+str(temp[1])+'/'+str(temp[2])
     self.wids['e_fechafin'].set_text(utils.str_fecha(temp))
     self.metros_totales = 0.0
     self.kilos_totales = 0.0
     opciones = [(c.id, c.nombre) for c in pclases.Cliente.select(orderBy = "nombre")]
     opciones.insert(0, (-1, "Todos"))
     utils.rellenar_lista(self.wids['cbe_cliente'], opciones)
     utils.combo_set_from_db(self.wids['cbe_cliente'], -1)
     self.wids['label7'].set_text("Total beneficio estimado: ")
     #self.wids['label7'].set_property("visible", False)
     #self.wids['e_total_kilos'].set_property("visible", False)
     self.wids['label8'].set_property("visible", False)
     self.wids['e_total_metros'].set_property("visible", False)
     self.wids['label9'].set_property("visible", False)
     self.wids['cbe_cliente'].set_property("visible", False)
     self.wids['ventana'].set_title("Listado de prefacturas")
     self.wids['notebook1'].remove_page(1)
     self.wids['label1'].set_text("Por cliente")
     labpdte = gtk.Label("Total pendiente:")
     labpdte.show()
     self.wids['hbox4'] = gtk.HBox()
     self.wids['hbox4'].add(labpdte)
     self.wids['e_totpdte'] = gtk.Entry()
     self.wids['e_totpdte'].set_property("editable", False)
     self.wids['e_totpdte'].set_property("has-frame", False)
     self.wids['hbox4'].add(self.wids['e_totpdte'])
     self.wids['hbox4'].show_all()
     self.wids['vbox2'].add(self.wids['hbox4'])
     self.wids['vbox2'].reorder_child(self.wids['hbox4'], 2)
     self.wids['e_totpdte'].show()
     gtk.main()
 def __init__(self, objeto=None, usuario=None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     Ventana.__init__(self, 'consulta_pedidos_clientes.glade', objeto,
                      usuario=usuario)
     connections = {'b_salir/clicked': self.salir,
                    'b_buscar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_fecha_inicio/clicked': self.set_fecha,
                    'b_fecha_fin/clicked': self.set_fecha,
                    'b_exportar/clicked': self.exportar,
                    'e_fecha_inicio/focus-out-event': act_fecha,
                    'e_fecha_fin/focus-out-event': act_fecha,
                   }
     self.add_connections(connections)
     utils.rellenar_lista(self.wids['cmbe_cliente'],
             [(c.id, c.nombre)
                 for c in pclases.Cliente.select(orderBy='nombre')])
     cols = (('Cliente', 'gobject.TYPE_STRING', False, True, False, None),
             ('Fecha', 'gobject.TYPE_STRING', False, True, False, None),
             ('Pedido', 'gobject.TYPE_STRING', False, True, False, None),
             ('Producto', 'gobject.TYPE_STRING', False, True, False, None),
             ('Cantidad\npedida', 'gobject.TYPE_STRING',
                                                 False, True, False, None),
             ('Cantidad\nservida', 'gobject.TYPE_STRING',
                                                 False, True, False, None),
             ('Importe\npedido\n(c/IVA)', 'gobject.TYPE_STRING',
                                                 False, True, False, None),
             ('Importe\nservido\n(c/IVA)', 'gobject.TYPE_STRING',
                                                 False, True, False, None),
             ("Bloqueado", "gobject.TYPE_BOOLEAN", False, True, False, None),
             ("Cerrado", "gobject.TYPE_BOOLEAN", False, True, False, None),
             ('PUIDPEDIDO;PUIDPRODUCTO', 'gobject.TYPE_STRING', # HACK
                                                 False, False, False, None))
     utils.preparar_listview(self.wids['tv_datos'], cols)
     for ncol in (4, 5, 6, 7):
         col = self.wids['tv_datos'].get_column(ncol)
         for cell in col.get_cell_renderers():
             cell.set_property("xalign", 1)
     for col in self.wids['tv_datos'].get_columns():
         col.connect("clicked", self.order_changed_refresh_grafica)
     self.wids['tv_datos'].connect("row-activated", self.abrir_pedido)
     self.resultado = []
     self.fin = utils.str_fecha(datetime.date.today())
     self.inicio = None
     self.wids['e_fecha_fin'].set_text(self.fin)
     self.wids['e_fecha_inicio'].set_text("")
     if objeto != None:
         utils.combo_set_from_db(self.wids["cmbe_cliente"], objeto.id)
         self.wids["b_buscar"].clicked()
     self.add_widgets_extra()
     self.servido_por_producto = defaultdict(lambda: 0)
     self.wids['cmbe_cliente'].grab_focus()
     gtk.main()
Example #11
0
def setter_combobox(objeto, col, w):
    """
    Muestra el valor del atributo "col" del objeto
    "objeto" en el entry hijo del combobox "w".
    """
    valor = getattr(objeto, col.name)
    # TODO: Comprobar qué tipo de SOCol es y convertir el valor si
    #       es una fecha, un float, etc.
    combo_set_from_db(w, valor)
Example #12
0
 def rellenar_widgets(self):
     """
     Introduce la información del proveedor actual
     en los widgets.
     No se chequea que sea != None, así que
     hay que tener cuidado de no llamar a 
     esta función en ese caso.
     """
     proveedor = self.objeto
     if proveedor != None:
         orden = utils.combo_get_value(self.wids["cb_orden"])
         if orden == "Orden cronológico":
             proveedores = pclases.Proveedor.select(orderBy="id")
         elif orden == "Orden alfabético":
             proveedores = pclases.Proveedor.select(orderBy="nombre")
         proveedores_count = proveedores.count()
         yo_index = pclases.SQLlist(proveedores).index(self.objeto) + 1
         self.wids["ventana"].set_title(
             "Proveedores - %s (%d de %d)" % (proveedor.nombre, yo_index, proveedores_count)
         )
         # Aprovechando que todo son "text" y los "entry" se llaman casi
         # igual:
         for c in proveedor.sqlmeta.columnList:
             if c.name != "tipoDeProveedorID":
                 textobj = getattr(proveedor, c.name)
                 # Reparo los Nones que haya en la BD
                 if textobj == None:
                     proveedor.notificador.set_func(lambda: None)
                     textobj = ""
                     setattr(proveedor, c.name, textobj)
                     proveedor.notificador.set_func(self.aviso_actualizacion)
                 self.escribir_valor(self.wids["e_%s" % c.name], textobj)
             else:
                 utils.combo_set_from_db(self.wids["cb_tipo_de_proveedor"], proveedor.tipoDeProveedorID)
         self.rellenar_cuentas()
         self.rellenar_tipos_de_material()
         self.objeto.make_swap()
         try:
             doc_from_db = self.objeto.get_documentoDePago().documento
         except AttributeError:
             doc_from_db = None
         if doc_from_db and doc_from_db != self.objeto.documentodepago:
             if utils.dialogo(
                 titulo="CORREGIR DOCUMENTO DE PAGO",
                 texto="El cliente actual tiene como documento de pago:\n"
                 "«%s». Se aconseja usar «%s».\n"
                 "¿Corregirlo automáticamente?\n\n"
                 "(Responda «No» si la forma de pago es correcta \n"
                 "o prefiere corregirlo manualmente)" % (self.objeto.documentodepago, doc_from_db),
                 padre=self.wids["ventana"],
             ):
                 self.objeto.documentodepago = doc_from_db
                 self.objeto.syncUpdate()
                 self.wids["e_documentodepago"].set_text(self.objeto.documentodepago)
         ### Botones anterior/siguiente
         self.actualizar_botones_anterior_siguiente()
Example #13
0
 def __init__(self, objeto = None, usuario = None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     Ventana.__init__(self, self.VENTANA, objeto)
     self.add_connections({"b_salir/clicked": self.salir, 
                           "b_imprimir/clicked": self.imprimir, 
                           "b_exportar/clicked": self.exportar, 
                           "cb_empleado/changed": self.mostrar_produccion})
     self.inicializar_ventana()
     if objeto != None:
         utils.combo_set_from_db(self.wids['cb_empleado'], objeto.id)
     gtk.main()
 def __init__(self, objeto = None, usuario = None):
     self.usuario = usuario
     Ventana.__init__(self, 'consulta_existencias_por_tipo.glade', 
                      objeto, self.usuario)
     connections = {'b_salir/clicked': self.salir,
                    'b_actualizar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_exportar/clicked': self.exportar, 
                    'cb_almacen/changed': self.buscar} 
     self.add_connections(connections)
     for nomtv in ("tv_fibra", "tv_gtx", "tv_cemento"):
         cols = [
             ('Producto', 'gobject.TYPE_STRING', False, True, True, None),#0
             ('A (Kg)', 'gobject.TYPE_STRING', False, True, False, None),
             ('A (#)', 'gobject.TYPE_STRING', False, True, False, None),
             ('B (Kg)', 'gobject.TYPE_STRING', False, True, False, None),
             ('B (#)', 'gobject.TYPE_STRING', False, True, False, None),
             ('C (Kg)', 'gobject.TYPE_STRING', False, True, False, None),
             ('C (#)', 'gobject.TYPE_STRING', False, True, False, None),
             ('Total (Kg)', 'gobject.TYPE_STRING', False, True, False, None),
             ('Total (#)', 'gobject.TYPE_STRING', False, True, False, None),
             ('PUID', 'gobject.TYPE_STRING', False, False, False, None)]#(5)
         if nomtv == "tv_gtx":
             cols.insert(2, 
               ('A (m²)', 'gobject.TYPE_STRING', False, True, False, None))
             cols.insert(5, 
               ('B (m²)', 'gobject.TYPE_STRING', False, True, False, None))
             cols.insert(8, 
               ('C (m²)', 'gobject.TYPE_STRING', False, True, False, None))
             cols.insert(11, 
               ('Total (m²)', 
                   'gobject.TYPE_STRING', False, True, False, None))
         tv = self.wids[nomtv]
         utils.preparar_listview(tv, cols)
         tv.connect("row-activated", self.abrir_objeto)
         for ncol in range(1, len(cols) - 1):
             col = tv.get_column(ncol)
             col.get_cell_renderers()[0].set_property('xalign', 1.0) 
         col = tv.get_column(0)
         col.set_expand(True)
     almacenes = pclases.Almacen.select(
             pclases.Almacen.q.activo == True, 
             orderBy = "id")
     opciones = [(0, "Todos")] + [(a.id, a.nombre) for a in almacenes]
     utils.rellenar_lista(self.wids['cb_almacen'], opciones)
     utils.combo_set_from_db(self.wids['cb_almacen'], 0)
     gtk.main()
 def __init__(self, objeto=None, usuario=None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     Ventana.__init__(self, 'consulta_saldo_proveedores.glade', objeto,
                      usuario=usuario)
     connections = {'b_salir/clicked': self.salir,
                    'b_buscar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_fecha_inicio/clicked': self.set_fecha,
                    'b_fecha_fin/clicked': self.set_fecha,
                    'b_exportar/clicked': self.exportar,
                    'e_fecha_inicio/focus-out-event': act_fecha,
                    'e_fecha_fin/focus-out-event': act_fecha,
                   }
     self.add_connections(connections)
     utils.rellenar_lista(self.wids['cmbe_proveedor'],
             [(0, "Todos")] +
             [(c.id, c.nombre)
                 for c in pclases.Proveedor.select(orderBy='nombre')])
     cols = (('Proveedor', 'gobject.TYPE_STRING', False, True, False, None),
             ('Factura', 'gobject.TYPE_STRING', False, True, False, None),
             ('Fecha', 'gobject.TYPE_STRING', False, True, False, None),
             ('Importe', 'gobject.TYPE_STRING', False, True, False, None),
             ('Vencimientos', 'gobject.TYPE_STRING', False, True, False, None),
             ('Pagado', 'gobject.TYPE_STRING', False, True, False, None),
             ('Pendiente', 'gobject.TYPE_STRING', False, True, False, None),
             ('DBPUID', 'gobject.TYPE_STRING', False, False, False, None))
     utils.preparar_treeview(self.wids['tv_datos'], cols)
     for ncol in (3, 4, 5, 6):
         col = self.wids['tv_datos'].get_column(ncol)
         for cell in col.get_cell_renderers():
             cell.set_property("xalign", 1)
     self.wids['tv_datos'].connect("row-activated", self.abrir_objeto)
     self.resultado = []
     self.fin = utils.str_fecha(datetime.date.today())
     self.inicio = None
     self.wids['e_fecha_fin'].set_text(self.fin)
     self.wids['e_fecha_inicio'].set_text("")
     if objeto != None:
         utils.combo_set_from_db(self.wids["cmbe_proveedor"], objeto.id)
         self.wids["b_buscar"].clicked()
     self.wids['cmbe_proveedor'].grab_focus()
     gtk.main()
 def __init__(self, objeto = None, usuario = None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     Ventana.__init__(self, 'consulta_existencias_por_almacen.glade', 
                      objeto)
     while self.wids['notebook'].get_n_pages() > 1:
         self.wids['notebook'].remove_page(-1)
     self.wids['notebook'].set_tab_label_text(self.wids["scrolledwindow1"], 
                                              "Por producto")
     connections = {'b_salir/clicked': self.salir,
                    'b_buscar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_exportar/clicked': self.exportar}
     self.add_connections(connections)
     cols = [('Código', 'gobject.TYPE_STRING', False, True, False, None),
             ('Producto', 'gobject.TYPE_STRING', False, True, True, None),
             ("Total", "gobject.TYPE_STRING", False, True, False, None), 
             ('PUID', 'gobject.TYPE_STRING', False, False, False, None)]
     for a in pclases.Almacen.select(pclases.Almacen.q.activo == True, 
                                     orderBy = "-id"):
         # Por cada almacén una columna en el treeview 
         cols.insert(2, (a.nombre, "gobject.TYPE_STRING", 
                         False, True, False, None))
         # ...y una hoja más en el notebook
         self.add_hoja_notebook(a)
     utils.preparar_listview(self.wids['tv_por_producto'], cols)
     self.wids['tv_por_producto'].connect("row-activated", 
                                          self.abrir_producto)
     for numcol in range(2, len(cols)-1):
         self.wids['tv_por_producto'].get_column(numcol).get_cell_renderers()[0].set_property('xalign', 1) 
     self.wids['ventana'].maximize()
     tipos = [(tdm.id, tdm.descripcion) for tdm in pclases.TipoDeMaterial.select(orderBy = "descripcion")]
     tipos.insert(0, (0, "Todos los productos"))
     tipos.insert(1, (-1, "Todos los productos de venta"))
     tipos.insert(2, (-2, "Todos los productos de compra"))
     utils.rellenar_lista(self.wids['cbe_tipo'], tipos)
     utils.combo_set_from_db(self.wids['cbe_tipo'], 0)
     gtk.main()
Example #17
0
 def rellenar_widgets(self):
     """
     Redimensiona «t» y crea dentro los widgets necesarios para
     mostrar y editar los campos de «objeto».
     """
     numcampos = len(self.objeto.sqlmeta.columns) - 1 # por el campo fecha
     if numcampos % 2 != 0:
         numwidgets = numcampos + 1
     else:
         numwidgets = numcampos
     for child in self.wids['t'].get_children():
         child.destroy()
     self.wids['t'].resize(numwidgets / 2, 4)
     icol = 0
     irow = 0
     for col in self.objeto.sqlmeta.columns:
         if col == "fecha":
             continue
         if not isinstance(self.objeto.sqlmeta.columns[col], 
                           pclases.SOBoolCol):
             # Los checkboxes llevan su propio label.
             label = self.build_label(col)
             self.wids['t'].attach(label, icol, icol+1, irow, irow+1)
         icol += 1
         child = self.build_child(col, self.objeto.sqlmeta.columns[col])
         self.set_valor(child, col, self.objeto.sqlmeta.columns[col])
         self.wids['t'].attach(child, icol, icol+1, irow, irow+1)
         icol += 1
         if icol == 4:
             icol = 0
             irow += 1
     self.wids['t'].show_all()
     categorias = pclases.CategoriaLaboral.selectBy(
             codigo = self.objeto.codigo)
     fechas = [(c.id, utils.str_fecha(c.fecha)) for c in categorias]
     utils.rellenar_lista(self.wids['cb_fecha'], fechas)
     self.wids['cb_fecha'].disconnect(self.fecha_handler)
     utils.combo_set_from_db(self.wids['cb_fecha'], self.objeto.id)
     self.fecha_handler = self.wids['cb_fecha'].connect("changed", 
                                                        self.fecha_changed)
     self.objeto.make_swap()
Example #18
0
 def mostrar_info_cliente(self):
     """
     Introduce el código del cliente y la información relativa en los 
     widgets.
     Si el nombre y domicilio del librado están en blanco, escribe también 
     ahí los datos del cliente.
     """
     if self.cliente == None:
         self.wids['e_codcliente'].set_text("")
         utils.rellenar_lista(self.wids['cbe_cuenta_bancaria_cliente'], 
             [(c.id, "%s%s%s%s" % (c.cuenta, 
                                   c.iban and " | IBAN: " + c.iban or "", 
                                   c.swif and " | SWIF: " + c.swif or "", 
                                   c.banco and " (%s)" % c.banco or "")) 
              for c in pclases.CuentaBancariaCliente.select(orderBy = "id")])
     else:
         self.wids['e_codcliente'].set_text(`self.cliente.id`)
         cuentas_cliente = pclases.CuentaBancariaCliente.select(
                 pclases.CuentaBancariaCliente.q.clienteID==self.cliente.id,
                 orderBy = "id")
         utils.rellenar_lista(self.wids['cbe_cuenta_bancaria_cliente'], 
             [(c.id, "%s%s%s%s" % (c.cuenta, 
                                   c.iban and " | IBAN: " + c.iban or "", 
                                   c.swif and " | SWIF: " + c.swif or "", 
                                   c.banco and " (%s)" % c.banco or "")) 
              for c in cuentas_cliente])
         if cuentas_cliente.count():
             utils.combo_set_from_db(
                 self.wids['cbe_cuenta_bancaria_cliente'], 
                 cuentas_cliente[-1].id)
             self.objeto.cuentaBancariaCliente = cuentas_cliente[-1]
             self.objeto.syncUpdate()
         if self.objeto.nombreLibrado == "":
             self.objeto.nombreLibrado = self.cliente.nombre
         if self.objeto.direccionLibrado == "":
             self.objeto.direccionLibrado = ", ".join(
                                                 (self.cliente.direccion, 
                                                  self.cliente.cp, 
                                                  self.cliente.ciudad))
Example #19
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-...
     """
     # Inicialmente no se muestra NADA. Sólo se le deja al
     # usuario la opción de buscar o crear nuevo.
     self.activar_widgets(False)
     self.wids["b_actualizar"].set_sensitive(False)
     self.wids["b_guardar"].set_sensitive(False)
     self.wids["b_nuevo"].set_sensitive(True)
     self.wids["b_buscar"].set_sensitive(True)
     utils.combo_set_from_db(self.wids["cb_orden"], self.wids["cb_orden"].get_model()[0][0])
     self.wids["cb_orden"].connect("changed", self.actualizar_botones_anterior_siguiente)
     cols = (
         ("Nombre", "gobject.TYPE_STRING", False, True, True, None),
         ("Banco", "gobject.TYPE_STRING", False, True, False, None),
         ("Swift", "gobject.TYPE_STRING", False, True, False, None),
         ("IBAN", "gobject.TYPE_STRING", False, True, False, None),
         ("Cuenta", "gobject.TYPE_STRING", False, True, False, None),
         ("Nombre banco", "gobject.TYPE_STRING", False, True, False, None),
         ("Observaciones", "gobject.TYPE_STRING", False, True, False, None),
         ("ID", "gobject.TYPE_INT64", False, False, False, None),
     )
     utils.preparar_listview(self.wids["tv_cuentas"], cols)
     cols = (
         ("Tipo", "gobject.TYPE_STRING", False, True, True, None),
         ("ID", "gobject.TYPE_STRING", False, False, False, None),
     )
     utils.preparar_listview(self.wids["tv_tipos_de_materiales"], cols)
     utils.rellenar_lista(
         self.wids["cb_tipo_de_proveedor"],
         [(t.id, t.descripcion) for t in pclases.TipoDeProveedor.select(orderBy="id")],
     )
     utils.rellenar_lista(
         self.wids["cbe_documentodepago"],
         [(d.id, d.documento) for d in pclases.DocumentoDePago.select(orderBy="id")],
     )
Example #20
0
def build_combo_dia_grupo(dia, idgrupo, funcion, turnos, turnoid):
    """
    Construye y devuelve un comboBoxEntry.
    Conecta la señal "changed" a 'funcion'.
    El nombre estará compuesto por el día y el id del grupo separados por «_».
    Los valores de la lista son los de los turnos definidos en la BD (que como
    mínimo deberían ser: Mañana, Tarde, Noche, Recuperación)
    [Los festivos se toman de FestivosGenericos, no se consideran turno].
    [Vacaciones y festivos adicionales se pueden marcar mediante dos checkboxes
    en el lateral derecho]
    'turnos' es una lista de tuplas (id, nombre) de los turnos ordenada por 
    hora de inicio.
    turnoid es el ID del turno que debe aparecer seleccionado o None si no 
    debe tener valor.
    """
    combo = gtk.ComboBoxEntry()
    combo.set_name("%d_%d" % (dia, idgrupo))
    utils.rellenar_lista(combo, turnos)
    combo.set_size_request(100, 19)
    utils.combo_set_from_db(combo, turnoid)
    combo.child.modify_base(gtk.STATE_NORMAL, combo.child.get_colormap().alloc_color(get_color_turno(turnoid)))
    combo.connect('changed', funcion)
    return combo
 def __init__(self, objeto = None, usuario = None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     Ventana.__init__(self, 'consulta_ofertas_estudio.glade', 
                      objeto, self.usuario)
     # Son ofertas de estudio. Quito todo lo de pedidos.
     connections = {'b_salir/clicked': self.salir,
                    'b_buscar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_fecha_inicio/clicked': self.set_inicio,
                    'b_fecha_fin/clicked': self.set_fin, 
                    'b_exportar/clicked': self.exportar, 
                    'notebook1/switch-page': self.cambiar_grafica}
     self.add_connections(connections)
     cols = (('Número',   'gobject.TYPE_STRING', False, True, True, None),#0
             ('Fecha',     'gobject.TYPE_STRING', False, True, False, None),
             ('Cliente',   'gobject.TYPE_STRING', False, True, False, None),
             ('Producto',  'gobject.TYPE_STRING', False, True, False, None),
             ('Cantidad',  'gobject.TYPE_STRING', False, True, False, None),
             ('Precio', 'gobject.TYPE_STRING', False, True, False, None), #5
             ('€/kg',  'gobject.TYPE_STRING', False, True, False, None),
             ('Obra',      'gobject.TYPE_STRING', False, True, False, None),
             ('Comercial', 'gobject.TYPE_STRING', False, True, False, None),
             ('Importe (s/IVA)',   
                           'gobject.TYPE_STRING', False, True, False, None),
             ('PUID', 'gobject.TYPE_STRING', False, False, False, None))
     tv = self.wids['tv_datos']
     utils.preparar_listview(tv, cols)
     tv.connect("row-activated", self.abrir_objeto)
     tv.get_column(4).get_cell_renderers()[0].set_property('xalign', 1) 
     tv.get_column(5).get_cell_renderers()[0].set_property('xalign', 1) 
     tv.get_column(6).get_cell_renderers()[0].set_property('xalign', 1) 
     self.colorear(tv)
     cols = (('Producto', 'gobject.TYPE_STRING', False, True, True, None),
             ('Cantidad Ofertada', 
                          'gobject.TYPE_STRING', False, True, False, None),
             ('PUID',     'gobject.TYPE_STRING', False, False, False, None))
     utils.preparar_treeview(self.wids['tv_producto'], cols)
     getcoltvpro = self.wids['tv_producto'].get_column
     getcoltvpro(1).get_cell_renderers()[0].set_property('xalign', 1) 
     self.wids['tv_producto'].connect("row-activated", self.abrir_objeto)
     cols = (('Cliente', 'gobject.TYPE_STRING', False, True, True, None),
             ('CIF',     'gobject.TYPE_STRING', False, True, False, None),
             ('Importe', 'gobject.TYPE_STRING', False, True, False, None),
             ('Forma de cobro', 
                         'gobject.TYPE_STRING', False, True, False, None),
             ('PUID',    'gobject.TYPE_STRING', False, False, False, None))
     utils.preparar_treeview(self.wids['tv_cliente'], cols)
     cell = self.wids['tv_cliente'].get_column(2).get_cell_renderers()[0]
     cell.set_property('xalign', 1) 
     self.wids['tv_cliente'].connect("row-activated", self.abrir_objeto)
     self.inicio = mx.DateTime.DateTimeFrom(day = 1, 
                                     month = mx.DateTime.localtime().month, 
                                     year = mx.DateTime.localtime().year)
     self.wids['e_fechainicio'].set_text(utils.str_fecha(self.inicio))
     self.fin = time.localtime()
     self.wids['e_fechafin'].set_text(utils.str_fecha(self.fin))
     ### Combo clientes
     opciones = [(c.id, c.nombre) 
                 for c in pclases.Cliente.select(orderBy = "nombre")]
     opciones.insert(0, (-1, "Todos"))
     utils.rellenar_lista(self.wids['cbe_cliente'], opciones)
     utils.combo_set_from_db(self.wids['cbe_cliente'], -1)
     ### Combo comerciales
     comerciales_que_puedo_ver = [c for c 
             in pclases.Comercial.select(pclases.AND(
         pclases.Comercial.q.empleadoID == pclases.Empleado.q.id, 
         pclases.Empleado.q.usuarioID == pclases.Usuario.q.id, 
         pclases.Usuario.q.nivel > self.usuario.nivel))]
     for c in self.usuario.comerciales: # Los que están por debajo de mi 
                         # nivel (0 = máximo, 5 = mínimo) más y myself.
         comerciales_que_puedo_ver.append(c)
     opciones = [(c.id, c.get_nombre_completo()) 
                 for c in pclases.Comercial.select()
                 if c.empleado and c.empleado.activo 
                 and c in comerciales_que_puedo_ver]
     todos_los_comerciales = [c for c in 
             pclases.Comercial.select() if c.empleado.activo]
     opciones.sort(key = lambda c: c[1])
     if len(comerciales_que_puedo_ver) > 1:  # Con el esquema de permisos 
         # actual lo único que puedo hacer es asumir que si puede ver las 
         # ofertas de alguien más que no sea él mismo, entonces es que 
         # tiene permisos "de facto" para ver todas las ofertas.
         opciones.insert(0, (-1, "Todos"))
     utils.rellenar_lista(self.wids['cbe_comercial'], opciones)
     if -1 in [item[0] for item in self.wids['cbe_comercial'].get_model()]:
         utils.combo_set_from_db(self.wids['cbe_comercial'], -1)
     else:
         utils.combo_set_from_db(self.wids['cbe_comercial'], 
                 self.usuario.comerciales 
                     and self.usuario.comerciales[0].id or None)
     cols = (('Comercial', 'gobject.TYPE_STRING', False, True, True, None),
             ('Cliente',   'gobject.TYPE_STRING', False, True, False, None),
             ('Forma de pago', 
                           'gobject.TYPE_STRING', False, True, False, None),
             ('Importe',   'gobject.TYPE_STRING', False, True, False, None),
             ('PUID', 'gobject.TYPE_STRING', False, False, False, None))
     utils.preparar_treeview(self.wids['tv_comercial'], cols)
     tv = self.wids['tv_comercial']
     tv.get_column(3).get_cell_renderers()[0].set_property('xalign', 1) 
     tv.connect("row-activated", self.abrir_objeto)
     cols = (('Provincia', 'gobject.TYPE_STRING', False, True, True, None),
             ('Comercial', 'gobject.TYPE_STRING', False, True, False, None),
             ('Cliente',   'gobject.TYPE_STRING', False, True, False, None),
             ('Forma de pago', 
                           'gobject.TYPE_STRING', False, True, False, None),
             ('Importe',   'gobject.TYPE_STRING', False, True, False, None),
             ('PUID', 'gobject.TYPE_STRING', False, False, False, None))
     utils.preparar_treeview(self.wids['tv_provincia'], cols)
     tv = self.wids['tv_provincia']
     tv.get_column(4).get_cell_renderers()[0].set_property('xalign', 1) 
     tv.connect("row-activated", self.abrir_objeto)
     self.wids['ventana'].set_title("Consulta de ofertas de estudio")
     self.por_oferta = {} # defaultdict(lambda: [])
     self.por_producto = defaultdict(lambda: [])
     self.por_cliente = defaultdict(lambda: [])
     self.por_comercial = defaultdict(lambda: [])
     self.por_provincia = defaultdict(lambda: [])
     gtk.main()
Example #22
0
                widget.set_active(valor)
            except TypeError:
                pass    # valor es None. No toco nada.
        elif isinstance(col, pclases.SODateCol):
            try:
                valor = utils.str_fecha(valor)
            except Exception, e:
                if valor == None:
                    valor = ""  # A veces es válido que sea fecha o nada.
                else:
                    if pclases.DEBUG:
                        print "Excepción %s capturada al convertir %s de fecha a cadena." % (e, valor)
                    raise e
            widget.set_text(valor)
        elif isinstance(col, pclases.SOForeignKey):
            utils.combo_set_from_db(widget, valor)
        else:
            # Lo intento como puedo. A lo mejor faltaría intentarlo también como si fuera un TextView.
            if hasattr(widget, "child"):
                widget.child.set_text(`valor`)
            else:
                widget.set_text(`valor`)

    def ir_a_primero(self, invertir = True):
        """
        Hace activo el primer objeto de la clase si "invertir" es False.
        Si es True (valor por defecto), el activo es el último objeto 
        creado en la tabla.
        """
        anterior = self.objeto
        try:
 def __init__(self, objeto=None, usuario=None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     Ventana.__init__(self, 'consulta_partes_de_visita.glade', objeto,
                      usuario=usuario)
     connections = {'b_salir/clicked': self.salir,
                    'b_buscar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_fecha_inicio/clicked': self.set_fecha,
                    'b_fecha_fin/clicked': self.set_fecha,
                    'b_exportar/clicked': self.exportar,
                    'e_fecha_inicio/focus-out-event': act_fecha,
                    'e_fecha_fin/focus-out-event': act_fecha,
                   }
     self.add_connections(connections)
     # 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'],
             [(0, "Todos los visibles por mí")] + opciones_comerciales)
     cols = (('Comercial | Cliente/Institución', 'gobject.TYPE_STRING',
                 False, True, False, None),
             ('Fecha', 'gobject.TYPE_STRING', False, True, False, None),
             ('Motivo', 'gobject.TYPE_STRING', False, True, False, None),
             ('Observaciones', 'gobject.TYPE_STRING',
                 False, True, False, None),
             ('DBPUID', 'gobject.TYPE_STRING', False, False, False, None))
     utils.preparar_treeview(self.wids['tv_datos'], cols)
     self.wids['tv_datos'].connect("row-activated", self.abrir_objeto)
     self.resultado = []
     self.fin = utils.str_fecha(datetime.date.today())
     self.inicio = None
     self.wids['e_fecha_fin'].set_text(self.fin)
     self.wids['e_fecha_inicio'].set_text("")
     if objeto != None:
         utils.combo_set_from_db(self.wids["cb_comercial"], objeto.id)
         self.wids["b_buscar"].clicked()
     else:
         utils.combo_set_from_db(self.wids['cb_comercial'], 0)
     self.wids['cb_comercial'].grab_focus()
     gtk.main()
 def __init__(self, objeto = None, usuario = None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     Ventana.__init__(self, 'consulta_ofertas_pendientes_validar.glade', 
                      objeto, self.usuario)
     connections = {'b_salir/clicked': self.salir,
                    'b_buscar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_fecha_inicio/clicked': self.set_inicio,
                    'b_fecha_fin/clicked': self.set_fin, 
                    'b_exportar/clicked': self.exportar} 
     self.add_connections(connections)
     cols = (('Número',   'gobject.TYPE_STRING', False, True, True, None),#0
             ('Fecha',     'gobject.TYPE_STRING', False, True, False, None),
             ('Cliente',   'gobject.TYPE_STRING', False, True, False, None),
             ('Obra',      'gobject.TYPE_STRING', False, True, False, None),
             ('Comercial', 'gobject.TYPE_STRING', False, True, False, None),
             #('Tipo',      'gobject.TYPE_STRING', False, True, False, None),
             # CWT: Solo ofertas de pedido. Nada de estudio.
             ('Estado',  'gobject.TYPE_STRING', False, True, False, None),#5
             ('Denegada', 'gobject.TYPE_BOOLEAN', False, True, False, None),
             ('Motivo', 'gobject.TYPE_STRING', False, True, False, None), 
             ('Importe (c/IVA)',   
                           'gobject.TYPE_STRING', False, True, False, None),
             ('Forma de pago', 
                           'gobject.TYPE_STRING', False, True, False, None),
             ('PUID', 'gobject.TYPE_STRING', False, False, False, None)) #10
     tv = self.wids['tv_datos']
     utils.preparar_listview(tv, cols)
     tv.connect("row-activated", self.abrir_objeto)
     tv.get_column(6).get_cell_renderers()[0].set_property('xalign', 0.5) 
     tv.get_column(8).get_cell_renderers()[0].set_property('xalign', 1) 
     self.colorear(tv)
     self.inicio = None
     self.wids['e_fechainicio'].set_text("")
     self.fin = time.localtime()
     self.wids['e_fechafin'].set_text(utils.str_fecha(self.fin))
     ### Combo clientes
     opciones = [(c.id, c.nombre) 
                 for c in pclases.Cliente.select(orderBy = "nombre")]
     opciones.insert(0, (-1, "Todos"))
     utils.rellenar_lista(self.wids['cbe_cliente'], opciones)
     utils.combo_set_from_db(self.wids['cbe_cliente'], -1)
     ### Combo comerciales
     comerciales_que_puedo_ver = [c for c 
             in pclases.Comercial.select(pclases.AND(
         pclases.Comercial.q.empleadoID == pclases.Empleado.q.id, 
         pclases.Empleado.q.usuarioID == pclases.Usuario.q.id, 
         pclases.Usuario.q.nivel > self.usuario.nivel))]
     for c in self.usuario.comerciales: # Los que están por debajo de mi 
                         # nivel (0 = máximo, 5 = mínimo) más y myself.
         comerciales_que_puedo_ver.append(c)
     opciones = [(c.id, c.get_nombre_completo()) 
                 for c in pclases.Comercial.select()
                 if c.empleado and c.empleado.activo 
                 and c in comerciales_que_puedo_ver]
     todos_los_comerciales = [c for c in 
             pclases.Comercial.select() if c.empleado.activo]
     opciones.sort(key = lambda c: c[1])
     if len(comerciales_que_puedo_ver) > 1:  # Con el esquema de permisos 
         # actual lo único que puedo hacer es asumir que si puede ver las 
         # ofertas de alguien más que no sea él mismo, entonces es que 
         # tiene permisos "de facto" para ver todas las ofertas.
         opciones.insert(0, (-1, "Todos"))
     utils.rellenar_lista(self.wids['cbe_comercial'], opciones)
     if -1 in [item[0] for item in self.wids['cbe_comercial'].get_model()]:
         utils.combo_set_from_db(self.wids['cbe_comercial'], -1)
     else:
         utils.combo_set_from_db(self.wids['cbe_comercial'], 
                 self.usuario.comerciales 
                     and self.usuario.comerciales[0].id or None)
     self.wids['ventana'].set_title(
             "Consulta de ofertas pendientes de validar")
     self.por_oferta = {} # defaultdict(lambda: [])
     gtk.main()
Example #25
0
 def rellenar_widgets(self):
     """
     Introduce la información del empleado actual
     en los widgets.
     No se chequea que sea != None, así que
     hay que tener cuidado de no llamar a
     esta función en ese caso.
     """
     empleado = self.objeto
     if empleado != None:
         self.wids['e_centro'].set_text(
             empleado.centroTrabajo and empleado.centroTrabajo.nombre or '')
         categoriaLaboral = empleado.get_categoriaLaboral_vigente()
         # TODO: Vigente... vigente hoy. ¿Pero qué pasa si cambio de año?
         # ¿Y si hay cambios de días de convenio durante el mismo año?
         # De momento lo dejo así, porque la lógica me dice que no se
         # viaja en el tiempo para pedir días de años anteriores.
         self.wids['e_dias_convenio'].set_text(categoriaLaboral
             and "%d" % (categoriaLaboral.diasConvenio) or '')
         self.wids['e_dias_asuntos_propios'].set_text(categoriaLaboral
             and "%d" % (categoriaLaboral.diasAsuntosPropios) or '')
         anno = self.wids['sp_anno'].get_value()
         diasConvenioRestantes = empleado.get_diasConvenioRestantes(anno)
         self.wids['e_dc_restantes'].set_text('%d' % diasConvenioRestantes)
         if diasConvenioRestantes > 0:
             self.wids['e_dc_restantes'].modify_base(gtk.STATE_NORMAL,
                 self.wids['e_dc_restantes'].get_colormap().alloc_color(
                     "white"))
         elif diasConvenioRestantes == 0:
             self.wids['e_dc_restantes'].modify_base(gtk.STATE_NORMAL,
                 self.wids['e_dc_restantes'].get_colormap().alloc_color(
                     "orange"))
         else:
             self.wids['e_dc_restantes'].modify_base(gtk.STATE_NORMAL,
                 self.wids['e_dc_restantes'].get_colormap().alloc_color(
                     "red"))
         diasAsuntosPropiosRestantes = empleado.get_diasAsuntosPropiosRestantes(anno)
         self.wids['e_dap_restantes'].set_text(
                 '%d' % diasAsuntosPropiosRestantes)
         if diasAsuntosPropiosRestantes > 0:
             self.wids['e_dap_restantes'].modify_base(gtk.STATE_NORMAL,
                 self.wids['e_dap_restantes'].get_colormap().alloc_color(
                     "white"))
         elif diasAsuntosPropiosRestantes == 0:
             self.wids['e_dap_restantes'].modify_base(gtk.STATE_NORMAL,
                 self.wids['e_dap_restantes'].get_colormap().alloc_color(
                     "orange"))
         else:
             self.wids['e_dap_restantes'].modify_base(gtk.STATE_NORMAL,
                 self.wids['e_dap_restantes'].get_colormap().alloc_color(
                     "red"))
         try:
             utils.combo_set_from_db(self.wids['cbe_empleado'], empleado.id)
             # No sé qué pasa con el model cuando se abre la ventana
             # en un objeto determinado pero casca diciendo que es
             # None. Lo ignoro y punto. En siguientes llamadas a
             # rellenar_widgets ya no peta.
         except:
             pass
         self.objeto = empleado
         self.objeto.make_swap()
     else:
         utils.combo_set_from_db(-1)
         self.wids['e_centro'].set_text('')
         self.wids['e_dias_convenio'].set_text('')
         self.wids['e_dias_asuntos_propios'].set_text('')
         self.wids['e_dc_restantes'].set_text('')
         self.wids['e_dap_restantes'].set_text('')
     self.rellenar_ausencias(empleado)
     self.rellenar_bajas(empleado)
Example #26
0
    def __init__(self, objeto=None, usuario=None):
        """
        Constructor. objeto puede ser un objeto de pclases con el que
        comenzar la ventana (en lugar del primero de la tabla, que es
        el que se muestra por defecto).
        """
        self.usuario = usuario
        Ventana.__init__(self, "busca_partida.glade", objeto, usuario=usuario)
        connections = {"b_salir/clicked": self.salir, "b_buscar/clicked": self.buscar, "b_ayuda/clicked": self.ayuda}
        self.add_connections(connections)
        cols = (
            ("Num. Partida", "gobject.TYPE_INT64", False, True, False, None),
            ("Código", "gobject.TYPE_STRING", False, True, False, None),
            ("Longitudinal", "gobject.TYPE_STRING", False, True, False, None),
            ("Transversal", "gobject.TYPE_STRING", False, True, False, None),
            ("Compresión", "gobject.TYPE_STRING", False, True, False, None),
            ("Perforación", "gobject.TYPE_STRING", False, True, False, None),
            ("Permeabilidad", "gobject.TYPE_STRING", False, True, False, None),
            ("Poros", "gobject.TYPE_STRING", False, True, False, None),
            ("Espesor", "gobject.TYPE_STRING", False, True, False, None),
            ("Piramidal", "gobject.TYPE_STRING", False, True, False, None),
            ("Idpartida", "gobject.TYPE_INT64", False, False, False, None),
        )
        utils.preparar_listview(self.wids["tv_resultado"], cols)
        combos = (
            "cmb_longitudinal",
            "cmb_transversal",
            "cmb_compresion",
            "cmb_perforacion",
            "cmb_permeabilidad",
            "cmb_poros",
            "cmb_piramidal",
            "cmb_espesor",
        )
        for c in combos:
            utils.rellenar_lista(self.wids[c], enumerate(("<", "<=", "=", ">=", ">", "<>")))
            # [(0, '<'), (1, '='), (2, '>')])
            utils.combo_set_from_db(self.wids[c], 2)

        utils.rellenar_lista(
            self.wids["cmbe_producto"],
            [
                (p.id, p.descripcion)
                for p in pclases.ProductoVenta.select(
                    pclases.ProductoVenta.q.camposEspecificosRolloID != None, orderBy="descripcion"
                )
            ],
        )
        self.rellenar_tabla()
        # Valores por defecto:
        self.wids["e_longitudinal"].set_text("0")
        self.wids["e_transversal"].set_text("0")
        self.wids["e_compresion"].set_text("0")
        self.wids["e_perforacion"].set_text("0")
        self.wids["e_permeabilidad"].set_text("0")
        self.wids["e_poros"].set_text("0")
        self.wids["e_piramidal"].set_text("0")
        self.wids["e_espesor"].set_text("0")
        self.wids["chk_longitudinal"].set_active(True)
        self.wids["chk_transversal"].set_active(True)
        self.wids["chk_compresion"].set_active(True)
        self.wids["chk_perforacion"].set_active(True)
        self.wids["chk_permeabilidad"].set_active(True)
        self.wids["chk_poros"].set_active(True)
        self.wids["chk_piramidal"].set_active(False)
        self.wids["chk_espesor"].set_active(True)
        self.wids["chk_producto"].set_active(True)
        gtk.main()
Example #27
0
 def __init__(self, objeto = None, usuario = None):
     """
     Constructor. objeto puede ser un objeto de pclases con el que
     comenzar la ventana (en lugar del primero de la tabla, que es
     el que se muestra por defecto).
     """
     self.usuario = usuario
     global fin
     Ventana.__init__(self, 'consulta_control_horas.glade', objeto, usuario)
     connections = {'b_salir/clicked': self.salir,
                    'b_buscar/clicked': self.buscar,
                    'b_imprimir/clicked': self.imprimir,
                    'b_fecha_inicio/clicked': self.set_inicio,
                    'b_fecha_fin/clicked': self.set_fin, 
                    "b_exportar/clicked": self.exportar}
     self.add_connections(connections)
     cols = (('Fecha', 'gobject.TYPE_STRING', False, True, True, None),
             ('Horas regulares día', 'gobject.TYPE_STRING', 
                 False, True, False, None),
             ('Horas regulares noche', 'gobject.TYPE_STRING', 
                 False, True, False, None), 
             ('Horas extras día', 'gobject.TYPE_STRING', 
                 False, True, False, None), 
             ('Horas extras noche', 'gobject.TYPE_STRING', 
                 False, True, False, None), 
             ('ID', 'gobject.TYPE_STRING', False, False, False, None))
     utils.preparar_treeview(self.wids['tv_datos'], cols)
     for col in range(1, 5):
         columna = self.wids['tv_datos'].get_column(col)
         for cell in columna.get_cell_renderers():
             cell.set_property("xalign", 1)
     # Cuatro columnas ocultas para colorear:
     tipos = [c[1] for c in cols]
     tipos.insert(-1, "gobject.TYPE_BOOLEAN") # Baja
     tipos.insert(-1, "gobject.TYPE_BOOLEAN") # Vacaciones y asuntos prop.
     tipos.insert(-1, "gobject.TYPE_BOOLEAN") # Festivo
     tipos.insert(-1, "gobject.TYPE_BOOLEAN") # Bloqueado
     tipos = [eval(t) for t in tipos]
     new_model = gtk.TreeStore(*tipos)
     new_model.set_sort_func(0, utils.funcion_orden, 0)
     self.wids['tv_datos'].set_model(new_model)
     # ListViews de totales:
     conceptos = ("Tipo de hora", "Hora del día", "Actividad desarrollada", 
                  "Centro de trabajo")
     for c, nombretabla in zip(conceptos, 
         ("tv_tipo", "tv_hora", "tv_actividad", "tv_centro")):
         cols = ((c, "gobject.TYPE_STRING", False, True, True, False),
                 ("Horas totales", "gobject.TYPE_STRING", 
                     False, True, False, None), 
                 ("", "gobject.TYPE_STRING", False, False, False, None))
         if nombretabla == "tv_centro":
             utils.preparar_treeview(self.wids[nombretabla], cols)
         else:
             utils.preparar_listview(self.wids[nombretabla], cols)
         columna = self.wids[nombretabla].get_column(1)
         for cell in columna.get_cell_renderers():
             cell.set_property("xalign", 1)
     # Fechas iniciales de la ventana:
     temp = time.localtime()  # @UnusedVariable
     self.inicio = mx.DateTime.localtime() - (7*mx.DateTime.oneDay)
     self.fin = mx.DateTime.localtime()
     self.wids['e_fechafin'].set_text(utils.str_fecha(self.fin))
     self.wids['e_fechainicio'].set_text(utils.str_fecha(self.inicio))
     empleados = [(0, "Todos")]
     empleados += [(e.id, "%s, %s" % (e.apellidos, e.nombre)) 
                   for e in pclases.Empleado.select(pclases.AND(
                         pclases.Empleado.q.planta == True, 
                         pclases.Empleado.q.activo == True),
                     orderBy = "apellidos")]
     utils.rellenar_lista(self.wids['cbe_empleado'], empleados)
     utils.combo_set_from_db(self.wids['cbe_empleado'], 0)
     self.colorear()
     self.wids['tv_datos'].connect("row-activated", self.abrir_fila)
     gtk.main()
Example #28
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)
 def rellenar_widgets(self):
     """
     Introduce la información del producto actual
     en los widgets.
     No se chequea que sea != None, así que
     hay que tener cuidado de no llamar a
     esta función en ese caso.
     """
     self.wids['b_guardar'].set_sensitive(False)
     producto = self.objeto
     linea = pclases.LineaDeProduccion.select(
         pclases.LineaDeProduccion.q.nombre.contains('fibra'))[0]
     lineaembol = pclases.LineaDeProduccion.select(
         pclases.LineaDeProduccion.q.nombre.contains('bolsa'))[0]
     productos = pclases.ProductoVenta.select(pclases.AND(
         pclases.ProductoVenta.q.camposEspecificosBalaID != None,
         pclases.OR(
             pclases.ProductoVenta.q.lineaDeProduccionID == linea.id,
             pclases.ProductoVenta.q.lineaDeProduccionID == lineaembol.id
         )), orderBy = 'id')
     productos_count = productos.count()
     yo_index = pclases.SQLlist(productos).index(producto) + 1
     self.wids['ventana'].set_title(
         "Productos de venta: FIBRA - %s (%d de %d)" % (
             producto.descripcion,
             yo_index,
             productos_count))
     if len(producto.articulos) > 0:
         self.wids['ch_reciclada'].set_sensitive(False)
         # Una vez se ha fabricado algo no puedo dejar que cambie la fibra a reciclada y viceversa, puesto que entonces me
         # alteraría el cálculo de stock, la forma de dar de alta más balas, etiquetas etc...
     self.wids['i_barcode'].set_from_file(EanBarCode().getImage(producto.codigo))
     self.wids['e_codigo'].set_text(producto.codigo)
     self.wids['e_descripcion'].set_text(producto.descripcion)
     self.wids['e_nombre'].set_text(producto.nombre)
     self.wids['e_precio'].set_text(str(producto.preciopordefecto))
     self.wids['e_minimo'].set_text(str(producto.minimo))
     self.wids['e_arancel'].set_text(str(producto.arancel))
     self.wids['e_prodestandar'].set_text(utils.float2str(producto.prodestandar))
     campos = producto.camposEspecificosBala
     self.wids['ch_reciclada'].set_active(campos.reciclada)
     self.wids['e_dtex'].set_text(str(campos.dtex))
     self.wids['e_corte'].set_text(str(campos.corte))
     self.wids['e_color'].set_text(str(campos.color))
     self.wids['chk_antiuv'].set_active(campos.antiuv)
     utils.combo_set_from_db(self.wids['cb_material'],
                             campos.tipoMaterialBalaID)
     # Campos para bolsas de fibra de cemento:
     if campos.gramosBolsa != None:
         self.wids['e_gramosBolsa'].set_text(str(campos.gramosBolsa))
     else:
         self.wids['e_gramosBolsa'].set_text("N/A")
     if campos.bolsasCaja != None:
         self.wids['e_bolsasCaja'].set_text(str(campos.bolsasCaja))
     else:
         self.wids['e_bolsasCaja'].set_text("N/A")
     if campos.cajasPale != None:
         self.wids['e_cajasPale'].set_text(str(campos.cajasPale))
     else:
         self.wids['e_cajasPale'].set_text("N/A")
     # Datos no modificables:
     self.wids['e_idproducto'].set_text(`producto.id`)
     self.muestra_stock()
     # self.wids['e_stock'].set_text('Pulsar botón "Contar stock"')
     self.mostrar_especificos()
     self.rellenar_tabla_tarifas()
     self.wids['e_cajasPale'].set_sensitive(not self.objeto.articulos)
     try:
         cliente = campos.cliente.id
     except AttributeError:
         cliente = 0
     utils.combo_set_from_db(self.wids['cbe_cliente'], cliente)
     # Nuevos campos de etiquetas norma13:
     if self.objeto.annoCertificacion is None:
         self.wids['sp_anno_certificacion'].set_text("")
         self.wids['ch_no_anno_cert'].set_active(True)
     else:
         self.wids['sp_anno_certificacion'].set_value(
                 self.objeto.annoCertificacion)
         utils.show_leading_zeros(self.wids['sp_anno_certificacion'])
         self.wids['ch_no_anno_cert'].set_active(False)
     self.wids['e_dni'].set_text(producto.dni)
     self.wids['e_uso'].set_text(producto.uso)
     try:
         self.wids['ch_obsoleto'].set_active(self.objeto.obsoleto)
     except (KeyError, AttributeError):
         pass    # Versión antigua de la base de datos.
     ### Botones anterior/siguiente
     producto = self.objeto
     try:
         linea = pclases.LineaDeProduccion.select(
             pclases.LineaDeProduccion.q.nombre.contains('fibra'))[0]
         lineaembol = pclases.LineaDeProduccion.select(
             pclases.LineaDeProduccion.q.nombre.contains('bolsa'))[0]
         anteriores = pclases.ProductoVenta.select(pclases.AND(
             pclases.ProductoVenta.q.camposEspecificosBalaID != None,
             pclases.OR(
               pclases.ProductoVenta.q.lineaDeProduccionID == linea.id,
               pclases.ProductoVenta.q.lineaDeProduccionID == lineaembol.id
             ),
             pclases.ProductoVenta.q.id < producto.id)).count()
         siguientes = pclases.ProductoVenta.select(pclases.AND(
             pclases.ProductoVenta.q.camposEspecificosBalaID != None,
             pclases.OR(
               pclases.ProductoVenta.q.lineaDeProduccionID == linea.id,
               pclases.ProductoVenta.q.lineaDeProduccionID == lineaembol.id
             ),
             pclases.ProductoVenta.q.id > producto.id)).count()
     except:
         pass
     else:
         self.wids['b_anterior'].set_sensitive(anteriores)
         self.wids['b_siguiente'].set_sensitive(siguientes)
     self.wids['b_guardar'].set_sensitive(False)
     self.objeto.make_swap()
 def iter_cliente_seleccionado(completion, model, itr):
     idcliente = model[itr][0]
     utils.combo_set_from_db(self.wids['cbe_cliente'], idcliente)