def update_status(self): req = self.app.wallet.get_request(self.key) self.status, self.status_str = get_request_status(req) self.status_color = pr_color[self.status] if self.status == PR_UNPAID and self.is_lightning and self.app.wallet.lnworker: if self.amount and self.amount > self.app.wallet.lnworker.can_receive(): self.warning = _('Warning') + ': ' + _('This amount exceeds the maximum you can currently receive with your channels')
def update_data(self): self.model().clear() self.update_headers(self.__class__.headers) index = 0 for alert_transaction in self.wallet.get_atxs_to_recovery(): if alert_transaction.txid() in self._selected_atxids_cache and self.invisible_selected_atxs: continue invoice_type = PR_TYPE_ONCHAIN if invoice_type == PR_TYPE_LN: icon_name = 'lightning.png' elif invoice_type == PR_TYPE_ONCHAIN: icon_name = 'bitcoin.png' else: raise Exception('Unsupported type') txinfo = self.wallet.get_tx_info(alert_transaction) if txinfo.tx_mined_status.txtype == 'ALERT_PENDING': status, status_str = get_request_status({'status': PR_UNPAID}) else: status, status_str = get_request_status({'status': PR_UNKNOWN}) status_str = '{} {}/{}'.format(status_str, txinfo.tx_mined_status.conf, self.required_confirmations) num_status, date_str = self.wallet.get_tx_status(alert_transaction.txid(), txinfo.tx_mined_status) amount_str = self.main_window.format_amount(txinfo.amount - txinfo.fee, whitespaces=True) labels = [date_str, txinfo.label, amount_str, status_str] def set_editable(item: QStandardItem) -> QStandardItem: item.setEditable(False) return item items = [set_editable(QStandardItem(e)) for e in labels] items[self.Columns.DATE].setIcon(read_QIcon(icon_name)) items[self.Columns.STATUS].setIcon(read_QIcon(pr_icons.get(status))) items[self.Columns.DATE].setData(invoice_type, role=ROLE_REQUEST_TYPE) items[self.Columns.DATE].setData(alert_transaction, role=ROLE_REQUEST_ID) items[self.Columns.DATE].setCheckable(True) if alert_transaction.txid() in self._selected_atxids_cache: items[self.Columns.DATE].setCheckState(Qt.Checked) self.model().insertRow(index, items) index += 1 # sort requests by date self.model().sort(self.Columns.DATE)
def get_card(self, item): invoice_type = item['type'] if invoice_type == PR_TYPE_LN: key = item['rhash'] status = get_request_status(item) # convert to str elif invoice_type == PR_TYPE_BIP70: key = item['id'] status = get_request_status(item) # convert to str elif invoice_type == PR_TYPE_ADDRESS: key = item['address'] status = get_request_status(item) # convert to str return { 'is_lightning': invoice_type == PR_TYPE_LN, 'screen': self, 'status': status, 'key': key, 'memo': item['message'], 'amount': self.app.format_amount_and_units(item['amount'] or 0), }
def get_card(self, item): invoice_type = item['type'] if invoice_type == PR_TYPE_LN: key = item['rhash'] status = get_request_status(item) # convert to str elif invoice_type == PR_TYPE_ONCHAIN: key = item['id'] status = get_request_status(item) # convert to str else: raise Exception('unknown invoice type') return { 'is_lightning': invoice_type == PR_TYPE_LN, 'is_bip70': 'bip70' in item, 'screen': self, 'status': status, 'key': key, 'memo': item['message'], 'amount': self.app.format_amount_and_units(item['amount'] or 0), }
def update_status(self): req = self.app.wallet.get_invoice(self.key) self.status, self.status_str = get_request_status(req) self.status_color = pr_color[self.status] self.can_pay = self.status in [PR_UNPAID, PR_FAILED] if self.can_pay and self.is_lightning and self.app.wallet.lnworker: if self.amount and self.amount > self.app.wallet.lnworker.num_sats_can_send( ): self.warning = _('Warning') + ': ' + _( 'This amount exceeds the maximum you can currently send with your channels' )
def update(self): self.wallet = self.parent.wallet domain = self.wallet.get_receiving_addresses() self.parent.update_receive_address_styling() self.model().clear() self.update_headers(self.__class__.headers) for req in self.wallet.get_sorted_requests(self.config): status = req.get('status') if status == PR_PAID: continue request_type = REQUEST_TYPE_LN if req.get( 'lightning', False) else REQUEST_TYPE_BITCOIN timestamp = req.get('time', 0) amount = req.get('amount') message = req['memo'] date = format_time(timestamp) amount_str = self.parent.format_amount(amount) if amount else "" status_str = get_request_status(req) labels = [date, message, amount_str, status_str] items = [QStandardItem(e) for e in labels] self.set_editability(items) items[self.Columns.DATE].setData(request_type, ROLE_REQUEST_TYPE) items[self.Columns.STATUS].setIcon(read_QIcon( pr_icons.get(status))) if request_type == REQUEST_TYPE_LN: items[self.Columns.DATE].setData(req['rhash'], ROLE_RHASH_OR_ADDR) items[self.Columns.DATE].setIcon(read_QIcon("lightning.png")) items[self.Columns.DATE].setData(REQUEST_TYPE_LN, ROLE_REQUEST_TYPE) else: address = req['address'] if address not in domain: continue expiration = req.get('exp', None) signature = req.get('sig') requestor = req.get('name', '') items[self.Columns.DATE].setData(address, ROLE_RHASH_OR_ADDR) if signature is not None: items[self.Columns.DATE].setIcon(read_QIcon("seal.png")) items[self.Columns.DATE].setToolTip( f'signed by {requestor}') else: items[self.Columns.DATE].setIcon(read_QIcon("bitcoin.png")) self.model().insertRow(self.model().rowCount(), items) self.filter() # sort requests by date self.model().sort(self.Columns.DATE) # hide list if empty if self.parent.isVisible(): b = self.model().rowCount() > 0 self.setVisible(b) self.parent.receive_requests_label.setVisible(b)
def update(self): _list = self.parent.wallet.get_invoices() # filter out paid invoices unless we have the log lnworker_logs = self.parent.wallet.lnworker.logs if self.parent.wallet.lnworker else {} _list = [ x for x in _list if x and x.get('status') != PR_PAID or x.get('rhash') in lnworker_logs ] self.model().clear() self.update_headers(self.__class__.headers) for idx, item in enumerate(_list): invoice_type = item['type'] if invoice_type == PR_TYPE_LN: key = item['rhash'] icon_name = 'lightning.png' elif invoice_type == PR_TYPE_ONCHAIN: key = item['id'] icon_name = 'bitcoin.png' if item.get('bip70'): icon_name = 'seal.png' else: raise Exception('Unsupported type') status, status_str = get_request_status(item) message = item['message'] amount = item['amount'] timestamp = item.get('time', 0) date_str = format_time(timestamp) if timestamp else _('Unknown') txtype_str = TxType.NONVAULT.name if 'txtype' not in item else item[ 'txtype'] txtype_str = TX_TYPES_DISPLAY_MAP[txtype_str] amount_str = self.parent.format_amount(amount, whitespaces=True) labels = [date_str, message, txtype_str, amount_str, status_str] items = [QStandardItem(e) for e in labels] self.set_editability(items) items[self.Columns.DATE].setIcon(read_QIcon(icon_name)) items[self.Columns.STATUS].setIcon(read_QIcon( pr_icons.get(status))) items[self.Columns.DATE].setData(key, role=ROLE_REQUEST_ID) items[self.Columns.DATE].setData(invoice_type, role=ROLE_REQUEST_TYPE) self.model().insertRow(idx, items) self.selectionModel().select(self.model().index(0, 0), QItemSelectionModel.SelectCurrent) # sort requests by date self.model().sort(self.Columns.DATE) # hide list if empty if self.parent.isVisible(): b = self.model().rowCount() > 0 self.setVisible(b) self.parent.invoices_label.setVisible(b) self.filter()
def refresh_status(self): m = self.std_model for r in range(m.rowCount()): idx = m.index(r, self.Columns.STATUS) date_idx = idx.sibling(idx.row(), self.Columns.DATE) date_item = m.itemFromIndex(date_idx) status_item = m.itemFromIndex(idx) key = date_item.data(ROLE_KEY) req = self.wallet.get_request(key) if req: status, status_str = get_request_status(req) status_item.setText(status_str) status_item.setIcon(read_QIcon(pr_icons.get(status)))
def refresh_status(self): m = self.model() for r in range(m.rowCount()): idx = m.index(r, self.Columns.STATUS) date_idx = idx.sibling(idx.row(), self.Columns.DATE) date_item = m.itemFromIndex(date_idx) status_item = m.itemFromIndex(idx) key = date_item.data(ROLE_RHASH_OR_ADDR) is_lightning = date_item.data(ROLE_REQUEST_TYPE) == REQUEST_TYPE_LN req = self.wallet.get_request(key, is_lightning) if req: status_str = get_request_status(req) status_item.setText(status_str) status_item.setIcon(read_QIcon(pr_icons.get(req['status'])))
def update_item(self, key, req): model = self.std_model for row in range(0, model.rowCount()): item = model.item(row, 0) if item.data(ROLE_REQUEST_ID) == key: break else: return status_item = model.item(row, self.Columns.STATUS) status, status_str = get_request_status(req) if self.parent.wallet.lnworker: log = self.parent.wallet.lnworker.logs.get(key) if log and status == PR_INFLIGHT: status_str += '... (%d)' % len(log) status_item.setText(status_str) status_item.setIcon(read_QIcon(pr_icons.get(status)))
def clear_requests_dialog(self): requests = self.app.wallet.get_sorted_requests() expired = [ req for req in requests if get_request_status(req)[0] == PR_EXPIRED ] if len(expired) == 0: return def callback(c): if c: for req in expired: key = req.get('rhash') or req['address'] self.app.wallet.delete_request(key) self.update() d = Question(_('Delete expired requests?'), callback) d.open()
def update(self): # not calling maybe_defer_update() as it interferes with conditional-visibility self.parent.update_receive_address_styling() self.proxy.setDynamicSortFilter( False) # temp. disable re-sorting after every change self.std_model.clear() self.update_headers(self.__class__.headers) for req in self.wallet.get_sorted_requests(): status, status_str = get_request_status(req) request_type = req['type'] timestamp = req.get('time', 0) amount = req.get('amount') message = req.get('message') or req.get('memo') date = format_time(timestamp) amount_str = self.parent.format_amount(amount) if amount else "" labels = [date, message, amount_str, status_str] if request_type == PR_TYPE_LN: key = req['rhash'] icon = read_QIcon("lightning.png") tooltip = 'lightning request' elif request_type == PR_TYPE_ONCHAIN: key = req['address'] icon = read_QIcon("bitcoin.png") tooltip = 'onchain request' items = [QStandardItem(e) for e in labels] self.set_editability(items) items[self.Columns.DATE].setData(request_type, ROLE_REQUEST_TYPE) items[self.Columns.DATE].setData(key, ROLE_KEY) items[self.Columns.DATE].setData(timestamp, ROLE_SORT_ORDER) items[self.Columns.DATE].setIcon(icon) items[self.Columns.STATUS].setIcon(read_QIcon( pr_icons.get(status))) items[self.Columns.DATE].setToolTip(tooltip) self.std_model.insertRow(self.std_model.rowCount(), items) self.filter() self.proxy.setDynamicSortFilter(True) # sort requests by date self.sortByColumn(self.Columns.DATE, Qt.DescendingOrder) # hide list if empty if self.parent.isVisible(): b = self.std_model.rowCount() > 0 self.setVisible(b) self.parent.receive_requests_label.setVisible(b) if not b: # list got hidden, so selected item should also be cleared: self.item_changed(None)
def update(self): _list = self.parent.wallet.get_invoices() self.model().clear() self.update_headers(self.__class__.headers) for idx, item in enumerate(_list): invoice_type = item['type'] if invoice_type == PR_TYPE_LN: key = item['rhash'] icon_name = 'lightning.png' elif invoice_type == PR_TYPE_ADDRESS: key = item['address'] icon_name = 'bitcoin.png' elif invoice_type == PR_TYPE_BIP70: key = item['id'] icon_name = 'seal.png' else: raise Exception('Unsupported type') status = item['status'] status_str = get_request_status(item) # convert to str message = item['message'] amount = item['amount'] timestamp = item.get('time', 0) date_str = format_time(timestamp) if timestamp else _('Unknown') amount_str = self.parent.format_amount(amount, whitespaces=True) labels = [date_str, message, amount_str, status_str] items = [QStandardItem(e) for e in labels] self.set_editability(items) items[self.Columns.DATE].setIcon(read_QIcon(icon_name)) items[self.Columns.STATUS].setIcon(read_QIcon( pr_icons.get(status))) items[self.Columns.DATE].setData(key, role=ROLE_REQUEST_ID) items[self.Columns.DATE].setData(invoice_type, role=ROLE_REQUEST_TYPE) self.model().insertRow(idx, items) self.selectionModel().select(self.model().index(0, 0), QItemSelectionModel.SelectCurrent) # sort requests by date self.model().sort(self.Columns.DATE) # hide list if empty if self.parent.isVisible(): b = self.model().rowCount() > 0 self.setVisible(b) self.parent.invoices_label.setVisible(b) self.filter()
def update(self): # not calling maybe_defer_update() as it interferes with conditional-visibility self.proxy.setDynamicSortFilter( False) # temp. disable re-sorting after every change self.std_model.clear() self.update_headers(self.__class__.headers) for idx, item in enumerate(self.parent.wallet.get_invoices()): invoice_type = item['type'] if invoice_type == PR_TYPE_LN: key = item['rhash'] icon_name = 'lightning.png' elif invoice_type == PR_TYPE_ONCHAIN: key = item['id'] icon_name = 'bitcoin.png' if item.get('bip70'): icon_name = 'seal.png' else: raise Exception('Unsupported type') status, status_str = get_request_status(item) message = item['message'] amount = item['amount'] timestamp = item.get('time', 0) date_str = format_time(timestamp) if timestamp else _('Unknown') amount_str = self.parent.format_amount(amount, whitespaces=True) labels = [date_str, message, amount_str, status_str] items = [QStandardItem(e) for e in labels] self.set_editability(items) items[self.Columns.DATE].setIcon(read_QIcon(icon_name)) items[self.Columns.STATUS].setIcon(read_QIcon( pr_icons.get(status))) items[self.Columns.DATE].setData(key, role=ROLE_REQUEST_ID) items[self.Columns.DATE].setData(invoice_type, role=ROLE_REQUEST_TYPE) items[self.Columns.DATE].setData(timestamp, role=ROLE_SORT_ORDER) self.std_model.insertRow(idx, items) self.filter() self.proxy.setDynamicSortFilter(True) # sort requests by date self.sortByColumn(self.Columns.DATE, Qt.DescendingOrder) # hide list if empty if self.parent.isVisible(): b = self.std_model.rowCount() > 0 self.setVisible(b) self.parent.invoices_label.setVisible(b)
def update(self): self.wallet = self.parent.wallet domain = self.wallet.get_receiving_addresses() self.parent.update_receive_address_styling() self.model().clear() self.update_headers(self.__class__.headers) for req in self.wallet.get_sorted_requests(): status = req.get('status') if status == PR_PAID: continue request_type = req['type'] timestamp = req.get('time', 0) expiration = req.get('exp', None) amount = req.get('amount') message = req.get('message') or req.get('memo') date = format_time(timestamp) amount_str = self.parent.format_amount(amount) if amount else "" status_str = get_request_status(req) labels = [date, message, amount_str, status_str] if request_type == PR_TYPE_LN: key = req['rhash'] icon = read_QIcon("lightning.png") tooltip = 'lightning request' elif request_type == PR_TYPE_ONCHAIN: key = req['address'] icon = read_QIcon("bitcoin.png") tooltip = 'onchain request' items = [QStandardItem(e) for e in labels] self.set_editability(items) items[self.Columns.DATE].setData(request_type, ROLE_REQUEST_TYPE) items[self.Columns.DATE].setData(key, ROLE_KEY) items[self.Columns.DATE].setIcon(icon) items[self.Columns.STATUS].setIcon(read_QIcon( pr_icons.get(status))) items[self.Columns.DATE].setToolTip(tooltip) self.model().insertRow(self.model().rowCount(), items) self.filter() # sort requests by date self.model().sort(self.Columns.DATE) # hide list if empty if self.parent.isVisible(): b = self.model().rowCount() > 0 self.setVisible(b) self.parent.receive_requests_label.setVisible(b)
def update_item(self, key, status, log): req = self.parent.wallet.get_invoice(key) if req is None: return model = self.model() for row in range(0, model.rowCount()): item = model.item(row, 0) if item.data(ROLE_REQUEST_ID) == key: break else: return status_item = model.item(row, self.Columns.STATUS) status_str = get_request_status(req) if log: self.logs[key] = log if status == PR_INFLIGHT: status_str += '... (%d)' % len(log) status_item.setText(status_str) status_item.setIcon(read_QIcon(pr_icons.get(status)))
def get_card(self, req): is_lightning = req.get('type') == PR_TYPE_LN if not is_lightning: address = req['address'] key = address else: key = req['rhash'] address = req['invoice'] amount = req.get('amount') description = req.get('memo', '') ci = {} ci['screen'] = self ci['address'] = address ci['is_lightning'] = is_lightning ci['key'] = key ci['amount'] = self.app.format_amount_and_units(amount) if amount else '' ci['memo'] = description ci['status'] = get_request_status(req) ci['is_expired'] = req['status'] == PR_EXPIRED return ci
def get_card(self, req): is_lightning = req.get('type') == PR_TYPE_LN if not is_lightning: address = req['address'] key = address else: key = req['rhash'] address = req['invoice'] amount = req.get('amount') description = req.get('message') or req.get('memo', '') # TODO: a db upgrade would be needed to simplify that. status, status_str = get_request_status(req) ci = {} ci['screen'] = self ci['address'] = address ci['is_lightning'] = is_lightning ci['key'] = key ci['amount'] = self.app.format_amount_and_units(amount) if amount else '' ci['memo'] = description ci['status'] = status ci['status_str'] = status_str return ci
def get_card(self, item): invoice_type = item['type'] status, status_str = get_request_status(item) # convert to str if invoice_type == PR_TYPE_LN: key = item['rhash'] log = self.app.wallet.lnworker.logs.get(key) if item['status'] == PR_INFLIGHT and log: status_str += '... (%d)' % len(log) elif invoice_type == PR_TYPE_ONCHAIN: key = item['id'] else: raise Exception('unknown invoice type') return { 'is_lightning': invoice_type == PR_TYPE_LN, 'is_bip70': 'bip70' in item, 'screen': self, 'status': status, 'status_str': status_str, 'key': key, 'memo': item['message'], 'amount': self.app.format_amount_and_units(item['amount'] or 0), }