from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants from operator import itemgetter import random import numpy class WelcomePage(Page): def before_next_page(self): self.player.assign_recipents() class Instruction1(Page): form_model = 'player' form_fields = ['CQ1', 'CQ2'] # def is_displayed(self): # return self.round_number == 1 def error_message(self, values): if values['CQ1'] != 3: return "You made a mistake. Please correct it before going on." if values['CQ2'] != 4: return "You made a mistake. Please correct it before going on." class Quiz(Page): form_model = 'player' form_fields = ['correctN', 'choices'] def before_next_page(self): print('His GRE choices are', self.player.choices) print('His correct number is', self.player.correctN) class ResultsWaitPage(WaitPage): wait_for_all_groups = True def after_all_players_arrive(self): players = self.subsession.get_players() all_id_score = [] h_id = [] l_id = [] for player in players: all_id_score.append((player, player.correctN)) all_id_score.sort(reverse=True, key=itemgetter(1)) for player in players: player.rank = all_id_score.index((player, player.correctN))+1 # python starts from 0 if player.rank < Constants.total_number/2 + 1: h_id.append(player) player.top_p = "high" else: l_id.append(player) print('rank', player.rank) random.shuffle(h_id) random.shuffle(l_id) for player in h_id: if h_id.index(player)+1 < Constants.total_number/2*Constants.rate+1: player.prize = "prize owner" for player in l_id: if l_id.index(player)+1 <= Constants.total_number/2*(1-Constants.rate): player.prize = "prize owner" for player in players: player.reci1_top = player.group.get_player_by_id(player.recipient_1).top_p player.reci1_prize = player.group.get_player_by_id(player.recipient_1).prize player.reci2_top = player.group.get_player_by_id(player.recipient_2).top_p player.reci2_prize = player.group.get_player_by_id(player.recipient_2).prize class Performance(Page): pass class Prize(Page): pass class Instruction2(Page): form_model = 'player' form_fields = ['CQ3', 'CQ4'] def error_message(self, values): if values['CQ3'] != 1: return "You made a mistake. Please correct it before going on." if values['CQ4'] != 4: return "You made a mistake. Please correct it before going on." class IdentitySelection(Page): form_model = 'player' form_fields = ['selection'] def before_next_page(self): print('player:', self.player.id_in_group) print('selection:', self.player.selection) print('reci1_top:', self.group.get_player_by_id(self.player.recipient_1).top_p) print('reci1_prize:', self.group.get_player_by_id(self.player.recipient_1).prize) class Allocation(Page): form_model = 'player' form_fields = ['allocation_1', 'allocation_2'] def js_vars(self): player = self.player return dict( selection=player.selection, own_top=player.top_p, own_prize=player.prize, reci1_top=player.reci1_top, reci1_prize=player.reci1_prize, reci2_top=player.reci2_top, reci2_prize=player.reci2_prize, ) def before_next_page(self): if self.player.id_in_group == self.subsession.DM: self.player.payoff = c(15) self.group.allocation_1 = self.player.allocation_1 self.group.allocation_2 = self.player.allocation_2 class AllocationWaitPage(WaitPage): wait_for_all_groups = True def after_all_players_arrive(self): # define payoffs for each member in a group players = self.subsession.get_players() for player in players: if player.id_in_group == player.group.recipient_1: player.payoff = player.group.allocation_1 if player.id_in_group == player.group.recipient_2: player.payoff = player.group.allocation_2 page_sequence = [WelcomePage, Instruction1, Quiz, ResultsWaitPage, Performance, Prize, Instruction2, IdentitySelection, Allocation, AllocationWaitPage]