|
37 |
import univention.admin.syntax as udm_syntax |
37 |
import univention.admin.syntax as udm_syntax |
38 |
|
38 |
|
39 |
from ...log import MODULE |
39 |
from ...log import MODULE |
|
|
40 |
from ...config import ucr |
40 |
|
41 |
|
41 |
|
42 |
|
42 |
class Widget(object): |
43 |
class Widget(object): |
43 |
|
44 |
|
44 |
'''Describes a widget for the new web frontend''' |
45 |
'''Describes a widget for the web frontend''' |
45 |
|
46 |
|
46 |
def __init__(self, name, syntax_classes, default_value, subclasses=True, widget_func=None): |
47 |
def __init__(self, name, syntax_classes, default_value, subclasses=True, widget_func=None): |
47 |
self._name = name |
48 |
self._name = name |
Lines 67-73
def name(self, syntax, udm_property):
|
Link Here
|
---|
|
67 |
def default_value(self): |
68 |
def default_value(self): |
68 |
return self._default_value |
69 |
return self._default_value |
69 |
|
70 |
|
70 |
__widgets = ( |
71 |
def __repr__(self): |
|
|
72 |
if isinstance(self._syntax_classes, (list, tuple)): |
73 |
syntax = ','.join(getattr(x, 'name', str(x)) for x in self._syntax_classes) |
74 |
else: |
75 |
syntax = self._syntax_classes.name |
76 |
return '<Widget(%s, syntax=%s, default=%r)>' % (self._name, syntax, self._default_value) |
77 |
|
78 |
|
79 |
class _UCRWidget(Widget): |
80 |
|
81 |
def __init__(self, syntax_classes, default, subclasses, widget_func): |
82 |
super(_UCRWidget, self).__init__(None, syntax_classes, default, subclasses, widget_func) |
83 |
self._syntax_classes_names = syntax_classes |
84 |
|
85 |
def __contains__(self, syntax): |
86 |
# in case a syntax-reload has been done we need to reuse the newly ones |
87 |
self._syntax_classes = tuple(filter(None, (getattr(udm_syntax, s, None) for s in self._syntax_classes_names))) |
88 |
return super(_UCRWidget, self).__contains__(syntax) |
89 |
|
90 |
@classmethod |
91 |
def load(cls): |
92 |
identifier = 'directory/manager/web/widget/' |
93 |
syntaxes = {} |
94 |
for key, val in ucr.items(): |
95 |
if not key.startswith(identifier): |
96 |
continue |
97 |
key = key[len(identifier):] |
98 |
try: |
99 |
name, key = key.split('/', 1) |
100 |
except ValueError: |
101 |
continue |
102 |
syntaxes.setdefault(name, {}).setdefault(key, val) |
103 |
|
104 |
widgets = [] |
105 |
for name, props in syntaxes.iteritems(): |
106 |
try: |
107 |
widget = props['widget'] |
108 |
except KeyError: |
109 |
MODULE.warn('Ignoring syntax-widget overwrite: %s (does not define widget)' % (name,)) |
110 |
continue |
111 |
|
112 |
default = props.get('default') |
113 |
subclasses = ucr.is_true(None, props.get('subclasses', 'false'), False) |
114 |
syntax_classes = [] |
115 |
for syntax in props.get('syntax', '').split(','): |
116 |
if not syntax: |
117 |
continue |
118 |
if not hasattr(udm_syntax, syntax): |
119 |
MODULE.warn('Ignoring unknown syntax class: %s' % (syntax,)) |
120 |
continue |
121 |
syntax_classes.append(syntax) |
122 |
|
123 |
def widget_func(syntax_, property_): |
124 |
return props.get('%s/property/%s' % (syntax_.name, property_['id']), widget) |
125 |
|
126 |
widgets.append(cls(syntax_classes, default, subclasses, widget_func)) |
127 |
MODULE.info('Added widget definition: %r' % (widgets[-1],)) |
128 |
|
129 |
return widgets |
130 |
|
131 |
|
132 |
__widgets = _UCRWidget.load() |
133 |
__widgets.extend([ |
71 |
Widget('CheckBox', (udm_syntax.OkOrNot, udm_syntax.TrueFalseUp, udm_syntax.boolean), False), |
134 |
Widget('CheckBox', (udm_syntax.OkOrNot, udm_syntax.TrueFalseUp, udm_syntax.boolean), False), |
72 |
Widget('PasswordInputBox', (udm_syntax.passwd, udm_syntax.userPasswd), ''), |
135 |
Widget('PasswordInputBox', (udm_syntax.passwd, udm_syntax.userPasswd), ''), |
73 |
Widget('DateBox', (udm_syntax.iso8601Date, udm_syntax.date), '1970-01-01'), |
136 |
Widget('DateBox', (udm_syntax.iso8601Date, udm_syntax.date), '1970-01-01'), |
Lines 86-92
def default_value(self):
|
Link Here
|
---|
|
86 |
Widget('TextArea', udm_syntax.TextArea, ''), |
149 |
Widget('TextArea', udm_syntax.TextArea, ''), |
87 |
Widget('TextBox', udm_syntax.simple, '*'), |
150 |
Widget('TextBox', udm_syntax.simple, '*'), |
88 |
Widget(None, udm_syntax.complex, None, widget_func=lambda syn, prop: prop['multivalue'] and 'MultiInput' or 'ComplexInput'), |
151 |
Widget(None, udm_syntax.complex, None, widget_func=lambda syn, prop: prop['multivalue'] and 'MultiInput' or 'ComplexInput'), |
89 |
) |
152 |
]) |
90 |
|
153 |
|
91 |
|
154 |
|
92 |
def choices(syntax, udm_property): |
155 |
def choices(syntax, udm_property): |