from ._builtin import Page, WaitPage from .models import Constants import random ######################################################################################################################## # Wait-page ############################################################################################################ ######################################################################################################################## class StartWP(WaitPage): group_by_arrival_time = True ######################################################################################################################## # Real-Effort ########################################################################################################## ######################################################################################################################## class EffortTask(Page): # how much time a participant has to position sliders timeout_seconds = 120 form_model = 'player' # all slider form fields form_fields = [f'slider{i}' for i in range(1, 63)] def before_next_page(self): # empty array slider_positions = [] # add all slider positions to empty array for i in range(1, 63): slider_positions.extend([getattr(self.player, f'slider{i}')]) # count number of sliders positioned at 50 self.player.sum_sliders = slider_positions.count(50) ######################################################################################################################## # Wait-page ############################################################################################################ ######################################################################################################################## class AfterEffortWP(WaitPage): def after_all_players_arrive(self): # empty array sum_sliders_list = [] # append tuples of id and slider count to empty array for p in self.group.get_players(): sum_sliders_list.append([p.id_in_group, p.sum_sliders]) # sort array of tuples by second row, followed by random number, if second row has equal value sum_sliders_list.sort(key=lambda x: (x[1], random.random())) # make array only of ids (sorted by slider count) ranking = [i[0] for i in sum_sliders_list] # assign endowment to players in group according to ranking for p in self.group.get_players(): if p.id_in_group == ranking[0]: p.payoff = Constants.endowment_poor p.endowment = Constants.endowment_poor elif p.id_in_group == ranking[1]: p.payoff = Constants.endowment_middle p.endowment = Constants.endowment_middle else: p.payoff = Constants.endowment_rich p.endowment = Constants.endowment_rich ######################################################################################################################## # Results ############################################################################################################## ######################################################################################################################## class AfterEffortInfo(Page): pass ######################################################################################################################## # Shop R1 ############################################################################################################## ######################################################################################################################## class ShopR1(Page): form_model = 'player' form_fields = ['good_a', 'good_b'] def vars_for_template(self): return {'endowment': self.player.payoff, 'budget': int(self.player.endowment / Constants.price_high), 'budget_lowprice': int(self.player.endowment / Constants.price_low), 'page_name': self.participant._current_page_name} def before_next_page(self): if self.player.endowment == Constants.endowment_poor: # self.player.random_shop = random.choice(['A', 'B']) self.player.random_shop = 'A' class BetweenRoundsInfo(Page): def vars_for_template(self): if self.player.good_a == None: return {'goods_amount': self.player.good_b, 'shop': 'B', 'test': self.player.random_shop} else: return {'goods_amount': self.player.good_a, 'shop': 'A'} class ShopR2(Page): form_model = 'player' form_fields = ['good_a', 'good_b'] def vars_for_template(self): return {'endowment': self.player.payoff, 'budget': int(self.player.endowment / Constants.price_high), 'budget_lowprice': int(self.player.endowment / Constants.price_low), 'page_name': self.participant._current_page_name} class FinalResults(Page): pass page_sequence = [ StartWP, EffortTask, AfterEffortWP, AfterEffortInfo, ShopR1, BetweenRoundsInfo, ShopR2, FinalResults]