View | Details | Raw Unified | Return to bug 35839
Collapse All | Expand All

(-)listener/udm_extension.py (-6 / +18 lines)
 Lines 137-144    Link Here 
137
		try:
137
		try:
138
			if not install_python_file(objectclass, target_subdir, new_relative_filename, new_object_data):
138
			if not install_python_file(objectclass, target_subdir, new_relative_filename, new_object_data):
139
				return
139
				return
140
			install_messagecatalog(dn, new, objectclass)
140
			if objectclass == 'univentionUDMModule':
141
			if objectclass == 'univentionUDMModule':
141
				install_messagecatalog(dn, new)
142
				install_umcregistration(dn, new)
142
				install_umcregistration(dn, new)
143
				install_umcicons(dn, new)
143
				install_umcicons(dn, new)
144
		finally:
144
		finally:
 Lines 151-160    Link Here 
151
		listener.setuid(0)
151
		listener.setuid(0)
152
		try:
152
		try:
153
			remove_python_file(objectclass, target_subdir, old_relative_filename)
153
			remove_python_file(objectclass, target_subdir, old_relative_filename)
154
			remove_messagecatalog(dn, old, univentionUDMSyntax)
154
			if objectclass == 'univentionUDMModule':
155
			if objectclass == 'univentionUDMModule':
155
				remove_umcicons(dn, old)
156
				remove_umcicons(dn, old)
156
				remove_umcregistration(dn, old)
157
				remove_umcregistration(dn, old)
157
				remove_messagecatalog(dn, old)
158
		finally:
158
		finally:
159
			listener.unsetuid()
159
			listener.unsetuid()
160
160
 Lines 475-483    Link Here 
475
	if parent_dir:
475
	if parent_dir:
476
		cleanup_python_moduledir(python_basedir, target_subdir, parent_dir)
476
		cleanup_python_moduledir(python_basedir, target_subdir, parent_dir)
477
477
478
def install_messagecatalog(dn, attrs):
478
def install_messagecatalog(dn, attrs, objectclass):
479
	translationfile_ldap_attribute = "univentionMessageCatalog"
479
	translationfile_ldap_attribute = "univentionMessageCatalog"
480
	translationfile_ldap_attribute_and_tag_prefix = "%s;entry-lang-" % (translationfile_ldap_attribute,)
480
	translationfile_ldap_attribute_and_tag_prefix = "%s;entry-lang-" % (translationfile_ldap_attribute,)
481
	if objectclass == 'univentionUDMModule':
482
		prefix = "univention-admin-handlers"
483
	elif objectclass == 'univentionUDMSyntax':
484
		prefix = "univention-admin-syntax"
485
	elif objectclass == 'univentionUDMHook':
486
		prefix = "univention-admin-hooks"
481
487
482
	values = {}
488
	values = {}
483
	for ldap_attribute in attrs.keys():
489
	for ldap_attribute in attrs.keys():
 Lines 490-496    Link Here 
490
	module_name = attrs.get('cn')[0]
496
	module_name = attrs.get('cn')[0]
491
	for language_tag, mo_data_binary in values.items():
497
	for language_tag, mo_data_binary in values.items():
492
		targetdir = os.path.join(LOCALE_BASEDIR, language_tag, 'LC_MESSAGES')
498
		targetdir = os.path.join(LOCALE_BASEDIR, language_tag, 'LC_MESSAGES')
493
		filename = os.path.join(targetdir, "univention-admin-handlers-%s.mo" % (module_name.replace('/', '-'),) )
499
		filename = os.path.join(targetdir, "%s-%s.mo" % (prefix, module_name.replace('/', '-'),) )
494
		if not os.path.exists(targetdir):
500
		if not os.path.exists(targetdir):
495
			ud.debug(ud.LISTENER, ud.ERROR, '%s: Error writing %s. Parent directory does not exist.' % (name, filename))
501
			ud.debug(ud.LISTENER, ud.ERROR, '%s: Error writing %s. Parent directory does not exist.' % (name, filename))
496
			continue
502
			continue
 Lines 497-505    Link Here 
497
		with open(filename, 'w') as f:
503
		with open(filename, 'w') as f:
498
			f.write(mo_data_binary)
504
			f.write(mo_data_binary)
499
505
500
def remove_messagecatalog(dn, attrs):
506
def remove_messagecatalog(dn, attrs, objectclass):
501
	translationfile_ldap_attribute = "univentionMessageCatalog"
507
	translationfile_ldap_attribute = "univentionMessageCatalog"
502
	translationfile_ldap_attribute_and_tag_prefix = "%s;entry-lang-" % (translationfile_ldap_attribute,)
508
	translationfile_ldap_attribute_and_tag_prefix = "%s;entry-lang-" % (translationfile_ldap_attribute,)
509
	if objectclass == 'univentionUDMModule':
510
		prefix = "univention-admin-handlers"
511
	elif objectclass == 'univentionUDMSyntax':
512
		prefix = "univention-admin-syntax"
513
	elif objectclass == 'univentionUDMHook':
514
		prefix = "univention-admin-hooks"
503
515
504
	language_tags = []
516
	language_tags = []
505
	for ldap_attribute in attrs.keys():
517
	for ldap_attribute in attrs.keys():
 Lines 512-518    Link Here 
512
	module_name = attrs.get('cn')[0]
524
	module_name = attrs.get('cn')[0]
513
	for language_tag in language_tags:
525
	for language_tag in language_tags:
514
		targetdir = os.path.join(LOCALE_BASEDIR, language_tag, 'LC_MESSAGES')
526
		targetdir = os.path.join(LOCALE_BASEDIR, language_tag, 'LC_MESSAGES')
515
		filename = os.path.join(targetdir, "univention-admin-handlers-%s.mo" % (module_name.replace('/', '-'),) )
527
		filename = os.path.join(targetdir, "%s-%s.mo" % (prefix, module_name.replace('/', '-'),) )
516
		if not os.path.exists(targetdir):
528
		if not os.path.exists(targetdir):
517
			ud.debug(ud.LISTENER, ud.ERROR, '%s: Error writing %s. Parent directory does not exist.' % (name, filename))
529
			ud.debug(ud.LISTENER, ud.ERROR, '%s: Error writing %s. Parent directory does not exist.' % (name, filename))
518
			continue
530
			continue
(-)modules/univention/admin/handlers/settings/udm_hook.py (+50 lines)
 Lines 146-151    Link Here 
146
			may_change=1,
146
			may_change=1,
147
			identifies=0
147
			identifies=0
148
		),
148
		),
149
	'messagecatalog': univention.admin.property(
150
			short_description=_('GNU message catalog for translations'),
151
			long_description='GNU message catalog (syntax: <language tag> <Base64 encoded GNU message catalog>)',
152
			syntax=univention.admin.syntax.Localesubdirname_and_GNUMessageCatalog,
153
			multivalue=1,
154
			include_in_default_search=0,
155
			options=[],
156
			required=0,
157
			may_change=1,
158
			identifies=0,
159
			),
149
	}
160
	}
150
161
151
layout = [
162
layout = [
 Lines 154-159    Link Here 
154
			["name"],
165
			["name"],
155
			["filename"],
166
			["filename"],
156
			["data"],
167
			["data"],
168
			["messagecatalog"],
157
		] ),
169
		] ),
158
		Group( _( 'Metadata' ), layout = [
170
		Group( _( 'Metadata' ), layout = [
159
			["package"],
171
			["package"],
 Lines 180-185    Link Here 
180
mapping.register('packageversion', 'univentionOwnedByPackageVersion', None, univention.admin.mapping.ListToString)
192
mapping.register('packageversion', 'univentionOwnedByPackageVersion', None, univention.admin.mapping.ListToString)
181
mapping.register('ucsversionstart', 'univentionUCSVersionStart', None, univention.admin.mapping.ListToString)
193
mapping.register('ucsversionstart', 'univentionUCSVersionStart', None, univention.admin.mapping.ListToString)
182
mapping.register('ucsversionend', 'univentionUCSVersionEnd', None, univention.admin.mapping.ListToString)
194
mapping.register('ucsversionend', 'univentionUCSVersionEnd', None, univention.admin.mapping.ListToString)
195
## messagecatalog is handled via object._post_map and object._post_unmap defined below
183
196
184
class object(univention.admin.handlers.simpleLdap):
197
class object(univention.admin.handlers.simpleLdap):
185
	module=module
198
	module=module
 Lines 218-224    Link Here 
218
			if not  apt.apt_pkg.version_compare(self['packageversion'], old_version) > -1:
231
			if not  apt.apt_pkg.version_compare(self['packageversion'], old_version) > -1:
219
				raise univention.admin.uexceptions.valueInvalidSyntax, _('packageversion: Version must not be lower than the current one.')
232
				raise univention.admin.uexceptions.valueInvalidSyntax, _('packageversion: Version must not be lower than the current one.')
220
233
234
	def _post_unmap( self, info, values ):
235
		info['messagecatalog'] = []
236
		messagecatalog_ldap_attribute = "univentionMessageCatalog"
237
		messagecatalog_ldap_attribute_and_tag_prefix = "%s;entry-lang-" % (messagecatalog_ldap_attribute,)
238
		for ldap_attribute, value_list in values.items():
239
			if ldap_attribute.startswith(messagecatalog_ldap_attribute_and_tag_prefix):
240
				language_tag = ldap_attribute.split(messagecatalog_ldap_attribute_and_tag_prefix, 1)[1]
241
				mo_data_base64 = univention.admin.mapping.unmapBase64(value_list)
242
				info['messagecatalog'].append( (language_tag, mo_data_base64) )
243
		return info
244
245
	def _post_map( self, modlist, diff ):
246
		messagecatalog_ldap_attribute = "univentionMessageCatalog"
247
		messagecatalog_ldap_attribute_and_tag_prefix = "%s;entry-lang-" % (messagecatalog_ldap_attribute,)
248
		for property_name, old_value, new_value in diff:
249
			if property_name == 'messagecatalog':
250
				old_dict = dict( old_value )
251
				new_dict = dict( new_value )
252
				for language_tag, old_mo_data_base64 in old_dict.items():
253
					ldap_attribute = ''.join((messagecatalog_ldap_attribute_and_tag_prefix, language_tag))
254
					new_mo_data_base64 = new_dict.get(language_tag)
255
					if not new_mo_data_base64: # property value has been removed
256
						old_mo_data_binary = univention.admin.mapping.mapBase64(old_mo_data_base64)
257
						modlist.append( ( ldap_attribute, old_mo_data_binary, None ) )
258
					else:
259
						if new_mo_data_base64 != old_mo_data_base64:
260
							old_mo_data_binary = univention.admin.mapping.mapBase64(old_mo_data_base64)
261
							new_mo_data_binary = univention.admin.mapping.mapBase64(new_mo_data_base64)
262
							modlist.append( ( ldap_attribute, old_mo_data_binary, new_mo_data_binary ) )
263
				for language_tag, new_mo_data_base64 in new_dict.items():
264
					ldap_attribute = ''.join((messagecatalog_ldap_attribute_and_tag_prefix, language_tag))
265
					if not old_dict.get(language_tag): # property value has been added
266
						new_mo_data_binary = univention.admin.mapping.mapBase64(new_mo_data_base64)
267
						modlist.append( ( ldap_attribute, None, new_mo_data_binary ) )
268
				break
269
		return modlist
221
	
270
	
271
	
222
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
272
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
223
273
224
	filter=univention.admin.filter.conjunction('&', [
274
	filter=univention.admin.filter.conjunction('&', [
(-)modules/univention/admin/handlers/settings/udm_syntax.py (+50 lines)
 Lines 146-151    Link Here 
146
			may_change=1,
146
			may_change=1,
147
			identifies=0
147
			identifies=0
148
		),
148
		),
149
	'messagecatalog': univention.admin.property(
150
			short_description=_('GNU message catalog for translations'),
151
			long_description='GNU message catalog (syntax: <language tag> <Base64 encoded GNU message catalog>)',
152
			syntax=univention.admin.syntax.Localesubdirname_and_GNUMessageCatalog,
153
			multivalue=1,
154
			include_in_default_search=0,
155
			options=[],
156
			required=0,
157
			may_change=1,
158
			identifies=0,
159
			),
149
	}
160
	}
150
161
151
layout = [
162
layout = [
 Lines 154-159    Link Here 
154
			["name"],
165
			["name"],
155
			["filename"],
166
			["filename"],
156
			["data"],
167
			["data"],
168
			["messagecatalog"],
157
		] ),
169
		] ),
158
		Group( _( 'Metadata' ), layout = [
170
		Group( _( 'Metadata' ), layout = [
159
			["package"],
171
			["package"],
 Lines 180-185    Link Here 
180
mapping.register('packageversion', 'univentionOwnedByPackageVersion', None, univention.admin.mapping.ListToString)
192
mapping.register('packageversion', 'univentionOwnedByPackageVersion', None, univention.admin.mapping.ListToString)
181
mapping.register('ucsversionstart', 'univentionUCSVersionStart', None, univention.admin.mapping.ListToString)
193
mapping.register('ucsversionstart', 'univentionUCSVersionStart', None, univention.admin.mapping.ListToString)
182
mapping.register('ucsversionend', 'univentionUCSVersionEnd', None, univention.admin.mapping.ListToString)
194
mapping.register('ucsversionend', 'univentionUCSVersionEnd', None, univention.admin.mapping.ListToString)
195
## messagecatalog is handled via object._post_map and object._post_unmap defined below
183
196
184
class object(univention.admin.handlers.simpleLdap):
197
class object(univention.admin.handlers.simpleLdap):
185
	module=module
198
	module=module
 Lines 218-223    Link Here 
218
			if not  apt.apt_pkg.version_compare(self['packageversion'], old_version) > -1:
231
			if not  apt.apt_pkg.version_compare(self['packageversion'], old_version) > -1:
219
				raise univention.admin.uexceptions.valueInvalidSyntax, _('packageversion: Version must not be lower than the current one.')
232
				raise univention.admin.uexceptions.valueInvalidSyntax, _('packageversion: Version must not be lower than the current one.')
220
233
234
	def _post_unmap( self, info, values ):
235
		info['messagecatalog'] = []
236
		messagecatalog_ldap_attribute = "univentionMessageCatalog"
237
		messagecatalog_ldap_attribute_and_tag_prefix = "%s;entry-lang-" % (messagecatalog_ldap_attribute,)
238
		for ldap_attribute, value_list in values.items():
239
			if ldap_attribute.startswith(messagecatalog_ldap_attribute_and_tag_prefix):
240
				language_tag = ldap_attribute.split(messagecatalog_ldap_attribute_and_tag_prefix, 1)[1]
241
				mo_data_base64 = univention.admin.mapping.unmapBase64(value_list)
242
				info['messagecatalog'].append( (language_tag, mo_data_base64) )
243
		return info
244
245
	def _post_map( self, modlist, diff ):
246
		messagecatalog_ldap_attribute = "univentionMessageCatalog"
247
		messagecatalog_ldap_attribute_and_tag_prefix = "%s;entry-lang-" % (messagecatalog_ldap_attribute,)
248
		for property_name, old_value, new_value in diff:
249
			if property_name == 'messagecatalog':
250
				old_dict = dict( old_value )
251
				new_dict = dict( new_value )
252
				for language_tag, old_mo_data_base64 in old_dict.items():
253
					ldap_attribute = ''.join((messagecatalog_ldap_attribute_and_tag_prefix, language_tag))
254
					new_mo_data_base64 = new_dict.get(language_tag)
255
					if not new_mo_data_base64: # property value has been removed
256
						old_mo_data_binary = univention.admin.mapping.mapBase64(old_mo_data_base64)
257
						modlist.append( ( ldap_attribute, old_mo_data_binary, None ) )
258
					else:
259
						if new_mo_data_base64 != old_mo_data_base64:
260
							old_mo_data_binary = univention.admin.mapping.mapBase64(old_mo_data_base64)
261
							new_mo_data_binary = univention.admin.mapping.mapBase64(new_mo_data_base64)
262
							modlist.append( ( ldap_attribute, old_mo_data_binary, new_mo_data_binary ) )
263
				for language_tag, new_mo_data_base64 in new_dict.items():
264
					ldap_attribute = ''.join((messagecatalog_ldap_attribute_and_tag_prefix, language_tag))
265
					if not old_dict.get(language_tag): # property value has been added
266
						new_mo_data_binary = univention.admin.mapping.mapBase64(new_mo_data_base64)
267
						modlist.append( ( ldap_attribute, None, new_mo_data_binary ) )
268
				break
269
		return modlist
270
221
	
271
	
222
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
272
def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', unique=0, required=0, timeout=-1, sizelimit=0):
223
273

Return to bug 35839