from . import models from ._builtin import Page, WaitPage from otree.api import Currency as c, currency_range from .models import Constants class AcceptWaitPage(WaitPage): # 按player进来的先后顺序分组,只能用在第一个waitpage中 # 仅在这个app中有用,后面的app会重新grouping group_by_arrival_time = True def is_displayed(self): return self.round_number == 1 class NamePage(Page): form_model = models.Player form_fields = ['q_name', 'q_avatar'] def before_next_page(self): # 设置超时默认值 if self.timeout_happened: self.player.q_name = 'bots_%d' % self.player.id_in_group self.player.q_avatar = 'avatars/pic%d.png' % self.player.id_in_group self.player.timeout = True self.player.set_player_name() self.player.set_player_avatar() def vars_for_template(self): return { 'default_avatar': self.session.vars['avatars'][self.player.id_in_group], 'avatars': self.session.vars['avatars'], } def q_name_error_message(self, value): others = self.player.get_others_in_group() for p in others: if p.q_name == value: return '%s already exists. please choose another name.' % value def is_displayed(self): return self.round_number == 1 def get_timeout_seconds(self): return self.session.config['name_page_waittime'] class NameWaitPage(WaitPage): # 按player进来的先后顺序分组,只能用在第一个waitpage中 # group_by_arrival_time = True def after_all_players_arrive(self): self.group.set_social_network() def is_displayed(self): return self.round_number == 1 class Demographics(Page): form_model = models.Player form_fields = [ 'q_country', 'q_age', 'q_gen', 'q_city', 'q_movie', 'q_sport', 'q_motto' ] def before_next_page(self): self.player.set_payoff() if self.timeout_happened: self.player.timeout = True def is_displayed(self): return self.round_number == 1 def get_timeout_seconds(self): return self.session.config['demographics_page_waittime'] class NameResultsWaitPage(WaitPage): def is_displayed(self): return self.round_number == 1 class NameResult(Page): def is_displayed(self): return self.round_number == 1 def vars_for_template(self): connected_players = self.player.get_connected_players() connected_player_names = [p.participant.vars['name'] for p in connected_players] (node, edge) = self.player.get_connection_node_edge(connected_players) me = self.player.participant.vars['name'] print(me, " connected players:", connected_player_names) return { 'total_payoff': sum([p.payoff for p in self.player.in_all_rounds()]), 'debug_connected_players': connected_player_names, 'connected_players': connected_players, 'connection_node': node, 'connection_edge': edge, } def get_timeout_seconds(self): return self.session.config['name_result_page_waittime'] class Contribute(Page): form_model = models.Player form_fields = ['contribution'] timeout_seconds = 60 def vars_for_template(self): connected_players = self.player.get_connected_players() connected_player_names = [p.participant.vars['name'] for p in connected_players] me = self.player.participant.vars['name'] print(me, " connected players:", connected_player_names) return { 'other_members_count': Constants.players_per_group - 1, 'debug_connected_players': connected_player_names, 'connected_players': connected_players, } def get_timeout_seconds(self): return self.session.config['contribute_page_waittime'] def before_next_page(self): '''页面等待超时,设置默认值''' if self.timeout_happened: self.player.timeout = True self.player.contribution = self.session.config['contribute_page_timeout_contribution'] class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): self.group.set_payoffs() class Results(Page): def vars_for_template(self): connected_players = self.player.get_connected_players() connected_player_names = [p.participant.vars['name'] for p in connected_players] (node, edge) = self.player.get_connection_node_edge(connected_players) me = self.player.participant.vars['name'] print(me, " connected players:", connected_player_names) #print("real $:", self.session.config['real_world_currency_per_point']) my_earnings = float(self.player.payoff) * \ self.session.config['real_world_currency_per_point'] #print("payoff:", self.player.payoff, "earnings $:", my_earnings) return { 'other_members_count': Constants.players_per_group - 1, 'connected_players': connected_players, 'debug_connected_players': connected_player_names, 'my_earnings': my_earnings, 'connection_node': node, 'connection_edge': edge, } def get_timeout_seconds(self): return self.session.config['contribute_result_page_waittime'] page_sequence = [ AcceptWaitPage, NamePage, NameWaitPage, Demographics, NameResultsWaitPage, NameResult, Contribute, ResultsWaitPage, Results]