diff --git a/src/sakia/gui/navigation/identity/controller.py b/src/sakia/gui/navigation/identity/controller.py index e8508152e2071ac3cbc31fbfa0d7725046c446de..7ec8d197076265c627751ad0b6fe692ab38e90cb 100644 --- a/src/sakia/gui/navigation/identity/controller.py +++ b/src/sakia/gui/navigation/identity/controller.py @@ -37,6 +37,7 @@ class IdentityController(QObject): self.certification = certification self._logger = logging.getLogger('sakia') self.view.button_membership.clicked.connect(self.send_join_demand) + self.view.button_refresh.clicked.connect(self.refresh_certs) @classmethod def create(cls, parent, app, connection, blockchain_service, identities_service, sources_service): @@ -70,11 +71,6 @@ class IdentityController(QObject): menu = ContextMenu.from_data(self.view, self.model.app, None, (identity,)) menu.view_identity_in_wot.connect(self.view_in_wot) - menu.qmenu.addSeparator().setText("Certifications") - refresh_certs = QAction(menu.qmenu.tr("Refresh"), menu.qmenu.parent()) - refresh_certs.triggered.connect(self.refresh_certs) - menu.qmenu.addAction(refresh_certs) - # Show the context menu. menu.qmenu.popup(QCursor.pos()) @@ -96,7 +92,8 @@ class IdentityController(QObject): @asyncify async def refresh_certs(self, checked=False): self.view.table_certifiers.setEnabled(False) - await self.model.refresh_certifications() + await self.model.refresh_identity_data() + self.refresh_localized_data() self.view.table_certifiers.setEnabled(True) def refresh_localized_data(self): diff --git a/src/sakia/gui/navigation/identity/identity.ui b/src/sakia/gui/navigation/identity/identity.ui index 90d2d5db65f6406f909db5f42c4de007f5c4b8da..1c3fd32caa5fe4f7a21a69f28a80602242518f34 100644 --- a/src/sakia/gui/navigation/identity/identity.ui +++ b/src/sakia/gui/navigation/identity/identity.ui @@ -86,15 +86,43 @@ QGroupBox::title { <item row="0" column="0"> <widget class="QGroupBox" name="group_uid_state"> <property name="title"> - <string>Identity</string> + <string>Membership status</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> - <widget class="QLabel" name="label_currency"> - <property name="text"> - <string/> - </property> - </widget> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QLabel" name="label_written"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="button_refresh"> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset resource="../../../../../res/icons/icons.qrc"> + <normaloff>:/icons/refresh_icon</normaloff>:/icons/refresh_icon</iconset> + </property> + </widget> + </item> + </layout> </item> <item> <widget class="QLabel" name="label_identity"> diff --git a/src/sakia/gui/navigation/identity/model.py b/src/sakia/gui/navigation/identity/model.py index 7b23c0147d41e688c2b6eb335139012e8f42bd97..4a63205f4bff5e18d63027790372a63abbf365b9 100644 --- a/src/sakia/gui/navigation/identity/model.py +++ b/src/sakia/gui/navigation/identity/model.py @@ -50,8 +50,9 @@ class IdentityModel(QObject): self.table_model.init_certifiers() return self.proxy_model - async def refresh_certifications(self): + async def refresh_identity_data(self): identity = self.identities_service.get_identity(self.connection.pubkey, self.connection.uid) + identity = await self.identities_service.load_requirements(identity) certifiers = await self.identities_service.load_certifiers_of(identity) await self.identities_service.load_certs_in_lookup(identity, certifiers, []) self.table_model.init_certifiers() @@ -165,9 +166,13 @@ class IdentityModel(QObject): self.app).localized(False, True) outdistanced_text = self.tr("Outdistanced") is_identity = False + written = False is_member = False nb_certs = 0 mstime_remaining = 0 + identity_expiration = 0 + identity_expired = False + outdistanced = False nb_certs_required = self.blockchain_service.parameters().sig_qty if self.connection.uid: @@ -177,6 +182,13 @@ class IdentityModel(QObject): if identity: mstime_remaining = self.identities_service.ms_time_remaining(identity) is_member = identity.member + outdistanced = identity.outdistanced + written = identity.written + if not written: + identity_expiration = identity.timestamp + self.parameters().sig_window + identity_expired = identity_expiration < self.blockchain_processor.time(self.connection.currency) + identity_expiration = self.blockchain_processor.adjusted_ts(self.app.currency, + identity_expiration) nb_certs = len(self.identities_service.certifications_received(identity.pubkey)) if not identity.outdistanced: outdistanced_text = self.tr("In WoT range") @@ -187,7 +199,11 @@ class IdentityModel(QObject): self._logger.error(str(e)) return { + 'written': written, + 'idty_expired': identity_expired, + 'idty_expiration': identity_expiration, 'amount': localized_amount, + 'is_outdistanced': outdistanced, 'outdistanced': outdistanced_text, 'nb_certs': nb_certs, 'nb_certs_required': nb_certs_required, diff --git a/src/sakia/gui/navigation/identity/view.py b/src/sakia/gui/navigation/identity/view.py index 7cd6d5c0ad5f530a70b10b3d3f242193d73f274a..40edf46c1ac566bd4b4eb1961d368cb082bb200a 100644 --- a/src/sakia/gui/navigation/identity/view.py +++ b/src/sakia/gui/navigation/identity/view.py @@ -1,5 +1,5 @@ from PyQt5.QtWidgets import QWidget, QMessageBox, QAbstractItemView, QHeaderView -from PyQt5.QtCore import QEvent, QLocale, pyqtSignal, Qt +from PyQt5.QtCore import QEvent, QLocale, pyqtSignal, Qt, QDateTime from .identity_uic import Ui_IdentityWidget from enum import Enum from sakia.helpers import timestamp_to_dhms @@ -54,6 +54,17 @@ class IdentityView(QWidget, Ui_IdentityWidget): message=IdentityView.simple_message[state])) self.button_membership.hide() else: + if data['written']: + written_value = self.tr("Identity written in blockchain") + else: + expiration_text = QLocale.toString( + QLocale(), + QDateTime.fromTime_t(data['idty_expiration']), + QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat) + ) + written_value = self.tr("Identity not written in blockchain") + \ + " (" + self.tr("Expires on : {0}").format(expiration_text) + ")" + status_value = self.tr("Member") if data['membership_state'] else self.tr("Non-Member") if data['mstime'] > 0: membership_action_value = self.tr("Renew membership") @@ -84,29 +95,46 @@ class IdentityView(QWidget, Ui_IdentityWidget): else: mstime_remaining_text = self.tr("Expired or never published") - status_color = '#00AA00' if data['membership_state'] else self.tr('#FF0000') + ms_status_color = '#00AA00' if data['membership_state'] else '#FF0000' + outdistanced_status_color = '#FF0000' if data['is_outdistanced'] else '#00AA00' + if data['written']: + written_status_color = "#00AA00" + elif data['idty_expired']: + written_status_color = "#FF0000" + else: + written_status_color = '#FF6347' description_membership = """<html> <body> <p><span style="font-weight:600;">{status_label}</span> - : <span style="color:{status_color};">{status}</span> + : <span style="color:{ms_status_color};">{status}</span> - <span>{status_info}</span></p> </body> -</html>""".format(status_color=status_color, +</html>""".format(ms_status_color=ms_status_color, status_label=self.tr("Status"), status=status_value, status_info=status_info) description_identity = """<html> <body> - <p><span style="font-weight:600;">{nb_certs_label}</span> : {nb_certs} ({outdistanced_text})</p> + <p><span style="font-weight:600;">{nb_certs_label}</span> : {nb_certs} <span style="color:{outdistanced_status_color};">({outdistanced_text})</span></p> <p><span style="font-weight:600;">{mstime_remaining_label}</span> : {mstime_remaining}</p> </body> </html>""".format(nb_certs_label=self.tr("Certs. received"), nb_certs=data['nb_certs'], outdistanced_text=data['outdistanced'], + outdistanced_status_color=outdistanced_status_color, mstime_remaining_label=self.tr("Membership"), mstime_remaining=mstime_remaining_text) + self.label_written.setText(""" +<html> +<body> + <p><span style="font-weight:450; color:{written_status_color};">{written_label}</span></p> +</body> +</html> +""".format(written_label=written_value, + written_status_color=written_status_color)) + if data['is_identity']: self.label_membership.setText(description_membership) self.label_identity.setText(description_identity)