diff --git a/participation/management/commands/fix_sympa_lists.py b/participation/management/commands/fix_sympa_lists.py index 8dd4681..2331b00 100644 --- a/participation/management/commands/fix_sympa_lists.py +++ b/participation/management/commands/fix_sympa_lists.py @@ -3,6 +3,7 @@ from django.conf import settings from django.core.management import BaseCommand from django.db.models import Q +from django.template.defaultfilters import slugify from participation.models import Team, Tournament from registration.models import ParticipantRegistration, VolunteerRegistration from tfjm.lists import get_sympa_client @@ -36,7 +37,7 @@ class Command(BaseCommand): "education", raise_error=False) for tournament in Tournament.objects.all(): - slug = tournament.name.lower().replace(" ", "-") + slug = slugify(tournament.name) sympa.create_list(f"equipes-{slug}", f"Equipes du tournoi {tournament.name}", "hotline", f"Liste de diffusion pour contacter toutes les equipes du tournoi {tournament.name}" " du TFJM2.", "education", raise_error=False) @@ -54,7 +55,7 @@ class Command(BaseCommand): for team in Team.objects.filter(participation__valid=True).all(): team.create_mailing_list() sympa.unsubscribe(team.email, "equipes-non-valides", True) - sympa.subscribe(team.email, f"equipes-{team.participation.tournament.name.lower().replace(' ', '-')}", + sympa.subscribe(team.email, f"equipes-{slugify(team.participation.tournament.name)}", True, f"Equipe {team.name}") for team in Team.objects.filter(Q(participation__valid=False) | Q(participation__valid__isnull=True)).all(): @@ -62,16 +63,16 @@ class Command(BaseCommand): sympa.subscribe(team.email, "equipes-non-valides", True, f"Equipe {team.name}") for participant in ParticipantRegistration.objects.filter(team__isnull=False).all(): - sympa.subscribe(participant.user.email, f"equipe-{participant.team.trigram.lower()}", + sympa.subscribe(participant.user.email, f"equipe-{slugify(participant.team.trigram)}", True, f"{participant}") for volunteer in VolunteerRegistration.objects.all(): for organized_tournament in volunteer.organized_tournaments.all(): - slug = organized_tournament.name.lower().replace(" ", "-") + slug = slugify(organized_tournament.name) sympa.subscribe(volunteer.user.email, f"organisateurs-{slug}", True) for jury_in in volunteer.jury_in.all(): - slug = jury_in.tournament.name.lower().replace(" ", "-") + slug = slugify(jury_in.tournament.name) sympa.subscribe(volunteer.user.email, f"jurys-{slug}", True) for admin in VolunteerRegistration.objects.filter(admin=True).all(): diff --git a/participation/models.py b/participation/models.py index 6b91063..8d32d12 100644 --- a/participation/models.py +++ b/participation/models.py @@ -10,6 +10,7 @@ from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator, RegexValidator from django.db import models from django.db.models import Index +from django.template.defaultfilters import slugify from django.urls import reverse_lazy from django.utils import timezone, translation from django.utils.crypto import get_random_string @@ -210,14 +211,14 @@ class Team(models.Model): """ :return: The mailing list to contact the team members. """ - return f"equipe-{self.trigram.lower()}@{os.getenv('SYMPA_HOST', 'localhost')}" + return f"equipe-{slugify(self.trigram)}@{os.getenv('SYMPA_HOST', 'localhost')}" def create_mailing_list(self): """ Create a new Sympa mailing list to contact the team. """ get_sympa_client().create_list( - f"equipe-{self.trigram.lower()}", + f"equipe-{slugify(self.trigram)}", f"Equipe {self.name} ({self.trigram})", "hotline", # TODO Use a custom sympa template f"Liste de diffusion pour contacter l'equipe {self.name} du TFJM2", @@ -231,7 +232,7 @@ class Team(models.Model): """ if self.participation.valid: # pragma: no cover get_sympa_client().unsubscribe( - self.email, f"equipes-{self.participation.tournament.name.lower().replace(' ', '-')}", False) + self.email, f"equipes-{slugify(self.participation.tournament.name)}", False) else: get_sympa_client().unsubscribe(self.email, "equipes-non-valides", False) get_sympa_client().delete_list(f"equipe-{self.trigram}") @@ -391,28 +392,28 @@ class Tournament(models.Model): """ :return: The mailing list to contact the team members. """ - return f"equipes-{self.name.lower().replace(' ', '-')}@{os.getenv('SYMPA_HOST', 'localhost')}" + return f"equipes-{slugify(self.name)}@{os.getenv('SYMPA_HOST', 'localhost')}" @property def organizers_email(self): """ :return: The mailing list to contact the team members. """ - return f"organisateurs-{self.name.lower().replace(' ', '-')}@{os.getenv('SYMPA_HOST', 'localhost')}" + return f"organisateurs-{slugify(self.name)}@{os.getenv('SYMPA_HOST', 'localhost')}" @property def jurys_email(self): """ :return: The mailing list to contact the team members. """ - return f"jurys-{self.name.lower().replace(' ', '-')}@{os.getenv('SYMPA_HOST', 'localhost')}" + return f"jurys-{slugify(self.name)}@{os.getenv('SYMPA_HOST', 'localhost')}" def create_mailing_lists(self): """ Create a new Sympa mailing list to contact the team. """ get_sympa_client().create_list( - f"equipes-{self.name.lower().replace(' ', '-')}", + f"equipes-{slugify(self.name)}", f"Equipes du tournoi de {self.name}", "hotline", # TODO Use a custom sympa template f"Liste de diffusion pour contacter les equipes du tournoi {self.name} du TFJM²", @@ -420,7 +421,7 @@ class Tournament(models.Model): raise_error=False, ) get_sympa_client().create_list( - f"organisateurs-{self.name.lower().replace(' ', '-')}", + f"organisateurs-{slugify(self.name)}", f"Organisateurs du tournoi de {self.name}", "hotline", # TODO Use a custom sympa template f"Liste de diffusion pour contacter les equipes du tournoi {self.name} du TFJM²", diff --git a/participation/signals.py b/participation/signals.py index 8c621ed..259bfd6 100644 --- a/participation/signals.py +++ b/participation/signals.py @@ -4,6 +4,7 @@ from typing import Union from django.conf import settings +from django.template.defaultfilters import slugify from participation.models import Note, Participation, Passage, Pool, Team, Tournament from registration.models import Payment from tfjm.lists import get_sympa_client @@ -34,10 +35,10 @@ def update_mailing_list(instance: Team, raw, **_): instance.create_mailing_list() # Subscribe all team members in the mailing list for student in instance.students.all(): - get_sympa_client().subscribe(student.user.email, f"equipe-{instance.trigram.lower()}", False, + get_sympa_client().subscribe(student.user.email, f"equipe-{slugify(instance.trigram)}", False, f"{student.user.first_name} {student.user.last_name}") for coach in instance.coaches.all(): - get_sympa_client().subscribe(coach.user.email, f"equipe-{instance.trigram.lower()}", False, + get_sympa_client().subscribe(coach.user.email, f"equipe-{slugify(instance.trigram)}", False, f"{coach.user.first_name} {coach.user.last_name}") diff --git a/participation/views.py b/participation/views.py index d05b03a..236d7c2 100644 --- a/participation/views.py +++ b/participation/views.py @@ -22,6 +22,7 @@ from django.db import transaction from django.db.models import F from django.http import FileResponse, Http404, HttpResponse from django.shortcuts import redirect +from django.template.defaultfilters import slugify from django.template.loader import render_to_string from django.urls import reverse_lazy from django.utils import timezone, translation @@ -88,7 +89,7 @@ class CreateTeamView(LoginRequiredMixin, CreateView): registration.save() # Subscribe the user mail address to the team mailing list - get_sympa_client().subscribe(user.email, f"equipe-{form.instance.trigram.lower()}", False, + get_sympa_client().subscribe(user.email, f"equipe-{slugify(form.instance.trigram)}", False, f"{user.first_name} {user.last_name}") return ret @@ -130,7 +131,7 @@ class JoinTeamView(LoginRequiredMixin, FormView): registration.save() # Subscribe to the team mailing list - get_sympa_client().subscribe(user.email, f"equipe-{form.instance.trigram.lower()}", False, + get_sympa_client().subscribe(user.email, f"equipe-{slugify(form.instance.trigram)}", False, f"{user.first_name} {user.last_name}") return ret @@ -519,7 +520,7 @@ class TeamLeaveView(LoginRequiredMixin, TemplateView): team = request.user.registration.team request.user.registration.team = None request.user.registration.save() - get_sympa_client().unsubscribe(request.user.email, f"equipe-{team.trigram.lower()}", False) + get_sympa_client().unsubscribe(request.user.email, f"equipe-{slugify(team.trigram)}", False) if team.students.count() + team.coaches.count() == 0: team.delete() return redirect(reverse_lazy("index")) diff --git a/registration/signals.py b/registration/signals.py index d282586..208d52c 100644 --- a/registration/signals.py +++ b/registration/signals.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later from django.contrib.auth.models import User +from django.template.defaultfilters import slugify from tfjm.lists import get_sympa_client from .models import Registration, VolunteerRegistration @@ -29,8 +30,8 @@ def send_email_link(instance, **_): registration.send_email_validation_link() if registration.participates and registration.team: - get_sympa_client().unsubscribe(old_instance.email, f"equipe-{registration.team.trigram.lower()}", False) - get_sympa_client().subscribe(instance.email, f"equipe-{registration.team.trigram.lower()}", False, + get_sympa_client().unsubscribe(old_instance.email, f"equipe-{slugify(registration.team.trigram)}", False) + get_sympa_client().subscribe(instance.email, f"equipe-{slugify(registration.team.trigram)}", False, f"{instance.first_name} {instance.last_name}")