From 561dcbfa661202d151a5d126ba87d17c46793dd0 Mon Sep 17 00:00:00 2001
From: inso <insomniak.fr@gmaiL.com>
Date: Wed, 10 May 2017 22:22:43 +0200
Subject: [PATCH] Fix crash with certifications expiring

---
 src/sakia/data/repositories/certifications.py    |  2 +-
 src/sakia/gui/navigation/identity/controller.py  |  1 +
 src/sakia/gui/navigation/identity/model.py       |  2 +-
 src/sakia/gui/navigation/identity/table_model.py | 10 ++++++++++
 src/sakia/gui/sub/user_information/controller.py |  5 +++--
 5 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/sakia/data/repositories/certifications.py b/src/sakia/data/repositories/certifications.py
index ad571c4a..2ae93580 100644
--- a/src/sakia/data/repositories/certifications.py
+++ b/src/sakia/data/repositories/certifications.py
@@ -90,7 +90,7 @@ class CertificationsRepo:
         """
         request = """SELECT * FROM certifications
                   WHERE currency=? AND (certifier=? or certified=?)
-                  AND ((ts + ? < ?) or (written_on == 0 and ts + ? < ?))
+                  AND ((ts + ? < ?) or (written_on == -1 and ts + ? < ?))
                   """
         c = self._conn.execute(request, (currency, pubkey, pubkey,
                                          sig_validity, current_ts,
diff --git a/src/sakia/gui/navigation/identity/controller.py b/src/sakia/gui/navigation/identity/controller.py
index 7ec8d197..cc796ac0 100644
--- a/src/sakia/gui/navigation/identity/controller.py
+++ b/src/sakia/gui/navigation/identity/controller.py
@@ -70,6 +70,7 @@ class IdentityController(QObject):
         if valid:
             menu = ContextMenu.from_data(self.view, self.model.app, None, (identity,))
             menu.view_identity_in_wot.connect(self.view_in_wot)
+            menu.identity_information_loaded.connect(self.model.table_model.certifier_loaded)
 
             # Show the context menu.
             menu.qmenu.popup(QCursor.pos())
diff --git a/src/sakia/gui/navigation/identity/model.py b/src/sakia/gui/navigation/identity/model.py
index bc7c6cfe..589e9576 100644
--- a/src/sakia/gui/navigation/identity/model.py
+++ b/src/sakia/gui/navigation/identity/model.py
@@ -52,9 +52,9 @@ class IdentityModel(QObject):
 
     async def refresh_identity_data(self):
         identity = self.identities_service.get_identity(self.connection.pubkey, self.connection.uid)
-        certified = self.identities_service.certifications_sent(self.connection.pubkey)
         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)
         self.table_model.init_certifiers()
 
diff --git a/src/sakia/gui/navigation/identity/table_model.py b/src/sakia/gui/navigation/identity/table_model.py
index 63a8e81c..3297642c 100644
--- a/src/sakia/gui/navigation/identity/table_model.py
+++ b/src/sakia/gui/navigation/identity/table_model.py
@@ -1,4 +1,5 @@
 from sakia.errors import NoPeerAvailable
+from sakia.data.entities import Identity
 from sakia.data.processors import BlockchainProcessor
 from PyQt5.QtCore import QAbstractTableModel, QSortFilterProxyModel, Qt, \
                         QDateTime, QModelIndex, QLocale, QT_TRANSLATE_NOOP
@@ -119,6 +120,8 @@ class CertifiersTableModel(QAbstractTableModel):
         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
@@ -126,6 +129,13 @@ class CertifiersTableModel(QAbstractTableModel):
             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
+
     def init_certifiers(self):
         """
         Change the identities to display
diff --git a/src/sakia/gui/sub/user_information/controller.py b/src/sakia/gui/sub/user_information/controller.py
index a54de72e..4207ba73 100644
--- a/src/sakia/gui/sub/user_information/controller.py
+++ b/src/sakia/gui/sub/user_information/controller.py
@@ -1,6 +1,7 @@
 from PyQt5.QtWidgets import QDialog, QTabWidget, QVBoxLayout
 from PyQt5.QtCore import QObject, pyqtSignal
 from sakia.decorators import asyncify
+from sakia.data.entities import Identity
 from sakia.gui.widgets.dialogs import dialog_async_exec, QAsyncMessageBox
 from .model import UserInformationModel
 from .view import UserInformationView
@@ -11,7 +12,7 @@ class UserInformationController(QObject):
     """
     The homescreen view
     """
-    identity_loaded = pyqtSignal()
+    identity_loaded = pyqtSignal(Identity)
 
     def __init__(self, parent, view, model):
         """
@@ -72,7 +73,7 @@ class UserInformationController(QObject):
                                                       self.model.identity.membership_timestamp,
                                                       self.model.mstime_remaining(), await self.model.nb_certs())
                 self.view.hide_busy()
-                self.identity_loaded.emit()
+                self.identity_loaded.emit(self.model.identity)
         except RuntimeError as e:
             # object can be deleted by Qt during asynchronous ops
             # we don't care of this error
-- 
GitLab