import random import itertools from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) from django_countries.fields import CountryField author = 'Julian Hackinger' doc = """ This experiment is designed to test whether subjects are equally prone to exhibit the house money effect, i.e. violate the assumption of fungibility. It therefore comprises of three parts. In part one, participants need to earn their endowment in a real effort task. In part two, participants make decisions on how to allocate their endowment. In part three, participants complete intelligence tests. There are four treatments with respect to part one. In the Random High Effort treatment (RHE) and the Random Low Effort treatment (RLE) participants are told that they would either need to work little or much in order to earn their endowment. They are then assigned correspondingly to work either little or much. In the High Effort treatment (HE) and the Low Effort treatment (LE) participants are told that they would need to work little in the Low Effort treatment or much in the High Effort treatment. They are then assigned correspondingly. """ class Constants(BaseConstants): name_in_url = 'po_ca_eb_2' players_per_group = 2 num_rounds = 1 participation_fee_in_points = c(500) # Initial amount allocated to the player endowment = c(1000) endowment_no_points = 1000 belief_bonus = {'win': c(20), 'loose': c(0)} # For testing: participation_numbers with open('po_ca_eb_2/participation_numbers.csv') as participation_numbers_file: participation_numbers = participation_numbers_file.read().split('\n') # Slider Task num_sliders = 50 # Total number of sliders percent_sliders_to_be_moved_high = 80 # Share of sliders that have to be moved in the High Effort treatment percent_sliders_to_be_moved_low = 20 # Share of sliders that have to be moved in the Low Effort treatment num_sliders_high_effort = percent_sliders_to_be_moved_high/100*num_sliders # Number of sliders to be moved in the High Effort treatment num_sliders_high_effort_done = num_sliders - num_sliders_high_effort # Number of sliders already at 50 in the High Effort treatment num_sliders_low_effort = percent_sliders_to_be_moved_low/100*num_sliders # Number of sliders to be moved in the Low Effort treatment num_sliders_low_effort_done = num_sliders - num_sliders_low_effort # Number of sliders already at 50 in the Low Effort treatment slider_list_high_effort_treatment = [] for i in range(1, int(num_sliders_high_effort_done) + 1): slider_list_high_effort_treatment.append('slider_low' + str(i)) for i in range(int(num_sliders_high_effort_done)+1, int(num_sliders) + 1): slider_list_high_effort_treatment.append('slider_high' + str(i)) print(slider_list_high_effort_treatment) slider_list_low_effort_treatment = [] for i in range(1, int(num_sliders_low_effort_done) + 1): slider_list_low_effort_treatment.append('slider_low' + str(i)) for i in range(int(num_sliders_low_effort_done)+1, int(num_sliders) + 1): slider_list_low_effort_treatment.append('slider_high' + str(i)) print(slider_list_low_effort_treatment) class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: # For testing: participation_numbers self.session.vars['participation_numbers'] = Constants.participation_numbers.copy() treatments = itertools.cycle(['decider_high_receiver_high', 'decider_high_receiver_high', 'decider_high_receiver_low', 'decider_high_receiver_low', 'decider_low_receiver_high', 'decider_low_receiver_high', 'decider_low_receiver_low', 'decider_low_receiver_low']) for p in self.get_players(): p.treatment = next(treatments) # Set slider and role treatment variable for p in self.get_players(): if p.id_in_group == 1 and (p.treatment == 'decider_high_receiver_high' or p.treatment == 'decider_high_receiver_low'): p.slider_treatment = 'high' elif p.id_in_group == 2 and (p.treatment == 'decider_high_receiver_high' or p.treatment == 'decider_low_receiver_high'): p.slider_treatment = 'high' else: p.slider_treatment = 'low' if p.id_in_group == 1: p.decider = '1' else: p.decider = '0' # Draw random numbers for belief elicitaion for p in self.get_players(): p.belief_threshold = random.randint(1, 100) p.belief_draw = random.randint(1, 100) class Group(BaseGroup): # Dictator game implemented_donation = models.CurrencyField( doc="""Amount dictator decided to give""", min=0, max=Constants.endowment, ) # Set implemented donation def set_implemented_donation(self): self.implemented_donation = self.get_player_by_role('decider').donation # Payoffs from dictator game def set_payoffs_dictator_game(self): self.get_player_by_role('decider').payoff_dictator_game = Constants.endowment - self.implemented_donation self.get_player_by_role('receiver').payoff_dictator_game = self.implemented_donation*2 # Final payoff def set_payoff_decider(self): self.get_player_by_role('decider').payoff = self.get_player_by_role('decider').payoff_dictator_game + self.get_player_by_role('decider').payoff_belief if self.get_player_by_role('receiver').belief is not None: self.get_player_by_role('receiver').payoff = self.get_player_by_role('receiver').payoff_dictator_game + self.get_player_by_role('receiver').payoff_belief def set_payoff_receiver(self): if self.get_player_by_role('receiver').payoff_dictator_game is not None: self.get_player_by_role('receiver').payoff = self.get_player_by_role('receiver').payoff_dictator_game + self.get_player_by_role('receiver').payoff_belief class Player(BasePlayer): # For testing: participation_numbers participation_number = models.StringField() # Treatment treatment = models.StringField() # Decider role decider = models.StringField() # Slider treatment slider_treatment = models.StringField() # Roles def role(self): if self.id_in_group == 1: return 'decider' else: return 'receiver' # Iriberri, Rey-Bierl - The role of role uncertainty in modified dictator games - 2011 # Get partner def get_partner(self): return self.get_others_in_group()[0] # Get other's treatment def partner_treatment(self): if self.get_others_in_group()[0].slider_treatment == 'high': return int(Constants.num_sliders_high_effort) if self.get_others_in_group()[0].slider_treatment == 'low': return int(Constants.num_sliders_low_effort) # Control slider control_slider = models.IntegerField( label="Test Slider", min=random.randint(0, 40), max=random.randint(60, 100), widget=widgets.Slider(), initial=random.randint(*random.choice([(0, 40), (60, 100)])) ) # Slider Task # Slider High Effort def make_slider_high(label): return models.IntegerField( label=label, min=random.randint(0, 40), max=random.randint(60, 100), widget=widgets.Slider(), initial=random.randint(*random.choice([(0, 40), (60, 100)])) ) # Slider Low Effort def make_slider_low(label): return models.IntegerField( label=label, min=random.randint(0, 40), max=random.randint(60, 100), widget=widgets.Slider(), initial=50 ) # Insert_Sliders_High_Start slider_high1 = make_slider_high('Slider 1:') slider_high2 = make_slider_high('Slider 2:') slider_high3 = make_slider_high('Slider 3:') slider_high4 = make_slider_high('Slider 4:') slider_high5 = make_slider_high('Slider 5:') slider_high6 = make_slider_high('Slider 6:') slider_high7 = make_slider_high('Slider 7:') slider_high8 = make_slider_high('Slider 8:') slider_high9 = make_slider_high('Slider 9:') slider_high10 = make_slider_high('Slider 10:') slider_high11 = make_slider_high('Slider 11:') slider_high12 = make_slider_high('Slider 12:') slider_high13 = make_slider_high('Slider 13:') slider_high14 = make_slider_high('Slider 14:') slider_high15 = make_slider_high('Slider 15:') slider_high16 = make_slider_high('Slider 16:') slider_high17 = make_slider_high('Slider 17:') slider_high18 = make_slider_high('Slider 18:') slider_high19 = make_slider_high('Slider 19:') slider_high20 = make_slider_high('Slider 20:') slider_high21 = make_slider_high('Slider 21:') slider_high22 = make_slider_high('Slider 22:') slider_high23 = make_slider_high('Slider 23:') slider_high24 = make_slider_high('Slider 24:') slider_high25 = make_slider_high('Slider 25:') slider_high26 = make_slider_high('Slider 26:') slider_high27 = make_slider_high('Slider 27:') slider_high28 = make_slider_high('Slider 28:') slider_high29 = make_slider_high('Slider 29:') slider_high30 = make_slider_high('Slider 30:') slider_high31 = make_slider_high('Slider 31:') slider_high32 = make_slider_high('Slider 32:') slider_high33 = make_slider_high('Slider 33:') slider_high34 = make_slider_high('Slider 34:') slider_high35 = make_slider_high('Slider 35:') slider_high36 = make_slider_high('Slider 36:') slider_high37 = make_slider_high('Slider 37:') slider_high38 = make_slider_high('Slider 38:') slider_high39 = make_slider_high('Slider 39:') slider_high40 = make_slider_high('Slider 40:') slider_high41 = make_slider_high('Slider 41:') slider_high42 = make_slider_high('Slider 42:') slider_high43 = make_slider_high('Slider 43:') slider_high44 = make_slider_high('Slider 44:') slider_high45 = make_slider_high('Slider 45:') slider_high46 = make_slider_high('Slider 46:') slider_high47 = make_slider_high('Slider 47:') slider_high48 = make_slider_high('Slider 48:') slider_high49 = make_slider_high('Slider 49:') slider_high50 = make_slider_high('Slider 50:') # Insert_Sliders_High_End # Insert_Sliders_Low_Start slider_low1 = make_slider_low('Slider 1:') slider_low2 = make_slider_low('Slider 2:') slider_low3 = make_slider_low('Slider 3:') slider_low4 = make_slider_low('Slider 4:') slider_low5 = make_slider_low('Slider 5:') slider_low6 = make_slider_low('Slider 6:') slider_low7 = make_slider_low('Slider 7:') slider_low8 = make_slider_low('Slider 8:') slider_low9 = make_slider_low('Slider 9:') slider_low10 = make_slider_low('Slider 10:') slider_low11 = make_slider_low('Slider 11:') slider_low12 = make_slider_low('Slider 12:') slider_low13 = make_slider_low('Slider 13:') slider_low14 = make_slider_low('Slider 14:') slider_low15 = make_slider_low('Slider 15:') slider_low16 = make_slider_low('Slider 16:') slider_low17 = make_slider_low('Slider 17:') slider_low18 = make_slider_low('Slider 18:') slider_low19 = make_slider_low('Slider 19:') slider_low20 = make_slider_low('Slider 20:') slider_low21 = make_slider_low('Slider 21:') slider_low22 = make_slider_low('Slider 22:') slider_low23 = make_slider_low('Slider 23:') slider_low24 = make_slider_low('Slider 24:') slider_low25 = make_slider_low('Slider 25:') slider_low26 = make_slider_low('Slider 26:') slider_low27 = make_slider_low('Slider 27:') slider_low28 = make_slider_low('Slider 28:') slider_low29 = make_slider_low('Slider 29:') slider_low30 = make_slider_low('Slider 30:') slider_low31 = make_slider_low('Slider 31:') slider_low32 = make_slider_low('Slider 32:') slider_low33 = make_slider_low('Slider 33:') slider_low34 = make_slider_low('Slider 34:') slider_low35 = make_slider_low('Slider 35:') slider_low36 = make_slider_low('Slider 36:') slider_low37 = make_slider_low('Slider 37:') slider_low38 = make_slider_low('Slider 38:') slider_low39 = make_slider_low('Slider 39:') slider_low40 = make_slider_low('Slider 40:') slider_low41 = make_slider_low('Slider 41:') slider_low42 = make_slider_low('Slider 42:') slider_low43 = make_slider_low('Slider 43:') slider_low44 = make_slider_low('Slider 44:') slider_low45 = make_slider_low('Slider 45:') slider_low46 = make_slider_low('Slider 46:') slider_low47 = make_slider_low('Slider 47:') slider_low48 = make_slider_low('Slider 48:') slider_low49 = make_slider_low('Slider 49:') slider_low50 = make_slider_low('Slider 50:') # Insert_Sliders_Low_End # Dictator Dilemma Game # Güth, Kliemt, Ockenfels - Fairness versus efficiency: An experimental study of (mutual) gift giving - 2003 donation = models.CurrencyField( doc="""Amount dictator decided to give""", min=0, max=Constants.endowment, ) payoff_dictator_game = models.CurrencyField() # Ownership ownership = models.IntegerField() # Beliefs belief_threshold = models.FloatField() belief_draw = models.FloatField() payoff_belief = models.CurrencyField() belief = models.FloatField(min=0,max=100) # belief_low = models.CurrencyField(min=0) # belief_high = models.CurrencyField(min=0) def set_payoffs_beliefs(self): if self.belief_threshold >= self.belief: if self.belief_draw <= self.belief_threshold: self.payoff_belief = Constants.belief_bonus['win'] else: self.payoff_belief = Constants.belief_bonus['loose'] else: if self.get_others_in_group()[0].slider_treatment == 'low': self.payoff_belief = Constants.belief_bonus['win'] else: self.payoff_belief = Constants.belief_bonus['loose'] # Risk risk = models.StringField() # Survey age = models.IntegerField( label='What is your age?', min=13, max=125 ) gender = models.StringField( choices=['Male', 'Female', 'Other'], label='What is your gender?', widget=widgets.RadioSelect ) country = CountryField( verbose_name='What is your country of citizenship?', blank_label='(select country)' ) # https://github.com/SmileyChris/django-countries education = models.StringField( choices=['No schooling completed', 'Some high school, no diploma', 'High school graduate, diploma or the equivalent', 'Some college credit, no degree', 'Trade/technical/vocational training', 'Associate degree', "Bachelor's degree", "Master's degree", 'Professional degree', 'Doctorate degree'], label='What is the highest degree or level of school you have completed? If currently enrolled, highest degree already completed.' )