From 19d6c003f206de8c7288267b8174c1221ec27bb2 Mon Sep 17 00:00:00 2001 From: Inso <insomniak.fr@gmail.com> Date: Wed, 28 Jan 2015 22:48:10 +0100 Subject: [PATCH] New transactions table history : working ! :) --- src/cutecoin/gui/currency_tab.py | 16 +++- src/cutecoin/models/txhistory.py | 121 ++++++++++--------------------- 2 files changed, 52 insertions(+), 85 deletions(-) diff --git a/src/cutecoin/gui/currency_tab.py b/src/cutecoin/gui/currency_tab.py index cd230e9f..e7747e51 100644 --- a/src/cutecoin/gui/currency_tab.py +++ b/src/cutecoin/gui/currency_tab.py @@ -14,7 +14,7 @@ from PyQt5.QtCore import QModelIndex, Qt, pyqtSlot, QObject, QThread, pyqtSignal from PyQt5.QtGui import QIcon from ..gen_resources.currency_tab_uic import Ui_CurrencyTabWidget from .community_tab import CommunityTabWidget -from ..models.txhistory import HistoryTableModel +from ..models.txhistory import HistoryTableModel, TxFilterProxyModel from ..models.wallets import WalletsListModel from ..models.wallet import WalletListModel from ..tools.exceptions import NoPeerAvailable @@ -104,9 +104,18 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): self.date_to.setDateTime(blockchain_lastblock) self.date_to.setMaximumDateTime(blockchain_lastblock) - self.table_history.setModel( - HistoryTableModel(self.app.current_account, self.community)) + ts_from = self.date_from.dateTime().toTime_t() + ts_to = self.date_to.dateTime().toTime_t() + + model = HistoryTableModel(self.app.current_account, self.community) + proxy = TxFilterProxyModel(self.community, ts_from, ts_to) + proxy.setSourceModel(model) + proxy.setDynamicSortFilter(True) + proxy.setSortRole(Qt.DisplayRole) + + self.table_history.setModel(proxy) self.table_history.setSortingEnabled(True) + self.tab_community = CommunityTabWidget(self.app.current_account, self.community, self.password_asker) @@ -211,3 +220,4 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): ts_to = self.date_to.dateTime().toTime_t() if self.table_history.model(): self.table_history.model().set_period(ts_from, ts_to) + self.table_history.model().invalidate() diff --git a/src/cutecoin/models/txhistory.py b/src/cutecoin/models/txhistory.py index 62b6659c..d93e1f39 100644 --- a/src/cutecoin/models/txhistory.py +++ b/src/cutecoin/models/txhistory.py @@ -7,10 +7,41 @@ Created on 5 févr. 2014 import logging from ..core.person import Person from ..tools.exceptions import PersonNotFoundError -from PyQt5.QtCore import QAbstractTableModel, Qt, QVariant, QAbstractProxyModel +from PyQt5.QtCore import QAbstractTableModel, Qt, QVariant, QSortFilterProxyModel, QDateTime from PyQt5.QtGui import QFont -from operator import itemgetter -import datetime + + +class TxFilterProxyModel(QSortFilterProxyModel): + def __init__(self, community, ts_from, ts_to, parent=None): + super().__init__(parent) + self.community = community + self.ts_from = ts_from + self.ts_to = ts_to + + def set_period(self, ts_from, ts_to): + """ + Filter table by given timestamps + """ + logging.debug("Filtering from {0} to {1}".format(ts_from, ts_to)) + self.ts_from = ts_from + self.ts_to = ts_to + + def filterAcceptsRow(self, sourceRow, sourceParent): + def in_period(tx): + block = self.community.get_block(tx[0]) + return (block.mediantime in range(self.ts_from, self.ts_to)) + + tx = self.sourceModel().transactions[sourceRow] + return in_period(tx) + + def lessThan(self, left, right): + """ + Sort table by given column number. + """ + logging.debug(self.sortOrder()) + left_data = self.sourceModel().data(left, Qt.DisplayRole) + right_data = self.sourceModel().data(right, Qt.DisplayRole) + return (left_data < right_data) class HistoryTableModel(QAbstractTableModel): @@ -32,7 +63,7 @@ class HistoryTableModel(QAbstractTableModel): self.account.transactions_received(self.community) def rowCount(self, parent): - return len(self.transactions ) + return len(self.transactions) def columnCount(self, parent): return len(self.columns) @@ -57,9 +88,9 @@ class HistoryTableModel(QAbstractTableModel): sender = pubkey date_ts = self.community.get_block(tx[0]).mediantime - date = datetime.datetime.fromtimestamp(date_ts).strftime('%Y-%m-%d %H:%M:%S') + date = QDateTime.fromTime_t(date_ts) - return (date, sender, "", "{0}".format(amount), comment) + return (date.date(), sender, "", "{0}".format(amount), comment) def data_sent(self, tx): amount = 0 @@ -77,9 +108,9 @@ class HistoryTableModel(QAbstractTableModel): except PersonNotFoundError: receiver = pubkey date_ts = self.community.get_block(tx[0]).mediantime - date = datetime.datetime.fromtimestamp(date_ts).strftime('%Y-%m-%d %H:%M:%S') + date = QDateTime.fromTime_t(date_ts) - return (date, receiver, "-{0}".format(amount), "", comment) + return (date.date(), receiver, "-{0}".format(amount), "", comment) def data(self, index, role): row = index.row() @@ -104,79 +135,5 @@ class HistoryTableModel(QAbstractTableModel): font.setItalic(False) return font - def sort(self, section, order): - """Sort table by given column number. - """ - self.layoutAboutToBeChanged.emit() - - def uid(tx): - if tx in self.account.transactions_received(self.community): - pubkey = tx[1].issuers[0] - else: - pubkey = tx[1].outputs[0].pubkey - - try: - receiver = Person.lookup(pubkey, self.community).name - except PersonNotFoundError: - receiver = pubkey - return receiver - - def amount_received(tx): - amount = 0 - if tx in self.account.transactions_received(self.community): - for o in tx[1].outputs: - pubkeys = [w.pubkey for w in self.account.wallets] - if o.pubkey not in pubkeys: - amount += o.amount - return amount - - def amount_sent(tx): - amount = 0 - if tx in self.account.transactions_sent(self.community) \ - or tx in self.account.transactions_awaiting(self.community): - for o in tx[1].outputs: - pubkeys = [w.pubkey for w in self.account.wallets] - if o.pubkey not in pubkeys: - amount += o.amount - return amount - - def comment(tx): - return tx[1].comment - - key_getter = {0: itemgetter(0), - 1: uid, - 2: amount_sent, - 3: amount_received, - 4: comment} - - self.transactions = self.account.transactions_sent(self.community) + \ - self.account.transactions_awaiting(self.community) + \ - self.account.transactions_received(self.community) - - self.transactions = sorted(self.transactions, - reverse=(order == Qt.DescendingOrder), - key=key_getter[section]) - - self.layoutChanged.emit() - - def set_period(self, ts_from, ts_to): - """ - Filter table by given timestamps - """ - self.layoutAboutToBeChanged.emit() - logging.debug("Filtering from {0} to {1}".format(ts_from, ts_to)) - - def in_period(tx): - block = self.community.get_block(tx[0]) - return (block.mediantime in range(ts_from, ts_to)) - - self.transactions = self.account.transactions_sent(self.community) + \ - self.account.transactions_awaiting(self.community) + \ - self.account.transactions_received(self.community) - - self.transactions = [tx for tx in filter(in_period, self.transactions)] - - self.layoutChanged.emit() - def flags(self, index): return Qt.ItemIsSelectable | Qt.ItemIsEnabled -- GitLab