from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import numpy as np import pandas as pd import itertools import random import django #from captcha.fields import ReCaptchaField #from captcha.widgets import ReCaptchaV2Checkbox author = 'Elisa Macchi' doc = """ Perception Body Mass """ class Constants(BaseConstants): name_in_url = 'perception' players_per_group = None n_players = 1 ### Instructions consent_template = 'perception/consent_template.html' n_questions = 6 n_images = 3 # Time num_rounds = 1 max_time = 40 # Payoffs: participation_fee = c(5000) max_bonus = c(5000) min_bonus = c(5000) ### Image info: pic_men = [1, 2, 4, 9] pic_wom = [3, 5, 6, 7, 8, 10] np.random.shuffle(pic_men) np.random.shuffle(pic_wom) img_fat_wom = ['3_fat.jpg', '5_fat.jpg', '6_fat.jpg', '7_fat.jpg', '8_fat.jpg', '10_fat.jpg'] img_thin_wom = ['3_thin.jpg', '5_thin.jpg', '6_thin.jpg', '7_thin.jpg', '8_thin.jpg', '10_thin.jpg'] img_fat_man = ['1_fat.jpg', '2_fat.jpg', '4_fat.jpg', '9_fat.jpg'] img_thin_man = ['1_thin.jpg', '2_thin.jpg', '4_thin.jpg', '9_thin.jpg'] age = { '1_fat.jpg': 31, '2_fat.jpg': 58, '3_fat.jpg': 47, '4_fat.jpg': 32, '5_fat.jpg': 40, '6_fat.jpg': 52, '7_fat.jpg': 56, '8_fat.jpg': 38, '9_fat.jpg': 33, '10_fat.jpg': 37, '1_thin.jpg': 31, '2_thin.jpg': 58, '3_thin.jpg': 47, '4_thin.jpg': 32, '5_thin.jpg': 40, '6_thin.jpg': 52, '7_thin.jpg': 56, '8_thin.jpg': 38, '9_thin.jpg': 33, '10_thin.jpg': 37, } collateral = ['car', 'land title'] class Subsession(BaseSubsession): def creating_session(self): # Random assign gender, body mass and information: pic_bm_gender = itertools.cycle(['thin_wom', 'thin_man', 'fat_wom', 'fat_man', 'thin_wom_info', 'thin_man_info', 'fat_wom_info', 'fat_man_info']) img_fat_wom = itertools.cycle(Constants.img_fat_wom) img_thin_wom = itertools.cycle(Constants.img_thin_wom) img_fat_man = itertools.cycle(Constants.img_fat_man) img_thin_man = itertools.cycle(Constants.img_thin_man) # randomize to collateral choice for p in self.get_players(): # Randomize whether car/no car info. p.treatment = next(pic_bm_gender) if p.treatment == "thin_wom": p.participant.vars['images'] = random.choice(Constants.img_thin_wom) p.image_url = p.participant.vars['images'] p.participant.vars['info'] = 'none' p.collateral = p.participant.vars['info'] p.image_male = 0 elif p.treatment == "thin_man": p.participant.vars['images'] = random.choice(Constants.img_thin_man) p.image_url = p.participant.vars['images'] p.participant.vars['info'] = 'none' p.collateral = p.participant.vars['info'] p.image_male = 1 elif p.treatment == "fat_wom": p.participant.vars['images'] =random.choice(Constants.img_fat_wom) p.image_url = p.participant.vars['images'] p.participant.vars['info'] = 'none' p.collateral = p.participant.vars['info'] p.image_male = 0 elif p.treatment == "fat_man": p.participant.vars['images'] = random.choice(Constants.img_fat_man) p.image_url = p.participant.vars['images'] p.participant.vars['info'] = 'none' p.collateral = p.participant.vars['info'] p.image_male = 1 elif p.treatment == "thin_wom_info": p.participant.vars['images'] = random.choice(Constants.img_thin_wom) p.image_url = p.participant.vars['images'] p.participant.vars['info'] = random.choice(Constants.collateral) p.collateral = p.participant.vars['info'] p.image_male = 0 elif p.treatment == "thin_man_info": p.participant.vars['images'] = random.choice(Constants.img_thin_man) p.image_url = p.participant.vars['images'] p.participant.vars['info'] = random.choice(Constants.collateral) p.collateral = p.participant.vars['info'] p.image_male = 1 elif p.treatment == "fat_wom_info": p.participant.vars['images'] = random.choice(Constants.img_fat_wom) p.image_url = p.participant.vars['images'] p.participant.vars['info'] = random.choice(Constants.collateral) p.collateral = p.participant.vars['info'] p.image_male = 0 elif p.treatment == "fat_man_info": p.participant.vars['images'] = random.choice(Constants.img_fat_man) p.image_url = p.participant.vars['images'] p.participant.vars['info'] = random.choice(Constants.collateral) p.collateral = p.participant.vars['info'] p.image_male = 1 # Age for k, v in Constants.age.items(): if p.image_url == k: p.image_age = v class Group(BaseGroup): pass class Player(BasePlayer): # Treatment: treatment = models.StringField() image_url = models.StringField() # Collateral variation: collateral = models.StringField() # Images Characteristics image_age = models.IntegerField() image_male = models.BooleanField() # Beliefs: b1 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, label=''' How do you rate this person's wealth?; Not at all wealthy; Extremely wealthy ''') # income b2 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, label=''' How do you rate this person's health?; Not at all healthy; Extremely healthy ''') # income b3 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, label=''' How do you rate this person's attractiveness?; Not at all attractive; Extremely attractive ''' ) # income b4 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, label=''' How do you rate this person's self control?; Not at all controlled; Extremely controlled ''') # income b5 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, label=''' How do you rate this person's life expectancy?; Not at all high; Extremely high ''') # longevity b6 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, label=''' How do you rate this person's intelligence?; Not at all intelligent; Extremely intelligent ''') # intelligence # Perception: q1 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, verbose_name=''' How do you think other people from Kampala rated the individual’s wealth?; Not at all wealthy; Extremely wealthy ''') # income q2 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, verbose_name=''' How do you think other people from Kampala rated the individual’s health?; Not at all attractive; Extremely attractive ''') # health q3 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, verbose_name=''' How do you think other people from Kampala rated the individual's attractiveness?; Not at all attractive; Extremely attractive ''') # attractiveness q4 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, verbose_name=''' How do you think other people from Kampala rated the individual’s self control?; Not at all high; Extremely high ''') # self control q5 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, verbose_name=''' How do you think other people from Kampala rated the individual’s life expectancy?; Not at all high; Extremely high ''') # longevity q6 = models.IntegerField(choices=[[1, ""], [2, ""], [3, ""], [4, ""],[5, ""]], widget=widgets.RadioSelectHorizontal, default=None, verbose_name=''' How do you think other people from Kampala rated the individual’s intelligence?; Not at all intelligent; Extremely intelligent ''')# intelligence # Payments def role(self): if self.image_url == '1_thin.jpg': return '1_thin.jpg' if self.image_url == '2_thin.jpg': return '2_thin.jpg' if self.image_url == '3_thin.jpg': return '3_thin.jpg' if self.image_url == '1_original.jpg': return '1_original.jpg' if self.image_url == '2_original.jpg': return '2_original.jpg' if self.image_url == '3_original.jpg': return '3_original.jpg' if self.image_url == '1_fat.jpg': return '1_fat.jpg' if self.image_url == '2_fat.jpg': return '2_fat.jpg' if self.image_url == '3_fat.jpg': return '3_fat.jpg'