commit bcdb451413c04558f03135ad45b8bd2e04f959b6 Author: Florian Best Date: Wed Apr 3 13:14:12 2019 +0200 Bug #31857: show drown down list for object classes and attribute names diff --git a/management/univention-directory-manager-modules/modules/univention/admin/handlers/settings/extended_attribute.py b/management/univention-directory-manager-modules/modules/univention/admin/handlers/settings/extended_attribute.py index 98cd06f6af..17c81721e2 100644 --- a/management/univention-directory-manager-modules/modules/univention/admin/handlers/settings/extended_attribute.py +++ b/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, diff --git a/management/univention-directory-manager-modules/modules/univention/admin/handlers/settings/extended_options.py b/management/univention-directory-manager-modules/modules/univention/admin/handlers/settings/extended_options.py index 8b2950e38c..da3be78b51 100644 --- a/management/univention-directory-manager-modules/modules/univention/admin/handlers/settings/extended_options.py +++ b/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, diff --git a/management/univention-directory-manager-modules/modules/univention/admin/policy.py b/management/univention-directory-manager-modules/modules/univention/admin/policy.py index fc330b4a54..ec9d2905b1 100644 --- a/management/univention-directory-manager-modules/modules/univention/admin/policy.py +++ b/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, diff --git a/management/univention-directory-manager-modules/modules/univention/admin/syntax.py b/management/univention-directory-manager-modules/modules/univention/admin/syntax.py index 738b8fb2dd..91a75a3998 100644 --- a/management/univention-directory-manager-modules/modules/univention/admin/syntax.py +++ b/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): diff --git a/management/univention-management-console-module-udm/umc/python/udm/__init__.py b/management/univention-management-console-module-udm/umc/python/udm/__init__.py index fa134ff10e..22a0bf5280 100644 --- a/management/univention-management-console-module-udm/umc/python/udm/__init__.py +++ b/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)