from otree.api import * import json class Constants(BaseConstants): name_in_url = 'employee_task' players_per_group = None num_rounds = 55 # Match your logic: 7, 15, 25, 35, 45, 53 REVIEW_ROUNDS = [7, 15, 25, 35, 45, 53] # Match your logic: 16, 26, 36 OFFER_ROUNDS = [16, 26, 36] # Match your logic: 17, 27, 37 TRAINING_ROUNDS = [17, 27, 37] class Subsession(BaseSubsession): def creating_session(self): for p in self.get_players(): p.participant.vars.setdefault('current_trial_index', 1) p.participant.vars.setdefault('trial_net_performances', {}) p.participant.vars.setdefault('trigger_empty_page_in_round', 0) for i in range(1, 4): p.participant.vars.setdefault(f'training_{i}_taken', False) p.participant.vars.setdefault(f'training_{i}_done', False) # In Subsession.creating_session for p in self.get_players(): treatment = p.participant.vars.get('treatment', 'high_') # default fallback if treatment == 'high_': from .hardcoded_trials_high import TRIALS as trial_data, WEIGHTS as weights_data else: from .hardcoded_trials_low import TRIALS as trial_data, WEIGHTS as weights_data p.participant.vars['TRIALS'] = trial_data p.participant.vars['WEIGHTS'] = weights_data class Group(BaseGroup): pass class Player(BasePlayer): selected_option = models.IntegerField(blank=True, null=True) value_of_choice = models.FloatField(blank=True, null=True) num_revealed_fields = models.IntegerField(initial=0) reveal_cost_total = models.FloatField(blank=True, null=True) revisited_trainings = models.LongStringField(blank=True) revisit_cost = models.FloatField(blank=True, null=True) # save the refresh penalty refresh_penalty = models.CurrencyField(initial=0) trial_net_performance = models.FloatField(initial=0) revealed_fields = models.LongStringField(blank=True) visited_training = models.IntegerField(blank=True, null=True) training_accepted = models.BooleanField(blank=True) wants_training = models.BooleanField(blank=True, initial=False)