Files
CD73/patches.d/scribe-backend.patch
2025-08-18 12:05:24 +02:00

273 lines
12 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..96023c1 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,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([login[0] for login in old_logins if login[1]['uid'] not in 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 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()
"""