URI: 
       tMore improvements to exchange_rate plugin - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 9e0e54157efac578439f0aa42c37f53f2d3a35c5
   DIR parent c290455b94cbe1e099b0b9cc78abadde0171afab
  HTML Author: Neil Booth <kyuupichan@gmail.com>
       Date:   Sat,  5 Sep 2015 22:47:01 +0900
       
       More improvements to exchange_rate plugin
       
       Everything should now update correctly on incoming data from
       tthe exchange server.
       
       Diffstat:
         M gui/qt/history_widget.py            |       1 +
         M plugins/exchange_rate.py            |      34 +++++++++++++++++++++----------
       
       2 files changed, 24 insertions(+), 11 deletions(-)
       ---
   DIR diff --git a/gui/qt/history_widget.py b/gui/qt/history_widget.py
       t@@ -56,6 +56,7 @@ class HistoryWidget(MyTreeWidget):
                item = self.currentItem()
                current_tx = item.data(0, Qt.UserRole).toString() if item else None
                self.clear()
       +        run_hook('history_tab_update_begin')
                for tx in h:
                    tx_hash, conf, value, timestamp, balance = tx
                    if conf is None and timestamp is None:
   DIR diff --git a/plugins/exchange_rate.py b/plugins/exchange_rate.py
       t@@ -1,11 +1,11 @@
        from PyQt4.QtGui import *
        from PyQt4.QtCore import *
        
       -from datetime import datetime, date
       +from datetime import datetime
        import inspect
        import requests
        import sys
       -import threading
       +from threading import Thread
        import time
        import traceback
        from decimal import Decimal
       t@@ -52,17 +52,13 @@ class ExchangeBase:
                result = self.history.get(ccy)
                if not result and ccy in self.history_ccys():
                    self.print_error("requesting historical rates for", ccy)
       -            t = threading.Thread(target=self.historical_rates, args=(ccy,))
       +            t = Thread(target=self.historical_rates, args=(ccy,))
                    t.setDaemon(True)
                    t.start()
                return result
        
            def historical_rate(self, ccy, d_t):
       -        if d_t.date() == datetime.today().date():
       -            rate = self.quotes.get(ccy)
       -        else:
       -            rate = self.history.get(ccy, {}).get(d_t.strftime('%Y-%m-%d'))
       -        return rate
       +        return self.history.get(ccy, {}).get(d_t.strftime('%Y-%m-%d'))
        
        
        class BitcoinAverage(ExchangeBase):
       t@@ -191,15 +187,17 @@ class Plugin(BasePlugin, ThreadJob):
                self.sig = QObject()
                self.sig.connect(self.sig, SIGNAL('fx_quotes'), self.on_fx_quotes)
                self.sig.connect(self.sig, SIGNAL('fx_history'), self.on_fx_history)
       +        self.ccy = self.config_ccy()
       +        self.history_used_spot = False
                self.ccy_combo = None
                self.hist_checkbox = None
       -        self.ccy = self.config_ccy()
        
                is_exchange = lambda obj: (inspect.isclass(obj)
                                           and issubclass(obj, ExchangeBase))
                self.exchanges = dict(inspect.getmembers(sys.modules[__name__],
                                                         is_exchange))
                self.set_exchange(self.config_exchange())
       +        # FIXME: kill this
                self.btc_rate = Decimal("0.0")
        
            def thread_jobs(self):
       t@@ -248,12 +246,16 @@ class Plugin(BasePlugin, ThreadJob):
        
            def on_fx_history(self):
                '''Called when historical fx quotes are updated'''
       -        pass
       +        for window in self.parent.windows:
       +            window.update_history_tab()
        
            def on_fx_quotes(self):
                '''Called when fresh spot fx quotes come in'''
                self.update_status_bars()
                self.populate_ccy_combo()
       +        # History tab needs updating if it used spot
       +        if self.history_used_spot:
       +            self.on_fx_history()
        
            def on_ccy_combo_change(self):
                '''Called when the chosen currency changes'''
       t@@ -263,7 +265,7 @@ class Plugin(BasePlugin, ThreadJob):
                    self.ccy = ccy
                    self.config.set_key('currency', ccy, True)
                    self.update_status_bars()
       -            self.get_historical_rates()
       +            self.get_historical_rates() # Because self.ccy changes
                    self.hist_checkbox_update()
        
            def hist_checkbox_update(self):
       t@@ -343,6 +345,12 @@ class Plugin(BasePlugin, ThreadJob):
        
            def historical_value_str(self, ccy, satoshis, d_t):
                rate = self.exchange.historical_rate(ccy, d_t)
       +        # Frequently there is no rate for today, until tomorrow :)
       +        # Use spot quotes in that case
       +        if rate is None and d_t.date() == datetime.today().date():
       +            rate = self.exchange.quotes.get(ccy)
       +            if rate is not None:
       +                self.history_used_spot = True
                if rate:
                     value = round(Decimal(satoshis) / COIN * Decimal(rate), 2)
                     return " ".join(["{:,.2f}".format(value), ccy])
       t@@ -353,6 +361,10 @@ class Plugin(BasePlugin, ThreadJob):
                headers.extend([_('Fiat Amount'), _('Fiat Balance')])
        
            @hook
       +    def history_tab_update(self):
       +        self.history_used_spot = False
       +
       +    @hook
            def history_tab_update(self, tx, entry):
                if not self.config_history():
                    return