from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import random import time class p1_instructions(Page): def is_displayed(self): return self.round_number == 1 def vars_for_template(self): self.participant.vars["start_time"] = time.time() # heure de démarrage de la manip print("START TIME " + str(self.participant.vars["start_time"])) # cette partie là n'existe plus parce qu'on passe en rooms # def before_next_page(self): # Save the cookie to be used in case the user disconnects # parti_url = self.request.build_absolute_uri(self.player.participant._start_url()) # self.request.session["otree"] = parti_url # self.request.session.set_expiry(5 * 60 * 60) # Set the cookie for 5 hours class p2_questions_1(Page): form_model = 'player' form_fields = ['Q1_age', 'Q2_sexe', 'Q3a_situationPro', 'Q3b_boursier', 'Q3c_travailEtudiant'] def is_displayed(self): return self.round_number == 1 def before_next_page(self): print("reponse question 3 : " + self.player.Q3a_situationPro) print('Questions subs : à la validation de la page :') print("reponse question 3 subs b : " + str(self.player.Q3b_boursier)) print("reponse question 3 subs c : " + str(self.player.Q3c_travailEtudiant)) if (self.player.Q3a_situationPro != 'étudiant.e, lycéen.ne, en formation ou en stage non rémunéré'): print('Questions subs corrigée en beforeNextPage :') self.player.Q3b_boursier = None self.player.Q3c_travailEtudiant = None print("reponse question 3 subs b : " + str(self.player.Q3b_boursier)) print("reponse question 3 subs c : " + str(self.player.Q3c_travailEtudiant)) class p3_questions_4(Page): form_model = 'player' form_fields = ['Q4_etatSante', 'Q5_maladieChronique', 'Q6_limitationSante', 'Q7_fumezVous'] def is_displayed(self): return self.round_number == 1 def before_next_page(self): # on s'ajoute un tag fumeur bien pratique pour la suite if (self.player.Q7_fumezVous == 'Oui'): self.participant.vars['fumeur'] = 1 print('Défini comme fumeur') elif (self.player.Q7_fumezVous == 'Non'): print('Défini comme NON fumeur') self.participant.vars['fumeur'] = 0 else: print('Attention pas de réponse enregistrée pour la question 7 : fumez-vous') class p4_questions_7_si_fumeur(Page): form_model = 'player' form_fields = ['Q7b1_tabac', 'Q7b2_paquet', 'Q7b3_cigarillos', 'Q7b4_cigares', 'Q7b5_pipe', 'Q7b6_chicha', 'Q7b_bis_age1st','Q7c_touslesjours'] def is_displayed(self): return ((self.participant.vars['fumeur'] == 1) and (self.round_number == 1)) class p4_questions_7_si_NON_fumeur(Page): form_model = 'player' form_fields = ['Q7z_dejaEssaye', 'Q7z_comment'] def is_displayed(self): return ((self.participant.vars['fumeur'] == 0) and (self.round_number == 1)) def before_next_page(self): if (self.player.Q7z_dejaEssaye == 'Non'): self.player.Q7z_comment = None print('Reponse a "avez vous déjà essayé : ' + str(self.player.Q7z_dejaEssaye)) print('Reponse a "comment avez vous fumé (possibilité de correction) : ' + str(self.player.Q7z_comment)) class p5_questions_7_si_touslesjours(Page): form_model = 'player' form_fields = ['Q7civ_annees_fumeur', 'Q7ci_nbCig', 'Q7cii_1ereCigReveil', 'Q7ciii_nbcig_7j'] def is_displayed(self): return ((self.player.Q7c_touslesjours == "Oui") and (self.round_number == 1)) class p6_questions_9_vap(Page): form_model = 'player' form_fields = ['Q9_vapoteur', 'Q9a_liquideNicotine'] def before_next_page(self): if (self.player.Q9_vapoteur == 'Non'): self.player.Q9a_liquideNicotine = None def is_displayed(self): return self.round_number == 1 class p7_questions_10(Page): form_model = 'player' form_fields = ['Q10_risquesGeneral', 'Q11_risquesSante', 'Q12_renoncerGeneral', 'Q13_renoncerSante'] def is_displayed(self): return self.round_number == 1 class p8_images_consigne(Page): def is_displayed(self): return self.round_number == 1 pass class p9_images_presentation(Page): timeout_seconds = Constants.imTime def is_displayed(self): return 1 <= self.round_number <= 5 def vars_for_template(self): return dict( currentImageName = self.participant.vars['imagesNames'][self.subsession.round_number-1], ) # def js_vars(self): # on envoie les choices names à remplacer dans le template # progressBar_size = str(Constants.imTime*10) # return dict(pBarSize = progressBar_size # ) class p10_taches_consignes(Page): def is_displayed(self): return self.round_number == 5 class p11_attention_tache_1(Page): form_model = 'player' form_fields = ['attentionQ1Paquets', 'attentionQ2Textes', 'attentionQ3Images', 'attentionQ4Marques'] def is_displayed(self): return str(self.round_number) == self.participant.vars['taskOrder'][0] class p11_reaction_tache_2(Page): form_model = 'player' form_fields = ['reactionQ1Reflechir', 'reactionQ2Peur', 'reactionQ3Credible', 'reactionQ4Colere', 'reactionQ5Envie', 'reactionQ6Penible'] def is_displayed(self): return str(self.round_number) == self.participant.vars['taskOrder'][1] class p11_croyance_tache_3(Page): form_model = 'player' def get_form_fields(self): if (self.participant.vars['fumeur'] == 1): return ['croyanceQ2Relaxer', 'croyanceQ2Stress', 'croyanceQ2Grossir', 'croyanceQ3Maladie', 'croyanceQ4SiQ7Oui'] elif (self.participant.vars['fumeur'] == 0): return ['croyanceQ2Relaxer', 'croyanceQ2Stress', 'croyanceQ2Grossir', 'croyanceQ3Maladie', 'croyanceQ4SiQ7Non'] def is_displayed(self): return str(self.round_number) == self.participant.vars['taskOrder'][2] class p11_intention_tache_4(Page): form_model = 'player' def get_form_fields(self): if (self.participant.vars['fumeur'] == 1): return ['intentionQ1SiQ7Oui'] elif (self.participant.vars['fumeur'] == 0): return ['intentionQ1SiQ7Non'] def is_displayed(self): return str(self.round_number) == self.participant.vars['taskOrder'][3] class p11_efficacite_tache_5(Page): form_model = 'player' def get_form_fields(self): if (self.participant.vars['fumeur'] == 1): return ['efficaciteQ1Commencer', 'efficaciteQ2Reduire', 'efficaciteQ3SiQ7Oui', 'efficaciteQ4AiderAutres'] elif (self.participant.vars['fumeur'] == 0): return ['efficaciteQ1Commencer', 'efficaciteQ2Reduire', 'efficaciteQ3SiQ7Non', 'efficaciteQ4AiderAutres'] def is_displayed(self): return str(self.round_number) == self.participant.vars['taskOrder'][4] class p12_dispo_payer_si_Q7Oui(Page): form_model = 'player' form_fields = ['dispPayFumeur1_0', 'dispPayFumeur1_1', 'dispPayFumeur1_2', 'dispPayFumeur1_3', 'dispPayFumeur1_4', 'dispPayFumeur1_5', 'dispPayFumeur1_6', 'dispPayFumeur1_7', 'dispPayFumeur1_8'] def before_next_page(self): #maintenant on calcule le point de bascule # et on s'ajoute un petit module pour calculer les images et les réponses possibles de la page suivabnte (comme ça elles ne changement pas quand on reload la page suivante) # on tire une image au sort self.player.phrase_rappel = random.choice([ "Fumer nuit à l'environnement", "Fumer coûte cher", "Fumer peut vous faire perdre la mémoire"]) self.player.marque_rappel = random.choice(['Dunhill', 'Chesterfield', 'Philip Morris']) self.player.memoire_image = random.randint(1,5) # on tire un nombre aléatoire enregistré directement self.player.dispoPay_2_Calculations_FUMEURS() # on tire aussi au sort directement la ligne chiffre_rand = random.randint(1,9) self.player.tirage = chiffre_rand def is_displayed(self): return (self.participant.vars['fumeur'] == 1 and self.round_number == 10) class p12_dispo_payer_si_Q7Non(Page): form_model = 'player' form_fields = ['dispPayNonFumeur1_0', 'dispPayNonFumeur1_1', 'dispPayNonFumeur1_2', 'dispPayNonFumeur1_3', 'dispPayNonFumeur1_4', 'dispPayNonFumeur1_5', 'dispPayNonFumeur1_6', 'dispPayNonFumeur1_7', 'dispPayNonFumeur1_8'] def before_next_page(self): #maintenant on calcule le point de bascule # et on s'ajoute un petit module pour calculer les images et les réponses possibles de la page suivabnte (comme ça elles ne changement pas quand on reload la page suivante) # on tire une image au sort self.player.phrase_rappel = random.choice([ "Fumer nuit à l'environnement", "Fumer coûte cher", "Fumer peut vous faire perdre la mémoire"]) self.player.marque_rappel = random.choice(['Dunhill', 'Chesterfield', 'Philip Morris']) self.player.memoire_image = random.randint(1,5) # on tire un nombre aléatoire enregistré directement # on tire aussi au sort directement la ligne chiffre_rand = random.randint(1,9) self.player.tirage = chiffre_rand self.player.dispoPay_2_Calculations_NON_FUMEURS() def is_displayed(self): return (self.participant.vars['fumeur'] == 0 and self.round_number == 10) class p13_dispo_payer_si_Q7Oui(Page): # dans cette page on règle en JS l'injection des nouvelles valeurs form_model = 'player' form_fields = ['dispPayFumeur2_0', 'dispPayFumeur2_1', 'dispPayFumeur2_2', 'dispPayFumeur2_3', 'dispPayFumeur2_4', 'dispPayFumeur2_5', 'dispPayFumeur2_6', 'dispPayFumeur2_7', 'dispPayFumeur2_8'] def js_vars(self): # on envoie les choices names à remplacer dans le template return dict( new_values = self.participant.vars['dispo2_labels'] # qui est calculé dans model dans le before next page de la page 12 si oui ) def before_next_page(self): # la c'est chaud new_values = self.participant.vars['dispo2_labels'] # toujours on récupère les new values for u in self.form_fields: # on regarde ce qu'il y a dans chaque field u_val = eval('self.player.' + str(u)) # on récupère la valeur if u_val[0].isdigit(): # et si c'est un digit au départ index_uval = int(u_val[0]) # récupération de l'index new_value = new_values[index_uval] # print('On a trouvé un digit uval (' + u_val[0] + ') donc on le remplace par ' + new_value) # maintenant il faut réussir à la mettre dans le bon emplacement :s # et là toute l'astuce consiste à n'avoir que des <'> dans la phrase à exécuter # s'il y a des <"> l'exec foire complètement expression_txt = 'self.player.' + str(u) + '= str(new_value)' # print(expression_txt) exec (expression_txt) def is_displayed(self): return ((self.participant.vars['fumeur'] == 1) and (self.round_number == 10) and not(self.player.dispPayFumeur1_0 == "0 Euro") and not(self.participant.vars['valeur_depart']==8)) class p13_dispo_payer_si_Q7Non(Page): form_model = 'player' form_fields = ['dispPayNonFumeur2_0', 'dispPayNonFumeur2_1', 'dispPayNonFumeur2_2', 'dispPayNonFumeur2_3', 'dispPayNonFumeur2_4', 'dispPayNonFumeur2_5', 'dispPayNonFumeur2_6', 'dispPayNonFumeur2_7', 'dispPayNonFumeur2_8'] def js_vars(self): # on envoie les choices names à remplacer dans le template return dict( new_values = self.participant.vars['dispo2_labels'] # qui est calculé dans model dans le before next page de la page 12 si oui ) def before_next_page(self): # la c'est chaud new_values = self.participant.vars['dispo2_labels'] # toujours on récupère les new values for u in self.form_fields: # on regarde ce qu'il y a dans chaque field u_val = eval('self.player.' + str(u)) # on récupère la valeur if u_val[0].isdigit(): # et si c'est un digit au départ index_uval = int(u_val[0]) # récupération de l'index new_value = new_values[index_uval] # print('On a trouvé un digit uval (' + u_val[0] + ') donc on le remplace par ' + new_value) # maintenant il faut réussir à la mettre dans le bon emplacement :s # et là toute l'astuce consiste à n'avoir que des <'> dans la phrase à exécuter # s'il y a des <"> l'exec foire complètement expression_txt = 'self.player.' + str(u) + '= str(new_value)' # print(expression_txt) exec (expression_txt) def is_displayed(self): return ((self.participant.vars['fumeur'] == 0) and (self.round_number == 10) and not(self.player.dispPayNonFumeur1_0 == "0 pour moi") and not(self.participant.vars['valeur_depart'] == 8)) class p13_x_results(Page): def vars_for_template(self): self.player.intermediate_calculations() # pour calculer les bascules etc def is_displayed(self): return (self.round_number == 10) class p14_rappel_memoire(Page): form_model='player' form_fields = ['rappel_image','rappel_marque', 'rappel_texte'] # le tirage au sort est fait à la fin de cette page pour éviter que des petits malins relaod si c'est en début de la suivante ;) def vars_for_template(self): # print(self.player.memoire_image) return dict( currentImageName_rappel= 'Nudges_Tobacco_app/' + self.participant.vars['condition'] + str(self.player.memoire_image) + '.png' ) def is_displayed(self): return self.round_number == 10 class p14_x_results(Page): def is_displayed(self): return self.round_number == 10 def before_next_page(self): self.player.final_calculations() # je préfère le mettre ici celui là ;) def vars_for_template(self): # print(self.player.memoire_image) return dict( currentImageName_rappel= 'Nudges_Tobacco_app/' + self.participant.vars['condition'] + str(self.player.memoire_image) + '.png' ) # def vars_for_template(self): # return dict( # currentImageName=self.participant.vars['imagesNames'][self.subsession.round_number-1] # ) class p15_tirage_au_sort(Page): def is_displayed(self): return self.round_number == 10 page_sequence = [ p1_instructions, p2_questions_1, p3_questions_4, p4_questions_7_si_fumeur, p4_questions_7_si_NON_fumeur, p5_questions_7_si_touslesjours, p6_questions_9_vap, p7_questions_10, p8_images_consigne, p9_images_presentation, p10_taches_consignes, p11_attention_tache_1, p11_reaction_tache_2, p11_croyance_tache_3, p11_intention_tache_4, p11_efficacite_tache_5, p12_dispo_payer_si_Q7Oui, p13_dispo_payer_si_Q7Oui, p12_dispo_payer_si_Q7Non, p13_dispo_payer_si_Q7Non, p13_x_results, p14_rappel_memoire, p14_x_results, p15_tirage_au_sort ]