diff --git a/fiches/management/commands/get_photos.py b/fiches/management/commands/get_photos.py index cb9c30f..cc10bd4 100644 --- a/fiches/management/commands/get_photos.py +++ b/fiches/management/commands/get_photos.py @@ -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() 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 "Études passées" %} - {{ profile.past_studies }} + {{ profile.past_studies|linebreaksbr }}
{% endif %} @@ -114,7 +114,7 @@
{% trans "Expériences passées" %} - {{ profile.experiences }} + {{ profile.experiences|linebreaksbr }}
{% endif %} @@ -122,7 +122,7 @@ {% if profile.text_field %}
{% 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/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index f0263c1..7748db4 100644 Binary files a/locale/en/LC_MESSAGES/django.mo and b/locale/en/LC_MESSAGES/django.mo differ diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 79b583e..e611f31 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -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 \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 \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" diff --git a/transfert.py b/transfert.py new file mode 100644 index 0000000..ca56105 --- /dev/null +++ b/transfert.py @@ -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]")