@ -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