diff options
author | Patryk Zawadzki <patrys@room-303.com> | 2015-05-28 18:07:29 +0200 |
---|---|---|
committer | Patryk Zawadzki <patrys@room-303.com> | 2015-05-28 18:08:38 +0200 |
commit | 0bf8bbec88b59ce665242ed426baf115a12247fd (patch) | |
tree | 2a99887cd64f83e58d8433e34cccf7602e98d241 /payments/__init__.py | |
parent | f7411c9ea127cac2876e8bdd5e3deca80e9192ac (diff) | |
download | django-payments-taler-0bf8bbec88b59ce665242ed426baf115a12247fd.tar.gz django-payments-taler-0bf8bbec88b59ce665242ed426baf115a12247fd.tar.bz2 django-payments-taler-0bf8bbec88b59ce665242ed426baf115a12247fd.zip |
Make payment a param for functions that need it
This allows us to reuse payment providers.
Diffstat (limited to 'payments/__init__.py')
-rw-r--r-- | payments/__init__.py | 57 |
1 files changed, 24 insertions, 33 deletions
diff --git a/payments/__init__.py b/payments/__init__.py index d2c1ad7..08c0141 100644 --- a/payments/__init__.py +++ b/payments/__init__.py @@ -55,15 +55,13 @@ class BasicProvider(object): ''' _method = 'post' - def _action(self): - return self.get_return_url() - _action = property(_action) + def get_action(self, payment): + return self.get_return_url(payment) - def __init__(self, payment, capture=True): + def __init__(self, capture=True): self._capture = capture - self.payment = payment - def get_hidden_fields(self): + def get_hidden_fields(self, payment): ''' Converts a payment into a dict containing transaction data. Use get_form instead to get a form suitable for templates. @@ -73,45 +71,48 @@ class BasicProvider(object): ''' raise NotImplementedError() - def get_form(self, data=None): + def get_form(self, payment, data=None): ''' Converts *payment* into a form suitable for Django templates. ''' from .forms import PaymentForm - return PaymentForm(self.get_hidden_fields(), - self._action, self._method) + return PaymentForm(self.get_hidden_fields(payment), + self.get_action(payment), self._method) - def process_data(self, request): + def process_data(self, payment, request): ''' Process callback request from a payment provider. ''' raise NotImplementedError() - def get_token_from_request(self, request): + def get_token_from_request(self, payment, request): ''' Return payment token from provider request. ''' raise NotImplementedError() - def get_return_url(self, extra_data=None): - payment_link = self.payment.get_process_url() + def get_return_url(self, payment, extra_data=None): + payment_link = payment.get_process_url() url = urljoin(get_base_url(), payment_link) if extra_data: qs = urlencode(extra_data) return url + '?' + qs return url - def capture(self, amount=None): + def capture(self, payment, amount=None): raise NotImplementedError() - def release(self): + def release(self, payment): raise NotImplementedError() - def refund(self): + def refund(self, payment): raise NotImplementedError() -def provider_factory(variant, payment=None): +PROVIDER_CACHE = {} + + +def provider_factory(variant): ''' Return the provider instance based on variant ''' @@ -120,22 +121,12 @@ def provider_factory(variant, payment=None): if not handler: raise ValueError('Payment variant does not exist: %s' % (variant,)) - path = handler.split('.') - if len(path) < 2: - raise ValueError('Payment variant uses an invalid payment module: %s' % - (variant,)) - module_path = str('.'.join(path[:-1])) - class_name = str(path[-1]) - module = __import__(module_path, globals(), locals(), [class_name]) - class_ = getattr(module, class_name) - return class_(payment, **config) - - -def factory(payment): - ''' - Takes the payment object and returns an appropriate provider instance. - ''' - return provider_factory(payment.variant, payment) + if not variant in PROVIDER_CACHE: + module_path, class_name = handler.rsplit('.', 1) + module = __import__(module_path, globals(), locals(), [class_name]) + class_ = getattr(module, class_name) + PROVIDER_CACHE[variant] = class_(**config) + return PROVIDER_CACHE[variant] def get_payment_model(): |