diff --git a/fiches/models.py b/fiches/models.py
index 355736f..095620e 100644
--- a/fiches/models.py
+++ b/fiches/models.py
@@ -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")
diff --git a/fiches/templates/fiches/fiche.html b/fiches/templates/fiches/fiche.html
index 201a7b2..00dc20b 100644
--- a/fiches/templates/fiches/fiche.html
+++ b/fiches/templates/fiches/fiche.html
@@ -106,7 +106,7 @@
{% trans "Champ libre" %}
-
{{ profile.text_field }}
+
{{ profile.text_field|linebreaksbr }}
{% endif %}
diff --git a/fiches/views.py b/fiches/views.py
index e506055..6e061a6 100644
--- a/fiches/views.py
+++ b/fiches/views.py
@@ -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
diff --git a/transfert.py b/transfert.py
index cbe449d..ca56105 100644
--- a/transfert.py
+++ b/transfert.py
@@ -1,72 +1,82 @@
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 fiches.management.commands._ldap import ClipperLDAP
-from fiches.models import Address, Department, Mail, Phone, Profile
+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, "%d/%m/%Y").date()
- except ValueError:
- return ""
+ return datetime.strptime(s, "%Y-%m-%d").date()
+ except (ValueError, TypeError):
+ return None
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"
+ 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["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"]
+ 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):
- return [p for p in s.split(",").split("\n").split(";") if p]
+ 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, content=p))
+ 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, content=m))
+ mails.append(Mail(profile=profile, name=name, mail=m))
-# On récupère la liste des élèves à créer
+print("Récupération des comptes clipper...", end=" ")
+
ldap = ClipperLDAP()
-# Pas besoin de filtrer les users déjà existants
-clipper = ldap.get_clipper_list(stdout=sys.stdout)
+clippers = {c.uid: c for c in ldap.get_clipper_list(stdout=sys.stdout)}
+
+print("[ok]")
-# 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()
@@ -77,12 +87,30 @@ users = {}
profiles_to_create = []
dept_m2m_to_create = []
-for clipper in clippers:
+
+print("Création des comptes...", end=" ")
+
+for clipper in clippers.values():
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)
+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 = {}
@@ -90,58 +118,127 @@ 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:
- 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]
- )
- )
+ 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_id = dept_m2m.profile.id
+ dept_m2m.profile = profils[dept_m2m.profile.user.username]
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)
+print("[ok]")
+
+
+print("Création des numéros de téléphone...", end=" ")
for p in numeros:
- p.profile_id = p.profile.id
+ 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_id = m.profile.id
+ 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]")