From 218a1ee2f7aeb27b1e8b4daca4ca95f5dbdd5a20 Mon Sep 17 00:00:00 2001 From: Tafelpoot Date: Fri, 14 Nov 2014 19:47:34 +0100 Subject: [PATCH 1/2] Updated Requests - added Date and Account field to Saved Requests - requests are now saved as dict() old requests will be deleted!! - Account field is hidden when only 1 account is available - address line now follows the current_account - saved requests is sortable, default sorted by date - saved requests only shows request for current_account --- gui/qt/main_window.py | 59 +++++++++++++++++++++++++++++++++---------- lib/wallet.py | 4 +-- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py index 77e59f93..a418d699 100644 --- a/gui/qt/main_window.py +++ b/gui/qt/main_window.py @@ -715,6 +715,7 @@ class ElectrumWindow(QMainWindow): self.save_request_button = QPushButton(_('Save')) self.save_request_button.clicked.connect(self.save_payment_request) grid.addWidget(self.save_request_button, 3, 1) + clear_button = QPushButton(_('New')) clear_button.clicked.connect(self.new_receive_address) grid.addWidget(clear_button, 3, 2) @@ -731,8 +732,11 @@ class ElectrumWindow(QMainWindow): self.receive_list.customContextMenuRequested.connect(self.receive_list_menu) self.receive_list.currentItemChanged.connect(self.receive_item_changed) self.receive_list.itemClicked.connect(self.receive_item_changed) - self.receive_list.setHeaderLabels( [_('Address'), _('Message'), _('Amount')] ) - self.receive_list.setColumnWidth(0, 340) + self.receive_list.setHeaderLabels( [_('Date'), _('Account'), _('Address'), _('Message'), _('Amount')] ) + self.receive_list.setSortingEnabled(True) + self.receive_list.setColumnWidth(0, 130) + self.receive_list.hideColumn(1) # the update will show it if necessary + self.receive_list.setColumnWidth(2, 340) h = self.receive_list.header() h.setStretchLastSection(False) h.setResizeMode(1, QHeaderView.Stretch) @@ -744,15 +748,16 @@ class ElectrumWindow(QMainWindow): def receive_item_changed(self, item): if item is None: return - addr = str(item.text(0)) - amount, message = self.receive_requests[addr] + addr = str(item.text(2)) + req = self.receive_requests[addr] + date, amount, message = req["date"], req["amount"], req["msg"] self.receive_address_e.setText(addr) self.receive_message_e.setText(message) self.receive_amount_e.setAmount(amount) def receive_list_delete(self, item): - addr = str(item.text(0)) + addr = str(item.text(2)) self.receive_requests.pop(addr) self.wallet.storage.put('receive_requests', self.receive_requests) self.update_receive_tab() @@ -761,11 +766,12 @@ class ElectrumWindow(QMainWindow): def receive_list_menu(self, position): item = self.receive_list.itemAt(position) menu = QMenu() - menu.addAction(_("Copy to clipboard"), lambda: self.app.clipboard().setText(str(item.text(0)))) + menu.addAction(_("Copy to clipboard"), lambda: self.app.clipboard().setText(str(item.text(2)))) menu.addAction(_("Delete"), lambda: self.receive_list_delete(item)) menu.exec_(self.receive_list.viewport().mapToGlobal(position)) def save_payment_request(self): + date = time.strftime("%c") addr = str(self.receive_address_e.text()) amount = self.receive_amount_e.get_amount() message = unicode(self.receive_message_e.text()) @@ -773,7 +779,7 @@ class ElectrumWindow(QMainWindow): QMessageBox.warning(self, _('Error'), _('No message or amount'), _('OK')) return self.receive_requests = self.wallet.storage.get('receive_requests',{}) - self.receive_requests[addr] = (amount, message) + self.receive_requests[addr] = {"date":date, "amount":amount, "msg":message} self.wallet.storage.put('receive_requests', self.receive_requests) self.update_receive_tab() @@ -829,18 +835,45 @@ class ElectrumWindow(QMainWindow): def update_receive_tab(self): self.receive_requests = self.wallet.storage.get('receive_requests',{}) + + # hide receive tab if no receive requests available b = len(self.receive_requests) > 0 self.receive_list.setVisible(b) self.receive_requests_label.setVisible(b) + # check if it is necessary to show the account + if len(self.wallet.get_accounts()) > 1: + self.receive_list.showColumn(1) + else: + self.receive_list.hideColumn(1) + + # update the receive address if necessary + current_address = self.receive_address_e.text() + domain = self.wallet.get_account_addresses(self.current_account, include_change=False) + if not current_address in domain: + self.new_receive_address() + + # clear the list and fill it again self.receive_list.clear() - for address, v in self.receive_requests.items(): - amount, message = v - item = QTreeWidgetItem( [ address, message, self.format_amount(amount) if amount else ""] ) - item.setFont(0, QFont(MONOSPACE_FONT)) + for address, req in self.receive_requests.viewitems(): + try: + date, amount, message = req["date"], req["amount"], req["msg"] + except: + # REMOVE LATER - fix for current electrum 2.0 wallets + # deletes all requests so that you don't need to edit your wallets manually + print "removing old receive_requests" + self.wallet.storage.put('receive_requests', {}) + return + # only show requests for the current account + if address not in domain: + continue + account = self.wallet.get_account_from_address(address) + item = QTreeWidgetItem( [ date, account, address, message, self.format_amount(amount) if amount else ""]) + item.setFont(2, QFont(MONOSPACE_FONT)) self.receive_list.addTopLevelItem(item) + def update_receive_qr(self): import urlparse, urllib addr = str(self.receive_address_e.text()) @@ -2401,10 +2434,10 @@ class ElectrumWindow(QMainWindow): h, b = ok_cancel_buttons2(d, _('Export')) vbox.addLayout(h) - + run_hook('export_history_dialog', self,hbox) self.update() - + if not d.exec_(): return diff --git a/lib/wallet.py b/lib/wallet.py index 6b772feb..481e080b 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -483,10 +483,10 @@ class Abstract_Wallet(object): return addr_list def get_account_from_address(self, addr): - "Returns the account that contains this address, or None" + "Returns the account name that contains this address, or None" for acc_id in self.accounts: # similar to get_address_index but simpler if addr in self.get_account_addresses(acc_id): - return self.accounts[acc_id] + return self.get_account_name(acc_id) return None def get_account_balance(self, account): From 7ca3ba4e80492180ff1dd19a885dd0cb6868a9f3 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Mon, 24 Nov 2014 12:28:11 +0100 Subject: [PATCH 2/2] various fixes for reveive_requests --- gui/qt/main_window.py | 51 +++++++++++++++++++------------------------ lib/wallet.py | 4 ++-- 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py index b48deb42..2ab96e96 100644 --- a/gui/qt/main_window.py +++ b/gui/qt/main_window.py @@ -628,6 +628,13 @@ class ElectrumWindow(QMainWindow): run_hook('current_item_changed', a) + def format_time(self, timestamp): + try: + time_str = datetime.datetime.fromtimestamp( timestamp).isoformat(' ')[:-3] + except Exception: + time_str = _("error") + return time_str + def update_history_tab(self): @@ -636,11 +643,7 @@ class ElectrumWindow(QMainWindow): tx_hash, conf, is_mine, value, fee, balance, timestamp = item time_str = _("unknown") if conf > 0: - try: - time_str = datetime.datetime.fromtimestamp( timestamp).isoformat(' ')[:-3] - except Exception: - time_str = _("error") - + time_str = self.format_time(timestamp) if conf == -1: time_str = 'unverified' icon = QIcon(":icons/unconfirmed.png") @@ -734,13 +737,12 @@ class ElectrumWindow(QMainWindow): self.receive_list.itemClicked.connect(self.receive_item_changed) self.receive_list.setHeaderLabels( [_('Date'), _('Account'), _('Address'), _('Message'), _('Amount')] ) self.receive_list.setSortingEnabled(True) - self.receive_list.setColumnWidth(0, 130) + self.receive_list.setColumnWidth(0, 180) self.receive_list.hideColumn(1) # the update will show it if necessary self.receive_list.setColumnWidth(2, 340) h = self.receive_list.header() h.setStretchLastSection(False) - h.setResizeMode(1, QHeaderView.Stretch) - + h.setResizeMode(3, QHeaderView.Stretch) grid.addWidget(self.receive_requests_label, 6, 0) grid.addWidget(self.receive_list, 7, 0, 1, 6) return w @@ -750,7 +752,7 @@ class ElectrumWindow(QMainWindow): return addr = str(item.text(2)) req = self.receive_requests[addr] - date, amount, message = req["date"], req["amount"], req["msg"] + time, amount, message = req['time'], req['amount'], req['msg'] self.receive_address_e.setText(addr) self.receive_message_e.setText(message) self.receive_amount_e.setAmount(amount) @@ -759,7 +761,7 @@ class ElectrumWindow(QMainWindow): def receive_list_delete(self, item): addr = str(item.text(2)) self.receive_requests.pop(addr) - self.wallet.storage.put('receive_requests', self.receive_requests) + self.wallet.storage.put('receive_requests2', self.receive_requests) self.update_receive_tab() self.clear_receive_tab() @@ -771,16 +773,16 @@ class ElectrumWindow(QMainWindow): menu.exec_(self.receive_list.viewport().mapToGlobal(position)) def save_payment_request(self): - date = time.strftime("%c") + timestamp = int(time.time()) addr = str(self.receive_address_e.text()) amount = self.receive_amount_e.get_amount() message = unicode(self.receive_message_e.text()) if not message and not amount: QMessageBox.warning(self, _('Error'), _('No message or amount'), _('OK')) return - self.receive_requests = self.wallet.storage.get('receive_requests',{}) - self.receive_requests[addr] = {"date":date, "amount":amount, "msg":message} - self.wallet.storage.put('receive_requests', self.receive_requests) + self.receive_requests = self.wallet.storage.get('receive_requests2',{}) + self.receive_requests[addr] = {'time':timestamp, 'amount':amount, 'msg':message} + self.wallet.storage.put('receive_requests2', self.receive_requests) self.update_receive_tab() def new_receive_address(self): @@ -800,7 +802,7 @@ class ElectrumWindow(QMainWindow): self.receive_amount_e.setAmount(None) def clear_receive_tab(self): - self.receive_requests = self.wallet.storage.get('receive_requests',{}) + self.receive_requests = self.wallet.storage.get('receive_requests2',{}) domain = self.wallet.get_account_addresses(self.current_account, include_change=False) for addr in domain: if not self.wallet.history.get(addr) and addr not in self.receive_requests.keys(): @@ -834,7 +836,7 @@ class ElectrumWindow(QMainWindow): self.receive_address_e.setText(addr) def update_receive_tab(self): - self.receive_requests = self.wallet.storage.get('receive_requests',{}) + self.receive_requests = self.wallet.storage.get('receive_requests2',{}) # hide receive tab if no receive requests available b = len(self.receive_requests) > 0 @@ -842,10 +844,7 @@ class ElectrumWindow(QMainWindow): self.receive_requests_label.setVisible(b) # check if it is necessary to show the account - if len(self.wallet.get_accounts()) > 1: - self.receive_list.showColumn(1) - else: - self.receive_list.hideColumn(1) + self.receive_list.setColumnHidden(1, len(self.wallet.get_accounts()) == 1) # update the receive address if necessary current_address = self.receive_address_e.text() @@ -856,18 +855,12 @@ class ElectrumWindow(QMainWindow): # clear the list and fill it again self.receive_list.clear() for address, req in self.receive_requests.viewitems(): - try: - date, amount, message = req["date"], req["amount"], req["msg"] - except: - # REMOVE LATER - fix for current electrum 2.0 wallets - # deletes all requests so that you don't need to edit your wallets manually - print "removing old receive_requests" - self.wallet.storage.put('receive_requests', {}) - return + timestamp, amount, message = req['time'], req['amount'], req['msg'] # only show requests for the current account if address not in domain: continue - account = self.wallet.get_account_from_address(address) + date = self.format_time(timestamp) + account = self.wallet.get_account_name(self.wallet.get_account_from_address(address)) item = QTreeWidgetItem( [ date, account, address, message, self.format_amount(amount) if amount else ""]) item.setFont(2, QFont(MONOSPACE_FONT)) self.receive_list.addTopLevelItem(item) diff --git a/lib/wallet.py b/lib/wallet.py index a3a8872d..1898bbb0 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -483,10 +483,10 @@ class Abstract_Wallet(object): return addr_list def get_account_from_address(self, addr): - "Returns the account name that contains this address, or None" + "Returns the account that contains this address, or None" for acc_id in self.accounts: # similar to get_address_index but simpler if addr in self.get_account_addresses(acc_id): - return self.get_account_name(acc_id) + return acc_id return None def get_account_balance(self, account):