From 9ec4cb93d2b5874469865a53b870e2a956aba543 Mon Sep 17 00:00:00 2001
From: inso <insomniak.fr@gmaiL.com>
Date: Wed, 11 Jan 2017 19:31:28 +0100
Subject: [PATCH] Handle new dividends

---
 src/sakia/app.py                              |  5 ++-
 src/sakia/gui/navigation/txhistory/model.py   |  1 +
 .../gui/navigation/txhistory/table_model.py   | 31 ++++++++++---------
 src/sakia/gui/widgets/context_menu.py         |  3 +-
 src/sakia/services/blockchain.py              |  5 ++-
 src/sakia/services/transactions.py            | 14 ++++++---
 6 files changed, 35 insertions(+), 24 deletions(-)

diff --git a/src/sakia/app.py b/src/sakia/app.py
index 57daa5bc..dd3df9b3 100644
--- a/src/sakia/app.py
+++ b/src/sakia/app.py
@@ -4,15 +4,13 @@ import logging
 
 import aiohttp
 from PyQt5.QtCore import QObject, pyqtSignal, QTranslator, QCoreApplication, QLocale
-from aiohttp.connector import ProxyConnector
-
 from . import __version__
 from .options import SakiaOptions
 from sakia.data.connectors import BmaConnector
 from sakia.services import NetworkService, BlockchainService, IdentitiesService, \
     SourcesServices, TransactionsService, DocumentsService
 from sakia.data.repositories import SakiaDatabase
-from sakia.data.entities import Transaction, Connection, Identity
+from sakia.data.entities import Transaction, Connection, Identity, Dividend
 from sakia.data.processors import BlockchainProcessor, NodesProcessor, IdentitiesProcessor, \
     CertificationsProcessor, SourcesProcessor, TransactionsProcessor, ConnectionsProcessor, DividendsProcessor
 from sakia.data.files import AppDataFile, UserParametersFile
@@ -43,6 +41,7 @@ class Application(QObject):
     :param sakia.services.DocumentsService documents_service: A service to broadcast documents
     """
 
+    new_dividend = pyqtSignal(Dividend)
     new_transfer = pyqtSignal(Transaction)
     transaction_state_changed = pyqtSignal(Transaction)
     identity_changed = pyqtSignal(Identity)
diff --git a/src/sakia/gui/navigation/txhistory/model.py b/src/sakia/gui/navigation/txhistory/model.py
index 9dbf2ebe..f94c29ca 100644
--- a/src/sakia/gui/navigation/txhistory/model.py
+++ b/src/sakia/gui/navigation/txhistory/model.py
@@ -48,6 +48,7 @@ class TxHistoryModel(QObject):
         self._proxy.setSortRole(Qt.DisplayRole)
         self._model.init_transfers()
         self.app.new_transfer.connect(self._model.add_transfer)
+        self.app.new_dividend.connect(self._model.add_dividend)
         self.app.transaction_state_changed.connect(self._model.change_transfer)
         self.app.referential_changed.connect(self._model.modelReset)
 
diff --git a/src/sakia/gui/navigation/txhistory/table_model.py b/src/sakia/gui/navigation/txhistory/table_model.py
index 2ccfeab0..24a58567 100644
--- a/src/sakia/gui/navigation/txhistory/table_model.py
+++ b/src/sakia/gui/navigation/txhistory/table_model.py
@@ -212,23 +212,26 @@ class HistoryTableModel(QAbstractTableModel):
 
     def add_transfer(self, transfer):
         self.beginInsertRows(QModelIndex(), 0, 0)
-        if isinstance(transfer, Transaction):
-            if transfer.issuer == self.connection.pubkey:
-                self.transfers_data.append(self.data_sent(transfer))
-            else:
-                self.transfers_data.append(self.data_received(transfer))
+        if transfer.issuer == self.connection.pubkey:
+            self.transfers_data.append(self.data_sent(transfer))
+        else:
+            self.transfers_data.append(self.data_received(transfer))
+        self.endInsertRows()
+
+    def add_dividend(self, dividend):
+        self.beginInsertRows(QModelIndex(), 0, 0)
+        self.transfers_data.append(self.data_dividend(dividend))
         self.endInsertRows()
 
     def change_transfer(self, transfer):
-        if isinstance(transfer, Transaction):
-            for i, data in enumerate(self.transfers_data):
-                if data[self.columns_types.index('txhash')] == transfer.sha_hash:
-                    if transfer.issuer == self.connection.pubkey:
-                        self.transfers_data[self.columns_types.index('txhash')] = self.data_sent(transfer)
-                    else:
-                        self.transfers_data[self.columns_types.index('txhash')] = self.data_received(transfer)
-                    self.dataChanged.emit(self.index(i, 0), self.index(i, len(self.columns_types)))
-                    return
+        for i, data in enumerate(self.transfers_data):
+            if data[self.columns_types.index('txhash')] == transfer.sha_hash:
+                if transfer.issuer == self.connection.pubkey:
+                    self.transfers_data[self.columns_types.index('txhash')] = self.data_sent(transfer)
+                else:
+                    self.transfers_data[self.columns_types.index('txhash')] = self.data_received(transfer)
+                self.dataChanged.emit(self.index(i, 0), self.index(i, len(self.columns_types)))
+                return
 
     def data_received(self, transfer):
         """
diff --git a/src/sakia/gui/widgets/context_menu.py b/src/sakia/gui/widgets/context_menu.py
index 3ceacbbb..13072b76 100644
--- a/src/sakia/gui/widgets/context_menu.py
+++ b/src/sakia/gui/widgets/context_menu.py
@@ -127,7 +127,8 @@ class ContextMenu(QObject):
             UserInformationController.show_identity(self.parent(), self._app, self._connection.currency, identity)
             self.identity_information_loaded.emit(identity)
         else:
-            UserInformationController.open_dialog(self.parent(), self._app, self._connection.currency, identity)
+            UserInformationController.search_and_show_pubkey(self.parent(), self._app, self._connection.currency,
+                                                             identity.pubkey)
 
 
     @asyncify
diff --git a/src/sakia/services/blockchain.py b/src/sakia/services/blockchain.py
index 222c9ea7..239b3a17 100644
--- a/src/sakia/services/blockchain.py
+++ b/src/sakia/services/blockchain.py
@@ -42,13 +42,16 @@ class BlockchainService(QObject):
             blocks = await self._blockchain_processor.blocks(with_identities + with_money + [network_blockstamp.number],
                                                              self.currency)
             identities = await self._identities_service.handle_new_blocks(blocks)
-            transfers_changed, new_transfers = self._transactions_service.handle_new_blocks(blocks)
+            transfers_changed, new_transfers, new_dividends = self._transactions_service.handle_new_blocks(blocks)
             self._blockchain_processor.handle_new_blocks(self.currency, blocks)
             self.app.db.commit()
             for tx in transfers_changed:
                 self.app.transaction_state_changed.emit(tx)
             for tx in new_transfers:
                 self.app.new_transfer.emit(tx)
+            for ud in new_dividends:
+                self.app.new_dividend.emit(ud)
+
             for idty in identities:
                 self.app.identity_changed.emit(idty)
         except (NoPeerAvailable, DuniterError) as e:
diff --git a/src/sakia/services/transactions.py b/src/sakia/services/transactions.py
index 768d10c5..32f720c2 100644
--- a/src/sakia/services/transactions.py
+++ b/src/sakia/services/transactions.py
@@ -40,6 +40,7 @@ class TransactionsService(QObject):
         """
         transfers_changed = []
         new_transfers = []
+        new_dividends = []
         for tx in [t for t in self._transactions_processor.awaiting(self.currency)]:
             if self._transactions_processor.run_state_transitions(tx, block_doc):
                 transfers_changed.append(tx)
@@ -56,6 +57,7 @@ class TransactionsService(QObject):
                                     timestamp=block_doc.mediantime,
                                     amount=block_doc.ud,
                                     base=block_doc.unit_base)
+                new_dividends.append(dividend)
                 self._dividends_processor.commit(dividend)
 
             for (i, tx_doc) in enumerate(new_transactions):
@@ -66,7 +68,7 @@ class TransactionsService(QObject):
                 else:
                     logging.debug("Error during transfer parsing")
 
-        return transfers_changed, new_transfers
+        return transfers_changed, new_transfers, new_dividends
 
     def handle_new_blocks(self, blocks):
         """
@@ -77,13 +79,15 @@ class TransactionsService(QObject):
         self._logger.debug("Refresh transactions")
         transfers_changed = []
         new_transfers = []
+        new_dividends = []
         txid = 0
         for block in blocks:
-            changes, news = self._parse_block(block, txid)
-            txid += len(news)
+            changes, new_tx, new_ud = self._parse_block(block, txid)
+            txid += len(new_tx)
             transfers_changed += changes
-            new_transfers += news
-        return transfers_changed, new_transfers
+            new_transfers += new_tx
+            new_dividends += new_ud
+        return transfers_changed, new_transfers, new_dividends
 
     def transfers(self, pubkey):
         """
-- 
GitLab