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())
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())
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()
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
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"))
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"))
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()
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())
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)
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())
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
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)
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
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()
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)
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())
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()
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))
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)
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()
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()
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())
def commit(self): db_connection().commit()
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()