from otree.api import * import random import data as dt # dog for emotional support doc = """Peer comments""" class C(BaseConstants): NAME_IN_URL = 'peer_comment' # experiment needs two person groups PLAYERS_PER_GROUP = 3 NUM_ROUNDS = 3 ENDOWMENT = 100 # make a budget so can change it later if we have to class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): quantity = models.IntegerField() real_quality = models.FloatField(min=0, max=1) new_quality = models.FloatField(min=0, max=1) guessed_quality = models.FloatField(min=0, max=1) quantity_A = models.IntegerField() quantity_B = models.IntegerField() quantity_C = models.IntegerField() guess_A = models.FloatField(min=0, max=1) guess_B = models.FloatField(min=0, max=1) guess_C = models.FloatField(min=0, max=1) guess_from_A = models.FloatField(min=0, max=1) guess_from_B = models.FloatField(min=0, max=1) guess_from_C = models.FloatField(min=0, max=1) quality_A1 = models.FloatField(min=0, max=1) quality_A2 = models.FloatField(min=0, max=1) quality_B1 = models.FloatField(min=0, max=1) quality_B2 = models.FloatField(min=0, max=1) quality_C1 = models.FloatField(min=0, max=1) quality_C2 = models.FloatField(min=0, max=1) new_quality_A = models.FloatField(min=0, max=1) new_quality_B = models.FloatField(min=0, max=1) new_quality_C = models.FloatField(min=0, max=1) profit = models.FloatField(min=0) profit_A = models.FloatField(min=0) profit_B = models.FloatField(min=0) profit_C = models.FloatField(min=0) slider1 = models.IntegerField(min=-1, max=100) slider2 = models.IntegerField(min=-1, max=100) slider3 = models.IntegerField(min=-1, max=100) slider4 = models.IntegerField(min=-1, max=100) slider5 = models.IntegerField(min=-1, max=100) slider6 = models.IntegerField(min=-1, max=100) slider7 = models.IntegerField(min=-1, max=100) slider8 = models.IntegerField(min=-1, max=100) slider9 = models.IntegerField(min=-1, max=100) slider10 = models.IntegerField(min=-1, max=100) slider11 = models.IntegerField(min=-1, max=100) slider12 = models.IntegerField(min=-1, max=100) slider13 = models.IntegerField(min=-1, max=100) slider14 = models.IntegerField(min=-1, max=100) slider15 = models.IntegerField(min=-1, max=100) slider16 = models.IntegerField(min=-1, max=100) slider17 = models.IntegerField(min=-1, max=100) slider18 = models.IntegerField(min=-1, max=100) slider19 = models.IntegerField(min=-1, max=100) slider20 = models.IntegerField(min=-1, max=100) slider21 = models.IntegerField(min=-1, max=100) slider22 = models.IntegerField(min=-1, max=100) slider23 = models.IntegerField(min=-1, max=100) slider24 = models.IntegerField(min=-1, max=100) slider25 = models.IntegerField(min=-1, max=100) slider26 = models.IntegerField(min=-1, max=100) slider27 = models.IntegerField(min=-1, max=100) slider28 = models.IntegerField(min=-1, max=100) slider29 = models.IntegerField(min=-1, max=100) slider30 = models.IntegerField(min=-1, max=100) slider31 = models.IntegerField(min=-1, max=100) slider32 = models.IntegerField(min=-1, max=100) slider33 = models.IntegerField(min=-1, max=100) slider34 = models.IntegerField(min=-1, max=100) slider35 = models.IntegerField(min=-1, max=100) slider36 = models.IntegerField(min=-1, max=100) slider37 = models.IntegerField(min=-1, max=100) slider38 = models.IntegerField(min=-1, max=100) slider39 = models.IntegerField(min=-1, max=100) slider40 = models.IntegerField(min=-1, max=100) slider41 = models.IntegerField(min=-1, max=100) slider42 = models.IntegerField(min=-1, max=100) slider43 = models.IntegerField(min=-1, max=100) slider44 = models.IntegerField(min=-1, max=100) slider45 = models.IntegerField(min=-1, max=100) slider46 = models.IntegerField(min=-1, max=100) slider47 = models.IntegerField(min=-1, max=100) slider48 = models.IntegerField(min=-1, max=100) slider49 = models.IntegerField(min=-1, max=100) slider50 = models.IntegerField(min=-1, max=100) slider51 = models.IntegerField(min=-1, max=100) slider52 = models.IntegerField(min=-1, max=100) slider53 = models.IntegerField(min=-1, max=100) slider54 = models.IntegerField(min=-1, max=100) slider55 = models.IntegerField(min=-1, max=100) slider56 = models.IntegerField(min=-1, max=100) slider57 = models.IntegerField(min=-1, max=100) slider58 = models.IntegerField(min=-1, max=100) slider59 = models.IntegerField(min=-1, max=100) slider60 = models.IntegerField(min=-1, max=100) slider61 = models.IntegerField(min=-1, max=100) slider62 = models.IntegerField(min=-1, max=100) slider63 = models.IntegerField(min=-1, max=100) slider64 = models.IntegerField(min=-1, max=100) x = models.IntegerField(initial=0) y = models.IntegerField(initial=0) z = models.IntegerField(initial=0) final_payoff = models.FloatField(initial=0) player_random = models.IntegerField() profit_part1 = models.FloatField() profit_part2 = models.FloatField() age = models.IntegerField(min=10, max=100, label='What is your age?' ) gender = models.StringField( choices=[[1, 'Male'], [2, 'Female'], [3, 'Other'], [4, 'Prefer not to tell']], label='What is your gender?', widget=widgets.RadioSelect, ) nationality = models.StringField(choices=dt.list_of_countries, label='Nationality') education = models.StringField( choices=[[1, 'State exam or diploma'], [2, 'High School'], [3, 'Bachelor'], [4, 'Master'], [5, 'Doctoral']], label='The highest degree you completed' ) major = models.StringField( choices=[[1, 'Social Science'], [2, 'Natural Science'], [3, 'Formal Science'], [4, 'Other'], [5, 'Prefer not to tell']], label='What is your major?' ) class Instruction(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): if player.round_number == 1: return player.id_in_group == player.id_in_group class Slider(Page): form_model = 'player' form_fields = ['slider1', 'slider2', 'slider3', 'slider4', 'slider5', 'slider6', 'slider7', 'slider8', 'slider9', 'slider10', 'slider11', 'slider12', 'slider13', 'slider14', 'slider15', 'slider16', 'slider17', 'slider18', 'slider19', 'slider20', 'slider21', 'slider22', 'slider23', 'slider24', 'slider25', 'slider26', 'slider27', 'slider28', 'slider29', 'slider30', 'slider31', 'slider32', 'slider33', 'slider34', 'slider35', 'slider36' , 'slider37', 'slider38', 'slider39', 'slider40', 'slider41', 'slider42', 'slider43', 'slider44', 'slider45' , 'slider46', 'slider47', 'slider48', 'slider49', 'slider50', 'slider51', 'slider52', 'slider53', 'slider54' , 'slider55', 'slider56', 'slider57', 'slider58', 'slider59', 'slider60', 'slider61', 'slider62', 'slider63' , 'slider64'] timeout_seconds = 60 @staticmethod def js_vars(player: Player): return dict(endowment=C.ENDOWMENT) @staticmethod def app_after_this_page(player: Player, upcoming_apps): slider = [player.slider1, player.slider2, player.slider3, player.slider4, player.slider5, player.slider6, player.slider7, player.slider8, player.slider9, player.slider10, player.slider11, player.slider12, player.slider13, player.slider14, player.slider15, player.slider16, player.slider17, player.slider18, player.slider19, player.slider20, player.slider21, player.slider22, player.slider23, player.slider24, player.slider25, player.slider26, player.slider27, player.slider28, player.slider29, player.slider30, player.slider31, player.slider32, player.slider33, player.slider34, player.slider35, player.slider36, player.slider37, player.slider38, player.slider39, player.slider40, player.slider41, player.slider42, player.slider43, player.slider44, player.slider45, player.slider46, player.slider47, player.slider48, player.slider49, player.slider50, player.slider51, player.slider52, player.slider53, player.slider54, player.slider55, player.slider56, player.slider57, player.slider58, player.slider59, player.slider60, player.slider61, player.slider62, player.slider63, player.slider64, ] for s in slider: if s == -1: player.x = player.x player.y = player.y player.z = player.z elif s == 50: player.x = player.x + 1 player.y = player.y player.z = player.z elif s >= 0 and s < 25: player.x = player.x player.y = player.y + 1 player.z = player.z elif s >= 25 and s < 50: player.x = player.x player.y = player.y player.z = player.z + 1 elif s > 50 and s <= 75: player.x = player.x player.y = player.y player.z = player.z + 1 elif s > 75 and s <= 100: player.x = player.x player.y = player.y + 1 player.z = player.z player.quantity = player.x + player.y + player.z if player.quantity > 0: player.real_quality = round( (player.x * 1.0 + player.y * 0.1 + player.z * 0.5) / (player.x + player.y + player.z), 2) elif player.quantity == 0: player.real_quality = 0 if player.id_in_group == 1: player.quantity_A = player.quantity elif player.id_in_group == 2: player.quantity_B = player.quantity elif player.id_in_group == 3: player.quantity_C = player.quantity class MyWaitPage(WaitPage): @staticmethod def app_after_this_page(player: Player, upcoming_apps): group = player.group player_A = group.get_player_by_id(1) player_B = group.get_player_by_id(2) player_C = group.get_player_by_id(3) player.quality_A1 = round(player_A.real_quality - 0.1 * random.random(), 2) player.quality_A2 = round(player_A.real_quality + 0.1 * random.random(), 2) player.quality_B1 = round(player_B.real_quality - 0.1 * random.random(), 2) player.quality_B2 = round(player_B.real_quality + 0.1 * random.random(), 2) player.quality_C1 = round(player_C.real_quality - 0.1 * random.random(), 2) player.quality_C2 = round(player_C.real_quality + 0.1 * random.random(), 2) player.quantity_A = player_A.quantity_A player.quantity_B = player_B.quantity_B player.quantity_C = player_C.quantity_C if player.quality_A1 < 0: player.quality_A1 = 0 elif player.quality_A1 > 1: player.quality_A1 = 1 if player.quality_A2 < 0: player.quality_A2 = 0 elif player.quality_A2 > 1: player.quality_A2 = 1 if player.quality_B1 < 0: player.quality_B1 = 0 elif player.quality_B1 > 1: player.quality_B1 = 1 if player.quality_B2 < 0: player.quality_B2 = 0 elif player.quality_B2 > 1: player.quality_B2 = 1 if player.quality_C1 < 0: player.quality_C1 = 0 elif player.quality_C1 > 1: player.quality_C1 = 1 if player.quality_C2 < 0: player.quality_C2 = 0 elif player.quality_C2 > 1: player.quality_C2 = 1 class Comment_By_A(Page): form_model = 'player' form_fields = ['guess_B', 'guess_C'] @staticmethod def is_displayed(player: Player): if player.id_in_group == 1: return player.id_in_group == 1 class Comment_By_B(Page): form_model = 'player' form_fields = ['guess_A', 'guess_C'] @staticmethod def is_displayed(player: Player): if player.id_in_group == 2: return player.id_in_group == 2 class Comment_By_C(Page): form_model = 'player' form_fields = ['guess_A', 'guess_B'] @staticmethod def is_displayed(player: Player): if player.id_in_group == 3: return player.id_in_group == 3 class MyWaitPage1(WaitPage): @staticmethod def app_after_this_page(player: Player, upcoming_apps): group = player.group player_A = group.get_player_by_id(1) player_B = group.get_player_by_id(2) player_C = group.get_player_by_id(3) if player.id_in_group == 1: player.guess_from_B = player_B.guess_A player.guess_from_C = player_C.guess_A player.new_quality = round((player.guess_from_B + player.guess_from_C) / 2, 2) elif player.id_in_group == 2: player.guess_from_A = player_A.guess_B player.guess_from_C = player_C.guess_B player.new_quality = round((player.guess_from_A + player.guess_from_C) / 2, 2) elif player.id_in_group == 3: player.guess_from_A = player_A.guess_C player.guess_from_B = player_B.guess_C player.new_quality = round((player.guess_from_A + player.guess_from_B) / 2, 2) class display_for_A(Page): @staticmethod def app_after_this_page(player: Player, upcoming_apps): group = player.group player_A = group.get_player_by_id(1) player_B = group.get_player_by_id(2) player_C = group.get_player_by_id(3) if player.id_in_group == 1: player.guess_from_B = player_B.guess_A player.guess_from_C = player_C.guess_A elif player.id_in_group == 2: player.guess_from_A = player_A.guess_B player.guess_from_C = player_C.guess_B elif player.id_in_group == 3: player.guess_from_A = player_A.guess_C player.guess_from_B = player_B.guess_C @staticmethod def is_displayed(player: Player): if player.id_in_group == 1: return player.id_in_group == player.id_in_group class display_for_B(Page): @staticmethod def app_after_this_page(player: Player, upcoming_apps): group = player.group player_A = group.get_player_by_id(1) player_B = group.get_player_by_id(2) player_C = group.get_player_by_id(3) if player.id_in_group == 1: player.guess_from_B = player_B.guess_A player.guess_from_C = player_C.guess_A elif player.id_in_group == 2: player.guess_from_A = player_A.guess_B player.guess_from_C = player_C.guess_B elif player.id_in_group == 3: player.guess_from_A = player_A.guess_C player.guess_from_B = player_B.guess_C @staticmethod def is_displayed(player: Player): if player.id_in_group == 2: return player.id_in_group == player.id_in_group class display_for_C(Page): @staticmethod def app_after_this_page(player: Player, upcoming_apps): group = player.group player_A = group.get_player_by_id(1) player_B = group.get_player_by_id(2) player_C = group.get_player_by_id(3) if player.id_in_group == 1: player.guess_from_B = player_B.guess_A player.guess_from_C = player_C.guess_A elif player.id_in_group == 2: player.guess_from_A = player_A.guess_B player.guess_from_C = player_C.guess_B elif player.id_in_group == 3: player.guess_from_A = player_A.guess_C player.guess_from_B = player_B.guess_C @staticmethod def is_displayed(player: Player): if player.id_in_group == 3: return player.id_in_group == player.id_in_group class MyWaitPage2(WaitPage): @staticmethod def app_after_this_page(player: Player, upcoming_apps): group = player.group player_A = group.get_player_by_id(1) player_B = group.get_player_by_id(2) player_C = group.get_player_by_id(3) player.new_quality_A = player_A.new_quality player.new_quality_B = player_B.new_quality player.new_quality_C = player_C.new_quality player.profit = round(player.new_quality * player.quantity, 2) player.profit_A = round(player_A.new_quality * player_A.quantity, 2) player.profit_B = round(player_B.new_quality * player_B.quantity, 2) player.profit_C = round(player_C.new_quality * player_C.quantity, 2) class Display_payoff(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): if player.round_number == 3: return player.id_in_group == player.id_in_group class Questionnaire(Page): form_model = 'player' form_fields = ['age', 'gender', 'nationality', 'education', 'major'] @staticmethod def is_displayed(player: Player): if player.round_number == 3: return player.id_in_group == player.id_in_group @staticmethod def app_after_this_page(player: Player, upcoming_apps): player_round1 = player.in_round(player.round_number - 2) player_round2 = player.in_round(player.round_number - 1) player.player_random = int(random.random() * 3 + 1) if player.player_random == 0: player.profit_part2 = player_round1.profit elif player.player_random == 4: player.profit_part2 = player.profit if player.player_random == 1: player.profit_part2 = player_round1.profit elif player.player_random == 2: player.profit_part2 = player_round2.profit elif player.player_random == 3: player.profit_part2 = player.profit player.profit_part1 = player.participant.payment_part1 player.final_payoff = 3.0 + round(0.3 * (0.1 * player.profit_part1 + 0.9 * player.profit_part2), 1) page_sequence = [Instruction, Slider, MyWaitPage, Comment_By_A, Comment_By_B, Comment_By_C, MyWaitPage1, MyWaitPage2, display_for_A, display_for_B, display_for_C, Questionnaire, Display_payoff]