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

Collapse All | Expand All

(-)management/univention-directory-manager-modules/modules/univention/admin/handlers/__init__.py (+51 lines)
 Lines 975-980   class simpleLdap(object): Link Here 
975
		"""Hook which is called after the object removal."""
975
		"""Hook which is called after the object removal."""
976
		self._release_locks()
976
		self._release_locks()
977
977
978
	def remove_value(self, key, value=None):
979
		"""Removes a specific value from the specified property.
980
			If this value is currently not set univention.admin.uexceptions.valueNotSet is raised.
981
			if value is None the whole values of this property gets removed.
982
		"""
983
		if not self.has_property(key):
984
			raise univention.admin.uexceptions.noProperty(key)
985
986
		if value is None:
987
			# remove all currently set values
988
			self[key] = [] if self.descriptions[key].multivalue else None
989
			return
990
991
		if not self.contains_value(key, value):
992
			raise univention.admin.uexceptions.valueNotSet(key, value)
993
994
		if not self.descriptions[key].multivalue:
995
			self[key] = value
996
			return
997
998
		current_values = list(self[key])
999
		for val in current_values[:]:
1000
			if self.compare_value(key, value, val):
1001
				current_values.remove(val)
1002
		self[key] = current_values
1003
1004
	def contains_value(self, key, value):
1005
		if self.descriptions[key].multivalue and any(self.compare_value(key, value, val) for val in self[key]):
1006
			return True
1007
		if not self.descriptions[key].multivalue and self.compare_value(key, value, self[key]):
1008
			return True
1009
		return False
1010
1011
	def compare_value(self, key, a, b):
1012
		return self.descriptions[key].syntax.normalize(a) == self.descriptions[key].syntax.normalize(b)
1013
1014
	def append_value(self, key, value):
1015
		if not self.has_property(key):
1016
			raise univention.admin.uexceptions.noProperty(key)
1017
1018
		if self.contains_value(key, value):
1019
			raise univention.admin.uexceptions.valueAlreadySet(key, value)
1020
1021
		if not self.descriptions[key].multivalue:
1022
			self[key] = value
1023
			return
1024
1025
		current_values = self[key]
1026
		current_values.append(value)
1027
		self[key] = current_values
1028
978
	def _safe_cancel(self):  # type: () -> None
1029
	def _safe_cancel(self):  # type: () -> None
979
		try:
1030
		try:
980
			self.cancel()
1031
			self.cancel()
(-)management/univention-directory-manager-modules/modules/univention/admin/syntax.py (+14 lines)
 Lines 257-262   class ISyntax(object): Link Here 
257
		"""
257
		"""
258
		return text
258
		return text
259
259
260
	@classmethod
261
	def normalize(cls, value):
262
		return cls.parse(value)
263
260
	def parse_command_line(self, value):
264
	def parse_command_line(self, value):
261
		return value
265
		return value
262
266
 Lines 774-779   class UDM_Objects(ISyntax, _UDMObjectOrAttribute): Link Here 
774
			return univention.admin.types.DistinguishedNameType
778
			return univention.admin.types.DistinguishedNameType
775
		return univention.admin.types.StringType
779
		return univention.admin.types.StringType
776
780
781
	@classmethod
782
	def normalize(cls, value):
783
		if cls.key == 'dn':
784
			return univention.admin.uldap.DN(value)
785
		return super(UDM_Objects, cls).normalize(value)
786
777
	@classmethod
787
	@classmethod
778
	def parse(self, text):
788
	def parse(self, text):
779
		if not self.empty_value and not text:
789
		if not self.empty_value and not text:
 Lines 3414-3419   class ldapDn(simple): Link Here 
3414
3424
3415
	type_class = univention.admin.types.DistinguishedNameType
3425
	type_class = univention.admin.types.DistinguishedNameType
3416
3426
3427
	@classmethod
3428
	def normalize(cls, value):
3429
		return univention.admin.uldap.DN(value)
3430
3417
	@classmethod
3431
	@classmethod
3418
	def get_widget(cls, prop):
3432
	def get_widget(cls, prop):
3419
		if cls is ldapDn:
3433
		if cls is ldapDn:
(-)management/univention-directory-manager-modules/modules/univention/admin/uexceptions.py (+8 lines)
 Lines 105-110   class valueMismatch(valueError): Link Here 
105
	message = _('Values do not match.')
105
	message = _('Values do not match.')
106
106
107
107
108
class valueNotSet(valueError):
109
	message = _('The value is not set.')
110
111
112
class valueAlreadySet(valueError):
113
	message = _('The value is already set.')
114
115
108
class noLock(base):
116
class noLock(base):
109
	message = _('Could not acquire lock.')
117
	message = _('Could not acquire lock.')
110
118
(-)management/univention-directory-manager-modules/modules/univention/admincli/admin.py (-44 / +23 lines)
 Lines 263-316   def object_input(module, object, input, append=None, remove=None): Link Here 
263
					out.append('WARNING: file not found: %s' % values)
263
					out.append('WARNING: file not found: %s' % values)
264
			else:
264
			else:
265
				values = [module.property_descriptions[key].syntax.parse_command_line(x) for x in values]
265
				values = [module.property_descriptions[key].syntax.parse_command_line(x) for x in values]
266
				current_values = list(object[key] or [])
266
				for value in values:
267
				if current_values == ['']:
268
					current_values = []
269
270
				for val in values:
271
					if val in current_values:
272
						out.append('WARNING: cannot append %s to %s, value exists' % (val, key))
273
					else:
274
						current_values.append(val)
275
276
				if not module.property_descriptions[key].multivalue:
277
					try:
267
					try:
278
						current_values = current_values[-1]
268
						object.append_value(key, value)
279
					except IndexError:
269
					except univention.admin.uexceptions.noProperty:
280
						current_values = None
270
						raise OperationFailed(out, "WARNING: No attribute with name %s in this module, value not appended." % (key,))
281
271
					except univention.admin.uexceptions.valueNotSet as exc:
282
				try:
272
						raise OperationFailed(out, "WARNING: cannot append %s to %s: %s" % (value, key, exc))
283
					object[key] = current_values
273
					except univention.admin.uexceptions.valueInvalidSyntax as errmsg:
284
				except univention.admin.uexceptions.valueInvalidSyntax as errmsg:
274
						raise OperationFailed(out, 'E: Invalid Syntax: %s' % (errmsg,))
285
					raise OperationFailed(out, 'E: Invalid Syntax: %s' % (errmsg,))
286
275
287
	if remove:
276
	if remove:
288
		for key, values in remove.items():
277
		for key, values in remove.items():
289
			current_values = [object[key]] if not module.property_descriptions[key].multivalue else list(object[key])
278
			try:
290
			if values is None:
279
				if values is None:
291
				current_values = []
280
					object.remove_value(key, values)
292
			else:
281
					continue
293
				vallist = [values] if isinstance(values, six.string_types) else values
282
				for value in values:
294
				vallist = [module.property_descriptions[key].syntax.parse_command_line(x) for x in vallist]
283
					value = module.property_descriptions[key].syntax.parse_command_line(value)
295
284
					#try:  # TODO: remove?! move into normalize()
296
				for val in vallist:
285
					#	value = module.property_descriptions[key].syntax.parse(value)
297
					try:
286
					#except (univention.admin.uexceptions.valueInvalidSyntax, univention.admin.uexceptions.valueError):
298
						normalized_val = module.property_descriptions[key].syntax.parse(val)
287
					#	pass
299
					except (univention.admin.uexceptions.valueInvalidSyntax, univention.admin.uexceptions.valueError):
288
					object.remove_value(key, value)
300
						normalized_val = None
289
			except univention.admin.uexceptions.noProperty:
301
290
				out.append("WARNING: No attribute with name %s in this module, value not removed." % (key,))
302
					if val in current_values:
291
			except univention.admin.uexceptions.valueNotSet as exc:
303
						current_values.remove(val)
292
				out.append("WARNING: cannot remove %s from %s: %s" % (value, key, exc))
304
					elif normalized_val is not None and normalized_val in current_values:
305
						current_values.remove(normalized_val)
306
					else:
307
						out.append("WARNING: cannot remove %s from %s, value does not exist" % (val, key))
308
			if not module.property_descriptions[key].multivalue:
309
				try:
310
					current_values = current_values[0]
311
				except IndexError:
312
					current_values = None
313
			object[key] = current_values
314
293
315
	if input:
294
	if input:
316
		for key, value in input.items():
295
		for key, value in input.items():

Return to bug 43286