1from __future__ import absolute_import, division, print_function 2 3from stripe import error 4from stripe import util 5from stripe.api_resources import Customer 6from stripe.api_resources.abstract import CreateableAPIResource 7from stripe.api_resources.abstract import UpdateableAPIResource 8from stripe.api_resources.abstract import VerifyMixin 9from stripe.six.moves.urllib.parse import quote_plus 10 11 12class Source(CreateableAPIResource, UpdateableAPIResource, VerifyMixin): 13 OBJECT_NAME = "source" 14 15 def detach(self, idempotency_key=None, **params): 16 token = util.utf8(self.id) 17 18 if hasattr(self, "customer") and self.customer: 19 extn = quote_plus(token) 20 customer = util.utf8(self.customer) 21 base = Customer.class_url() 22 owner_extn = quote_plus(customer) 23 url = "%s/%s/sources/%s" % (base, owner_extn, extn) 24 headers = util.populate_headers(idempotency_key) 25 26 self.refresh_from(self.request("delete", url, params, headers)) 27 return self 28 29 else: 30 raise error.InvalidRequestError( 31 "Source %s does not appear to be currently attached " 32 "to a customer object." % token, 33 "id", 34 ) 35 36 def source_transactions(self, **params): 37 return self.request( 38 "get", self.instance_url() + "/source_transactions", params 39 ) 40