Files
CD73/patches.d/scribe-backend.patch

327 lines
14 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

diff --git usr/bin/importation_scribe usr/bin/importation_scribe
index 0db4982..290d66e 100755
--- usr/bin/importation_scribe
+++ usr/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,44 @@ 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:
+ old_dns = [login[0] for login in old_logins if login[1]['uid'] not in logins]
+ for old_dn in old_dns:
+ connexion._delete(old_dn)
+ if prefs.get_default('backup') == 'oui':
+ target = f'/home/backup/{etab}/'
+ print(f'copie dans {target}')
+
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/preferences.py usr/lib/python3/dist-packages/scribe/importation/preferences.py
index fdcb142..fe11e3b 100644
--- usr/lib/python3/dist-packages/scribe/importation/preferences.py
+++ usr/lib/python3/dist-packages/scribe/importation/preferences.py
@@ -141,20 +141,24 @@ PREF_MAIL = ['mail', 'liste',
('perso_internet', 'adresse fournie ou domaine Internet'),
('perso_aucune', 'adresse fournie ou aucune'),
('restreint', 'adresse locale, domaine restreint'),
('internet', 'adresse locale, domaine Internet'),
('aucune', 'aucune adresse'),
)]
PREF_PREFIX_ETAB = ['etab_prefix', 'texte',
"Préfixe des groupes de l'établissement", ""]
+PREF_PURGE = ['backup', 'liste',
+ "Sauvegarde des données des utilisateurs supprimés",
+ (('oui', 'oui'), ('non', 'non'))]
+
if dico.get('activer_nfs', 'non') == 'oui' or 'interface_client_ltsp' in dico:
DEFAULT_CHANGE_PWD = 'non'
DEFAULT_SHELL = 'oui'
else:
DEFAULT_CHANGE_PWD = 'oui'
DEFAULT_SHELL = 'non'
def get_etab():
"""
charge les établissements à chaque fois qu'on le demande
@@ -211,20 +215,21 @@ def get_responsables_prefs():
return Preferences(prefs_resp, PREF_FILES['responsable'])
def get_enseignants_prefs():
""" préférences pour les enseignants """
prefs_ens = [ Preference(default='0', *PREF_QUOTA),
Preference(*PREF_LOGIN),
Preference(default=DEFAULT_SHELL, *PREF_SHELL),
Preference(default='1', *PREF_PROFIL),
Preference(default='perso_aucune', *PREF_MAIL),
+ Preference(default='oui', *PREF_PURGE),
]
if FORCED_PASSWORD_MODIFICATION_ALLOWED:
prefs_ens.insert(2, Preference(default=DEFAULT_CHANGE_PWD, *PREF_CHANGE_PWD))
if SUPPORT_ETAB:
prefs_ens.insert(0, Preference(*get_etab()))
prefs_ens.insert(1, Preference(*PREF_PREFIX_ETAB))
prefs_ens.append(Preference(*get_etabprefix()))
return Preferences(prefs_ens, PREF_FILES['enseignant'])
def get_administratifs_prefs():
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 limport et vérifier quils 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()
"""