示例#1
0
 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')
示例#2
0
    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)
示例#3
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_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),
     }
示例#4
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),
     }
示例#5
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)
示例#7
0
    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()
示例#8
0
 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'])))
示例#10
0
 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)))
示例#11
0
    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()
示例#12
0
 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)
示例#13
0
    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()
示例#14
0
 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)
示例#15
0
 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)
示例#16
0
 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)))
示例#17
0
 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
示例#18
0
 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
示例#19
0
 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),
     }