from otree.api import * import itertools import random doc = """ Experiment of use of essential oils in methane reduction. October 2023. IMPORTANT: 1. Select treatment: RBS (result-based subsidy) or CC (carbon credit) """ class C(BaseConstants): NAME_IN_URL = 'visionary_feed_add' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 standard_subsidy = [986, 1052, 1118, 1184, 1249, 1315] policy_mix_subsidy = [0.4, 0.5, 0.6, 0.8] distribution_bins = ['-10.0%; -9.6%', '-9.5%; -9.1%', '-9.0%; -8.6%', '-8.5%; -8.1%', '-8.0%; -7.6%', '-7.5%; -7.1%', '-7.0%; -6.6%'] distribution_real = [1, 6, 12, 21, 12, 11, 7] # to be checked farm_income = 20000 essential_oils = 1315 class Subsession(BaseSubsession): pass def creating_session(subsession): if subsession.round_number == 1: for player in subsession.get_players(): participant = player.participant participant.treatment = subsession.session.config['TREATMENT'] combinations = list(itertools.combinations(C.policy_mix_subsidy, 2)) random.shuffle(combinations) policy_mix_1 = combinations[0] policy_task_order = list(policy_mix_1) random.shuffle(policy_task_order) player.policy_mix_1 = policy_task_order[0] player.policy_mix_2 = policy_task_order[1] class Group(BaseGroup): pass class Player(BasePlayer): name = models.StringField() birthplace = models.StringField() birthday = models.StringField() city = models.StringField() street = models.StringField() number = models.StringField() email = models.StringField() consent = models.IntegerField(widget=widgets.RadioSelectHorizontal, label='Ciò premesso,', choices=[(1, 'DO IL MIO CONSENSO A PARTECIPARE ALLO STUDIO PROPOSTO.')]) privacy = models.IntegerField(widget=widgets.RadioSelectHorizontal, label='', choices=[(1, 'PER PRESA VISIONE DELL’INFORMATIVA PRIVACY')]) treatment = models.StringField() mpl1_1 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2, 3]) mpl1_2 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2, 3]) mpl1_3 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2, 3]) mpl1_4 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2, 3]) mpl1_5 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2, 3]) mpl1_6 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2, 3]) mpl_no_switching = models.IntegerField() mpl2_ub = models.IntegerField() mpl2_lb = models.IntegerField() mpl2_1 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2, 3]) mpl2_2 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2, 3]) mpl2_3 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2, 3]) mpl2_4 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2, 3]) mpl2_1_subsidy = models.IntegerField() mpl2_2_subsidy = models.IntegerField() mpl2_3_subsidy = models.IntegerField() mpl2_4_subsidy = models.IntegerField() lowest_stand_subsidy = models.IntegerField() policy_mix_1 = models.FloatField() policy_mix_2 = models.FloatField() pm1_1 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm1_2 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm1_3 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm1_4 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm1_5 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm1_6 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm2_1 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm2_2 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm2_3 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm2_4 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm2_5 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) pm2_6 = models.IntegerField(widget=widgets.RadioSelect, choices=[1, 2]) slider1 = models.IntegerField(min=0, max=70, blank=True) slider2 = models.IntegerField(min=0, max=70, blank=True) slider3 = models.IntegerField(min=0, max=70, blank=True) slider4 = models.IntegerField(min=0, max=70, blank=True) slider5 = models.IntegerField(min=0, max=70, blank=True) slider6 = models.IntegerField(min=0, max=70, blank=True) slider7 = models.IntegerField(min=0, max=70, blank=True) frequency_payoff = models.IntegerField() # PAGES class Consent(Page): form_model = 'player' form_fields = ['name', 'birthplace', 'birthday', 'city', 'street', 'number', 'email', 'consent'] class Privacy(Page): form_model = 'player' form_fields = ['privacy'] class Waiting_page(Page): # for participants waiting for others to arrive at the page pass class Introduction_1(Page): pass class Introduction_2(Page): pass class Introduction_3(Page): pass class Introduction_4(Page): pass class Introduction_5(Page): pass class Introduction_6(Page): pass class Introduction_7(Page): pass # MPL instructions class Phase_1_a(Page): pass class Phase_1_b(Page): pass class Phase_1_c(Page): pass class Phase_1_d(Page): pass class Phase_1_e(Page): pass class Phase_1_f(Page): pass class Phase_1_g(Page): pass class Phase_1_h(Page): pass class Phase_1_i(Page): pass class Phase_1_k(Page): pass class Phase_1_l(Page): pass class Phase_1_m(Page): pass class Phase_1_n(Page): pass class Phase_1_o_ex1(Page): pass class Phase_1_o_ex2_1(Page): pass class Phase_1_o_ex2_2(Page): pass class Phase_1_o_ex2_3(Page): pass class Phase_1_o_ex2_4(Page): pass class Phase_1_o_ex2_5(Page): pass class Phase_1_o_ex3(Page): pass class Comprehension_questions_1(Page): pass class Phase_1_task_1(Page): form_model = 'player' form_fields = ['mpl1_1'] class Phase_1_task_2(Page): form_model = 'player' form_fields = ['mpl1_2'] class Phase_1_task_3(Page): form_model = 'player' form_fields = ['mpl1_3'] class Phase_1_task_4(Page): form_model = 'player' form_fields = ['mpl1_4'] class Phase_1_task_5(Page): form_model = 'player' form_fields = ['mpl1_5'] class Phase_1_task_6(Page): form_model = 'player' form_fields = ['mpl1_6'] @staticmethod def before_next_page(player: Player, timeout_happened): choice_vector = [player.mpl1_1, player.mpl1_2, player.mpl1_3, player.mpl1_4, player.mpl1_5, player.mpl1_6] # Check if participants had NO switching behaviour same_choices = choice_vector.count(choice_vector[0]) == len(choice_vector) if same_choices is True: player.mpl_no_switching = choice_vector[0] else: player.mpl_no_switching = 0 # Check when participants switched to standard subsidy if player.mpl_no_switching == 0: index_of_1 = None for index in range(len(choice_vector)): if choice_vector[index] == 1: index_of_1 = index break # Define bounds for second stage if index_of_1 is not None: player.mpl2_ub = C.standard_subsidy[index_of_1] if index_of_1 > 0: player.mpl2_lb = C.standard_subsidy[index_of_1-1] else: player.mpl2_lb = C.standard_subsidy[index_of_1] player.mpl2_ub = C.standard_subsidy[index_of_1+1] difference = player.mpl2_ub - player.mpl2_lb player.mpl2_1_subsidy = player.mpl2_lb + round(difference/5) player.mpl2_2_subsidy = player.mpl2_lb + round(difference / 5)*2 player.mpl2_3_subsidy = player.mpl2_lb + round(difference / 5)*3 player.mpl2_4_subsidy = player.mpl2_lb + round(difference / 5)*4 # 2nd stage MPL class Phase_1_2nd(Page): @staticmethod def is_displayed(player: Player): return player.mpl_no_switching < 2 class Phase_1_2nd_question(Page): @staticmethod def is_displayed(player: Player): return player.mpl_no_switching == 1 form_model = 'player' form_fields = ['lowest_stand_subsidy'] class Phase_1_2nd_1(Page): @staticmethod def is_displayed(player: Player): return player.mpl_no_switching == 0 and player.mpl2_1_subsidy > 0 form_model = 'player' form_fields = ['mpl2_1'] @staticmethod def vars_for_template(player: Player): subsidy = player.mpl2_1_subsidy return dict(subsidy=subsidy) class Phase_1_2nd_2(Page): @staticmethod def is_displayed(player: Player): return player.mpl_no_switching == 0 and player.mpl2_1_subsidy > 0 form_model = 'player' form_fields = ['mpl2_2'] @staticmethod def vars_for_template(player: Player): subsidy = player.mpl2_2_subsidy return dict(subsidy=subsidy) class Phase_1_2nd_3(Page): @staticmethod def is_displayed(player: Player): return player.mpl_no_switching == 0 and player.mpl2_1_subsidy > 0 form_model = 'player' form_fields = ['mpl2_3'] @staticmethod def vars_for_template(player: Player): subsidy = player.mpl2_3_subsidy return dict(subsidy=subsidy) class Phase_1_2nd_4(Page): @staticmethod def is_displayed(player: Player): return player.mpl_no_switching == 0 and player.mpl2_1_subsidy > 0 form_model = 'player' form_fields = ['mpl2_4'] @staticmethod def vars_for_template(player: Player): subsidy = player.mpl2_4_subsidy return dict(subsidy=subsidy) # Policy mix class Phase_2_part_1(Page): pass class Phase_2_task_1(Page): form_model = 'player' form_fields = ['pm1_1'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_1 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_task_2(Page): form_model = 'player' form_fields = ['pm1_2'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_1 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_task_3(Page): form_model = 'player' form_fields = ['pm1_3'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_1 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_task_4(Page): form_model = 'player' form_fields = ['pm1_4'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_1 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_task_5(Page): form_model = 'player' form_fields = ['pm1_5'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_1 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_task_6(Page): form_model = 'player' form_fields = ['pm1_6'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_1 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_part_2(Page): pass class Phase_2_2_task_1(Page): form_model = 'player' form_fields = ['pm2_1'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_2 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_2_task_2(Page): form_model = 'player' form_fields = ['pm2_2'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_2 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_2_task_3(Page): form_model = 'player' form_fields = ['pm2_3'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_2 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_2_task_4(Page): form_model = 'player' form_fields = ['pm2_4'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_2 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_2_task_5(Page): form_model = 'player' form_fields = ['pm2_5'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_2 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) class Phase_2_2_task_6(Page): form_model = 'player' form_fields = ['pm2_6'] @staticmethod def vars_for_template(player: Player): subsidy = player.policy_mix_2 pct_subsidy = int(subsidy*100) return dict(pct_subsidy=pct_subsidy) # Beliefs about methane reduction class Phase_3_instructions(Page): pass class Phase_3_task(Page): form_model = 'player' form_fields = ['slider1', 'slider2', 'slider3', 'slider4', 'slider5', 'slider6', 'slider7'] @staticmethod def error_message(player: Player, values): if values['slider1'] + values['slider2'] + values['slider3'] + values['slider4'] \ + values['slider5'] + values['slider6'] + values['slider7'] != 70: return "La somma dei gettoni utilizzati deve essere uguale a 70." @staticmethod def before_next_page(player: Player, timeout_happened): answers_task_1 = [] answers_task_1.extend([player.slider1, player.slider2, player.slider3, player.slider4, player.slider5, player.slider6, player.slider7]) player.frequency_payoff = 1 if answers_task_1 == C.distribution_real else 0 # Ending questionnaire page_sequence = [ # Consent, # Privacy, # Introduction_1, # Introduction_2, # Introduction_3, # Introduction_4, # Introduction_5, # Introduction_6, # Introduction_7, # # MPL # Phase_1_a, # Phase_1_b, # Phase_1_c, # Phase_1_d, # Phase_1_e, # Phase_1_f, # Phase_1_g, # Phase_1_h, # Phase_1_i, # Phase_1_k, # Phase_1_l, # Phase_1_m, # Phase_1_n, Phase_1_o_ex1, Phase_1_o_ex2_1, Phase_1_o_ex2_2, Phase_1_o_ex2_3, Phase_1_o_ex2_4, Phase_1_o_ex2_5, Phase_1_o_ex3, Comprehension_questions_1, # Phase_1_task_1, # Phase_1_task_2, # Phase_1_task_3, # Phase_1_task_4, # Phase_1_task_5, # Phase_1_task_6, # Phase_1_2nd, # Phase_1_2nd_question, # Phase_1_2nd_1, # Phase_1_2nd_2, # Phase_1_2nd_3, # Phase_1_2nd_4, Phase_2_part_1, Phase_2_task_1, Phase_2_task_2, Phase_2_task_3, Phase_2_task_4, Phase_2_task_5, Phase_2_task_6, Phase_2_part_2, Phase_2_2_task_1, Phase_2_2_task_2, Phase_2_2_task_3, Phase_2_2_task_4, Phase_2_2_task_5, Phase_2_2_task_6, # Phase_3_instructions, Phase_3_task ]