from otree.api import * import random import uuid import math from otree.models import player c = Currency # old name for currency; you can delete this. doc = """ This application provides a webpage instructing participants how to get paid. Examples are given for the lab and Amazon Mechanical Turk (AMT). """ class Constants(BaseConstants): name_in_url = 'Experiment' players_per_group = 3 num_rounds = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): offer_1 = models.IntegerField(widget=widgets.RadioSelect, choices=[1]) offer_2 = models.IntegerField(widget=widgets.RadioSelect, choices=[2]) offer_3 = models.IntegerField(widget=widgets.RadioSelect, choices=[3]) offer_5 = models.IntegerField(widget=widgets.RadioSelect, choices=[4]) offer_4 = models.IntegerField(widget=widgets.RadioSelect, choices=[5]) # GAME 1 effort_1 = models.IntegerField(min=1, max=13) effort_2 = models.IntegerField(min=1, max=13) effort_3 = models.IntegerField(min=1, max=13) effort_4 = models.IntegerField(min=1, max=13) effort_5 = models.IntegerField(min=1, max=13) effort_6 = models.IntegerField(min=1, max=13) effort_7 = models.IntegerField(min=1, max=13) effort_8 = models.IntegerField(min=1, max=13) effort_9 = models.IntegerField(min=1, max=13) effort_10 = models.IntegerField(min=1, max=13) def random_generate(self): player_id = self.id_in_group return random.randint(1,100) # if self.effort_1 > 9: # return (13 % self.effort_1) + abs(13 /2) # elif self.effort_1 > 4 and self.effort_1 <9: # return 4 + (9%13) # else: # return 2 + (9%13) def random_generate2(self): player_id = self.id_in_group return random.randint(1,100) # if self.effort_2 > 9: # return 6+ (9%13) # elif self.effort_2 > 4 and self.effort_2 <9: # return 4 + (9%13) # else: # return 2 + (9%13) def get_rewards(self): effort_map = {1:50,2:150,3:250,4:350,5:450,6:550,7:650,8:750,9:850,10:950,11:1050,12:1150,13:1250} return effort_map.get(self.effort_1) def get_rewards2(self): effort_map = {1:50,2:150,3:250,4:350,5:450,6:550,7:650,8:750,9:850,10:950,11:1050,12:1150,13:1250} return effort_map.get(self.effort_2) def net_earning(self): net_earning = "" player_id = self.id_in_group if player_id == 1: net_earning = self.get_bonus2() - self.get_rewards() + 1000 print(net_earning) elif player_id == 2: net_earning = 3000 - int(self.get_rewards()) - int(self.get_bonus()) elif player_id == 3: net_earning = 2000 - int(self.get_rewards()) + int(self.get_bonus()) return str(net_earning) def net_earning2(self): net_earning = "" player_id = self.id_in_group if player_id == 1: net_earning = self.get_bonus2() - self.get_rewards2() + 1000 print(net_earning) elif player_id == 2: net_earning = 3000 - int(self.get_rewards2()) - int(self.get_bonus2()) elif player_id == 3: net_earning = 2000 - int(self.get_rewards2()) + int(self.get_bonus2()) return str(net_earning) def get_point(self): high_effort_map = {1:5,2:10,3:15,4:20,5:25,6:30,7:35,8:40,9:45,10:50,11:55,12:60,13:65} medium_effort_map = {1:30,2:30,3:30,4:30,5:30,6:30,7:30,8:30,9:30,10:30,11:30,12:30,13:30} # low_effort_map = {1:65,2:60,3:55,4:50,5:45,6:40,7:35,8:30,9:25,10:20,11:15,12:10,13:5} effort = self.effort_1 self.participant.vars['rand'] = self.random_generate() # print("The random number is "+str(self.participant.vars['rand'])) # print("The effort is "+ str(effort)) if self.participant.vars['rand'] < high_effort_map.get(effort): print("in high"+ str(self.participant.vars['rand'])) return "High" elif (self.participant.vars['rand'] > high_effort_map.get(effort)) and (self.participant.vars['rand'] < medium_effort_map.get(effort) + high_effort_map.get(effort)): print("in medium" + str(self.participant.vars['rand'])) return "Medium" else: print("in low" + str(self.participant.vars['rand'])) return "Low" def get_point2(self): high_effort_map = {1:5,2:10,3:15,4:20,5:25,6:30,7:35,8:40,9:45,10:50,11:55,12:60,13:65} medium_effort_map = {1:30,2:30,3:30,4:30,5:30,6:30,7:30,8:30,9:30,10:30,11:30,12:30,13:30} # low_effort_map = {1:65,2:60,3:55,4:50,5:45,6:40,7:35,8:30,9:25,10:20,11:15,12:10,13:5} effort = self.effort_2 self.participant.vars['rand'] = self.random_generate2() # print("The random number is "+str(self.participant.vars['rand'])) # print("The effort is "+ str(effort)) if self.participant.vars['rand'] < high_effort_map.get(effort): print("in high"+ str(self.participant.vars['rand'])) return "High" elif (self.participant.vars['rand'] > high_effort_map.get(effort)) and (self.participant.vars['rand'] < medium_effort_map.get(effort) + high_effort_map.get(effort)): print("in medium" + str(self.participant.vars['rand'])) return "Medium" else: print("in low" + str(self.participant.vars['rand'])) return "Low" def get_bonus(self): player_id = self.group.id_in_subsession if player_id == 1: if self.get_point() == "High": return 2000 elif self.get_point() == "Medium": return 1000 else: return 0 if player_id == 2: if self.get_point() == "High": return 0 elif self.get_point() == "Medium": return 1000 else: return 2000 if player_id == 3: if self.get_point() == "High": return 1000 elif self.get_point() == "Low": return -1000 else: return 0 return 0 def get_bonus2(self): player_id = self.group.id_in_subsession if player_id == 1: if self.get_point() == "High": return 2000 elif self.get_point() == "Medium": return 1000 else: return 0 if player_id == 2: if self.get_point() == "High": return 0 elif self.get_point() == "Medium": return 1000 else: return 2000 if player_id == 3: if self.get_point() == "High": return 1000 elif self.get_point() == "Low": return -1000 else: return 0 return 0 @staticmethod def vars_for_template(player): return dict( a=5, b=4, ) # PAGES class Experiment(Page): form_model = 'player' form_fields = ['effort_1'] class Results(Page): pass class Experiment2(Page): form_model = 'player' form_fields = ['effort_2'] class Results2(Page): pass page_sequence = [Experiment, Results, Experiment2, Results2]