# DEFAULT IMPORT from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random import itertools import json ''' # TREATMENT OPTIONS treat_op = ( (0, 'control'), (1, 'public'), (2, 'consumption'), ) # SUBTREATMENT OPTIONS subtreat_op = ( (0, 'control'), (1, 'transfer'), (2, 'outside'), ) ''' class Constants(BaseConstants): name_in_url = "BE_signaling_wip" players_per_group = 2 tasks = ['1', '2', '3', '4'] num_rounds = len(tasks) new_template = "BE_signaling_wip/new.html" class Subsession(BaseSubsession): def creating_session(self): # CREATE THE 4 PRACTICE SLIDERS FOR THE MAN for player in self.get_players(): slider_initial_be01a = random.randint(0, 40) player.slider_initial_be01a = slider_initial_be01a player.slider = slider_initial_be01a slider_initial_be01b = random.randint(0, 100) player.slider_initial_be01b = slider_initial_be01b player.slider = slider_initial_be01b slider_initial_be02a = random.randint(0, 40) player.slider_initial_be02a = slider_initial_be02a player.slider = slider_initial_be02a slider_initial_be02b = random.randint(0, 100) player.slider_initial_be02b = slider_initial_be02b player.slider = slider_initial_be02b # TO SET UP TYPE, TREATMENT AND SUBTREATMENT, CHANGE type, treatment and subtreatment here below type = itertools.cycle(['EA']) for g in self.get_groups(): g.type = next(type) treatment = itertools.cycle([0]) for g in self.get_groups(): g.treatment = next(treatment) subtreatment = itertools.cycle([1]) for g in self.get_groups(): g.subtreatment = next(subtreatment) # RANDOMIZE THE ORDER OF THE ROUNDS if self.round_number == 1: for p in self.get_players(): round_numbers = list(range(1, Constants.num_rounds + 1)) random.shuffle(round_numbers) p.participant.vars['task_rounds'] = dict(zip(Constants.tasks, round_numbers)) class Group(BaseGroup): # DEFINE RANDOM NUMBER TO USE AS A STARTING POINT OF THE SLIDER def random_num(): return random.randint(0, 10) # DEFINE UNDERSTANDING QUESTIONS #understand_marble = models.IntegerField() understand_plate = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) treatment = models.IntegerField( choices=[ [0, 'Control'], [1, 'Consumption'], [2, 'Public'], ] ) subtreatment = models.IntegerField( choices=[ [0, 'Normal'], [1, 'Transfer'], [2, 'Outside_Option'], ] ) type = models.StringField( choices=[ 'EA', 'EPC', 'EPH', ] ) # PUNISHMENT EXPERIMENT # # PRACTICE PLATE QUESTION FOR THE WOMAN riceplate_practice = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) # PLATE QUESTION FOR THE WOMAN be01 = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) # SOUND OPTION (WOMAN) --> "Do you want to listen to the sound?" be02 = models.IntegerField( label="", choices=[ [0, "No sound - শব্দ শুনতে চাই না"], [1, "Sound - শব্দ শুনতে চাই "], ], ) # MARBLE THE RESPONDENT PICKS be03 = models.IntegerField( label="", choices=[ [0, "Blue - নীল"], [1, "Red - লাল"], ], ) # WOMAN'S OPTION TO DEPRIVE THE MAN OF THE FOOD be03_w = models.IntegerField( label="", choices=[ [0, 'No Food- আমি পুরুষটিকে খাবার দিতে চাই না '], [1, 'Yes Give Food - আমি পুরুষটিকে খাবার দিতে চাই'], ] ) # SLIDER TO USE IN THE SIGNALING DIAGNOSTIC TEST --> "How much money do you want to transfer to the other man?" signaling = models.IntegerField( label="", min=0, max=50, widget=widgets.Slider(attrs={'step': '5'}), default=random_num, ) class Player(BasePlayer): def random_num(): return random.randint(0, 10) checkslider = models.PositiveIntegerField() # MAN DECIDES WHETHER TO GIVE THE SOUND OR NOT sound_decide_m = models.IntegerField( label="", choices=[ [0, "No sound - শব্দ শুনতে চাই না"], [1, "Sound - শব্দ শুনতে চাই "], ], ) gender = models.StringField( label='', choices=[ ['M', "Man"], ['W', "Woman"], ], ) # PRACTICE SLIDERS FOR THE MAN slider_initial_be01a = models.IntegerField() slider_initial_be01b = models.IntegerField() slider_initial_be02a = models.IntegerField() slider_initial_be02b = models.IntegerField() #slider = models.IntegerField( # label="", # min=0, max=50, # widget=widgets.Slider(attrs={'step': '1'}), #) public_schedule = models.IntegerField( label='', choices=[ [1, 'Punishment Private'], [0, 'Punishment Public'], ], ) # UNDERSTANDING QUESTIONS understand1 = models.IntegerField( label='', choices=[ [1, 'The good bag'], [0, 'The bad bag'], ], ) understand1a = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) understand1b = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) understand1c = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) understand2 = models.IntegerField( label='', choices=[ [1, 'The good bag'], [0, 'The bad bag'], ], ) understand2a = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) understand2b = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) understand2c = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) understand2c_cons = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) plateget = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) whyplateget = models.LongStringField() # END UNDERSTANDING QUESTIONS ### Defining questions for counter question1 = models.IntegerField(initial=0, blank=True) question2 = models.IntegerField(initial=0, blank=True) question3 = models.IntegerField(initial=0, blank=True) question4 = models.IntegerField(initial=0, blank=True) question5 = models.IntegerField(initial=0, blank=True) question6 = models.IntegerField(initial=0, blank=True) question7 = models.IntegerField(initial=0, blank=True) question8 = models.IntegerField(initial=0, blank=True) question9 = models.IntegerField(initial=0, blank=True) corr_be01a = models.IntegerField(initial=0, blank=True) corr_be01b = models.IntegerField(initial=0, blank=True) corr_be02a = models.IntegerField(initial=0, blank=True) corr_be02b = models.IntegerField(initial=0, blank=True) ######################################################################################################### # HOW MUCH DO YOU DISLIKE THE SOUND? sound_dislike = models.IntegerField( label="", choices=[ [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], ], widget=widgets.RadioSelectHorizontal(), ) # HOW MUCH DO YOU THINK THIS PUNISHMENT WORK? punishment_work = models.IntegerField( label="", choices=[ [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], ], widget=widgets.RadioSelectHorizontal(), ) # ENUMERATOR ID SELECTION enumerator_ID = models.StringField( label="Name of enumerator?", choices=[ "Sakib", "Dilshad", "Anne", "Hasib", ], ) # REAL GAME CHOICE SELECTION practice = models.IntegerField( label="Is this a real game?", choices=[ [1, "Yes"], [0, "No"], ], ) # SLIDER FOR CHOOSING THE SOUND FOR THE BAD PLATE (MAN) be01a_man = models.IntegerField( label="", min=0, max=40, widget=widgets.Slider(attrs={'step': '1'}, show_value=False), default=random_num, ) # CORRECTION SLIDER FOR CHOOSING THE SOUND FOR THE BAD PLATE (MAN) be01a_man_corr1 = models.IntegerField( label="", min=0, max=40, widget=widgets.Slider(attrs={'step': '1'}, show_value=False), default=random_num, ) # SLIDER FOR CHOOSING THE MONEY TO TRANSFER FOR THE BAD PLATE (MAN) be01b_man = models.IntegerField( label="", min=0, max=100, widget=widgets.Slider(attrs={'step': '5'}), ) # CORRECTION SLIDER FOR CHOOSING THE MONEY TO TRANSFER FOR THE BAD PLATE (MAN) be01b_man_corr1 = models.IntegerField( label="", min=0, max=100, widget=widgets.Slider(attrs={'step': '5'}), ) # SLIDER FOR CHOOSING THE SOUND FOR THE GOOD PLATE (MAN) be02a_man = models.IntegerField( label="", min=0, max=40, widget=widgets.Slider(attrs={'step': '1'}, show_value=False), ) # CORRECTION SLIDER FOR CHOOSING THE SOUND FOR THE GOOD PLATE (MAN) be02a_man_corr1 = models.IntegerField( label="", min=0, max=40, widget=widgets.Slider(attrs={'step': '1'}, show_value=False), ) # SLIDER FOR CHOOSING THE MONEY TO TRANSFER FOR THE GOOD PLATE (MAN) be02b_man = models.IntegerField( label="", min=0, max=100, widget=widgets.Slider(attrs={'step': '5'}), ) # CORRECTION SLIDER FOR CHOOSING THE MONEY TO TRANSFER FOR THE GOOD PLATE (MAN) be02b_man_corr1 = models.IntegerField( label="", min=0, max=100, widget=widgets.Slider(attrs={'step': '5'}), ) # INSERT HOUSEHOLD ID HHID = models.IntegerField( label="Household ID", min=0, max=100, # MAX IS THE MAXIMUM NUMBER OF HOUSEHOLDS SURVEYED ) # INSERT PERSON ID person_id = models.IntegerField( label="Person ID", min=0, max=100, # MAX IS THE MAXIMUM NUMBER OF PEOPLE SURVEYED ) # PLATE CHOICE plate = models.IntegerField( label="", choices=[ [0, 'The bad plate - খারাপ বাটি'], [1, 'The good plate - ভাল বাটি'], ], ) # VARIABLES TO STORE THE VALUE OF THE SLIDER be01a_stored = models.IntegerField() be01b_stored = models.IntegerField() be02a_stored = models.IntegerField() be02b_stored = models.IntegerField() be01a_stored_m = models.IntegerField() be01b_stored_m = models.IntegerField() be02a_stored_m = models.IntegerField() be02b_stored_m = models.IntegerField() # END VARIABLES TO STORE THE VALUE OF THE SLIDER # VARIABLES TO CONFIRM THE VALUE OF THE SLIDER confirmation_be01a = models.IntegerField( choices=[ [1, "No"], [0, "Yes"], ], label="", ) confirmation_be01b = models.IntegerField( choices=[ [1, "No"], [0, "Yes"], ], label="", ) confirmation_be02a = models.IntegerField( choices=[ [1, "No"], [0, "Yes"], ], label="", ) confirmation_be02b = models.IntegerField( choices=[ [1, "No"], [0, "Yes"], ], label="", ) # END VARIABLES TO CONFIRM THE VALUE OF THE SLIDER def guess_be01a_man(self): self.participant.vars['be01a_man_st'] = self.be01a_man print('Slider is', self.participant.vars['be01a_man_st'], 'for sound if she keeps good plate') def guess_be01b_man(self): self.participant.vars['be01b_man_st'] = self.be01b_man print('Slider is', self.participant.vars['be01b_man_st'], 'for money if she keeps the good plate') def guess_be02a_man(self): self.participant.vars['be02a_man_st'] = self.be02a_man print('Slider is', self.participant.vars['be02a_man_st'], 'for sound if she keeps the bad plate') def guess_be02b_man(self): self.participant.vars['be02b_man_st'] = self.be02b_man print('Slider is', self.participant.vars['be02b_man_st'], 'for money if she keeps tha bad plate') def other_player(self): return self.get_others_in_group()[0] # STORE VARIABLES BASED ON WHICH SUBTREATMENT IS SELECTED def vars_for_template(self): if self.group.subtreatment != 1 and self.participant.vars['gender'] == 'W': # What I am doing: set the model field value and return that model field in dict() # I've done it for this and the next condition. self.be01a_stored = self.other_player().participant.vars['be01a_man_st'] self.be02a_stored = self.other_player().participant.vars['be02a_man_st'] return dict( be01a_stored=self.be01a_stored, be02a_stored=self.be02a_stored, be01a_stored_initial=self.be01a_stored, be02a_stored_initial=self.be02a_stored, ) elif self.group.subtreatment == 1 and self.participant.vars['gender'] == 'W': self.be01a_stored = self.other_player().participant.vars['be01a_man_st'] self.be01b_stored = self.other_player().participant.vars['be01b_man_st'] self.be02a_stored = self.other_player().participant.vars['be02a_man_st'] self.be02b_stored = self.other_player().participant.vars['be02b_man_st'] return dict( be01a_stored=self.be01a_stored, be01b_stored=self.be01b_stored, be02a_stored=self.be02a_stored, be02b_stored=self.be02b_stored, be01a_stored_inital=self.be01a_stored, be01b_stored_inital=self.be01b_stored, be02a_stored_inital=self.be02a_stored, be02b_stored_inital=self.be02b_stored, ) elif self.group.subtreatment != 1 and self.participant.vars['gender'] == 'M': self.be01a_stored_m = self.participant.vars['be01a_man_st'] self.be02a_stored_m = self.participant.vars['be02a_man_st'] return dict( be01a_stored_m=self.be01a_stored_m, be02a_stored_m=self.be02a_stored_m, be01a_stored_m_initial=self.be01a_stored_m, be02a_stored_m_initial=self.be02a_stored_m, ) elif self.group.subtreatment == 1 and self.participant.vars['gender'] == 'M': self.be01a_stored_m = self.participant.vars['be01a_man_st'] self.be02a_stored_m = self.participant.vars['be02a_man_st'] self.be01b_stored_m = self.participant.vars['be01b_man_st'] self.be02b_stored_m = self.participant.vars['be02b_man_st'] return dict( be01a_stored_m=self.be01a_stored_m, be01b_stored_m=self.be01b_stored_m, be02a_stored_m=self.be02a_stored_m, be02b_stored_m=self.be02b_stored_m, be01a_stored_m_initial=self.be01a_stored_m, be01b_stored_m_initial=self.be01b_stored_m, be02a_stored_m_initial=self.be02a_stored_m, be02b_stored_m_initial=self.be02b_stored_m, ) ############################################################## # FEEDBACK QUESTIONS feedback1 = models.LongStringField(label="") feedback2 = models.LongStringField(label="") extra_comment = models.LongStringField(label="") nrchildren = models.IntegerField(label="") men1625 = models.IntegerField(label="") men2550 = models.IntegerField(label="") menover50 = models.IntegerField(label="") women1625 = models.IntegerField(label="") women2550 = models.IntegerField(label="") womenover50 = models.IntegerField(label="") ##############################################################