From 9596aa7b8cc990884924df67112d38d31995ae0a Mon Sep 17 00:00:00 2001 From: bleizi Date: Sat, 26 Aug 2023 17:52:48 +0200 Subject: [PATCH] base for questions instead of words --- apps/wei/forms/surveys/wei2023.py | 103 ++++++++++++++++-------------- 1 file changed, 54 insertions(+), 49 deletions(-) diff --git a/apps/wei/forms/surveys/wei2023.py b/apps/wei/forms/surveys/wei2023.py index bf010108..d8479155 100644 --- a/apps/wei/forms/surveys/wei2023.py +++ b/apps/wei/forms/surveys/wei2023.py @@ -13,31 +13,43 @@ from django.utils.translation import gettext_lazy as _ from .base import WEISurvey, WEISurveyInformation, WEISurveyAlgorithm, WEIBusInformation from ...models import WEIMembership -WORDS = [ - 'ABBA', 'After', 'Alcoolique anonyme', 'Ambiance festive', 'Années 2000', 'Apéro', 'Art', - 'Baby foot billard biere pong', 'BBQ', 'Before', 'Bière pong', 'Bon enfant', 'Calme', 'Canapé', - 'Chanson paillarde', 'Chanson populaire', 'Chartreuse', 'Cheerleader', 'Chill', 'Choré', - 'Cinéma', 'Cocktail', 'Comédie musicle', 'Commercial', 'Copaing', 'Danse', 'Dancefloor', - 'Electro', 'Fanfare', 'Gin tonic', 'Inclusif', 'Jazz', "Jeux d'alcool", 'Jeux de carte', - 'Jeux de rôle', 'Jeux de société', 'JUL', 'Jus de fruit', 'Kfet', 'Kleptomanie assurée', - 'LGBTQ+', 'Livre', 'Morning beer', 'Musique', 'NAPS', 'Paillettes', 'Pastis', 'Paté Hénaff', - 'Peluche', 'Pena baiona', "Peu d'alcool", 'Pilier de bar', 'PMU', 'Poulpe', 'Punch', 'Rap', - 'Réveil', 'Rock', 'Rugby', 'Sandwich', 'Serge', 'Shot', 'Sociable', 'Spectacle', 'Techno', - 'Techno house', 'Thérapie Taxi', 'Tradition kchanaises', 'Troisième mi-temps', 'Turn up', - 'Vodka', 'Vodka pomme', 'Volley', 'Vomi stratégique' -] +WORDS = { + "ambiance":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "musique":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "boisson":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "beauferie":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "sommeil":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "vacances":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "activite":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "hygiene":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "animal":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "fensfoire":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "kokarde":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "copain":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "vie":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "jeux":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "calin":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "vommi":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "kfet":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "fatigue":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "duree trajet":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}], + "scolarite":["Question", {1:"réponse 1", 2:"réponse 2", 3:"réponse 3", 4:"réponse 4", 5:"réponse 5"}] +} class WEISurveyForm2023(forms.Form): """ Survey form for the year 2023. - Members choose 20 words, from which we calculate the best associated bus. + Members answer 20 question, from which we calculate the best associated bus. """ - word = forms.ChoiceField( - label=_("Choose a word:"), - widget=forms.RadioSelect(), - ) + def __init__(self,**kwargs): + super().__init__(**kwargs) + for question in WORDS: + self.fields[question] = forms.ChoiceField( + label=WORDS[question][0]+question, + widget=forms.RadioSelect(), + ) def set_registration(self, registration): """ @@ -50,41 +62,32 @@ class WEISurveyForm2023(forms.Form): registration._force_save = True registration.save() - if self.data: - self.fields["word"].choices = [(w, w) for w in WORDS] - if self.is_valid(): - return +# if self.data: +# for question in WORDS: +# self.fields[question].choices = [answer for answer in WORDS[question][1]] +# if self.is_valid(): +# return - rng = Random((information.step + 1) * information.seed) +# rng = Random(information.seed) # add someting if it's alwais the same +# questions = list(WORDS.keys()) +# rng.shuffle(questions) - words = None - - buses = WEISurveyAlgorithm2023.get_buses() - informations = {bus: WEIBusInformation2023(bus) for bus in buses} - scores = sum((list(informations[bus].scores.values()) for bus in buses), []) - average_score = sum(scores) / len(scores) - - preferred_words = {bus: [word for word in WORDS - if informations[bus].scores[word] >= average_score] - for bus in buses} - while words is None or len(set(words)) != len(words): - # Ensure that there is no the same word 2 times - words = [rng.choice(words) for _ignored2, words in preferred_words.items()] - rng.shuffle(words) - words = [(w, w) for w in words] - self.fields["word"].choices = words +# for question in questions: + for question in WORDS: + answers = [(answer, WORDS[question][1][answer]) for answer in WORDS[question][1]] + self.fields[question].choices = answers class WEIBusInformation2023(WEIBusInformation): """ - For each word, the bus has a score + For each question, the bus has ordered answers """ scores: dict def __init__(self, bus): self.scores = {} - for word in WORDS: - self.scores[word] = 0.0 + for question in WORDS: + self.scores[question] = [] super().__init__(bus) @@ -95,11 +98,10 @@ class WEISurveyInformation2023(WEISurveyInformation): """ # Random seed that is stored at the first time to ensure that words are generated only once seed = 0 - step = 0 def __init__(self, registration): - for i in range(1, 21): - setattr(self, "word" + str(i), None) + for question in WORDS: + setattr(self, str(question), None) super().__init__(registration) @@ -127,9 +129,9 @@ class WEISurvey2023(WEISurvey): @transaction.atomic def form_valid(self, form): - word = form.cleaned_data["word"] - self.information.step += 1 - setattr(self.information, "word" + str(self.information.step), word) + for question in WORDS: + answer = form.cleaned_data[question] + setattr(self.information, question, answer) self.save() @classmethod @@ -140,7 +142,10 @@ class WEISurvey2023(WEISurvey): """ The survey is complete once the bus is chosen. """ - return self.information.step == 20 + for question in WORDS: + if not getattr(self.information, question): + return False + return True @classmethod @lru_cache()