NewsBlur/vendor/paypalapi/settings.py

145 lines
5.3 KiB
Python
Raw Normal View History

2013-03-31 23:08:24 -07:00
# coding=utf-8
"""
This module contains config objects needed by paypal.interface.PayPalInterface.
Most of this is transparent to the end developer, as the PayPalConfig object
is instantiated by the PayPalInterface object.
"""
2014-11-07 15:10:50 -08:00
2013-03-31 23:08:24 -07:00
import logging
import os
from pprint import pformat
2014-11-07 15:10:50 -08:00
from vendor.paypalapi.exceptions import PayPalConfigError
2013-03-31 23:08:24 -07:00
logger = logging.getLogger('paypal.settings')
2014-11-07 15:10:50 -08:00
2013-03-31 23:08:24 -07:00
class PayPalConfig(object):
"""
The PayPalConfig object is used to allow the developer to perform API
queries with any number of different accounts or configurations. This
is done by instantiating paypal.interface.PayPalInterface, passing config
directives as keyword args.
"""
# Used to validate correct values for certain config directives.
_valid_ = {
'API_ENVIRONMENT': ['SANDBOX', 'PRODUCTION'],
'API_AUTHENTICATION_MODE': ['3TOKEN', 'CERTIFICATE'],
}
# Various API servers.
_API_ENDPOINTS = {
# In most cases, you want 3-Token. There's also Certificate-based
2014-11-07 15:10:50 -08:00
# authentication, which uses different servers.
2013-03-31 23:08:24 -07:00
'3TOKEN': {
'SANDBOX': 'https://api-3t.sandbox.paypal.com/nvp',
'PRODUCTION': 'https://api-3t.paypal.com/nvp',
2014-11-07 15:10:50 -08:00
},
'CERTIFICATE': {
'SANDBOX': 'https://api.sandbox.paypal.com/nvp',
'PRODUCTION': 'https://api.paypal.com/nvp',
},
2013-03-31 23:08:24 -07:00
}
_PAYPAL_URL_BASE = {
2014-11-07 15:10:50 -08:00
'SANDBOX': 'https://www.sandbox.paypal.com/cgi-bin/webscr',
'PRODUCTION': 'https://www.paypal.com/cgi-bin/webscr',
2013-03-31 23:08:24 -07:00
}
API_VERSION = '98.0'
# Defaults. Used in the absence of user-specified values.
API_ENVIRONMENT = 'SANDBOX'
API_AUTHENTICATION_MODE = '3TOKEN'
# 3TOKEN credentials
API_USERNAME = None
API_PASSWORD = None
API_SIGNATURE = None
2014-11-07 15:10:50 -08:00
# CERTIFICATE credentials
API_CERTIFICATE_FILENAME = None
API_KEY_FILENAME = None
2013-03-31 23:08:24 -07:00
# API Endpoints are just API server addresses.
API_ENDPOINT = None
PAYPAL_URL_BASE = None
# API Endpoint CA certificate chain. If this is True, do a simple SSL
# certificate check on the endpoint. If it's a full path, verify against
# a private cert.
# e.g. '/etc/ssl/certs/Verisign_Class_3_Public_Primary_Certification_Authority.pem'
API_CA_CERTS = True
# UNIPAY credentials
UNIPAY_SUBJECT = None
ACK_SUCCESS = "SUCCESS"
ACK_SUCCESS_WITH_WARNING = "SUCCESSWITHWARNING"
# In seconds. Depending on your setup, this may need to be higher.
HTTP_TIMEOUT = 15.0
def __init__(self, **kwargs):
"""
PayPalConfig constructor. **kwargs catches all of the user-specified
config directives at time of instantiation. It is fine to set these
values post-instantiation, too.
Some basic validation for a few values is performed below, and defaults
are applied for certain directives in the absence of
user-provided values.
"""
if kwargs.get('API_ENVIRONMENT'):
api_environment = kwargs['API_ENVIRONMENT'].upper()
# Make sure the environment is one of the acceptable values.
if api_environment not in self._valid_['API_ENVIRONMENT']:
raise PayPalConfigError('Invalid API_ENVIRONMENT')
else:
self.API_ENVIRONMENT = api_environment
if kwargs.get('API_AUTHENTICATION_MODE'):
auth_mode = kwargs['API_AUTHENTICATION_MODE'].upper()
# Make sure the auth mode is one of the known/implemented methods.
if auth_mode not in self._valid_['API_AUTHENTICATION_MODE']:
choices = ", ".join(self._valid_['API_AUTHENTICATION_MODE'])
raise PayPalConfigError(
"Not a supported auth mode. Use one of: %s" % choices
)
else:
self.API_AUTHENTICATION_MODE = auth_mode
# Set the API endpoints, which is a cheesy way of saying API servers.
self.API_ENDPOINT = self._API_ENDPOINTS[self.API_AUTHENTICATION_MODE][self.API_ENVIRONMENT]
self.PAYPAL_URL_BASE = self._PAYPAL_URL_BASE[self.API_ENVIRONMENT]
# Set the CA_CERTS location. This can either be a None, a bool, or a
# string path.
if 'API_CA_CERTS' in kwargs:
2013-03-31 23:08:24 -07:00
self.API_CA_CERTS = kwargs['API_CA_CERTS']
if isinstance(self.API_CA_CERTS, str) and not os.path.exists(self.API_CA_CERTS):
2013-03-31 23:08:24 -07:00
# A CA Cert path was specified, but it's invalid.
raise PayPalConfigError('Invalid API_CA_CERTS')
2014-11-07 15:10:50 -08:00
# check authentication fields
if self.API_AUTHENTICATION_MODE in ('3TOKEN', 'CERTIFICATE'):
auth_args = ['API_USERNAME', 'API_PASSWORD']
if self.API_AUTHENTICATION_MODE == '3TOKEN':
auth_args.append('API_SIGNATURE')
elif self.API_AUTHENTICATION_MODE == 'CERTIFICATE':
auth_args.extend(['API_CERTIFICATE_FILENAME', 'API_KEY_FILENAME'])
for arg in auth_args:
2013-03-31 23:08:24 -07:00
if arg not in kwargs:
raise PayPalConfigError('Missing in PayPalConfig: %s ' % arg)
setattr(self, arg, kwargs[arg])
for arg in ['HTTP_TIMEOUT']:
if arg in kwargs:
setattr(self, arg, kwargs[arg])
logger.debug(
'PayPalConfig object instantiated with kwargs: %s' % pformat(kwargs)
)