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.
This commit is contained in:
Michael Wozniak 2014-03-02 21:08:46 -05:00
parent 7247eb73f3
commit f9a52684e3
2 changed files with 96 additions and 4 deletions

View File

@ -729,6 +729,7 @@ class ElectrumWindow(QMainWindow):
self.history_list.setCurrentItem(self.history_list.topLevelItem(0)) self.history_list.setCurrentItem(self.history_list.topLevelItem(0))
run_hook('history_tab_update')
def create_send_tab(self): def create_send_tab(self):

View File

@ -1,6 +1,7 @@
from PyQt4.QtGui import * from PyQt4.QtGui import *
from PyQt4.QtCore import * from PyQt4.QtCore import *
import datetime
import decimal import decimal
import httplib import httplib
import json import json
@ -21,7 +22,7 @@ class Exchanger(threading.Thread):
self.quote_currencies = None self.quote_currencies = None
self.lock = threading.Lock() self.lock = threading.Lock()
self.use_exchange = self.parent.config.get('use_exchange', "Blockchain") 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.currencies = ["EUR","GBP","USD"]
self.parent.win.emit(SIGNAL("refresh_exchanges_combo()")) self.parent.win.emit(SIGNAL("refresh_exchanges_combo()"))
self.parent.win.emit(SIGNAL("refresh_currencies_combo()")) self.parent.win.emit(SIGNAL("refresh_currencies_combo()"))
@ -155,7 +156,7 @@ class Plugin(BasePlugin):
return "Exchange rates" return "Exchange rates"
def description(self): 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): def __init__(self,a,b):
@ -190,6 +191,15 @@ class Plugin(BasePlugin):
quote_text = "%.2f %s" % (quote_balance, quote_currency) quote_text = "%.2f %s" % (quote_balance, quote_currency)
return quote_text 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): def requires_settings(self):
return True return True
@ -204,6 +214,46 @@ class Plugin(BasePlugin):
def close(self): def close(self):
self.exchanger.stop() 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): def settings_widget(self, window):
return EnterButton(_('Settings'), self.settings_dialog) return EnterButton(_('Settings'), self.settings_dialog)
@ -213,29 +263,67 @@ class Plugin(BasePlugin):
layout = QGridLayout(d) layout = QGridLayout(d)
layout.addWidget(QLabel(_('Exchange rate API: ')), 0, 0) layout.addWidget(QLabel(_('Exchange rate API: ')), 0, 0)
layout.addWidget(QLabel(_('Currency: ')), 1, 0) layout.addWidget(QLabel(_('Currency: ')), 1, 0)
layout.addWidget(QLabel(_('History Rates: ')), 2, 0)
combo = QComboBox() combo = QComboBox()
combo_ex = 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")) ok_button = QPushButton(_("OK"))
def on_change(x): def on_change(x):
cur_request = str(self.currencies[x]) cur_request = str(self.currencies[x])
if cur_request != self.config.get('currency', "EUR"): if cur_request != self.config.get('currency', "EUR"):
self.config.set_key('currency', cur_request, True) 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() self.win.update_status()
def on_change_ex(x): def on_change_ex(x):
cur_request = str(self.exchanges[x]) cur_request = str(self.exchanges[x])
if cur_request != self.config.get('use_exchange', "Blockchain"): if cur_request != self.config.get('use_exchange', "Blockchain"):
self.config.set_key('use_exchange', cur_request, True) self.config.set_key('use_exchange', cur_request, True)
self.win.update_status()
if cur_request == "Blockchain": if cur_request == "Blockchain":
self.exchanger.update_bc() self.exchanger.update_bc()
hist_checkbox.setChecked(False)
hist_checkbox.setEnabled(False)
elif cur_request == "CoinDesk": elif cur_request == "CoinDesk":
self.exchanger.update_cd() 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": elif cur_request == "Coinbase":
self.exchanger.update_cb() self.exchanger.update_cb()
hist_checkbox.setChecked(False)
hist_checkbox.setEnabled(False)
set_currencies(combo) 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): def set_currencies(combo):
current_currency = self.config.get('currency', "EUR") current_currency = self.config.get('currency', "EUR")
try: try:
@ -266,14 +354,17 @@ class Plugin(BasePlugin):
set_exchanges(combo_ex) set_exchanges(combo_ex)
set_currencies(combo) set_currencies(combo)
set_hist_check(hist_checkbox)
combo.currentIndexChanged.connect(on_change) combo.currentIndexChanged.connect(on_change)
combo_ex.currentIndexChanged.connect(on_change_ex) 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.connect(d, SIGNAL('refresh_currencies_combo()'), lambda: set_currencies(combo))
combo_ex.connect(d, SIGNAL('refresh_exchanges_combo()'), lambda: set_exchanges(combo_ex)) combo_ex.connect(d, SIGNAL('refresh_exchanges_combo()'), lambda: set_exchanges(combo_ex))
ok_button.clicked.connect(lambda: ok_clicked()) ok_button.clicked.connect(lambda: ok_clicked())
layout.addWidget(combo,1,1) layout.addWidget(combo,1,1)
layout.addWidget(combo_ex,0,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_(): if d.exec_():
return True return True