From 11e19fcf660d682fba2df99468ac4329bccc6001 Mon Sep 17 00:00:00 2001 From: Oliver Marks Date: Wed, 25 Jan 2017 22:15:43 +0000 Subject: [PATCH] Separated payment options, for testing --- .drone.yml | 9 ++- .gitignore | 3 +- README.org | 10 ++- config/settings/common.py | 31 ++++++++ env.example | 14 ++++ .../management/commands/list_subscriptions.py | 27 +++++++ mhackspace/subscriptions/models.py | 0 mhackspace/subscriptions/payments.py | 72 +++++++------------ mhackspace/subscriptions/tests/__init__.py | 0 .../tests/test_payment_gateways.py | 15 ++-- requirements/base.txt | 4 ++ 11 files changed, 129 insertions(+), 56 deletions(-) create mode 100644 mhackspace/subscriptions/management/commands/list_subscriptions.py create mode 100644 mhackspace/subscriptions/models.py create mode 100644 mhackspace/subscriptions/tests/__init__.py diff --git a/.drone.yml b/.drone.yml index 1a0b06b..3075c22 100644 --- a/.drone.yml +++ b/.drone.yml @@ -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 diff --git a/.gitignore b/.gitignore index 77f1faa..51d4744 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ mhackspace/media/* .idea/ __pycache__/ node_modules -src \ No newline at end of file +src +.env \ No newline at end of file diff --git a/README.org b/README.org index 6b38aa2..7c21250 100644 --- a/README.org +++ b/README.org @@ -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 diff --git a/config/settings/common.py b/config/settings/common.py index 08f80c5..5dd17db 100644 --- a/config/settings/common.py +++ b/config/settings/common.py @@ -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' + } +} + diff --git a/env.example b/env.example index cef45fe..2324613 100644 --- a/env.example +++ b/env.example @@ -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 = '' diff --git a/mhackspace/subscriptions/management/commands/list_subscriptions.py b/mhackspace/subscriptions/management/commands/list_subscriptions.py new file mode 100644 index 0000000..a4e1d39 --- /dev/null +++ b/mhackspace/subscriptions/management/commands/list_subscriptions.py @@ -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))) diff --git a/mhackspace/subscriptions/models.py b/mhackspace/subscriptions/models.py new file mode 100644 index 0000000..e69de29 diff --git a/mhackspace/subscriptions/payments.py b/mhackspace/subscriptions/payments.py index c9c9003..edc4bae 100644 --- a/mhackspace/subscriptions/payments.py +++ b/mhackspace/subscriptions/payments.py @@ -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): diff --git a/mhackspace/subscriptions/tests/__init__.py b/mhackspace/subscriptions/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mhackspace/subscriptions/tests/test_payment_gateways.py b/mhackspace/subscriptions/tests/test_payment_gateways.py index 818b030..81c686b 100644 --- a/mhackspace/subscriptions/tests/test_payment_gateways.py +++ b/mhackspace/subscriptions/tests/test_payment_gateways.py @@ -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() diff --git a/requirements/base.txt b/requirements/base.txt index 7c50ff3..9343860 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -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