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())
Exemple #3
0
 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])
Exemple #8
0
 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)
Exemple #11
0
 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))
Exemple #12
0
    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()
Exemple #13
0
    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
Exemple #15
0
    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])
Exemple #17
0
 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)
Exemple #18
0
    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)
Exemple #20
0
    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
Exemple #21
0
    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
Exemple #23
0
    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
Exemple #24
0
 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))
Exemple #26
0
    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)