@@ -, +, @@ Bug #31857: show drown down list for object classes and attribute names --- a/management/univention-directory-manager-modules/modules/univention/admin/handlers/settings/extended_attribute.py +++ a/management/univention-directory-manager-modules/modules/univention/admin/handlers/settings/extended_attribute.py @@ -263,7 +263,7 @@ 'ldapMapping': univention.admin.property( short_description=_('LDAP attribute'), long_description=_('Univention Corporate Server provides its own LDAP scheme for customer extensions. The LDAP object class univentionFreeAttributes can be used for extended attributes without restrictions. It offers 20 freely usable attributes (univentionFreeAttribute1 to univentionFreeAttribute20) and can be used in connection with any LDAP object (e.g., a user object)'), - syntax=univention.admin.syntax.string, + syntax=univention.admin.syntax.ldapAttribute, multivalue=False, options=[], required=True, @@ -304,7 +304,7 @@ 'objectClass': univention.admin.property( short_description=_('LDAP object class'), long_description=_('Univention Corporate Server provides its own LDAP scheme for customer extensions. The LDAP object class univentionFreeAttributes can be used for extended attributes without restrictions. It offers 20 freely usable attributes (univentionFreeAttribute1 to univentionFreeAttribute20) and can be used in connection with any LDAP object (e.g., a user object)'), - syntax=univention.admin.syntax.string, + syntax=univention.admin.syntax.ldapObjectClass, multivalue=False, options=[], required=True, --- a/management/univention-directory-manager-modules/modules/univention/admin/handlers/settings/extended_options.py +++ a/management/univention-directory-manager-modules/modules/univention/admin/handlers/settings/extended_options.py @@ -145,7 +145,7 @@ 'objectClass': univention.admin.property( short_description=_('LDAP object class'), long_description=_('Mapping to LDAP objectClasses'), - syntax=univention.admin.syntax.string, + syntax=univention.admin.syntax.ldapObjectClass, multivalue=True, options=[], required=False, --- a/management/univention-directory-manager-modules/modules/univention/admin/policy.py +++ a/management/univention-directory-manager-modules/modules/univention/admin/policy.py @@ -58,7 +58,7 @@ def requiredObjectClassesProperty(**kwargs): pargs = dict( short_description=_('Required object class'), long_description='', - syntax=univention.admin.syntax.string, + syntax=univention.admin.syntax.ldapObjectClass, multivalue=True, options=[], required=False, @@ -73,7 +73,7 @@ def prohibitedObjectClassesProperty(**kwargs): pargs = dict( short_description=_('Excluded object class'), long_description='', - syntax=univention.admin.syntax.string, + syntax=univention.admin.syntax.ldapObjectClass, multivalue=True, options=[], required=False, --- a/management/univention-directory-manager-modules/modules/univention/admin/syntax.py +++ a/management/univention-directory-manager-modules/modules/univention/admin/syntax.py @@ -2383,22 +2383,49 @@ def parse(self, text): raise univention.admin.uexceptions.valueError(_("Not a valid LDAP DN")) -class ldapObjectClass(simple): +class ldapObjectClass(combobox): """ Syntax to enter a |LDAP| objectClass name. """ - @classmethod - def parse(self, text): - return text + choices = (('top', 'top')) -class ldapAttribute(simple): +class ldapAttribute(combobox): """ Syntax to enter a |LDAP| attribute name. """ - @classmethod - def parse(self, text): - return text + + +def _update_schema(): + from univention.uldap import getMachineConnection + from ldap.schema import ObjectClass, AttributeType + try: + conn = getMachineConnection() + subschema = conn.get_schema() + + ocs = set() + for oid in subschema.listall(ObjectClass): + oc = subschema.get_obj(ObjectClass, oid) + if oc: + ocs |= set(oc.names) + ldapObjectClass.choices = [(_oc, _oc) for _oc in sorted(ocs, key=lambda s: s.lower())] + + attrs = set() + for oid in subschema.listall(AttributeType): + attr = subschema.get_obj(AttributeType, oid) + if attr: + attrs |= set(attr.names) + ldapAttribute.choices = [(_attr, _attr) for _attr in sorted(attrs, key=lambda s: s.lower())] + except ldap.SERVER_DOWN: + pass + finally: + try: + conn.unbind() + except: + pass + + +__register_choice_update_function(_update_schema) class ldapFilter(simple): @@ -4051,24 +4078,19 @@ def parse(self, text): return text raise univention.admin.uexceptions.valueInvalidSyntax(_('"%s" is not a Univention Admin Module.') % text) -# Unfortunately, Python doesn't seem to support (static) class methods; -# however, (static) class variables such as "choices" seem to work; -# so, we'll modify "choices" using this global method - - -def univentionAdminModules_update(): - """ - Update internal list of |UDM| modules in :py:class:`univentionAdminModules`. - """ - temp = [] - for name, mod in univention.admin.modules.modules.items(): - if not univention.admin.modules.virtual(mod): - temp.append((name, univention.admin.modules.short_description(mod))) - - univentionAdminModules.choices = sorted(temp, key=operator.itemgetter(1)) + @classmethod + def update_choices(cls): + """ + Update internal list of |UDM| modules in :py:class:`univentionAdminModules`. + """ + cls.choices = sorted([ + (name, univention.admin.modules.short_description(mod)) + for name, mod in univention.admin.modules.modules.items() + if not univention.admin.modules.virtual(mod) + ], key=operator.itemgetter(1)) -__register_choice_update_function(univentionAdminModules_update) +__register_choice_update_function(univentionAdminModules.update_choices) class UDM_PropertySelect(complex): --- a/management/univention-management-console-module-udm/umc/python/udm/__init__.py +++ a/management/univention-management-console-module-udm/umc/python/udm/__init__.py @@ -178,6 +178,7 @@ def init(self): # read user settings and initial UDR self.reports_cfg = udr.Config() self.modules_with_childs = container_modules() + udm_syntax.update_choices() def set_locale(self, _locale): super(Instance, self).set_locale(_locale)