Add history fiat tx value for exchange plugin
authorMichael Wozniak <github@koh.ms>
Mon, 3 Mar 2014 02:08:46 +0000 (21:08 -0500)
committerMichael Wozniak <github@koh.ms>
Mon, 3 Mar 2014 02:08:46 +0000 (21:08 -0500)
Added coindesk BPI rate calculation for transaction values in history.

Coindesk currently only provides this functionality for USD, so it is
only available when the Coindesk and USD combination has been
selected.

gui/qt/main_window.py
plugins/exchange_rate.py

index f4d63d7..c2cefb4 100644 (file)
@@ -729,6 +729,7 @@ class ElectrumWindow(QMainWindow):
 
 
         self.history_list.setCurrentItem(self.history_list.topLevelItem(0))
+        run_hook('history_tab_update')
 
 
     def create_send_tab(self):
index b90fa94..e7da497 100644 (file)
@@ -1,6 +1,7 @@
 from PyQt4.QtGui import *
 from PyQt4.QtCore import *
 
+import datetime
 import decimal
 import httplib
 import json
@@ -21,7 +22,7 @@ class Exchanger(threading.Thread):
         self.quote_currencies = None
         self.lock = threading.Lock()
         self.use_exchange = self.parent.config.get('use_exchange', "Blockchain")
-        self.parent.exchanges = ["CoinDesk", "Blockchain", "Coinbase"]
+        self.parent.exchanges = ["Blockchain", "Coinbase", "CoinDesk"]
         self.parent.currencies = ["EUR","GBP","USD"]
         self.parent.win.emit(SIGNAL("refresh_exchanges_combo()"))
         self.parent.win.emit(SIGNAL("refresh_currencies_combo()"))
@@ -155,7 +156,7 @@ class Plugin(BasePlugin):
         return "Exchange rates"
 
     def description(self):
-        return """exchange rates, retrieved from blockchain.info"""
+        return """exchange rates, retrieved from blockchain.info, CoinDesk, or Coinbase"""
 
 
     def __init__(self,a,b):
@@ -190,6 +191,15 @@ class Plugin(BasePlugin):
             quote_text = "%.2f %s" % (quote_balance, quote_currency)
         return quote_text
 
+    def load_wallet(self, wallet):
+        self.wallet = wallet
+        tx_list = {}
+        for item in self.wallet.get_tx_history(self.wallet.storage.get("current_account", None)):
+            tx_hash, conf, is_mine, value, fee, balance, timestamp = item
+            tx_list[tx_hash] = {'value': value, 'timestamp': timestamp, 'balance': balance}
+            
+        self.tx_list = tx_list
+        
 
     def requires_settings(self):
         return True
@@ -204,6 +214,46 @@ class Plugin(BasePlugin):
     def close(self):
         self.exchanger.stop()
 
+    def history_tab_update(self):
+        if self.config.get('history_rates', 'unchecked') == "checked":
+            tx_list = self.tx_list
+            
+            mintimestr = datetime.datetime.fromtimestamp(int(min(tx_list.items(), key=lambda x: x[1]['timestamp'])[1]['timestamp'])).strftime('%Y-%m-%d')
+            maxtimestr = datetime.datetime.fromtimestamp(int( max(tx_list.items(), key=lambda x: x[1]['timestamp'])[1]['timestamp'])).strftime('%Y-%m-%d')
+            try:
+                connection = httplib.HTTPSConnection('api.coindesk.com')
+                connection.request("GET", "/v1/bpi/historical/close.json?start=" + mintimestr + "&end=" + maxtimestr)
+            except Exception:
+                return
+            resp = connection.getresponse()
+            if resp.reason == httplib.responses[httplib.NOT_FOUND]:
+                return
+            try:
+                resp_hist = json.loads(resp.read())
+            except Exception:
+                return
+
+            self.gui.main_window.is_edit = True
+            self.gui.main_window.history_list.setColumnCount(6)
+            self.gui.main_window.history_list.setHeaderLabels( [ '', _('Date'), _('Description') , _('Amount'), _('Balance'), _('Fiat Amount')] )
+            root = self.gui.main_window.history_list.invisibleRootItem()
+            childcount = root.childCount()
+            for i in range(childcount):
+                item = root.child(i)
+                tx_info = tx_list[str(item.data(0, Qt.UserRole).toPyObject())]
+                tx_time = int(tx_info['timestamp'])
+                tx_time_str = datetime.datetime.fromtimestamp(tx_time).strftime('%Y-%m-%d')
+                tx_USD_val = "%.2f %s" % (Decimal(tx_info['value']) / 100000000 * Decimal(resp_hist['bpi'][tx_time_str]), "USD")
+
+
+                item.setText(5, tx_USD_val)
+            
+            for i, width in enumerate(self.gui.main_window.column_widths['history']):
+                self.gui.main_window.history_list.setColumnWidth(i, width)
+            self.gui.main_window.history_list.setColumnWidth(4, 140)
+            self.gui.main_window.history_list.setColumnWidth(5, 120)
+            self.gui.main_window.is_edit = False
+       
 
     def settings_widget(self, window):
         return EnterButton(_('Settings'), self.settings_dialog)
@@ -213,29 +263,67 @@ class Plugin(BasePlugin):
         layout = QGridLayout(d)
         layout.addWidget(QLabel(_('Exchange rate API: ')), 0, 0)
         layout.addWidget(QLabel(_('Currency: ')), 1, 0)
+        layout.addWidget(QLabel(_('History Rates: ')), 2, 0)
         combo = QComboBox()
         combo_ex = QComboBox()
+        hist_checkbox = QCheckBox()
+        hist_checkbox.setEnabled(False)
+        if self.config.get('history_rates', 'unchecked') == 'unchecked':
+            hist_checkbox.setChecked(False)
+        else:
+            hist_checkbox.setChecked(True)
         ok_button = QPushButton(_("OK"))
 
         def on_change(x):
             cur_request = str(self.currencies[x])
             if cur_request != self.config.get('currency', "EUR"):
                 self.config.set_key('currency', cur_request, True)
+                if cur_request == "USD" and self.config.get('use_exchange', "Blockchain") == "CoinDesk":
+                    hist_checkbox.setEnabled(True)
+                else:
+                    hist_checkbox.setChecked(False)
+                    hist_checkbox.setEnabled(False)
                 self.win.update_status()
 
         def on_change_ex(x):
             cur_request = str(self.exchanges[x])
             if cur_request != self.config.get('use_exchange', "Blockchain"):
                 self.config.set_key('use_exchange', cur_request, True)
-                self.win.update_status()
                 if cur_request == "Blockchain":
                     self.exchanger.update_bc()
+                    hist_checkbox.setChecked(False)
+                    hist_checkbox.setEnabled(False)
                 elif cur_request == "CoinDesk":
                     self.exchanger.update_cd()
+                    if self.config.get('currency', "EUR") == "USD":
+                        hist_checkbox.setEnabled(True)
+                    else:
+                        hist_checkbox.setChecked(False)
+                        hist_checkbox.setEnabled(False)
                 elif cur_request == "Coinbase":
                     self.exchanger.update_cb()
+                    hist_checkbox.setChecked(False)
+                    hist_checkbox.setEnabled(False)
                 set_currencies(combo)
+                self.win.update_status()
 
+        def on_change_hist(checked):
+            if checked:
+                self.config.set_key('history_rates', 'checked')
+                self.history_tab_update()
+            else:
+                self.config.set_key('history_rates', 'unchecked')
+                self.gui.main_window.history_list.setHeaderLabels( [ '', _('Date'), _('Description') , _('Amount'), _('Balance')] )
+                self.gui.main_window.history_list.setColumnCount(5)
+                for i,width in enumerate(self.gui.main_window.column_widths['history']):
+                    self.gui.main_window.history_list.setColumnWidth(i, width)
+
+        def set_hist_check(hist_checkbox):
+            if self.config.get('use_exchange', "Blockchain") == "CoinDesk":
+                hist_checkbox.setEnabled(True)
+            else:
+                hist_checkbox.setEnabled(False) 
+        
         def set_currencies(combo):
             current_currency = self.config.get('currency', "EUR")
             try:
@@ -266,14 +354,17 @@ class Plugin(BasePlugin):
 
         set_exchanges(combo_ex)
         set_currencies(combo)
+        set_hist_check(hist_checkbox)
         combo.currentIndexChanged.connect(on_change)
         combo_ex.currentIndexChanged.connect(on_change_ex)
+        hist_checkbox.stateChanged.connect(on_change_hist)
         combo.connect(d, SIGNAL('refresh_currencies_combo()'), lambda: set_currencies(combo))
         combo_ex.connect(d, SIGNAL('refresh_exchanges_combo()'), lambda: set_exchanges(combo_ex))
         ok_button.clicked.connect(lambda: ok_clicked())
         layout.addWidget(combo,1,1)
         layout.addWidget(combo_ex,0,1)
-        layout.addWidget(ok_button,2,1)
+        layout.addWidget(hist_checkbox,2,1)
+        layout.addWidget(ok_button,3,1)
         
         if d.exec_():
             return True