tMerge pull request #596 from wozz/exchangerate-history - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit d0ccb5b2ffa9ee5fe62de4fb770ef91d02fd4a12 DIR parent 7247eb73f31489f202add47d9672eeb7acf83c9e HTML Author: ThomasV <thomasv1@gmx.de> Date: Mon, 3 Mar 2014 06:59:14 +0100 Merge pull request #596 from wozz/exchangerate-history Add history fiat tx value for exchange plugin Diffstat: M gui/qt/main_window.py | 1 + M plugins/exchange_rate.py | 106 +++++++++++++++++++++++++++++-- 2 files changed, 103 insertions(+), 4 deletions(-) --- DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py t@@ -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): DIR diff --git a/plugins/exchange_rate.py b/plugins/exchange_rate.py t@@ -1,6 +1,7 @@ from PyQt4.QtGui import * from PyQt4.QtCore import * +import datetime import decimal import httplib import json t@@ -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()")) t@@ -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): t@@ -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 t@@ -204,6 +214,53 @@ 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.now().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) + try: + tx_info = tx_list[str(item.data(0, Qt.UserRole).toPyObject())] + except Exception: + newtx = self.wallet.get_tx_history() + v = newtx[[x[0] for x in newtx].index(str(item.data(0, Qt.UserRole).toPyObject()))][3] + + tx_info = {'timestamp':int(datetime.datetime.now().strftime("%s")), 'value': v } + pass + 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) t@@ -213,29 +270,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: t@@ -266,14 +361,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