273 lines
12 KiB
Diff
273 lines
12 KiB
Diff
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
|
||
-from scribe.ldapconf import SUPPORT_ETAB
|
||
+from scribe.ldapconf import SUPPORT_ETAB, BRANCHE_ETAB, PROF_FILTER
|
||
from scribe.eoletools import nscd_start, nscd_stop
|
||
from scribe.parsing import sconet, aaf, be1d, scribecsv2
|
||
from scribe.importation import preferences, writer, config
|
||
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('(&{})'.format(PROF_FILTER), 'uid', suffix=branche_etab)
|
||
else:
|
||
etab = None
|
||
etab_prefix = ''
|
||
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)
|
||
- writer.write_enseignant(store=self.store, connexion=connexion,
|
||
+ logins = writer.write_enseignant(store=self.store, connexion=connexion,
|
||
etab=etab)
|
||
+ if SUPPORT_ETAB:
|
||
+ print(logins)
|
||
+ print(old_logins)
|
||
+ print(set(old_logins).difference(set(logins)))
|
||
+
|
||
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
|
||
@@ -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):
|
||
- old_etab = user.get_etab(login)
|
||
- if old_etab != etab:
|
||
- user._change_etab(login, old_etab, etab)
|
||
for joint in enseignant.get_classes():
|
||
groups.append('profs-%s' % str(joint.classe.nom))
|
||
if joint.profprincipal:
|
||
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
|
||
+ logins = []
|
||
log.infolog("Intégration des enseignants...", title=True)
|
||
log.write_header(config.ENS_HEADER, config.ENS_INFO)
|
||
user = LdapEnseignant()
|
||
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:
|
||
- login = _enseignant_exists(enseignant, user)
|
||
+ login = _enseignant_exists(enseignant, user, etab=etab)
|
||
if login != '':
|
||
# enseignant existant
|
||
- _maj_enseignant(enseignant, user, login, etab)
|
||
+ _maj_enseignant(enseignant, user, login, etab=etab)
|
||
else:
|
||
# nouvel enseignant
|
||
if str(enseignant.nom) == '' or str(enseignant.prenom) == '':
|
||
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)
|
||
+ logins.append(enseignant.login)
|
||
num += 1
|
||
if num % config.DEBUG_NUM == 0:
|
||
log.debuglog("%d enseignants traités..." % num)
|
||
if EOLE_AD:
|
||
_sync_passwords(user, new_passwords, change_pwd=change_pwd)
|
||
_create_dirs(user, quota, new_passwords)
|
||
log.infolog("TOTAL : %d enseignants" % num)
|
||
+ # write unmodified users list
|
||
+ # filtrer les enseignants avec LastUpdate plus vieux que le début de l’import et vérifier qu’ils ne sont pas dans store.query(Enseignant) ?
|
||
+ #user.ldap_admin._search(PROF_FILTER, attrlist=['uid'], suffix=branche_etab % {'etab': etab})
|
||
if num != 0:
|
||
log.copy_info(config.ENS_INFO, user=current_ead_user)
|
||
+ return logins
|
||
|
||
|
||
# -------------------- administratifs -------------------- #
|
||
|
||
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:
|
||
- login = _enseignant_exists(administratif, user)
|
||
+ login = _enseignant_exists(administratif, user, etab)
|
||
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
|
||
@@ -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, \
|
||
-RESPONSABLE_FILTER, USER_FILTER, AUTRE_FILTER, LDAP_MODE
|
||
+RESPONSABLE_FILTER, USER_FILTER, AUTRE_FILTER, LDAP_MODE, BRANCHE_ETAB
|
||
from scribe.eoletools import deformate_date, strip_adresse
|
||
from scribe.eoleldap import Ldap
|
||
|
||
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 ''
|
||
|
||
-def _enseignant_exists(enseignant, user):
|
||
+def _enseignant_exists(enseignant, user, etab=None):
|
||
"""
|
||
recherche si un enseignant existe déjà dans l'annuaire
|
||
enseignant : storage.Enseignant()
|
||
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)))
|
||
+ if etab:
|
||
+ branche_etab = BRANCHE_ETAB % {'etab': etab}
|
||
+ else:
|
||
+ branche_etab = None
|
||
for filtre in filtres:
|
||
- res = user.ldap_admin._search_one(filtre, 'uid')
|
||
+ res = user.ldap_admin._search_one(filtre, 'uid', suffix=branche_etab)
|
||
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()
|
||
"""
|