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

Collapse All | Expand All

(-)ucs-school-import/modules/ucsschool/importer/models/import_user.py (+34 lines)
 Lines 80-85    Link Here 
80
	reader = None
80
	reader = None
81
	logger = None
81
	logger = None
82
	_pyhook_cache = None
82
	_pyhook_cache = None
83
	prop_regex = re.compile(r"<.*?>")
84
	prop_providers = dict([(x, "make_{}".format(x)) for x in
85
		["birthday", "firstname", "lastname", "email", "recordUID", "school", "sourceUID", "username"]])
83
86
84
	def __init__(self, name=None, school=None, **kwargs):
87
	def __init__(self, name=None, school=None, **kwargs):
85
		self.action = None            # "A", "D" or "M"
88
		self.action = None            # "A", "D" or "M"
 Lines 96-101    Link Here 
96
			self.logger = get_logger()
99
			self.logger = get_logger()
97
			self.username_max_length = 20 - len(self.ucr.get("ucsschool/ldap/default/userprefix/exam", "exam-"))
100
			self.username_max_length = 20 - len(self.ucr.get("ucsschool/ldap/default/userprefix/exam", "exam-"))
98
		self._lo = None
101
		self._lo = None
102
		self._used_methods = defaultdict(list)  # recursion prevention
99
		super(ImportUser, self).__init__(name, school, **kwargs)
103
		super(ImportUser, self).__init__(name, school, **kwargs)
100
104
101
	def build_hook_line(self, hook_time, func_name):
105
	def build_hook_line(self, hook_time, func_name):
 Lines 641-646    Link Here 
641
		# force transcription of german umlauts
645
		# force transcription of german umlauts
642
		return "<:umlauts>{}".format(scheme)
646
		return "<:umlauts>{}".format(scheme)
643
647
648
	def solve_format_dependencies(self, prop_name, scheme):
649
		props = self.prop_regex.findall(scheme)
650
		for prop in props:
651
			if (hasattr(self, prop) and getattr(self, prop) or
652
				prop in self.udm_properties and self.udm_properties[prop] or
653
				prop == "username" and (self.name or self.udm_properties.get("username"))):
654
				# property exists and has value
655
				continue
656
			if prop == "name":
657
				prop = "username"
658
			if prop not in self.prop_providers and prop not in self.udm_properties:
659
				# nothing we can do
660
				continue
661
662
			try:
663
				meth_name = self.prop_providers[prop]
664
			except KeyError:
665
				meth_name = "prepare_udm_properties"
666
			if meth_name in self._used_methods[prop_name]:
667
				# already ran make_<meth_name>() for his formatting job
668
				self.logger.warn("Recursion detected when resolving formatting dependecies for %r.", prop_name)
669
				self.logger.debug("Tried running %s(), although it has already run for %r.", meth_name, prop_name)
670
				continue
671
			self._used_methods[prop_name].append(meth_name)
672
673
			self.logger.debug("Need property %r to format %r - running %r...", prop, prop_name, meth_name)
674
			getattr(self, meth_name)()
675
		del self._used_methods[prop_name]
676
644
	def format_from_scheme(self, prop_name, scheme, **kwargs):
677
	def format_from_scheme(self, prop_name, scheme, **kwargs):
645
		"""
678
		"""
646
		Format property with scheme for current import_user.
679
		Format property with scheme for current import_user.
 Lines 658-663    Link Here 
658
		:param kwargs: dict: additional data to use for formatting
691
		:param kwargs: dict: additional data to use for formatting
659
		:return: str: formatted string
692
		:return: str: formatted string
660
		"""
693
		"""
694
		self.solve_format_dependencies(prop_name, scheme)
661
		if self.input_data:
695
		if self.input_data:
662
			all_fields = self.reader.get_data_mapping(self.input_data)
696
			all_fields = self.reader.get_data_mapping(self.input_data)
663
		else:
697
		else:

Return to bug 42137