|
Lines 37-47
Link Here
|
| 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): |