1from __future__ import absolute_import, division, print_function
2
3from stripe import api_requestor, util
4from stripe.six.moves.urllib.parse import quote_plus
5
6
7def nested_resource_class_methods(
8 resource, path=None, operations=None, resource_plural=None
9):
10 if resource_plural is None:
11 resource_plural = "%ss" % resource
12 if path is None: 12 ↛ 14line 12 didn't jump to line 14, because the condition on line 12 was never false
13 path = resource_plural
14 if operations is None: 14 ↛ 15line 14 didn't jump to line 15, because the condition on line 14 was never true
15 raise ValueError("operations list required")
16
17 def wrapper(cls):
18 def nested_resource_url(cls, id, nested_id=None):
19 url = "%s/%s/%s" % (
20 cls.class_url(),
21 quote_plus(id),
22 quote_plus(path),
23 )
24 if nested_id is not None:
25 url += "/%s" % quote_plus(nested_id)
26 return url
27
28 resource_url_method = "%ss_url" % resource
29 setattr(cls, resource_url_method, classmethod(nested_resource_url))
30
31 def nested_resource_request(
32 cls,
33 method,
34 url,
35 api_key=None,
36 idempotency_key=None,
37 stripe_version=None,
38 stripe_account=None,
39 **params
40 ):
41 requestor = api_requestor.APIRequestor(
42 api_key, api_version=stripe_version, account=stripe_account
43 )
44 headers = util.populate_headers(idempotency_key)
45 response, api_key = requestor.request(method, url, params, headers)
46 return util.convert_to_stripe_object(
47 response, api_key, stripe_version, stripe_account
48 )
49
50 resource_request_method = "%ss_request" % resource
51 setattr(
52 cls, resource_request_method, classmethod(nested_resource_request)
53 )
54
55 for operation in operations:
56 if operation == "create":
57
58 def create_nested_resource(cls, id, **params):
59 url = getattr(cls, resource_url_method)(id)
60 return getattr(cls, resource_request_method)(
61 "post", url, **params
62 )
63
64 create_method = "create_%s" % resource
65 setattr(
66 cls, create_method, classmethod(create_nested_resource)
67 )
68
69 elif operation == "retrieve":
70
71 def retrieve_nested_resource(cls, id, nested_id, **params):
72 url = getattr(cls, resource_url_method)(id, nested_id)
73 return getattr(cls, resource_request_method)(
74 "get", url, **params
75 )
76
77 retrieve_method = "retrieve_%s" % resource
78 setattr(
79 cls, retrieve_method, classmethod(retrieve_nested_resource)
80 )
81
82 elif operation == "update":
83
84 def modify_nested_resource(cls, id, nested_id, **params):
85 url = getattr(cls, resource_url_method)(id, nested_id)
86 return getattr(cls, resource_request_method)(
87 "post", url, **params
88 )
89
90 modify_method = "modify_%s" % resource
91 setattr(
92 cls, modify_method, classmethod(modify_nested_resource)
93 )
94
95 elif operation == "delete":
96
97 def delete_nested_resource(cls, id, nested_id, **params):
98 url = getattr(cls, resource_url_method)(id, nested_id)
99 return getattr(cls, resource_request_method)(
100 "delete", url, **params
101 )
102
103 delete_method = "delete_%s" % resource
104 setattr(
105 cls, delete_method, classmethod(delete_nested_resource)
106 )
107
108 elif operation == "list": 108 ↛ 120line 108 didn't jump to line 120, because the condition on line 108 was never false
109
110 def list_nested_resources(cls, id, **params):
111 url = getattr(cls, resource_url_method)(id)
112 return getattr(cls, resource_request_method)(
113 "get", url, **params
114 )
115
116 list_method = "list_%s" % resource_plural
117 setattr(cls, list_method, classmethod(list_nested_resources))
118
119 else:
120 raise ValueError("Unknown operation: %s" % operation)
121
122 return cls
123
124 return wrapper