URI: 
       tfactorize code used for tx dialogs - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit b94a7920af0837df84fcb76968e754cbbe5cf972
   DIR parent f2d2d61894d1dcbf9929060e9ae2be005d52575e
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Wed,  8 Jun 2016 11:06:51 +0200
       
       factorize code used for tx dialogs
       
       Diffstat:
         M gui/kivy/uix/dialogs/tx_dialog.py   |      45 +++++++------------------------
         M gui/qt/transaction_dialog.py        |      65 ++++++++-----------------------
         M lib/wallet.py                       |      45 +++++++++++++++++++++++++++++++
       
       3 files changed, 71 insertions(+), 84 deletions(-)
       ---
   DIR diff --git a/gui/kivy/uix/dialogs/tx_dialog.py b/gui/kivy/uix/dialogs/tx_dialog.py
       t@@ -104,42 +104,17 @@ class TxDialog(Factory.Popup):
                self.update()
        
            def update(self):
       -        is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(self.tx)
       -        self.can_broadcast = False
       -        if self.tx.is_complete():
       -            self.tx_hash = self.tx.hash()
       -            self.description = self.wallet.get_label(self.tx_hash)
       -            if self.tx_hash in self.wallet.transactions.keys():
       -                height, conf, timestamp = self.wallet.get_tx_height(self.tx_hash)
       -                if conf:
       -                    self.status_str = _("%d confirmations")%conf
       -                    self.date_str = datetime.fromtimestamp(timestamp).isoformat(' ')[:-3]
       -                else:
       -                    self.status_str =  _('Unconfirmed')
       -                    if fee is None:
       -                        fee = self.wallet.tx_fees.get(tx_hash)
       -            else:
       -                self.can_broadcast = self.app.network is not None
       -                self.status_str = _('Signed')
       -        else:
       -            s, r = self.tx.signature_count()
       -            self.status_str = _("Unsigned") if s == 0 else _('Partially signed') + ' (%d/%d)'%(s,r)
       -
       -        self.is_mine = is_mine
       -        if is_relevant:
       -            if is_mine:
       -                if fee is not None:
       -                    self.amount_str = self.app.format_amount_and_units(-v-fee)
       -                    self.fee_str = self.app.format_amount_and_units(fee)
       -                else:
       -                    self.amount_str = self.app.format_amount_and_units(-v)
       -                    self.fee_str = _("unknown")
       -            else:
       -                self.amount_str = self.app.format_amount_and_units(v)
       -                self.fee_str = ''
       -        else:
       +        self.tx_hash, self.status_str, self.description, self.can_broadcast, amount, fee, height, conf, timestamp = self.wallet.get_tx_info(self.tx)
       +        self.date_str = datetime.fromtimestamp(timestamp).isoformat(' ')[:-3] if timestamp else ''
       +        if amount is None:
                    self.amount_str = _("Transaction unrelated to your wallet")
       -            self.fee_str = ''
       +        elif amount > 0:
       +            self.is_mine = False
       +            self.amount_str = self.app.format_amount_and_units(amount)
       +        else:
       +            self.is_mine = True
       +            self.amount_str = self.app.format_amount_and_units(-amount)
       +        self.fee_str = self.app.format_amount_and_units(fee) if fee is not None else _('unknown')
                self.can_sign = self.wallet.can_sign(self.tx)
                self.ids.output_list.update(self.tx.outputs())
        
   DIR diff --git a/gui/qt/transaction_dialog.py b/gui/qt/transaction_dialog.py
       t@@ -175,43 +175,18 @@ class TxDialog(QDialog, MessageBoxMixin):
        
        
            def update(self):
       +        desc = self.desc
                base_unit = self.main_window.base_unit()
                format_amount = self.main_window.format_amount
       -        is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(self.tx)
       -        desc = self.desc
       -        time_str = None
       -        exp_n = None
       -        self.broadcast_button.hide()
       -
       -        if self.tx.is_complete():
       -            tx_hash = self.tx.hash()
       -            if tx_hash in self.wallet.transactions.keys():
       -                desc = self.wallet.get_label(tx_hash)
       -                height, conf, timestamp = self.wallet.get_tx_height(tx_hash)
       -                if height > 0:
       -                    if conf:
       -                        status = _("%d confirmations") % conf
       -                        time_str = datetime.datetime.fromtimestamp(timestamp).isoformat(' ')[:-3]
       -                    else:
       -                        status = _('Not verified')
       -                else:
       -                    status = _('Unconfirmed')
       -                    if fee is None:
       -                        fee = self.wallet.tx_fees.get(tx_hash)
       -                    if fee:
       -                        size = self.tx.estimated_size()
       -                        fee_per_kb = fee * 1000 / size
       -                        exp_n = self.wallet.network.reverse_dynfee(fee_per_kb)
       -            else:
       -                status = _("Signed")
       -                self.broadcast_button.show()
       -                # cannot broadcast when offline
       -                if self.main_window.network is None:
       -                    self.broadcast_button.setEnabled(False)
       +        tx_hash, status, label, can_broadcast, amount, fee, height, conf, timestamp = self.wallet.get_tx_info(self.tx)
       +
       +        if can_broadcast:
       +            self.broadcast_button.show()
       +            # cannot broadcast when offline
       +            if self.main_window.network is None:
       +                self.broadcast_button.setEnabled(False)
                else:
       -            s, r = self.tx.signature_count()
       -            status = _("Unsigned") if s == 0 else _('Partially signed') + ' (%d/%d)'%(s,r)
       -            tx_hash = _('Unknown');
       +            self.broadcast_button.hide()
        
                if self.wallet.can_sign(self.tx):
                    self.sign_button.show()
       t@@ -226,7 +201,8 @@ class TxDialog(QDialog, MessageBoxMixin):
                    self.tx_desc.show()
                self.status_label.setText(_('Status:') + ' ' + status)
        
       -        if time_str is not None:
       +        if timestamp is not None:
       +            time_str = datetime.datetime.fromtimestamp(timestamp).isoformat(' ')[:-3]
                    self.date_label.setText(_("Date: %s")%time_str)
                    self.date_label.show()
                elif exp_n:
       t@@ -234,27 +210,18 @@ class TxDialog(QDialog, MessageBoxMixin):
                    self.date_label.show()
                else:
                    self.date_label.hide()
       -
                # if we are not synchronized, we cannot tell
                if not self.wallet.up_to_date:
                    return
       -
       -        if is_relevant:
       -            if is_mine:
       -                if fee is not None:
       -                    amount_str = _("Amount sent:") + ' %s'% format_amount(-v-fee) + ' ' + base_unit
       -                else:
       -                    amount_str = _("Amount sent:") + ' %s'% format_amount(-v) + ' ' + base_unit
       -            else:
       -                amount_str = _("Amount received:") + ' %s'% format_amount(v) + ' ' + base_unit
       -        else:
       +        if amount is None:
                    amount_str = _("Transaction unrelated to your wallet")
       -
       +        elif amount > 0:
       +            amount_str = _("Amount received:") + ' %s'% format_amount(amount) + ' ' + base_unit
       +        else:
       +            amount_str = _("Amount sent:") + ' %s'% format_amount(-amount) + ' ' + base_unit
                fee_str = _("Transaction fee") + ': %s'% (format_amount(fee) + ' ' + base_unit if fee is not None else _('unknown'))
       -
                self.amount_label.setText(amount_str)
                self.fee_label.setText(fee_str)
       -
                run_hook('transaction_dialog_update', self)
        
        
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -601,6 +601,51 @@ class Abstract_Wallet(PrintError):
                    fee = None
                return is_relevant, is_mine, v, fee
        
       +    def get_tx_info(self, tx):
       +        is_relevant, is_mine, v, fee = self.get_wallet_delta(tx)
       +        exp_n = None
       +        can_broadcast = False
       +        label = None
       +        if tx.is_complete():
       +            tx_hash = tx.hash()
       +            if tx_hash in self.transactions.keys():
       +                label = self.get_label(tx_hash)
       +                height, conf, timestamp = self.get_tx_height(tx_hash)
       +                if height > 0:
       +                    if conf:
       +                        status = _("%d confirmations") % conf
       +                    else:
       +                        status = _('Not verified')
       +                else:
       +                    status = _('Unconfirmed')
       +                    if fee is None:
       +                        fee = self.tx_fees.get(tx_hash)
       +                    if fee:
       +                        size = tx.estimated_size()
       +                        fee_per_kb = fee * 1000 / size
       +                        exp_n = self.network.reverse_dynfee(fee_per_kb)
       +            else:
       +                status = _("Signed")
       +                can_broadcast = self.network is not None
       +        else:
       +            s, r = tx.signature_count()
       +            status = _("Unsigned") if s == 0 else _('Partially signed') + ' (%d/%d)'%(s,r)
       +            tx_hash = _('Unknown')
       +
       +        if is_relevant:
       +            if is_mine:
       +                if fee is not None:
       +                    amount = v + fee
       +                else:
       +                    amount = v
       +            else:
       +                amount = v
       +        else:
       +            amount = None
       +
       +        return tx_hash, status, label, can_broadcast, amount, fee, height, conf, timestamp
       +
       +
            def get_addr_io(self, address):
                h = self.history.get(address, [])
                received = {}