Example #1
0
class Client(object):
	def __init__(self, **kwargs):
		self.billing_address = Address()
		self.drivers_license = DriversLicense()
		self.ssn = None
		self.email = None
		self.profileid = None
		self.acctid = None
		self.__dict__.update(kwargs)
		self._payment_methods = []

	def serialize(self):
		data = {
			'profile':"%s/%s" % (self.profileid, self.acctid) if self.profileid and self.acctid else None,
			'ssnl4':self.ssn[-4:] if self.ssn else None,
			'email':self.email,
			'merchid':Config.MERCHANT_ID,
			'defaultacct':'Y',
			'profileupdate':'Y',
			'account':'0000000000000',
		}
		data.update(self.billing_address.serialize())
		data.update(self.drivers_license.serialize())
		return data
	
	def deserialize(self, data):
		for key, value in data.items():
			setattr(self, key, value)
		return self

	@property
	def id(self):
		return self.profileid

	@property
	def payment_methods(self):
		if len(self._payment_methods) == 0:
			response = requests.get("%s/profile/%s//%s" % (Config.BASE_URL, self.id, Config.MERCHANT_ID), auth=(Config.USERNAME, Config.PASSWORD)).json()
			out = []
			for account in response:
				# credit / debit cards need the expiry field in the profile
				if 'expiry' in account:
					out.append(CreditCard(**account))
				# bank accounts are saved as accttype == ECHK
				elif account.get('accttype', None) == 'ECHK':
					out.append(BankAccount(**account))
			for account in out:
				account.client = self
			self._payment_methods = out
		return self._payment_methods
	
	def add_payment_method(self, method):
		method.client = self
		self._payment_methods.append(method)

	def delete(self):
		requests.delete("%s/profile/%s//%s" % (Config.BASE_URL, self.id, Config.MERCHANT_ID), auth=(Config.USERNAME, Config.PASSWORD))

	def save(self):
		# need to get own profileid to pass onto payment_methods
		resp = self.deserialize(requests.put("%s/profile" % (Config.BASE_URL), data=json.dumps(self.serialize()), auth=(Config.USERNAME, Config.PASSWORD), headers=Config.HEADERS['json']).json())
		for payment_method in self.payment_methods:
			payment_method.save()
		return resp

	@staticmethod
	def retrieve(id):
		response = requests.get("%s/profile/%s//%s" % (Config.BASE_URL, id, Config.MERCHANT_ID), auth=(Config.USERNAME, Config.PASSWORD)).json()
		for account in response:
			if account.get('defaultacct') == 'Y':
				return Client(**account)
		return None

	@staticmethod
	def create(**kwargs):
		return Client(**kwargs)