from otree.api import * doc = """ chat_test """ PPG = 3 class C(BaseConstants): NAME_IN_URL = 'chat_test' PLAYERS_PER_GROUP = PPG NUM_ROUNDS = 1 PAYOFF_MUTUAL_H = 0 PAYOFF_MUTUAL_L = 6 PAYOFF_H_WHEN_HL = 16 PAYOFF_L_WHEN_HL = 4 CHOICES = [0, 1] GREEN_ROLE = 'Green' BLUE_ROLE = 'Blue' RED_ROLE = 'Red' class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): coordinate = models.BooleanField( label="Please choose Action H or Action L.", choices=[ [True, 'L'], [False, 'H'], ] ) leave_status = models.StringField( choices=['Stay', 'LeavePending', 'LeaveConfirmed'], default='Stay', ) def other_player(self): return self.get_others_in_group()[0] def is_mediator(self): return True if self.role == 'Red' else False def get_partner(player: Player): return player.get_others_in_group()[0] # PAGES class Introduction(Page): @staticmethod def js_vars(player: Player): return dict(is_mediator=player.is_mediator()) class Chat(Page): @staticmethod def vars_for_template(player: Player): return dict(nickname=player.role, partner=get_partner(player).role) @staticmethod def js_vars(player: Player): return dict(my_id=player.id_in_group, my_role=player.role) @staticmethod def live_method(player: Player, data): partner = get_partner(player) if 'leaveChatOffer' in data: leaveChatOffers[player.participant.id_in_session] = data['leaveChatOffer'] leaveChatOffers[partner.participant.id_in_session] = leaveChatOffers.get(partner.participant.id_in_session, False) if leaveChatOffers[player.participant.id_in_session] and leaveChatOffers[partner.participant.id_in_session]: leaveChatOffers.clear() return {0: dict(finished=True)} return {partner.id_in_group: data} class Coordination(Page): form_model = 'player' form_fields = ['coordinate'] @staticmethod def is_displayed(player): return player.role != 'Red' class ResultsWaitPage(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_list = group.get_players() player_1 = player_list[0] player_2 = player_list[1] if player_1.coordinate: if player_2.coordinate: player_1.payoff = C.PAYOFF_MUTUAL_L player_2.payoff = C.PAYOFF_MUTUAL_L else: player_1.payoff = C.PAYOFF_L_WHEN_HL player_2.payoff = C.PAYOFF_H_WHEN_HL else: if player_2.coordinate: player_1.payoff = C.PAYOFF_H_WHEN_HL player_2.payoff = C.PAYOFF_L_WHEN_HL else: player_1.payoff = C.PAYOFF_MUTUAL_H player_2.payoff = C.PAYOFF_MUTUAL_H leaveChatOffers = dict() page_sequence = [Introduction, Chat]