Пример #1
0
    def __init__(self, parent, symbol, isin='', name=''):
        QDialog.__init__(self)
        self.setupUi(self)
        self.asset_id = None

        self.SymbolEdit.setText(symbol)
        self.isinEdit.setText(isin)
        self.NameEdit.setText(name)

        self.type_model = QSqlTableModel(db=db_connection())
        self.type_model.setTable('asset_types')
        self.type_model.select()
        self.TypeCombo.setModel(self.type_model)
        self.TypeCombo.setModelColumn(1)

        self.data_src_model = QSqlTableModel(db=db_connection())
        self.data_src_model.setTable('data_sources')
        self.data_src_model.select()
        self.DataSrcCombo.setModel(self.data_src_model)
        self.DataSrcCombo.setModelColumn(1)

        # center dialog with respect to parent window
        x = parent.x() + parent.width() / 2 - self.width() / 2
        y = parent.y() + parent.height() / 2 - self.height() / 2
        self.setGeometry(x, y, self.width(), self.height())
Пример #2
0
    def __init__(self, symbol, isin='', name=''):
        QDialog.__init__(self)
        self.setupUi(self)
        self.asset_id = None

        self.SymbolEdit.setText(symbol)
        self.isinEdit.setText(isin)
        self.NameEdit.setText(name)

        self.type_model = QSqlTableModel(db=db_connection())
        self.type_model.setTable('asset_types')
        self.type_model.select()
        self.TypeCombo.setModel(self.type_model)
        self.TypeCombo.setModelColumn(1)

        self.data_src_model = QSqlTableModel(db=db_connection())
        self.data_src_model.setTable('data_sources')
        self.data_src_model.select()
        self.DataSrcCombo.setModel(self.data_src_model)
        self.DataSrcCombo.setModelColumn(1)

        # center dialog with respect to main application window
        parent = None
        for widget in QApplication.topLevelWidgets():
            if widget.objectName() == Setup.MAIN_WND_NAME:
                parent = widget
        if parent:
            x = parent.x() + parent.width() / 2 - self.width() / 2
            y = parent.y() + parent.height() / 2 - self.height() / 2
            self.setGeometry(x, y, self.width(), self.height())
Пример #3
0
 def __init__(self, table, parent_view):
     self._view = parent_view
     self._table = table
     self._columns = []
     self._deleted_rows = []
     self._default_name = "name"
     self._group_by = None
     self._filter_by = ''
     self._filter_value = None
     self._sort_by = None
     self._hidden = []
     self._stretch = None
     self._default_values = {
     }  # To fill in default values for fields allowed to be NULL
     QSqlRelationalTableModel.__init__(self,
                                       parent=parent_view,
                                       db=db_connection())
     self.setJoinMode(QSqlRelationalTableModel.LeftJoin)
     self.setTable(self._table)
     self.setEditStrategy(QSqlTableModel.OnManualSubmit)
     self.select()
     # This is auxiliary 'plain' model of the same table - to be given as QCompleter source of data
     self._completion_model = QSqlTableModel(parent=parent_view,
                                             db=db_connection())
     self._completion_model.setTable(self._table)
     self._completion_model.select()
Пример #4
0
 def setData(self, index, value, role=Qt.EditRole):
     if role != Qt.EditRole:
         return False
     if not index.isValid():
         return False
     item_id = index.internalId()
     col = index.column()
     db_connection().transaction()
     _ = executeSQL(
         f"UPDATE {self._table} SET {self._columns[col][0]}=:value WHERE id=:id",
         [(":id", item_id), (":value", value)])
     self.dataChanged.emit(index, index, Qt.DisplayRole | Qt.EditRole)
     return True
Пример #5
0
    def __init__(self, parent):
        QComboBox.__init__(self, parent)
        self.p_selected_id = 0
        self.model = None
        self.activated.connect(self.OnUserSelection)

        self.query = QSqlQuery(db=db_connection())
        self.query.prepare(f"SELECT id, symbol FROM currencies")
        self.query.exec()
        self.model = QSqlTableModel(db=db_connection())
        self.model.setQuery(self.query)
        self.model.select()
        self.setModel(self.model)
        self.setModelColumn(self.model.fieldIndex("symbol"))
Пример #6
0
    def __init__(self, parent):
        QComboBox.__init__(self, parent)
        self.p_selected_id = 0
        self.model = None
        self.activated.connect(self.OnUserSelection)

        self.query = QSqlQuery(db=db_connection())
        self.query.prepare(f"SELECT id, name FROM assets WHERE type_id={PredefinedAsset.Money}")
        self.query.exec()
        self.model = QSqlTableModel(db=db_connection())
        self.model.setQuery(self.query)
        self.model.select()
        self.setModel(self.model)
        self.setModelColumn(self.model.fieldIndex("name"))
Пример #7
0
    def __init__(self, parent_view):
        super().__init__(parent_view)
        self._columns = [
            " ",
            self.tr("Timestamp"),
            self.tr("Account"),
            self.tr("Notes"),
            self.tr("Amount"),
            self.tr("Balance"),
            self.tr("Currency")
        ]
        self.CorpActionNames = {
            CorporateAction.SymbolChange:
            self.tr("Symbol change {old} -> {new}"),
            CorporateAction.Split:
            self.tr("Split {old} {before} into {after}"),
            CorporateAction.SpinOff:
            self.tr("Spin-off {after} {new} from {before} {old}"),
            CorporateAction.Merger:
            self.tr("Merger {before} {old} into {after} {new}"),
            CorporateAction.StockDividend:
            self.tr("Stock dividend: {after} {new}")
        }
        self._view = parent_view
        self._amount_delegate = None
        self._data = []
        self._row_count = 0
        self._query = QSqlQuery(db_connection())
        self._begin = 0
        self._end = 0
        self._account = 0
        self._text_filter = ''

        self.prepareData()
Пример #8
0
 def __init__(self, parent_view):
     self._columns = [("asset", g_tr("Reports", "Asset")),
                      ("open_timestamp", g_tr("Reports", "Open Date")),
                      ("close_timestamp", g_tr("Reports", "Close Date")),
                      ("open_price", g_tr("Reports", "Open Price")),
                      ("close_price", g_tr("Reports", "Close Price")),
                      ("qty", g_tr("Reports", "Qty")),
                      ("fee", g_tr("Reports", "Fee")),
                      ("profit", g_tr("Reports", "P/L")),
                      ("rel_profit", g_tr("Reports", "P/L, %")),
                      ("corp_action", g_tr("Reports", "Note"))]
     self.ca_names = {
         CorporateAction.SymbolChange: g_tr('Reports', "Symbol change"),
         CorporateAction.Split: g_tr('Reports', "Split"),
         CorporateAction.SpinOff: g_tr('Reports', "Spin-off"),
         CorporateAction.Merger: g_tr('Reports', "Merger"),
         CorporateAction.StockDividend: g_tr('Reports', "Stock dividend")
     }
     self._view = parent_view
     self._group_dates = 0
     self._query = None
     self._timestamp_delegate = None
     self._float_delegate = None
     self._float2_delegate = None
     self._float4_delegate = None
     self._profit_delegate = None
     self._ca_delegate = None
     QSqlTableModel.__init__(self, parent=parent_view, db=db_connection())
Пример #9
0
 def update_db_schema(self, db_path) -> JalDBError:
     if QMessageBox().warning(
             None,
             QApplication.translate('DB', "Database format is outdated"),
             QApplication.translate(
                 'DB',
                 "Do you agree to upgrade your data to newer format?"),
             QMessageBox.Yes, QMessageBox.No) == QMessageBox.No:
         return JalDBError(JalDBError.OutdatedDbSchema)
     db = db_connection()
     version = readSQL(
         "SELECT value FROM settings WHERE name='SchemaVersion'")
     try:
         schema_version = int(version)
     except ValueError:
         return JalDBError(JalDBError.DbInitFailure)
     for step in range(schema_version, Setup.TARGET_SCHEMA):
         delta_file = db_path + Setup.UPDATES_PATH + os.sep + Setup.UPDATE_PREFIX + f"{step + 1}.sql"
         logging.info(
             f"Applying delta schema {step}->{step + 1} from {delta_file}")
         error = self.run_sql_script(delta_file)
         if error.code != JalDBError.NoError:
             db.close()
             return error
     return JalDBError(JalDBError.NoError)
Пример #10
0
 def __init__(self, parent_view):
     self._columns = [("asset", self.tr("Asset")),
                      ("o_datetime", self.tr("Open Date")),
                      ("c_datetime", self.tr("Close Date")),
                      ("open_price", self.tr("Open Price")),
                      ("close_price", self.tr("Close Price")),
                      ("qty", self.tr("Qty")),
                      ("fee", self.tr("Fee")),
                      ("profit", self.tr("P/L")),
                      ("rel_profit", self.tr("P/L, %")),
                      ("corp_action", self.tr("Note"))]
     self.ca_names = {
         CorporateAction.SymbolChange: self.tr("Symbol change"),
         CorporateAction.Split: self.tr("Split"),
         CorporateAction.SpinOff: self.tr("Spin-off"),
         CorporateAction.Merger: self.tr("Merger")
     }
     self._view = parent_view
     self._begin = 0
     self._end = 0
     self._account_id = 0
     self._group_dates = 0
     self._query = None
     self._timestamp_delegate = None
     self._float_delegate = None
     self._float2_delegate = None
     self._float4_delegate = None
     self._profit_delegate = None
     self._ca_delegate = None
     QSqlTableModel.__init__(self, parent=parent_view, db=db_connection())
Пример #11
0
    def insertRows(self, row, count, parent=None):
        if parent is None:
            return False
        if not parent.isValid():
            parent_id = self.ROOT_PID
        else:
            parent_id = parent.internalId()

        self.beginInsertRows(parent, row, row + count - 1)
        db_connection().transaction()
        _ = executeSQL(
            f"INSERT INTO {self._table}(pid, name) VALUES (:pid, '')",
            [(":pid", parent_id)])
        self.endInsertRows()
        self.layoutChanged.emit()
        return True
Пример #12
0
 def run_sql_script(self, script_file) -> JalDBError:
     try:
         with open(script_file) as sql_script:
             statements = sqlparse.split(sql_script)
             for statement in statements:
                 clean_statement = sqlparse.format(statement,
                                                   strip_comments=True)
                 if executeSQL(clean_statement, commit=False) is None:
                     _ = executeSQL("ROLLBACK")
                     db_connection().close()
                     return JalDBError(JalDBError.SQLFailure,
                                       f"FAILED: {clean_statement}")
                 else:
                     logging.debug(f"EXECUTED OK:\n{clean_statement}")
     except FileNotFoundError:
         return JalDBError(JalDBError.NoDeltaFile, script_file)
     return JalDBError(JalDBError.NoError)
Пример #13
0
    def removeRows(self, row, count, parent=None):
        if parent is None:
            return False
        if not parent.isValid():
            parent_id = self.ROOT_PID
        else:
            parent_id = parent.internalId()

        self.beginRemoveRows(parent, row, row + count - 1)
        db_connection().transaction()
        query = executeSQL(
            f"SELECT id FROM {self._table} WHERE pid=:pid LIMIT :row_c OFFSET :row_n",
            [(":pid", parent_id), (":row_c", count), (":row_n", row)])
        while query.next():
            self.deleteWithChilderen(query.value(0))
        self.endRemoveRows()
        self.layoutChanged.emit()
        return True
Пример #14
0
 def __init__(self, table, parent_view):
     super().__init__(parent_view)
     self._table = table
     self._view = parent_view
     self._default_name = "name"
     self._stretch = None
     # This is auxiliary 'plain' model of the same table - to be given as QCompleter source of data
     self._completion_model = QSqlTableModel(parent=parent_view,
                                             db=db_connection())
     self._completion_model.setTable(self._table)
     self._completion_model.select()
Пример #15
0
 def setupDb(self, table, key_field, field):
     self._table = table
     self._field = field
     self._key_field = key_field
     self._model = QSqlTableModel(parent=self, db=db_connection())
     self._model.setTable(table)
     field_idx = self._model.fieldIndex(field)
     self._model.setSort(field_idx, Qt.AscendingOrder)
     self._model.select()
     self.setModel(self._model)
     self.setModelColumn(field_idx)
Пример #16
0
 def __init__(self, parent_view):
     self._columns = [("timestamp", self.tr("Timestamp")),
                      ("account", self.tr("Account")),
                      ("name", self.tr("Peer Name")),
                      ("sum", self.tr("Amount")),
                      ("note", self.tr("Note"))]
     self._view = parent_view
     self._query = None
     self._timestamp_delegate = None
     self._float_delegate = None
     QSqlTableModel.__init__(self, parent=parent_view, db=db_connection())
Пример #17
0
    def restore(self):
        self.get_filename(False)
        if self.backup_name is None:
            return
        db_connection().close()

        if not self.validate_backup():
            logging.error(self.tr("Wrong format of backup file"))
            return

        if not self.do_restore():
            return
        logging.info(self.tr("Backup restored from: ") + self.backup_name + self._backup_label_date
                     + self.tr(" into ") + self.file)

        QMessageBox().information(self.parent, self.tr("Data restored"),
                                  self.tr("Database was loaded from the backup.\n") +
                                  self.tr("You should restart application to apply changes\n"
                                                    "Application will be terminated now"),
                                  QMessageBox.Ok)
        self.parent.close()
Пример #18
0
    def __init__(self, parent):
        QComboBox.__init__(self, parent)
        self.p_selected_id = 0
        self.model = None
        self.table_name = 'currencies'
        self.field_name = 'name'
        self.activated.connect(self.OnUserSelection)

        self.model = QSqlTableModel(db=db_connection())
        self.model.setTable(self.table_name)
        self.model.select()
        self.setModel(self.model)
        self.setModelColumn(self.model.fieldIndex(self.field_name))
Пример #19
0
    def _init_db(self, table_name):
        self.table_name = table_name
        self.model = QSqlTableModel(parent=self, db=db_connection())
        self.model.setTable(table_name)
        self.model.setEditStrategy(QSqlTableModel.OnManualSubmit)

        self.mapper = QDataWidgetMapper(self.model)
        self.mapper.setModel(self.model)
        self.mapper.setSubmitPolicy(QDataWidgetMapper.AutoSubmit)

        self.model.dataChanged.connect(self.onDataChange)
        self.commit_button.clicked.connect(self.saveChanges)
        self.revert_button.clicked.connect(self.revertChanges)
Пример #20
0
    def __init__(self, parent_view):
        super().__init__(parent_view)
        self._view = parent_view
        self._amount_delegate = None
        self._data = []
        self._row_count = 0
        self._query = QSqlQuery(db_connection())
        self._begin = 0
        self._end = 0
        self._account = 0
        self._text_filter = ''

        self.prepareData()
Пример #21
0
    def __init__(self, parent_view):
        super().__init__(parent_view)
        self._view = parent_view
        self._amount_delegate = None
        self._data = []
        self._row_count = 0
        self._table_name = 'all_operations'
        self._query = QSqlQuery(db_connection())
        self._begin = 0
        self._end = 0
        self._account = 0

        self.prepareData()
Пример #22
0
 def __init__(self, parent_view):
     self._columns = [("period", self.tr("Period")),
                      ("transfer", self.tr("In / Out")),
                      ("assets", self.tr("Assets value")),
                      ("result", self.tr("Total result")),
                      ("profit", self.tr("Profit / Loss")),
                      ("dividend", self.tr("Returns")),
                      ("tax_fee", self.tr("Taxes & Fees"))]
     self._view = parent_view
     self._query = None
     self._ym_delegate = None
     self._float_delegate = None
     QSqlTableModel.__init__(self, parent=parent_view, db=db_connection())
Пример #23
0
 def commit(self):
     db_connection().commit()
Пример #24
0
    def __init__(self, parent=None):
        AbstractOperationDetails.__init__(self, parent)
        self.name = "Income/Spending"

        self.details_model = None
        self.category_delegate = CategorySelectorDelegate()
        self.tag_delegate = TagSelectorDelegate()
        self.float_delegate = FloatDelegate(2)

        self.date_label = QLabel(self)
        self.details_label = QLabel(self)
        self.account_label = QLabel(self)
        self.peer_label = QLabel(self)

        self.main_label.setText(self.tr("Income / Spending"))
        self.date_label.setText(self.tr("Date/Time"))
        self.details_label.setText(self.tr("Details"))
        self.account_label.setText(self.tr("Account"))
        self.peer_label.setText(self.tr("Peer"))

        self.timestamp_editor = QDateTimeEdit(self)
        self.timestamp_editor.setCalendarPopup(True)
        self.timestamp_editor.setTimeSpec(Qt.UTC)
        self.timestamp_editor.setFixedWidth(
            self.timestamp_editor.fontMetrics().horizontalAdvance(
                "00/00/0000 00:00:00") * 1.25)
        self.timestamp_editor.setDisplayFormat("dd/MM/yyyy hh:mm:ss")
        self.account_widget = AccountSelector(self)
        self.peer_widget = PeerSelector(self)
        self.a_currency = OptionalCurrencyComboBox(self)
        self.a_currency.setText(self.tr("Paid in foreign currency:"))
        self.add_button = QPushButton(load_icon("add.png"), '', self)
        self.add_button.setToolTip(self.tr("Add detail"))
        self.del_button = QPushButton(load_icon("remove.png"), '', self)
        self.del_button.setToolTip(self.tr("Remove detail"))
        self.copy_button = QPushButton(load_icon("copy.png"), '', self)
        self.copy_button.setToolTip(self.tr("Copy detail"))
        self.details_table = QTableView(self)
        self.details_table.horizontalHeader().setFont(self.bold_font)
        self.details_table.setAlternatingRowColors(True)
        self.details_table.verticalHeader().setVisible(False)
        self.details_table.verticalHeader().setMinimumSectionSize(20)
        self.details_table.verticalHeader().setDefaultSectionSize(20)

        self.layout.addWidget(self.date_label, 1, 0, 1, 1, Qt.AlignLeft)
        self.layout.addWidget(self.details_label, 2, 0, 1, 1, Qt.AlignLeft)

        self.layout.addWidget(self.timestamp_editor, 1, 1, 1, 4)
        self.layout.addWidget(self.add_button, 2, 1, 1, 1)
        self.layout.addWidget(self.copy_button, 2, 2, 1, 1)
        self.layout.addWidget(self.del_button, 2, 3, 1, 1)

        self.layout.addWidget(self.account_label, 1, 5, 1, 1, Qt.AlignRight)
        self.layout.addWidget(self.peer_label, 2, 5, 1, 1, Qt.AlignRight)

        self.layout.addWidget(self.account_widget, 1, 6, 1, 1)
        self.layout.addWidget(self.peer_widget, 2, 6, 1, 1)

        self.layout.addWidget(self.a_currency, 1, 7, 1, 1)

        self.layout.addWidget(self.commit_button, 0, 9, 1, 1)
        self.layout.addWidget(self.revert_button, 0, 10, 1, 1)

        self.layout.addWidget(self.details_table, 4, 0, 1, 11)
        self.layout.addItem(self.horizontalSpacer, 1, 8, 1, 1)

        self.add_button.clicked.connect(self.addChild)
        self.copy_button.clicked.connect(self.copyChild)
        self.del_button.clicked.connect(self.delChild)

        super()._init_db("actions")
        self.model.beforeInsert.connect(self.before_record_insert)
        self.model.beforeUpdate.connect(self.before_record_update)
        self.mapper.setItemDelegate(IncomeSpendingWidgetDelegate(self.mapper))

        self.details_model = DetailsModel(self.details_table, db_connection())
        self.details_model.setTable("action_details")
        self.details_model.setEditStrategy(QSqlTableModel.OnManualSubmit)
        self.details_table.setModel(self.details_model)
        self.details_model.dataChanged.connect(self.onDataChange)

        self.account_widget.changed.connect(self.mapper.submit)
        self.peer_widget.changed.connect(self.mapper.submit)
        self.a_currency.changed.connect(self.mapper.submit)
        self.a_currency.name_updated.connect(self.details_model.setAltCurrency)

        self.mapper.addMapping(self.timestamp_editor,
                               self.model.fieldIndex("timestamp"))
        self.mapper.addMapping(self.account_widget,
                               self.model.fieldIndex("account_id"))
        self.mapper.addMapping(self.peer_widget,
                               self.model.fieldIndex("peer_id"))
        self.mapper.addMapping(self.a_currency,
                               self.model.fieldIndex("alt_currency_id"))

        self.details_table.setItemDelegateForColumn(2, self.category_delegate)
        self.details_table.setItemDelegateForColumn(3, self.tag_delegate)
        self.details_table.setItemDelegateForColumn(4, self.float_delegate)
        self.details_table.setItemDelegateForColumn(5, self.float_delegate)

        self.model.select()
        self.details_model.select()
        self.details_model.configureView()