types.py
2.71 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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from importlib import import_module
from pprint import pformat
from datetime import datetime
from pytz import timezone
from floraconcierge import errors
MIN_INT_TO_DATETIME = 500000000
# If int value is greater then this constant, object will have field ${field}_date which will be datetime type.
# Date 05.11.1985. Too big value for usual usage and fine date :)
def module_name_from_class(cls):
class_name = ('floraconcierge.mapping.%s' % cls.replace("_", '.').lower()).split('.')
module, name = ".".join(class_name[:-1]), class_name[-1].capitalize()
return module, name
def from_dict(obj):
"""
Creates floraconcierge api result object instance
@param obj: dict
@return: Object
"""
if '_className' in obj and obj['_className']:
module, name = module_name_from_class(obj['_className'])
try:
m = import_module(module)
cls = getattr(m, name)
except (ImportError, AttributeError):
errtpl = '%s.%s for api "%s" mapping not found'
raise errors.ModelMappingNotFoundError(errtpl % (module, name, obj['_className']))
return cls(**obj)
return Object(**obj)
class Object(object):
def __init__(self, *args, **kwargs):
super(Object, self).__init__()
if '_className' in kwargs:
del kwargs['_className']
extra = {}
for k, v in kwargs.iteritems():
if not isinstance(v, (int, float)):
try:
v = int(v)
except (ValueError, TypeError):
try:
v = float(v)
except (ValueError, TypeError):
pass
magic_date = '%s_date' % k
if isinstance(v, (int, float)) and v > MIN_INT_TO_DATETIME and magic_date not in kwargs:
try:
extra[magic_date] = datetime.fromtimestamp(v, timezone('Europe/Moscow'))
except:
extra[magic_date] = None
kwargs[k] = v
self.__dict__.update(kwargs)
self.__dict__.update(extra)
def __repr__(self):
if not hasattr(self, '_repr_cache'):
setattr(self, '_repr_cache', '<%s %s>' % (self.__class__.__name__, pformat(self.__dict__)))
return getattr(self, '_repr_cache')
def __iter__(self):
if hasattr(super(Object, self), '__iter__'):
# noinspection PyUnresolvedReferences
return super(Object, self).__iter__()
return self.__dict__.copy().iteritems()
def todict(self):
data = self.__dict__
data.pop('_repr_cache', None)
return data
def datetime(self, unixtime):
return datetime.fromtimestamp(int(unixtime))