From 87e2a4058006028c62e40b72d5aad655636f8784 Mon Sep 17 00:00:00 2001 From: Jeremy Kun Date: Wed, 1 Jun 2016 15:23:04 -0700 Subject: [PATCH] added Token model and static price redeem --- hello/models.py | 21 +++++++++++++++++++++ hello/settings.py | 2 ++ hello/urls.py | 1 + hello/views.py | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 hello/models.py diff --git a/hello/models.py b/hello/models.py new file mode 100644 index 0000000..df61f03 --- /dev/null +++ b/hello/models.py @@ -0,0 +1,21 @@ +from django.db import models +from django.utils import timezone + + +class Token(models.Model): + ''' + A model representing a token given to the user. + ''' + + created = models.DateTimeField(default=timezone.now) + + ''' + The value of the token, given to the user, which is a hashid of the + database id. + ''' + value = models.CharField(max_length=100, null=True, default=None) + + ''' + True when the token has successfully been redeemed, False otherwise. + ''' + redeemed = models.BooleanField(default=False) diff --git a/hello/settings.py b/hello/settings.py index 80ae557..d2c2329 100644 --- a/hello/settings.py +++ b/hello/settings.py @@ -33,6 +33,8 @@ TWO1_USERNAME = os.environ.get("TWO1_USERNAME") WALLET = Two1Wallet.import_from_mnemonic(mnemonic=TWO1_WALLET_MNEMONIC) +HASHIDS_SALT = os.environ.get("HASHIDS_SALT") + # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ diff --git a/hello/urls.py b/hello/urls.py index 268fd26..294b4fb 100644 --- a/hello/urls.py +++ b/hello/urls.py @@ -20,5 +20,6 @@ urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^buy$', hello.views.buy), + url(r'^redeem$', hello.views.redeem), url(r'^manifest$', hello.views.manifest), ] diff --git a/hello/views.py b/hello/views.py index 60dda78..510d8b0 100644 --- a/hello/views.py +++ b/hello/views.py @@ -1,16 +1,59 @@ +import sys import yaml +import hashids +import logging -from django.http import HttpResponse, JsonResponse +from django.core.exceptions import ObjectDoesNotExist +from django.http import JsonResponse from rest_framework.decorators import api_view from two1.bitserv.django import payment from hello import settings +from hello.models import Token + +hasher = hashids.Hashids(salt=settings.HASHIDS_SALT, min_length=5) + +logger = logging.getLogger(__name__) +logging.basicConfig(stream=sys.stdout, level=logging.INFO) @api_view(['GET']) @payment.required(100) def buy(request): - return HttpResponse('Hello 21!', status=200) + new_token = Token.objects.create() + new_token.value = hasher.encode(new_token.id) + new_token.save() + + return JsonResponse({'token': new_token.value}, status=200) + + +def _redeem(token): + try: + requested_token = Token.objects.get(value=token) + + if requested_token.redeemed: + raise ValueError() + except ObjectDoesNotExist: + logger.error('User requested token {} that does not exist'.format(token)) + return JsonResponse({'success': False, 'error': 'Invalid or redeemed token.'}, status=400) + except ValueError: + logger.error('User requested token {} that was already redeemed'.format(token)) + return JsonResponse({'success': False, 'error': 'Invalid or redeemed token.'}, status=400) + + requested_token.redeemed = True + requested_token.save() + + return JsonResponse({'success': True, "message": "Thanks!"}, status=200) + + +@api_view(['POST']) +def redeem(request): + try: + token = request.data['token'] + except KeyError: + return JsonResponse({'error': 'POST data must include "token"'}, status=400) + + return _redeem(token) @api_view(['GET'])