/
writer.py
89 lines (70 loc) · 2.11 KB
/
writer.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
88
89
from guillotina import configure
from guillotina.component import queryAdapter
from guillotina.db.interfaces import IPartition
from guillotina.db.interfaces import IWriter
from guillotina.db.orm.interfaces import IBaseObject
from guillotina.interfaces import ICatalogDataAdapter
from guillotina.interfaces import IResource
from guillotina.utils import get_class_dotted_name
import pickle
@configure.adapter(
for_=(IBaseObject),
provides=IWriter)
class Writer(object):
part = 0
resource = False
def __init__(self, obj):
self._obj = obj
async def get_json(self):
return None
@property
def of(self):
return getattr(self._obj, '__of__', None)
@property
def type(self):
return get_class_dotted_name(self._obj)
@property
def old_serial(self):
return getattr(self._obj, '_p_serial', None)
@property
def part(self):
of = self.of
if of is not None:
writer = Writer(of)
return writer.part
return None
def serialize(self):
if self._obj is not None:
return pickle.dumps(self._obj, protocol=pickle.HIGHEST_PROTOCOL)
else:
return None
@property
def parent_id(self):
parent = getattr(self._obj, '__parent__', None)
if parent is not None:
return parent._p_oid
@property
def id(self):
return getattr(self._obj, 'id', None)
@configure.adapter(
for_=(IResource),
provides=IWriter)
class ResourceWriter(Writer):
resource = True
@property
def part(self):
if self._obj is not None:
adapter = queryAdapter(self._obj, IPartition)
if adapter is not None:
return adapter()
return None
@property
def type(self):
if self._obj is not None and hasattr(self._obj, 'type_name'):
return self._obj.type_name
else:
return get_class_dotted_name(self._obj)
async def get_json(self):
adapter = queryAdapter(self._obj, ICatalogDataAdapter)
if adapter is not None:
return adapter()