#!/usr/bin/env python3 import xml.etree.ElementTree as ET from pathlib import Path from scribe.eoleldap import get_etabs from scribe.enseignants import Enseignant from scribe.eoleldap import Ldap current_etabs = get_etabs()[1] root = Path('/home/adhomes/admin/perso/comptes') repartition = {} etabs = [] individus = {} for xml in root.glob('**/sts_emp*.xml'): tree = ET.parse(xml) tree_root = tree.getroot() etab = tree_root.find('./PARAMETRES/UAJ').get('CODE') etabs.append(etab) for individu in tree_root.iter('INDIVIDU'): id_ind = individu.get('ID') nom_ind = individu.find('NOM_USAGE') try: nom_ind = nom_ind.text except: pass prenom_ind = individu.find('PRENOM') try: prenom_ind = prenom_ind.text except: pass fonction_ind = individu.find('FONCTION') try: fonction_ind = fonction_ind.text except: pass key = id_ind repartition.setdefault(key, []) repartition[key].append(etab) individus.setdefault(key, []) individus[key].append({'nom': nom_ind, 'prenom': prenom_ind, 'fonction': fonction_ind}) etabs = list(set(etabs)) def guess_uid(individu): nom = individu[0]['nom'] prenom = individu[0]['prenom'] return f"{prenom.lower()}.{nom.lower()}" if __name__ == '__main__': from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument('-t', '--type') parser.add_argument('-e', '--extended', action='store_true') args = parser.parse_args() if args.type == 'individus': if args.extended: result = ["{}\t{}".format(individus[ind][0]['nom'], " ".join(sorted(set(e)))) for ind, e in repartition.items() if len(set(e)) > 1] else: result = [individus[ind][0]['nom'] for ind, e in repartition.items() if len(set(e)) > 1] elif args.type == 'presents': if args.extended: result = ["{} {}\t\t{}".format(individus[ind][0]['nom'], individus[ind][0]['prenom'], " ".join(set(e))) for ind, e in repartition.items() if len(set(e).intersection(set(current_etabs))) > 1] else: result = [individus[ind][0]['nom'] for ind, e in repartition.items() if len(set(e).intersection(set(current_etabs))) > 1] elif args.type == 'current_etabs': result = current_etabs elif args.type == 'etabs': result = etabs elif args.type == 'candidates': connexion = Ldap() connexion.connect() user = Enseignant() user.ldap_admin = connexion members = [] for etab in etabs: etab_group = connexion._search('(&(objectclass=eolegroupe)(type=etablissement)(cn={etab}))'.format(etab=etab), ['memberUid']) if etab_group: enseignants = [enseignant for enseignant in etab_group[0][1].get('memberUid', []) if user._is_enseignant(enseignant)] members.extend(enseignants) members = sorted(list(set(members))) result = [] for member, ind in [(member, user.get_attr(member, 'intid')) for member in members]: user_etabs = set(repartition.get(ind[0], []) + user.get_etab(member, multi_etabs=True)) if len(user_etabs) > 1: partial_result = (member, ind[0], *sorted(user_etabs)) result.append(partial_result) result.sort(key=lambda x: x[2:]) result = [f"{el[0]}\t\t{el[1]}\t{' '.join(el[2:])}" for el in result] else: result = [] print("\n".join(sorted(result)))