mirror of
https://gitlab.crans.org/bde/nk20
synced 2025-09-26 03:18:19 +02:00
Compare commits
1 Commits
c4eea0be5e
...
717501bdd7
Author | SHA1 | Date | |
---|---|---|---|
|
717501bdd7 |
@@ -1,8 +1,6 @@
|
|||||||
# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
|
# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
|
|
||||||
|
|
||||||
def save_user_profile(instance, created, raw, **_kwargs):
|
def save_user_profile(instance, created, raw, **_kwargs):
|
||||||
"""
|
"""
|
||||||
@@ -18,7 +16,7 @@ def save_user_profile(instance, created, raw, **_kwargs):
|
|||||||
|
|
||||||
|
|
||||||
def update_wei_registration_fee_on_membership_creation(sender, instance, created, **kwargs):
|
def update_wei_registration_fee_on_membership_creation(sender, instance, created, **kwargs):
|
||||||
if not hasattr(instance, "_no_signal") and 'wei' in settings.INSTALLED_APPS and created:
|
if not hasattr(instance, "_no_signal") and created:
|
||||||
from wei.models import WEIRegistration
|
from wei.models import WEIRegistration
|
||||||
if instance.club.id == 1 or instance.club.id == 2:
|
if instance.club.id == 1 or instance.club.id == 2:
|
||||||
registrations = WEIRegistration.objects.filter(
|
registrations = WEIRegistration.objects.filter(
|
||||||
@@ -31,8 +29,8 @@ def update_wei_registration_fee_on_membership_creation(sender, instance, created
|
|||||||
|
|
||||||
|
|
||||||
def update_wei_registration_fee_on_club_change(sender, instance, **kwargs):
|
def update_wei_registration_fee_on_club_change(sender, instance, **kwargs):
|
||||||
if not hasattr(instance, "_no_signal") and 'wei' in settings.INSTALLED_APPS and (instance.id == 1 or instance.id == 2):
|
from wei.models import WEIRegistration
|
||||||
from wei.models import WEIRegistration
|
if not hasattr(instance, "_no_signal") and (instance.id == 1 or instance.id == 2):
|
||||||
registrations = WEIRegistration.objects.filter(
|
registrations = WEIRegistration.objects.filter(
|
||||||
wei__year=instance.membership_start.year,
|
wei__year=instance.membership_start.year,
|
||||||
)
|
)
|
||||||
|
@@ -7,7 +7,6 @@
|
|||||||
<dt class="col-xl-6">{% trans 'username'|capfirst %}</dt>
|
<dt class="col-xl-6">{% trans 'username'|capfirst %}</dt>
|
||||||
<dd class="col-xl-6">{{ user_object.username }}</dd>
|
<dd class="col-xl-6">{{ user_object.username }}</dd>
|
||||||
|
|
||||||
{% if family_app_installed %}
|
|
||||||
<dt class="col-xl-6">{% trans 'family'|capfirst %}</dt>
|
<dt class="col-xl-6">{% trans 'family'|capfirst %}</dt>
|
||||||
<dd class="col-xl-6">
|
<dd class="col-xl-6">
|
||||||
{% if families %}
|
{% if families %}
|
||||||
@@ -18,7 +17,6 @@
|
|||||||
<span class="text-muted">Aucune</span>
|
<span class="text-muted">Aucune</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</dd>
|
</dd>
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if user_object.pk == user.pk %}
|
{% if user_object.pk == user.pk %}
|
||||||
<dt class="col-xl-6">{% trans 'password'|capfirst %}</dt>
|
<dt class="col-xl-6">{% trans 'password'|capfirst %}</dt>
|
||||||
|
@@ -207,10 +207,9 @@ class UserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
|
|||||||
modified_note.is_active = True
|
modified_note.is_active = True
|
||||||
context["can_unlock_note"] = not user.note.is_active and PermissionBackend\
|
context["can_unlock_note"] = not user.note.is_active and PermissionBackend\
|
||||||
.check_perm(self.request, "note.change_noteuser_is_active", modified_note)
|
.check_perm(self.request, "note.change_noteuser_is_active", modified_note)
|
||||||
if 'family' in settings.INSTALLED_APPS:
|
|
||||||
context["family_app_installed"] = True
|
families = Family.objects.filter(memberships__user=user).distinct()
|
||||||
families = Family.objects.filter(memberships__user=user).distinct()
|
context["families"] = families
|
||||||
context["families"] = families
|
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
@@ -17,7 +17,7 @@ from ...models import WEIMembership, Bus
|
|||||||
|
|
||||||
WORDS = {
|
WORDS = {
|
||||||
'list': [
|
'list': [
|
||||||
'Fiesta', 'Graillance', 'Move it move it', 'Calme', 'Nerd et geek', 'Jeux de rôles et danse rock',
|
'Fiesta', 'Graillance', 'Move it move it', 'Calme', 'Nert et geek', 'Jeux de rôles et danse rock',
|
||||||
'Strass et paillettes', 'Spectaculaire', 'Splendide', 'Flow inégalable', 'Rap', 'Battles légendaires',
|
'Strass et paillettes', 'Spectaculaire', 'Splendide', 'Flow inégalable', 'Rap', 'Battles légendaires',
|
||||||
'Techno', 'Alcool', 'Kiffeur·euse', 'Rugby', 'Médiéval', 'Festif',
|
'Techno', 'Alcool', 'Kiffeur·euse', 'Rugby', 'Médiéval', 'Festif',
|
||||||
'Stylé', 'Chipie', 'Rétro', 'Vache', 'Farfadet', 'Fanfare',
|
'Stylé', 'Chipie', 'Rétro', 'Vache', 'Farfadet', 'Fanfare',
|
||||||
@@ -57,7 +57,7 @@ WORDS = {
|
|||||||
42: "Un burgouzz de valouzz",
|
42: "Un burgouzz de valouzz",
|
||||||
47: "Un ocarina (pour me téléporter hors de ce bourbier)",
|
47: "Un ocarina (pour me téléporter hors de ce bourbier)",
|
||||||
48: "Des paillettes, un micro de karaoké et une enceinte bluetooth",
|
48: "Des paillettes, un micro de karaoké et une enceinte bluetooth",
|
||||||
45: "Un kebab",
|
45: "",
|
||||||
44: "Une 86 et un caisson pour taper du pied",
|
44: "Une 86 et un caisson pour taper du pied",
|
||||||
46: "Une épée, un ballon et une tireuse",
|
46: "Une épée, un ballon et une tireuse",
|
||||||
43: "Des lunettes de soleil",
|
43: "Des lunettes de soleil",
|
||||||
@@ -176,33 +176,7 @@ WORDS = {
|
|||||||
49: "Soirée raclette !"
|
49: "Soirée raclette !"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
'stats': [
|
|
||||||
{
|
|
||||||
"question": """Le WEI est structuré par bus, et au sein de chaque bus, par équipes.
|
|
||||||
Pour toi, être dans une équipe où tout le monde reste sobre (primo-entrants comme encadrants) c'est :""",
|
|
||||||
"answers": [
|
|
||||||
(1, "Inenvisageable"),
|
|
||||||
(2, "À contre cœur"),
|
|
||||||
(3, "Pourquoi pas"),
|
|
||||||
(4, "Souhaitable"),
|
|
||||||
(5, "Nécessaire"),
|
|
||||||
],
|
|
||||||
"help_text": "(De toute façon aucun alcool n'est consommé pendant les trajets du bus, ni aller, ni retour.)",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"question": "Faire partie d'un bus qui n'apporte pas de boisson alcoolisée pour ses membres, pour toi c'est :",
|
|
||||||
"answers": [
|
|
||||||
(1, "Inenvisageable"),
|
|
||||||
(2, "À contre cœur"),
|
|
||||||
(3, "Pourquoi pas"),
|
|
||||||
(4, "Souhaitable"),
|
|
||||||
(5, "Nécessaire"),
|
|
||||||
],
|
|
||||||
"help_text": """(Tout les bus apportent de l'alcool cette année, cette question sert à l'organisation pour l'année prochaine.
|
|
||||||
De plus il y aura de toute façon de l'alcool commun au WEI et aucun alcool n'est consommé pendant les trajets en bus.)""",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IMAGES = {
|
IMAGES = {
|
||||||
@@ -261,7 +235,7 @@ class WEISurveyForm2025(forms.Form):
|
|||||||
all_preferred_words = WORDS['list']
|
all_preferred_words = WORDS['list']
|
||||||
rng.shuffle(all_preferred_words)
|
rng.shuffle(all_preferred_words)
|
||||||
self.fields["words"].choices = [(w, w) for w in all_preferred_words]
|
self.fields["words"].choices = [(w, w) for w in all_preferred_words]
|
||||||
elif information.step <= len(WORDS['questions']):
|
else:
|
||||||
questions = list(WORDS['questions'].items())
|
questions = list(WORDS['questions'].items())
|
||||||
idx = information.step - 1
|
idx = information.step - 1
|
||||||
if idx < len(questions):
|
if idx < len(questions):
|
||||||
@@ -277,15 +251,6 @@ class WEISurveyForm2025(forms.Form):
|
|||||||
widget=OptionalImageRadioSelect(images=IMAGES.get(q, {})),
|
widget=OptionalImageRadioSelect(images=IMAGES.get(q, {})),
|
||||||
required=True,
|
required=True,
|
||||||
)
|
)
|
||||||
elif information.step == len(WORDS['questions']) + 1:
|
|
||||||
for i, v in enumerate(WORDS['stats']):
|
|
||||||
self.fields[f'stat_{i}'] = forms.ChoiceField(
|
|
||||||
label=v['question'],
|
|
||||||
choices=v['answers'],
|
|
||||||
widget=forms.RadioSelect(),
|
|
||||||
required=False,
|
|
||||||
help_text=_(v.get('help_text', ''))
|
|
||||||
)
|
|
||||||
|
|
||||||
def clean_words(self):
|
def clean_words(self):
|
||||||
data = self.cleaned_data['words']
|
data = self.cleaned_data['words']
|
||||||
@@ -412,7 +377,7 @@ class WEISurvey2025(WEISurvey):
|
|||||||
setattr(self.information, "word" + str(i), word)
|
setattr(self.information, "word" + str(i), word)
|
||||||
self.information.step += 1
|
self.information.step += 1
|
||||||
self.save()
|
self.save()
|
||||||
elif 1 <= self.information.step <= len(WORDS['questions']):
|
else:
|
||||||
questions = list(WORDS['questions'].keys())
|
questions = list(WORDS['questions'].keys())
|
||||||
idx = self.information.step - 1
|
idx = self.information.step - 1
|
||||||
if idx < len(questions):
|
if idx < len(questions):
|
||||||
@@ -420,13 +385,6 @@ class WEISurvey2025(WEISurvey):
|
|||||||
setattr(self.information, q, form.cleaned_data[q])
|
setattr(self.information, q, form.cleaned_data[q])
|
||||||
self.information.step += 1
|
self.information.step += 1
|
||||||
self.save()
|
self.save()
|
||||||
else:
|
|
||||||
for i, __ in enumerate(WORDS['stats']):
|
|
||||||
ans = form.cleaned_data.get(f'stat_{i}')
|
|
||||||
if ans is not None:
|
|
||||||
setattr(self.information, f'stat_{i}', ans)
|
|
||||||
self.information.step += 1
|
|
||||||
self.save()
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_algorithm_class(cls):
|
def get_algorithm_class(cls):
|
||||||
@@ -436,7 +394,7 @@ class WEISurvey2025(WEISurvey):
|
|||||||
"""
|
"""
|
||||||
The survey is complete once the bus is chosen.
|
The survey is complete once the bus is chosen.
|
||||||
"""
|
"""
|
||||||
return self.information.step > len(WORDS['questions']) + 1
|
return self.information.step > len(WORDS['questions'])
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@lru_cache()
|
@lru_cache()
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 34 KiB |
@@ -53,11 +53,9 @@ class TestWEIAlgorithm(TestCase):
|
|||||||
birth_date='2000-01-01',
|
birth_date='2000-01-01',
|
||||||
)
|
)
|
||||||
information = WEISurveyInformation2025(registration)
|
information = WEISurveyInformation2025(registration)
|
||||||
for j in range(1, 1 + NB_WORDS):
|
for j in range(1, 21):
|
||||||
setattr(information, f'word{j}', random.choice(WORDS['list']))
|
setattr(information, f'word{j}', random.choice(WORDS['list']))
|
||||||
for q in WORDS['questions']:
|
information.step = 20
|
||||||
setattr(information, q, random.choice(list(WORDS['questions'][q][1].keys())))
|
|
||||||
information.step = len(WORDS['questions']) + 2
|
|
||||||
information.save(registration)
|
information.save(registration)
|
||||||
registration.save()
|
registration.save()
|
||||||
|
|
||||||
@@ -89,7 +87,7 @@ class TestWEIAlgorithm(TestCase):
|
|||||||
setattr(information, f'word{j}', random.choice(WORDS['list']))
|
setattr(information, f'word{j}', random.choice(WORDS['list']))
|
||||||
for q in WORDS['questions']:
|
for q in WORDS['questions']:
|
||||||
setattr(information, q, random.choice(list(WORDS['questions'][q][1].keys())))
|
setattr(information, q, random.choice(list(WORDS['questions'][q][1].keys())))
|
||||||
information.step = len(WORDS['questions']) + 2
|
information.step = len(WORDS['questions']) + 1
|
||||||
information.save(registration)
|
information.save(registration)
|
||||||
registration.save()
|
registration.save()
|
||||||
survey = WEISurvey2025(registration)
|
survey = WEISurvey2025(registration)
|
||||||
|
@@ -770,7 +770,7 @@ msgstr "Créer une famille ou un défi"
|
|||||||
|
|
||||||
#: apps/family/templates/family/manage.html:96
|
#: apps/family/templates/family/manage.html:96
|
||||||
msgid "Add a family"
|
msgid "Add a family"
|
||||||
msgstr "Fonder une famille"
|
msgstr "Ajouter une famille"
|
||||||
|
|
||||||
#: apps/family/templates/family/manage.html:101
|
#: apps/family/templates/family/manage.html:101
|
||||||
msgid "Add a challenge"
|
msgid "Add a challenge"
|
||||||
|
Reference in New Issue
Block a user