|
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" |
|
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): |
|
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. |
|
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: |