Verbosity controls
This commit is contained in:
parent
7289e4f1dc
commit
3ad1de64f7
3 changed files with 62 additions and 16 deletions
|
@ -77,7 +77,7 @@ class ClipperLDAP(LDAP):
|
||||||
|
|
||||||
return promo, self.verbose_depts.get(dept, None)
|
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.
|
"""Extrait la liste des comptes clipper présents dans le LDAP.
|
||||||
Renvoie une liste de `namedTuple` contenant leur nom, prénom, adresse mail et
|
Renvoie une liste de `namedTuple` contenant leur nom, prénom, adresse mail et
|
||||||
département/année d'entrée.
|
département/année d'entrée.
|
||||||
|
@ -101,7 +101,11 @@ class ClipperLDAP(LDAP):
|
||||||
clipper_list.append(
|
clipper_list.append(
|
||||||
ClipperAccount(uid, name, email, promo, dept)
|
ClipperAccount(uid, name, email, promo, dept)
|
||||||
)
|
)
|
||||||
|
if verbosity == 3:
|
||||||
|
stdout.write("Compte clipper trouvé : {}".format(uid))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
if verbosity >= 2:
|
||||||
|
stdout.write("Entrée malformée trouvée : {}".format(entry))
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return clipper_list
|
return clipper_list
|
||||||
|
@ -114,7 +118,7 @@ class AnnuaireLDAP(LDAP):
|
||||||
search_base = "ou=people,dc=ens,dc=fr"
|
search_base = "ou=people,dc=ens,dc=fr"
|
||||||
attr_list = ["uid", "sn", "givenName", "ou"]
|
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
|
"""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
|
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`,
|
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) > 0:
|
||||||
if len(search_name) > 2:
|
if len(search_name) > 2:
|
||||||
print(
|
if verbosity >= 2:
|
||||||
"Erreur : deux résultats trouvés pour {}".format(
|
stderr.write(
|
||||||
profile.user.username
|
"Erreur : deux logins CRI trouvés pour {} ({})".format(
|
||||||
|
profile.user.username, profile.promotion
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return self.extract_ldap_info(search_name[0], "uid")
|
return self.extract_ldap_info(search_name[0], "uid")
|
||||||
|
|
|
@ -36,9 +36,13 @@ class Command(BaseCommand):
|
||||||
else:
|
else:
|
||||||
promo = self.get_current_promo()
|
promo = self.get_current_promo()
|
||||||
|
|
||||||
|
verbosity = options["verbosity"]
|
||||||
|
|
||||||
# On récupère la liste des élèves à créer
|
# On récupère la liste des élèves à créer
|
||||||
ldap = ClipperLDAP()
|
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
|
# On vire les élèves déjà existants
|
||||||
existing_users = set(User.objects.values_list("username", flat=True))
|
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)
|
User.objects.bulk_create(users_to_create)
|
||||||
for profile in profiles_to_create:
|
for profile in profiles_to_create:
|
||||||
profile.user_id = profile.user.id
|
profile.user_id = profile.user.id
|
||||||
|
@ -75,8 +91,10 @@ class Command(BaseCommand):
|
||||||
dept_m2m.profile_id = dept_m2m.profile.id
|
dept_m2m.profile_id = dept_m2m.profile.id
|
||||||
Profile.department.through.objects.bulk_create(dept_m2m_to_create)
|
Profile.department.through.objects.bulk_create(dept_m2m_to_create)
|
||||||
|
|
||||||
print(
|
if verbosity >= 1:
|
||||||
"Création de {} utilisateur·ices et de {} profils effectuée avec succès".format(
|
self.stdout.write(
|
||||||
len(users_to_create), len(profiles_to_create)
|
(
|
||||||
|
"Création de {} utilisateur·ices et de {}"
|
||||||
|
" profils effectuée avec succès"
|
||||||
|
).format(len(users_to_create), len(profiles_to_create))
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
|
@ -40,6 +40,8 @@ class Command(BaseCommand):
|
||||||
else:
|
else:
|
||||||
promo = self.get_current_promo()
|
promo = self.get_current_promo()
|
||||||
|
|
||||||
|
verbosity = options["verbosity"]
|
||||||
|
|
||||||
no_images = Profile.objects.select_related("user").filter(picture="")
|
no_images = Profile.objects.select_related("user").filter(picture="")
|
||||||
|
|
||||||
if promo is not None:
|
if promo is not None:
|
||||||
|
@ -51,7 +53,9 @@ class Command(BaseCommand):
|
||||||
success = 0
|
success = 0
|
||||||
|
|
||||||
for profile in no_images:
|
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:
|
if cri_login is not None:
|
||||||
img_url = "{}/photos/{}.jpg".format(base_annuaire, cri_login)
|
img_url = "{}/photos/{}.jpg".format(base_annuaire, cri_login)
|
||||||
try:
|
try:
|
||||||
|
@ -61,13 +65,32 @@ class Command(BaseCommand):
|
||||||
content=File(BytesIO(istream.read())),
|
content=File(BytesIO(istream.read())),
|
||||||
)
|
)
|
||||||
success += 1
|
success += 1
|
||||||
|
if verbosity == 3:
|
||||||
|
self.stdout.write(
|
||||||
|
"Photo trouvée pour {} ({})".format(
|
||||||
|
profile.user.username, profile.promotion
|
||||||
|
)
|
||||||
|
)
|
||||||
except HTTPError:
|
except HTTPError:
|
||||||
# Parfois, même si on trouve un login CRI, il y a une erreur 404.
|
# Parfois, même si on trouve un login CRI, il y a une erreur 404.
|
||||||
# Dans ce cas, pas de photo : on échoue gracieusement.
|
# 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
|
pass
|
||||||
|
elif verbosity >= 2:
|
||||||
|
self.stdout.write(
|
||||||
|
"Pas de login CRI trouvé pour {} ({})".format(
|
||||||
|
profile.user.username, profile.promotion
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
print(
|
if verbosity >= 1:
|
||||||
"{} profils traités ; {} images importées.".format(
|
self.stdout.write(
|
||||||
no_images.count(), success
|
"{} profils traités ; {} images importées.".format(
|
||||||
|
no_images.count(), success
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue