Verbosity controls

This commit is contained in:
Ludovic Stephan 2020-11-21 17:45:55 +01:00
parent 7289e4f1dc
commit 3ad1de64f7
3 changed files with 62 additions and 16 deletions

View file

@ -77,7 +77,7 @@ class ClipperLDAP(LDAP):
return promo, self.verbose_depts.get(dept, None)
def get_clipper_list(self, promo_filter=None):
def get_clipper_list(self, promo_filter=None, verbosity=1, stdout=None):
"""Extrait la liste des comptes clipper présents dans le LDAP.
Renvoie une liste de `namedTuple` contenant leur nom, prénom, adresse mail et
département/année d'entrée.
@ -101,7 +101,11 @@ class ClipperLDAP(LDAP):
clipper_list.append(
ClipperAccount(uid, name, email, promo, dept)
)
if verbosity == 3:
stdout.write("Compte clipper trouvé : {}".format(uid))
except ValueError:
if verbosity >= 2:
stdout.write("Entrée malformée trouvée : {}".format(entry))
pass
return clipper_list
@ -114,7 +118,7 @@ class AnnuaireLDAP(LDAP):
search_base = "ou=people,dc=ens,dc=fr"
attr_list = ["uid", "sn", "givenName", "ou"]
def try_match(self, profile):
def try_match(self, profile, verbosity=1, stderr=None):
"""Essaie de trouver une entrée correspondant au profile donné dans
l'annuaire de l'ENS. L'heuristique est la suivante : il est très probable
que le prénom de la personne commence par le premier mot de `profile.full_name`,
@ -129,11 +133,12 @@ class AnnuaireLDAP(LDAP):
if len(search_name) > 0:
if len(search_name) > 2:
print(
"Erreur : deux résultats trouvés pour {}".format(
profile.user.username
if verbosity >= 2:
stderr.write(
"Erreur : deux logins CRI trouvés pour {} ({})".format(
profile.user.username, profile.promotion
)
)
)
return None
return self.extract_ldap_info(search_name[0], "uid")

View file

@ -36,9 +36,13 @@ class Command(BaseCommand):
else:
promo = self.get_current_promo()
verbosity = options["verbosity"]
# On récupère la liste des élèves à créer
ldap = ClipperLDAP()
clipper_list = ldap.get_clipper_list(promo_filter=promo)
clipper_list = ldap.get_clipper_list(
promo_filter=promo, verbosity=verbosity, stdout=self.stdout
)
# On vire les élèves déjà existants
existing_users = set(User.objects.values_list("username", flat=True))
@ -67,6 +71,18 @@ class Command(BaseCommand):
)
)
# À décommenter pour utilisation locale (avec SQLite)
def _manual_ids(cls, to_create):
pid = getattr(cls.objects.order_by("-id").first(), "id", 1)
for p in to_create:
pid += 1
p.id = pid
_manual_ids(User, users_to_create)
_manual_ids(Profile, profiles_to_create)
_manual_ids(Profile.department.through, dept_m2m_to_create)
User.objects.bulk_create(users_to_create)
for profile in profiles_to_create:
profile.user_id = profile.user.id
@ -75,8 +91,10 @@ class Command(BaseCommand):
dept_m2m.profile_id = dept_m2m.profile.id
Profile.department.through.objects.bulk_create(dept_m2m_to_create)
print(
"Création de {} utilisateur·ices et de {} profils effectuée avec succès".format(
len(users_to_create), len(profiles_to_create)
if verbosity >= 1:
self.stdout.write(
(
"Création de {} utilisateur·ices et de {}"
" profils effectuée avec succès"
).format(len(users_to_create), len(profiles_to_create))
)
)

View file

@ -40,6 +40,8 @@ class Command(BaseCommand):
else:
promo = self.get_current_promo()
verbosity = options["verbosity"]
no_images = Profile.objects.select_related("user").filter(picture="")
if promo is not None:
@ -51,7 +53,9 @@ class Command(BaseCommand):
success = 0
for profile in no_images:
cri_login = cri_ldap.try_match(profile)
cri_login = cri_ldap.try_match(
profile, verbosity=verbosity, stderr=self.stderr
)
if cri_login is not None:
img_url = "{}/photos/{}.jpg".format(base_annuaire, cri_login)
try:
@ -61,13 +65,32 @@ class Command(BaseCommand):
content=File(BytesIO(istream.read())),
)
success += 1
if verbosity == 3:
self.stdout.write(
"Photo trouvée pour {} ({})".format(
profile.user.username, profile.promotion
)
)
except HTTPError:
# Parfois, même si on trouve un login CRI, il y a une erreur 404.
# Dans ce cas, pas de photo : on échoue gracieusement.
if verbosity >= 2:
self.stdout.write(
"Login CRI trouvé mais pas de photo pour {} ({})".format(
profile.user.username, profile.promotion
)
)
pass
elif verbosity >= 2:
self.stdout.write(
"Pas de login CRI trouvé pour {} ({})".format(
profile.user.username, profile.promotion
)
)
print(
"{} profils traités ; {} images importées.".format(
no_images.count(), success
if verbosity >= 1:
self.stdout.write(
"{} profils traités ; {} images importées.".format(
no_images.count(), success
)
)
)