diff --git a/patches.d/scribe-backend.patch b/patches.d/scribe-backend.patch index 4d5b93a..8bbb2d0 100644 --- a/patches.d/scribe-backend.patch +++ b/patches.d/scribe-backend.patch @@ -1,8 +1,15 @@ -diff --git usr/bin/importation_scribe usr/bin/importation_scribe -index 0db4982..bb6ff94 100755 ---- usr/bin/importation_scribe -+++ usr/bin/importation_scribe -@@ -49,7 +49,7 @@ from os.path import isfile, dirname +diff --git usr/lib/python3/dist-packages/bin/importation_scribe usr/lib/python3/dist-packages/bin/importation_scribe +index 0db4982..77a89aa 100755 +--- usr/lib/python3/dist-packages/bin/importation_scribe ++++ usr/lib/python3/dist-packages/bin/importation_scribe +@@ -42,21 +42,21 @@ choix de la source de données et imports + - personnels administratifs + - comptes invités + + """ + import sys + from os import environ, getcwd, chdir + from os.path import isfile, dirname from pyeole.process import system_out, system_code from scribe.storage import init_store from scribe.eoleldap import Ldap @@ -11,17 +18,35 @@ index 0db4982..bb6ff94 100755 from scribe.eoletools import nscd_start, nscd_stop from scribe.parsing import sconet, aaf, be1d, scribecsv2 from scribe.importation import preferences, writer, config -@@ -465,6 +465,9 @@ class Console: + from scribe.importation import log + + #______________________________________________________________________________ + # utilitaires de manipulation de la console + + class OutOfRange(Exception): + """ Exception OutOfRange """ +@@ -458,33 +458,41 @@ class Console: + """ + log.add_lock() + log.debuglog("Arrêt de LSC...", title=True) + nscd_stop() + connexion = Ldap() + connexion.connect() + if SUPPORT_ETAB: prefs = preferences.get_enseignants_prefs() etab = prefs.get_default('etab') etab_prefix = prefs.get_default('etab_prefix') + branche_etab = BRANCHE_ETAB % {'etab': etab} + purge_option = 'keep' -+ old_logins = connexion._search(PROF_FILTER, 'uid', suffix=branche_etab) ++ old_logins = connexion._search('(&{})'.format(PROF_FILTER), 'uid', suffix=branche_etab) else: etab = None etab_prefix = '' -@@ -476,8 +479,13 @@ class Console: + if self.import_type != 'maj': + writer.purge_equipes(connexion=connexion, etab=etab) + writer.verify_classe(store=self.store, connexion=connexion, + etab_prefix=etab_prefix) + writer.write_matiere(store=self.store, connexion=connexion, etab=etab, etab_prefix=etab_prefix) writer.verify_option(store=self.store, connexion=connexion, etab_prefix=etab_prefix) @@ -36,11 +61,25 @@ index 0db4982..bb6ff94 100755 if self.data_type in ['sconet', 'aaf']: writer.write_service(store=self.store, connexion=connexion, etab=etab, etab_prefix=etab_prefix) + writer.write_administratif(store=self.store, connexion=connexion, + etab=etab) + writer.write_samba(connexion) + connexion.close() + log.debuglog("Démarrage de LSC...", title=True) + nscd_start() + log.del_lock() diff --git usr/lib/python3/dist-packages/scribe/importation/writer.py usr/lib/python3/dist-packages/scribe/importation/writer.py index 34ce0fb..40865d5 100644 --- usr/lib/python3/dist-packages/scribe/importation/writer.py +++ usr/lib/python3/dist-packages/scribe/importation/writer.py -@@ -841,9 +841,6 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): +@@ -834,23 +834,20 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): + enseignant : store.Enseignant() + user : eoleuser.Enseignant() + login : uid de l'utilisateur dans ldap + administratif : personnel administratif avec un compte enseignant + """ + log.log.debug("maj de %s" % login) + classe = [] groups = [] # attention : des administratifs peuvent avoir un compte enseignant if isinstance(enseignant, Enseignant): @@ -50,7 +89,21 @@ index 34ce0fb..40865d5 100644 for joint in enseignant.get_classes(): groups.append('profs-%s' % str(joint.classe.nom)) if joint.profprincipal: -@@ -881,6 +878,7 @@ def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAUL + classe.append(str(joint.classe.nom)) + for matiere in enseignant.get_matieres(): + groups.append(str(matiere.nom)) + for option in enseignant.get_groupes(): + groups.append('profs-%s' % str(option.nom)) + disciplines = eval(enseignant.disciplines) + else: +@@ -874,64 +871,70 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): + else: + info = "%s;%s;%s;%s" % (str(enseignant.nom), str(enseignant.prenom), + login, ATTRIB) + log.write_info(info, config.ENS_INFO) + + def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAULT_USER): + """ insertion des enseignants """ num = 0 @@ -58,7 +111,19 @@ index 34ce0fb..40865d5 100644 log.infolog("Intégration des enseignants...", title=True) log.write_header(config.ENS_HEADER, config.ENS_INFO) user = LdapEnseignant() -@@ -900,10 +898,10 @@ def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAUL + user.ldap_admin = connexion + prefs = preferences.get_enseignants_prefs() + quota = prefs.get_default('quota') + if FORCED_PASSWORD_MODIFICATION_ALLOWED: + change_pwd = prefs.get_default('change_pwd') == 'oui' + else: + change_pwd = False + new_passwords = [] + for enseignant in store.query(Enseignant): + if enseignant.force_login: + # login forcé + if user._is_enseignant(str(enseignant.force_login)): + login = str(enseignant.force_login) else: login = '' else: @@ -71,7 +136,12 @@ index 34ce0fb..40865d5 100644 else: # nouvel enseignant if str(enseignant.nom) == '' or str(enseignant.prenom) == '': -@@ -916,6 +914,7 @@ def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAUL + log.infolog("Enseignant n°%s invalide" % str(enseignant.int_id)) + continue + try: + login = _new_enseignant(enseignant, user, prefs, etab=etab, new_passwords=new_passwords) + except BadLogin as message: + log.infolog(str(message)) continue # enregistrement du login attribué enseignant.login = str(login) @@ -79,7 +149,7 @@ index 34ce0fb..40865d5 100644 num += 1 if num % config.DEBUG_NUM == 0: log.debuglog("%d enseignants traités..." % num) -@@ -923,8 +922,12 @@ def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAUL + if EOLE_AD: _sync_passwords(user, new_passwords, change_pwd=change_pwd) _create_dirs(user, quota, new_passwords) log.infolog("TOTAL : %d enseignants" % num) @@ -92,7 +162,21 @@ index 34ce0fb..40865d5 100644 # -------------------- administratifs -------------------- # -@@ -1027,7 +1030,7 @@ def write_administratif(store, connexion, etab=None, current_ead_user=config.DEF + + def _new_administratif(administratif, user, prefs, etab=None, new_passwords=[]): + """ + traitement d'un nouvel administratif (création) + administratif : store.Administratif() + user : eoleuser.Administratif() + """ +@@ -1020,21 +1023,21 @@ def write_administratif(store, connexion, etab=None, current_ead_user=config.DEF + if user._is_administratif(str(administratif.force_login)): + login = str(administratif.force_login) + else: + login = '' + else: + login = _administratif_exists(administratif, user) + if login != '': # personnel existe _maj_administratif(administratif, user, login) else: @@ -101,11 +185,25 @@ index 34ce0fb..40865d5 100644 if login != '': # le personnel a été crée comme un professeur... log.infolog("(%s a un compte enseignant)" % login) + ldap_ens = LdapEnseignant() + ldap_ens.ldap_admin = connexion + _maj_enseignant(administratif, ldap_ens, login, etab, administratif=True) + else: + # nouveau personnel + if str(administratif.nom) == '' or str(administratif.prenom) == '': + log.infolog("Administratif n°%s invalide" % str(administratif.int_id)) diff --git usr/lib/python3/dist-packages/scribe/linker.py usr/lib/python3/dist-packages/scribe/linker.py index 4cc6082..94099e9 100644 --- usr/lib/python3/dist-packages/scribe/linker.py +++ usr/lib/python3/dist-packages/scribe/linker.py -@@ -10,7 +10,7 @@ +@@ -3,21 +3,21 @@ + # Eole NG - 2009 + # Copyright Pole de Competence Eole (Ministere Education - Academie Dijon) + # Licence CeCill cf /root/LicenceEole.txt + # eole@ac-dijon.fr + ########################################################################### + """ + recherche les liens entre les utilisateurs importes et l'annuaire ldap """ from scribe.ldapconf import ELEVE_FILTER, PROF_FILTER, ADMINISTRATIF_FILTER, \ @@ -114,7 +212,21 @@ index 4cc6082..94099e9 100644 from scribe.eoletools import deformate_date, strip_adresse from scribe.eoleldap import Ldap -@@ -103,7 +103,7 @@ def _responsable_exists(responsable, user): + def _eleve_exists(eleve, user): + """ + recherche si un élève existe déjà dans l'annuaire + eleve : storage.Eleve() + user : eoleuser.Eleve() + """ + filtres = [] +@@ -96,21 +96,21 @@ def _responsable_exists(responsable, user): + if responsable.mail and res.get('mailPerso', [''])[0] == str(responsable.mail): + # mail + nom + prenom (#6061) mais mail + nom => mauvaise idée (#4191) + return res['uid'][0] + if responsable.adresse.adresse and \ + strip_adresse(res.get('ENTPersonAdresse', [''])[0]) == \ + strip_adresse(str(responsable.adresse.adresse)): + # adresse + nom + prenom (#6934) return res['uid'][0] return '' @@ -123,7 +235,21 @@ index 4cc6082..94099e9 100644 """ recherche si un enseignant existe déjà dans l'annuaire enseignant : storage.Enseignant() -@@ -133,8 +133,12 @@ def _enseignant_exists(enseignant, user): + user : eoleuser.Enseignant() + """ + filtres = [] + if enseignant.date and enseignant.date != '01/01/0001': + date = deformate_date(str(enseignant.date)) + if enseignant.int_id: + # date + id interne +@@ -126,22 +126,26 @@ def _enseignant_exists(enseignant, user): + # mail (federation) + nom + filtres.append("(&%s(FederationKey=%s)(sn=%s))" % (PROF_FILTER, + str(enseignant.mail), str(enseignant.nom) )) + if enseignant.int_id: + # nom + id interne + filtres.append("(&%s(sn=%s)(intid=%s))" % (PROF_FILTER, + str(enseignant.nom), str(enseignant.int_id) )) # beurk (homonymes) -> à améliorer #filtres.append("(&%s(cn=%s %s)(objectClass=enseignant))" % (USER_FILTER, # str(enseignant.prenom), str(enseignant.nom))) @@ -137,3 +263,10 @@ index 4cc6082..94099e9 100644 if res != {}: return res['uid'][0] return '' + + def _administratif_exists(administratif, user): + """ + recherche si un administratif existe déjà dans l'annuaire + administratif : storage.Administratif() + user : eoleuser.Administratif() + """