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))
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))
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))
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))
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))
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')
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')