Utilitaire pour transférer les anciennes fiches
This commit is contained in:
parent
500f7e6155
commit
54e6877998
2 changed files with 148 additions and 1 deletions
|
@ -13,7 +13,7 @@ from ._ldap import AnnuaireLDAP
|
|||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Si possible, import les photos des conscrit·e·s dans l'annuaire."
|
||||
help = "Si possible, importe les photos des conscrit·e·s dans l'annuaire."
|
||||
|
||||
def add_arguments(self, parser):
|
||||
group = parser.add_mutually_exclusive_group()
|
||||
|
|
147
transfert.py
Normal file
147
transfert.py
Normal file
|
@ -0,0 +1,147 @@
|
|||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
import django
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
# Configuration
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "annuaire.settings")
|
||||
django.setup()
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
from fiches.management.commands._ldap import ClipperLDAP
|
||||
from fiches.models import Address, Department, Mail, Phone, Profile
|
||||
|
||||
# Utilitaires
|
||||
def parse_date(s):
|
||||
try:
|
||||
return datetime.strptime(s, "%d/%m/%Y").date()
|
||||
except ValueError:
|
||||
return ""
|
||||
|
||||
|
||||
def get_text_field(data):
|
||||
text = ""
|
||||
if data["interets"]:
|
||||
text += "Mes intérêts :\n" + data["interets"] + "\n\n"
|
||||
if data["pages_web"]:
|
||||
text += "Mes pages web :\n" + data["pages_web"] + "\n\n"
|
||||
if data["commentaires"]:
|
||||
text += data["commentaires"] + "\n\n"
|
||||
return text
|
||||
|
||||
|
||||
def get_address(data):
|
||||
content = data["lignes"] + "\n"
|
||||
if data["code_postal"] and data["ville"]:
|
||||
content += data["code_postal"] + ", " + data["ville"]
|
||||
elif data["code_postal"] or data["ville"]:
|
||||
content += data["code_postal"] + data["ville"]
|
||||
if data["pays"]:
|
||||
content += ", " + data["pays"]
|
||||
return content
|
||||
|
||||
|
||||
def parse_list(s):
|
||||
return [p for p in s.split(",").split("\n").split(";") if p]
|
||||
|
||||
|
||||
def create_phones(s, profile, numeros, name="Téléphone"):
|
||||
for p in parse_list(s):
|
||||
numeros.append(Phone(profile=profile, name=name, content=p))
|
||||
|
||||
|
||||
def create_mails(s, profile, mails, name="E-mail"):
|
||||
for m in parse_list(s):
|
||||
mails.append(Mail(profile=profile, name=name, content=m))
|
||||
|
||||
# On récupère la liste des élèves à créer
|
||||
ldap = ClipperLDAP()
|
||||
clipper_list = ldap.get_clipper_list(stdout=sys.stdout)
|
||||
|
||||
# On vire les élèves déjà existants
|
||||
existing_users = set(User.objects.values_list("username", flat=True))
|
||||
clippers = [clipper for clipper in clipper_list if clipper.uid not in existing_users]
|
||||
|
||||
# On récupère la liste des départements
|
||||
depts = {
|
||||
dept: Department.objects.get_or_create(name=dept)[0].id
|
||||
for dept in ldap.verbose_depts.values()
|
||||
}
|
||||
|
||||
users_to_create = []
|
||||
users = {}
|
||||
profiles_to_create = []
|
||||
dept_m2m_to_create = []
|
||||
|
||||
for clipper in clippers:
|
||||
user = User(username=clipper.uid, email=clipper.email)
|
||||
users["clipper.uid"] = (user, clipper)
|
||||
users_to_create.append(user)
|
||||
|
||||
User.objects.bulk_create(users_to_create)
|
||||
|
||||
fiches = {}
|
||||
references = {}
|
||||
adresses = []
|
||||
devises = {}
|
||||
numeros = []
|
||||
mails = []
|
||||
|
||||
# On recrée les profils
|
||||
with open("old_fiches.json") as json_file:
|
||||
data = json.load(json_file)
|
||||
for obj in data:
|
||||
obj_data = obj["fields"]
|
||||
user, clipper = users[obj_data["id"]]
|
||||
fiches[obj_data["n_id"]] = Profile(
|
||||
user=user,
|
||||
full_name=" ".join(obj_data["prenom"], obj_data["nom"]),
|
||||
promotion=clipper.promotion,
|
||||
birth_date=parse_date(obj_data["date_de_naissance"]),
|
||||
past_studies=obj_data["etudes_passees"] + "\n" + obj_data["etudes"],
|
||||
experiences=obj_data["experiences"],
|
||||
thurne=obj_data["thurne"],
|
||||
text_field=get_text_field(obj_data),
|
||||
)
|
||||
create_phones(data["telephones"], fiches[obj_data["n_id"]], numeros)
|
||||
create_phones(data["portables"], fiches[obj_data["n_id"]], numeros, name="Portable")
|
||||
create_mails(data["emails"], fiches[obj_data["n_id"]], numeros)
|
||||
dept_m2m_to_create.append(
|
||||
Profile.department.through(
|
||||
profile=fiches[obj_data["n_id"]], department_id=depts[clipper.dept]
|
||||
)
|
||||
)
|
||||
|
||||
Profile.objects.bulk_create(fiches.values())
|
||||
for dept_m2m in dept_m2m_to_create:
|
||||
dept_m2m.profile_id = dept_m2m.profile.id
|
||||
Profile.department.through.objects.bulk_create(dept_m2m_to_create)
|
||||
|
||||
# On récupère les adresses
|
||||
with open("old_adresses.json") as json_file:
|
||||
data = json.load(json_file)
|
||||
for obj in data:
|
||||
obj_data = obj["fields"]
|
||||
profile = fiches[obj_data["n_id"]]
|
||||
adresses.append(
|
||||
Address(
|
||||
profile=profile,
|
||||
name="Adresse",
|
||||
content=get_address(obj_data),
|
||||
)
|
||||
)
|
||||
create_phones(obj_data["telephones"], profile, numeros)
|
||||
|
||||
for p in numeros:
|
||||
p.profile_id = p.profile.id
|
||||
Phone.objects.bulk_create(numeros)
|
||||
|
||||
for m in mails:
|
||||
m.profile_id = m.profile.id
|
||||
Mail.objects.bulk_create(mails)
|
||||
|
Loading…
Reference in a new issue