Source code for web_payments

from collections import namedtuple
from ._exceptions import (RedirectNeeded, ExternalPostNeeded,
                         PaymentError, NotInitialized, NotSupported)
from .status import PaymentStatus, FraudStatus

__all__ = ["PurchasedItem", "HttpRequest"]
__all__ += ["PaymentStatus", "FraudStatus"]
__all__ += ["RedirectNeeded", "ExternalPostNeeded"]
__all__ += ["PaymentError", "NotInitialized", "NotSupported"]
__all__ += ["provider_factory"]

PurchasedItem = namedtuple('PurchasedItem',
                           ['name', 'quantity', 'price', 'currency', 'sku'])

HttpRequest = namedtuple('HttpRequest',
                         ['method', 'GET', 'POST', 'content_type'])

# extra is a dictionary
ProviderVariant = namedtuple('ProviderVariant',
                             ['path', 'config', 'extra'])

PROVIDER_CACHE = {}

[docs]def provider_factory(variant): ''' Return the provider instance based on ProviderVariant ''' if not variant or None in variant: raise ValueError('Payment variant does not exist: %s' % (variant,)) module_path, class_name = variant.path.rsplit('.', 1) name = variant.extra.get("name", class_name) if name not in PROVIDER_CACHE: module = __import__( str(module_path), globals(), locals(), [str(class_name)]) class_ = getattr(module, class_name) provider_instance = class_(**variant.config) provextra = provider_instance.extra provider_instance.extra = {} if provextra: provider_instance.extra.update(provextra) provider_instance.extra.update(variant.extra) PROVIDER_CACHE[name] = provider_instance return PROVIDER_CACHE[name]