from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, safe_json ) from collections import namedtuple import random author = 'Thomas Graeber' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'intertemporal_choice' players_per_group = None tasks = [ [0, 9], [9, 18], [90, 99], [0, 200], [0, 300] # [10, 20] ] num_rounds = len(tasks) class Subsession(BaseSubsession): def before_session_starts(self): if self.round_number == 1: for p in self.get_players(): p.participant.vars['int_choice_sequence'] = random.sample(range(0, Constants.num_rounds), Constants.num_rounds) for p in self.get_players(): p.set_current_task_number() class Group(BaseGroup): pass class Player(BasePlayer): task_number = models.IntegerField() task_identifier = models.CharField() task_identifier_days_left = models.IntegerField() task_identifier_days_right = models.IntegerField() # switching_point_1 = models.FloatField() practice = models.FloatField() # switching_point_2 = models.FloatField() on_paying_round = models.BooleanField(initial=False) conditional_payoff = models.CurrencyField() # Field which is 0 if always Option B, 1 if switching point, 2 if never option B indicator_never_always_switcher = models.IntegerField() switching_point = models.FloatField() choice = models.CharField() portf_share_b = models.IntegerField(min=0, max=100) prob_of_b = models.IntegerField(min=0, max=100) time_ran_out = models.BooleanField(initial=False) def set_tasks(self): decisions = [] for e, l in Constants.tasks: if e == 0: time_string_e = "today" elif e == 1: time_string_e = 'in 1 day' else: time_string_e = 'in {} days'.format(e) time_string_l = 'in {} days'.format(l) t = { 'name': 'intmpl_choice_{}_{}'.format(e, l), 'safe_range_max': 55, 'safe_range_min': 25, 'days_early': e, 'days_late': l, 'step_size': 1, 'lottery': [(25, time_string_e), time_string_l], 'type': 'list' } decisions.append(t) return decisions def set_current_task_number(self): setattr(self, 'task_number', self.participant.vars['int_choice_sequence'][self.round_number - 1]) setattr(self, 'task_identifier', self.set_tasks()[int(self.task_number)]['name']) setattr(self, 'task_identifier_days_left', self.set_tasks()[self.task_number]['days_early']) setattr(self, 'task_identifier_days_right', self.set_tasks()[self.task_number]['days_late']) def frange(self, start, stop, step): i = start while i < stop: yield i i += step def right_side_amounts1(self): lst = self.frange( self.set_tasks()[self.task_number]['safe_range_min'], self.set_tasks()[self.task_number]['safe_range_max']+1, self.set_tasks()[self.task_number]['step_size'] ) return list(enumerate(lst, 1)) def current_lottery(self): return self.set_tasks()[self.task_number]['lottery'] def table_length1(self): return self.set_tasks()[self.task_number]['safe_range_max'] - \ self.set_tasks()[self.task_number]['safe_range_min'] / \ self.set_tasks()[self.task_number]['step_size'] + 1 def set_switching_point_and_indicator_1(self): if self.switching_point == 9999: self.switching_point = self.set_tasks()[self.task_number]['safe_range_max'] + 1 self.indicator_never_always_switcher = 2 elif self.switching_point == self.set_tasks()[self.task_number]['safe_range_min']: self.indicator_never_always_switcher = 0 else: self.indicator_never_always_switcher = 1