-
-
Notifications
You must be signed in to change notification settings - Fork 34
/
Renderer.py
65 lines (49 loc) · 2.02 KB
/
Renderer.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
import sys
from App.class_init import InitializeClass
from AccessControl import ClassSecurityInfo
from Acquisition import ImplicitAcquisitionWrapper
_marker = []
class ArchetypesRenderer:
security = ClassSecurityInfo()
# TODO: more security
def render(self, field_name, mode, widget, instance=None,
field=None, accessor=None, **kwargs):
if field is None:
field = instance.Schema()[field_name]
if accessor is None:
accessor = field.getAccessor(instance)
context = self.setupContext(field_name, mode, widget,
instance, field, accessor, **kwargs)
result = widget(mode, instance, context)
del context
return result
def setupContext(self, field_name, mode, widget, instance, field, \
accessor, **kwargs):
# look for the context in the stack
frame = sys._getframe()
context = _marker
while context is _marker and frame is not None:
context = frame.f_locals.get('econtext', _marker)
frame = frame.f_back
if context is _marker:
raise RuntimeError, 'Context not found'
# for editing of multiple AT-based content at once we might want to
# prefix the field-name.
if 'fieldprefix' in kwargs:
field_name = '%s%s' % (kwargs['fieldprefix'], field_name)
widget = ImplicitAcquisitionWrapper(widget, instance)
field = ImplicitAcquisitionWrapper(field, instance)
context.setLocal('here', instance)
context.setLocal('fieldName', field_name)
context.setLocal('accessor', accessor)
context.setLocal('widget', widget)
context.setLocal('field', field)
context.setLocal('mode', mode)
context.setLocal('UID',instance.UID())
if kwargs:
for k,v in kwargs.items():
context.setLocal(k, v)
del frame
return context
InitializeClass(ArchetypesRenderer)
renderer = ArchetypesRenderer()