Exemplo n.º 1
0
    def get(self):
        # provide a blank form.
        template = JINJA_ENV.get_template('make.html')
        ctx = CKObject()
        ctx.valid_coins = ACCOUNT_MAP.keys()
        recent = MyInvoice.recent_invoices().fetch(40)
        ctx.recent_invoices = recent

        for inv in recent:
            if inv.paid_at != None:
                inv.text_status = 'PAID'
                continue

            # check if paid.
            try:
                d = get_ck_detail(inv.ck_refnum)
            except:
                logger.error("Failed on %s" % inv.ck_refnum, exc_info=1)
                continue

            inv.details = d
            if d.is_completed or d.amount_so_far.decimal:
                # TODO: should expose total paid so far (for tips and underpayment)
                # and link to transaction numbers displayed at blockr and so on.
                conf = d.events[0].confirmed_at
                if conf != None:
                    inv.paid_at = conf
                    inv.text_status = 'PAID'
                    inv.put_async()
                else:
                    inv.text_status = 'pending'
            else:
                inv.text_status = 'unpaid'

        self.response.write(template.render(ctx))
Exemplo n.º 2
0
    def get(self):
        # provide a blank form.
        template = JINJA_ENV.get_template('make.html')
        ctx = CKObject()
        ctx.valid_coins = ACCOUNT_MAP.keys()
        recent = MyInvoice.recent_invoices().fetch(40)
        ctx.recent_invoices = recent

        for inv in recent:
            if inv.paid_at != None:
                inv.text_status = 'PAID'
                continue

            # check if paid.
            try:
                d = get_ck_detail(inv.ck_refnum)
            except:
                logger.error("Failed on %s" % inv.ck_refnum, exc_info=1)
                continue

            inv.details = d
            if d.is_completed or d.amount_so_far.decimal:
                # TODO: should expose total paid so far (for tips and underpayment)
                # and link to transaction numbers displayed at blockr and so on.
                conf = d.events[0].confirmed_at
                if conf != None:
                    inv.paid_at = conf
                    inv.text_status = 'PAID'
                    inv.put_async()
                else:
                    inv.text_status = 'pending'
            else:
                inv.text_status = 'unpaid'

        self.response.write(template.render(ctx))
Exemplo n.º 3
0
    def get(self, token, example='btc'):
        ctx = CKObject(max_time=MAX_PAY_TIME)
        if token == 'example':
            cct = example.upper()
            ctx.cct = cct
            ctx.payable = Decimal('0.1612')
            ctx.payable_cct = cct
            ctx.amount_cct = 'USD'
            ctx.amount = Decimal('100.00')
            ctx.show_fiat = True
            ctx.label = 'Doggy Dash Crypto Cash'
            ctx.pubkey = 'n1EeygjWd6WSWxMyUx8Y6RBts3Mo8aZr3S'
            ctx.time_left = 10 * 60
            ctx.is_paid = False
        else:
            # find in DB
            inv = MyInvoice.get_by_token(token)

            if not inv:
                ctx.token = token
                template = JINJA_ENV.get_template('missing.html')
                self.response.write(template.render(ctx))
                return

            ctx.update(inv.to_dict())
            cct = inv.payable_cct
            ctx.label = ctx.label or ''
            ctx.time_left = inv.get_time_left()

            d = get_ck_detail(inv.ck_refnum)
            print "details = %r" % d

            # Has it been paid?? Limitations here:
            # - should handle amounts less that desired total, for wallets that sometimes
            #   round down by a few satoshis.
            # - check # of confirmations are suitable for risk preferences
            #
            ctx.is_paid = d.is_completed or (d.amount_so_far.decimal >=
                                             ctx.payable)

            assert ctx.pubkey == d.coin.address

        if ctx.show_fiat:
            ctx.exchange_rates = [
                ('1 %s' % cct, '$612 USD'),
                ('%s %s' % (ctx.amount, cct), '$612 USD'),
            ]

        # a small dictionary of values we need to connect to pubnub
        ctx.pubnub_auth = get_pubnub_auth()

        ctx.bitcoin_link = ('bitcoin:%s?' % ctx.pubkey) + urlencode(
            dict(amount=ctx.amount, message=ctx.label[0:40]))

        template = JINJA_ENV.get_template('invoice.html')
        self.response.write(template.render(ctx))
Exemplo n.º 4
0
    def get(self, token, example='btc'):
        ctx = CKObject(max_time = MAX_PAY_TIME)
        if token == 'example':
            cct = example.upper()
            ctx.cct = cct
            ctx.payable = Decimal('0.1612')
            ctx.payable_cct = cct
            ctx.amount_cct = 'USD'
            ctx.amount = Decimal('100.00')
            ctx.show_fiat = True
            ctx.label = 'Doggy Dash Crypto Cash'
            ctx.pubkey = 'n1EeygjWd6WSWxMyUx8Y6RBts3Mo8aZr3S'
            ctx.time_left = 10*60
            ctx.is_paid = False
        else:
            # find in DB
            inv = MyInvoice.get_by_token(token)

            if not inv:
                ctx.token = token
                template = JINJA_ENV.get_template('missing.html')
                self.response.write(template.render(ctx))
                return

            ctx.update(inv.to_dict())
            cct = inv.payable_cct
            ctx.label = ctx.label or ''
            ctx.time_left = inv.get_time_left()

            d = get_ck_detail(inv.ck_refnum)
            print "details = %r" % d

            # Has it been paid?? Limitations here:
            # - should handle amounts less that desired total, for wallets that sometimes
            #   round down by a few satoshis.
            # - check # of confirmations are suitable for risk preferences
            #
            ctx.is_paid = d.is_completed or (d.amount_so_far.decimal >= ctx.payable)

            assert ctx.pubkey == d.coin.address
            
        if ctx.show_fiat: 
            ctx.exchange_rates = [
                ('1 %s' % cct, '$612 USD'), 
                ('%s %s' % (ctx.amount, cct), '$612 USD'), 
            ]

        # a small dictionary of values we need to connect to pubnub
        ctx.pubnub_auth = get_pubnub_auth()

        ctx.bitcoin_link = ('bitcoin:%s?' % ctx.pubkey) + urlencode(dict(
                            amount = ctx.amount, message = ctx.label[0:40]))
    
        template = JINJA_ENV.get_template('invoice.html')
        self.response.write(template.render(ctx))
Exemplo n.º 5
0
    def get(self, token, test_case):
        # Hack to simulate payment.
        inv = MyInvoice.get_by_token(token)

        if test_case == '0':
            msg = dict(event_code='credit_0',
                       activity='acccc-acccccc',
                       desc="Unconfirmed credit",
                       request=inv.ck_refnum)
            ret = CK_API.pubnub_send(msg)

        else:
            self.error(404)

        self.response.content_type = 'text/plain'
        self.response.write(repr(ret))
Exemplo n.º 6
0
    def get(self, token, test_case):
        # Hack to simulate payment.
        inv = MyInvoice.get_by_token(token)

        if test_case == '0':
            msg = dict(event_code = 'credit_0',
                        activity = 'acccc-acccccc',
                        desc = "Unconfirmed credit", 
                        request = inv.ck_refnum)
            ret = CK_API.pubnub_send(msg)

        else:
            self.error(404)

        self.response.content_type = 'text/plain'
        self.response.write(repr(ret))
Exemplo n.º 7
0
    def post(self):
        # build it and redirect to something.
        # NOTE: setting in app.yaml protects this for admin-only access.

        # NOTE: A real program would have validation here
        amount = Decimal(self.request.get('amount', 0))
        amount_cct = self.request.get('amount_cct', 'BTC')[0:3].upper()
        payable_cct = self.request.get('payable_cct', 'BTC')[0:3].upper()
        label = self.request.get('label', None)
        show_fiat = self.request.get('show_fiat', False)

        n = MyInvoice()
        n.amount_cct = amount_cct
        n.payable_cct = payable_cct

        if amount_cct == payable_cct:
            n.payable = amount
            n.amount = amount
        else:
            # get a spot quote.
            q = CK_API.get('/v1/spot_quote/%s/%s/%s' %
                           (payable_cct, amount_cct, amount))
            n.payable = q.result.decimal.quantize(Decimal('0.0001'))
            n.amount = amount

        n.label = label[0:190] if label else None
        n.show_fiat = bool(show_fiat)

        n.token = b32encode(os.urandom(10))

        # TODO get a pubkey for the request
        acct = ACCOUNT_MAP[payable_cct]
        r = CK_API.put('/v1/new/receive',
                       account=acct,
                       memo='See %s' % n.get_url(),
                       amount=n.payable)

        req = r.result
        n.pubkey = req.coin.address
        n.ck_refnum = req.ref_number

        # save it.
        key = n.put()

        # bugfix: not seeing the new entry in the list after redirect
        # TODO: this doesn't help! need a fix for this issue
        from google.appengine.ext import ndb
        ndb.get_context().clear_cache()

        # redirect to making page.
        self.redirect('/make')
Exemplo n.º 8
0
    def post(self):
        # build it and redirect to something.
        # NOTE: setting in app.yaml protects this for admin-only access.

        # NOTE: A real program would have validation here
        amount = Decimal(self.request.get('amount', 0))
        amount_cct = self.request.get('amount_cct', 'BTC')[0:3].upper()
        payable_cct = self.request.get('payable_cct', 'BTC')[0:3].upper()
        label = self.request.get('label', None)
        show_fiat = self.request.get('show_fiat', False)

        n = MyInvoice()
        n.amount_cct = amount_cct
        n.payable_cct = payable_cct

        if amount_cct == payable_cct:
            n.payable = amount
            n.amount = amount
        else:
            # get a spot quote.
            q = CK_API.get('/v1/spot_quote/%s/%s/%s' % (payable_cct, amount_cct, amount))
            n.payable = q.result.decimal.quantize(Decimal('0.0001'))
            n.amount = amount

        n.label = label[0:190] if label else None
        n.show_fiat = bool(show_fiat)

        n.token = b32encode(os.urandom(10))

        # TODO get a pubkey for the request
        acct = ACCOUNT_MAP[payable_cct]
        r = CK_API.put('/v1/new/receive', account = acct,
                            memo = 'See %s' % n.get_url(), amount = n.payable)

        req = r.result
        n.pubkey = req.coin.address
        n.ck_refnum = req.ref_number
        
        # save it.
        key = n.put()

        # bugfix: not seeing the new entry in the list after redirect
        # TODO: this doesn't help! need a fix for this issue
        from google.appengine.ext import ndb
        ndb.get_context().clear_cache()

        # redirect to making page.
        self.redirect('/make')