112 строки
3.3 KiB
Python
112 строки
3.3 KiB
Python
import hashlib
|
|
import logging
|
|
import uuid
|
|
|
|
from tower import ugettext as _
|
|
|
|
import paypal
|
|
|
|
|
|
log = logging.getLogger('z.paypal')
|
|
|
|
|
|
class Check(object):
|
|
"""
|
|
Run a series of tests on PayPal for either an addon or a paypal_id.
|
|
The add-on is not required, but we'll do another check or two if the
|
|
add-on is there.
|
|
"""
|
|
|
|
def __init__(self, addon=None, paypal_id=None):
|
|
# If this state flips to False, it means they need to
|
|
# go to Paypal and re-set up permissions. We'll assume the best.
|
|
self.state = {'permissions': True}
|
|
self.tests = ['id', 'refund']
|
|
for test in self.tests:
|
|
# Three states for pass:
|
|
# None: haven't tried
|
|
# False: tried but failed
|
|
# True: tried and passed
|
|
self.state[test] = {'pass': None, 'errors': []}
|
|
self.addon = addon
|
|
self.paypal_id = paypal_id
|
|
if not self.paypal_id and self.addon:
|
|
self.paypal_id = self.addon.paypal_id
|
|
|
|
def all(self):
|
|
self.check_id()
|
|
self.check_refund()
|
|
|
|
def failure(self, test, msg):
|
|
self.state[test]['errors'].append(msg)
|
|
self.state[test]['pass'] = False
|
|
|
|
def pass_(self, test):
|
|
self.state[test]['pass'] = True
|
|
|
|
def check_id(self):
|
|
"""Check that the paypal id is good."""
|
|
test_id = 'id'
|
|
if not self.paypal_id:
|
|
self.failure(test_id, _('No PayPal ID provided.'))
|
|
return
|
|
|
|
valid, msg = paypal.check_paypal_id(self.paypal_id)
|
|
if not valid:
|
|
self.failure(test_id, _('Please enter a valid email.'))
|
|
|
|
else:
|
|
self.pass_(test_id)
|
|
|
|
def check_refund(self):
|
|
"""Check that we have the refund permission."""
|
|
test_id = 'refund'
|
|
msg = _('You have not setup permissions for us to check this '
|
|
'PayPal account.')
|
|
if not self.addon:
|
|
# If there's no addon there's not even any point checking.
|
|
return
|
|
|
|
premium = self.addon.premium
|
|
if not premium:
|
|
self.state['permissions'] = False
|
|
self.failure(test_id, msg)
|
|
return
|
|
|
|
def test_paykey(self, data):
|
|
"""
|
|
Wraps get_paykey filling none optional data with test data. This
|
|
should never ever be used for real purchases.
|
|
|
|
The only things that you can set on this are:
|
|
email: who the money is going to (required)
|
|
amount: the amount of money (required)
|
|
currency: valid paypal currency, defaults to USD (optional)
|
|
"""
|
|
data.update({
|
|
'pattern': '',
|
|
'ip': '127.0.0.1',
|
|
'preapproval': None,
|
|
'slug': 'foo',
|
|
'uuid': hashlib.md5(str(uuid.uuid4())).hexdigest()
|
|
})
|
|
return paypal.get_paykey(data)
|
|
|
|
@property
|
|
def passed(self):
|
|
"""Returns a boolean to check that all the attempted tests passed."""
|
|
values = [self.state[k] for k in self.tests]
|
|
passes = [s['pass'] for s in values if s['pass'] is not None]
|
|
if passes:
|
|
return all(passes)
|
|
return False
|
|
|
|
@property
|
|
def errors(self):
|
|
errs = []
|
|
for k in self.tests:
|
|
if self.state[k]['pass'] is False:
|
|
for err in self.state[k]['errors']:
|
|
errs.append(err)
|
|
return errs
|