mirror of
https://gitlab.crans.org/bde/nk20
synced 2025-09-04 10:20:07 +02:00
Compare commits
3 Commits
fd8cd0ff4e
...
wei
Author | SHA1 | Date | |
---|---|---|---|
|
034ad9a4ce | ||
|
897d37f74d | ||
|
55be3c9836 |
@@ -17,7 +17,7 @@ from ...models import WEIMembership, Bus
|
|||||||
|
|
||||||
WORDS = {
|
WORDS = {
|
||||||
'list': [
|
'list': [
|
||||||
'Fiesta', 'Graillance', 'Move it move it', 'Calme', 'Nert et geek', 'Jeux de rôles et danse rock',
|
'Fiesta', 'Graillance', 'Move it move it', 'Calme', 'Nerd 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',
|
||||||
@@ -27,41 +27,41 @@ WORDS = {
|
|||||||
"""Sur une échelle allant de 0 (= 0 alcool ou très peu) à 5 (= la fontaine de jouvence alcoolique),
|
"""Sur une échelle allant de 0 (= 0 alcool ou très peu) à 5 (= la fontaine de jouvence alcoolique),
|
||||||
quel niveau de consommation d’alcool souhaiterais-tu ?""",
|
quel niveau de consommation d’alcool souhaiterais-tu ?""",
|
||||||
{
|
{
|
||||||
42: "",
|
42: 4,
|
||||||
47: "",
|
47: 1,
|
||||||
48: "",
|
48: 3,
|
||||||
45: "",
|
45: 3.5,
|
||||||
44: "",
|
44: 4,
|
||||||
46: "",
|
46: 5,
|
||||||
43: "",
|
43: 3,
|
||||||
49: ""
|
49: 3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"voie_post_bac": [
|
"voie_post_bac": [
|
||||||
"""Si la DA du bus de ton choix correspondait à une voie post-bac, laquelle serait-elle ?""",
|
"""Si la DA du bus de ton choix correspondait à une voie post-bac, laquelle serait-elle ?""",
|
||||||
{
|
{
|
||||||
42: "",
|
42: "Double licence cuisine/arts du cirque option burger",
|
||||||
47: "",
|
47: "BTS Exploration de donjon",
|
||||||
48: "",
|
48: "Ecole des stars en herbe",
|
||||||
45: "",
|
45: "Déscolarisation précoce",
|
||||||
44: "",
|
44: "Rattrapage pour excès de kiff",
|
||||||
46: "",
|
46: "Double cursus STAPS / Licence d’histoire",
|
||||||
43: "",
|
43: "Recherche active d’un sugar daddy/d’un sugar mommy",
|
||||||
49: ""
|
49: "Licence de musicologie"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"boite": [
|
"boite": [
|
||||||
"""Tu es seul·e sur une île déserte et devant toi il y a une sombre boîte de taille raisonnable.
|
"""Tu es seul·e sur une île déserte et devant toi il y a une sombre boîte de taille raisonnable.
|
||||||
Qu’y a-t-il à l’intérieur ?""",
|
Qu’y a-t-il à l’intérieur ?""",
|
||||||
{
|
{
|
||||||
42: "",
|
42: "Un burgouzz de valouzz",
|
||||||
47: "",
|
47: "Un ocarina (pour me téléporter hors de ce bourbier)",
|
||||||
48: "",
|
48: "Des paillettes, un micro de karaoké et une enceinte bluetooth",
|
||||||
45: "",
|
45: "Un kebab",
|
||||||
44: "",
|
44: "Une 86 et un caisson pour taper du pied",
|
||||||
46: "",
|
46: "Une épée, un ballon et une tireuse",
|
||||||
43: "",
|
43: "Des lunettes de soleil",
|
||||||
49: ""
|
49: "Mon instrument de musique"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tardif": [
|
"tardif": [
|
||||||
@@ -69,42 +69,42 @@ WORDS = {
|
|||||||
qu’après tout, il n’y a plus personne sur la plage à cette heure-ci. Tu n’habites pas loin mais t’enchaînes
|
qu’après tout, il n’y a plus personne sur la plage à cette heure-ci. Tu n’habites pas loin mais t’enchaînes
|
||||||
demain avec une journée similaire avec un autre groupe d’amis parce que t’es trop #busy. Que fais-tu ?""",
|
demain avec une journée similaire avec un autre groupe d’amis parce que t’es trop #busy. Que fais-tu ?""",
|
||||||
{
|
{
|
||||||
42: "",
|
42: "On veut se déchaîner toute la nuit !!",
|
||||||
47: "",
|
47: "Je prends une glace et chill un moment avant d’aller dormir",
|
||||||
48: "",
|
48: "J’enfile mes boogie shoes pour enflammer le dancefloor avec elleux et lancer un concours de slay, le perdant finit la bouteille de rhum",
|
||||||
45: "",
|
45: "La fête continuuuuue",
|
||||||
44: "",
|
44: "Soirée sangria plage → boîte → lever de soleil sur la plage",
|
||||||
46: "",
|
46: "Minuit ? C’est l’heure du genepi. On commence les alcools forts !!",
|
||||||
43: "",
|
43: "T’enchaînes direct (faut pas les priver de ta présence)",
|
||||||
49: ""
|
49: "On continue en mode chill (soirée potins)"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"cohesion": [
|
"cohesion": [
|
||||||
"""C’est la rentrée de Seconde et tu découvres ta classe, tes camarades et ta prof principale!!!
|
"""C’est la rentrée de Seconde et tu découvres ta classe, tes camarades et ta prof principale!!!
|
||||||
qui vous propose une activité de cohésion. Laquelle est-elle ?""",
|
qui vous propose une activité de cohésion. Laquelle est-elle ?""",
|
||||||
{
|
{
|
||||||
42: "",
|
42: "Un relais cubi en ventriglisse",
|
||||||
47: "",
|
47: "Un jeu de rôle",
|
||||||
48: "",
|
48: "Organiser la soirée de l’année dans le lycée. Le thème : SLAY (Spotlight, Love, Amaze/All-night, Yeah), paillettes, disco",
|
||||||
45: "",
|
45: "La prof de français propose un slam parce qu'elle pense que c'est du rap littéraire qui fera plaisir aux élèves",
|
||||||
44: "",
|
44: "P’tit escape game + apéro",
|
||||||
46: "",
|
46: "Joute avec des boucliers Gilbert",
|
||||||
43: "",
|
43: "Tournage d’un clip de confessions nocturnes de Diam’s",
|
||||||
49: ""
|
49: "Je sais pas j’ai raté mon BAFA"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"artiste": [
|
"artiste": [
|
||||||
"""C’est l’été et la saison des festivals a commencé. Tu regardes la programmation du festival
|
"""C’est l’été et la saison des festivals a commencé. Tu regardes la programmation du festival
|
||||||
pas loin de chez toi et tu découvres avec joie la présence d’un·e artiste. De qui s’agit-il ?""",
|
pas loin de chez toi et tu découvres avec joie la présence d’un·e artiste. De qui s’agit-il ?""",
|
||||||
{
|
{
|
||||||
42: "",
|
42: "Moto-Moto (il chantera son fameux tube “je les aime grosses, je les aime bombées”)",
|
||||||
47: "",
|
47: "Hatsune Miku",
|
||||||
48: "",
|
48: "Rihanna",
|
||||||
45: "",
|
45: "Vald",
|
||||||
44: "",
|
44: "Qui connaît vraiment les noms des artistes de tech ?",
|
||||||
46: "",
|
46: "Perceval",
|
||||||
43: "",
|
43: "Fatal bazooka",
|
||||||
49: ""
|
49: "Måneskin"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"annonce_noel": [
|
"annonce_noel": [
|
||||||
@@ -112,61 +112,103 @@ WORDS = {
|
|||||||
D’un coup, tu te lèves, tapotes de manière pompeuse sur ton verre avec un de tes couverts.
|
D’un coup, tu te lèves, tapotes de manière pompeuse sur ton verre avec un de tes couverts.
|
||||||
Qu’annonces-tu ?""",
|
Qu’annonces-tu ?""",
|
||||||
{
|
{
|
||||||
42: "",
|
42: """« Chère famille. Je sais bien que nous avions dit : pas de politique à table.
|
||||||
47: "",
|
Je ne peux toutefois me retenir de vous annoncer une grande nouvelle…
|
||||||
48: "",
|
j’ai décidé de quitter la ville pour consacrer ma vie au culte du Roi Julian.
|
||||||
45: "",
|
A moi la jungle luxuriante, là où le soleil chaud caresse les palmiers,
|
||||||
44: "",
|
où les lémuriens dansent avec frénésie et où chaque repas est une ode au burger sauvage.
|
||||||
46: "",
|
Longue vie à Sa Majesté le Roi Julian ! »""",
|
||||||
43: "",
|
47: "« J’ai perdu »",
|
||||||
49: ""
|
48: "« Mes chers parents je pars, j’arrête l’ENS pour devenir DJ slay à Ibiza »",
|
||||||
|
45: "J’interromps le repas pour rapper les 6min de bande organisée",
|
||||||
|
44: "« Digestif ? Pétanque ? Les deux ? »",
|
||||||
|
46: "« Montjoie St Denis à bas la Macronie »",
|
||||||
|
43: "« Je suis enceinte » (c’est faux j’ai juste besoin d’attention)",
|
||||||
|
49: """Discours de remerciement :
|
||||||
|
je lance un powerpoint de 65 slides et sors une feuille A4 blanche (je fais semblant de lire mon discours dessus)"""
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"vacances": [
|
"vacances": [
|
||||||
"""Les vacances sont là et t’aimerais bien partir quelque part, mais où ?""",
|
"""Les vacances sont là et t’aimerais bien partir quelque part, mais où ?""",
|
||||||
{
|
{
|
||||||
42: "",
|
42: "A Madagascar, à bord d’un bus conduit par des pingouins",
|
||||||
47: "",
|
47: "Dans ma chambre",
|
||||||
48: "",
|
48: "Rio de Janeiro",
|
||||||
45: "",
|
45: "N'importe où tant qu'on peut sortir tous les soirs",
|
||||||
44: "",
|
44: "Tu suis les plans du club ski ou de piratens",
|
||||||
46: "",
|
46: "Carcassonne",
|
||||||
43: "",
|
43: "Coachella",
|
||||||
49: ""
|
49: "Dans les montagnes de la république populaire d’Auvergne-Rhônes-Alpes pour profiter de la fraîcheur, de la nature et de mes ami·e·s"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"loisir": [
|
"loisir": [
|
||||||
"""T’as fini ta journée de cours et tu t’apprêtes à profiter d’une activité/hobby/loisir de ton choix.
|
"""T’as fini ta journée de cours et tu t’apprêtes à profiter d’une activité/hobby/loisir de ton choix.
|
||||||
Laquelle est-ce ?""",
|
Laquelle est-ce ?""",
|
||||||
{
|
{
|
||||||
42: "",
|
42: "Cueillir des noix de coco",
|
||||||
47: "",
|
47: "Essayer de travailler puis chill avec des potes autour d’un jeu en buvant du thé",
|
||||||
48: "",
|
48: "Repet du nouveau spectacle de mon club, before (potins) puis sortie avec les potes jusqu’au bout de la night",
|
||||||
45: "",
|
45: "Zoner avec les copaings jusqu’à pas d’heure",
|
||||||
44: "",
|
44: "Go Kfet pour se faire traquenard jusqu’à 3h du mat",
|
||||||
46: "",
|
46: "Déterminer ce qui est le plus solide entre mon crâne et une ecocup",
|
||||||
43: "",
|
43: "Revoir pour la 6e fois gossip girl au fond de ton lit",
|
||||||
49: ""
|
49: "Jouer de mon instrument préféré avec les copains/copines pour préparer le prochain concert #solidays"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"plan": [
|
"plan": [
|
||||||
"""Tu reçois un message sur la conversation de groupe que tu partages avec tes potes :
|
"""Tu reçois un message sur la conversation de groupe que tu partages avec tes potes :
|
||||||
vous êtes chaud·e·s pour vous retrouver. Quel plan t’attire le plus ?""",
|
vous êtes chaud·e·s pour vous retrouver. Quel plan t’attire le plus ?""",
|
||||||
{
|
{
|
||||||
42: "",
|
42: """Après-midi piscine, puis before arrosé de mojito,
|
||||||
47: "",
|
avant d’aller s’éclater en pot avec toute la savane et de finir sur un after spécial pina colada""",
|
||||||
48: "",
|
47: """(matin) : Ptit jeu de rôle
|
||||||
45: "",
|
(repas) : le traditionnel poké-tacos
|
||||||
44: "",
|
(juste après le repas) : combat avec des épées en mousse avec les copains!
|
||||||
46: "",
|
(16h00) : pause thé
|
||||||
43: "",
|
(fin d’après midi) : initiation à la danse rock
|
||||||
49: ""
|
(soirée) : découverte d’un jeu de société avec des règles obscures
|
||||||
|
""",
|
||||||
|
48: "Soirée champagne and chic : spectacle et dîner au moulin rouge puis soirée sur les champs",
|
||||||
|
45: "Se regrouper pour une soirée, même si il n’est encore que 10h",
|
||||||
|
44: "P’tit poké qui termine en koin koin avec after poker",
|
||||||
|
46: "Une dégustation de bière, un rugby et toute autre activité joviale",
|
||||||
|
43: "Un brunch de pour papoter puis friperies",
|
||||||
|
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 = {
|
||||||
|
"vacances": {
|
||||||
|
49: "/static/wei/img/logo_auvergne_rhone_alpes.jpg",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NB_WORDS = 5
|
NB_WORDS = 5
|
||||||
@@ -219,7 +261,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]
|
||||||
else:
|
elif information.step <= len(WORDS['questions']):
|
||||||
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):
|
||||||
@@ -235,6 +277,15 @@ 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']
|
||||||
@@ -361,7 +412,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()
|
||||||
else:
|
elif 1 <= self.information.step <= len(WORDS['questions']):
|
||||||
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):
|
||||||
@@ -369,6 +420,13 @@ 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):
|
||||||
@@ -378,7 +436,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'])
|
return self.information.step > len(WORDS['questions']) + 1
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@lru_cache()
|
@lru_cache()
|
||||||
|
BIN
apps/wei/static/wei/img/logo_auvergne_rhone_alpes.jpg
Normal file
BIN
apps/wei/static/wei/img/logo_auvergne_rhone_alpes.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
@@ -37,11 +37,13 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
|
{% if registration.validated %}
|
||||||
<a class="btn btn-warning" href="{% url "wei:wei_update_registration" pk=my_registration.pk %}"
|
<a class="btn btn-warning" href="{% url "wei:wei_update_registration" pk=my_registration.pk %}"
|
||||||
data-turbolinks="false">
|
data-turbolinks="false">
|
||||||
{% trans "Update my registration" %}
|
{% trans "Update my registration" %}
|
||||||
</a>
|
</a>
|
||||||
{% if not not_first_year %}
|
{% endif %}
|
||||||
|
{% if my_registration.first_year %}
|
||||||
{% if not survey_complete %}
|
{% if not survey_complete %}
|
||||||
<a class="btn btn-warning" href="{% url "wei:wei_survey" pk=my_registration.pk %}" data-turbolinks="false">
|
<a class="btn btn-warning" href="{% url "wei:wei_survey" pk=my_registration.pk %}" data-turbolinks="false">
|
||||||
{% trans "Continue survey" %}
|
{% trans "Continue survey" %}
|
||||||
|
@@ -53,9 +53,11 @@ class TestWEIAlgorithm(TestCase):
|
|||||||
birth_date='2000-01-01',
|
birth_date='2000-01-01',
|
||||||
)
|
)
|
||||||
information = WEISurveyInformation2025(registration)
|
information = WEISurveyInformation2025(registration)
|
||||||
for j in range(1, 21):
|
for j in range(1, 1 + NB_WORDS):
|
||||||
setattr(information, f'word{j}', random.choice(WORDS['list']))
|
setattr(information, f'word{j}', random.choice(WORDS['list']))
|
||||||
information.step = 20
|
for q in WORDS['questions']:
|
||||||
|
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()
|
||||||
|
|
||||||
@@ -87,7 +89,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']) + 1
|
information.step = len(WORDS['questions']) + 2
|
||||||
information.save(registration)
|
information.save(registration)
|
||||||
registration.save()
|
registration.save()
|
||||||
survey = WEISurvey2025(registration)
|
survey = WEISurvey2025(registration)
|
||||||
|
@@ -214,6 +214,8 @@ class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, D
|
|||||||
|
|
||||||
context["not_first_year"] = WEIMembership.objects.filter(user=self.request.user).exists()
|
context["not_first_year"] = WEIMembership.objects.filter(user=self.request.user).exists()
|
||||||
|
|
||||||
|
context["registration_validated"] = WEIMembership.objects.filter(registration=my_registration).exists() if my_registration else False
|
||||||
|
|
||||||
qs = WEIMembership.objects.filter(club=club, registration__first_year=True, bus__isnull=True)
|
qs = WEIMembership.objects.filter(club=club, registration__first_year=True, bus__isnull=True)
|
||||||
context["can_validate_1a"] = PermissionBackend.check_perm(
|
context["can_validate_1a"] = PermissionBackend.check_perm(
|
||||||
self.request, "wei.change_weimembership_bus", qs.first()) if qs.exists() else False
|
self.request, "wei.change_weimembership_bus", qs.first()) if qs.exists() else False
|
||||||
|
Reference in New Issue
Block a user