View | Details | Raw Unified | Return to bug 30991 | Differences between
and this patch

Collapse All | Expand All

(-)univention-directory-manager-modules/modules/univention/admin/filter.py (+6 lines)
 Lines 82-87    Link Here 
82
		'''
82
		'''
83
		return '%s(%r, %r)' % (self.__class__._type_, self.type, self.expressions)
83
		return '%s(%r, %r)' % (self.__class__._type_, self.type, self.expressions)
84
84
85
	def append_unmapped_filter_string(self, filter_s, rewrite_function, mapping):
86
		if filter_s:
87
			filter_p = parse(filter_s)
88
			walk(filter_p, rewrite_function, arg=mapping)
89
			self.expressions.append(filter_p)
90
85
class expression:
91
class expression:
86
	"""LDAP filter expression."""
92
	"""LDAP filter expression."""
87
	_type_='expression'
93
	_type_='expression'
(-)univention-directory-manager-modules/modules/univention/admin/syntax.py (-1 / +8 lines)
 Lines 274-279    Link Here 
274
	depends = None
274
	depends = None
275
	error_message = _( "Not a valid LDAP DN" )
275
	error_message = _( "Not a valid LDAP DN" )
276
	simple = False # by default a MultiObjectSelect widget is used; if simple == True a ComboBox is used
276
	simple = False # by default a MultiObjectSelect widget is used; if simple == True a ComboBox is used
277
	use_objects = True
277
278
278
	@classmethod
279
	@classmethod
279
	def parse( self, text ):
280
	def parse( self, text ):
 Lines 1603-1611    Link Here 
1603
1604
1604
class GroupDN( UDM_Objects ):
1605
class GroupDN( UDM_Objects ):
1605
	udm_modules = ( 'groups/group', )
1606
	udm_modules = ( 'groups/group', )
1607
	use_objects = False
1606
1608
1607
class UserDN( UDM_Objects ):
1609
class UserDN( UDM_Objects ):
1608
	udm_modules = ( 'users/user', )
1610
	udm_modules = ( 'users/user', )
1611
	use_objects = False
1609
1612
1610
class HostDN( UDM_Objects ):
1613
class HostDN( UDM_Objects ):
1611
	udm_modules = ( 'computers/computer', )
1614
	udm_modules = ( 'computers/computer', )
 Lines 1689-1700    Link Here 
1689
	udm_modules = ( 'dns/forward_zone', )
1692
	udm_modules = ( 'dns/forward_zone', )
1690
	empty_value = True
1693
	empty_value = True
1691
	size = 'TwoThirds'
1694
	size = 'TwoThirds'
1695
	use_objects = False
1692
1696
1693
class DNS_ReverseZone( UDM_Objects ):
1697
class DNS_ReverseZone( UDM_Objects ):
1694
 	description=_('DNS reverse zone')
1698
 	description=_('DNS reverse zone')
1695
	udm_modules = ( 'dns/reverse_zone', )
1699
	udm_modules = ( 'dns/reverse_zone', )
1700
	label = '%(subnet)s'
1696
	empty_value = True
1701
	empty_value = True
1697
	size = 'TwoThirds'
1702
	size = 'TwoThirds'
1703
	use_objects = False
1698
1704
1699
class dnsEntry( complex ):
1705
class dnsEntry( complex ):
1700
 	description=_('DNS Entry')
1706
 	description=_('DNS Entry')
 Lines 1736-1743    Link Here 
1736
class WritableShare( UDM_Objects ):
1742
class WritableShare( UDM_Objects ):
1737
	udm_modules = ( 'shares/share', )
1743
	udm_modules = ( 'shares/share', )
1738
	udm_filter = 'writeable=1'
1744
	udm_filter = 'writeable=1'
1745
	label = _('%(name)s (%(path)s on %(host)s)') # ldap-optimized for shares/share.description()
1739
	size = 'OneAndAHalf'
1746
	size = 'OneAndAHalf'
1740
	empty_value = True
1747
	empty_value = True
1748
	use_objects = False
1741
1749
1742
# class share(ldapDnOrNone):
1750
# class share(ldapDnOrNone):
1743
# 	searchFilter='(objectClass=univentionShare)'
1751
# 	searchFilter='(objectClass=univentionShare)'
 Lines 2550-2556    Link Here 
2550
2558
2551
class nfsShare(UDM_Objects):
2559
class nfsShare(UDM_Objects):
2552
	udm_modules = ( 'shares/share', )
2560
	udm_modules = ( 'shares/share', )
2553
	key = 'dn'
2554
	label = '%(printablename)s'
2561
	label = '%(printablename)s'
2555
	udm_filter = 'objectClass=univentionShareNFS'
2562
	udm_filter = 'objectClass=univentionShareNFS'
2556
2563
(-)univention-directory-manager-modules/modules/univention/admin/handlers/groups/group.py (-14 / +14 lines)
 Lines 940-962    Link Here 
940
				self.lo.modify(dn, [ ('sambaPrimaryGroupSID', attr.get('sambaPrimaryGroupSID', []), [newSid]) ] )
940
				self.lo.modify(dn, [ ('sambaPrimaryGroupSID', attr.get('sambaPrimaryGroupSID', []), [newSid]) ] )
941
			self.update_sambaPrimaryGroupSid = False
941
			self.update_sambaPrimaryGroupSid = False
942
942
943
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
943
def lookup_filter(filter_s=None):
944
944
	lookup_filter = \
945
	filter=univention.admin.filter.conjunction('&', [
945
		univention.admin.filter.conjunction('&', [
946
		univention.admin.filter.expression('cn', '*'),
946
			univention.admin.filter.expression('cn', '*'),
947
		univention.admin.filter.conjunction('|',
947
			univention.admin.filter.conjunction('|', [
948
		  [univention.admin.filter.conjunction('&',
948
				univention.admin.filter.conjunction('&',
949
				[univention.admin.filter.expression('objectClass', 'univentionGroup'),]),
949
					[univention.admin.filter.expression('objectClass', 'univentionGroup'),]),
950
		   univention.admin.filter.conjunction('&',
950
				univention.admin.filter.conjunction('&',
951
				[univention.admin.filter.expression('objectClass', 'sambaGroupMapping'),])
951
					[univention.admin.filter.expression('objectClass', 'sambaGroupMapping'),])
952
		   ])
952
			])
953
		])
953
		])
954
	lookup_filter.append_unmapped_filter_string(filter_s, univention.admin.mapping.mapRewrite, mapping)
955
	return lookup_filter
954
956
955
	if filter_s:
957
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
956
		filter_p=univention.admin.filter.parse(filter_s)
957
		univention.admin.filter.walk(filter_p, univention.admin.mapping.mapRewrite, arg=mapping)
958
		filter.expressions.append(filter_p)
959
958
959
	filter=lookup_filter(filter_s)
960
	res=[]
960
	res=[]
961
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
961
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
962
		res.append( object( co, lo, None, dn, attributes = attrs ) )
962
		res.append( object( co, lo, None, dn, attributes = attrs ) )
(-)univention-directory-manager-modules/modules/univention/admin/handlers/dns/forward_zone.py (-11 / +11 lines)
 Lines 326-345    Link Here 
326
		if not self.hasChanged('serial'):
326
		if not self.hasChanged('serial'):
327
			self['serial']=str(int(self['serial'])+1)
327
			self['serial']=str(int(self['serial'])+1)
328
328
329
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
329
def lookup_filter(filter_s=None):
330
330
	lookup_filter = \
331
	filter=univention.admin.filter.conjunction('&', [
331
		univention.admin.filter.conjunction('&', [
332
		univention.admin.filter.expression('objectClass', 'dNSZone'),
332
			univention.admin.filter.expression('objectClass', 'dNSZone'),
333
		univention.admin.filter.expression('relativeDomainName', '@'),
333
			univention.admin.filter.expression('relativeDomainName', '@'),
334
		univention.admin.filter.conjunction('!', [univention.admin.filter.expression('zoneName', '*%s' % ARPA_IP4)]),
334
			univention.admin.filter.conjunction('!', [univention.admin.filter.expression('zoneName', '*%s' % ARPA_IP4)]),
335
		univention.admin.filter.conjunction('!', [univention.admin.filter.expression('zoneName', '*%s' % ARPA_IP6)]),
335
			univention.admin.filter.conjunction('!', [univention.admin.filter.expression('zoneName', '*%s' % ARPA_IP6)]),
336
		])
336
		])
337
	lookup_filter.append_unmapped_filter_string(filter_s, univention.admin.mapping.mapRewrite, mapping)
338
	return lookup_filter
337
339
338
	if filter_s:
340
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
339
		filter_p=univention.admin.filter.parse(filter_s)
340
		univention.admin.filter.walk(filter_p, univention.admin.mapping.mapRewrite, arg=mapping)
341
		filter.expressions.append(filter_p)
342
341
342
	filter=lookup_filter(filter_s)
343
	res=[]
343
	res=[]
344
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
344
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
345
		res.append((object(co, lo, None, dn=dn, superordinate=superordinate, attributes = attrs )))
345
		res.append((object(co, lo, None, dn=dn, superordinate=superordinate, attributes = attrs )))
(-)univention-directory-manager-modules/modules/univention/admin/handlers/dns/reverse_zone.py (-12 / +12 lines)
 Lines 286-307    Link Here 
286
			return unmapSubnet(rdn_value)
286
			return unmapSubnet(rdn_value)
287
287
288
288
289
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
289
def lookup_filter(filter_s=None):
290
290
	lookup_filter = \
291
	filter=univention.admin.filter.conjunction('&', [
291
		univention.admin.filter.conjunction('&', [
292
		univention.admin.filter.expression('objectClass', 'dNSZone'),
292
			univention.admin.filter.expression('objectClass', 'dNSZone'),
293
		univention.admin.filter.expression('relativeDomainName', '@'),
293
			univention.admin.filter.expression('relativeDomainName', '@'),
294
		univention.admin.filter.conjunction('|', [
294
			univention.admin.filter.conjunction('|', [
295
			univention.admin.filter.expression('zoneName', '*%s' % ARPA_IP4),
295
				univention.admin.filter.expression('zoneName', '*%s' % ARPA_IP4),
296
			univention.admin.filter.expression('zoneName', '*%s' % ARPA_IP6)
296
				univention.admin.filter.expression('zoneName', '*%s' % ARPA_IP6)
297
			]),
297
			]),
298
		])
298
		])
299
	lookup_filter.append_unmapped_filter_string(filter_s, univention.admin.mapping.mapRewrite, mapping)
300
	return lookup_filter
299
301
300
	if filter_s:
302
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
301
		filter_p=univention.admin.filter.parse(filter_s)
302
		univention.admin.filter.walk(filter_p, univention.admin.mapping.mapRewrite, arg=mapping)
303
		filter.expressions.append(filter_p)
304
303
304
	filter=lookup_filter(filter_s)
305
	res=[]
305
	res=[]
306
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
306
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
307
		res.append((object(co, lo, None, dn=dn, superordinate=superordinate, attributes = attrs )))
307
		res.append((object(co, lo, None, dn=dn, superordinate=superordinate, attributes = attrs )))
(-)univention-directory-manager-modules/modules/univention/admin/handlers/shares/share.py (-10 / +9 lines)
 Lines 900-906    Link Here 
900
		if not hasattr(self,"options"):
900
		if not hasattr(self,"options"):
901
			self.open()
901
			self.open()
902
		if 'nfs' in self.options:
902
		if 'nfs' in self.options:
903
			ulist=[]
904
			searchstring="*"+self['host']+":"+self['path']+"*"
903
			searchstring="*"+self['host']+":"+self['path']+"*"
905
			searchResult=self.lo.searchDn(base=self.position.getDomain(), filter='(&(objectClass=person)(automountInformation=%s))'%searchstring, scope='domain')
904
			searchResult=self.lo.searchDn(base=self.position.getDomain(), filter='(&(objectClass=person)(automountInformation=%s))'%searchstring, scope='domain')
906
			if searchResult:
905
			if searchResult:
 Lines 932-948    Link Here 
932
	def description(self):
931
	def description(self):
933
		return _('%s (%s on %s)') % (self['name'], self['path'], self['host'])
932
		return _('%s (%s on %s)') % (self['name'], self['path'], self['host'])
934
933
935
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
934
def lookup_filter(filter_s=None):
936
	filter=univention.admin.filter.conjunction('&', [
935
	lookup_filter = \
937
		univention.admin.filter.expression('objectClass', 'univentionShare'),
936
		univention.admin.filter.conjunction('&', [
938
		univention.admin.filter.expression('cn', '*'),
937
			univention.admin.filter.expression('objectClass', 'univentionShare'),
938
			univention.admin.filter.expression('cn', '*'),
939
		])
939
		])
940
	lookup_filter.append_unmapped_filter_string(filter_s, univention.admin.mapping.mapRewrite, mapping)
941
	return lookup_filter
940
942
941
	if filter_s:
943
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
942
		filter_p=univention.admin.filter.parse(filter_s)
944
	filter=lookup_filter(filter_s)
943
		univention.admin.filter.walk(filter_p, univention.admin.mapping.mapRewrite, arg=mapping)
944
		filter.expressions.append(filter_p)
945
946
	res=[]
945
	res=[]
947
	for dn in lo.searchDn(unicode(filter), base, scope, unique, required, timeout, sizelimit):
946
	for dn in lo.searchDn(unicode(filter), base, scope, unique, required, timeout, sizelimit):
948
		res.append(object(co, lo, None, dn))
947
		res.append(object(co, lo, None, dn))
(-)univention-directory-manager-modules/modules/univention/admin/handlers/users/user.py (-24 / +24 lines)
 Lines 2759-2790    Link Here 
2759
	else:
2759
	else:
2760
		univention.admin.mapping.mapRewrite(filter, mapping)
2760
		univention.admin.mapping.mapRewrite(filter, mapping)
2761
2761
2762
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
2762
def lookup_filter(filter_s=None):
2763
2763
	lookup_filter = \
2764
	filter=univention.admin.filter.conjunction('&', [
2764
		univention.admin.filter.conjunction('&', [
2765
		univention.admin.filter.conjunction('|', [
2765
			univention.admin.filter.conjunction('|', [
2766
			univention.admin.filter.conjunction('&', [
2766
				univention.admin.filter.conjunction('&', [
2767
				univention.admin.filter.expression('objectClass', 'posixAccount'),
2767
					univention.admin.filter.expression('objectClass', 'posixAccount'),
2768
				univention.admin.filter.expression('objectClass', 'shadowAccount'),
2768
					univention.admin.filter.expression('objectClass', 'shadowAccount'),
2769
				]),
2770
				univention.admin.filter.expression('objectClass', 'univentionMail'),
2771
				univention.admin.filter.expression('objectClass', 'sambaSamAccount'),
2772
				univention.admin.filter.expression('objectClass', 'simpleSecurityObject'),
2773
				univention.admin.filter.conjunction('&', [
2774
					univention.admin.filter.expression('objectClass', 'person'),
2775
					univention.admin.filter.expression('objectClass', 'organizationalPerson'),
2776
					univention.admin.filter.expression('objectClass', 'inetOrgPerson'),
2777
				]),
2769
			]),
2778
			]),
2770
			univention.admin.filter.expression('objectClass', 'univentionMail'),
2779
			univention.admin.filter.conjunction('!', [univention.admin.filter.expression('uidNumber', '0')]),
2771
			univention.admin.filter.expression('objectClass', 'sambaSamAccount'),
2780
			univention.admin.filter.conjunction('!', [univention.admin.filter.expression('uid', '*$')]),
2772
			univention.admin.filter.expression('objectClass', 'simpleSecurityObject'),
2781
		])
2773
			univention.admin.filter.conjunction('&', [
2782
	# ATTENTION: has its own rewrite function.
2774
				univention.admin.filter.expression('objectClass', 'person'),
2783
	lookup_filter.append_unmapped_filter_string(filter_s, rewrite, mapping)
2775
				univention.admin.filter.expression('objectClass', 'organizationalPerson'),
2784
	return lookup_filter
2776
				univention.admin.filter.expression('objectClass', 'inetOrgPerson'),
2777
			]),
2778
		]),
2779
		univention.admin.filter.conjunction('!', [univention.admin.filter.expression('uidNumber', '0')]),
2780
		univention.admin.filter.conjunction('!', [univention.admin.filter.expression('uid', '*$')]),
2781
	])
2782
2785
2783
	if filter_s:
2786
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
2784
		filter_p=univention.admin.filter.parse(filter_s)
2787
	filter=lookup_filter(filter_s)
2785
		univention.admin.filter.walk(filter_p, rewrite, arg=mapping)
2786
		filter.expressions.append(filter_p)
2787
2788
	res=[]
2788
	res=[]
2789
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
2789
	for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, required, timeout, sizelimit):
2790
		res.append( object( co, lo, None, dn, attributes = attrs ) )
2790
		res.append( object( co, lo, None, dn, attributes = attrs ) )
(-)univention-directory-manager-modules/modules/univention/admin/de.po (+4 lines)
 Lines 221-226    Link Here 
221
msgid "cannot find fqdn of "
221
msgid "cannot find fqdn of "
222
msgstr "FQDN konnte nicht gefunden werden: "
222
msgstr "FQDN konnte nicht gefunden werden: "
223
223
224
#: syntax.py:1743
225
msgid "%(name)s (%(path)s on %(host)s)"
226
msgstr "%(name)s (%(path)s auf %(host)s)"
227
224
#: syntax.py:109 syntax.py:162 syntax.py:298
228
#: syntax.py:109 syntax.py:162 syntax.py:298
225
msgid "Invalid value"
229
msgid "Invalid value"
226
msgstr "Ungültiger Wert"
230
msgstr "Ungültiger Wert"
(-)univention-directory-manager-modules/debian/changelog (+6 lines)
 Lines 1-3    Link Here 
1
univention-directory-manager-modules (8.0.155-1) unstable; urgency=low
2
3
  * Bug #30991: Preliminary work for agressive syntax lookup optimizations
4
5
 -- Dirk Wiesenthal <wiesenthal@univention.de>  Tue, 14 May 2013 19:27:56 +0200
6
1
univention-directory-manager-modules (8.0.154-1) unstable; urgency=low
7
univention-directory-manager-modules (8.0.154-1) unstable; urgency=low
2
8
3
  * Bug #31154: Import hook files every time udm_modules.update() is called
9
  * Bug #31154: Import hook files every time udm_modules.update() is called
(-)univention-management-console-module-udm/debian/changelog (+6 lines)
 Lines 1-3    Link Here 
1
univention-management-console-module-udm (3.0.79-1) unstable; urgency=low
2
3
  * Bug #30991: Greatly speedup syntax lookup if syntax allows it
4
5
 -- Dirk Wiesenthal <wiesenthal@univention.de>  Tue, 14 May 2013 19:37:46 +0200
6
1
univention-management-console-module-udm (3.0.78-1) unstable; urgency=low
7
univention-management-console-module-udm (3.0.78-1) unstable; urgency=low
2
8
3
  * Bug #14123: adjusted texts for GPL license
9
  * Bug #14123: adjusted texts for GPL license
(-)univention-management-console-module-udm/umc/python/udm/udm_ldap.py (-42 / +113 lines)
 Lines 232-237    Link Here 
232
			module = self._initialized_with_module
232
			module = self._initialized_with_module
233
		self.module = _module_cache.get( module, force_reload=force_reload )
233
		self.module = _module_cache.get( module, force_reload=force_reload )
234
234
235
	def allows_simple_lookup( self ):
236
		return self.lookup_filter() is not None
237
238
	def lookup_filter( self, filter_s=None ):
239
		return getattr( self.module, 'lookup_filter', lambda x: None )(filter_s)
240
235
	def __getitem__( self, key ):
241
	def __getitem__( self, key ):
236
		props = getattr( self.module, 'property_descriptions', {} )
242
		props = getattr( self.module, 'property_descriptions', {} )
237
		return props[ key ]
243
		return props[ key ]
 Lines 407-413    Link Here 
407
			raise UDM_Error( get_exception_msg(e) )
413
			raise UDM_Error( get_exception_msg(e) )
408
414
409
	@LDAP_Connection
415
	@LDAP_Connection
410
	def search( self, container = None, attribute = None, value = None, superordinate = None, scope = 'sub', filter = '', ldap_connection = None, ldap_position = None ):
416
	def search( self, container = None, attribute = None, value = None, superordinate = None, scope = 'sub', filter = '', simple = False, simple_attrs = None, ldap_connection = None, ldap_position = None ):
411
		"""Searches for LDAP objects based on a search pattern"""
417
		"""Searches for LDAP objects based on a search pattern"""
412
		if container == 'all':
418
		if container == 'all':
413
			container = ldap_position.getBase()
419
			container = ldap_position.getBase()
 Lines 421-427    Link Here 
421
		result = None
427
		result = None
422
		try:
428
		try:
423
			sizelimit = int(ucr.get('directory/manager/web/sizelimit', '2000'))
429
			sizelimit = int(ucr.get('directory/manager/web/sizelimit', '2000'))
424
			result = self.module.lookup( None, ldap_connection, filter_s, base = container, superordinate = superordinate, scope = scope, sizelimit = sizelimit )
430
			if simple and self.allows_simple_lookup():
431
				lookup_filter = unicode(self.lookup_filter(filter))
432
				if simple_attrs is not None:
433
					result = ldap_connection.search( filter = lookup_filter, base = container, scope = scope, sizelimit = sizelimit, attr = simple_attrs )
434
				else:
435
					result = ldap_connection.searchDn( filter = lookup_filter, base = container, scope = scope, sizelimit = sizelimit )
436
			else:
437
				result = self.module.lookup( None, ldap_connection, filter_s, base = container, superordinate = superordinate, scope = scope, sizelimit = sizelimit )
425
		except udm_errors.insufficientInformation, e:
438
		except udm_errors.insufficientInformation, e:
426
			return []
439
			return []
427
		except udm_errors.ldapTimeout, e:
440
		except udm_errors.ldapTimeout, e:
 Lines 1004-1010    Link Here 
1004
		filter_s = '(&%s%s)' % (property_filter_s, filter_s)
1017
		filter_s = '(&%s%s)' % (property_filter_s, filter_s)
1005
	return filter_s
1018
	return filter_s
1006
1019
1007
LDAP_ATTR_RE = re.compile(r'^%\(([^(]*)\)s$') # '%(username)s' -> 'username'
1020
LDAP_ATTR_RE = re.compile(r'^%\(([^)]*)\)s$') # '%(username)s' -> 'username'
1008
def _get_syntax( syntax_name ):
1021
def _get_syntax( syntax_name ):
1009
	if syntax_name not in udm_syntax.__dict__:
1022
	if syntax_name not in udm_syntax.__dict__:
1010
		return None
1023
		return None
 Lines 1051-1057    Link Here 
1051
			filter_s = _create_ldap_filter( syn, options, module )
1064
			filter_s = _create_ldap_filter( syn, options, module )
1052
			if filter_s is not None:
1065
			if filter_s is not None:
1053
				try:
1066
				try:
1054
					size += len( module.search( filter = filter_s ) )
1067
					size += len( module.search( filter = filter_s, simple=not syn.use_objects ) )
1055
				except udm_errors.ldapSizelimitExceeded:
1068
				except udm_errors.ldapSizelimitExceeded:
1056
					return {'performs_well' : True, 'size_limit_exceeded' : True}
1069
					return {'performs_well' : True, 'size_limit_exceeded' : True}
1057
		return {'size' : size, 'performs_well' : True }
1070
		return {'size' : size, 'performs_well' : True }
 Lines 1065-1110    Link Here 
1065
1078
1066
	if issubclass( syn.__class__, udm_syntax.UDM_Objects ):
1079
	if issubclass( syn.__class__, udm_syntax.UDM_Objects ):
1067
		syn.choices = []
1080
		syn.choices = []
1068
		def map_choices( obj_list ):
1081
		# try to avoid using the slow udm interface
1069
			result = []
1082
		simple = False
1070
			for obj in obj_list:
1083
		attr = set()
1071
				obj.open()
1084
		if not syn.use_objects:
1085
			attr.update(re.findall(r'%\(([^)]+)\)', syn.key))
1086
			if syn.label:
1087
				attr.update(re.findall(r'%\(([^)]+)\)', syn.label))
1088
			for udm_module in syn.udm_modules:
1089
				module = UDM_Module( udm_module )
1090
				if not module.allows_simple_lookup():
1091
					break
1092
				if module is not None:
1093
					mapping = module.module.mapping
1094
					if not all([mapping.mapName(att) for att in attr]):
1095
						break
1096
			else:
1097
				simple = True
1098
		def extract_key_label(syn, dn, info):
1099
			key = label = None
1100
			if syn.key == 'dn':
1101
				key = dn
1102
			else:
1103
				try:
1104
					key = syn.key % info
1105
				except KeyError:
1106
					pass
1107
			if syn.label == 'dn':
1108
				label = dn
1109
			elif syn.label is None:
1110
				pass
1111
			else:
1112
				try:
1113
					label = syn.label % info
1114
				except KeyError:
1115
					pass
1116
			return key, label
1117
		if not simple:
1118
			def map_choices( obj_list ):
1119
				result = []
1120
				for obj in obj_list:
1121
					# first try it without obj.open() (expensive)
1122
					key, label = extract_key_label(syn, obj.dn, obj.info)
1123
					if key is None or label is None:
1124
						obj.open()
1125
						key, label = extract_key_label(syn, obj.dn, obj.info)
1126
						if key is None:
1127
							# ignore the entry as the key is important for a selection, there
1128
							# is no sensible fallback for the key (Bug #26994)
1129
							continue
1130
						if label is None:
1131
							# fallback to the default description as this is just what displayed
1132
							# to the user (Bug #26994)
1133
							label = udm_objects.description( obj )
1134
					result.append( (key, label) )
1135
				return result
1072
1136
1073
				if syn.key == 'dn':
1137
			for udm_module in syn.udm_modules:
1074
					key = obj.dn
1138
				module = UDM_Module( udm_module )
1139
				if module is None:
1140
					continue
1141
				filter_s = _create_ldap_filter( syn, options, module )
1142
				if filter_s is None:
1143
					syn.choices = []
1075
				else:
1144
				else:
1076
					try:
1145
					search_options = {'filter' : filter_s}
1077
						key = syn.key % obj.info
1146
					search_options.update(module_search_options)
1078
					except KeyError:
1147
					syn.choices.extend( map_choices( module.search( **search_options ) ) )
1079
						# ignore the entry as the key is important for a selection, there
1148
		else:
1080
						# is no sensible fallback for the key (Bug #26994)
1149
			for udm_module in syn.udm_modules:
1081
						continue
1150
				module = UDM_Module( udm_module )
1082
				if syn.label is None:
1151
				if module is None:
1083
					label = udm_objects.description( obj )
1152
					continue
1084
				elif syn.label == 'dn':
1153
				filter_s = _create_ldap_filter( syn, options, module )
1085
					label = obj.dn
1154
				if filter_s is not None:
1086
				else:
1155
					if filter_s and not filter_s.startswith('('):
1087
					try:
1156
						filter_s = '(%s)' % filter_s
1088
						label = syn.label % obj.info
1157
					mapping = module.module.mapping
1089
					except KeyError:
1158
					ldap_attr = [mapping.mapName(att) for att in attr]
1090
						# fallback to the default description as this is just what displayed
1159
					search_options = {'filter' : filter_s, 'simple' : True}
1091
						# to the user (Bug #26994)
1160
					search_options.update(module_search_options)
1092
						label = udm_objects.description( obj )
1161
					if ldap_attr:
1093
1162
						search_options['simple_attrs'] = ldap_attr
1094
				result.append( (key, label) )
1163
						result = module.search( **search_options )
1095
			return result
1164
						for dn, ldap_map in result:
1096
1165
							info = univention.admin.mapping.mapDict(mapping, ldap_map)
1097
		for udm_module in syn.udm_modules:
1166
							key, label = extract_key_label(syn, dn, info)
1098
			module = UDM_Module( udm_module )
1167
							if key is None:
1099
			if module is None:
1168
								continue
1100
				continue
1169
							if label is None:
1101
			filter_s = _create_ldap_filter( syn, options, module )
1170
								label = ldap_connection.explodeDn(dn, 1)[0]
1102
			if filter_s is None:
1171
							syn.choices.append((key, label))
1103
				syn.choices = []
1172
					else:
1104
			else:
1173
						keys = module.search( **search_options )
1105
				search_options = {'filter' : filter_s}
1174
						if syn.label == 'dn':
1106
				search_options.update(module_search_options)
1175
							labels = keys
1107
				syn.choices.extend( map_choices( module.search( **search_options ) ) )
1176
						else:
1177
							labels = [ldap_connection.explodeDn(dn, 1)[0] for dn in keys]
1178
						syn.choices.extend(zip(keys, labels))
1108
		if isinstance( syn.static_values, ( tuple, list ) ):
1179
		if isinstance( syn.static_values, ( tuple, list ) ):
1109
			for value in syn.static_values:
1180
			for value in syn.static_values:
1110
				syn.choices.insert( 0, value )
1181
				syn.choices.insert( 0, value )

Return to bug 30991