diff --git a/src/cutecoin/core/person.py b/src/cutecoin/core/person.py index 4a45013fc17bde456fe64859a9f9ef2e0976cd72..276ef0e0fa752a4124bcb56051d9d26e0aa12c29 100644 --- a/src/cutecoin/core/person.py +++ b/src/cutecoin/core/person.py @@ -6,6 +6,7 @@ Created on 11 févr. 2014 import logging import functools +import time from ucoinpy.api import bma from ucoinpy import PROTOCOL_VERSION @@ -416,6 +417,14 @@ class Person(object): unique_valid.append(certified) return unique_valid + def membership_expiration_time(self, community): + join_block = self.membership(community)['blockNumber'] + join_date = community.get_block(join_block).mediantime + parameters = community.parameters + expiration_date = join_date + parameters['sigValidity'] + current_time = time.time() + return expiration_date - current_time + def reload(self, func, community): ''' Reload a cached property of this person in a community. diff --git a/src/cutecoin/gui/currency_tab.py b/src/cutecoin/gui/currency_tab.py index 89fee312e41bde2a9933afd90f61a282d5dd0352..1f3efa89fd9c5f8d7ec377060bea5e77ead670be 100644 --- a/src/cutecoin/gui/currency_tab.py +++ b/src/cutecoin/gui/currency_tab.py @@ -37,6 +37,13 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): self.community = community self.password_asker = password_asker self.status_label = status_label + + self.status_info = [] + self.status_infotext = {'membership_expire_soon': + self.tr("Warning : Your membership is expiring soon."), + 'warning_certifications': + self.tr("Warning : Your could miss certifications soon.") + } self.tab_community = CommunityTabWidget(self.app, self.app.current_account, self.community, @@ -57,26 +64,6 @@ class CurrencyTabWidget(QWidget, Ui_CurrencyTabWidget): bc_watcher.watching_stopped.connect(self.refresh_data) bc_watcher.new_transfers.connect(self.notify_transfers) - person = Person.lookup(self.app.current_account.pubkey, self.community) - try: - join_block = person.membership(self.community)['blockNumber'] - join_date = self.community.get_block(join_block).mediantime - parameters = self.community.parameters - expiration_date = join_date + parameters['sigValidity'] - current_time = time.time() - sig_validity = self.community.parameters['sigValidity'] - warning_expiration_time = int(sig_validity / 3) - will_expire_soon = (current_time > expiration_date - warning_expiration_time) - - logging.debug("Try") - if will_expire_soon: - days = QDateTime().currentDateTime().daysTo(QDateTime.fromTime_t(expiration_date)) - if days > 0: - toast.display(self.tr("Membership expiration"), -self.tr("<b>Warning : Membership expiration in {0} days</b>").format(days)) - except MembershipNotFoundError as e: - pass - def refresh(self): if self.app.current_account is None: self.tabs_account.setEnabled(False) @@ -142,6 +129,31 @@ self.tr("<b>Warning : Membership expiration in {0} days</b>").format(days)) @param: block_number: The number of the block mined ''' logging.debug("Refresh block") + self.status_info.clear() + try: + person = Person.lookup(self.app.current_account.pubkey, self.community) + expiration_time = person.membership_expiration_time(self.community) + sig_validity = self.community.parameters['sigValidity'] + warning_expiration_time = int(sig_validity / 3) + will_expire_soon = (expiration_time < warning_expiration_time) + + logging.debug("Try") + if will_expire_soon: + days = int(expiration_time / 3600 / 24) + if days > 0: + self.status_info.append('membership_expire_soon') + toast.display(self.tr("Membership expiration"), + self.tr("<b>Warning : Membership expiration in {0} days</b>").format(days)) + certifiers_of = person.unique_valid_certifiers_of(self.community) + if len(certifiers_of) < self.community.parameters['sigQty']: + self.status_info.append('warning_certifications') + toast.display(self.tr("Certifications number"), + self.tr("<b>Warning : You are certified by only {0} persons, need {1}</b>").format(len(certifiers_of), + self.community.parameters['sigQty'])) + + except MembershipNotFoundError as e: + pass + self.tab_history.start_progress() self.app.monitor.blockchain_watcher(self.community).thread().start() self.app.monitor.persons_watcher(self.community).thread().start() @@ -175,7 +187,11 @@ self.tr("<b>Warning : Membership expiration in {0} days</b>").format(days)) icon = '<img src=":/icons/weak_connect" width="12" height="12"/>' else: icon = '<img src=":/icons/disconnected" width="12" height="12"/>' - self.status_label.setText("{0}{1}".format(icon, text)) + status_infotext = " - ".join([self.status_infotext[info] for info in self.status_info]) + label_text = "{0}{1}".format(icon, text) + if status_infotext != "": + label_text += " - {0}".format(status_infotext) + self.status_label.setText("{0}{1}{2}".format(icon, text, status_infotext)) @pyqtSlot(list) def notify_transfers(self, transfers_list): diff --git a/src/cutecoin/gui/transactions_tab.py b/src/cutecoin/gui/transactions_tab.py index 01bcb08735432283c8928f291b2d96be4c512067..1e085303356c79fb31c68834f222e66c6e0e21b8 100644 --- a/src/cutecoin/gui/transactions_tab.py +++ b/src/cutecoin/gui/transactions_tab.py @@ -118,12 +118,12 @@ class TransactionsTabWidget(QWidget, Ui_transactionsTabWidget): if index.row() < model.rowCount(QModelIndex()): menu = QMenu(self.tr("Actions"), self) source_index = model.mapToSource(index) - state_col = model.sourceModel().columns_types.index('state') + state_col = model.sourceModel().column_types.index('state') state_index = model.sourceModel().index(source_index.row(), state_col) state_data = model.sourceModel().data(state_index, Qt.DisplayRole) - pubkey_col = model.sourceModel().columns_types.index('pubkey') + pubkey_col = model.sourceModel().column_types.index('pubkey') person_index = model.sourceModel().index(source_index.row(), pubkey_col) person = model.sourceModel().data(person_index, Qt.DisplayRole) diff --git a/src/cutecoin/models/network.py b/src/cutecoin/models/network.py index bb10397b3a26e2f82f07f1fbd53bee758778c99e..258007ea6c84f6724bd24a8fb97d4467cb7a7454 100644 --- a/src/cutecoin/models/network.py +++ b/src/cutecoin/models/network.py @@ -52,19 +52,19 @@ class NetworkFilterProxyModel(QSortFilterProxyModel): if not source_index.isValid(): return QVariant() source_data = source_model.data(source_index, role) - if index.column() == self.sourceModel().columns_types.index('is_member') \ + if index.column() == self.sourceModel().column_types.index('is_member') \ and role == Qt.DisplayRole: value = {True: 'yes', False: 'no', None: 'offline'} return value[source_data] if role == Qt.TextAlignmentRole: - if source_index.column() == source_model.columns_types.index('address') or source_index.column() == self.sourceModel().columns_types.index('current_block'): + if source_index.column() == source_model.column_types.index('address') or source_index.column() == self.sourceModel().column_types.index('current_block'): return Qt.AlignRight | Qt.AlignVCenter - if source_index.column() == source_model.columns_types.index('is_member'): + if source_index.column() == source_model.column_types.index('is_member'): return Qt.AlignCenter if role == Qt.FontRole: - is_root_col = source_model.columns_types.index('is_root') + is_root_col = source_model.column_types.index('is_root') index_root_col = source_model.index(source_index.row(), is_root_col) if source_model.data(index_root_col, Qt.DisplayRole): font = QFont() @@ -85,7 +85,7 @@ class NetworkTableModel(QAbstractTableModel): ''' super().__init__(parent) self.community = community - self.columns_types = ( + self.column_types = ( 'address', 'port', 'current_block', @@ -115,13 +115,13 @@ class NetworkTableModel(QAbstractTableModel): return len(self.nodes) def columnCount(self, parent): - return len(self.columns_types) + return len(self.column_types) def headerData(self, section, orientation, role): if role != Qt.DisplayRole: return QVariant() - return self.columns_types[section] + return self.column_types[section] def data_node(self, node: Node) -> tuple: """ diff --git a/src/cutecoin/models/txhistory.py b/src/cutecoin/models/txhistory.py index 3b214211102b3c5515a34c89198b65d54ced78c0..a704fc9674397728b95ac6d0e04002018f17c8e7 100644 --- a/src/cutecoin/models/txhistory.py +++ b/src/cutecoin/models/txhistory.py @@ -40,20 +40,20 @@ class TxFilterProxyModel(QSortFilterProxyModel): return date_ts in range(self.ts_from, self.ts_to) source_model = self.sourceModel() - date_col = source_model.columns_types.index('date') + date_col = source_model.column_types.index('date') source_index = source_model.index(sourceRow, date_col) date = source_model.data(source_index, Qt.DisplayRole) if in_period(date): # calculate sum total payments payment = source_model.data( - source_model.index(sourceRow, source_model.columns_types.index('payment')), + source_model.index(sourceRow, source_model.column_types.index('payment')), Qt.DisplayRole ) if payment: self.payments += int(payment) # calculate sum total deposits deposit = source_model.data( - source_model.index(sourceRow, source_model.columns_types.index('deposit')), + source_model.index(sourceRow, source_model.column_types.index('deposit')), Qt.DisplayRole ) if deposit: @@ -81,7 +81,7 @@ class TxFilterProxyModel(QSortFilterProxyModel): elif right_data == "": return self.sortOrder() == Qt.AscendingOrder if left_data == right_data: - txid_col = source_model.columns_types.index('txid') + txid_col = source_model.column_types.index('txid') txid_left = source_model.index(left.row(), txid_col) txid_right = source_model.index(right.row(), txid_col) return (txid_left < txid_right) @@ -92,17 +92,17 @@ class TxFilterProxyModel(QSortFilterProxyModel): source_index = self.mapToSource(index) model = self.sourceModel() source_data = model.data(source_index, role) - state_col = model.columns_types.index('state') + state_col = model.column_types.index('state') state_index = model.index(source_index.row(), state_col) state_data = model.data(state_index, Qt.DisplayRole) if role == Qt.DisplayRole: - if source_index.column() == model.columns_types.index('uid'): + if source_index.column() == model.column_types.index('uid'): return source_data - if source_index.column() == model.columns_types.index('date'): + if source_index.column() == model.column_types.index('date'): date = QDateTime.fromTime_t(source_data) return date.date() - if source_index.column() == model.columns_types.index('payment') or \ - source_index.column() == model.columns_types.index('deposit'): + if source_index.column() == model.column_types.index('payment') or \ + source_index.column() == model.column_types.index('deposit'): if source_data is not "": amount_ref = self.account.units_to_diff_ref(source_data, self.community) @@ -130,14 +130,14 @@ class TxFilterProxyModel(QSortFilterProxyModel): return QColor(Qt.blue) if role == Qt.TextAlignmentRole: - if source_index.column() == self.sourceModel().columns_types.index( - 'deposit') or source_index.column() == self.sourceModel().columns_types.index('payment'): + if source_index.column() == self.sourceModel().column_types.index( + 'deposit') or source_index.column() == self.sourceModel().column_types.index('payment'): return Qt.AlignRight | Qt.AlignVCenter - if source_index.column() == self.sourceModel().columns_types.index('date'): + if source_index.column() == self.sourceModel().column_types.index('date'): return Qt.AlignCenter if role == Qt.ToolTipRole: - if source_index.column() == self.sourceModel().columns_types.index('date'): + if source_index.column() == self.sourceModel().column_types.index('date'): return QDateTime.fromTime_t(source_data).toString(Qt.SystemLocaleLongDate) return source_data @@ -159,7 +159,7 @@ class HistoryTableModel(QAbstractTableModel): self.transfers_data = [] self.refresh_transfers() - self.columns_types = ( + self.column_types = ( 'date', 'uid', 'payment', @@ -234,11 +234,11 @@ class HistoryTableModel(QAbstractTableModel): return len(self.transfers) def columnCount(self, parent): - return len(self.columns_types) + return len(self.column_types) def headerData(self, section, orientation, role): if role == Qt.DisplayRole: - if self.columns_types[section] == 'payment' or self.columns_types[section] == 'deposit': + if self.column_types[section] == 'payment' or self.column_types[section] == 'deposit': return '{:}\n({:})'.format( self.column_headers[section], self.account.diff_ref_name(self.community.short_currency)