-
Notifications
You must be signed in to change notification settings - Fork 1
/
cnmcmodel.py
87 lines (71 loc) · 2.27 KB
/
cnmcmodel.py
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from collections import namedtuple, OrderedDict
import json
from decimal import Decimal, InvalidOperation
from cerberus import Validator
class CNMCValidator(Validator):
"""CNMC Schema validator
- Add support for decimal type
"""
def _validate_type_decimal(self, value):
if not isinstance(value, Decimal):
try:
Decimal(value)
except InvalidOperation:
return True
def json_decimal_default(o):
"""
Let export decimal values in JSON
:param o: value to export
:return: value converted to string
"""
if isinstance(o, Decimal):
return str(o)
class CNMCModel(object):
"""
CNMC Model base
"""
schema = OrderedDict([
('id', {'type': 'string'}),
('cini', {'type': 'string'}),
('tipus_instalacio', {'type': 'string'})
])
@property
def fields(self):
return self.schema.keys()
@property
def ref(self):
return 1
def __init__(self, *values, **kwvalues):
"""
CNMCModel constructor
:param values:
:param kwvalues:
"""
self.validator = CNMCValidator(self.schema)
stored = namedtuple('{0}_store'.format(self.__class__.__name__), self.fields)
for idx, k in enumerate(self.fields):
if idx < len(values):
kwvalues[k] = values[idx]
elif k not in kwvalues:
kwvalues[k] = None
self.store = stored(**kwvalues)
self.validator.validate(self.store._asdict())
self.store = stored(**self.validator.document)
def dump(self, out_format='json'):
if out_format == 'json':
return json.dumps(self.store._asdict(), default=json_decimal_default)
else:
return list(self.store)
def diff(self, obj, fields=None):
assert isinstance(obj, self.__class__)
diffs = {}
if fields is None:
fields = self.store._fields
for field in fields:
self_value = getattr(self.store, field)
other_value = getattr(obj.store, field)
if self_value != other_value:
diffs[field] = (self_value, other_value)
return diffs
def __cmp__(self, other):
raise NotImplementedError