def add_item(self): State[STATE_KEY_ELEMENT] = None entity = Expense if self.tabWidget.currentIndex() == 0 else Income table = self.tableExpenses if self.tabWidget.currentIndex( ) == 0 else self.tableIncomes self.add_edit_dialog.init_value() if self.add_edit_dialog.exec(): try: dt = self.add_edit_dialog.dateTimeEdit.dateTime() res = entity.create({ 'value': self.add_edit_dialog.valueDoubleSpinBox.value(), 'date': dt.toSecsSinceEpoch() + dt.offsetFromUtc(), 'note': self.add_edit_dialog.noteTextEdit.toPlainText(), }) except Exception as e: # todo: хорошо бы конечно оповщение о том что пошло не так - но не в этой жизни... GLog.error("ui.MainForm.add_item :: error :%s" % e) return row_number = table.rowCount() table.insertRow(row_number) table.setItem(row_number, 0, QTableWidgetItem(str(res.ID))) table.setItem(row_number, 1, QTableWidgetItem(res.date_str)) table.setItem(row_number, 2, QTableWidgetItem(str(res.value))) table.setItem(row_number, 3, QTableWidgetItem(res.note))
def remove_item(self): entity = Expense if self.tabWidget.currentIndex() == 0 else Income table = self.tableExpenses if self.tabWidget.currentIndex( ) == 0 else self.tableIncomes rows = table.selectionModel().selectedRows() if len(rows) == 0: # todo: говнокодство конечно... надо дисейблить кнопку пока ничего не выбрано в таблице... но времени нет msg = 'Пользователь не выбран, удалять нечего' QMessageBox.information(self, 'Remove item', msg) return msg = f'Вы действительно хотете удалить {"пользователя" if len(rows) == 1 else "пользователей"}?' reply = QMessageBox.question( self, f'Remove item{"" if len(rows) == 1 else "s"}', msg, QMessageBox.Yes, QMessageBox.No) if reply == QMessageBox.Yes: for index in sorted(rows, reverse=True): GLog.debug('remove_item :: row: %s => User.ID:%s' % (index.row(), table.item(index.row(), 0).text())) try: entity = Expense if self.tabWidget.currentIndex( ) == 0 else Income entity.delete(table.item(index.row(), 0).text()) except Exception as e: # todo: хорошо бы конечно оповщение о том что пошло не так - но не в этой жизни... GLog.error("ui.MainForm.remove_item :: error :%s" % e) return table.model().removeRow(index.row())
def __init__(self, *args): GLog.debug("ui.UserAddEditDialog.__init__") super().__init__(*args) uic.loadUi('ui/userAddEditDialog.ui', self) self.bntSave.clicked.connect(self.accept) self.btnCancel.clicked.connect(self.close) self.init_value()
def __init__(self, actualize_visual_state_callback): GLog.debug("ui.MainForm.__init__") super().__init__() self.add_edit_dialog = None self.actualize_visual_state_callback = actualize_visual_state_callback uic.loadUi('ui/mainForm.ui', self) self.actionExit.triggered.connect(qApp.quit) self.btnExit.clicked.connect(qApp.quit) self.actionAdminUsers.triggered.connect(self.open_users) self.actionAdd_item.triggered.connect(self.add_item) self.btnAdd.clicked.connect(self.add_item) self.actionRemove_item.triggered.connect(self.remove_item) self.btnRemove.clicked.connect(self.remove_item) self.actionEdit_item.triggered.connect(self.edit_item) self.btnEdit.clicked.connect(self.edit_item) self.tableIncomes.setSelectionBehavior(QAbstractItemView.SelectRows) self.tableIncomes.setSelectionMode(QAbstractItemView.SingleSelection) self.tableExpenses.setSelectionBehavior(QAbstractItemView.SelectRows) self.tableExpenses.setSelectionMode(QAbstractItemView.SingleSelection) self.tableIncomes.setColumnWidth(0, 80) self.tableIncomes.setColumnWidth(1, 150) self.tableIncomes.setColumnWidth(2, 100) self.tableIncomes.setColumnWidth(3, 350) self.tableExpenses.setColumnWidth(0, 80) self.tableExpenses.setColumnWidth(1, 150) self.tableExpenses.setColumnWidth(2, 100) self.tableExpenses.setColumnWidth(3, 350)
def __init__(self, actualize_visual_state_callback): GLog.debug("ui.UsersForm.__init__") super().__init__() self.add_edit_dialog = None self.actualize_visual_state_callback = actualize_visual_state_callback uic.loadUi('ui/usersForm.ui', self) self.actionExit.triggered.connect(self.close) self.actionExit.setShortcut('Ctrl+W') self.btnClose.clicked.connect(self.close) self.actionAdd_item.triggered.connect(self.add_item) self.btnAdd.clicked.connect(self.add_item) self.actionRemove_item.triggered.connect(self.remove_item) self.btnRemove.clicked.connect(self.remove_item) self.actionEdit_item.triggered.connect(self.edit_item) self.btnEdit.clicked.connect(self.edit_item) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setSelectionMode(QAbstractItemView.SingleSelection) self.table.setColumnWidth(0, 80) self.table.setColumnWidth(1, 150) self.table.setColumnWidth(2, 100) self.table.setColumnWidth(3, 350) self.init_data()
def add_item(self): State[STATE_KEY_ELEMENT] = None self.add_edit_dialog.init_value() if self.add_edit_dialog.exec(): try: user = User.create({ 'is_admin': self.add_edit_dialog.isAdmin.isChecked(), 'name': self.add_edit_dialog.userName.text(), 'login': self.add_edit_dialog.userLogin.text(), 'password': self.add_edit_dialog.userPassword.text(), }) except Exception as e: # todo: хорошо бы конечно оповщение о том что пошло не так - но не в этой жизни... GLog.error("ui.UsersForm.add_item :: error :%s" % e) return row_number = self.table.rowCount() self.table.insertRow(row_number) self.table.setItem(row_number, 0, QTableWidgetItem(str(user.ID))) self.table.setItem(row_number, 1, QTableWidgetItem(user.name)) self.table.setItem(row_number, 2, QTableWidgetItem(user.login)) self.table.setItem(row_number, 3, QTableWidgetItem('Да' if user.admin else 'Нет'))
def _delete(self): """.""" GLog.debug('Удаление дохода из БД') self.db().execute( ''' DELETE FROM "incomes" WHERE "id" = ?; ''', [self.ID])
def _delete(self): """.""" GLog.debug('Удаление пользователя из БД') self.db().execute( ''' DELETE FROM "users" WHERE "id" = ?; ''', [self.ID])
def delete(cls, expense_id: int): """Удаление дохода. :param expense_id: идентификатор дохода :rtype: None """ GLog.info('Удаление дохода') res = Income().load_from_json({'id': expense_id}) res._delete()
def _create(self): """.""" GLog.debug('Вставка дохода в БД') self.ID = self.db().execute(''' INSERT INTO "incomes" ( "date", "value", "note" ) VALUES (?, ?, ?); ''', [self.date, self.value, self.note], with_result=True)
def catch(self, error: Exception, text: str): """Перехват и обработка ошибки запроса.""" error_str = str(error) query_str = text GLog.error( 'Ошибка запроса:\n%s\n\tПричина: %s', query_str, error_str, ) msg = 'ошибка синтаксиса или данных' self.error('%s (%s)' % (msg, error_str))
def delete(cls, user_id: int): """Удаление пользователя. :param user_id: идентификатор пользователя :rtype: None """ GLog.info('Удаление пользователя') res = User().load_from_json( {'id': cls.check_int(user_id, 'идентификатор пользователя')}) res._delete()
def create(cls, data: dict) -> BaseItem: """Создание расхода. :param data: данные по расходу :rtype: entities.Expense """ GLog.info('Создание расхода') res = Expense().load_from_json(data) res._create() return res
def create(cls, data: dict) -> BaseItem: """Создание дохода. :param data: данные по доходу :rtype: entities.Income """ GLog.info('Создание дохода') res = Income().load_from_json(data) res._create() return res
def list(cls) -> BaseList: """Список расходов. :rtype entities.Users """ GLog.info('Запрос списка расходов') db = create_sqlite_driver() sql = 'SELECT * FROM "expenses" ORDER BY "date" DESC;' args = [] return db.select(sql, args, list_type=cls, item_type=Expense)
def _update(self): """.""" GLog.debug('Изменениее дохода в БД') self.db().execute( ''' UPDATE "incomes" SET "date" = ?, "value" = ?, "note" = ? WHERE "id" = ?; ''', [self.date, self.value, self.note, self.ID])
def _create(self): """.""" GLog.debug('Вставка пользователя в БД') passw = self.check_str(self.password, arg='Пароль пользователя') passw = sha256(passw.encode('utf-8')).hexdigest() self.ID = self.db().execute(''' INSERT INTO "users" ( "login", "passw", "name", "is_admin" ) VALUES (?, ?, ?, ?); ''', [self.login, passw, self.name, self.is_admin], with_result=True)
def list(cls) -> BaseList: """Список пользователей. :rtype entities.Users """ GLog.info('Запрос списка пользователей') db = create_sqlite_driver() sql = 'SELECT * FROM "users";' args = [] return db.select(sql, args, list_type=cls, item_type=User)
def list(cls) -> BaseList: """Список доходов. :rtype entities.Incomes """ GLog.info('Запрос списка доходов') db = create_sqlite_driver() sql = 'SELECT * FROM "incomes" ORDER BY "date" DESC;' args = [] return db.select(sql, args, list_type=cls, item_type=Income)
def create(cls, data: dict) -> BaseItem: """Создание пользователя. :param role_id: идентификатор роли пользователя :param data: данные пользователя :rtype: entities.User """ GLog.info('Создание пользователя') res = User().load_from_json(data) res._create() return res
def edit(cls, expense_id: int, data: dict) -> BaseItem: """Изменение расхода. :param expense_id: идентификатор расхода :param data: данные расхода :rtype: entities.Expense """ GLog.info('Изменение расхода') data.update({'id': expense_id}) res = Expense().load_from_json(data) res._update() return res
def edit(cls, income_id: int, data: dict) -> BaseItem: """Изменение дохода. :param income_id: идентификатор дохода :param data: данные дохода :rtype: entities.Income """ GLog.info('Изменение дохода') data.update({'id': income_id}) res = Income().load_from_json(data) res._update() return res
def edit(cls, user_id: int, data: dict) -> BaseItem: """Изменение пользователя. :param user_id: идентификатор пользователя :param data: данные пользователя :rtype: entities.User """ GLog.info('Изменение пользователя') data.update( {'id': cls.check_int(user_id, 'идентификатор пользователя')}) res = User().load_from_json(data) res._update() return res
def _update(self): """.""" GLog.debug('Изменениее пользователя в БД') passw = self.check_str(self.password, arg='Пароль пользователя') passw = sha256(passw.encode('utf-8')).hexdigest() self.db().execute( ''' UPDATE "users" SET "login" = ?, "passw" = ?, "name" = ?, "is_admin" = ? WHERE "id" = ?; ''', [self.login, passw, self.name, self.is_admin, self.ID])
def edit_item(self): entity = Expense if self.tabWidget.currentIndex() == 0 else Income table = self.tableExpenses if self.tabWidget.currentIndex( ) == 0 else self.tableIncomes rows = table.selectionModel().selectedRows() if len(rows) != 1: # todo: говнокодство конечно... надо дисейблить кнопку пока ничего не выбрано или выбрано >1 в таблице... но времени нет msg = 'Пользователь не выбран/выбрано больше 1 пользователя, изменение невозможно' QMessageBox.information(self, 'Edit item', msg) return index = rows[0] GLog.debug('edit_item :: row: %s => User.ID:%s' % (index.row(), table.item(index.row(), 0).text())) State[STATE_KEY_ELEMENT] = { 'id': table.item(index.row(), 0).text(), 'value': float(table.item(index.row(), 2).text()), 'date': datetime.strptime( table.item(index.row(), 1).text(), '%Y-%m-%d %H:%M:%S').timestamp(), 'note': table.item(index.row(), 3).text(), } self.add_edit_dialog.init_value() if not self.add_edit_dialog.exec(): return try: res = entity.edit( State[STATE_KEY_ELEMENT]['id'], { 'value': self.add_edit_dialog.valueDoubleSpinBox.value(), 'date': self.add_edit_dialog.dateTimeEdit.dateTime(). toSecsSinceEpoch(), 'note': self.add_edit_dialog.noteTextEdit.toPlainText(), }) except Exception as e: # todo: хорошо бы конечно оповщение о том что пошло не так - но не в этой жизни... GLog.error("ui.MainForm.edit_item :: error :%s" % e) return table.setItem(index.row(), 0, QTableWidgetItem(str(res.ID))) table.setItem(index.row(), 1, QTableWidgetItem(res.date_str)) table.setItem(index.row(), 2, QTableWidgetItem(str(res.value))) table.setItem(index.row(), 3, QTableWidgetItem(res.note))
def select_by_credentials(cls, login: str, password: str) -> BaseItem: """Создание пользователя. :param login: логин пользователя :param password: пароль пользователя :rtype: entities.User """ GLog.info('Выборка пользователя по логину/паролю') password = cls.check_str(password, arg='Пароль пользователя') password = sha256(password.encode('utf-8')).hexdigest() db = create_sqlite_driver() sql = ''' SELECT * FROM "users" WHERE "login" = ? AND "passw" = ?; ''' args = [login, password] return db.select(sql, args, one_row=True, item_type=User)
def edit_item(self): rows = self.table.selectionModel().selectedRows() if len(rows) != 1: # todo: говнокодство конечно... надо дисейблить кнопку пока ничего не выбрано или выбрано >1 в таблице... но времени нет msg = 'Пользователь не выбран/выбрано больше 1 пользователя, изменение невозможно' QMessageBox.information(self, 'Edit item', msg) return index = rows[0] GLog.debug('edit_item :: row: %s => User.ID:%s' % (index.row(), self.table.item(index.row(), 0).text())) State[STATE_KEY_ELEMENT] = { 'id': self.table.item(index.row(), 0).text(), 'name': self.table.item(index.row(), 1).text(), 'login': self.table.item(index.row(), 2).text(), 'is_admin': self.table.item(index.row(), 3).text() == "Да", } self.add_edit_dialog.init_value() if not self.add_edit_dialog.exec(): return try: user = User.edit( State[STATE_KEY_ELEMENT]['id'], { 'is_admin': self.add_edit_dialog.isAdmin.isChecked(), 'name': self.add_edit_dialog.userName.text(), 'login': self.add_edit_dialog.userLogin.text(), 'password': self.add_edit_dialog.userPassword.text(), }) except Exception as e: # todo: хорошо бы конечно оповщение о том что пошло не так - но не в этой жизни... GLog.error("ui.UsersForm.edit_item :: error :%s" % e) return self.table.setItem(index.row(), 0, QTableWidgetItem(str(user.ID))) self.table.setItem(index.row(), 1, QTableWidgetItem(user.name)) self.table.setItem(index.row(), 2, QTableWidgetItem(user.login)) self.table.setItem(index.row(), 3, QTableWidgetItem('Да' if user.admin else 'Нет'))
def on_login(self): GLog.debug("ui.LoginForm.on_login") login = self.inputLogin.text() password = self.inputPass.text() GLog.info(f"ui.LoginForm.on_login :: try to login as: {login}") try: user = User.select_by_credentials(login, password) if user.ID > 0: state.State[state.STATE_KEY_USER] = user state.State[ state. STATE_KEY_SECTION] = state.STATE_SECTION_MAIN_EXPENSES self.on_login_success() except Exception as e: GLog.error("ui.LoginForm.on_login :: error: %s", e)
def __init__(self, on_login_success): GLog.debug("ui.LoginForm.__init__") super().__init__() self.on_login_success = on_login_success uic.loadUi('ui/loginForm.ui', self) self.btnLogin.clicked.connect(self.on_login)
def recalc_elements_availability(self): cur_user = State[STATE_KEY_USER] GLog.debug("ui.MainForm.recalc_elements_availability: %s", cur_user.admin) self.menuAdmin.setEnabled(cur_user.admin) self.actionAdminUsers.setEnabled(cur_user.admin)