mirror of
https://gitlab.com/animath/si/plateforme.git
synced 2025-11-17 14:57:49 +01:00
Compare commits
3 Commits
dev
...
27a4bdf98e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27a4bdf98e | ||
|
|
af60d27402 | ||
|
|
49729485b7 |
File diff suppressed because it is too large
Load Diff
@@ -80,13 +80,17 @@ class ParticipationForm(forms.ModelForm):
|
|||||||
if settings.SINGLE_TOURNAMENT:
|
if settings.SINGLE_TOURNAMENT:
|
||||||
del self.fields['tournament']
|
del self.fields['tournament']
|
||||||
self.helper = FormHelper()
|
self.helper = FormHelper()
|
||||||
|
idf_text = _(
|
||||||
|
'For the tournaments in the region "Île-de-France": registration is '
|
||||||
|
'unified for each tournament. By choosing a tournament "Île-de-France", '
|
||||||
|
"you're accepting that your team may be selected for one of these tournaments. "
|
||||||
|
'In case of date conflict, please write them in your motivation letter.'
|
||||||
|
)
|
||||||
|
|
||||||
idf_warning_banner = f"""
|
idf_warning_banner = f"""
|
||||||
<div class=\"alert alert-warning\">
|
<div class=\"alert alert-warning\">
|
||||||
<h5 class=\"alert-heading\">{_("IMPORTANT")}</h4>
|
<h5 class=\"alert-heading\">{_("IMPORTANT")}</h4>
|
||||||
{_("""For the tournaments in the region "Île-de-France": registration is
|
{idf_text}
|
||||||
unified for each tournament. By choosing a tournament "Île-de-France",
|
|
||||||
you're accepting that your team may be selected for one of these tournaments.
|
|
||||||
In case of date conflict, please write them in your motivation letter.""")}
|
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
unified_registration_tournament_ids = ",".join(
|
unified_registration_tournament_ids = ",".join(
|
||||||
|
|||||||
@@ -70,11 +70,11 @@ class Team(models.Model):
|
|||||||
@property
|
@property
|
||||||
def coaches(self):
|
def coaches(self):
|
||||||
return self.participants.filter(coachregistration__isnull=False)
|
return self.participants.filter(coachregistration__isnull=False)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def scientific_coaches(self):
|
def scientific_coaches(self):
|
||||||
return self.participants.filter(coachregistration__isnull=False, coachregistration__is_scientific_coach=True)
|
return self.participants.filter(coachregistration__isnull=False, coachregistration__is_scientific_coach=True)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def accompanying_coaches(self):
|
def accompanying_coaches(self):
|
||||||
return self.participants.filter(coachregistration__isnull=False, coachregistration__is_accompanying_coach=True)
|
return self.participants.filter(coachregistration__isnull=False, coachregistration__is_accompanying_coach=True)
|
||||||
@@ -219,7 +219,6 @@ class Team(models.Model):
|
|||||||
:return: The mailing list to contact the team members.
|
:return: The mailing list to contact the team members.
|
||||||
"""
|
"""
|
||||||
return f"equipe-{slugify(self.trigram)}@{settings.SYMPA_HOST}"
|
return f"equipe-{slugify(self.trigram)}@{settings.SYMPA_HOST}"
|
||||||
|
|
||||||
|
|
||||||
def create_mailing_list(self):
|
def create_mailing_list(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -251,9 +251,18 @@ class CoachRegistrationForm(forms.ModelForm):
|
|||||||
"""
|
"""
|
||||||
A coach can tell its professional activity.
|
A coach can tell its professional activity.
|
||||||
"""
|
"""
|
||||||
|
ACCOMPANYING_CONFIRM_CHOICES = [
|
||||||
|
("presence", _("I undertake to be present throughout the entire tournament weekend alongside the team (including overnight stays).")),
|
||||||
|
("rules", _("I undertake to respond to the team's (non-mathematical) problems and not to hesitate to discuss them with the tournament organisers, who will be able to help.")),
|
||||||
|
("cancelling", _("In case of absence, I undertake to notify the organisers as soon as possible, providing a replacement if possible.")),
|
||||||
|
]
|
||||||
|
|
||||||
|
confirm_accompanying = forms.MultipleChoiceField(
|
||||||
|
required=False,
|
||||||
|
widget=forms.CheckboxSelectMultiple,
|
||||||
|
choices=ACCOMPANYING_CONFIRM_CHOICES,
|
||||||
|
label=_("Responsabilities of accompanying coaches")
|
||||||
|
)
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
if not settings.SUGGEST_ANIMATH:
|
if not settings.SUGGEST_ANIMATH:
|
||||||
@@ -261,9 +270,21 @@ class CoachRegistrationForm(forms.ModelForm):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = CoachRegistration
|
model = CoachRegistration
|
||||||
fields = ('team', 'is_scientific_coach', 'is_accompanying_coach', 'gender', 'address', 'zip_code', 'city', 'country', 'phone_number',
|
fields = ('team', 'is_scientific_coach', 'is_accompanying_coach', 'confirm_accompanying', 'gender', 'address', 'zip_code', 'city', 'country', 'phone_number',
|
||||||
'last_degree', 'professional_activity', 'health_issues', 'housing_constraints',
|
'last_degree', 'professional_activity', 'health_issues', 'housing_constraints',
|
||||||
'give_contact_to_animath', 'email_confirmed')
|
'give_contact_to_animath', 'email_confirmed')
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
cleaned = super().clean()
|
||||||
|
if cleaned.get("is_accompanying_coach"):
|
||||||
|
selected = set(cleaned.get("confirm_accompanying") or [])
|
||||||
|
required = {key for key, _ in self.ACCOMPANYING_CONFIRM_CHOICES}
|
||||||
|
if selected != required:
|
||||||
|
self.add_error(
|
||||||
|
"confirm_accompanying",
|
||||||
|
_("Please tick all the required confirmations."),
|
||||||
|
)
|
||||||
|
return cleaned
|
||||||
|
|
||||||
|
|
||||||
class VolunteerRegistrationForm(forms.ModelForm):
|
class VolunteerRegistrationForm(forms.ModelForm):
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ from django.urls import reverse, reverse_lazy
|
|||||||
from django.utils import timezone, translation
|
from django.utils import timezone, translation
|
||||||
from django.utils.crypto import get_random_string
|
from django.utils.crypto import get_random_string
|
||||||
from django.utils.encoding import force_bytes
|
from django.utils.encoding import force_bytes
|
||||||
|
from django.utils.functional import lazy
|
||||||
|
from django.utils.html import format_html
|
||||||
from django.utils.http import urlsafe_base64_encode
|
from django.utils.http import urlsafe_base64_encode
|
||||||
from django.utils.text import format_lazy
|
from django.utils.text import format_lazy
|
||||||
from django.utils.timezone import localtime
|
from django.utils.timezone import localtime
|
||||||
@@ -22,7 +24,8 @@ from phonenumber_field.modelfields import PhoneNumberField
|
|||||||
from polymorphic.models import PolymorphicModel
|
from polymorphic.models import PolymorphicModel
|
||||||
from tfjm import helloasso
|
from tfjm import helloasso
|
||||||
from tfjm.tokens import email_validation_token
|
from tfjm.tokens import email_validation_token
|
||||||
from django.utils.html import format_html
|
|
||||||
|
format_html_lazy = lazy(format_html, str)
|
||||||
|
|
||||||
|
|
||||||
class Registration(PolymorphicModel):
|
class Registration(PolymorphicModel):
|
||||||
@@ -531,7 +534,7 @@ class CoachRegistration(ParticipantRegistration):
|
|||||||
is_scientific_coach = models.BooleanField(
|
is_scientific_coach = models.BooleanField(
|
||||||
default=False,
|
default=False,
|
||||||
verbose_name=_("Scientific coach"),
|
verbose_name=_("Scientific coach"),
|
||||||
help_text=format_html(
|
help_text=format_html_lazy(
|
||||||
'{} <a href="{}" target="_blank" rel="noopener">{}</a>.',
|
'{} <a href="{}" target="_blank" rel="noopener">{}</a>.',
|
||||||
_("Provides scientific guidance: methodology, content review, and project mentoring during the preparation phase."),
|
_("Provides scientific guidance: methodology, content review, and project mentoring during the preparation phase."),
|
||||||
"https://tfjm.org/wp-content/uploads/2024/01/note____l_intention_des_encadrants.pdf",
|
"https://tfjm.org/wp-content/uploads/2024/01/note____l_intention_des_encadrants.pdf",
|
||||||
@@ -542,9 +545,14 @@ class CoachRegistration(ParticipantRegistration):
|
|||||||
is_accompanying_coach = models.BooleanField(
|
is_accompanying_coach = models.BooleanField(
|
||||||
default=False,
|
default=False,
|
||||||
verbose_name=_("Accompanying coach"),
|
verbose_name=_("Accompanying coach"),
|
||||||
help_text=_("Accompanies the team during the weekend and stays for the entire tournament."),
|
help_text=format_html_lazy(
|
||||||
|
'{} <a href="{}" target="_blank" rel="noopener">{}</a>.',
|
||||||
|
_("Accompanies the team during the weekend and stays for the entire tournament."),
|
||||||
|
"https://tfjm.org/wp-content/uploads/2025/11/Fiches_pratiques_TFJM2.pdf",
|
||||||
|
_("see practical sheet"),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def type(self):
|
def type(self):
|
||||||
return _("coach")
|
return _("coach")
|
||||||
|
|||||||
@@ -51,15 +51,33 @@
|
|||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
let role_elem = document.getElementById("id_role")
|
let role_elem = document.getElementById("id_role")
|
||||||
|
|
||||||
|
function setup_requirements() {
|
||||||
|
const main = document.getElementById('id_is_accompanying_coach');
|
||||||
|
const group = document.getElementById('div_id_confirm_accompanying');
|
||||||
|
function toggle(){
|
||||||
|
if(main.checked) {
|
||||||
|
group.style.display = "block";
|
||||||
|
} else {
|
||||||
|
group.style.display = "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
main.addEventListener('change', toggle);
|
||||||
|
toggle();
|
||||||
|
}
|
||||||
|
|
||||||
function updateView () {
|
function updateView () {
|
||||||
let selected_role = role_elem.options[role_elem.selectedIndex].value
|
let selected_role = role_elem.options[role_elem.selectedIndex].value
|
||||||
if (selected_role === "participant")
|
if (selected_role === "participant")
|
||||||
document.getElementById("registration_form").innerHTML = document.getElementById("student_registration_form").innerHTML
|
document.getElementById("registration_form").innerHTML = document.getElementById("student_registration_form").innerHTML
|
||||||
else
|
else
|
||||||
document.getElementById("registration_form").innerHTML = document.getElementById("coach_registration_form").innerHTML
|
document.getElementById("registration_form").innerHTML = document.getElementById("coach_registration_form").innerHTML
|
||||||
|
setup_requirements();
|
||||||
}
|
}
|
||||||
role_elem.addEventListener('change', updateView)
|
role_elem.addEventListener('change', updateView)
|
||||||
updateView()
|
updateView()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
<div id="messages">
|
<div id="messages">
|
||||||
|
<div class="alert alert-info fade show" role="alert">
|
||||||
|
{% load i18n %}
|
||||||
|
<h2>{% trans "Dates pending" %}</h2>
|
||||||
|
|
||||||
|
<p>{% blocktrans %}Since the dates for the tournaments in Bordeaux, Strasbourg, Metz and Occitanie have not yet been set, we kindly invite the teams concerned to wait a little longer. If you wish, you may register for another tournament and send us an email to let us know of your interest; we will keep you informed as soon as the final dates are confirmed.
|
||||||
|
{% endblocktrans %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
{% for message in messages %}
|
{% for message in messages %}
|
||||||
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">
|
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||||
|
|||||||
Reference in New Issue
Block a user