from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import random class stop(Page): def is_displayed(self): return self.round_number == 1 class rensyu(Page): def is_displayed(self): return self.round_number == 1 timeout_seconds = 15 class teian(Page): form_model = 'player' form_fields = ['teian'] class teian_result(WaitPage): pass class binjo(Page): def is_displayed(self): return any(player.teian == '提案しない' for player in self.group.get_players()) and any(player.teian == '提案する' for player in self.group.get_players()) form_model = 'player' form_fields = ['binjo'] class binjo_wait(WaitPage): pass class hokoku_first(Page): timeout_seconds = 30 def is_displayed(self): return all(player.teian == '提案する' for player in self.group.get_players()) or all(player.binjo == '参加する' for player in self.group.get_players()) form_model = 'player' form_fields = ['hokoku_1'] def before_next_page(self): self.player.set_all_question_to_yes_1() class wait_chat(WaitPage): pass class caltel_choice(Page): timeout_seconds = 120 def is_displayed(self): return all(player.teian == '提案する' for player in self.group.get_players()) or all(player.binjo == '参加する' for player in self.group.get_players()) form_model = 'player' form_fields = ['choice_number','hokoku_2'] def before_next_page(self): self.player.set_all_question_to_yes_2() class wait_page(WaitPage): pass class hokoku_last(Page): timeout_seconds = 30 def is_displayed(self): return all(player.teian == '提案する' for player in self.group.get_players()) or all(player.binjo == '参加する' for player in self.group.get_players()) form_model = 'player' form_fields = ['hokoku_3'] class all_not_teian_choice(Page): timeout_seconds = 60 def is_displayed(self): return all(player.teian == '提案しない' for player in self.group.get_players()) form_model = 'player' form_fields = ['choice_number'] class not_caltel_choice(Page): timeout_seconds = 60 def is_displayed(self): return any(player.binjo == '参加しない' for player in self.group.get_players()) form_model = 'player' form_fields = ['choice_number'] class calculation_1(WaitPage): def after_all_players_arrive(self): for player in self.group.get_players(): player.set_soten() group = self.group choices = [p.choice_number for p in group.get_players()] group.min_choice = min(choices) for player in group.get_players(): if player.choice_number == group.min_choice: num_players_with_min_choice = choices.count(group.min_choice) player.points = 1 / num_players_with_min_choice else: player.points = 0 class calculation_2(WaitPage): def after_all_players_arrive(self): for player in self.group.get_players(): player.set_simple_point() class calculation_3(WaitPage): def is_displayed(self): binjo_players = self.group.get_players() return all(player.teian == '提案する' for player in self.group.get_players()) or all(player.binjo == '参加する' for player in binjo_players) def after_all_players_arrive(self): players = self.group.get_players() players.sort(key= lambda x:(x.hokoku_1,x.hokoku_2,x.hokoku_3),reverse = True) for i,player in enumerate(players,1): player.rank = i #tied_rank_list = [i for i,player in enumerate(players) if player.rank == players[0].rank] #for player in players: # player.tie_penalty_point(tied_rank_list) player.rank_point() class calculation_4(WaitPage): def before_next_page(self): self.player.random_time = random.randint(1,10) def is_displayed(self): return self.player.random_time == 1 def after_all_players_arrive(self): for player in self.group.get_players(): player.set_penalty_random() player.set_penalty_random_point() class Results(Page): timeout_seconds = 15 page_sequence = [stop,rensyu,teian,teian_result,binjo,binjo_wait,hokoku_first,wait_chat,caltel_choice,wait_page,hokoku_last,all_not_teian_choice,not_caltel_choice, calculation_1,calculation_2,calculation_3,calculation_4,Results]