class ABM(VistaBase): #diccionario que guarda los controles que se agreguen al abm controles = {} #modelo sobre el que se hace el abm model = None #indica si es un alta o una modificacion tipo = "A" #campos a mostrar en la grilla camposAMostrar = None #condicion para filtrar la tabla condicion = None #limite de registros limite = 100 #orden de busqueda ordenBusqueda = None #campo campoClave = None #campo clave autoincremental autoincremental = True #campo para el foco campoFoco = None def __init__(self, *args, **kwargs): VistaBase.__init__(self, *args, **kwargs) self.controles = {} self.initUi() @inicializar_y_capturar_excepciones def initUi(self, *args, **kwargs): self.resize(906, 584) nombre_tabla = self.model._meta.table_name.title() if self.model else '' self.setWindowTitle("ABM de {}".format(nombre_tabla)) self.verticalLayout = QVBoxLayout(self) self.lblTitulo = Etiqueta(tamanio=15, texto="ABM de {}".format(nombre_tabla)) self.verticalLayout.addWidget(self.lblTitulo) self.tabWidget = QTabWidget() self.tabLista = QWidget() self.gridLayout = QGridLayout(self.tabLista) self.lineEditBusqueda = EntradaTexto(self.tabLista, placeholderText="Busqueda") self.lineEditBusqueda.setObjectName("lineEditBusqueda") self.gridLayout.addWidget(self.lineEditBusqueda, 0, 0, 1, 1) self.tableView = Grilla(self.tabLista) self.tableView.setObjectName("tableView") self.tableView.enabled = True # extraigo los nombres de las columnas self.tableView.cabeceras = [x.column_name.capitalize() for x in self.camposAMostrar] self.tableView.ArmaCabeceras() self.gridLayout.addWidget(self.tableView, 1, 0, 1, 1) self.horizontalLayout = QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.BotonesAdicionales() self.btnAgregar = Boton(self.tabLista, imagen="imagenes/nuevo.png", tamanio=QSize(32,32), tooltip='Agrega nuevo registro') self.btnAgregar.setObjectName("btnAgregar") self.horizontalLayout.addWidget(self.btnAgregar) self.btnEditar = Boton(self.tabLista, imagen="imagenes/modificar.png", tamanio=QSize(32,32), tooltip='Modifica registro') self.btnEditar.setObjectName("btnEditar") self.horizontalLayout.addWidget(self.btnEditar) self.btnBorrar = Boton(self.tabLista, imagen="imagenes/delete.png", tamanio=QSize(32,32), tooltip='Borrar registro') self.btnBorrar.setObjectName("btnBorrar") self.horizontalLayout.addWidget(self.btnBorrar) self.btnCerrar = Boton(self.tabLista, imagen="imagenes/log-out.png", tamanio=QSize(32,32), tooltip='Cerrar ABM') self.btnCerrar.setObjectName("btnCerrar") self.horizontalLayout.addWidget(self.btnCerrar) self.gridLayout.addLayout(self.horizontalLayout, 2, 0, 1, 1) self.tabWidget.addTab(self.tabLista, "Lista") self.tabDetalle = QWidget() self.tabWidget.addTab(self.tabDetalle, "Detalle") self.tabDetalle.setEnabled(False) self.verticalLayout.addWidget(self.tabWidget) self.ArmaDatos() self.ArmaTabla() self.ConectaWidgets() def BotonesAdicionales(self): pass def ArmaTabla(self): self.tableView.setRowCount(0) if not self.model: #si no esta establecido el modelo no hago nada return data = self.model.select().dicts() if self.condicion: for c in self.condicion: data = data.where(c) if self.lineEditBusqueda.text(): if self.ordenBusqueda: data = data.where(self.ordenBusqueda.contains(self.lineEditBusqueda.text())) else: Ventanas.showAlert("Sistema", "Orden no establecido y no se puede realizar la busqueda") data = data.limit(self.limite) for d in data: if self.camposAMostrar: item = [d[x.column_name] for x in self.camposAMostrar] else: item = [d[x] for x in d] self.tableView.AgregaItem(item) def ArmaDatos(self): self.verticalLayoutDatos = QVBoxLayout(self.tabDetalle) self.verticalLayoutDatos.setObjectName("verticalLayoutDatos") self.ArmaCarga() fila = 0 self.grdBotones = QGridLayout() self.grdBotones.setObjectName("grdBotones") self.btnAceptar = Boton(self.tabDetalle, imagen="imagenes/guardar.png", tamanio=QSize(32,32)) self.btnAceptar.setObjectName("btnAceptar") self.grdBotones.addWidget(self.btnAceptar, 0, 0, 1, 1) self.btnCancelar = Boton(self.tabDetalle, imagen="imagenes/log-out.png", tamanio=QSize(32,32)) self.btnCancelar.setObjectName("btnCancelar") self.grdBotones.addWidget(self.btnCancelar, 0, 1, 1, 1) self.verticalLayoutDatos.addLayout(self.grdBotones) self.verticalLayout.addWidget(self.tabWidget) self.btnCancelar.clicked.connect(self.btnCancelarClicked) self.btnAceptar.clicked.connect(self.btnAceptarClicked) self.verticalLayoutDatos.addStretch(1) def Busqueda(self): self.ArmaTabla() def ConectaWidgets(self): self.lineEditBusqueda.textChanged.connect(self.Busqueda) self.btnCerrar.clicked.connect(self.cerrarformulario) self.btnBorrar.clicked.connect(self.Borrar) self.btnEditar.clicked.connect(self.Modifica) self.btnAgregar.clicked.connect(self.Agrega) @inicializar_y_capturar_excepciones def Borrar(self, *args, **kwargs): if not self.tableView.currentRow() != -1: return if not self.campoClave: Ventanas.showAlert("Sistema", "No tenes establecido el campo clave y no podemos continuar") id = self.tableView.ObtenerItem(fila=self.tableView.currentRow(), col=self.campoClave.column_name.capitalize()) data = self.model.get_by_id(id) data.delete_instance() self.ArmaTabla() def Modifica(self): self.tipo = 'M' if not self.tableView.currentRow() != -1: return if not self.campoClave: Ventanas.showAlert("Sistema", "No tenes establecido el campo clave y no podemos continuar") id = self.tableView.ObtenerItem(fila=self.tableView.currentRow(), col=self.campoClave.column_name.capitalize()) print(self.tableView.currentRow(), id) data = self.model.select().where(self.campoClave == int(id)).dicts() self.tabDetalle.setEnabled(True) self.tabWidget.setCurrentIndex(1) self.CargaDatos(data) if self.campoFoco: self.campoFoco.setFocus() def CargaDatos(self, data=None): # self.tipo = 'A' if not data: return for d in data: print(d) for k in d: if k in self.controles: if k == self.campoClave.column_name: self.controles[k].setEnabled(False) if isinstance(self.controles[k], QLineEdit): if isinstance(d[k], (int, decimal.Decimal)): self.controles[k].setText(str(d[k])) else: self.controles[k].setText(d[k]) elif isinstance(self.controles[k], Spinner): self.controles[k].setText(d[k]) elif isinstance(self.controles[k], (QCheckBox, CheckBox)): if EsVerdadero(d[k]) or d[k]: self.controles[k].setChecked(True) else: self.controles[k].setChecked(False) elif isinstance(self.controles[k], QComboBox): if isinstance(d[k], (bytes,)): if EsVerdadero(self.cursor[k]): self.controles[k].setCurrentIndex(self.controles[k].findData('Si')) else: self.controles[k].setCurrentIndex(self.controles[k].findData('No')) else: self.controles[k].setCurrentIndex(self.controles[k].findData(d[k])) self.controles[k].setStyleSheet("background-color: white") def ArmaEntrada(self, nombre="", boxlayout=None, texto='', *args, **kwargs): if not boxlayout: boxlayout = QHBoxLayout() lAgrega = True else: lAgrega = False if not texto: texto = nombre.capitalize() labelNombre = Etiqueta(texto=texto) labelNombre.setObjectName("labelNombre") boxlayout.addWidget(labelNombre) if 'control' in kwargs: lineEditNombre = kwargs['control'] else: lineEditNombre = EntradaTexto() if 'relleno' in kwargs: lineEditNombre.relleno = kwargs['relleno'] if 'inputmask' in kwargs: lineEditNombre.setInputMask(kwargs['inputmask']) #print(type(lineEditNombre)) lineEditNombre.setObjectName(nombre) boxlayout.addWidget(lineEditNombre) if 'enabled' in kwargs: lineEditNombre.setEnabled(kwargs['enabled']) self.controles[nombre] = lineEditNombre if lAgrega: self.verticalLayoutDatos.addLayout(boxlayout) return boxlayout def btnCancelarClicked(self): self.tabWidget.setCurrentIndex(0) self.tabDetalle.setEnabled(False) @inicializar_y_capturar_excepciones def btnAceptarClicked(self, *args, **kwargs): # data = self.model.get_by_id(self.controles[self.campoClave.column_name].text()) # data.nombre = self.controles['nombre'].text() self.ArmaTabla() self.btnCancelarClicked() def ArmaCarga(self): pass def Agrega(self): self.tipo = 'A' for x in self.controles: if self.autoincremental: if x == self.campoClave.column_name: self.controles[x].setEnabled(False) self.controles[x].setText('') self.controles[x].setStyleSheet("background-color: white") self.tabDetalle.setEnabled(True) self.tabWidget.setCurrentIndex(1) if self.campoFoco: self.campoFoco.setFocus()
class ClientesView(ABM): model = Cliente() camposAMostrar = [Cliente.idcliente, Cliente.nombre] ordenBusqueda = Cliente.nombre campoClave = Cliente.idcliente def __init__(self, *args, **kwargs): ABM.__init__(self, *args, **kwargs) @inicializar_y_capturar_excepciones def ArmaCarga(self, *args, **kwargs): self.layoutID = self.ArmaEntrada('idcliente', texto='Codigo') self.ArmaEntrada('nombre', boxlayout=self.layoutID) self.layoutDomi = self.ArmaEntrada('domicilio') self.ArmaEntrada('telefono', boxlayout=self.layoutDomi) self.layoutLocalidad = self.ArmaEntrada(nombre='localidad', control=Localidades.Valida()) self.lblNombreLocalidad = Etiqueta() self.layoutLocalidad.addWidget(self.lblNombreLocalidad) self.controles['localidad'].widgetNombre = self.lblNombreLocalidad self.layoutDocumento = self.ArmaEntrada(nombre='tipodocu', control=Tipodoc.ComboTipoDoc(), texto="Tipo de docuemnto") self.lblNombreTipodoc = Etiqueta() self.layoutDocumento.addWidget(self.lblNombreTipodoc) self.controles['tipodocu'].widgetNombre = self.lblNombreTipodoc self.ArmaEntrada(nombre='dni', boxlayout=self.layoutDocumento) self.ArmaEntrada(nombre='cuit', boxlayout=self.layoutDocumento) self.layoutImpuesto = self.ArmaEntrada( nombre='percepcion', control=Impuestos.ComboImpuesto(), texto="Tipo de impuesto") self.lblNombreImpuesto = Etiqueta() self.layoutImpuesto.addWidget(self.lblNombreImpuesto) self.controles['percepcion'].widgetNombre = self.lblNombreImpuesto self.campoFoco = self.controles['nombre'] self.ArmaEntrada(nombre='tiporesp', boxlayout=self.layoutImpuesto, control=Tiporesp.Combo(), texto="Responsabilidad frente al iva") self.lblNombreTiporesp = Etiqueta() self.layoutDocumento.addWidget(self.lblNombreTiporesp) self.controles['tiporesp'].widgetNombre = self.lblNombreTiporesp @inicializar_y_capturar_excepciones def btnAceptarClicked(self, *args, **kwargs): if self.tipo == 'M': cliente = Cliente.get_by_id( self.controles[Cliente.idcliente.column_name].text()) cliente.idcliente = self.controles['idcliente'].text() else: if self.controles['dni'].text() != '0': doc = Cliente.select().where( Cliente.dni == self.controles['dni'].text()) else: doc = Cliente.select().where( Cliente.cuit == self.controles['cuit'].text() or '0') if doc.count() > 0: Ventanas.showAlert( "Sistema", "Cliente con el numero documento de documento cargado, ya dado de alta" ) return cliente = Cliente() cliente.nombre = self.controles['nombre'].text() cliente.telefono = self.controles['telefono'].text() cliente.localidad = self.controles['localidad'].text() or 1 cliente.domicilio = self.controles['domicilio'].text() cliente.tipodocu = self.controles['tipodocu'].text() or 0 cliente.dni = self.controles['dni'].text( ) if self.controles['dni'].text() else '0' cliente.cuit = self.controles['cuit'].text() if str( self.controles['cuit'].text()).replace('-', '') else '0' cliente.tiporesp = self.controles['tiporesp'].text() or 3 cliente.formapago = '1' cliente.percepcion = self.controles['percepcion'].text() or 1 #if self.tipo == 'M': #actualizacion cliente.save() ABM.btnAceptarClicked(self) def BotonesAdicionales(self): self.btnEmail = Boton(self.tabLista, texto="Email Cliente", imagen=imagen("email.png"), tamanio=QSize(32, 32), tooltip='Agrega email del cliente') self.btnEmail.setObjectName("btnEmail") self.horizontalLayout.addWidget(self.btnEmail)