Browse Source

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.
283
Michael Wozniak 11 years ago
parent
commit
f9a52684e3
  1. 1
      gui/qt/main_window.py
  2. 99
      plugins/exchange_rate.py

1
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):

99
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

Loading…
Cancel
Save