from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import csv from pprint import pprint from django.conf import settings def make_group(comma_delim_string): return [int(x) for x in comma_delim_string.split(',')] author = 'Dustin Tracy' doc = """ Agents guess value of coins in jar. Test impact of different pay schemes and announcing of schemes to Principal. """ class Constants(BaseConstants): name_in_url = 'Jars' # players_per_group = 4 players_per_group = None with open('Jars/Sequence_9.csv') as sequence_list: # with open('Jars/Sequencer1realshort.csv') as sequence_list: sequence = list(csv.DictReader(sequence_list)) num_rounds = len(sequence) # num_rounds = 2 # with open('Jars/coins.csv') as coins: # coins = open('Jars/coins.csv') # totals = c(coins['total']) # totals = c(total) totals = [16.64, 17.89, 20.49, 21.79, 15.14, 17.73, 21.36, 18.91, 16.04, 17.09, 17.69, 18.44, 19.03, 22.43, 13.32, 14.12, 21.37, 16.44, 16.99, 20.09, 20.49, 19.94, 17.44, 17.94, 15.30, 15.89, 14.09, 15.59, 15.59, 17.09, 16.48, 16.98, 16.17, 18.67, 18.22] class Subsession(BaseSubsession): def creating_session(self): self.session.vars['comment'] = self.session.config["treatment"] if self.round_number == 1: self.session.vars['tx_arm'] = self.session.config["treatment"] self.session.vars['Base'] = c(settings.SESSION_CONFIGS[0].get('Base')) self.session.vars['Flat'] = c(settings.SESSION_CONFIGS[0].get('Flat')) self.session.vars['Comish'] = c(settings.SESSION_CONFIGS[0].get('Comish')) self.session.vars['Noise'] = self.session.config["Noise"] # with open('Jars/groups6_1.csv') as f: # with open('Jars/groups6_14.csv') as f: filename = 'Jars/groups6_9.csv' if self.session.vars['tx_arm'] == "NoRep": filename = 'Jars/groups6_9a.csv' with open(filename) as f: # with open('Jars/groupsTestShort.csv') as f: matrices = [] for line in f: line = line.strip() group_specs = line.split(',,') matrix = [make_group(spec) for spec in group_specs] matrices.append(matrix) self.session.vars['matrices'] = matrices self.session.vars['sequence'] = Constants.sequence.copy() this_round_matrix = self.session.vars['matrices'][self.round_number - 1] self.set_group_matrix(this_round_matrix) # pprint(this_round_matrix) for p in self.get_players(): sequence_data = p.current_sequence() p.sequence_round = int(sequence_data['round']) if p.role() == "agent1": p.jarA_numb = int(sequence_data['jarA']) p.jarB_numb = int(sequence_data['jarB']) elif p.role() == 'agent2': p.jarA_numb = int(sequence_data['jarB']) p.jarB_numb = int(sequence_data['jarA']) class Group(BaseGroup): Choice = models.IntegerField() Disclose = models.IntegerField() Agnt1_payA = models.IntegerField(choices=[0, 1], widget=widgets.RadioSelect) Agnt2_payA = models.IntegerField(choices=[0, 1], widget=widgets.RadioSelect) # if self.round_number == 1: # if self.session.vars['tx_arm']=='Disc' or self.session.vars['tx_arm']=='NoDisc': # group.Agnt1_payA = 1 # group.Agnt2_payA = 1 # elif self.session.vars['tx_arm']=='Align': # group.Agnt1_payA = 0 # group.Agnt2_payA = 0 Agnt1_EstA = models.CurrencyField(min=10, max=25) Agnt2_EstA = models.CurrencyField(min=10, max=25) Agnt1_EstB = models.CurrencyField(min=10, max=25) Agnt2_EstB = models.CurrencyField(min=10, max=25) Agnt1_stars = models.FloatField() Agnt2_stars = models.FloatField() Princ1_Agnt2 = models.IntegerField( choices=[ [0, 'Expert 1'], [1, 'Expert 2'], ], widget=widgets.RadioSelect ) Princ2_Agnt2 = models.IntegerField( choices=[ [0, 'Expert 1'], [1, 'Expert 2'], ], widget=widgets.RadioSelect ) Princ1_JarB = models.IntegerField( choices=[ [0, 'Jar A'], [1, 'Jar B'], ], widget=widgets.RadioSelect ) Princ2_JarB = models.IntegerField( choices=[ [0, 'Jar A'], [1, 'Jar B'], ], widget=widgets.RadioSelect ) Prnc1_Rate = models.IntegerField( choices=[ [5, '5 Stars - Excellent'], [4, '4 Stars - Good'], [3, '3 Stars - Average'], [2, '2 Stars - Poor'], [1, '1 Star - Terrible'] ] ) Prnc2_Rate = models.IntegerField( choices=[ [5, '5 Stars - Excellent'], [4, '4 Stars - Good'], [3, '3 Stars - Average'], [2, '2 Stars - Poor'], [1, '1 Star - Terrible'] ] ) class Player(BasePlayer): sequence_round = models.IntegerField() jarA_numb = models.IntegerField() jarB_numb = models.IntegerField() def current_sequence(self): return self.session.vars['sequence'][self.round_number - 1] ncf_payoff = models.CurrencyField() round_payoff = models.CurrencyField() Agnt_Star_Cum = models.IntegerField() Agnt_Star_Pot = models.IntegerField() Agnt_Star_Pot = models.IntegerField() total_rounds = models.IntegerField() def role(self): if self.id_in_group == 1: return 'princ1' if self.id_in_group == 2: return 'princ2' if self.id_in_group == 3: return 'agent1' if self.id_in_group == 4: return 'agent2'