Merge branch 'thubrecht/transfert' into 'master'

Transfert de l'ancien annuaire

See merge request klub-dev-ens/annuaire!26
This commit is contained in:
Tom Hubrecht 2023-01-30 11:28:26 +01:00
commit be5b47e48d
7 changed files with 261 additions and 15 deletions

View file

@ -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()

View file

@ -40,6 +40,10 @@ class Profile(models.Model):
def __str__(self):
return self.full_name
@property
def age(self):
return self.day.year - self.birth_date.year
def birthday(self):
return self.birth_date.strftime("%d%m")

View file

@ -106,7 +106,7 @@
<div class="studies">
<span class="label">{% trans "Études passées" %}</span>
<span class="separator"></span>
<span class="value">{{ profile.past_studies }}</span>
<span class="value">{{ profile.past_studies|linebreaksbr }}</span>
</div>
{% endif %}
@ -114,7 +114,7 @@
<div class="studies">
<span class="label">{% trans "Expériences passées" %}</span>
<span class="separator"></span>
<span class="value">{{ profile.experiences }}</span>
<span class="value">{{ profile.experiences|linebreaksbr }}</span>
</div>
{% endif %}
</div>
@ -122,7 +122,7 @@
{% if profile.text_field %}
<div class="free-text">
<span class="label">{% trans "Champ libre" %}</span>
<p class="value">{{ profile.text_field }}</p>
<p class="value">{{ profile.text_field|linebreaksbr }}</p>
</div>
{% endif %}

View file

@ -2,11 +2,9 @@ from datetime import date, timedelta
from django.contrib.auth.decorators import login_required
from django.core.mail import send_mail
from django.db.models import Q
from django.forms import formset_factory
from django.forms.models import model_to_dict
from django.db.models import DateTimeField, Q, Value
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render
from django.shortcuts import get_object_or_404
from django.template.loader import render_to_string
from django.urls import reverse, reverse_lazy
from django.utils import timezone
@ -23,7 +21,7 @@ from fiches.forms import (
SearchForm,
SocialFormSet,
)
from fiches.models import Address, Department, Mail, Phone, Profile, Social
from fiches.models import Department, Profile
from fiches.utils import get_ldap_infos
@ -151,14 +149,14 @@ class BirthdayView(ListView):
context["result"] = list(
Profile.objects.filter(
birth_date__day=today.day, birth_date__month=today.month
)
).annotate(day=Value(today, output_field=DateTimeField()))
)
for i in range(1, 7):
today = today + timedelta(days=1)
context["result"] += list(
Profile.objects.filter(
birth_date__day=today.day, birth_date__month=today.month
)
).annotate(day=Value(today, output_field=DateTimeField()))
)
return context

Binary file not shown.

View file

@ -7,16 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-23 22:53+0100\n"
"PO-Revision-Date: 2021-02-23 22:53+0100\n"
"Last-Translator: Tom Hubrecht <tom.hubrecht@ens.fr>\n"
"POT-Creation-Date: 2021-02-06 12:02+0000\n"
"PO-Revision-Date: 2021-10-08 09:36+0200\n"
"Last-Translator: Test Translator <test@translator>\n"
"Language-Team: \n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.4.1\n"
"X-Generator: Poedit 3.0\n"
#: fiches/forms.py:20
msgid "Nom/Surnom"

244
transfert.py Normal file
View file

@ -0,0 +1,244 @@
import json
import os
import sys
from datetime import datetime
import django
from django.contrib.auth import get_user_model
print("\nTransfert des fiches annuaires :")
# Configuration
print("Paramétrage de Django...", end=" ")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "annuaire.settings")
django.setup()
User = get_user_model()
from authens.models import CASAccount # noqa
from fiches.management.commands._ldap import ClipperLDAP # noqa
from fiches.models import Address, Department, Mail, Phone, Profile # noqa
print("[ok]")
# Utilitaires
def parse_date(s):
try:
return datetime.strptime(s, "%Y-%m-%d").date()
except (ValueError, TypeError):
return None
def get_text_field(data):
text = ""
if data["interests"]:
text += "Mes intérêts :\n" + data["interests"] + "\n\n"
if data["websites"]:
text += "Mes pages web :\n\n" + data["websites"] + "\n\n"
if data["comments"]:
text += data["comments"] + "\n\n"
return text
def get_address(data):
content = data["lines"] + "\n"
if data["zip"] and data["city"]:
content += data["zip"] + ", " + data["city"]
elif data["zip"] or data["city"]:
content += data["zip"] + data["city"]
if data["country"]:
content += ", " + data["country"]
return content
def parse_list(s):
s = s or ""
return [p for p in s.replace(",", ";").replace("\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, number=p))
def create_mails(s, profile, mails, name="E-mail"):
for m in parse_list(s):
mails.append(Mail(profile=profile, name=name, mail=m))
print("Récupération des comptes clipper...", end=" ")
ldap = ClipperLDAP()
clippers = {c.uid: c for c in ldap.get_clipper_list(stdout=sys.stdout)}
print("[ok]")
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 = []
print("Création des comptes...", end=" ")
for clipper in clippers.values():
user = User(username=clipper.uid, email=clipper.email)
users_to_create.append(user)
User.objects.bulk_create(users_to_create)
users = {u.username: (u, clippers[u.username]) for u in User.objects.all()}
print("[ok]")
print("Création des comptes Authens...", end=" ")
cas_accounts = []
for (u, c) in users.values():
cas_accounts.append(CASAccount(user=u, cas_login=c.uid, entrance_year=c.year))
CASAccount.objects.bulk_create(cas_accounts)
print("[ok]")
fiches = {}
references = {}
adresses = []
devises = {}
numeros = []
mails = []
fiches_pk = {}
print("Récupération des anciennes fiches :")
# On recrée les profils
with open("old_fiches.json") as json_file:
data = json.load(json_file)
for obj in data:
if obj["model"] == "annuaire.fiches2021":
obj_data = obj["fields"]
try:
user, clipper = users[obj_data["login"]]
fiches_pk[obj["pk"]] = user.username
fiches[obj_data["login"]] = Profile(
user=user,
full_name=" ".join((obj_data["firstname"], obj_data["lastname"])),
promotion=clipper.year,
birth_date=parse_date((obj_data["birthdate"] or "")),
past_studies=(
(obj_data["past_studies"] or "")
+ "\n"
+ (obj_data["studies"] or "")
).strip(),
experiences=(obj_data["experiences"] or ""),
thurne=(obj_data["room"] or ""),
text_field=get_text_field(obj_data),
)
create_phones(obj_data["phones"], fiches[obj_data["login"]], numeros)
create_phones(
obj_data["mobiles"],
fiches[obj_data["login"]],
numeros,
name="Portable",
)
create_mails(obj_data["emails"], fiches[obj_data["login"]], mails)
dept_m2m_to_create.append(
Profile.department.through(
profile=fiches[obj_data["login"]],
department_id=depts[clipper.dept],
)
)
except KeyError:
print(f"\tLogin inconnu : {obj_data['login']}")
elif obj["model"] == "annuaire.lesreferences2021":
try:
username = fiches_pk[obj["pk"]]
surnom = obj["fields"]["nickname"]
if surnom:
fiche = fiches[username]
if fiche.nickname:
fiche.nickname += ", "
fiche.nickname += surnom
except KeyError:
pass
elif obj["model"] == "annuaire.adresses2021":
try:
username = fiches_pk[obj["pk"]]
obj_data = obj["fields"]
fiche = fiches[username]
a = get_address(obj_data).strip()
if a:
adresses.append(Address(profile=fiche, name="Adresse", content=a))
except KeyError:
pass
elif obj["model"] == "annuaire.devises2021":
try:
username = fiches_pk[obj["pk"]]
obj_data = obj["fields"]
fiche = fiches[username]
if obj_data["quote"]:
fiche.text_field += f"\n{obj_data['quote']}"
if obj_data["source"]:
fiche.text_field += f" ({obj_data['source']})"
if obj_data["author"]:
fiche.text_field += f", ({obj_data['author']})"
if a:
adresses.append(Address(profile=fiche, name="Adresse", content=a))
except KeyError:
pass
print("Création des nouvelles fiches fiches...", end=" ")
Profile.objects.bulk_create(fiches.values())
profils = {p.user.username: p for p in Profile.objects.select_related("user")}
print("[ok]")
print("Rattachement des départements...", end=" ")
for dept_m2m in dept_m2m_to_create:
dept_m2m.profile = profils[dept_m2m.profile.user.username]
Profile.department.through.objects.bulk_create(dept_m2m_to_create)
print("[ok]")
print("Création des numéros de téléphone...", end=" ")
for p in numeros:
p.profile = profils[p.profile.user.username]
Phone.objects.bulk_create(numeros)
print("[ok]")
print("Création des adresses mail...", end=" ")
for m in mails:
m.profile = profils[m.profile.user.username]
Mail.objects.bulk_create(mails)
print("[ok]")
print("Création des adresses...", end=" ")
for a in adresses:
a.profile = profils[a.profile.user.username]
Address.objects.bulk_create(adresses)
print("[ok]")