from otree.api import Page from otree.api import WaitPage from otree.api import ( Currency as c, currency_range, SubmissionMustFail, Submission ) from .models import Constants, Group, Player import random class Instruction(Page): def is_displayed(self): return self.round_number == 1 # # class ShuffleWaitPage(WaitPage): # def after_all_players_arrive(self): # for p in self.subsession.get_players(): # if p.id_in_group == 1: # if p.participant.vars['realized'] == 0: # p.participant.vars['grouping'] = 'Ori_A' # else: # p.participant.vars['grouping'] = 'Re_A' # else: # if p.participant.vars['realized'] == 0: # p.participant.vars['grouping'] = 'Ori_B' # else: # p.participant.vars['grouping'] = 'Re_B' # # Ori_A_players = [p for p in self.subsession.get_players() if p.participant.vars['grouping'] == 'Ori_A'] # Re_A_players = [p for p in self.subsession.get_players() if p.participant.vars['grouping'] == 'Re_A'] # Ori_B_players = [p for p in self.subsession.get_players() if p.participant.vars['grouping'] == 'Ori_B'] # Re_B_players = [p for p in self.subsession.get_players() if p.participant.vars['grouping'] == 'Re_B'] # print(Ori_A_players ) # print(Re_A_players) # print(Ori_B_players) # print(Re_B_players) # # if self.round_number == 1: # # Generate group matrix # random.shuffle(Ori_A_players) # random.shuffle(Re_A_players) # random.shuffle(Ori_B_players) # random.shuffle(Re_B_players) # matrix = [] # for i in range(len(Ori_A_players)): # matrix.append([Ori_A_players[i], Ori_B_players[i]]) # for i in range(len(Re_A_players)): # matrix.append([Re_A_players[i], Re_B_players[i]]) # # self.subsession.set_group_matrix(matrix) # print(self.subsession.set_group_matrix(matrix)) # # else: # # Generate group matrix # random.shuffle(Ori_A_players) # random.shuffle(Re_A_players) # random.shuffle(Ori_B_players) # random.shuffle(Re_B_players) # matrix = [] # for i in range(len(Ori_A_players)): # matrix.append([Ori_A_players[i], Ori_B_players[i]]) # for i in range(len(Re_A_players)): # matrix.append([Re_A_players[i], Re_B_players[i]]) # self.subsession.set_group_matrix(matrix) # print(self.subsession.set_group_matrix(matrix)) # # for p in self.subsession.get_players(): # if p.participant.vars['grouping'] == 'Ori_A' or p.participant.vars['grouping'] == 'Ori_B': # p.group.task = 1 # else: # p.group.task = 2 # class Decision_Row(Page): def is_displayed(self): return self.player.id_in_group == 1 form_model = 'group' def get_form_fields(self): if self.participant.vars['realized'] == 0: return ['player1_decision_ori'] else: return ['player1_decision_re'] class Decision_Column(Page): def is_displayed(self): return self.player.id_in_group == 2 form_model = 'group' form_fields = ['player2_decision'] def before_next_page(self): self.group.task = self.participant.vars['realized'] class Waitforall(WaitPage): def after_all_players_arrive(self): p1 = self.group.get_player_by_id(1) p2 = self.group.get_player_by_id(2) if self.group.task == 0: if self.group.player1_decision_ori == 'U' and self.group.player2_decision == 'L': p1.round_payoff = Constants.Row_Payoff[0][0] p2.round_payoff = Constants.Column_Payoff[0][0] p2.other_payoff = Constants.Row_Payoff[0][0] p1.other_payoff = Constants.Column_Payoff[0][0] elif self.group.player1_decision_ori == 'U' and self.group.player2_decision == 'N': p1.round_payoff = Constants.Row_Payoff[0][1] p2.round_payoff = Constants.Column_Payoff[0][1] p2.other_payoff = Constants.Row_Payoff[0][1] p1.other_payoff = Constants.Column_Payoff[0][1] elif self.group.player1_decision_ori == 'U' and self.group.player2_decision == 'R': p1.round_payoff = Constants.Row_Payoff[0][2] p2.round_payoff = Constants.Column_Payoff[0][2] p2.other_payoff = Constants.Row_Payoff[0][2] p1.other_payoff = Constants.Column_Payoff[0][2] elif self.group.player1_decision_ori == 'M' and self.group.player2_decision == 'L': p1.round_payoff = Constants.Row_Payoff[1][0] p2.round_payoff = Constants.Column_Payoff[1][0] p2.other_payoff = Constants.Row_Payoff[1][0] p1.other_payoff = Constants.Column_Payoff[1][0] elif self.group.player1_decision_ori == 'M' and self.group.player2_decision == 'N': p1.round_payoff = Constants.Row_Payoff[1][1] p2.round_payoff = Constants.Column_Payoff[1][1] p2.other_payoff = Constants.Row_Payoff[1][1] p1.other_payoff = Constants.Column_Payoff[1][1] elif self.group.player1_decision_ori == 'M' and self.group.player2_decision == 'R': p1.round_payoff = Constants.Row_Payoff[1][2] p2.round_payoff = Constants.Column_Payoff[1][2] p2.other_payoff = Constants.Row_Payoff[1][2] p1.other_payoff = Constants.Column_Payoff[1][2] elif self.group.player1_decision_ori == 'D' and self.group.player2_decision == 'L': p1.round_payoff = Constants.Row_Payoff[2][0] p2.round_payoff = Constants.Column_Payoff[2][0] p2.other_payoff = Constants.Row_Payoff[2][0] p1.other_payoff = Constants.Column_Payoff[2][0] elif self.group.player1_decision_ori == 'D' and self.group.player2_decision == 'N': p1.round_payoff = Constants.Row_Payoff[2][1] p2.round_payoff = Constants.Column_Payoff[2][1] p2.other_payoff = Constants.Row_Payoff[2][1] p1.other_payoff = Constants.Column_Payoff[2][1] else: p1.round_payoff = Constants.Row_Payoff[2][2] p2.round_payoff = Constants.Column_Payoff[2][2] p2.other_payoff = Constants.Row_Payoff[2][2] p1.other_payoff = Constants.Column_Payoff[2][2] else: if self.group.player1_decision_re == 'U' and self.group.player2_decision == 'L': p1.round_payoff = Constants.Row_Payoff[0][0] p2.round_payoff = Constants.Column_Payoff[0][0] p2.other_payoff = Constants.Row_Payoff[0][0] p1.other_payoff = Constants.Column_Payoff[0][0] elif self.group.player1_decision_re == 'U' and self.group.player2_decision == 'N': p1.round_payoff = Constants.Row_Payoff[0][1] p2.round_payoff = Constants.Column_Payoff[0][1] p2.other_payoff = Constants.Row_Payoff[0][1] p1.other_payoff = Constants.Column_Payoff[0][1] elif self.group.player1_decision_re == 'U' and self.group.player2_decision == 'R': p1.round_payoff = Constants.Row_Payoff[0][2] p2.round_payoff = Constants.Column_Payoff[0][2] p2.other_payoff = Constants.Row_Payoff[0][2] p1.other_payoff = Constants.Column_Payoff[0][2] elif self.group.player1_decision_re == 'M' and self.group.player2_decision == 'L': p1.round_payoff = Constants.Row_Payoff[1][0] p2.round_payoff = Constants.Column_Payoff[1][0] p2.other_payoff = Constants.Row_Payoff[1][0] p1.other_payoff = Constants.Column_Payoff[1][0] elif self.group.player1_decision_re == 'M' and self.group.player2_decision == 'N': p1.round_payoff = Constants.Row_Payoff[1][1] p2.round_payoff = Constants.Column_Payoff[1][1] p2.other_payoff = Constants.Row_Payoff[1][1] p1.other_payoff = Constants.Column_Payoff[1][1] else: p1.round_payoff = Constants.Row_Payoff[1][2] p2.round_payoff = Constants.Column_Payoff[1][2] p2.other_payoff = Constants.Row_Payoff[1][2] p1.other_payoff = Constants.Column_Payoff[1][2] for p in self.group.get_players(): app2_list = p.participant.vars.get('app2_payoffs',[]) app2_list.append(p.round_payoff) p.participant.vars['app2_payoffs'] = app2_list for p in self.group.get_players(): if self.round_number == Constants.num_rounds: payoff_list = p.participant.vars.get('payoffs', []) app2_list = p.participant.vars.get('app2_payoffs', []) payoff_list.append(app2_list) p.participant.vars['payoffs'] = payoff_list class Results(Page): def vars_for_template(self): round = self.round_number return{'round': round} page_sequence = [Instruction, Decision_Row, Decision_Column, Waitforall, Results]