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

Collapse All | Expand All

(-)doc/manual/ucsschool-import-handbuch-4.1r2.xml (-2 / +2 lines)
 Lines 1400-1407    Link Here 
1400
from usernames_with_zeros import MyUsernameHandler
1400
from usernames_with_zeros import MyUsernameHandler
1401
1401
1402
class MyUserImportFactory(DefaultUserImportFactory):
1402
class MyUserImportFactory(DefaultUserImportFactory):
1403
    def make_username_handler(self, username_max_length):
1403
    def make_username_handler(self, username_max_length, dry_run=True):
1404
        return MyUsernameHandler(username_max_length)
1404
        return MyUsernameHandler(username_max_length, dry_run)
1405
					</programlisting>
1405
					</programlisting>
1406
				</para>
1406
				</para>
1407
				<para>
1407
				<para>
(-)ucs-school-import/debian/changelog (+7 lines)
 Lines 1-3    Link Here 
1
ucs-school-import (14.0.16-44) unstable; urgency=low
2
3
  * Bug #42465: UsernameHandler does not increase counter in LDAP with dry_run
4
    anymore
5
6
 -- Daniel Troeder <troeder@univention.de>  Thu, 22 Jun 2017 09:33:14 +0200
7
1
ucs-school-import (14.0.16-43) unstable; urgency=low
8
ucs-school-import (14.0.16-43) unstable; urgency=low
2
9
3
  * Bug #44408: move PyHook code to ucsschool.lib
10
  * Bug #44408: move PyHook code to ucsschool.lib
(-)ucs-school-import/modules/ucsschool/importer/default_user_import_factory.py (-2 / +3 lines)
 Lines 214-228    Link Here 
214
		"""
214
		"""
215
		return ucr
215
		return ucr
216
216
217
	def make_username_handler(self, username_max_length):
217
	def make_username_handler(self, username_max_length, dry_run=True):
218
		"""
218
		"""
219
		Get a UsernameHandler instance.
219
		Get a UsernameHandler instance.
220
220
221
		:param username_max_length: int: created usernames must not be longer
221
		:param username_max_length: int: created usernames must not be longer
222
		than this
222
		than this
223
		:param dry_run: bool: set to False to actually commit changes to LDAP
223
		:return: UsernameHandler object
224
		:return: UsernameHandler object
224
		"""
225
		"""
225
		return UsernameHandler(username_max_length)
226
		return UsernameHandler(username_max_length, dry_run)
226
227
227
	def make_user_writer(self, *arg, **kwargs):
228
	def make_user_writer(self, *arg, **kwargs):
228
		"""
229
		"""
(-)ucs-school-import/modules/ucsschool/importer/models/import_user.py (-1 / +1 lines)
 Lines 528-534    Link Here 
528
			raise FormatError("No username was created from scheme '{}'.".format(
528
			raise FormatError("No username was created from scheme '{}'.".format(
529
				self.username_scheme), self.username_scheme, self.to_dict())
529
				self.username_scheme), self.username_scheme, self.to_dict())
530
		if not self.username_handler:
530
		if not self.username_handler:
531
			self.__class__.username_handler = self.factory.make_username_handler(self.username_max_length)
531
			self.__class__.username_handler = self.factory.make_username_handler(self.username_max_length, self.config['dry_run'])
532
		self.name = self.username_handler.format_username(self.name)
532
		self.name = self.username_handler.format_username(self.name)
533
533
534
	def modify(self, lo, validate=True, move_if_necessary=None):
534
	def modify(self, lo, validate=True, move_if_necessary=None):
(-)ucs-school-import/modules/ucsschool/importer/utils/ldap_connection.py (+9 lines)
 Lines 37-42    Link Here 
37
37
38
_admin_connection = None
38
_admin_connection = None
39
_admin_position = None
39
_admin_position = None
40
_machine_connection = None
41
_machine_position = None
40
42
41
43
42
def get_admin_connection():
44
def get_admin_connection():
 Lines 47-49    Link Here 
47
		except IOError:
49
		except IOError:
48
			raise UcsSchoolImportFatalError("This script must be executed on a DC Master.")
50
			raise UcsSchoolImportFatalError("This script must be executed on a DC Master.")
49
	return _admin_connection, _admin_position
51
	return _admin_connection, _admin_position
52
53
54
def get_machine_connection():
55
	global _machine_connection, _machine_position
56
	if not _machine_connection or not _machine_position:
57
		_machine_connection, _machine_position = uldap.getMachineConnection()
58
	return _machine_connection, _machine_position
(-)ucs-school-import/modules/ucsschool/importer/utils/username_handler.py (-18 / +46 lines)
 Lines 36-42    Link Here 
36
36
37
from ldap.dn import escape_dn_chars
37
from ldap.dn import escape_dn_chars
38
from univention.admin.uexceptions import noObject
38
from univention.admin.uexceptions import noObject
39
from ucsschool.importer.utils.ldap_connection import get_admin_connection
39
from ucsschool.importer.utils.ldap_connection import get_admin_connection, get_machine_connection
40
from ucsschool.importer.exceptions import FormatError
40
from ucsschool.importer.exceptions import FormatError
41
from ucsschool.importer.utils.logging import get_logger
41
from ucsschool.importer.utils.logging import get_logger
42
42
 Lines 108-134    Link Here 
108
	"""
108
	"""
109
109
110
	allowed_chars = string.ascii_letters + string.digits + "."
110
	allowed_chars = string.ascii_letters + string.digits + "."
111
	_mem_store = dict()
111
112
112
	def __init__(self, username_max_length):
113
	def __init__(self, username_max_length, dry_run=True):
114
		"""
115
		:param username_max_length: int: created usernames will be no longer
116
		than this
117
		:param dry_run: bool: if False use LDAP to store already-used usernames
118
		if True store for one run only in memory
119
		"""
113
		self.username_max_length = username_max_length
120
		self.username_max_length = username_max_length
121
		self.dry_run = dry_run
114
		self.logger = get_logger()
122
		self.logger = get_logger()
115
		self.connection, self.position = get_admin_connection()
123
		if self.dry_run:
124
			self.connection, self.position = get_machine_connection()
125
		else:
126
			self.connection, self.position = get_admin_connection()
116
		self.replacement_variable_pattern = re.compile(r'(%s)' % '|'.join(map(re.escape, self.counter_variable_to_function.keys())), flags=re.I)
127
		self.replacement_variable_pattern = re.compile(r'(%s)' % '|'.join(map(re.escape, self.counter_variable_to_function.keys())), flags=re.I)
117
128
118
	def add_to_ldap(self, username, first_number):
129
	def add_to_ldap(self, username, first_number):
119
		assert isinstance(username, basestring)
130
		assert isinstance(username, basestring)
120
		assert isinstance(first_number, basestring)
131
		assert isinstance(first_number, basestring)
121
		self.connection.add(
132
		if self.dry_run:
122
			"cn={},cn=unique-usernames,cn=ucsschool,cn=univention,{}".format(
133
			self._mem_store[username] = first_number
123
				escape_dn_chars(username), self.connection.base),
134
		else:
124
			[
135
			self.connection.add(
125
				("objectClass", "ucsschoolUsername"),
136
				"cn={},cn=unique-usernames,cn=ucsschool,cn=univention,{}".format(
126
				("ucsschoolUsernameNextNumber", first_number)
137
					escape_dn_chars(username), self.connection.base),
127
			]
138
				[
128
		)
139
					("objectClass", "ucsschoolUsername"),
140
					("ucsschoolUsernameNextNumber", first_number)
141
				]
142
			)
129
143
130
	def get_next_number(self, username):
144
	def _get_next_number_from_ldap(self, username):
131
		assert isinstance(username, basestring)
132
		try:
145
		try:
133
			return self.connection.get(
146
			return self.connection.get(
134
				"cn={},cn=unique-usernames,cn=ucsschool,cn=univention,{}".format(
147
				"cn={},cn=unique-usernames,cn=ucsschool,cn=univention,{}".format(
 Lines 137-151    Link Here 
137
		except KeyError:
150
		except KeyError:
138
			raise noObject("Username '{}' not found.".format(username))
151
			raise noObject("Username '{}' not found.".format(username))
139
152
153
	def get_next_number(self, username):
154
		assert isinstance(username, basestring)
155
		if self.dry_run:
156
			try:
157
				res = self._mem_store[username]
158
			except KeyError:
159
				res = self._get_next_number_from_ldap(username)
160
				self._mem_store[username] = res
161
		else:
162
			res = self._get_next_number_from_ldap(username)
163
		return res
164
140
	def get_and_raise_number(self, username):
165
	def get_and_raise_number(self, username):
141
		assert isinstance(username, basestring)
166
		assert isinstance(username, basestring)
142
		cur = self.get_next_number(username)
167
		cur = self.get_next_number(username)
143
		next = int(cur) + 1
168
		next = int(cur) + 1
144
		self.connection.modify(
169
		if self.dry_run:
145
			"cn={},cn=unique-usernames,cn=ucsschool,cn=univention,{}".format(
170
			self._mem_store[username] = str(next)
146
				escape_dn_chars(username), self.connection.base),
171
		else:
147
			[("ucsschoolUsernameNextNumber", cur, str(next))]
172
			self.connection.modify(
148
		)
173
				"cn={},cn=unique-usernames,cn=ucsschool,cn=univention,{}".format(
174
					escape_dn_chars(username), self.connection.base),
175
				[("ucsschoolUsernameNextNumber", cur, str(next))]
176
			)
149
		return cur
177
		return cur
150
178
151
	def remove_bad_chars(self, name):
179
	def remove_bad_chars(self, name):

Return to bug 42465