from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, ) author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'survival' players_per_group = 4 num_rounds = 1 bonus = 2.5 w1 = 0.01 w2 = 0.02 time_task = 600 time_chat = 300 show_up = 5 show_up_fail = 0.65 class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: for p in self.get_players(): # round_numbers = list(range(1, Constants.num_rounds + 1)) # random.shuffle(round_numbers) # p.participant.vars['task_rounds'] = dict(zip(Constants.tasks, round_numbers)) p.participant.vars['sum_score'] = 0 #@staticmethod def group_by_arrival_time_method(self, waiting_players): new_group = [] for p in waiting_players: new_group.append(p) if len(new_group) == 4: # here the number of player that form a group are defined. return new_group for p in waiting_players: # this automatically advances players that have been waiting too long. if p.waiting_too_long(): p.participant.vars['time'] = 1 return [p] class Group(BaseGroup): treatment = models.IntegerField() # LEADERS DECISIONS D0 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='0', widget=widgets.RadioSelectHorizontal()) D1 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='1', widget=widgets.RadioSelectHorizontal()) D2 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='2', widget=widgets.RadioSelectHorizontal()) D3 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='3', widget=widgets.RadioSelectHorizontal()) D4 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='4', widget=widgets.RadioSelectHorizontal()) D5 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='5', widget=widgets.RadioSelectHorizontal()) D6 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='6', widget=widgets.RadioSelectHorizontal()) D7 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='7', widget=widgets.RadioSelectHorizontal()) D8 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='8', widget=widgets.RadioSelectHorizontal()) D9 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='9', widget=widgets.RadioSelectHorizontal()) D10 = models.IntegerField(initial=None, choices=[[0, 'A'], [1, 'B']], verbose_name='10', widget=widgets.RadioSelectHorizontal()) class Player(BasePlayer): def waiting_too_long(self): import time return time.time() - self.participant.vars['wait_page_arrival'] > 600 def role(self): if self.leader == 1: return 'leader' else: return 'follower' #code = models.IntegerField() failed_matching = models.IntegerField(initial=0) is_dropout = models.BooleanField(initial=False) timeout_task = models.IntegerField(initial=0) timeout_belief1 = models.IntegerField(initial=0) timeout_task2 = models.IntegerField(initial=0) timeout_belief2 = models.IntegerField(initial=0) timeout_vote = models.IntegerField(initial=0) timeout_vote2 = models.IntegerField(initial=0) timeout_leader = models.IntegerField(initial=0) #survival task c_flare = models.IntegerField(initial=50) c_dinghy = models.IntegerField(initial=50) c_lighter = models.IntegerField(initial=50) c_vest = models.IntegerField(initial=50) c_fuel = models.IntegerField(initial=50) c_rope = models.IntegerField(initial=50) c_cover = models.IntegerField(initial=50) c_knife = models.IntegerField(initial=50) c_paddle = models.IntegerField(initial=50) c_whisky = models.IntegerField(initial=50) score = models.FloatField() rank = models.PositiveIntegerField(initial=0) TimeSpentTask = models.IntegerField(initial=0) #info acquisition sad_flare = models.IntegerField() happy_flare = models.IntegerField() sad_dinghy = models.IntegerField() happy_dinghy = models.IntegerField() happy_lighter = models.IntegerField() sad_lighter = models.IntegerField() sad_vest = models.IntegerField() happy_vest = models.IntegerField() sad_fuel = models.IntegerField() happy_fuel = models.IntegerField() sad_rope = models.IntegerField() happy_rope = models.IntegerField() sad_knife = models.IntegerField() happy_knife = models.IntegerField() sad_cover = models.IntegerField() happy_cover = models.IntegerField() sad_paddle = models.IntegerField() happy_paddle = models.IntegerField() sad_whisky = models.IntegerField() happy_whisky = models.IntegerField() nb_balls = models.IntegerField() TimeSpentInfo = models.IntegerField(initial=0) history_flare = models.LongStringField(blank=True) history_dinghy = models.LongStringField(blank=True) history_lighter = models.LongStringField(blank=True) history_vest = models.LongStringField(blank=True) history_fuel = models.LongStringField(blank=True) history_rope = models.LongStringField(blank=True) history_cover = models.LongStringField(blank=True) history_knife = models.LongStringField(blank=True) history_paddle = models.LongStringField(blank=True) history_whisky = models.LongStringField(blank=True) #update task c_flare2 = models.IntegerField() c_dinghy2 = models.IntegerField() c_lighter2 = models.IntegerField() c_vest2 = models.IntegerField() c_fuel2 = models.IntegerField() c_rope2 = models.IntegerField() c_cover2 = models.IntegerField() c_knife2 = models.IntegerField() c_paddle2 = models.IntegerField() c_whisky2 = models.IntegerField() score2 = models.FloatField() TimeSpentUpdate = models.IntegerField(initial=0) top5 = models.LongStringField() prior = models.IntegerField() posterior = models.IntegerField() #decision leader D0 = models.PositiveIntegerField() D1 = models.PositiveIntegerField() D2 = models.PositiveIntegerField() D3 = models.PositiveIntegerField() D4 = models.PositiveIntegerField() D5 = models.PositiveIntegerField() D6 = models.PositiveIntegerField() D7 = models.PositiveIntegerField() D8 = models.PositiveIntegerField() D9 = models.PositiveIntegerField() D10 = models.PositiveIntegerField() #vote lead = models.PositiveIntegerField(initial=0) lead2 = models.PositiveIntegerField(initial=0) leader = models.PositiveIntegerField() leader_score = models.FloatField() leader_rank = models.PositiveIntegerField() sum_vote = models.PositiveIntegerField(initial=0) sum_vote2 = models.PositiveIntegerField(initial=0) votefail = models.PositiveIntegerField() vote = models.IntegerField(initial=0, verbose_name='Select a leader:', choices=[[1, 'Participant 1'], [2, 'Participant 2'], [3, 'Participant 3'], [4, 'Participant 4'], ], widget=widgets.RadioSelect()) vote2 = models.IntegerField(initial=0, verbose_name='Select a leader:', choices=[[1, 'Participant 1'], [2, 'Participant 2'], [3, 'Participant 3'], [4, 'Participant 4'], ], widget=widgets.RadioSelect()) # PAYOFFS rand_part = models.IntegerField() pay_acc = models.FloatField() rand_acc = models.FloatField() pay_task = models.FloatField() pay_leader_part1 = models.FloatField() pay_leader_part2 = models.FloatField() rand = models.PositiveIntegerField() p_lottery = models.PositiveIntegerField() p3 = models.CharField() total_pay = models.FloatField() # post experiment questionnaire q_voteleader = models.CharField() # Demographics q_english = models.PositiveIntegerField(initial=None, choices=[[0, 'No'], [1, 'Yes']], label='Is English the language you use the most at home?', widget=widgets.RadioSelect()) q_age = models.PositiveIntegerField(label='What is your age?', choices=range(18, 125), initial=None) q_gender = models.PositiveIntegerField(initial=None, choices=[[0, 'Male'], [1, 'Female'], [2, 'Other'], [2, 'Prefer not to say']], label='Which category best describe your gender?', widget=widgets.RadioSelect()) q_risk = models.PositiveIntegerField() q_task_diff = models.PositiveIntegerField() q_clarity = models.PositiveIntegerField(initial=None, choices=[[0, 'Extremely unclear'], [1, 'Somewhat unclear'], [2, 'Somewhat clear'], [3, 'Extremely clear']], label='How would you rate the clarity of the instructions?', widget=widgets.RadioSelect()) q_other = models.CharField(blank=True) # AMS AMS1 = models.PositiveIntegerField() AMS2 = models.PositiveIntegerField() AMS3 = models.PositiveIntegerField() AMS4 = models.PositiveIntegerField() AMS5 = models.PositiveIntegerField() AMS6 = models.PositiveIntegerField() AMS7 = models.PositiveIntegerField() AMS8 = models.PositiveIntegerField() AMS9 = models.PositiveIntegerField() AMS10 = models.PositiveIntegerField() AMS11 = models.PositiveIntegerField() AMS12 = models.PositiveIntegerField()