Skip to content
This repository has been archived by the owner on Jan 25, 2018. It is now read-only.

Commit

Permalink
Merge pull request #17 from andymckay/816156
Browse files Browse the repository at this point in the history
refactor into a simple lib a few utility methods (bug 816156)
  • Loading branch information
Andy McKay committed Nov 29, 2012
2 parents 537038d + 57ba66b commit 8991a14
Show file tree
Hide file tree
Showing 13 changed files with 129 additions and 103 deletions.
26 changes: 20 additions & 6 deletions lib/bango/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,16 +162,30 @@ def call(self, name, data, wsdl=''):
This fakes out the client and just looks up the values in mock_results
for that service.
"""
bango = Mock()
bango.__keylist__ = self.mock_results(name).keys()
for k, v in self.mock_results(name).iteritems():
if callable(v):
v = v()
setattr(bango, k, v)
bango = dict_to_mock(self.mock_results(name), callables=True)
self.is_error(bango.responseCode, bango.responseMessage)
return bango


def response_to_dict(resp):
"""Converts a suds response into a dictionary suitable for JSON"""
return dict((k, getattr(resp, k)) for k in resp.__keylist__)


def dict_to_mock(data, callables=False):
"""
Converts a dictionary into a suds like mock.
callables: will call any value if its callable, default False.
"""
result = Mock()
result.__keylist__ = data.keys()
for k, v in data.iteritems():
if callables and callable(v):
v = v()
setattr(result, k, v)
return result


def get_client():
"""
Use this to get the right client and communicate with Bango.
Expand Down
15 changes: 6 additions & 9 deletions lib/bango/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,8 @@ class UpdateForm(forms.Form):


class CreateBangoNumberForm(forms.Form):
seller_bango = URLField(
to='lib.bango.resources.package.PackageResource')
seller_product = URLField(
to='lib.sellers.resources.SellerProductResource')
seller_bango = URLField(to='lib.bango.resources.package.PackageResource')
seller_product = URLField(to='lib.sellers.resources.SellerProductResource')
name = forms.CharField(max_length=100)
# TODO: Expand this bug 814492.
categoryId = forms.IntegerField()
Expand All @@ -93,7 +91,7 @@ class SellerProductForm(forms.Form):
# Base class for a form that interacts using the
# seller_product_bango resource.
seller_product_bango = URLField(
to='lib.bango.resources.package.BangoProductResource')
to='lib.bango.resources.package.BangoProductResource')

@property
def bango_data(self):
Expand All @@ -105,7 +103,7 @@ def bango_data(self):

class MakePremiumForm(SellerProductForm):
currencyIso = forms.ChoiceField(choices=([r, r] for r
in CURRENCIES.keys()))
in CURRENCIES.keys()))
price = forms.DecimalField()


Expand All @@ -117,7 +115,7 @@ class UpdateRatingForm(SellerProductForm):
class CreateBillingConfigurationForm(SellerProductForm):
price_amount = forms.DecimalField()
price_currency = forms.ChoiceField(choices=([r, r] for r
in CURRENCIES.keys()))
in CURRENCIES.keys()))
pageTitle = forms.CharField()

@property
Expand All @@ -129,8 +127,7 @@ def bango_data(self):


class CreateBankDetailsForm(forms.Form):
seller_bango = URLField(
to='lib.bango.resources.package.PackageResource')
seller_bango = URLField(to='lib.bango.resources.package.PackageResource')
bankAccountPayeeName = forms.CharField(max_length=50)
bankAccountNumber = forms.CharField(max_length=20, required=False)
bankAccountCode = forms.CharField(max_length=20)
Expand Down
24 changes: 0 additions & 24 deletions lib/bango/resources/bank.py

This file was deleted.

6 changes: 3 additions & 3 deletions lib/bango/resources/billing.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ def obj_create(self, bundle, request, **kwargs):

config = billing.factory.create('ArrayOfBillingConfigurationOption')
configs = {
'APPLICATION_CATEGORY_ID': '18',
'APPLICATION_SIZE_KB': 2,
'BILLING_CONFIGURATION_TIME_OUT': 120
'APPLICATION_CATEGORY_ID': '18',
'APPLICATION_SIZE_KB': 2,
'BILLING_CONFIGURATION_TIME_OUT': 120
}
for k, v in configs.items():
opt = billing.factory.create('BillingConfigurationOption')
Expand Down
39 changes: 36 additions & 3 deletions lib/bango/resources/cached.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from django.core.urlresolvers import reverse

from solitude.base import Cached, Resource as BaseResource
from ..client import get_client, response_to_dict
from ..signals import create


class Resource(BaseResource):
Expand All @@ -10,9 +12,40 @@ class Meta(BaseResource.Meta):

def get_resource_uri(self, bundle):
return reverse('api_dispatch_detail',
kwargs={'api_name': 'bango',
'resource_name': self._meta.resource_name,
'pk': bundle.obj.pk})
kwargs={'api_name': 'bango',
'resource_name': self._meta.resource_name,
'pk': bundle.obj.pk})

def obj(self, pk=None):
return self._meta.object_class(prefix=self._meta.resource_name, pk=pk)


class SimpleResource(Resource):
"""
A simple Bango base resource, for use with some of the simpler Bango APIs
which just take data and pass it on as a POST and don't do much with the
data. Use and override as neccessary.
"""

class Meta(Resource.Meta):
list_allowed_methods = ['post']
simple_form = None # Point to the form you'd like to use.
simple_api = None # This is the Bango API that will be called.

def check_meta(self):
# Just in case someone forgot to override.
for k in ['simple_form', 'simple_api']:
if not getattr(self._meta, k):
raise ValueError('%s not set' % k)

def obj_create(self, bundle, request, **kwargs):
self.check_meta()

form = self._meta.simple_form(bundle.data)
if not form.is_valid():
raise self.form_errors(form)

resp = getattr(get_client(), self._meta.simple_api)(form.bango_data)
create.send(sender=self, bundle=bundle,
data=response_to_dict(resp), form=form)
return bundle
11 changes: 6 additions & 5 deletions lib/bango/resources/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,12 @@ def obj_create(self, bundle, request, **kw):

resp = get_client().CreatePackage(form.bango_data)
seller_bango = SellerBango.objects.create(
seller=form.cleaned_data['seller'],
package_id=resp.packageId,
admin_person_id=resp.adminPersonId,
support_person_id=resp.supportPersonId,
finance_person_id=resp.financePersonId)
seller=form.cleaned_data['seller'],
package_id=resp.packageId,
admin_person_id=resp.adminPersonId,
support_person_id=resp.supportPersonId,
finance_person_id=resp.financePersonId
)
bundle.obj = seller_bango
return bundle

Expand Down
20 changes: 0 additions & 20 deletions lib/bango/resources/premium.py

This file was deleted.

20 changes: 0 additions & 20 deletions lib/bango/resources/rating.py

This file was deleted.

28 changes: 28 additions & 0 deletions lib/bango/resources/simple.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from cached import SimpleResource

from lib.bango.forms import (CreateBankDetailsForm, MakePremiumForm,
UpdateRatingForm)


class CreateBankDetailsResource(SimpleResource):

class Meta(SimpleResource.Meta):
resource_name = 'bank'
simple_form = CreateBankDetailsForm
simple_api = 'CreateBankDetails'


class UpdateRatingResource(SimpleResource):

class Meta(SimpleResource.Meta):
resource_name = 'update-rating'
simple_form = UpdateRatingForm
simple_api = 'UpdateRating'


class MakePremiumResource(SimpleResource):

class Meta(SimpleResource.Meta):
resource_name = 'make-premium'
simple_form = MakePremiumForm
simple_api = 'MakePremiumPerAccess'
13 changes: 12 additions & 1 deletion lib/bango/tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from nose.tools import eq_
import test_utils

from ..client import get_client, Client, ClientMock, ClientProxy
from ..client import get_client, Client, ClientMock, ClientProxy, response_to_dict, dict_to_mock
from ..constants import OK, ACCESS_DENIED
from ..errors import AuthError, BangoError

Expand Down Expand Up @@ -115,3 +115,14 @@ def test_ok(self, post):
res = self.bango.CreatePackage({'foo': 'bar'})
eq_(res.packageId, 1)
assert 'CreatePackageResponse' in str(res)


def test_convert_data():
data = {'foo': 'bar'}
eq_(data, response_to_dict(dict_to_mock(data)))


def test_callable():
data = {'foo': lambda: 'x'}
assert callable(dict_to_mock(data).foo)
assert not callable(dict_to_mock(data, callables=True).foo)
11 changes: 11 additions & 0 deletions lib/bango/tests/test_resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from solitude.base import APITest

from ..client import ClientMock
from ..resources.cached import SimpleResource

import samples

Expand All @@ -29,6 +30,16 @@ def create(self):
self.seller_product = SellerProduct.objects.create(seller=self.seller)


class TestSimple(APITest):

def test_raises(self):
class Foo(SimpleResource):
pass

with self.assertRaises(ValueError):
Foo().check_meta()


@mock.patch.object(settings, 'BANGO_MOCK', True)
class TestPackageResource(BangoAPI):

Expand Down
12 changes: 5 additions & 7 deletions lib/bango/urls.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
from tastypie.api import Api

from .resources.bank import CreateBankDetailsResource
from .resources import simple
from .resources.billing import CreateBillingConfigurationResource
from .resources.package import BangoProductResource, PackageResource
from .resources.premium import MakePremiumResource
from .resources.rating import UpdateRatingResource


bango = Api(api_name='bango')
for lib in (CreateBankDetailsResource,
CreateBillingConfigurationResource,
for lib in (CreateBillingConfigurationResource,
BangoProductResource,
MakePremiumResource,
PackageResource,
UpdateRatingResource):
simple.MakePremiumResource,
simple.UpdateRatingResource,
simple.CreateBankDetailsResource):
bango.register(lib())
7 changes: 2 additions & 5 deletions lib/proxy/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from django_statsd.clients import statsd
import requests

from lib.bango.client import get_client as bango_client
from lib.bango.client import get_client as bango_client, response_to_dict
from lib.bango.constants import HEADERS_SERVICE_GET
from lib.bango.errors import BangoError

Expand Down Expand Up @@ -129,11 +129,8 @@ def call(self):
})
return response

# This is going to go pear shaped with complicated data, but works
# well so far.
response.status_code = 200
response.content = json.dumps(dict([[k, getattr(result, k)]
for k in result.__keylist__]))
response.content = json.dumps(response_to_dict(result))
return response


Expand Down

0 comments on commit 8991a14

Please sign in to comment.