from otree.api import * import random import statistics # player.id_in_group == 1 buyer # player.id_in_group == 2 seller class Constants(BaseConstants): name_in_url = 'app_7_bystander_norm' players_per_group = 2 num_rounds = 5 participation_fee = cu(10) # parameters for contract bad_state_probability = 0.4 value_K = cu(200) value_G = cu(180) value_L = cu(120) cost_K = cu(30) cost_G = cu(55) cost_L = cu(40) total_quantity = 5 # 理解性测试答案 question1_answer = 725 question2_answer = 125 question3_answer = 370 question4_answer = 120 question5_answer = 390 question6_answer = 190 # 随机抽一轮 round_chosen = random.randint(1, num_rounds) class Subsession(BaseSubsession): is_bad_state = models.BooleanField() num_round_chosen = models.IntegerField() def price(label): return models.CurrencyField( choices=[60, 70, 80, 90, 100, 110], label=label, widget=widgets.RadioSelect, ) def quantity(label): return models.IntegerField( choices=[0, 1, 2, 3, 4, 5], label=label, widget=widgets.RadioSelect, ) def norm_rating(label): return models.IntegerField( choices=[0, 1, 2, 3, 4, 5], label=label, widget=widgets.RadioSelect, ) def understanding(label): return models.IntegerField( min=0, max=825, label=label, ) class Group(BaseGroup): price_good = models.CurrencyField( choices=[35, 55, 75, 95, 115, 135], widget=widgets.RadioSelect, label="好的外部经济环境下你的出价是" ) # buyer出价、seller预测价格、buyer预测seller的预判 price_bad = price('不好的外部经济环境下你的出价是') belief_seller_price_bad = price('你猜测买方在不好的外部经济环境下的出价是') belief_buyer_price_bad = price('你猜测卖方猜测你在不好的外部经济环境下的出价是') # seller选数量、buyer预测数量、seller预测buyer的预判 quantity_G_bad = quantity('你提供的G产品数量是') belief_buyer_quantity_bad = quantity('你猜测卖方提供的G产品数量是') belief_seller_quantity_bad = quantity('你猜测买方猜测你提供的G产品数量是') quantity_L_bad = models.IntegerField() class Player(BasePlayer): # define实验一的payoff total_payoff_app_1 = models.CurrencyField() # 输入理解性测试答案 question1_entered = understanding('若买方在好的外部经济环境下出价55购买K产品,外部经济状态为好,买方收益为') question2_entered = understanding('此时卖方收益为') question3_entered = understanding('若买方在好的外部经济环境下出价65购买K产品,外部经济状态为不好,买方重新出价70购买G/L产品,卖方提供2单位G产品,3单位L产品,买方收益为') question4_entered = understanding('此时卖方收益为') question5_entered = understanding('若买方在好的外部经济环境下出价35购买K产品,外部经济状态为不好,买方重新出价90购买G/L产品,卖方提供4单位G产品,1单位L产品,买方收益为') question6_entered = understanding('此时卖方收益为') # 计算player猜对rating的数量和收益 score = models.IntegerField() score_payoff = models.CurrencyField() # 计算player猜对belief的数量和收益 belief_num = models.IntegerField() belief_payoff = models.CurrencyField() # player的交易收益 trade_payoff = models.CurrencyField() # norm_rating_for_price R_P_60 = norm_rating('若买方出价60,请基于公认的社会道德规范,对买方此行为进行打分') R_P_70 = norm_rating('若买方出价70,请基于公认的社会道德规范,对买方此行为进行打分') R_P_80 = norm_rating('若买方出价80,请基于公认的社会道德规范,对买方此行为进行打分') R_P_90 = norm_rating('若买方出价90,请基于公认的社会道德规范,对买方此行为进行打分') R_P_100 = norm_rating('若买方出价100,请基于公认的社会道德规范,对买方此行为进行打分') R_P_110 = norm_rating('若买方出价110,请基于公认的社会道德规范,对买方此行为进行打分') # P=60,norm_rating_for_quantity R_Q_0_P_60 = norm_rating('若买方出价60,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_60 = norm_rating('若买方出价60,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_60 = norm_rating('若买方出价60,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_60 = norm_rating('若买方出价60,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_60 = norm_rating('若买方出价60,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_60 = norm_rating('若买方出价60,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # P=70,norm_rating_for_quantity R_Q_0_P_70 = norm_rating('若买方出价70,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_70 = norm_rating('若买方出价70,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_70 = norm_rating('若买方出价70,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_70 = norm_rating('若买方出价70,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_70 = norm_rating('若买方出价70,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_70 = norm_rating('若买方出价70,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # P=80,norm_rating_for_quantity R_Q_0_P_80 = norm_rating('若买方出价80,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_80 = norm_rating('若买方出价80,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_80 = norm_rating('若买方出价80,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_80 = norm_rating('若买方出价80,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_80 = norm_rating('若买方出价80,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_80 = norm_rating('若买方出价80,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # P=90,norm_rating_for_quantity R_Q_0_P_90 = norm_rating('若买方出价90,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_90 = norm_rating('若买方出价90,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_90 = norm_rating('若买方出价90,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_90 = norm_rating('若买方出价90,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_90 = norm_rating('若买方出价90,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_90 = norm_rating('若买方出价90,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # P=100,norm_rating_for_quantity R_Q_0_P_100 = norm_rating('若买方出价100,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_100 = norm_rating('若买方出价100,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_100 = norm_rating('若买方出价100,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_100 = norm_rating('若买方出价100,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_100 = norm_rating('若买方出价100,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_100 = norm_rating('若买方出价100,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # P=110,norm_rating_for_quantity R_Q_0_P_110 = norm_rating('若买方出价110,卖方提供0单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_1_P_110 = norm_rating('若买方出价110,卖方提供1单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_2_P_110 = norm_rating('若买方出价110,卖方提供2单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_3_P_110 = norm_rating('若买方出价110,卖方提供3单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_4_P_110 = norm_rating('若买方出价110,卖方提供4单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') R_Q_5_P_110 = norm_rating('若买方出价110,卖方提供5单位G产品,请基于公认的社会道德规范,对卖方此行为进行打分') # price & quantity in group 复制到player层级 price_in_group = models.CurrencyField() quantity_in_group = models.IntegerField() # 支付轮的组内数据 price_in_chosen_round = models.CurrencyField() quantity_G_bad_in_chosen_round = models.IntegerField() seller_payoff_in_chosen_round = models.CurrencyField() buyer_payoff_in_chosen_round = models.CurrencyField() is_bad_state_paying_round = models.BooleanField() # Functions def creating_session(subsession): # 每一轮角色保持不变 subsession.group_randomly(fixed_id_in_group=True) r = random.random() subsession.is_bad_state = (r <= Constants.bad_state_probability) for p in subsession.get_players(): p.participant.app_payoffs = {} def set_payoffs(group): group.subsession.num_round_chosen = Constants.round_chosen p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if group.subsession.is_bad_state: players = group.subsession.get_players() for player in players: player.score = 0 # price rating的分数 R_P_60_all = [p.R_P_60 for p in players] R_P_60_mode = statistics.mode(R_P_60_all) if player.R_P_60 == R_P_60_mode: player.score += 1 R_P_70_all = [p.R_P_70 for p in players] R_P_70_mode = statistics.mode(R_P_70_all) if player.R_P_70 == R_P_70_mode: player.score += 1 R_P_80_all = [p.R_P_80 for p in players] R_P_80_mode = statistics.mode(R_P_80_all) if player.R_P_80 == R_P_80_mode: player.score += 1 R_P_90_all = [p.R_P_90 for p in players] R_P_90_mode = statistics.mode(R_P_90_all) if player.R_P_90 == R_P_90_mode: player.score += 1 R_P_100_all = [p.R_P_100 for p in players] R_P_100_mode = statistics.mode(R_P_100_all) if player.R_P_100 == R_P_100_mode: player.score += 1 R_P_110_all = [p.R_P_110 for p in players] R_P_110_mode = statistics.mode(R_P_110_all) if player.R_P_110 == R_P_110_mode: player.score += 1 # P=60时,quantity rating的分数 R_Q_0_P_60_all = [p.R_Q_0_P_60 for p in players] R_Q_0_P_60_mode = statistics.mode(R_Q_0_P_60_all) if player.R_Q_0_P_60 == R_Q_0_P_60_mode: player.score += 1 R_Q_1_P_60_all = [p.R_Q_1_P_60 for p in players] R_Q_1_P_60_mode = statistics.mode(R_Q_1_P_60_all) if player.R_Q_1_P_60 == R_Q_1_P_60_mode: player.score += 1 R_Q_2_P_60_all = [p.R_Q_2_P_60 for p in players] R_Q_2_P_60_mode = statistics.mode(R_Q_2_P_60_all) if player.R_Q_2_P_60 == R_Q_2_P_60_mode: player.score += 1 R_Q_3_P_60_all = [p.R_Q_3_P_60 for p in players] R_Q_3_P_60_mode = statistics.mode(R_Q_3_P_60_all) if player.R_Q_3_P_60 == R_Q_3_P_60_mode: player.score += 1 R_Q_4_P_60_all = [p.R_Q_4_P_60 for p in players] R_Q_4_P_60_mode = statistics.mode(R_Q_4_P_60_all) if player.R_Q_4_P_60 == R_Q_4_P_60_mode: player.score += 1 R_Q_5_P_60_all = [p.R_Q_5_P_60 for p in players] R_Q_5_P_60_mode = statistics.mode(R_Q_5_P_60_all) if player.R_Q_5_P_60 == R_Q_5_P_60_mode: player.score += 1 # P=70时,quantity rating的分数 R_Q_0_P_70_all = [p.R_Q_0_P_70 for p in players] R_Q_0_P_70_mode = statistics.mode(R_Q_0_P_70_all) if player.R_Q_0_P_70 == R_Q_0_P_70_mode: player.score += 1 R_Q_1_P_70_all = [p.R_Q_1_P_70 for p in players] R_Q_1_P_70_mode = statistics.mode(R_Q_1_P_70_all) if player.R_Q_1_P_70 == R_Q_1_P_70_mode: player.score += 1 R_Q_2_P_70_all = [p.R_Q_2_P_70 for p in players] R_Q_2_P_70_mode = statistics.mode(R_Q_2_P_70_all) if player.R_Q_2_P_70 == R_Q_2_P_70_mode: player.score += 1 R_Q_3_P_70_all = [p.R_Q_3_P_70 for p in players] R_Q_3_P_70_mode = statistics.mode(R_Q_3_P_70_all) if player.R_Q_3_P_70 == R_Q_3_P_70_mode: player.score += 1 R_Q_4_P_70_all = [p.R_Q_4_P_70 for p in players] R_Q_4_P_70_mode = statistics.mode(R_Q_4_P_70_all) if player.R_Q_4_P_70 == R_Q_4_P_70_mode: player.score += 1 R_Q_5_P_70_all = [p.R_Q_5_P_70 for p in players] R_Q_5_P_70_mode = statistics.mode(R_Q_5_P_70_all) if player.R_Q_5_P_70 == R_Q_5_P_70_mode: player.score += 1 # P=80时,quantity rating的分数 R_Q_0_P_80_all = [p.R_Q_0_P_80 for p in players] R_Q_0_P_80_mode = statistics.mode(R_Q_0_P_80_all) if player.R_Q_0_P_80 == R_Q_0_P_80_mode: player.score += 1 R_Q_1_P_80_all = [p.R_Q_1_P_80 for p in players] R_Q_1_P_80_mode = statistics.mode(R_Q_1_P_80_all) if player.R_Q_1_P_80 == R_Q_1_P_80_mode: player.score += 1 R_Q_2_P_80_all = [p.R_Q_2_P_80 for p in players] R_Q_2_P_80_mode = statistics.mode(R_Q_2_P_80_all) if player.R_Q_2_P_80 == R_Q_2_P_80_mode: player.score += 1 R_Q_3_P_80_all = [p.R_Q_3_P_80 for p in players] R_Q_3_P_80_mode = statistics.mode(R_Q_3_P_80_all) if player.R_Q_3_P_80 == R_Q_3_P_80_mode: player.score += 1 R_Q_4_P_80_all = [p.R_Q_4_P_80 for p in players] R_Q_4_P_80_mode = statistics.mode(R_Q_4_P_80_all) if player.R_Q_4_P_80 == R_Q_4_P_80_mode: player.score += 1 R_Q_5_P_80_all = [p.R_Q_5_P_80 for p in players] R_Q_5_P_80_mode = statistics.mode(R_Q_5_P_80_all) if player.R_Q_5_P_80 == R_Q_5_P_80_mode: player.score += 1 # P=90时,quantity rating的分数 R_Q_0_P_90_all = [p.R_Q_0_P_90 for p in players] R_Q_0_P_90_mode = statistics.mode(R_Q_0_P_90_all) if player.R_Q_0_P_90 == R_Q_0_P_90_mode: player.score += 1 R_Q_1_P_90_all = [p.R_Q_1_P_90 for p in players] R_Q_1_P_90_mode = statistics.mode(R_Q_1_P_90_all) if player.R_Q_1_P_90 == R_Q_1_P_90_mode: player.score += 1 R_Q_2_P_90_all = [p.R_Q_2_P_90 for p in players] R_Q_2_P_90_mode = statistics.mode(R_Q_2_P_90_all) if player.R_Q_2_P_90 == R_Q_2_P_90_mode: player.score += 1 R_Q_3_P_90_all = [p.R_Q_3_P_90 for p in players] R_Q_3_P_90_mode = statistics.mode(R_Q_3_P_90_all) if player.R_Q_3_P_90 == R_Q_3_P_90_mode: player.score += 1 R_Q_4_P_90_all = [p.R_Q_4_P_90 for p in players] R_Q_4_P_90_mode = statistics.mode(R_Q_4_P_90_all) if player.R_Q_4_P_90 == R_Q_4_P_90_mode: player.score += 1 R_Q_5_P_90_all = [p.R_Q_5_P_90 for p in players] R_Q_5_P_90_mode = statistics.mode(R_Q_5_P_90_all) if player.R_Q_5_P_90 == R_Q_5_P_90_mode: player.score += 1 # P=100时,quantity rating的分数 R_Q_0_P_100_all = [p.R_Q_0_P_100 for p in players] R_Q_0_P_100_mode = statistics.mode(R_Q_0_P_100_all) if player.R_Q_0_P_100 == R_Q_0_P_100_mode: player.score += 1 R_Q_1_P_100_all = [p.R_Q_1_P_100 for p in players] R_Q_1_P_100_mode = statistics.mode(R_Q_1_P_100_all) if player.R_Q_1_P_100 == R_Q_1_P_100_mode: player.score += 1 R_Q_2_P_100_all = [p.R_Q_2_P_100 for p in players] R_Q_2_P_100_mode = statistics.mode(R_Q_2_P_100_all) if player.R_Q_2_P_100 == R_Q_2_P_100_mode: player.score += 1 R_Q_3_P_100_all = [p.R_Q_3_P_100 for p in players] R_Q_3_P_100_mode = statistics.mode(R_Q_3_P_100_all) if player.R_Q_3_P_100 == R_Q_3_P_100_mode: player.score += 1 R_Q_4_P_100_all = [p.R_Q_4_P_100 for p in players] R_Q_4_P_100_mode = statistics.mode(R_Q_4_P_100_all) if player.R_Q_4_P_100 == R_Q_4_P_100_mode: player.score += 1 R_Q_5_P_100_all = [p.R_Q_5_P_100 for p in players] R_Q_5_P_100_mode = statistics.mode(R_Q_5_P_100_all) if player.R_Q_5_P_100 == R_Q_5_P_100_mode: player.score += 1 # P=110时,quantity rating的分数 R_Q_0_P_110_all = [p.R_Q_0_P_110 for p in players] R_Q_0_P_110_mode = statistics.mode(R_Q_0_P_110_all) if player.R_Q_0_P_110 == R_Q_0_P_110_mode: player.score += 1 R_Q_1_P_110_all = [p.R_Q_1_P_110 for p in players] R_Q_1_P_110_mode = statistics.mode(R_Q_1_P_110_all) if player.R_Q_1_P_110 == R_Q_1_P_110_mode: player.score += 1 R_Q_2_P_110_all = [p.R_Q_2_P_110 for p in players] R_Q_2_P_110_mode = statistics.mode(R_Q_2_P_110_all) if player.R_Q_2_P_110 == R_Q_2_P_110_mode: player.score += 1 R_Q_3_P_110_all = [p.R_Q_3_P_110 for p in players] R_Q_3_P_110_mode = statistics.mode(R_Q_3_P_110_all) if player.R_Q_3_P_110 == R_Q_3_P_110_mode: player.score += 1 R_Q_4_P_110_all = [p.R_Q_4_P_110 for p in players] R_Q_4_P_110_mode = statistics.mode(R_Q_4_P_110_all) if player.R_Q_4_P_110 == R_Q_4_P_110_mode: player.score += 1 R_Q_5_P_110_all = [p.R_Q_5_P_110 for p in players] R_Q_5_P_110_mode = statistics.mode(R_Q_5_P_110_all) if player.R_Q_5_P_110 == R_Q_5_P_110_mode: player.score += 1 # 计算seller/buyer价格预测是否对 p1.belief_num = 0 p2.belief_num = 0 if group.belief_buyer_price_bad == group.belief_seller_price_bad: p1.belief_num += 1 if group.belief_seller_price_bad == group.price_bad: p2.belief_num += 1 # 计算seller/buyer数量预测是否对 if group.belief_buyer_quantity_bad == group.quantity_G_bad: p1.belief_num += 1 if group.belief_seller_quantity_bad == group.belief_buyer_quantity_bad: p2.belief_num += 1 # 计算seller/buyer每一轮的收益:交易收益+预测收益+rating收益 p1.score_payoff = 10 * p1.score p2.score_payoff = 10 * p2.score p1.belief_payoff = 10 * p1.belief_num p2.belief_payoff = 10 * p2.belief_num group.quantity_L_bad = Constants.total_quantity - group.quantity_G_bad p1.trade_payoff = (Constants.value_G - group.price_bad) * group.quantity_G_bad + ( Constants.value_L - group.price_bad) * group.quantity_L_bad p2.trade_payoff = (group.price_bad - Constants.cost_G) * group.quantity_G_bad + ( group.price_bad - Constants.cost_L) * group.quantity_L_bad p1.payoff = p1.trade_payoff + p1.score_payoff + p1.belief_payoff p2.payoff = p2.trade_payoff + p2.score_payoff + p2.belief_payoff else: p1.payoff = (Constants.value_K - group.price_good) * Constants.total_quantity p2.payoff = (group.price_good - Constants.cost_K) * Constants.total_quantity print(p1.id_in_group, p2.id_in_group) def set_values(group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if group.subsession.is_bad_state: p1.price_in_group = group.price_bad p1.quantity_in_group = group.quantity_G_bad p2.price_in_group = group.price_bad p2.quantity_in_group = group.quantity_G_bad print(p1.quantity_in_group, p1.price_in_group, p1.payoff, p2.quantity_in_group, p2.price_in_group, p2.payoff) else: p1.price_in_group = group.price_good p2.price_in_group = group.price_good print(p1.price_in_group, p1.payoff, p2.price_in_group, p2.payoff) def set_potential_payoffs(player): player_in_chosen_round = player.in_round(Constants.round_chosen) print(player_in_chosen_round) group_method = player_in_chosen_round.group player.total_payoff_app_1 = player_in_chosen_round.payoff player.buyer_payoff_in_chosen_round = group_method.get_player_by_id(1).payoff player.seller_payoff_in_chosen_round = group_method.get_player_by_id(2).payoff player.is_bad_state_paying_round = group_method.subsession.is_bad_state if player.is_bad_state_paying_round: player.price_in_chosen_round = player_in_chosen_round.price_in_group player.quantity_G_bad_in_chosen_round = player_in_chosen_round.quantity_in_group else: player.price_in_chosen_round = player_in_chosen_round.price_in_group class Welcome(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class Welcome_design(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class task(Page): form_model = 'player' form_fields = ['question1_entered', 'question2_entered', 'question3_entered', 'question4_entered', 'question5_entered', 'question6_entered'] @staticmethod def error_message(player, values): if values['question1_entered'] != Constants.question1_answer: return '计算有误,请仔细检查并更正!' if values['question2_entered'] != Constants.question2_answer: return '计算有误,请仔细检查并更正!' if values['question3_entered'] != Constants.question3_answer: return '计算有误,请仔细检查并更正!' if values['question4_entered'] != Constants.question4_answer: return '计算有误,请仔细检查并更正!' if values['question5_entered'] != Constants.question5_answer: return '计算有误,请仔细检查并更正!' if values['question6_entered'] != Constants.question6_answer: return '计算有误,请仔细检查并更正!' @staticmethod def is_displayed(player): return player.round_number == 1 class RoleAssign(Page): pass class RatingReveal(Page): pass class GoodStatePrice(Page): form_model = 'group' form_fields = ['price_good'] @staticmethod def is_displayed(player): return player.id_in_group == 1 class WaitP1_GoodState(WaitPage): wait_for_all_groups = True class StateReveal(Page): pass class BadStatePrice(Page): form_model = 'group' form_fields = ['price_bad'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state and player.id_in_group == 1 class Belief_Seller_Price_Bad(Page): form_model = 'group' form_fields = ['belief_seller_price_bad'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state and player.id_in_group == 2 class Belief_Buyer_Price_Bad(Page): form_model = 'group' form_fields = ['belief_buyer_price_bad'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state and player.id_in_group == 1 class Rating_Price_Bad(Page): form_model = 'player' form_fields = ['R_P_60', 'R_P_70', 'R_P_80', 'R_P_90', 'R_P_100', 'R_P_110'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state class WaitP1_BadState(WaitPage): @staticmethod def is_displayed(player): return player.subsession.is_bad_state class BadStateQuantity(Page): form_model = 'group' form_fields = ['quantity_G_bad'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state and player.id_in_group == 2 class Belief_Buyer_Quantity_Bad(Page): form_model = 'group' form_fields = ['belief_buyer_quantity_bad'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state and player.id_in_group == 1 class Belief_Seller_Quantity_Bad(Page): form_model = 'group' form_fields = ['belief_seller_quantity_bad'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state and player.id_in_group == 2 class Rating_Quantity_P_60(Page): form_model = 'player' form_fields = ['R_Q_0_P_60', 'R_Q_1_P_60', 'R_Q_2_P_60', 'R_Q_3_P_60', 'R_Q_4_P_60', 'R_Q_5_P_60'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state class Rating_Quantity_P_70(Page): form_model = 'player' form_fields = ['R_Q_0_P_70', 'R_Q_1_P_70', 'R_Q_2_P_70', 'R_Q_3_P_70', 'R_Q_4_P_70', 'R_Q_5_P_70'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state class Rating_Quantity_P_80(Page): form_model = 'player' form_fields = ['R_Q_0_P_80', 'R_Q_1_P_80', 'R_Q_2_P_80', 'R_Q_3_P_80', 'R_Q_4_P_80', 'R_Q_5_P_80'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state class Rating_Quantity_P_90(Page): form_model = 'player' form_fields = ['R_Q_0_P_90', 'R_Q_1_P_90', 'R_Q_2_P_90', 'R_Q_3_P_90', 'R_Q_4_P_90', 'R_Q_5_P_90'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state class Rating_Quantity_P_100(Page): form_model = 'player' form_fields = ['R_Q_0_P_100', 'R_Q_1_P_100', 'R_Q_2_P_100', 'R_Q_3_P_100', 'R_Q_4_P_100', 'R_Q_5_P_100'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state class Rating_Quantity_P_110(Page): form_model = 'player' form_fields = ['R_Q_0_P_110', 'R_Q_1_P_110', 'R_Q_2_P_110', 'R_Q_3_P_110', 'R_Q_4_P_110', 'R_Q_5_P_110'] @staticmethod def is_displayed(player): return player.subsession.is_bad_state class WaitP2_BadState(WaitPage): wait_for_all_groups = True @staticmethod def is_displayed(player): return player.subsession.is_bad_state class WaitRoundResults(WaitPage): after_all_players_arrive = set_payoffs class RoundResults(Page): pass class CalculateWait1Page(WaitPage): after_all_players_arrive = set_values class CalculateWait2Page(WaitPage): after_all_players_arrive = set_potential_payoffs @staticmethod def is_displayed(player): return player.round_number == Constants.num_rounds class Results(Page): @staticmethod def vars_for_template(player: Player): player_in_chosen_round = player.in_round(Constants.round_chosen) group_chosen = player_in_chosen_round.group player.total_payoff_app_1 = player_in_chosen_round.payoff player.buyer_payoff_in_chosen_round = group_chosen.get_player_by_id(1).payoff player.seller_payoff_in_chosen_round = group_chosen.get_player_by_id(2).payoff player.is_bad_state_paying_round = group_chosen.subsession.is_bad_state if player.is_bad_state_paying_round: player.price_in_chosen_round = player_in_chosen_round.price_in_group player.quantity_G_bad_in_chosen_round = player_in_chosen_round.quantity_in_group else: player.price_in_chosen_round = player_in_chosen_round.price_in_group @staticmethod def is_displayed(player): return player.round_number == Constants.num_rounds class WaitforAPP2(WaitPage): @staticmethod def after_all_players_arrive(group: Group): group_chosen = group.in_round(Constants.round_chosen) for p in group_chosen.get_players(): participant = p.participant participant.past_group_id = group_chosen.id participant.past_id_in_group = p.id_in_group participant.app_payoffs['app_1_base_norm'] = p.payoff @staticmethod def is_displayed(player): return player.round_number == Constants.num_rounds page_sequence = [ Welcome, Welcome_design, task, RoleAssign, RatingReveal, GoodStatePrice, WaitP1_GoodState, StateReveal, BadStatePrice, Belief_Seller_Price_Bad, Belief_Buyer_Price_Bad, Rating_Price_Bad, WaitP1_BadState, BadStateQuantity, Belief_Buyer_Quantity_Bad, Belief_Seller_Quantity_Bad, Rating_Quantity_P_60, Rating_Quantity_P_70, Rating_Quantity_P_80, Rating_Quantity_P_90, Rating_Quantity_P_100, Rating_Quantity_P_110, WaitP2_BadState, WaitRoundResults, RoundResults, CalculateWait1Page, Results, WaitforAPP2 ]