-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathmodel.py
More file actions
69 lines (56 loc) · 2.55 KB
/
model.py
File metadata and controls
69 lines (56 loc) · 2.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from chargebee.compat import json
class Model(object):
fields = [] # field list
repr_field = None # field to use for repr(), default is fields[0]
def __init__(self, values, sub_types=None, dependant_types=None):
if sub_types is None:
sub_types = {}
if dependant_types is None:
dependant_types = {}
self.values = values
self.sub_types = sub_types
self.dependant_types = dependant_types
for field in self.fields:
setattr(self, field, None)
def __repr__(self):
repr_field = self.repr_field or self.fields[0]
return "<chargebee.{}: {}={}>".format(self.__class__.__name__, repr_field, getattr(self, repr_field))
def __str__(self):
return json.dumps(self.values, indent=4)
def load(self, values):
for k, v in list(values.items()):
set_val = None
if isinstance(v, dict) and k in self.dependant_types:
continue
elif isinstance(v, dict):
set_val = self.sub_types[k].construct(v) if k in self.sub_types else v
elif isinstance(v, (list, tuple)):
if k in self.sub_types:
set_val = [self.sub_types[k].construct(x) for x in v]
else:
set_val = v
else:
set_val = v
if k not in ('content',): # Skipping models properties
setattr(self, k, set_val)
# Returns null for any attribute that starts with cf_ to access the custom fields.
def __getattr__(self, name):
if( name[0:3] == "cf_"):
return None
raise AttributeError("Attribute %s not found " % name)
@classmethod
def construct(cls, values, sub_types=None, dependant_types=None):
obj = cls(values, sub_types, dependant_types)
obj.load(values)
return obj
def init_dependant(self, obj, type, sub_types={}):
if obj.get(type) != None:
if isinstance(obj, dict) and type in self.dependant_types:
dependant_obj = self.dependant_types[type].construct(obj[type], sub_types)
setattr(self, type, dependant_obj)
def init_dependant_list(self, obj, type, sub_types={}):
if obj.get(type) != None:
if isinstance(obj[type],(list, tuple)) and type in self.dependant_types:
if(self.dependant_types != None):
set_val = [self.dependant_types[type].construct(dt, sub_types) for dt in obj[type]]
setattr(self, type, set_val)