from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random import numpy as np import time author = 'Antoine Deplancke' doc = """ Nudge tobacco app 2021 """ class Constants(BaseConstants): name_in_url = 'Nudges_Tobacco' players_per_group = None num_rounds = 10 showup_fee = 5 # pour bien faire, en fait on va dire que # attention c'est 1 donc 5 (car on commence au round 5 les taches) # réactions c'est 2 donc 6 # croyances c'est 3 donc 7 # intentions c'est 4 donc 8 # efficacité c'est 5 donc 9 # mais comme les taches commencent à etre envoyées seulement au round 5 tasks = ['5', '6', '7', '8', '9'] # attention ce sont les rounds ici vraiment # liste des conditions random, chaque participant est dans une condtion aléatoire conditions = ['PPNW', 'PPCW', 'BPCW', 'disso', 'empo', 'engag', 'reduc'] num_demo_participants = 3 imTime = 12 # temps de présentation des images en secondes = à mettre sur 12 !!! class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: print('') print('Dans la liste des tâches ce sont les ROUNDS correpondants aux tâches suivantes :') print('Attention, Réactions, Croyances, Intentions, Efficacité') print("[5 7 9 6 8] veut dire Attention au round 5, Réactions au round 7, Croyances 9 etc ") print('') for p in self.get_players(): # Déterminer la condition random daas laquelle se trouve le participant currentConditions = Constants.conditions.copy() p.participant.vars['condition'] = random.sample( currentConditions, len(currentConditions))[0] # Déterminer un ordre de passation des taches pour chacun currentOrder = Constants.tasks.copy() p.participant.vars['taskOrder'] = random.sample( currentOrder, len(currentOrder)) # Déterminer un ordre des images imageOrder = ['Nudges_Tobacco_app/' + p.participant.vars['condition'] + '1.png', 'Nudges_Tobacco_app/' + p.participant.vars['condition'] + '2.png', 'Nudges_Tobacco_app/' + p.participant.vars['condition'] + '3.png', 'Nudges_Tobacco_app/' + p.participant.vars['condition'] + '4.png', 'Nudges_Tobacco_app/' + p.participant.vars['condition'] + '5.png'] p.participant.vars['imagesNames'] = random.sample( imageOrder, len(imageOrder)) imagesNamesLocalCopy = p.participant.vars['imagesNames'].copy() # Affichages print('Participant n°' + str(p.participant.id_in_session)) print('Condition xp: ' + p.participant.vars['condition']) print('Tâches: ' + str(p.participant.vars['taskOrder'])) print('Images:') for i in range(0, len(imagesNamesLocalCopy)): print(imagesNamesLocalCopy[i]) print('') class Group(BaseGroup): pass class Player(BasePlayer): # image1 = models.StringField() # image2 = models.StringField() # image3 = models.StringField() # image4 = models.StringField() # image5 = models.StringField() Q1_age = models.IntegerField( label="1. Quel âge avez-vous ?", min=15, max=100) Q2_sexe = models.StringField(label="2. Quelle est votre civilité ?", widget=widgets.RadioSelect, choices=[ "Madame", "Monsieur"]) Q3a_situationPro = models.StringField(label="3. Quelle est actuellement votre situation professionnelle ?", widget=widgets.RadioSelect, choices=[ "en emploi", "apprenti.e ou en stage rémunéré", "étudiant.e, lycéen.ne, en formation ou en stage non rémunéré", "au chômage (inscrit.e ou non à pôle emploi)", "retraité.e ou pré-retraité.e", "femme ou homme au foyer", "autre situation"]) Q3b_boursier = models.StringField(label="3b. Etes-vous boursier ?", widget=widgets.RadioSelect, choices=["Oui", "Non"], blank=True) Q3c_travailEtudiant = models.StringField(label="3c. Travaillez-vous, ne serait-ce que de temps en temps ?", widget=widgets.RadioSelect, choices=["Oui, mais seulement pendant les vacances scolaires", "Oui, y compris en dehors des vacances scolaires", "Non"], blank=True) Q4_etatSante = models.StringField(label="4. Comment est votre état de santé en général ?", widget=widgets.RadioSelect, choices=["Très bon", "Bon", "Assez bon", "Mauvais", "Très mauvais"]) Q5_maladieChronique = models.StringField(label="5. Avez-vous une maladie ou un problème de santé qui soit chronique ou de caractère durable ?", widget=widgets.RadioSelect, choices=["Oui", "Non"]) Q6_limitationSante = models.StringField(label="6. Êtes-vous limité.e depuis au moins six mois, à cause d’un problème de santé, dans les activités que les gens font habituellement ?", widget=widgets.RadioSelect, choices=["Oui, fortement limité.e", "Oui, limité.e, mais pas fortement", "Non, pas limité.e du tout"]) Q7_fumezVous = models.StringField(label="7. Est-ce que vous fumez, ne serait-ce que de temps en temps (même la chicha ou le narguilé) ? Attention : la cigarette électronique ne compte pas (si vous ne fumez que la cigarette électronique, alors répondez non à cette question).", widget=widgets.RadioSelect, choices=["Oui", "Non"]) Q7b1_tabac = models.StringField(label="7(a). Fumez-vous du tabac à rouler (roulées, cigarettes tubées) ?", widget=widgets.RadioSelectHorizontal, choices=[ "Oui", "Non"]) Q7b2_paquet = models.StringField(label="7(b). Fumez-vous des cigarettes en paquet ?", widget=widgets.RadioSelectHorizontal, choices=[ "Oui", "Non"]) Q7b3_cigarillos = models.StringField(label="7(c). Fumez-vous des cigarillos ?", widget=widgets.RadioSelectHorizontal, choices=[ "Oui", "Non"]) Q7b4_cigares = models.StringField(label="7(d). Fumez-vous des cigares ?", widget=widgets.RadioSelectHorizontal, choices=[ "Oui", "Non"]) Q7b5_pipe = models.StringField(label="7(e). Fumez-vous la pipe ?", widget=widgets.RadioSelectHorizontal, choices=[ "Oui", "Non"]) Q7b6_chicha = models.StringField(label="7(f). Fumez-vous la chicha ou le narguilé ?", widget=widgets.RadioSelectHorizontal, choices=[ "Oui", "Non"]) Q7b_bis_age1st =models.IntegerField( label="7(g). A quel âge avez-vous fumé pour la première fois ?", min=1, max=80) Q7c_touslesjours = models.StringField(label="7(h). Fumez-vous tous les jours (en excluant la cigarette électronique) ?", widget=widgets.RadioSelectHorizontal, choices=[ "Oui", "Non"]) Q7civ_annees_fumeur = models.IntegerField(label="7(i). Depuis combien d'années vous considérez-vous fumeur/fumeuse ? (répondez 0 si moins d'une année)", min=0, max=80 ) Q7ci_nbCig = models.StringField(label="7(j). Combien de cigarettes, cigarillos, cigares ou équivalents fumez-vous par jour en moyenne ?", widget=widgets.RadioSelect, choices=[ "10 ou moins", "11 à 20", "21 à 30", "31 ou plus"]) Q7cii_1ereCigReveil = models.StringField(label="7(k). Le matin, combien de temps après votre réveil fumez-vous votre première cigarette ?", widget=widgets.RadioSelect, choices=[ "Moins de 5 minutes", "6 à 30 minutes", "31 à 60 minutes", "Après plus d'une heure"]) Q7ciii_nbcig_7j = models.StringField(label="7(l). Combien de cigarettes, cigarillos, cigares ou équivalents avez-vous fumé au total au cours des 7 derniers jours ?", widget=widgets.RadioSelect, choices=[ "10 ou moins", "11 à 30", "31 à 60", "61 à 100", "plus de 100"]) Q7z_dejaEssaye = models.StringField(label="7(a). Au cours de votre vie, avez-vous déjà essayé de fumer ?", widget=widgets.RadioSelect, choices=[ "Oui", "Non"]) Q7z_comment = models.StringField(label="7(b). Avez-vous fumé...", widget=widgets.RadioSelect, choices=[ "juste une ou deux fois pour essayer ?", "occasionnellement ?", "quotidiennement pendant moins de six mois ?", "quotidiennement pendant plus de six mois ?" ], blank=True) # il manque la question 8 mais comme toute l'architecture est faite et qu'il est l'heure de lancer la manip on laisse comme ça Q9_vapoteur = models.StringField(label="8. Êtes-vous vapoteur/se (utilisez-vous la cigarette électronique) ?", widget=widgets.RadioSelect, choices=[ "Oui", "Non"]) Q9a_liquideNicotine = models.StringField(label="8(a). Utilisez-vous des liquides nicotinés ?", widget=widgets.RadioSelect, choices=[ "Oui", "Non"]) def make_field_10(label): return models.IntegerField( choices=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], label=label, widget=widgets.RadioSelectHorizontal ) # pour ces questions j'ai écris le label dans le template (vu qu'on faisait des tableaux) Q10_risquesGeneral = make_field_10("") Q11_risquesSante = make_field_10("") Q12_renoncerGeneral = make_field_10("") Q13_renoncerSante = make_field_10("") attentionQ1Paquets = make_field_10( "1. Les paquets présentés ont attiré mon attention :") attentionQ2Textes = models.StringField( choices = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', "Je ne me souviens pas avoir vu de textes sur les paquets présentés"], label = "2. Les textes sur les paquets ont attiré mon attention :", widget=widgets.RadioSelectHorizontal ) attentionQ3Images = models.StringField( choices = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', "Je ne me souviens pas avoir vu d'images sur les paquets présentés"], label = "3. Les images sur les paquets ont attiré mon attention :", widget=widgets.RadioSelectHorizontal ) attentionQ4Marques = models.StringField( choices = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', "Je ne me souviens pas avoir vu de marques sur les paquets présentés"], label = "4. Les marques des paquets ont attiré mon attention :", widget=widgets.RadioSelectHorizontal ) reactionQ1Reflechir = make_field_10( "1. Les paquets présentés vous ont-ils amené à réfléchir aux risques de santé ?") reactionQ2Peur = make_field_10( "2. Avez-vous ressenti de la peur, de l’inconfort, de l’inquiétude ou du dégout en regardant ces paquets ?") reactionQ3Credible = make_field_10( "3. Les images et les textes vous ont-ils parus crédibles ?") reactionQ4Colere = make_field_10( "4. Les paquets vous ont-ils mis en colère, agacé ou irrité ?") reactionQ5Envie = make_field_10( "5. Avez-vous envie de fumer ou êtes-vous en train de fumer en ce moment même ?") reactionQ6Penible = make_field_10( "6. Etait-il pénible de regarder ces paquets ?") # croyanceQ1Perception = models.IntegerField(label="1. Quelle est votre perception vis-à-vis de la / des marque(s) de cigarettes affichée(s) sur les images précédentes (de -5 = très négative à +5 = très positive) ?", # widget=widgets.RadioSelectHorizontal, choices=[ # -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]) croyanceQ2Relaxer = make_field_10("(a). Fumer aide les gens à se relaxer :") croyanceQ2Stress = make_field_10("(b). Fumer réduit le stress :") croyanceQ2Grossir = make_field_10("(c). Fumer permet de ne pas grossir :") croyanceQ3Maladie = make_field_10( "(d). Il est possible que j’ai l’une des maladies suivantes dans le futur (cancer, AVC, maladie cardiovasculaire) :") croyanceQ4SiQ7Oui = make_field_10( "(e). Je n’ai besoin de personne pour arrêter de fumer :") croyanceQ4SiQ7Non = make_field_10( "(e). Un.e fumeur/fumeuse a besoin de se faire aider pour arrêter :") intentionQ1SiQ7Oui = make_field_10( "Est-il envisageable que vous essayiez d’arrêter de fumer définitivement durant le prochain mois (30 jours) :") intentionQ1SiQ7Non = make_field_10( "Pensez-vous que vous fumerez une cigarette durant les 12 mois à venir ?") efficaciteQ1Commencer = make_field_10( "1. Si les paquets présentés étaient commercialisés, ils seraient efficaces pour empêcher les jeunes de commencer à fumer :") efficaciteQ2Reduire = make_field_10( "2. Si les paquets présentés étaient commercialisés, ils seraient efficaces pour inciter les jeunes à fumer moins/réduire leur consommation de tabac :") efficaciteQ3SiQ7Oui = make_field_10( "3. Si les paquets présentés étaient commercialisés, ils m'aideraient à arrêter de fumer :") efficaciteQ3SiQ7Non = make_field_10( "3. Si les paquets présentés étaient commercialisés et que j'étais fumeur/fumeuse, ils m'aideraient à arrêter de fumer :") efficaciteQ4AiderAutres = make_field_10( "4. Si les paquets présentés étaient commercialisés, ils aideraient les autres à arrêter de fumer :") # les variables de la tache de rappel rappel_image = models.StringField(widget=widgets.RadioSelectHorizontal, choices=["Oui", "Non"]) rappel_marque = models.StringField(widget=widgets.RadioSelectHorizontal, choices=["Oui", "Non"]) rappel_texte = models.StringField(widget=widgets.RadioSelectHorizontal, choices=["Oui", "Non"]) marque_rappel = models.StringField() phrase_rappel = models.StringField() questions_subs = models.IntegerField(initial=0) reponseTirage = models.StringField() wtp_money = models.IntegerField() statut = models.StringField() # pour le statut fini à la dernière page (pour éviter de payer les non finissants) Temps_Passation = models.StringField() #dispPayFumeur1_0 = models.StringField( ) #dispPayFumeur1_1, dispPayFumeur1_2, dispPayFumeur1_3, dispPayFumeur1_4, dispPayFumeur1_5, dispPayFumeur1_6, dispPayFumeur1_7, dispPayFumeur1_8, dispPayFumeur1_9 # DISPOSITION A PAYER POUR // FUMEURS def make_field_dispoPay(label, choix_financier): return models.StringField( choices=["Le livre", choix_financier], label=label, widget=widgets.RadioSelectHorizontal ) dispPayFumeur1_0 = make_field_dispoPay("Choix 1", "0 Euro") dispPayFumeur1_1 = make_field_dispoPay("Choix 2", "1 Euro") dispPayFumeur1_2 = make_field_dispoPay("Choix 3", "2 Euros") dispPayFumeur1_3 = make_field_dispoPay("Choix 4", "3 Euros") dispPayFumeur1_4 = make_field_dispoPay("Choix 5", "4 Euros") dispPayFumeur1_5 = make_field_dispoPay("Choix 6", "5 Euros") dispPayFumeur1_6 = make_field_dispoPay("Choix 7", "6 Euros") dispPayFumeur1_7 = make_field_dispoPay("Choix 8", "7 Euros") dispPayFumeur1_8 = make_field_dispoPay("Choix 9", "8 Euros") # Ici on fait une version 2 du bordel qui permet d'afficher des choices différents en label de ce qui est balourdé dans le back ensuite # on remplacera donc tous les TRP par les valeurs voulues et ça changera rien au form submit def make_field_dispoPay_page_2(label, choix_financier, valeur_affichee): return models.StringField( choices=[["Le livre", "Le livre"], [choix_financier, valeur_affichee]], label=label, widget=widgets.RadioSelectHorizontal ) dispPayFumeur2_0 = make_field_dispoPay_page_2("Choix 1", '0', "trp0" ) # trp pour "to replace" dispPayFumeur2_1 = make_field_dispoPay_page_2("Choix 2", '1', "trp1" ) dispPayFumeur2_2 = make_field_dispoPay_page_2("Choix 3", '2', "trp2" ) dispPayFumeur2_3 = make_field_dispoPay_page_2("Choix 4", '3', "trp3" ) dispPayFumeur2_4 = make_field_dispoPay_page_2("Choix 5", '4', "trp4" ) dispPayFumeur2_5 = make_field_dispoPay_page_2("Choix 6", '5', "trp5" ) dispPayFumeur2_6 = make_field_dispoPay_page_2("Choix 7", '6', "trp6" ) dispPayFumeur2_7 = make_field_dispoPay_page_2("Choix 8", '7', "trp7" ) dispPayFumeur2_8 = make_field_dispoPay_page_2("Choix 9", '8', "trp8" ) # Me suis basé la-dessus : # level = models.IntegerField( # choices=[ # [1, 'Low'], # [2, 'Medium'], # [3, 'High'], # ] # ) # DISPOSITION A PAYER POUR // *NON* FUMEURS def make_field_dispoPay_Non_Fumeur(label, choix_financier_var, choix_financier): return models.StringField( choices=[["Don_Fondation","La fondation du souffle reçoit 8,30 Euros (et moi 0)"], [choix_financier_var, choix_financier]], label=label, widget=widgets.RadioSelectHorizontal ) dispPayNonFumeur1_0 = make_field_dispoPay_Non_Fumeur("Choix 1", "0 pour moi", "Je reçois 0 Euro (et la fondation 0)") dispPayNonFumeur1_1 = make_field_dispoPay_Non_Fumeur("Choix 2", "1 pour moi", "Je reçois 1 Euro (et la fondation 0)") dispPayNonFumeur1_2 = make_field_dispoPay_Non_Fumeur("Choix 3", "2 pour moi", "Je reçois 2 Euros (et la fondation 0)") dispPayNonFumeur1_3 = make_field_dispoPay_Non_Fumeur("Choix 4", "3 pour moi", "Je reçois 3 Euros (et la fondation 0)") dispPayNonFumeur1_4 = make_field_dispoPay_Non_Fumeur("Choix 5", "4 pour moi", "Je reçois 4 Euros (et la fondation 0)") dispPayNonFumeur1_5 = make_field_dispoPay_Non_Fumeur("Choix 6", "5 pour moi", "Je reçois 5 Euros (et la fondation 0)") dispPayNonFumeur1_6 = make_field_dispoPay_Non_Fumeur("Choix 7", "6 pour moi", "Je reçois 6 Euros (et la fondation 0)") dispPayNonFumeur1_7 = make_field_dispoPay_Non_Fumeur("Choix 8", "7 pour moi", "Je reçois 7 Euros (et la fondation 0)") dispPayNonFumeur1_8 = make_field_dispoPay_Non_Fumeur("Choix 9", "8 pour moi", "Je reçois 8 Euros (et la fondation 0)") # Ici on fait une version 2 du bordel qui permet d'afficher des choices différents en label de ce qui est balourdé dans le back ensuite # on remplacera donc tous les TRP par les valeurs voulues et ça changera rien au form submit def make_field_dispoPay_Non_Fumeur_page_2(label, choix_financier, valeur_affichee): return models.StringField( choices=[["Don_Fondation", "La fondation du souffle reçoit 8,30 Euros (et moi 0)"], [choix_financier, valeur_affichee]], label=label, widget=widgets.RadioSelectHorizontal ) dispPayNonFumeur2_0 = make_field_dispoPay_Non_Fumeur_page_2("Choix 1", '0', "trp0" ) # trp pour "to replace" dispPayNonFumeur2_1 = make_field_dispoPay_Non_Fumeur_page_2("Choix 2", '1', "trp1" ) dispPayNonFumeur2_2 = make_field_dispoPay_Non_Fumeur_page_2("Choix 3", '2', "trp2" ) dispPayNonFumeur2_3 = make_field_dispoPay_Non_Fumeur_page_2("Choix 4", '3', "trp3" ) dispPayNonFumeur2_4 = make_field_dispoPay_Non_Fumeur_page_2("Choix 5", '4', "trp4" ) dispPayNonFumeur2_5 = make_field_dispoPay_Non_Fumeur_page_2("Choix 6", '5', "trp5" ) dispPayNonFumeur2_6 = make_field_dispoPay_Non_Fumeur_page_2("Choix 7", '6', "trp6" ) dispPayNonFumeur2_7 = make_field_dispoPay_Non_Fumeur_page_2("Choix 8", '7', "trp7" ) dispPayNonFumeur2_8 = make_field_dispoPay_Non_Fumeur_page_2("Choix 9", '8', "trp8" ) def dispoPay_2_Calculations_FUMEURS(self): # voila les variables concernées full_responses = [ self.dispPayFumeur1_0, self.dispPayFumeur1_1, self.dispPayFumeur1_2, self.dispPayFumeur1_3, self.dispPayFumeur1_4, self.dispPayFumeur1_5, self.dispPayFumeur1_6, self.dispPayFumeur1_7, self.dispPayFumeur1_8, ] self.participant.vars['valeur_depart'] = 8 for i in full_responses: # on les balaye tous jusqu'à toucher le permier qui est valide print(i) if i[0].isdigit(): # si la première lettre n'est pas justement une lettre ("le livre") alors c'est qu'on a basculé sur les euros coincoin = int(i[0])-1 # valeur de départ est donc le dernier entier avant celui-là self.participant.vars['valeur_depart'] = coincoin # coincoin existe car ça faisait une erreur en utilisation directe break print('valeur de départ = ' + str(self.participant.vars['valeur_depart'])) if self.participant.vars['valeur_depart'] == 8: # si on a mis tout le temps le livre... pass else: val_depart_local = self.participant.vars['valeur_depart'] # jusqu'ici je sais qu'on est bon valeurs_seules = np.arange (val_depart_local+0.1, val_depart_local+10*0.1, 0.1) dispoPay_2_labels = [] for j in valeurs_seules: new_value = str(j.round(decimals=2)) + '0 Euros' new_value = new_value.replace('.',',') dispoPay_2_labels.append(new_value) self.participant.vars['dispo2_labels'] = dispoPay_2_labels # print(self.participant.vars['dispo2_labels']) def dispoPay_2_Calculations_NON_FUMEURS(self): self.participant.vars['valeur_depart'] = 8 # voila les variables concernées full_responses = [ self.dispPayNonFumeur1_0, self.dispPayNonFumeur1_1, self.dispPayNonFumeur1_2, self.dispPayNonFumeur1_3, self.dispPayNonFumeur1_4, self.dispPayNonFumeur1_5, self.dispPayNonFumeur1_6, self.dispPayNonFumeur1_7, self.dispPayNonFumeur1_8, ] for i in full_responses: # on les balaye tous jusqu'à toucher le permier qui est valide if i[0].isdigit(): # si la première lettre n'est pas justement une lettre ("le livre") alors c'est qu'on a basculé sur les euros coincoin = int(i[0])-1 # valeur de départ est donc le dernier entier avant celui-là self.participant.vars['valeur_depart'] = coincoin # coincoin existe car ça faisait une erreur en utilisation directe print('valeur de départ = ' + str(self.participant.vars['valeur_depart'])) break if self.participant.vars['valeur_depart'] == 8: # si on a mis tout le temps le Don.. pass else: val_depart_local = self.participant.vars['valeur_depart'] # jusqu'ici je sais qu'on est bon valeurs_seules = np.arange (val_depart_local+0.1, val_depart_local+10*0.1, 0.1) dispoPay_2_labels = [] for j in valeurs_seules: # new_value = str(j.round(decimals=2)) + '0 Euros' new_value = 'Je reçois ' + str(j.round(decimals=2)) + '0 Euros (et la fondation 0)' new_value = new_value.replace('.',',') dispoPay_2_labels.append(new_value) self.participant.vars['dispo2_labels'] = dispoPay_2_labels # print(self.participant.vars['dispo2_labels']) tirage = models.IntegerField() # tirage au sort effectué à la fin de la page de mémoire identification = models.StringField() # label task_order = models.StringField() # ligne_choisie = models.StringField() #ligne choisie à dispoPay images_order = models.StringField() # ordre des images condition = models.StringField() # condition bascule = models.StringField() # bascule financière bascule_int = models.IntegerField() # bascule financière en int32 memoire_image = models.IntegerField() # pour se souvenir de l'image montrée gain_final = models.IntegerField() # total des gains à la fin message_wtp = models.StringField() # pour les messages sur l'écran de fin message_wtp2 = models.StringField() def intermediate_calculations(self): # on connait la bascule self.bascule = str(self.participant.vars['valeur_depart']) self.bascule_int = int(self.bascule) print('bascule = ' + self.bascule) # maintenant il faut trouver si les gens ont pris un livre ou s'ils ont pris les sous if self.participant.vars['fumeur'] == 1: # pour les fumeurs expression_txt = "self.reponseTirage = self.dispPayFumeur1_" + str(self.tirage-1) exec(expression_txt) print('REPONSE TIRAGE = ' + self.reponseTirage) if self.reponseTirage == "Le livre": # print('on passe ici') self.message_wtp = "Sur cette ligne, vous avez choisi de recevoir le livre d'Allen Carr. Nous vous contacterons donc prochainement par SMS pour avoir votre adresse postale. " self.message_wtp2 = " + le livre d'Allen Carr (valeur 8,30 Euros) à recevoir chez vous." self.wtp_money = 0 else: self.wtp_money = self.tirage-1 # normalement ça compte bon je crois ^^ self.message_wtp = "Sur cette ligne, vous avez choisi d'ajouter la somme de " + str(self.wtp_money) + " Euros aux 5 Euros déjà acquis pour votre participation." self.message_wtp2 = "." elif self.participant.vars['fumeur'] == 0: # pour les NON fumeurs # TODO ICI expression_txt = "self.reponseTirage = self.dispPayNonFumeur1_" + str(self.tirage-1) exec(expression_txt) print('RESPONSE TIRAGE = ' + self.reponseTirage) if self.reponseTirage == 'Don_Fondation': self.message_wtp = "Sur cette ligne, vous avez choisi de faire un don de 8,30 Euros à la fondation du souffle. " self.message_wtp2 = " et grâce à vous, l'Université Catholique de Lille ajoute 8,30 Euros au don qui sera fait à la Fondation du Souffle en fin d'expérience. " self.wtp_money = 0 else: self.wtp_money = self.tirage-1 # normalement ça compte bon je crois ^^ self.message_wtp = "Sur cette ligne, vous avez choisi d'ajouter la somme de " + str(self.wtp_money) + " Euros aux 5 Euros déjà acquis pour votre participation." self.message_wtp2 = "." def final_calculations(self): # On récupère identification et condition self.identification = self.participant.label self.condition = self.participant.vars['condition'] print('identification : ' + str(self.identification)) print('condition : ' + str(self.condition)) # ordre des taches taskorder = '' for task_number in self.participant.vars['taskOrder']: taskorder+=task_number self.task_order = taskorder print('ordre taches = ' + self.task_order) # on reclaque toutes nos variables sur le round 10 # Tout ce qui était au round 1 for i in ['Q1_age', 'Q2_sexe', 'Q3a_situationPro', 'Q3b_boursier', 'Q3c_travailEtudiant', \ 'Q10_risquesGeneral', 'Q11_risquesSante', 'Q12_renoncerGeneral', 'Q13_renoncerSante','Q9_vapoteur', \ 'Q9a_liquideNicotine','Q7ci_nbCig', 'Q7cii_1ereCigReveil','Q7z_dejaEssaye', 'Q7z_comment', \ 'Q4_etatSante', 'Q5_maladieChronique', 'Q6_limitationSante', 'Q7_fumezVous','Q7b1_tabac', \ 'Q7b2_paquet', 'Q7b3_cigarillos', 'Q7b4_cigares', 'Q7b5_pipe', 'Q7b6_chicha', 'Q7c_touslesjours', 'Q7b_bis_age1st', 'Q7civ_annees_fumeur','Q7ciii_nbcig_7j' ]: expression_txt = 'self.' + i + ' = self.in_round(1).' + i # print(expression_txt) exec(expression_txt) # Maintenant tout ce qui était dans les rounds des tâches # là je vais tester une recherche automatique # On est contraint de for i in ['attentionQ1Paquets', 'attentionQ2Textes', 'attentionQ3Images', 'attentionQ4Marques']: # qui je le rappelle corresponds au rounds pour # Attention, Reaction, Croyance, Intention, Efficacite round_originel = self.task_order[0] expression_txt = 'self.' + i + ' = self.in_round(' + round_originel + ').' + i exec(expression_txt) for i in [ 'reactionQ1Reflechir', \ 'reactionQ2Peur', 'reactionQ3Credible', 'reactionQ4Colere', 'reactionQ5Envie', 'reactionQ6Penible']: # qui je le rappelle corresponds au rounds pour # Attention, Reaction, Croyance, Intention, Efficacite round_originel = self.task_order[1] expression_txt = 'self.' + i + ' = self.in_round(' + round_originel + ').' + i exec(expression_txt) for i in ['croyanceQ2Relaxer', 'croyanceQ2Stress', 'croyanceQ2Grossir', 'croyanceQ3Maladie',\ 'croyanceQ4SiQ7Oui','croyanceQ4SiQ7Non']: # qui je le rappelle corresponds au rounds pour # Attention, Reaction, Croyance, Intention, Efficacite round_originel = self.task_order[2] expression_txt = 'self.' + i + ' = self.in_round(' + round_originel + ').' + i exec(expression_txt) for i in ['intentionQ1SiQ7Oui','intentionQ1SiQ7Non']: # qui je le rappelle corresponds au rounds pour # Attention, Reaction, Croyance, Intention, Efficacite round_originel = self.task_order[3] expression_txt = 'self.' + i + ' = self.in_round(' + round_originel + ').' + i exec(expression_txt) for i in ['efficaciteQ1Commencer', 'efficaciteQ2Reduire', 'efficaciteQ3SiQ7Oui','efficaciteQ3SiQ7Oui', 'efficaciteQ4AiderAutres']: # qui je le rappelle corresponds au rounds pour # Attention, Reaction, Croyance, Intention, Efficacite round_originel = self.task_order[4] expression_txt = 'self.' + i + ' = self.in_round(' + round_originel + ').' + i exec(expression_txt) # # Et celles ci en fait pas besoin, elles sont déjà au round 10 # for i in ['dispPayFumeur1_0', 'dispPayFumeur1_1', 'dispPayFumeur1_2', 'dispPayFumeur1_3',\ # 'dispPayFumeur1_4', 'dispPayFumeur1_5', 'dispPayFumeur1_6', 'dispPayFumeur1_7', 'dispPayFumeur1_8',\ # 'dispPayNonFumeur1_0', 'dispPayNonFumeur1_1', 'dispPayNonFumeur1_2', 'dispPayNonFumeur1_3',\ # 'dispPayNonFumeur1_4', 'dispPayNonFumeur1_5', 'dispPayNonFumeur1_6', 'dispPayNonFumeur1_7', 'dispPayNonFumeur1_8',\ # 'dispPayFumeur2_0', 'dispPayFumeur2_1', 'dispPayFumeur2_2', 'dispPayFumeur2_3','dispPayFumeur2_4', \ # 'dispPayFumeur2_5', 'dispPayFumeur2_6', 'dispPayFumeur2_7', 'dispPayFumeur2_8','dispPayNonFumeur2_0',\ # 'dispPayNonFumeur2_1', 'dispPayNonFumeur2_2', 'dispPayNonFumeur2_3', 'dispPayNonFumeur2_4', 'dispPayNonFumeur2_5',\ # 'dispPayNonFumeur2_6', 'dispPayNonFumeur2_7', 'dispPayNonFumeur2_8']: # pass # avec quelques calculs sur imagenames images_order = '' for im_name in self.participant.vars['imagesNames'] : # ne garder que les chiffres for position in range(len(im_name)): # pour toute les lettres du nom de l'image lettre = im_name[position] if lettre.isdigit(): # si on trouve un chiffre images_order+=lettre # alors on l'ajoute dedans self.images_order = images_order print('images = ' + self.images_order) # Maintenant on calcule le gain final et on voit s'il prend le live ou bien fait le don etc # on peut gagner maximum 16 euros (17500/1050 = 16.66) # le livre vaut 8.30, on considère 8 # et y'a 3 euros de questions subsidiaires # Donc ca fait 5 euros minimum + 3 + 8 ou le livre ou le don self.questions_subs = 0 # voilà déjà pour les questions subs if self.rappel_image == "Oui": self.questions_subs += 1 if self.rappel_texte == "Non": self.questions_subs += 1 if self.rappel_marque == "Non": self.questions_subs += 1 self.gain_final = Constants.showup_fee + self.questions_subs + self.wtp_money self.statut = "OK" self.participant.vars["end_time"] = time.time() self.participant.vars["total_time"] = self.participant.vars["end_time"] -self.participant.vars["start_time"] self.Temps_Passation = str(self.participant.vars["total_time"]) position_point = self.Temps_Passation.find('.') self.Temps_Passation = self.Temps_Passation[0:position_point+2] print(self.Temps_Passation)