From 099a63d4804594552dd6bf2bb2a0a8b9dd0ac7bc Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Mon, 29 Dec 2014 23:15:32 +0100
Subject: [PATCH] Added caching of wallets transactions sent & received

---
 src/cutecoin/core/app.py       | 22 +++++++++++++++++++++-
 src/cutecoin/core/wallet.py    | 24 ++++++++++++++++++------
 src/cutecoin/gui/mainwindow.py |  8 ++++++--
 3 files changed, 45 insertions(+), 9 deletions(-)

diff --git a/src/cutecoin/core/app.py b/src/cutecoin/core/app.py
index f081ebce..8ff973b7 100644
--- a/src/cutecoin/core/app.py
+++ b/src/cutecoin/core/app.py
@@ -57,7 +57,10 @@ class Application(object):
         self.accounts.remove(account)
 
     def change_current_account(self, account):
+        if self.current_account is not None:
+            self.save_cache(self.current_account)
         self.current_account = account
+        self.load_cache(account)
 
     def load(self):
         if not os.path.exists(config.parameters['home']):
@@ -76,7 +79,17 @@ class Application(object):
                                             account_name, 'properties')
                 json_data = open(account_path, 'r')
                 data = json.load(json_data)
-                self.accounts.append(Account.load(data))
+                account = Account.load(data)
+                self.accounts.append(account)
+
+    def load_cache(self, account):
+        for wallet in account.wallets:
+            wallet_path = os.path.join(config.parameters['home'],
+                                        account.name, wallet.pubkey)
+            if os.path.exists(wallet_path):
+                json_data = open(wallet_path, 'r')
+                data = json.load(json_data)
+                wallet.cache.load_from_json(data)
 
     def save(self, account):
         with open(config.parameters['data'], 'w') as outfile:
@@ -87,6 +100,13 @@ class Application(object):
         with open(account_path, 'w') as outfile:
             json.dump(account.jsonify(), outfile, indent=4, sort_keys=True)
 
+    def save_cache(self, account):
+        for wallet in account.wallets:
+            wallet_path = os.path.join(config.parameters['home'],
+                                        account.name, wallet.pubkey)
+            with open(wallet_path, 'w') as outfile:
+                json.dump(wallet.cache.jsonify(), outfile, indent=4, sort_keys=True)
+
     def import_account(self, file, name):
         with tarfile.open(file, "r") as tar:
             path = os.path.join(config.parameters['home'],
diff --git a/src/cutecoin/core/wallet.py b/src/cutecoin/core/wallet.py
index 92f41a39..4aebe499 100644
--- a/src/cutecoin/core/wallet.py
+++ b/src/cutecoin/core/wallet.py
@@ -20,15 +20,27 @@ class Cache():
         self.tx_sent = []
         self.tx_received = []
 
-    def from_json(self, data):
-        pass
+    def load_from_json(self, data):
+        self.tx_received = []
+        self.tx_sent = []
+        data_received = data['received']
+        for r in data_received:
+            self.tx_received.append(Transaction.from_signed_raw(r['raw']))
+        data_sent = data['sent']
+        for s in data_sent:
+            self.tx_sent.append(Transaction.from_signed_raw(s['raw']))
+        self.latest_block = data['latest_block']
 
-    def to_json(self):
+    def jsonify(self):
         data_received = []
         for r in self.tx_received:
-            data_received.append({'amount': r.amount,
-                                  'pubkey': r.pubkey})
-        return {'received': data_received}
+            data_received.append({'raw': r.signed_raw()})
+        data_sent = []
+        for s in self.tx_sent:
+            data_sent.append({'raw': s.signed_raw()})
+        return {'latest_block': self.latest_block,
+                'received': data_received,
+                'sent': data_sent}
 
     def latest_sent(self, community):
         self._refresh(community)
diff --git a/src/cutecoin/gui/mainwindow.py b/src/cutecoin/gui/mainwindow.py
index d41a1055..2ca1c3a1 100644
--- a/src/cutecoin/gui/mainwindow.py
+++ b/src/cutecoin/gui/mainwindow.py
@@ -38,8 +38,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         dialog.exec_()
 
     def action_change_account(self, account_name):
-        self.app.current_account = self.app.get_account(account_name)
-        logging.info('Changing account to ' + self.app.current_account.name)
+        self.app.change_current_account(self.app.get_account(account_name))
         self.refresh()
 
     def open_transfer_money_dialog(self):
@@ -116,3 +115,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         else:
             path = selected_file[0] + ".acc"
         self.app.export_account(path, self.app.current_account)
+
+    def closeEvent(self, event):
+        self.app.save_cache(self.app.current_account)
+        super().closeEvent(event)
+
-- 
GitLab