From f9a52684e3fee5311b76cdb19d264e2a2ed667e7 Mon Sep 17 00:00:00 2001 From: Michael Wozniak Date: Sun, 2 Mar 2014 21:08:46 -0500 Subject: [PATCH] Add history fiat tx value for exchange plugin 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 | 1 + plugins/exchange_rate.py | 99 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 96 insertions(+), 4 deletions(-) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py index f4d63d7..c2cefb4 100644 --- a/gui/qt/main_window.py +++ b/gui/qt/main_window.py @@ -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): diff --git a/plugins/exchange_rate.py b/plugins/exchange_rate.py index b90fa94..e7da497 100644 --- a/plugins/exchange_rate.py +++ b/plugins/exchange_rate.py @@ -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 -- 1.7.1