class FrmArticlesNew( QDialog, Ui_frmArticlesNew ): ''' classdocs ''' def __init__( self, parent = None ): ''' Constructor ''' super( FrmArticlesNew, self ).__init__( parent ) self.user = user.LoggedUser self.setupUi( self ) self.catmodel = CategoriesModel() self.catproxymodel = TreeFilterProxyModel() self.catproxymodel.setSourceModel( self.catmodel ) self.catproxymodel.setFilterKeyColumn( 0 ) self.catproxymodel.setFilterCaseSensitivity( Qt.CaseInsensitive ) self.catvalid = False self.cat_id = 0 self.brand_id = 0 self.isc = Decimal( 0 ) self.dai = Decimal( 0 ) self.comission = Decimal( 0 ) self.profit = Decimal( 0 ) self.categoriesview.setModel( self.catproxymodel ) self.categoriesview.setColumnHidden( 1, True ) self.categoriesview.resizeColumnToContents( 0 ) self.brandsmodel = QSqlQueryModel() self.cargarMarcas() self.brandsproxymodel = QSortFilterProxyModel() self.brandsproxymodel.setSourceModel( self.brandsmodel ) self.brandsproxymodel.setFilterKeyColumn( 1 ) self.brandsproxymodel.setFilterCaseSensitivity( Qt.CaseInsensitive ) self.brandsview.setModel( self.brandsproxymodel ) self.brandsview.setModelColumn( 1 ) self.buttonBox.rejected.connect( self.reject ) self.categoriesview.selectionModel().selectionChanged[QItemSelection, QItemSelection].connect( self.update_category ) self.brandsview.selectionModel().selectionChanged[QItemSelection, QItemSelection].connect( self.updateBrand ) def cargarMarcas( self ): if not QSqlDatabase.database().isOpen(): if not QSqlDatabase.database().open(): raise Exception( "No se pudo abrir la base de datos" ) self.brandsmodel.setQuery( """ SELECT idmarca, nombre FROM marcas """ ) if QSqlDatabase.database().isOpen(): QSqlDatabase.database().close() @pyqtSlot() def on_buttonBox_accepted( self ): if self.valid: if QMessageBox.question( self, qApp.organizationName(), u"¿Esta seguro que desea añadir el producto?", QMessageBox.Ok | QMessageBox.Cancel ) == QMessageBox.Ok: if not self.save(): QMessageBox.critical( self, qApp.organizationName(), u"Lo sentimos pero no se ha"\ + " podido guardar el articulo" ) else: super( FrmArticlesNew, self ).accept() else: QMessageBox.warning( self, qApp.organizationName(), u"Lo sentimos pero los datos no son"\ + " validos, recuerde elegir una subcategoria"\ + " y una marca" ) def save( self ): """ Guardar el nuevo articulo en la base de datos """ query = QSqlQuery() result = False try: if not QSqlDatabase.database().isOpen(): if not QSqlDatabase.open(): raise UserWarning( u"No se pudo conectar con la"\ + " base de datos" ) query.prepare( """ CALL spAgregarArticulos( :activo, :marca, :subcategoria, :dai, :isc, :comision, :ganancia ) """ ) query.bindValue( ":activo", 1 ) query.bindValue( ":marca", self.brand_id ) query.bindValue( ":subcategoria", self.cat_id ) query.bindValue( ":dai", str( self.dai ) ) query.bindValue( ":isc", str( self.isc ) ) query.bindValue( ":comision", str( self.comission ) ) query.bindValue( ":ganancia", str( self.profit ) ) if not query.exec_(): raise Exception( "No se pudo ejecutar la consulta" ) result = True except UserWarning as inst: logging.error( query.lastError().text() ) logging.error( unicode( inst ) ) except Exception as inst: logging.critical( query.lastError().text() ) logging.critical( unicode( inst ) ) return result @pyqtSlot( unicode ) def on_txtCategorySearch_textChanged( self, text ): self.catproxymodel.setFilterFixedString( text ) @pyqtSlot( unicode ) def on_txtBrandSearch_textChanged( self, text ): self.brandsproxymodel.setFilterFixedString( text ) @property def valid( self ): return self.catvalid and self.brand_id != 0 @pyqtSlot() def on_btnAgregarMarca_pressed( self ): marca = ["", True] marca_descripcion = "" while marca_descripcion == "" and marca[1] == True: marca = QInputDialog.getText( self, "Agregar Marca", "Ingrese la Marca" ) marca_descripcion = marca[0].strip() if marca_descripcion != "": proxy = self.brandsproxymodel proxy.setFilterRegExp( "^" + marca_descripcion + "$" ) if proxy.rowCount() > 0: QMessageBox.information( None, "Crear Marca", "La marca %s ya existe" % marca_descripcion ) marca = ["", True] marca_descripcion = "" self.brandsproxymodel.setFilterRegExp( "" ) if marca[1]: if QMessageBox.question( self, qApp.organizationName(), u"¿Está seguro que desea crear la marca %s ?" % marca_descripcion, QMessageBox.Yes | QMessageBox.No ) == QMessageBox.Yes: if not QSqlDatabase.database().isOpen(): if not QSqlDatabase.database().open(): raise Exception( "No se pudo abrir la base de datos" ) query = QSqlQuery() query.prepare( "INSERT INTO marcas(nombre) VALUES (:marca)" ) query.bindValue( ":marca", marca_descripcion ) if not query.exec_(): logging.error( query.lastError().text() ) QMessageBox.warning( None, "Error al crear la marca", "No se pudo insertar la marca" ) else: self.cargarMarcas() @pyqtSlot( float ) def on_sbDAI_valueChanged( self, value ): try: self.dai = Decimal( str( value ) ) except ValueError: self.dai = 0 @pyqtSlot( float ) def on_sbISC_valueChanged( self, value ): try: self.isc = Decimal( str( value ) ) except ValueError: self.isc = 0 @pyqtSlot( float ) def on_sbComission_valueChanged( self, value ): try: self.comission = Decimal( str( value ) ) except ValueError: self.comission = 0 @pyqtSlot( float ) def on_sbProfit_valueChanged( self, value ): try: self.profit = Decimal( str( value ) ) except ValueError: self.profit = 0 def updateBrand( self, selected, _deselected ): if self.brandsproxymodel.rowCount() >= 0: self.brand_id = self.brandsproxymodel.index( selected.indexes()[0].row(), 0 ).data().toInt()[0] def update_category( self, selected, _deselected ): try: row = selected.indexes()[0].row() parent = selected.indexes()[0].parent() self.catvalid = parent.data().toString() != "" self.cat_id = self.catproxymodel.data( self.catproxymodel.index( row, 1, parent ), Qt.DisplayRole ) except IndexError: pass