from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from . import models from .models import Constants import random import itertools import numpy as np from sklearn.utils import shuffle class Introduction(Page): # timeout_seconds = 600 def is_displayed(self): return self.round_number == 1 form_model = models.Player form_fields = ['test_question_{}'.format(ii) for ii in range(1, 4)] + ['age', 'gender'] # form_fields = form_fields + ['age', 'gender'] def error_message(self, values): if values['test_question_1'] != 45 or values['test_question_2'] != 40 or values[ 'test_question_3'] != 5: return 'One or more test questions is incorrect, please either re-read instructions and try again' # form_model = models.Player # form_fields = ['test_question_{}'.format(ii) for ii in range(1, 5)] # # def test_question_1_error_message(self, value): # if not (value == 'FALSE'): # return 'Incorrect Answer' # # def test_question_2_error_message(self, value): # if not (value == 'TRUE'): # return 'Incorrect Answer' # # def test_question_3_error_message(self, value): # if not (value == 'FALSE'): # return 'Incorrect Answer' # # def test_question_4_error_message(self, value): # if not (value == 'TRUE'): # return 'Incorrect Answer' # # class Final(Page): # def is_displayed(self): # return self.round_number == Constants.num_rounds # # def vars_for_template(self): # self.player.round_to_pay() # # self.player.calculate_final_payout() # # # def after_all_players_arrive(self): # self.player.round_to_pay() # # self.player.calculate_final_payout() # # # def before_session_starts(self): # self.round_list = range(1, self.round_number + 1) # self.payout_chosen_trial = shuffle(self.round_list) # # self.participant.vars['payout_chosen_trial'] = self.payout_chosen_trial[0] class Offer(Page): form_model = models.Group form_fields = ['amount_offered'] # def amount_offered_initial(self): # # self.slider_starter = random.sample(Constants.offer_choices, Constants.num_rounds) # # return self.slider_starter[1] # def after_all_players_arrive(self): # self.group.set_responder_identity() def is_displayed(self): return self.player.id_in_group == 1 # timeout_seconds = 600 def vars_for_template(self): # self.group.initial_slider_setter() self.group.set_responder_identity() # self.session.config['treatment'] == 'strategy' if self.session.config['order'] == 'soc_first': if self.round_number <= (Constants.num_rounds/4): self.group.soc_or_no = 'Social' if self.group.current_opponent == 'opp1': return {'image_path': 'my_trust_RL/block1_images/circle_filled.png'} elif self.group.current_opponent == 'opp2': return {'image_path': 'my_trust_RL/block1_images/stairs_filled.png'} elif self.group.current_opponent == 'opp3': return {'image_path': 'my_trust_RL/block1_images/star_filled.png'} elif self.round_number > (Constants.num_rounds/4): self.group.soc_or_no = 'Non-social' if self.group.current_opponent == 'opp1': return {'image_path': 'my_trust_RL/block2_images/square_frame.png'} elif self.group.current_opponent == 'opp2': return {'image_path': 'my_trust_RL/block2_images/helix_frame.png'} elif self.group.current_opponent == 'opp3': return {'image_path': 'my_trust_RL/block2_images/clover_frame.png'} elif self.session.config['order'] == 'comp_first': if self.round_number > (Constants.num_rounds / 2): # NUMBER HERE MUST BE ALTERED AT SOME POINT # WILL NEED TO ALTER FOR REAL THING self.group.soc_or_no = 'Non-Social' # MUST BE CHANGED BACK TO SOCIAL FOR REAL THING if self.group.current_opponent == 'opp1': return {'image_path': 'my_trust_RL/block3_images/bird_filled.png'} elif self.group.current_opponent == 'opp2': return {'image_path': 'my_trust_RL/block3_images/tetris_F_filled.png'} elif self.group.current_opponent == 'opp3': return {'image_path': 'my_trust_RL/block3_images/trapazoid_filled.png'} elif self.round_number <= (Constants.num_rounds / 2):# NUMBER HERE MUST BE ALTERED AT SOME POINT self.group.soc_or_no = 'Non-social' if self.group.current_opponent == 'opp1': return {'image_path': 'my_trust_RL/block4_images/diamond_frame.png'} elif self.group.current_opponent == 'opp2': return {'image_path': 'my_trust_RL/block4_images/crescent_frame.png'} elif self.group.current_opponent == 'opp3': return {'image_path': 'my_trust_RL/block4_images/triangle_frame.png'} class ResultsWaitPage(WaitPage): pass class Results(Page): def vars_for_template(self): self.group.set_payoffs() self.player.set_payoffs() self.group.set_responder_identity() # self.group.set_responder_identity() # self.session.config['treatment'] == 'strategy' if self.session.config['order'] == 'soc_first': if self.round_number <= (Constants.num_rounds/4): self.group.soc_or_no = 'Social' if self.group.current_opponent == 'opp1': return {'image_path': 'my_trust_RL/block1_images/circle_filled.png'} elif self.group.current_opponent == 'opp2': return {'image_path': 'my_trust_RL/block1_images/stairs_filled.png'} elif self.group.current_opponent == 'opp3': return {'image_path': 'my_trust_RL/block1_images/star_filled.png'} elif self.round_number > (Constants.num_rounds/4): self.group.soc_or_no = 'Non-social' if self.group.current_opponent == 'opp1': return {'image_path': 'my_trust_RL/block2_images/square_frame.png'} elif self.group.current_opponent == 'opp2': return {'image_path': 'my_trust_RL/block2_images/helix_frame.png'} elif self.group.current_opponent == 'opp3': return {'image_path': 'my_trust_RL/block2_images/clover_frame.png'} elif self.session.config['order'] == 'comp_first': if self.round_number > (Constants.num_rounds / 2): # NUMBER HERE MUST BE ALTERED AT SOME POINT # WILL NEED TO ALTER FOR REAL THING self.group.soc_or_no = 'Non-Social' # MUST BE CHANGED BACK TO SOCIAL FOR REAL THING if self.group.current_opponent == 'opp1': return {'image_path': 'my_trust_RL/block3_images/bird_filled.png'} elif self.group.current_opponent == 'opp2': return {'image_path': 'my_trust_RL/block3_images/tetris_F_filled.png'} elif self.group.current_opponent == 'opp3': return {'image_path': 'my_trust_RL/block3_images/trapazoid_filled.png'} elif self.round_number <= (Constants.num_rounds / 2):# NUMBER HERE MUST BE ALTERED AT SOME POINT self.group.soc_or_no = 'Non-social' if self.group.current_opponent == 'opp1': return {'image_path': 'my_trust_RL/block4_images/diamond_frame.png'} elif self.group.current_opponent == 'opp2': return {'image_path': 'my_trust_RL/block4_images/crescent_frame.png'} elif self.group.current_opponent == 'opp3': return {'image_path': 'my_trust_RL/block4_images/triangle_frame.png'} class AnotherWaitPage(WaitPage): # wait_for_all_groups = True def after_all_players_arrive(self): pass # def after_all_players_arrive(self): # self.group.set_payoffs() page_sequence = [ Introduction, Offer, AnotherWaitPage, Results, AnotherWaitPage # Final ]