diff --git a/src/sakia/gui/navigation/identity/model.py b/src/sakia/gui/navigation/identity/model.py index 589e957673ab5456fbddb6e3fe30f1e7fa177b8e..952173b838b017fcfe4618fd6dcfc5528c08b447 100644 --- a/src/sakia/gui/navigation/identity/model.py +++ b/src/sakia/gui/navigation/identity/model.py @@ -53,9 +53,11 @@ class IdentityModel(QObject): 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) - certified = await self.identities_service.load_certified_by(identity) - await self.identities_service.load_certs_in_lookup(identity, certifiers, certified) + + # update identities in database from the network + await self.identities_service.initialize_certifications(identity, None, None) + + # update identities from database self.table_model.init_certifiers() def table_data(self, index): diff --git a/src/sakia/gui/navigation/identity/table_model.py b/src/sakia/gui/navigation/identity/table_model.py index 3297642c8ee55e259341569461f61c72071ec559..b8a499b08834d9d808583ae725adf30f615524cf 100644 --- a/src/sakia/gui/navigation/identity/table_model.py +++ b/src/sakia/gui/navigation/identity/table_model.py @@ -1,5 +1,5 @@ from sakia.errors import NoPeerAvailable -from sakia.data.entities import Identity +from sakia.data.entities import Identity, Certification from sakia.data.processors import BlockchainProcessor from PyQt5.QtCore import QAbstractTableModel, QSortFilterProxyModel, Qt, \ QDateTime, QModelIndex, QLocale, QT_TRANSLATE_NOOP @@ -16,7 +16,7 @@ class CertifiersFilterProxyModel(QSortFilterProxyModel): def columnCount(self, parent): return len(CertifiersTableModel.columns_ids) - 2 - + def lessThan(self, left, right): """ Sort table by given column number. @@ -108,47 +108,56 @@ class CertifiersTableModel(QAbstractTableModel): self.connection = connection self.blockchain_service = blockchain_service self.identities_service = identities_service - self._certifiers_data = [] + self._certifiers_data = list() - def certifier_data(self, certification): + def init_certifiers(self): + """ + Init table with data to display + """ + self.beginResetModel() + certifications = self.identities_service.certifications_received(self.connection.pubkey) + logging.debug("Refresh {0} certifiers".format(len(certifications))) + certifiers_data = [] + for certifier in certifications: + certifiers_data.append(self.certifier_data(certifier)) + + self._certifiers_data = certifiers_data + self.endResetModel() + + def certifier_data(self, certification: Certification) -> tuple: """ Return the identity in the form a tuple to display - :param sakia.data.entities.Certification certification: The certification to get data from + :param Certification certification: The certification to get data from :return: The certification data in the form of a tuple :rtype: tuple """ parameters = self.blockchain_service.parameters() publication_date = certification.timestamp - identity = self.identities_service.get_identity(certification.certifier) - if not identity: - identity = Identity(currency=certification.currency, pubkey=certification.certifier, uid="") written = certification.written_on >= 0 + if written: expiration_date = publication_date + parameters.sig_validity else: expiration_date = publication_date + parameters.sig_window - return identity.uid, identity.pubkey, publication_date, expiration_date, written, identity - def certifier_loaded(self, identity): - for i, idty in enumerate(self.identities_data): - if idty[CertifiersTableModel.columns_ids.index('identity')] == identity: - self._certifiers_data[i] = self._certifiers_data(identity) - self.dataChanged.emit(self.index(i, 0), self.index(i, len(CertifiersTableModel.columns_ids))) - return + identity = self.identities_service.get_identity(certification.certifier) + if not identity: + identity = Identity(currency=certification.currency, pubkey=certification.certifier, uid="") - def init_certifiers(self): - """ - Change the identities to display + return identity.uid, identity.pubkey, publication_date, expiration_date, written, identity + + def certifier_loaded(self, identity: Identity): """ - self.beginResetModel() - certifications = self.identities_service.certifications_received(self.connection.pubkey) - logging.debug("Refresh {0} certifiers".format(len(certifications))) - certifiers_data = [] - for certifier in certifications: - certifiers_data.append(self.certifier_data(certifier)) + Update identity of certifier after closing information window - self._certifiers_data = certifiers_data - self.endResetModel() + :param Identity identity: Updated identity of the certifier + :return: + """ + for i, certifier_data in enumerate(self._certifiers_data): + if certifier_data[CertifiersTableModel.columns_ids.index('identity')] == identity: + self._certifiers_data[i] = update_certifier_data_from_identity(certifier_data, identity) + self.dataChanged.emit(self.index(i, 0), self.index(i, len(CertifiersTableModel.columns_ids))) + return def rowCount(self, parent): return len(self._certifiers_data) @@ -170,3 +179,24 @@ class CertifiersTableModel(QAbstractTableModel): def flags(self, index): return Qt.ItemIsSelectable | Qt.ItemIsEnabled + + +####################### +# STATIC FUNCTIONS +####################### + + +def update_certifier_data_from_identity(certifier_data: tuple, identity: Identity) -> tuple: + """ + Return certifier data from updated identity + + :param tuple certifier_data: Certifier data list + :param Identity identity: Identity of the certifier + :return tuple: + """ + return identity.uid, \ + identity.pubkey, \ + certifier_data[CertifiersTableModel.columns_ids.index('publication')], \ + certifier_data[CertifiersTableModel.columns_ids.index('expiration')], \ + certifier_data[CertifiersTableModel.columns_ids.index('written')], \ + identity diff --git a/src/sakia/services/identities.py b/src/sakia/services/identities.py index efa457ff6298d8a53eb08d3c408d84a54eca0838..197f6757b66156b2ca28b9426182174cc3046086 100644 --- a/src/sakia/services/identities.py +++ b/src/sakia/services/identities.py @@ -75,7 +75,7 @@ class IdentitiesService(QObject): for c in connections: identities.append(self._identities_processor.get_identity(self.currency, c.pubkey)) return identities - + def is_identity_of_connection(self, identity): return identity.pubkey in self._connections_processor.pubkeys() @@ -237,30 +237,36 @@ class IdentitiesService(QObject): logging.debug(str(e)) return certifications - async def initialize_certifications(self, identity, log_stream, progress): + async def initialize_certifications(self, identity, log_stream=None, progress=None): """ Initialize certifications to and from a given identity :param sakia.data.entities.Identity identity: - :param function log_stream: - :param function progress: + :param function log_stream: Logger function + :param function progress: Progress function for progress bar """ - log_stream("Requesting certifiers of data") + if log_stream: + log_stream("Requesting certifiers of data") certifiers = await self.load_certifiers_of(identity) - log_stream("Requesting certified by data") + if log_stream: + log_stream("Requesting certified by data") certified = await self.load_certified_by(identity) - log_stream("Requesting lookup data") + if log_stream: + log_stream("Requesting lookup data") certifiers, certified = await self.load_certs_in_lookup(identity, certifiers, certified) - log_stream("Requesting identities of certifications") + if log_stream: + log_stream("Requesting identities of certifications") identities = [] i = 0 nb_certs = len(certified + certifiers) for cert in certifiers: - log_stream("Requesting identity... {0}/{1}".format(i, nb_certs)) + if log_stream: + log_stream("Requesting identity... {0}/{1}".format(i, nb_certs)) i += 1 - progress(1/nb_certs) + if progress: + progress(1/nb_certs) certifier = self.get_identity(cert.certifier) if not certifier: certifier = await self.find_from_pubkey(cert.certifier) @@ -268,16 +274,18 @@ class IdentitiesService(QObject): identities.append(certifier) for cert in certified: - log_stream("Requesting identity... {0}/{1}".format(i, nb_certs)) + if log_stream: + log_stream("Requesting identity... {0}/{1}".format(i, nb_certs)) i += 1 - progress(1/nb_certs) + if progress: + progress(1/nb_certs) certified = self.get_identity(cert.certified) if not certified: certified = await self.find_from_pubkey(cert.certified) certified = await self.load_requirements(certified) identities.append(certified) - - log_stream("Commiting identities...") + if log_stream: + log_stream("Commiting identities...") for idty in identities: self._identities_processor.insert_or_update_identity(idty) @@ -485,7 +493,7 @@ class IdentitiesService(QObject): """ Get the list of certifications received by a given identity :param str pubkey: the pubkey - :rtype: List[sakia.data.entities.Certifications] + :rtype: list[Certification] """ return self._certs_processor.certifications_received(self.currency, pubkey) @@ -493,6 +501,6 @@ class IdentitiesService(QObject): """ Get the list of certifications received by a given identity :param str pubkey: the pubkey - :rtype: List[sakia.data.entities.Certifications] + :rtype: list[Certification] """ return self._certs_processor.certifications_sent(self.currency, pubkey)