from . import models from ._builtin import Page, WaitPage from .models import Constants class Introduction(Page): def is_displayed(self): return self.subsession.round_number == 1 # this page is only display for member, this is the first member contribution page class MemberContribute(Page): def is_displayed(self): return self.player.role() != 'leader' form_model = models.Player form_fields = ['member_contribute'] class SimpleWaitPage2(WaitPage): def after_all_players_arrive(self): self.group.current() class LeaderContribute(Page): def is_displayed(self): return self.player.role() == 'leader' form_model = models.Player form_fields = ['leader_contribute'] class SimpleWaitPage(WaitPage): pass # class Purchase(Page): # def is_displayed(self): # return self.player.role() == 'leader' # # form_model = models.Group # form_fields = ['member_id'] # this is leader's decision page for take away points of members. class LeaderDecision(Page): def is_displayed(self): return self.player.role() == 'leader' def vars_for_template(self): return self.group.current() form_model = models.Group form_fields = ['decision_member1', 'decision_member2', 'decision_member3'] def error_message(self, values): if values["decision_member1"] + values["decision_member2"] + values["decision_member3"] >= 120: return 'The numbers must add up to 120' class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): self.group.current() class Results(Page): def vars_for_template(self): return self.group.set_payoffs() class FinalResults(Page): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds def vars_for_template(self): return self.subsession.vars_for_admin_report() class BidLeader(Page): def is_displayed(self): return self.player.role() == 'member' form_model = models.Player form_field = ['bid_leader'] class ShuffleWaitPage(WaitPage): wait_for_all_groups = True # we can't shuffle at the beginning of round 1, # because the score has not been determined yet def is_displayed(self): return self.round_number > 1 def after_all_players_arrive(self): # sort players by 'score' # see python docs on sorted() function sorted_players = sorted( self.subsession.get_players(), key=lambda player: player.participant.vars['bid_leader'] ) # chunk players into groups group_matrix = [] ppg = Constants.players_per_group for i in range(0, len(sorted_players), ppg): group_matrix.append(sorted_players[i:i+ppg]) # set new groups self.subsession.set_group_matrix(group_matrix) class GroupingWaitPage(WaitPage): group_by_arrival_time = True def get_players_for_group(self, waiting_players): print('in get_players_for_group') leader_players = [p for p in waiting_players if p.participant.vars['type'] == 'C (participants who removed the fewest points)' or p.participant.vars['type'] == 'A (participants who removed the most points)'] dom_member = [p for p in waiting_players if p.participant.vars['member_type'] == 'Category A (participants who removed the most points)'] nondom_member = [p for p in waiting_players if p.participant.vars['member_type'] == 'Category C (participants who removed the fewest points)'] if len(leader_players) >= 1 and (len(dom_member) >= 1 or len(nondom_member) >=1): print('about to create a group') for p in leader_players: if p.participant.vars['type'] == 'A (participants who removed the most points)': return [leader_players[0],dom_member[0], dom_member[1], dom_member[2]] elif p.participant.vars['type'] == 'C (participants who removed the fewest points)': return [leader_players[0], nondom_member[0], nondom_member[1], nondom_member[2]] print('not enough players to create a group') page_sequence = [ GroupingWaitPage, LeaderContribute, MemberContribute, SimpleWaitPage2, LeaderDecision, ResultsWaitPage, Results, ]