diff --git a/ucs-4.0-2/management/univention-management-console-module-udm/umc/python/udm/syntax.py b/ucs-4.0-2/management/univention-management-console-module-udm/umc/python/udm/syntax.py index d27afeb..2f967d3 100644 --- a/ucs-4.0-2/management/univention-management-console-module-udm/umc/python/udm/syntax.py +++ b/ucs-4.0-2/management/univention-management-console-module-udm/umc/python/udm/syntax.py @@ -37,11 +37,12 @@ import univention.admin.syntax as udm_syntax from ...log import MODULE +from ...config import ucr class Widget(object): - '''Describes a widget for the new web frontend''' + '''Describes a widget for the web frontend''' def __init__(self, name, syntax_classes, default_value, subclasses=True, widget_func=None): self._name = name @@ -67,7 +68,69 @@ def name(self, syntax, udm_property): def default_value(self): return self._default_value -__widgets = ( + def __repr__(self): + if isinstance(self._syntax_classes, (list, tuple)): + syntax = ','.join(getattr(x, 'name', str(x)) for x in self._syntax_classes) + else: + syntax = self._syntax_classes.name + return '' % (self._name, syntax, self._default_value) + + +class _UCRWidget(Widget): + + def __init__(self, syntax_classes, default, subclasses, widget_func): + super(_UCRWidget, self).__init__(None, syntax_classes, default, subclasses, widget_func) + self._syntax_classes_names = syntax_classes + + def __contains__(self, syntax): + # in case a syntax-reload has been done we need to reuse the newly ones + self._syntax_classes = tuple(filter(None, (getattr(udm_syntax, s, None) for s in self._syntax_classes_names))) + return super(_UCRWidget, self).__contains__(syntax) + + @classmethod + def load(cls): + identifier = 'directory/manager/web/widget/' + syntaxes = {} + for key, val in ucr.items(): + if not key.startswith(identifier): + continue + key = key[len(identifier):] + try: + name, key = key.split('/', 1) + except ValueError: + continue + syntaxes.setdefault(name, {}).setdefault(key, val) + + widgets = [] + for name, props in syntaxes.iteritems(): + try: + widget = props['widget'] + except KeyError: + MODULE.warn('Ignoring syntax-widget overwrite: %s (does not define widget)' % (name,)) + continue + + default = props.get('default') + subclasses = ucr.is_true(None, props.get('subclasses', 'false'), False) + syntax_classes = [] + for syntax in props.get('syntax', '').split(','): + if not syntax: + continue + if not hasattr(udm_syntax, syntax): + MODULE.warn('Ignoring unknown syntax class: %s' % (syntax,)) + continue + syntax_classes.append(syntax) + + def widget_func(syntax_, property_): + return props.get('%s/property/%s' % (syntax_.name, property_['id']), widget) + + widgets.append(cls(syntax_classes, default, subclasses, widget_func)) + MODULE.info('Added widget definition: %r' % (widgets[-1],)) + + return widgets + + +__widgets = _UCRWidget.load() +__widgets.extend([ Widget('CheckBox', (udm_syntax.OkOrNot, udm_syntax.TrueFalseUp, udm_syntax.boolean), False), Widget('PasswordInputBox', (udm_syntax.passwd, udm_syntax.userPasswd), ''), Widget('DateBox', (udm_syntax.iso8601Date, udm_syntax.date), '1970-01-01'), @@ -86,7 +149,7 @@ def default_value(self): Widget('TextArea', udm_syntax.TextArea, ''), Widget('TextBox', udm_syntax.simple, '*'), Widget(None, udm_syntax.complex, None, widget_func=lambda syn, prop: prop['multivalue'] and 'MultiInput' or 'ComplexInput'), -) +]) def choices(syntax, udm_property):