Index: ucs-school-import/modules/ucsschool/importer/models/import_user.py =================================================================== --- ucs-school-import/modules/ucsschool/importer/models/import_user.py (Revision 71928) +++ ucs-school-import/modules/ucsschool/importer/models/import_user.py (Arbeitskopie) @@ -80,6 +80,9 @@ reader = None logger = None _pyhook_cache = None + prop_regex = re.compile(r"<.*?>") + prop_providers = dict([(x, "make_{}".format(x)) for x in + ["birthday", "firstname", "lastname", "email", "recordUID", "school", "sourceUID", "username"]]) def __init__(self, name=None, school=None, **kwargs): self.action = None # "A", "D" or "M" @@ -96,6 +99,7 @@ self.logger = get_logger() self.username_max_length = 20 - len(self.ucr.get("ucsschool/ldap/default/userprefix/exam", "exam-")) self._lo = None + self._used_methods = defaultdict(list) # recursion prevention super(ImportUser, self).__init__(name, school, **kwargs) def build_hook_line(self, hook_time, func_name): @@ -641,6 +645,35 @@ # force transcription of german umlauts return "<:umlauts>{}".format(scheme) + def solve_format_dependencies(self, prop_name, scheme): + props = self.prop_regex.findall(scheme) + for prop in props: + if (hasattr(self, prop) and getattr(self, prop) or + prop in self.udm_properties and self.udm_properties[prop] or + prop == "username" and (self.name or self.udm_properties.get("username"))): + # property exists and has value + continue + if prop == "name": + prop = "username" + if prop not in self.prop_providers and prop not in self.udm_properties: + # nothing we can do + continue + + try: + meth_name = self.prop_providers[prop] + except KeyError: + meth_name = "prepare_udm_properties" + if meth_name in self._used_methods[prop_name]: + # already ran make_() for his formatting job + self.logger.warn("Recursion detected when resolving formatting dependecies for %r.", prop_name) + self.logger.debug("Tried running %s(), although it has already run for %r.", meth_name, prop_name) + continue + self._used_methods[prop_name].append(meth_name) + + self.logger.debug("Need property %r to format %r - running %r...", prop, prop_name, meth_name) + getattr(self, meth_name)() + del self._used_methods[prop_name] + def format_from_scheme(self, prop_name, scheme, **kwargs): """ Format property with scheme for current import_user. @@ -658,6 +691,7 @@ :param kwargs: dict: additional data to use for formatting :return: str: formatted string """ + self.solve_format_dependencies(prop_name, scheme) if self.input_data: all_fields = self.reader.get_data_mapping(self.input_data) else: