Separated payment options, for testing

This commit is contained in:
Oliver Marks 2017-01-25 22:15:43 +00:00
parent 1ef79e4532
commit 11e19fcf66
11 changed files with 129 additions and 56 deletions

View File

@ -6,7 +6,7 @@ pipeline:
- USE_DOCKER=yes
- DJANGO_SETTINGS_MODULE=config.settings.test
commands:
- python manage.py test
- python manage.py test mhackspace.subscriptions --verbosity 2
#volumes:
# postgres_data_dev: {}
@ -42,3 +42,10 @@ services:
mailhog:
image: mailhog/mailhog
deploy:
ssh:
target: test.maidstone-hackspace.org.uk:/var/www/test-maidstone-hackspace.org.uk 22
artifacts:
- build.result
- config/file
cmd: /opt/bin/redeploy.sh

1
.gitignore vendored
View File

@ -3,3 +3,4 @@ mhackspace/media/*
__pycache__/
node_modules
src
.env

View File

@ -50,6 +50,12 @@ docker-compose -f dev.yml run django python manage.py createsuperuser
If you want to export some data you entered into the admin area you can use =dumpdata= and =loaddata= to export and import.
#+BEGIN_SRC sh
docker-compose -fdev.yml run django python manage.py dumpdata feeds > mhackspace/feeds/fixtures/defaults.json
docker-compose -fdev.yml run django python manage.py loaddata mhackspace/feeds/fixtures/defaults.json
docker-compose -fdev.yml run --rm django python manage.py dumpdata feeds > mhackspace/feeds/fixtures/defaults.json
docker-compose -fdev.yml run --rm django python manage.py loaddata mhackspace/feeds/fixtures/defaults.json
#+END_SRC
** Django Commands
#+BEGIN_SRC sh
docker-compose -fdev.yml run --rm django python manage.py list_subscriptions
#+END_SRC

View File

@ -48,6 +48,7 @@ LOCAL_APPS = (
# custom users app
# Your stuff: custom apps go here
'mhackspace.users.apps.UsersConfig',
'mhackspace.subscriptions',
'mhackspace.feeds',
'mhackspace.contact',
'mhackspace.members',
@ -259,3 +260,33 @@ ADMIN_URL = '^admin/'
# Your common stuff: Below this line define 3rd party library settings
# ------------------------------------------------------------------------------
payment_providers = {
'braintree': {
'mode': 'sandbox',
'credentials': {
'merchant_id': env('BRAINTREE_MERCHANT_ID'),
'public_key': env('BRAINTREE_PUBLIC_KEY'),
'private_key': env('BRAINTREE_PRIVATE_KEY') ,
}
},
'paypal': {
"mode": "sandbox", # sandbox or live
'credentials': {
"mode": "sandbox", # sandbox or live
"client_id": end('PAYPAL_CLIENT_ID'),
"client_secret": env('PAYPAL_CLIENT_SECRET')}
},
'gocardless':{
'environment': 'sandbox',
'credentials': {
'app_id': env('GOCARDLESS_APP_ID') ,
'app_secret': env('GOCARDLESS_APP_SECRET'),
'access_token': env('GOCARDLESS_ACCESS_TOKEN'),
'merchant_id': env('GOCARDLESS_MERCHANT_ID'),
},
'redirect_url':'https://test.maidstone-hackspace.org.uk'
}
}

View File

@ -28,3 +28,17 @@ DJANGO_ACCOUNT_ALLOW_REGISTRATION=True
COMPRESS_ENABLED=
PAYMENT_ENVIRONMENT = 'sandbox'
BRAINTREE_MERCHANT_ID = ''
BRAINTREE_PUBLIC_KEY = ''
BRAINTREE_PRIVATE_KEY = ''
PAYPAL_CLIENT_ID = ""
PAYPAL_CLIENT_SECRET = ""
GOCARDLESS_APP_ID = ''
GOCARDLESS_APP_SECRET = ''
GOCARDLESS_ACCESS_TOKEN = ''
GOCARDLESS_MERCHANT_ID = ''

View File

@ -0,0 +1,27 @@
from django.core.management.base import BaseCommand
from mhackspace.subscriptions.payments import select_provider
class Command(BaseCommand):
help = 'List payment provider subscriptions'
# def add_arguments(self, parser):
# parser.add_argument(
# 'blog_id',
# nargs='*',
# type=int,
# default=False,
# help='Specify a blog to get feeds form'
# )
def handle(self, *args, **options):
provider = select_provider('gocardless')
self.stdout.write(
self.style.NOTICE(
'== Gocardless subscriptions =='))
for sub in provider.fetch_subscriptions():
self.stdout.write(
self.style.SUCCESS(
'\t{reference} - {amount} - {status} - {email}'.format(**sub)))

View File

View File

@ -2,37 +2,19 @@ from pprint import pprint
import pytz
import gocardless
import braintree
from django.conf.settings import payment_providers
# import gocardless_pro
import paypalrestsdk as paypal
# import paypalrestsdk as paypal
from website.config import settings
from website.config.settings import app_domain
# from website.config import settings
# from website.config.import app_domain
from website.config.logger import log
PROVIDER_ID = {'gocardless':1, 'paypal': 2}
PROVIDER_NAME = {1: 'gocardless', 2: 'paypal'}
payment_providers = {
'paypal': {
"mode": "sandbox", # sandbox or live
'credentials': {
"mode": "sandbox", # sandbox or live
"client_id": "AaGlNEvd26FiEJiJi53nfpXh19_oKetteV1NGkBi4DDYZSqBexKVgaz9Lp0SI82gYFSAYpsmxO4iDtxU",
"client_secret": "EMcIuDJE_VDNSNZS7C7NLi9DEHaDvVu9jlIYyCCHaLmrLuy_VQ6C0bbcRnyF-7B6CcN__Dn6HqUwsgMG"}
},
'gocardless':{
'environment': 'sandbox',
'credentials': {
'app_id': 'MNHBS3C4X4ZG211SM70WSS7WCN8B3X1KAWZBKV9S8N6KH2RNH6YZ5Z5865RFD3H6',
'app_secret': 'NE4NWYDQY4FNN1B47VT9SZ318GPQND130DW7QGQ73JMVTZQZHJQNF23ZFNP48GKV',
'access_token': 'CJ7G7V36VAH5KVAHTYXD8VE8M4M0S41EQXH2E1HTGV5AN5TAZBER36ERAF4CG2NR',
'merchant_id': '11QFXD7TTA',
},
'redirect_url':'https://test.maidstone-hackspace.org.uk'
}
}
# from website.config.logger import log
PROVIDER_ID = {'gocardless':1, 'braintree': 2}
PROVIDER_NAME = {1: 'gocardless', 2: 'braintree'}
def select_provider(type):
if type == "gocardless": return gocardless_provider()
@ -49,12 +31,12 @@ class gocardless_provider:
def __init__(self):
# gocardless are changing there api, not sure if we can switch yet
# self.client = gocardless_pro.Client(
# access_token=settings.payment_providers['gocardless']['credentials']['access_token'],
# environment=settings.payment_providers['gocardless']['environment'])
# access_token=payment_providers['gocardless']['credentials']['access_token'],
# environment=payment_providers['gocardless']['environment'])
print(settings.payment_providers.keys)
gocardless.environment = settings.payment_providers['gocardless']['environment']
gocardless.set_details(**settings.payment_providers['gocardless']['credentials'])
print(payment_providers.keys)
gocardless.environment = payment_providers['gocardless']['environment']
gocardless.set_details(**payment_providers['gocardless']['credentials'])
self.client = gocardless.client.merchant()
def subscribe_confirm(self, args):
@ -73,8 +55,8 @@ class gocardless_provider:
# print('test')
# print(dir(bill))
# print(bill.created_at)
print(dir(paying_member))
print(paying_member.reference_fields)
# print(dir(paying_member))
# print(paying_member.reference_fields)
yield {
'status': paying_member.status,
'email': user.email,
@ -83,7 +65,7 @@ class gocardless_provider:
'amount': paying_member.amount}
def get_redirect_url(self):
return settings.payment_providers['gocardless']['redirect_url']
return payment_providers['gocardless']['redirect_url']
def get_token(self):
return 'N/A'
@ -103,9 +85,9 @@ class braintree_provider:
def __init__(self):
braintree.Configuration.configure(
environment=braintree.Environment.Sandbox,
merchant_id=settings.payment_providers['braintree']['credentials']['merchant_id'],
public_key=settings.payment_providers['braintree']['credentials']['public_key'],
private_key=settings.payment_providers['braintree']['credentials']['private_key'])
merchant_id=payment_providers['braintree']['credentials']['merchant_id'],
public_key=payment_providers['braintree']['credentials']['public_key'],
private_key=payment_providers['braintree']['credentials']['private_key'])
def get_token(self):
return braintree.ClientToken.generate()
@ -150,17 +132,17 @@ class payment:
self.environment = int(mode=='production')
self.provider_id = PROVIDER_ID.get(provider)
print(settings.payment_providers)
print(payment_providers)
if provider == 'paypal':
paypal.configure(**settings.payment_providers[provider]['credentials'])
paypal.configure(**payment_providers[provider]['credentials'])
return
gocardless_pro.Client(
access_token=settings.payment_providers[provider]['credentials']['access_token'],
environment=settings.payment_providers[provider])
#~ environment = int('production' = settings.payment_providers[provider]['environment'])
gocardless.environment = settings.payment_providers[provider]['environment']
gocardless.set_details(**settings.payment_providers[provider]['credentials'])
access_token=payment_providers[provider]['credentials']['access_token'],
environment=payment_providers[provider])
#~ environment = int('production' = payment_providers[provider]['environment'])
gocardless.environment = payment_providers[provider]['environment']
gocardless.set_details(**payment_providers[provider]['credentials'])
merchant = gocardless.client.merchant()
def lookup_provider_by_id(self, provider_id):

View File

@ -1,16 +1,17 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest
from test_plus.test import TestCase
# import unittest
from mock import patch, Mock
from website.libs.payments import payment, gocardless_provider, braintree_provider
from mhackspace.subscriptions.payments import payment, gocardless_provider, braintree_provider
class TestPaymentGatewaysGocardless(unittest.TestCase):
class TestPaymentGatewaysGocardless(TestCase):
def setUp(self):
self.auth_gocardless()
@patch('website.libs.payments.gocardless.request.requests.get', autospec=True)
@patch('mhackspace.subscriptions.payments.gocardless.request.requests.get', autospec=True)
def auth_gocardless(self, mock_request):
# mock braintree initalisation request
mock_request.return_value = Mock(ok=True)
@ -49,8 +50,8 @@ class TestPaymentGatewaysGocardless(unittest.TestCase):
self.assertEqual(item.get('amount'), 20.00)
class TestPaymentGatewaysBraintree(unittest.TestCase):
@patch('website.libs.payments.braintree.Configuration.configure')
class TestPaymentGatewaysBraintree(TestCase):
@patch('mhackspace.subscriptions.payments.braintree.Configuration.configure')
def auth_braintree(self, mock_request):
# mock braintree initalisation request
mock_request.return_value = Mock(ok=True)
@ -63,7 +64,7 @@ class TestPaymentGatewaysBraintree(unittest.TestCase):
self.provider = braintree_provider()
@patch('website.libs.payments.braintree.Subscription.search')
@patch('mhackspace.subscriptions.payments.braintree.Subscription.search')
def test_fetch_subscription_braintree(self, mock_request):
provider = self.auth_braintree()

View File

@ -48,6 +48,10 @@ rcssmin==1.0.6
django-compressor==2.1
lxml==3.7.2
mock
gocardless
braintree
# Your custom requirements go here
-e git+https://github.com/olymk2/scaffold.git#egg=scaffold