From 2d39a1d5feb91ecdd81c5d3b2c6e709e716eab78 Mon Sep 17 00:00:00 2001
From: inso <insomniak.fr@gmaiL.com>
Date: Mon, 27 Mar 2017 20:25:41 +0200
Subject: [PATCH] Adjusted timestamp display

---
 src/sakia/data/processors/blockchain.py       |  4 ++++
 src/sakia/gui/navigation/identities/model.py  |  2 +-
 .../gui/navigation/identities/table_model.py  | 12 ++++++++----
 .../gui/navigation/informations/model.py      | 19 ++++++++++++++++---
 .../gui/navigation/txhistory/table_model.py   |  7 +++++--
 5 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/src/sakia/data/processors/blockchain.py b/src/sakia/data/processors/blockchain.py
index 2dab8bb0..25b02eff 100644
--- a/src/sakia/data/processors/blockchain.py
+++ b/src/sakia/data/processors/blockchain.py
@@ -47,6 +47,10 @@ class BlockchainProcessor:
                 raise
         return 0, 0
 
+    def adjusted_ts(self, currency, timestamp):
+        parameters = self.parameters(currency)
+        return timestamp + parameters.median_time_blocks/2 * parameters.avg_gen_time
+
     async def timestamp(self, currency, block_number):
         try:
             block = await self._bma_connector.get(currency, bma.blockchain.block, {'number': block_number})
diff --git a/src/sakia/gui/navigation/identities/model.py b/src/sakia/gui/navigation/identities/model.py
index e91df361..8f35b8d8 100644
--- a/src/sakia/gui/navigation/identities/model.py
+++ b/src/sakia/gui/navigation/identities/model.py
@@ -31,7 +31,7 @@ class IdentitiesModel(QObject):
         Instanciate the table model of the view
         """
         identities_model = IdentitiesTableModel(self, self.blockchain_service, self.identities_service)
-        proxy = IdentitiesFilterProxyModel()
+        proxy = IdentitiesFilterProxyModel(self.app)
         proxy.setSourceModel(identities_model)
         self.table_model = proxy
         return self.table_model
diff --git a/src/sakia/gui/navigation/identities/table_model.py b/src/sakia/gui/navigation/identities/table_model.py
index 37cbae94..719c305f 100644
--- a/src/sakia/gui/navigation/identities/table_model.py
+++ b/src/sakia/gui/navigation/identities/table_model.py
@@ -1,4 +1,5 @@
 from sakia.errors import NoPeerAvailable
+from sakia.data.processors import BlockchainProcessor
 from PyQt5.QtCore import QAbstractTableModel, QSortFilterProxyModel, Qt, \
                         QDateTime, QModelIndex, QLocale, QT_TRANSLATE_NOOP
 from PyQt5.QtGui import QColor, QIcon, QFont
@@ -7,8 +8,9 @@ import asyncio
 
 
 class IdentitiesFilterProxyModel(QSortFilterProxyModel):
-    def __init__(self, parent=None):
+    def __init__(self, app, parent=None):
         super().__init__(parent)
+        self.blockchain_processor = BlockchainProcessor.instanciate(app)
 
     def columnCount(self, parent):
         return len(IdentitiesTableModel.columns_ids) - 1
@@ -22,7 +24,7 @@ class IdentitiesFilterProxyModel(QSortFilterProxyModel):
         right_data = source_model.data(right, Qt.DisplayRole)
         left_data = 0 if left_data is None else left_data
         right_data = 0 if right_data is None else right_data
-        return (left_data < right_data)
+        return left_data < right_data
 
     def data(self, index, role):
         source_index = self.mapToSource(index)
@@ -55,18 +57,20 @@ class IdentitiesFilterProxyModel(QSortFilterProxyModel):
                 if source_index.column() in (IdentitiesTableModel.columns_ids.index('renewed'),
                                              IdentitiesTableModel.columns_ids.index('expiration')):
                     if source_data:
+                        ts = self.blockchain_processor.adjusted_ts(self.connection.currency, source_data)
                         return QLocale.toString(
                             QLocale(),
-                            QDateTime.fromTime_t(source_data).date(),
+                            QDateTime.fromTime_t(ts).date(),
                             QLocale.dateFormat(QLocale(), QLocale.ShortFormat)
                         )
                     else:
                         return ""
                 if source_index.column() == IdentitiesTableModel.columns_ids.index('publication'):
                     if source_data:
+                        ts = self.blockchain_processor.adjusted_ts(self.connection.currency, source_data)
                         return QLocale.toString(
                             QLocale(),
-                            QDateTime.fromTime_t(source_data),
+                            QDateTime.fromTime_t(ts),
                             QLocale.dateTimeFormat(QLocale(), QLocale.LongFormat)
                         )
                     else:
diff --git a/src/sakia/gui/navigation/informations/model.py b/src/sakia/gui/navigation/informations/model.py
index 5f51e051..2ba9cd90 100644
--- a/src/sakia/gui/navigation/informations/model.py
+++ b/src/sakia/gui/navigation/informations/model.py
@@ -5,6 +5,7 @@ from PyQt5.QtCore import QLocale, QDateTime, pyqtSignal, QObject
 from sakia.errors import NoPeerAvailable
 from sakia.constants import ROOT_SERVERS
 from sakia.money import Referentials
+from sakia.data.processors import BlockchainProcessor
 from duniterpy.api import errors
 
 
@@ -28,6 +29,7 @@ class InformationsModel(QObject):
         super().__init__(parent)
         self.app = app
         self.connection = connection
+        self.blockchain_processor = BlockchainProcessor.instanciate(app)
         self.blockchain_service = blockchain_service
         self.identities_service = identities_service
         self.sources_service = sources_service
@@ -76,19 +78,29 @@ class InformationsModel(QObject):
             localized_data['mass'] = self.app.current_ref.instance(self.blockchain_service.current_mass(),
                                               self.connection.currency, self.app).localized(False, True)
 
+            ud_median_time = self.blockchain_service.last_ud_time()
+            ud_median_time = self.blockchain_processor.adjusted_ts(self.app.currency, ud_median_time)
+
             localized_data['ud_median_time'] = QLocale.toString(
                 QLocale(),
-                QDateTime.fromTime_t(self.blockchain_service.last_ud_time()),
+                QDateTime.fromTime_t(ud_median_time),
                 QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
             )
+
+            next_ud_median_time = self.blockchain_service.last_ud_time() + params.dt
+            next_ud_median_time = self.blockchain_processor.adjusted_ts(self.app.currency, next_ud_median_time)
+
             localized_data['next_ud_median_time'] = QLocale.toString(
                 QLocale(),
-                QDateTime.fromTime_t(self.blockchain_service.last_ud_time() + params.dt),
+                QDateTime.fromTime_t(next_ud_median_time),
                 QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
             )
+
+            next_ud_reeval = self.blockchain_service.next_ud_reeval()
+            next_ud_reeval = self.blockchain_processor.adjusted_ts(self.app.currency, next_ud_reeval)
             localized_data['next_ud_reeval'] = QLocale.toString(
                 QLocale(),
-                QDateTime.fromTime_t(self.blockchain_service.next_ud_reeval()),
+                QDateTime.fromTime_t(next_ud_reeval),
                 QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
             )
 
@@ -108,6 +120,7 @@ class InformationsModel(QObject):
                     localized_data['actual_growth'] = (last_ud * math.pow(10, last_ud_base)) / (
                     previous_monetary_mass / members_count)
 
+                previous_ud_time = self.blockchain_processor.adjusted_ts(self.app.currency, previous_ud_time)
                 localized_data['ud_median_time_minus_1'] = QLocale.toString(
                     QLocale(),
                     QDateTime.fromTime_t(previous_ud_time),
diff --git a/src/sakia/gui/navigation/txhistory/table_model.py b/src/sakia/gui/navigation/txhistory/table_model.py
index dee4afc0..171b9837 100644
--- a/src/sakia/gui/navigation/txhistory/table_model.py
+++ b/src/sakia/gui/navigation/txhistory/table_model.py
@@ -23,6 +23,7 @@ class TxFilterProxyModel(QSortFilterProxyModel):
         self.ts_from = ts_from
         self.ts_to = ts_to
         self.blockchain_service = blockchain_service
+        self.blockchain_processor = BlockchainProcessor.instanciate(blockchain_service.app)
 
     def set_period(self, ts_from, ts_to):
         """
@@ -95,9 +96,10 @@ class TxFilterProxyModel(QSortFilterProxyModel):
             if source_index.column() == model.columns_types.index('uid'):
                 return "<p>" + source_data.replace('\n', "<br>") + "</p>"
             if source_index.column() == model.columns_types.index('date'):
+                ts = self.blockchain_processor.adjusted_ts(model.connection.currency, source_data)
                 return QLocale.toString(
                     QLocale(),
-                    QDateTime.fromTime_t(source_data).date(),
+                    QDateTime.fromTime_t(ts).date(),
                     QLocale.dateFormat(QLocale(), QLocale.ShortFormat)
                 )
             if source_index.column() == model.columns_types.index('amount'):
@@ -141,7 +143,8 @@ class TxFilterProxyModel(QSortFilterProxyModel):
 
         if role == Qt.ToolTipRole:
             if source_index.column() == model.columns_types.index('date'):
-                return QDateTime.fromTime_t(source_data).toString(Qt.SystemLocaleLongDate)
+                ts = self.blockchain_processor.adjusted_ts(model.connection.currency, source_data)
+                return QDateTime.fromTime_t(ts).toString(Qt.SystemLocaleLongDate)
 
             if state_data == Transaction.VALIDATED or state_data == Transaction.AWAITING:
                 if current_confirmations >= MAX_CONFIRMATIONS:
-- 
GitLab