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)
|
||||
|
||||
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")
|
||||
|
|
|
@ -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))
|
||||
)
|
||||
)
|
||||
|
|
|
@ -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
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
Loading…
Add table
Reference in a new issue