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