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

Collapse All | Expand All

(-)schema/ip-phone.schema (-1 / +5 lines)
 Lines 1-4    Link Here 
1
# univention registered the namespace 10176.
1
# univention registered the namespace 10176.
2
#objectIdentifier univention 1.3.6.1.4.1.10176
3
#objectIdentifier univentionCustomers univention:99999
4
#objectIdentifier univentionExampleAttributeType univentionCustomers:1
5
#objectIdentifier univentionExampleObjectClass univentionCustomers:2
6
2
attributetype ( 1.3.6.1.4.1.10176.9999.1.1 NAME 'testPhoneActive'
7
attributetype ( 1.3.6.1.4.1.10176.9999.1.1 NAME 'testPhoneActive'
3
	DESC 'state of the IP phone'
8
	DESC 'state of the IP phone'
4
	EQUALITY caseIgnoreIA5Match
9
	EQUALITY caseIgnoreIA5Match
 Lines 42-45    Link Here 
42
	MUST ( cn )
47
	MUST ( cn )
43
	MAY ( testPhoneRedirectUser )
48
	MAY ( testPhoneRedirectUser )
44
	)
49
	)
45
(-)debian/univention-directory-manager-module-example-schema.postrm (-2 / +6 lines)
 Lines 36-43    Link Here 
36
36
37
case "$1" in
37
case "$1" in
38
remove)
38
remove)
39
	/usr/sbin/univention-config-registry commit /etc/ldap/slapd.conf
39
	case "$(/usr/sbin/univention-config-registry get server/role)" in
40
	invoke-rc.d slapd restart
40
	domaincontroller_master)
41
		/usr/sbin/univention-config-registry commit /etc/ldap/slapd.conf
42
		invoke-rc.d slapd restart
43
		;;
44
	esac
41
	;;
45
	;;
42
46
43
purge|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
47
purge|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
(-)debian/changelog (+11 lines)
 Lines 1-3    Link Here 
1
univention-directory-manager-module-example (2.0.5-1) unstable; urgency=low
2
3
  * Prepare for translation (Bug #17915)
4
  * Restart slapd only on domaincontroller_master.
5
  * Fix unicode strings.
6
  * Add missing DocString to exists() and _remove_attr().
7
  * Document advanced=True.
8
  * Use True and False instead of 1 and 0.
9
10
 -- Philipp Hahn <hahn@univention.de>  Wed, 16 Feb 2011 07:59:08 +0100
11
1
univention-directory-manager-module-example (2.0.4-1) unstable; urgency=low
12
univention-directory-manager-module-example (2.0.4-1) unstable; urgency=low
2
13
3
  * suggestions from QA feedback (Bug #17915)
14
  * suggestions from QA feedback (Bug #17915)
(-)modules/ip_phone.py (-110 / +121 lines)
 Lines 28-66    Link Here 
28
# /usr/share/common-licenses/AGPL-3; if not, see
28
# /usr/share/common-licenses/AGPL-3; if not, see
29
# <http://www.gnu.org/licenses/>.
29
# <http://www.gnu.org/licenses/>.
30
30
31
import re, sys, string, copy
31
import re
32
import copy
32
import univention.admin.filter		# Definiert Filterausdruck-Objekt für 'lookup' Funktion unten
33
import univention.admin.filter		# Definiert Filterausdruck-Objekt für 'lookup' Funktion unten
33
import univention.admin.handlers	# Enthält simpleLdap, die Basisklasse für 'object' unten
34
import univention.admin.handlers	# Enthält simpleLdap, die Basisklasse für 'object' unten
34
import univention.admin.syntax		# Liefert standard Syntax-Definitionen für die UDM 'property_descriptions' unten
35
import univention.admin.syntax		# Liefert standard Syntax-Definitionen für die UDM 'property_descriptions' unten
35
36
37
# Für das Einbinden von Übersetzungskatalogen für verschiedene Sprachen
36
translation=univention.admin.localization.translation('univention.admin.handlers.test')
38
translation=univention.admin.localization.translation('univention.admin.handlers.test')
37
_=translation.translate
39
_ = translation.translate
38
40
39
############################ <Syntax definitions> #############################
41
############################ <Syntax definitions> #############################
40
42
41
class SynVoIP_Protocols(univention.admin.syntax.select):
43
class SynVoIP_Protocols(univention.admin.syntax.select):
42
	"""Diese Klasse definiert einen neue Syntax für eine Auswahlliste von VoIP-Protokollen"""
44
	"""Diese Klasse definiert einen neue Syntax für eine Auswahlliste von VoIP-Protokollen"""
43
	## der Text, der in dem Web-Frontend vor die Auswahlliste geschrieben werden soll
45
	## der Text, der in dem Web-Frontend vor die Auswahlliste geschrieben werden soll
44
	name=u'VoIP_Protocol'
46
	name = u'VoIP_Protocol'
45
47
46
	## die Liste der Auswahlmöglichkeiten: Jedes der Elemente enthält einen eindeutigen Schlüssel
48
	## die Liste der Auswahlmöglichkeiten: Jedes der Elemente enthält einen eindeutigen Schlüssel
47
	## und den anzuzeigenden Text
49
	## und den anzuzeigenden Text
48
	choices=[ ( 'sip', u'SIP'), ( 'h323', u'H.323' ), ('skype', u'Skype' ) ]
50
	choices = [('sip', _(u'SIP')), ('h323', _(u'H.323')), ('skype', _(u'Skype'))]
49
51
50
class SynVoIP_Address(univention.admin.syntax.simple):
52
class SynVoIP_Address(univention.admin.syntax.simple):
51
	"""Diese Klasse dient als Syntax für VoIP Adresse. Der Aufbau ist einer E-Mail Adresse ähnlich,
53
	"""Diese Klasse dient als Syntax für VoIP Adresse. Der Aufbau ist einer E-Mail Adresse ähnlich,
52
	kann aber als Präfix noch ein Schema gefolgt von einem ':' enthalten.
54
	kann aber als Präfix noch ein Schema gefolgt von einem ':' enthalten.
53
	Valide Schemta sind: sip, h323 und skype"""
55
	Valide Schemta sind: sip, h323 und skype"""
54
56
55
	name='VoIP_Address'
57
	name = 'VoIP_Address'
56
	min_length=4
58
	min_length = 4
57
	max_length=256
59
	max_length = 256
58
	_re = re.compile('((^(sip|h323|skype):)?([a-zA-Z])[a-zA-Z0-9._-]+)@[a-zA-Z0-9._-]+$')
60
	_re = re.compile('((^(sip|h323|skype):)?([a-zA-Z])[a-zA-Z0-9._-]+)@[a-zA-Z0-9._-]+$')
59
61
60
	def parse(self, text):
62
	def parse(self, text):
61
		if self._re.match(text) != None:
63
		if self._re.match(text) != None:
62
			return text
64
			return text
63
		raise univention.admin.uexceptions.valueError, u'Not a valid VoIP Address'
65
		raise univention.admin.uexceptions.valueError(_(u'Not a valid VoIP Address'))
64
66
65
67
66
############################ </Syntax definitions> ############################
68
############################ </Syntax definitions> ############################
 Lines 72-100    Link Here 
72
## dieses Objekt kann keine Unterobjekte enthalten
74
## dieses Objekt kann keine Unterobjekte enthalten
73
childs = 0
75
childs = 0
74
## ein sprechender Name für das Web-Frontend
76
## ein sprechender Name für das Web-Frontend
75
short_description = u'IP-Phone'
77
short_description = _(u'IP-Phone')
76
## eine ausführliche Beschreibung
78
## eine ausführliche Beschreibung
77
long_description = u'An example module for the Univention Directory Manager'
79
long_description = _(u'An example module for the Univention Directory Manager')
78
## die LDAP Operationen, die auf diesem Objekt ausgeführt werden können
80
## die LDAP Operationen, die auf diesem Objekt ausgeführt werden können
79
operations=['add','edit','remove','search','move']
81
operations = ['add', 'edit', 'remove', 'search', 'move']
80
82
81
83
82
##### Um einen eigenen Wizard zu erstellen, der im UDM-Web links in der Navigationsleiste erscheint:
84
##### Um einen eigenen Wizard zu erstellen, der im UDM-Web links in der Navigationsleiste erscheint:
83
## usewizard = 1
85
## usewizard = 1
84
## wizardmenustring = "VoIP"
86
## wizardmenustring = "VoIP"
85
## wizarddescription =  "Hinzufuegen, Loeschen und Suchen von VoIP Objekten"
87
## wizarddescription =  _(u"Add, delete and search VoIP objects"
86
## wizardoperations = { 'add' : [ "Hinzufuegen", "Fuegt ein VoIP Objekt hinzu" ],
88
## wizardoperations = { 'add' : [_(u"add"), _(u"Add an VoIP object")],
87
##                    'find' : [ "Suchen", "Sucht VoIP Objekte" ] }
89
##                    'find' : [_(u"Search"), _(u"Search VoIP objects"]) }
88
## wizardpath="univentionUsersObject"
90
## wizardpath="univentionUsersObject"
89
91
90
############################ <UDM module options> #############################
92
############################ <UDM module options> #############################
91
## Liste der Optionen für dieses Modul, bzw. für den behandelten Objekttyp
93
## Liste der Optionen für dieses Modul, bzw. für den behandelten Objekttyp
92
options={
94
options = {
93
	# durch 'options' werden optionale Eigenschaften eines Objekts definiert
95
	# durch 'options' werden optionale Eigenschaften eines Objekts definiert
94
	'redirection': univention.admin.option(
96
	'redirection': univention.admin.option(
95
			short_description=_('Call redirect option'),
97
			short_description=_('Call redirect option'),
96
			default=1,
98
			default=True,
97
			editable=1,
99
			editable=True,
98
			objectClasses = ['testPhoneCallRedirect'],
100
			objectClasses = ['testPhoneCallRedirect'],
99
		)
101
		)
100
}
102
}
 Lines 102-181    Link Here 
102
########################### <UDM module properties> ###########################
104
########################### <UDM module properties> ###########################
103
105
104
## Liste der Eigenschaften für dieses Modul
106
## Liste der Eigenschaften für dieses Modul
105
property_descriptions={
107
property_descriptions = {
106
	# der eindeutige Name eines IP-Telefons
108
	# der eindeutige Name eines IP-Telefons
107
	'name': univention.admin.property(
109
	'name': univention.admin.property(
108
			short_description= u'Name',
110
			short_description=_(u'Name'),
109
			long_description= u'ID of the IP-phone',
111
			long_description=_(u'ID of the IP-phone'),
110
			syntax=univention.admin.syntax.hostName,	# Eigenschaft muss der Syntax eines Rechnernamens entsprechen, Def. in syntax.py
112
			syntax=univention.admin.syntax.hostName,	# Eigenschaft muss der Syntax eines Rechnernamens entsprechen, Def. in syntax.py
111
			multivalue=0,
113
			multivalue=False,
112
			options=[],
114
			options=[],
113
			required=1,								# Eigenschaft muss angegeben werden
115
			required=True,								# Eigenschaft muss angegeben werden
114
			may_change=0,								# Eigenschaft darf nach Erstellung nicht verändert werden
116
			may_change=False,							# Eigenschaft darf nach Erstellung nicht verändert werden
115
			identifies=1								# Eigenschaft muss eindeutig sein
117
			identifies=True								# Eigenschaft muss eindeutig sein
116
		),
118
		),
117
	#
119
	#
118
	'active': univention.admin.property(
120
	'active': univention.admin.property(
119
			short_description= u'active',
121
			short_description=_(u'active'),
120
			long_description= u'The IP-phone can be deactivated',
122
			long_description=_(u'The IP-phone can be deactivated'),
121
			syntax=univention.admin.syntax.boolean,		# kann nur die Werte '1' oder '0' annehmen, Definition in syntax.py
123
			syntax=univention.admin.syntax.boolean,		# kann nur die Werte '1' oder '0' annehmen, Definition in syntax.py
122
			multivalue=0,
124
			multivalue=False,
123
			options=[],
125
			options=[],
124
			required=0,								# Eigenschaft muss nicht zwingend angegeben werden
126
			required=False,								# Eigenschaft muss nicht zwingend angegeben werden
125
			default='1',								# Eigenschaft ist standardmäßig aktiviert
127
			default='1',								# Eigenschaft ist standardmäßig aktiviert
126
			may_change=1,								# Eigenschaft darf modifiziert werden
128
			may_change=True,							# Eigenschaft darf modifiziert werden
127
			identifies=0
129
			identifies=False
128
		),
130
		),
129
	'protocol': univention.admin.property(
131
	'protocol': univention.admin.property(
130
			short_description= u'Protocol',
132
			short_description=_(u'Protocol'),
131
			long_description= u'Supported VoIP protocols',
133
			long_description=_(u'Supported VoIP protocols'),
132
			syntax=SynVoIP_Protocols,					# nutzt die selbst definierte Auswahlliste als Syntax
134
			syntax=SynVoIP_Protocols,					# nutzt die selbst definierte Auswahlliste als Syntax
133
			multivalue=0,
135
			multivalue=False,
134
			options=[],
136
			options=[],
135
			required=0,
137
			required=False,
136
			default='sip',							# der Eintrag 'sip' ist vorausgewählt
138
			default='sip',							# der Eintrag 'sip' ist vorausgewählt
137
			may_change=1,
139
			may_change=True,
138
			identifies=0
140
			identifies=False
139
		),
141
		),
140
	'ip': univention.admin.property(
142
	'ip': univention.admin.property(
141
			short_description = u'IP-Address',
143
			short_description=_(u'IP-Address'),
142
			long_description = u'IP-Address of the IP-phone',
144
			long_description=_(u'IP-Address of the IP-phone'),
143
			syntax=univention.admin.syntax.ipAddress,	# muss der Syntax einer IP (Version 4) Adresse entsprechen
145
			syntax=univention.admin.syntax.ipAddress,	# muss der Syntax einer IP (Version 4) Adresse entsprechen
144
			multivalue=0,
146
			multivalue=False,
145
			options=[],
147
			options=[],
146
			required=1,
148
			required=True,
147
			may_change=1,
149
			may_change=True,
148
			identifies=0
150
			identifies=False
149
		),
151
		),
150
	'priuser': univention.admin.property(
152
	'priuser': univention.admin.property(
151
			short_description = u'Primary User',
153
			short_description=_(u'Primary User'),
152
			long_description = u'The primary user of this IP-phone',
154
			long_description=_(u'The primary user of this IP-phone'),
153
			syntax=SynVoIP_Address,						# muss der Syntax einer VoIP Adresse entsprechen
155
			syntax=SynVoIP_Address,						# muss der Syntax einer VoIP Adresse entsprechen
154
			multivalue=0,
156
			multivalue=False,
155
			options=[],
157
			options=[],
156
			required=1,
158
			required=True,
157
			may_change=1,
159
			may_change=True,
158
			identifies=0
160
			identifies=False
159
		),
161
		),
160
	'users': univention.admin.property(
162
	'users': univention.admin.property(
161
			short_description = u'Additional Users',
163
			short_description=_(u'Additional Users'),
162
			long_description = u'Users, that may register with this phone',
164
			long_description=_(u'Users, that may register with this phone'),
163
			syntax=SynVoIP_Address,						# jeder Eintrag muss der Syntax einer VoIP Adresse entsprechen
165
			syntax=SynVoIP_Address,						# jeder Eintrag muss der Syntax einer VoIP Adresse entsprechen
164
			multivalue=1,							# Dies ist eine Liste von Adressen
166
			multivalue=True,						# Dies ist eine Liste von Adressen
165
			options=[],
167
			options=[],
166
			required=0,
168
			required=False,
167
			may_change=1,
169
			may_change=True,
168
			identifies=0
170
			identifies=False
169
		),
171
		),
170
	'redirect_user': univention.admin.property(
172
	'redirect_user': univention.admin.property(
171
			short_description = u'Redirection User',
173
			short_description=_(u'Redirection User'),
172
			long_description = u'Address for call redirection',
174
			long_description=_(u'Address for call redirection'),
173
			syntax=SynVoIP_Address,
175
			syntax=SynVoIP_Address,
174
			multivalue=0,
176
			multivalue=False,
175
			options=['redirection'],					# Ist nur da, wenn die Option gesetzt ist
177
			options=['redirection'],					# Ist nur da, wenn die Option gesetzt ist
176
			required=0,
178
			required=False,
177
			may_change=1,
179
			may_change=True,
178
			identifies=0
180
			identifies=False
179
		),
181
		),
180
}
182
}
181
183
 Lines 186-215    Link Here 
186
##   * Der erste Parameter ist der Name des Reiters und der zweite Parameter
188
##   * Der erste Parameter ist der Name des Reiters und der zweite Parameter
187
##     ist eine Beschreibung der Einstellungsmöglich für diesen Reiter
189
##     ist eine Beschreibung der Einstellungsmöglich für diesen Reiter
188
##   * Die folgende Liste definiert die Anordnung der einzelnen Eigenschaftsfelder.
190
##   * Die folgende Liste definiert die Anordnung der einzelnen Eigenschaftsfelder.
189
layout=[
191
##   * Per advanced=True wird der Reiter nur angezeigt, wenn das Anzeigen der
190
	univention.admin.tab( u'Gerneral', u'Basic Settings',
192
##     erweiterten Einstellungen aktiviert ist.
191
			[ [ univention.admin.field( "name" ), univention.admin.field( "active" ) ],
193
layout = [
192
			[ univention.admin.field( "ip" ), univention.admin.field( "protocol" ) ],
194
	univention.admin.tab((u'Gerneral'), _(u'Basic Settings'), [
193
			[ univention.admin.field( "priuser" ) ] ] ),
195
			[ univention.admin.field("name"), univention.admin.field("active") ],
194
	univention.admin.tab( u'Advanced', u'Advanced Settings', [
196
			[ univention.admin.field("ip"), univention.admin.field("protocol") ],
195
				[ univention.admin.field( "users" ) ],
197
			[ univention.admin.field("priuser") ],
196
			], advanced = True ),
198
			]),
197
	univention.admin.tab( u'Redirect', u'Redirect Option', [
199
	univention.admin.tab(_(u'Advanced'), _(u'Advanced Settings'), [
198
				[ univention.admin.field( "redirect_user" ) ],
200
				[ univention.admin.field("users") ],
199
			], advanced = True ),
201
			], advanced=True),
202
	univention.admin.tab(_(u'Redirect'), _(u'Redirect Option'), [
203
				[ univention.admin.field("redirect_user") ],
204
			], advanced=True),
200
	]
205
	]
201
206
202
################ <Mapping of UDM properties to LDAP attribute> ################
207
################ <Mapping of UDM properties to LDAP attribute> ################
203
208
204
## Die folgenden beiden Hilfsfunktionen dienen zur Abbildung von bool'schen Werten '0' und '1' auf 'no' und 'yes' (siehe Mapping)
209
## Die folgenden beiden Hilfsfunktionen dienen zur Abbildung von bool'schen Werten '0' und '1' auf 'no' und 'yes' (siehe Mapping)
205
def boolToString(value):
210
def boolToString(value):
211
	u"""Wandelt den Wert des LDAP-Attributs in den Wert für die Anzeige der UDM Property."""
206
	if value == '1':
212
	if value == '1':
207
		return 'yes'
213
		return _('yes')
208
	else:
214
	else:
209
		return 'no'
215
		return _('no')
210
216
211
def stringToBool(value):
217
def stringToBool(value):
212
	if value[0].lower() == 'yes':
218
	u"""Wandelt den Wert der UDM Property zurück in den Wert des LDAP-Attributs."""
219
	if value[0].lower() == _('yes'):
213
		return '1'
220
		return '1'
214
	else:
221
	else:
215
		return '0'
222
		return '0'
 Lines 230-237    Link Here 
230
mapping.register('users', 'testPhoneUsers')
237
mapping.register('users', 'testPhoneUsers')
231
mapping.register('redirect_user', 'testPhoneRedirectUser', None, univention.admin.mapping.ListToString)
238
mapping.register('redirect_user', 'testPhoneRedirectUser', None, univention.admin.mapping.ListToString)
232
239
240
233
class object(univention.admin.handlers.simpleLdap):
241
class object(univention.admin.handlers.simpleLdap):
234
	"""Dieses Objekt unterstützt den Univention Directory Manager bei LDAP-Operationen,
242
	u"""Dieses Objekt unterstützt den Univention Directory Manager bei LDAP-Operationen,
235
	die sich auf dieses Modul beziehen.
243
	die sich auf dieses Modul beziehen.
236
	Die Basisklasse univention.admin.handlers.simpleLdap implementiert die komplette Kommunikation über LDAP,
244
	Die Basisklasse univention.admin.handlers.simpleLdap implementiert die komplette Kommunikation über LDAP,
237
	so dass hier nur die Anpassungen für dieses spezielle LDAP-Objekt implementiert werden müssen.
245
	so dass hier nur die Anpassungen für dieses spezielle LDAP-Objekt implementiert werden müssen.
 Lines 240-261    Link Here 
240
	um einen Überblick der Möglichkeiten zu geben."""
248
	um einen Überblick der Möglichkeiten zu geben."""
241
249
242
	## den Modulnamen als Attribute der Klasse übernehmen (oben definiert als module='test/ip-phone')
250
	## den Modulnamen als Attribute der Klasse übernehmen (oben definiert als module='test/ip-phone')
243
	module=module
251
	module = module
244
252
245
	def __init__(self, co, lo, position, dn='', superordinate=None, arg=None):
253
	def __init__(self, co, lo, position, dn='', superordinate=None, arg=None):
246
		"""Initialisierung des Objektes. Hier müssen die oben definierten globalen Variablen 'mapping'
254
		u"""Initialisierung des Objektes. Hier müssen die oben definierten globalen Variablen 'mapping'
247
		und 'property_descriptions' übernommen werden"""
255
		und 'property_descriptions' übernommen werden"""
248
		global options
256
		global options
249
		global mapping
257
		global mapping
250
		global property_descriptions
258
		global property_descriptions
251
259
252
		self.co=co
260
		self.co = co
253
		self.lo=lo
261
		self.lo = lo
254
		self.dn=dn
262
		self.dn = dn
255
		self.position=position
263
		self.position = position
256
		self._exists=0
264
		self._exists = 0
257
		self.mapping=mapping
265
		self.mapping = mapping
258
		self.descriptions=property_descriptions
266
		self.descriptions = property_descriptions
259
267
260
		## Initialisierungsfunktion der Basisobjektklasse simpleLdap in univention.admin.handlers
268
		## Initialisierungsfunktion der Basisobjektklasse simpleLdap in univention.admin.handlers
261
		## * liest die Objekt Attribute für den 'dn' aus dem LDAP ud stellt sie als self.oldattr bereit.
269
		## * liest die Objekt Attribute für den 'dn' aus dem LDAP ud stellt sie als self.oldattr bereit.
 Lines 273-279    Link Here 
273
		## 'options' lässt sich ermitteln, welche Optionen an dem Objekt aktiviert sind. Die so ermittelte
281
		## 'options' lässt sich ermitteln, welche Optionen an dem Objekt aktiviert sind. Die so ermittelte
274
		## Auswahl sollte als # self.options an diesem Objekt notiert werden, damit darauf basierend
282
		## Auswahl sollte als # self.options an diesem Objekt notiert werden, damit darauf basierend
275
		## weitere Entscheidungen getroffen werden können.
283
		## weitere Entscheidungen getroffen werden können.
276
		self.options=[]
284
		self.options = []
277
		if self.oldattr.has_key('objectClass'):
285
		if self.oldattr.has_key('objectClass'):
278
			ocs = set(self.oldattr['objectClass'])
286
			ocs = set(self.oldattr['objectClass'])
279
			for opt in ('redirection', ):
287
			for opt in ('redirection', ):
 Lines 281-295    Link Here 
281
					self.options.append(opt)
289
					self.options.append(opt)
282
		else:
290
		else:
283
			univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, '%s: reset options to default by _define_options' % module)
291
			univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, '%s: reset options to default by _define_options' % module)
284
			self._define_options( options )
292
			self._define_options(options)
285
293
286
		self.old_options= copy.deepcopy( self.options )
294
		self.old_options= copy.deepcopy(self.options)
287
295
288
	def exists(self):
296
	def exists(self):
297
		u"""Von SimpleLdap intern verwendete Methode, um zu entscheiden, ob ein
298
		Objekt neu angelegt werden muß oder ein vorhandenes editiert wird."""
289
		return self._exists
299
		return self._exists
290
300
291
	def open(self):
301
	def open(self):
292
		"""Öffnen des LDAP-Objekts."""
302
		u"""Öffnen des LDAP-Objekts."""
293
303
294
		univention.admin.handlers.simpleLdap.open(self)
304
		univention.admin.handlers.simpleLdap.open(self)
295
		## In dieser Methode können die Eigenschaften des Objekts in self.info dynamisch Vor-initialisiert werden. 
305
		## In dieser Methode können die Eigenschaften des Objekts in self.info dynamisch Vor-initialisiert werden. 
 Lines 303-347    Link Here 
303
		## in self.oldinfo und self.oldpolicies gespeichert. Diese dienen später zum Vergleich mit dem
313
		## in self.oldinfo und self.oldpolicies gespeichert. Diese dienen später zum Vergleich mit dem
304
		## aktualisierten Eigenschaften in self.info.
314
		## aktualisierten Eigenschaften in self.info.
305
		self.save()
315
		self.save()
306
		self.old_options= copy.deepcopy( self.options ) # Optionen zum späteren Vergleich speichern.
316
		self.old_options = copy.deepcopy(self.options) # Optionen zum späteren Vergleich speichern.
307
317
308
	def _ldap_pre_create(self):
318
	def _ldap_pre_create(self):
309
		"""Wird vor dem Anlegen des LDAP Objektes aufgerufen."""
319
		u"""Wird vor dem Anlegen des LDAP Objektes aufgerufen."""
310
		self.dn='%s=%s,%s' % (mapping.mapName('name'), mapping.mapValue('name', self.info['name']), self.position.getDn())
320
		self.dn = '%s=%s,%s' % (mapping.mapName('name'), mapping.mapValue('name', self.info['name']), self.position.getDn())
311
321
312
	def _ldap_post_create(self):
322
	def _ldap_post_create(self):
313
		"""Wird nach dem Anlegen des Objektes aufgerufen."""
323
		u"""Wird nach dem Anlegen des Objektes aufgerufen."""
314
		pass
324
		pass
315
325
316
	def _ldap_pre_modify(self):
326
	def _ldap_pre_modify(self):
317
		"""Wird vor dem Modifizieren des Objektes aufgerufen."""
327
		u"""Wird vor dem Modifizieren des Objektes aufgerufen."""
318
		pass
328
		pass
319
329
320
	def _ldap_post_modify(self):
330
	def _ldap_post_modify(self):
321
		"""Wird nach dem Modifizieren des Objektes aufgerufen."""
331
		u"""Wird nach dem Modifizieren des Objektes aufgerufen."""
322
		pass
332
		pass
323
333
324
	def _ldap_pre_remove(self):
334
	def _ldap_pre_remove(self):
325
		"""Wird vor dem Löschen des Objektes aufgerufen."""
335
		u"""Wird vor dem Löschen des Objektes aufgerufen."""
326
		pass
336
		pass
327
337
328
	def _ldap_post_remove(self):
338
	def _ldap_post_remove(self):
329
		"""Wird nach dem Löschen des Objektes aufgerufen."""
339
		u"""Wird nach dem Löschen des Objektes aufgerufen."""
330
		pass
340
		pass
331
341
332
	def _update_policies(self):
342
	def _update_policies(self):
333
		pass
343
		pass
334
344
335
	def _ldap_addlist(self):
345
	def _ldap_addlist(self):
336
		"""Diese Funktion muss definiert werden, weil sie von 'create' verwendet wird.
346
		u"""Diese Funktion muss definiert werden, weil sie von 'create' verwendet wird.
337
		Sie sollte die nur zum Anlegen notwendigen LDAP-Attribute zurückgeben, d.h. mindestens die
347
		Sie sollte die nur zum Anlegen notwendigen LDAP-Attribute zurückgeben, d.h. mindestens die
338
		'objectClass' Definition. Nach dieser Methode ruft 'create' _ldap_modlist auf, um weitere
348
		'objectClass' Definition. Nach dieser Methode ruft 'create' _ldap_modlist auf, um weitere
339
		Modifikationen an Eigenschaften festzustellen."""
349
		Modifikationen an Eigenschaften festzustellen."""
340
350
341
		al = [ ('objectClass', ['top', 'testPhone' ] ) ]
351
		al = [('objectClass', ['top', 'testPhone' ])]
342
		return al
352
		return al
343
353
344
	def _remove_attr(self, ml, attr):
354
	def _remove_attr(self, ml, attr):
355
		u"""Hilfmethode zum Entfernen das Attribut 'attr' aus der Liste der zu
356
		modifizierenden Attribute 'ml'."""
345
		for m in ml:
357
		for m in ml:
346
			if m[0] == attr:
358
			if m[0] == attr:
347
				ml.remove(m)
359
				ml.remove(m)
 Lines 350-356    Link Here 
350
		return ml
362
		return ml
351
363
352
	def _ldap_modlist(self):
364
	def _ldap_modlist(self):
353
		"""Diese Funktion kann definiert werden. Die gleichnamige ererbte Methode von 'simpleLdap'
365
		u"""Diese Funktion kann definiert werden. Die gleichnamige ererbte Methode von 'simpleLdap'
354
		erstellt eine LDAP-modlist aus der Differenz zwischen self.oldinfo und self.info."""
366
		erstellt eine LDAP-modlist aus der Differenz zwischen self.oldinfo und self.info."""
355
367
356
		ml = univention.admin.handlers.simpleLdap._ldap_modlist(self)
368
		ml = univention.admin.handlers.simpleLdap._ldap_modlist(self)
 Lines 361-399    Link Here 
361
			univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'old_options: %s' % self.old_options)
373
			univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'old_options: %s' % self.old_options)
362
			if 'redirection' in self.options and not 'redirection' in self.old_options:
374
			if 'redirection' in self.options and not 'redirection' in self.old_options:
363
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'added redirection option')
375
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'added redirection option')
364
				ocs=self.oldattr.get('objectClass', [])
376
				ocs = self.oldattr.get('objectClass', [])
365
				if not 'testPhoneCallRedirect' in ocs:
377
				if not 'testPhoneCallRedirect' in ocs:
366
					ml.insert(0, ('objectClass', '', 'testPhoneCallRedirect'))
378
					ml.insert(0, ('objectClass', '', 'testPhoneCallRedirect'))
367
			if not 'redirection' in self.options and 'redirection' in self.old_options:
379
			if not 'redirection' in self.options and 'redirection' in self.old_options:
368
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'remove redirection option')
380
				univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO, 'remove redirection option')
369
				ocs=self.oldattr.get('objectClass', [])
381
				ocs = self.oldattr.get('objectClass', [])
370
				if 'testPhoneCallRedirect' in ocs:
382
				if 'testPhoneCallRedirect' in ocs:
371
					ml.insert(0, ('objectClass', 'testPhoneCallRedirect', ''))
383
					ml.insert(0, ('objectClass', 'testPhoneCallRedirect', ''))
372
384
373
				for key in [ 'testPhoneRedirectUser', ]:
385
				for key in [ 'testPhoneRedirectUser', ]:
374
					ml=self._remove_attr(ml,key)
386
					ml = self._remove_attr(ml, key)
375
		return ml
387
		return ml
376
 
388
 
377
389
378
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
390
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
379
	"""Diese Function sucht nach Objekten, die dem in diesem Modul verwalteten Typ (objectClass)
391
	u"""Diese Function sucht nach Objekten, die dem in diesem Modul verwalteten Typ (objectClass)
380
	die den angegebenen Suchkriterien entsprechen. Der Rückgabewert dieser Funktion ist ein Liste
392
	die den angegebenen Suchkriterien entsprechen. Der Rückgabewert dieser Funktion ist ein Liste
381
	der gefunden Objekte."""
393
	der gefunden Objekte."""
382
394
383
	filter=univention.admin.filter.conjunction('&', [
395
	filter = univention.admin.filter.conjunction('&', [
384
				univention.admin.filter.expression('objectClass', 'testPhone'),
396
				univention.admin.filter.expression('objectClass', 'testPhone'),
385
				])
397
				])
386
398
387
	if filter_s:
399
	if filter_s:
388
		## Vom Benutzer übergebene Zeichenkette in ein Filterausdruck-Objekt übersetzten:
400
		## Vom Benutzer übergebene Zeichenkette in ein Filterausdruck-Objekt übersetzten:
389
		filter_p=univention.admin.filter.parse(filter_s)
401
		filter_p = univention.admin.filter.parse(filter_s)
390
		## Übersetzung der UDM Objekt-Variablennamen ('property_descriptions') und -Werte im Filterausdruck
402
		## Übersetzung der UDM Objekt-Variablennamen ('property_descriptions') und -Werte im Filterausdruck
391
		## auf LDAP-Attributnamen und -Werte, wie durch 'mapping' oben definiert:
403
		## auf LDAP-Attributnamen und -Werte, wie durch 'mapping' oben definiert:
392
		univention.admin.filter.walk(filter_p, univention.admin.mapping.mapRewrite, arg=mapping)
404
		univention.admin.filter.walk(filter_p, univention.admin.mapping.mapRewrite, arg=mapping)
393
		## Oben definierten Objektklassenfilter ergänzen um den vom Benutzer übergebenen Filterausdruck:
405
		## Oben definierten Objektklassenfilter ergänzen um den vom Benutzer übergebenen Filterausdruck:
394
		filter.expressions.append(filter_p)
406
		filter.expressions.append(filter_p)
395
407
396
	res=[]
408
	res = []
397
	## LDAP-Suche öber das LDAP-Connection-Objekt 'lo' unter Verwendung des unicode-Encodings,
409
	## LDAP-Suche öber das LDAP-Connection-Objekt 'lo' unter Verwendung des unicode-Encodings,
398
	## das Python intern verwendet:
410
	## das Python intern verwendet:
399
	for dn in lo.searchDn(unicode(filter), base, scope, unique, required, timeout, sizelimit):
411
	for dn in lo.searchDn(unicode(filter), base, scope, unique, required, timeout, sizelimit):
 Lines 402-410    Link Here 
402
	return res
414
	return res
403
415
404
416
405
def identify(dn, attr, canonical=0):
417
def identify(dn, attr, canonical=False):
406
	"""Prüft ob die verwaltete Objektklasse diese Moduls in der übergebenen Liste enthalten ist,
418
	u"""Prüft ob die verwaltete Objektklasse diese Moduls in der übergebenen Liste enthalten ist,
407
	d.h. ob dieses Modul für die Handhabung des Objekts zuständig ist"""
419
	d.h. ob dieses Modul für die Handhabung des Objekts zuständig ist."""
408
420
409
	return 'testPhone' in attr.get('objectClass', [])
421
	return 'testPhone' in attr.get('objectClass', [])
410

Return to bug 17915