From af4c8e074496902f4de25cb243b5d7990d11cf7c Mon Sep 17 00:00:00 2001 From: Tom Hubrecht Date: Mon, 22 May 2023 10:57:11 +0200 Subject: [PATCH 1/5] Update shell.nix and use django-types --- shell.nix | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/shell.nix b/shell.nix index 440f24bd..1dba6da6 100644 --- a/shell.nix +++ b/shell.nix @@ -1,5 +1,29 @@ { pkgs ? import { }, ... }: +let + python = pkgs.python38; + + django-types = python.pkgs.buildPythonPackage rec { + pname = "django-types"; + version = "0.17.0"; + + format = "pyproject"; + + src = pkgs.fetchPypi { + inherit pname version; + hash = "sha256-wcQqt4h2xXxyg0LVqwYHJas3H8jcg7uFuuC+BoRqrXA="; + }; + + nativeBuildInputs = with python.pkgs; [ poetry-core ]; + + # setup.cfg tries to pull in nonexistent LICENSE.txt file + # postPatch = "rm setup.cfg"; + + # propagatedBuildInputs = [ django typing-extensions ]; + }; +in + + pkgs.mkShell { shellHook = '' export DJANGO_SETTINGS_MODULE=gestioasso.settings.local @@ -10,12 +34,11 @@ pkgs.mkShell { pip install -r requirements-devel.txt | grep -v 'Requirement already satisfied:' ''; - packages = with pkgs; [ - python38 - python38Packages.pip - python38Packages.virtualenv - python38Packages.python-ldap - ]; + packages = [ python django-types ] ++ (with python.pkgs; [ + pip + virtualenv + python-ldap + ]); allowSubstitutes = false; } From 3eaac5c68f7913258a0156700a0c54a28202f707 Mon Sep 17 00:00:00 2001 From: Tom Hubrecht Date: Mon, 22 May 2023 11:10:44 +0200 Subject: [PATCH 2/5] =?UTF-8?q?feat(cof):=20Rajoute=20la=20date=20d'adh?= =?UTF-8?q?=C3=A9sion=20dans=20les=20profils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0019_cofprofile_date_adhesion.py | 19 +++++++++++++++++++ gestioncof/models.py | 1 + gestioncof/tests/test_views.py | 6 ++++-- gestioncof/views.py | 7 ++++++- 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 gestioncof/migrations/0019_cofprofile_date_adhesion.py diff --git a/gestioncof/migrations/0019_cofprofile_date_adhesion.py b/gestioncof/migrations/0019_cofprofile_date_adhesion.py new file mode 100644 index 00000000..5e70398b --- /dev/null +++ b/gestioncof/migrations/0019_cofprofile_date_adhesion.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.28 on 2023-05-22 09:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("gestioncof", "0018_petitscours_email"), + ] + + operations = [ + migrations.AddField( + model_name="cofprofile", + name="date_adhesion", + field=models.DateField( + blank=True, null=True, verbose_name="Date d'adhésion" + ), + ), + ] diff --git a/gestioncof/models.py b/gestioncof/models.py index c2c71660..d16b3db2 100644 --- a/gestioncof/models.py +++ b/gestioncof/models.py @@ -50,6 +50,7 @@ class CofProfile(models.Model): "Login clipper", max_length=32, blank=True, unique=True, null=True ) is_cof = models.BooleanField("Membre du COF", default=False) + date_adhesion = models.DateField("Date d'adhésion", blank=True, null=True) phone = models.CharField("Téléphone", max_length=20, blank=True) occupation = models.CharField( _("Occupation"), diff --git a/gestioncof/tests/test_views.py b/gestioncof/tests/test_views.py index d4955732..80d33c14 100644 --- a/gestioncof/tests/test_views.py +++ b/gestioncof/tests/test_views.py @@ -1,5 +1,5 @@ import uuid -from datetime import timedelta +from datetime import date, timedelta from django.contrib import messages from django.contrib.auth import get_user_model @@ -484,6 +484,7 @@ class ExportMembersViewTests(CSVResponseMixin, ViewTestCaseMixin, TestCase): u1.last_name = "last" u1.email = "user@mail.net" u1.save() + u1.profile.date_adhesion = date(2023, 5, 22) u1.profile.phone = "0123456789" u1.profile.departement = "Dept" u1.profile.save() @@ -505,8 +506,9 @@ class ExportMembersViewTests(CSVResponseMixin, ViewTestCaseMixin, TestCase): "1A", "Dept", "normalien", + "2023-05-22", ], - [str(u2.pk), "staff", "", "", "", "", "1A", "", "normalien"], + [str(u2.pk), "staff", "", "", "", "", "1A", "", "normalien", "None"], ], ) diff --git a/gestioncof/views.py b/gestioncof/views.py index fbe74ec7..37353346 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -1,6 +1,6 @@ import csv import uuid -from datetime import timedelta +from datetime import date, timedelta from smtplib import SMTPRecipientsRefused from urllib.parse import parse_qs, urlencode, urlparse, urlunparse @@ -86,6 +86,7 @@ class ResetComptes(BuroRequiredMixin, TemplateView): nb_adherents = CofProfile.objects.filter(is_cof=True).count() CofProfile.objects.update( is_cof=False, + date_adhesion=None, mailing_cof=False, mailing_bda=False, mailing_bda_revente=False, @@ -575,6 +576,9 @@ def registration(request): profile = profile_form.save() if profile.is_cof and not was_cof: notify_new_member(request, member) + profile.date_adhesion = date.today() + profile.save() + # Enregistrement des inscriptions aux événements for form in event_formset: if "status" not in form.cleaned_data: @@ -715,6 +719,7 @@ def export_members(request): profile.occupation, profile.departement, profile.type_cotiz, + profile.date_adhesion, ] writer.writerow([str(bit) for bit in bits]) From f97d339a1c4a81b5a435b2e13028be8368a83d46 Mon Sep 17 00:00:00 2001 From: Tom Hubrecht Date: Wed, 14 Jun 2023 20:56:25 +0200 Subject: [PATCH 3/5] =?UTF-8?q?fix(kfet):=20R=C3=A9cup=C3=A8re=20lors=20d'?= =?UTF-8?q?une=20erreur=20due=20=C3=A0=20smtplib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kfet/management/commands/sendrappelsnegatifs.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/kfet/management/commands/sendrappelsnegatifs.py b/kfet/management/commands/sendrappelsnegatifs.py index a1a8b7bc..981e2c44 100644 --- a/kfet/management/commands/sendrappelsnegatifs.py +++ b/kfet/management/commands/sendrappelsnegatifs.py @@ -2,6 +2,7 @@ Gestion en ligne de commande des mails de rappel K-Fet. """ +import smtplib from datetime import timedelta from django.core.management.base import BaseCommand @@ -10,6 +11,14 @@ from django.utils import timezone from kfet.models import AccountNegative +def send_mail(neg: AccountNegative, stdout) -> None: + try: + neg.send_rappel() + stdout.write(f"Mail de rappel pour {neg.account} envoyé avec succès.") + except smtplib.SMTPException: + stdout.write(f"Erreur lors de l'envoi du mail de rappel pour {neg.account}.") + + class Command(BaseCommand): help = ( "Envoie un mail de rappel aux personnes en négatif.\n" @@ -39,12 +48,10 @@ class Command(BaseCommand): ) for neg in accounts_first_mail: - neg.send_rappel() - self.stdout.write(f"Mail de rappel pour {neg.account} envoyé avec succès.") + send_mail(neg, self.stdout) for neg in accounts_periodic_mail: - neg.send_rappel() - self.stdout.write(f"Mail de rappel pour {neg.account} envoyé avec succès.") + send_mail(neg, self.stdout) if not (accounts_first_mail.exists() or accounts_periodic_mail.exists()): self.stdout.write("Aucun mail à envoyer.") From a0bde75f508cd9e8f76cf1f0c87116309d62dabd Mon Sep 17 00:00:00 2001 From: Tom Hubrecht Date: Thu, 15 Jun 2023 12:56:30 +0200 Subject: [PATCH 4/5] =?UTF-8?q?feat(kfet):=20Change=20l'adresse=20utilis?= =?UTF-8?q?=C3=A9e=20pour=20envoyer=20les=20mails=20de=20n=C3=A9gatif?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gestioasso/settings/cof_prod.py | 3 ++- kfet/models.py | 20 +++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/gestioasso/settings/cof_prod.py b/gestioasso/settings/cof_prod.py index ebfef337..7e24f936 100644 --- a/gestioasso/settings/cof_prod.py +++ b/gestioasso/settings/cof_prod.py @@ -207,7 +207,8 @@ MAIL_DATA = { }, "rappels": {"FROM": "Le BdA ", "REPLYTO": "Le BdA "}, "rappel_negatif": { - "FROM": "La K-Fêt ", + "FROM": "La K-Fêt ", + "REPLYTO": "La K-Fêt ", }, "revente": { "FROM": "BdA-Revente ", diff --git a/kfet/models.py b/kfet/models.py index d2ff42f9..0b5b7481 100644 --- a/kfet/models.py +++ b/kfet/models.py @@ -2,7 +2,7 @@ import re from django.conf import settings from django.contrib.auth.models import User -from django.core.mail import send_mail +from django.core.mail import EmailMessage from django.core.validators import RegexValidator from django.db import models, transaction from django.db.models import F @@ -298,10 +298,11 @@ class AccountNegative(models.Model): """ Envoie un mail de rappel signalant que la personne est en négatif. """ - # On envoie le mail - send_mail( - "Compte K-Psul négatif", - loader.render_to_string( + mail_data = settings.MAIL_DATA["rappel_negatif"] + + email = EmailMessage( + subject="Compte K-Psul négatif", + body=loader.render_to_string( "kfet/mails/rappel.txt", context={ "account": self.account, @@ -309,9 +310,14 @@ class AccountNegative(models.Model): "start_date": self.start, }, ), - settings.MAIL_DATA["rappel_negatif"]["FROM"], - [self.account.email], + from_email=mail_data["FROM"], + to=[self.account.email], + reply_to=[mail_data["REPLYTO"]], ) + + # On envoie le mail + email.send() + # On enregistre le fait que l'envoi a bien eu lieu self.last_rappel = timezone.now() self.save() From b548b87c2548cc01db7079fef962ea414b55de8b Mon Sep 17 00:00:00 2001 From: Tom Hubrecht Date: Thu, 15 Jun 2023 13:52:53 +0200 Subject: [PATCH 5/5] Version 0.15.1 et Changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a1a65f5..f7b871d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,13 @@ adhérents ni des cotisations. ## Version ??? - ??/??/???? +## Version 0.15.1 - 15/06/2023 + +### K-Fêt + +- Rattrape les erreurs d'envoi de mail de négatif +- Utilise l'adresse chefs pour les envois de négatifs + ## Version 0.15 - 22/05/2023 ### K-Fêt