from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'exp5' players_per_group = None num_rounds = 1 instructions_template = 'cti2/Instructions.html' determined_series = [[14, 44, 146, 194, 248, 379, 441, 459, 512, 495, 522, 469, 381, 368, 270, 231, 128, 34, 28, 32, 16, 85, 119, 197, 265], [34, 68, 101, 213, 254, 352, 381, 468, 531, 534, 532, 511, 412, 334, 275, 225, 98, 34, 44, 25, 14, 64, 99, 210, 267], [19, 85, 147, 177, 275, 344, 412, 511, 490, 534, 486, 448, 437, 313, 270, 157, 155, 72, 37, 17, 44, 91, 125, 167, 265]] class Subsession(BaseSubsession): def creating_session(self): players = self.get_players() for p in players: p.new_round_number = p.round_number + 11 class Group(BaseGroup): pass class Player(BasePlayer): CQ1 = models.StringField( choices=['An engineer', 'A company owner', 'I don\'t know'], widget=widgets.RadioSelect ) def CQ1_error_message(self, value): if value != 'A company owner': return 'In this experiment, your role is a company owner.' CQ2 = models.StringField( choices=['profits', 'losses', 'I don\'t know'], widget=widgets.RadioSelect ) def CQ2_error_message(self, value): if value != 'losses': return 'During the last 5 days, your company is making losses.' CQ3 = models.IntegerField() CQ4 = models.StringField( choices=['Forecasting daily company losses', 'Forecasting monthly company losses', 'Forecasting annual company losses', ], widget=widgets.RadioSelect ) def CQ4_error_message(self, value): if value != 'Forecasting daily company losses': return 'In this experiment, your main task is to forecast daily company losses.' CQ5 = models.StringField( choices=['tomorrow', '1 year', '2 years', ], widget=widgets.RadioSelect ) def CQ5_error_message(self, value): if value != 'tomorrow': return 'In the first step, the forecast horizon is tomorrow.' forecast_t = models.IntegerField() def forecast_t_error_message(self, value): if value < 0 or value > 700: return 'Please make your forecast within the range of the graph(0-700). Please revise your forecast.' forecast_1y = models.IntegerField() def forecast_1y_error_message(self, value): if value < 0: return 'Losses cannot be a negative number. Please revise your forecast.' forecast_2y = models.IntegerField() def forecast_2y_error_message(self, value): if value < 0: return 'Losses cannot be a negative number. Please revise your forecast.' actual_t = models.IntegerField() new_round_number = models.IntegerField() time_spent1 = models.FloatField() time_spent2 = models.FloatField() AQ1 = models.StringField( choices=['It was steeper than the first wave', 'It was about the same steepness as during the first wave', 'It was shallower than the first wave', 'I don’t remember'], widget=widgets.RadioSelect ) AQ2 = models.StringField( choices=['1', '2', '3', '4', '5', '6', '7'], widget=widgets.RadioSelect ) AQ3 = models.StringField( choices=['1', '2', '3', '4', '5', '6', '7'], widget=widgets.RadioSelect ) AQ4 = models.StringField( choices=['1', '2', '3', '4', '5', '6', '7'], widget=widgets.RadioSelect ) AQ5 = models.StringField( choices=['1', '2', '3', '4', '5', '6', '7'], widget=widgets.RadioSelect ) AQ6 = models.StringField( choices=['1', '2', '3', '4', '5', '6', '7'], widget=widgets.RadioSelect ) AQ7 = models.StringField( choices=['1', '2', '3', '4', '5', '6', '7'], widget=widgets.RadioSelect ) AQ8 = models.StringField( choices=['1', '2', '3', '4', '5', '6', '7'], widget=widgets.RadioSelect ) AQ9 = models.StringField( choices=['1', '2', '3', '4', '5', '6', '7'], widget=widgets.RadioSelect ) AQ10 = models.StringField( choices=['1', '2', '3', '4', '5', '6', '7'], widget=widgets.RadioSelect )