from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import itertools import random author = 'Elisa' class Constants(BaseConstants): name_in_url = 'notebook' players_per_group = 3 num_rounds = 1 showupfee = 1 bonus = 1 raterbonus = 2 # Portraits: img_f = ['1_fat.jpg'] img_o = ['1_original.jpg', '2_original.jpg'] img_t = ['2_thin.jpg'] treatments = ['original', 'thin', 'fat'] signals = ['poor', 'rich'] class Subsession(BaseSubsession): def creating_session(self): costs = itertools.cycle([1, 2, 3]) ts = Constants.treatments.copy() random.shuffle(ts) cycle_ts = itertools.cycle(ts) ss = Constants.signals.copy() random.shuffle(ss) cycle_ss = itertools.cycle(ss) for p in self.get_players(): if p.id_in_group < 3: p.treatment = next(cycle_ts) p.signal = next(cycle_ss) p.cost = next(costs) if p.treatment == "fat": imgs = itertools.cycle(Constants.img_f) p.participant.vars['images'] = next(imgs) p.image_url = next(imgs) if p.treatment == "original": imgs = itertools.cycle(Constants.img_o) p.participant.vars['images'] = next(imgs) p.image_url = next(imgs) if p.treatment == "thin": imgs = itertools.cycle(Constants.img_t) p.participant.vars['images'] = next(imgs) p.image_url = next(imgs) class Group(BaseGroup): def set_payoffs(self): players = self.get_players() receiver = self.get_player_by_role('receiver') winners = [p for p in players if p.id_in_group == receiver.choice and p.signal == 'rich' or p.id_in_group != receiver.choice and p.signal == 'poor'] winner = random.choice(winners) for p in winners: p.among_winners = True for p in players: if p == winner: p.is_winner = True p.payoff = Constants.bonus + Constants.showupfee elif p != winner and p.id_in_group ==3 : p.is_winner = False p.payoff = Constants.raterbonus + Constants.showupfee else: p.is_winner = False p.payoff = Constants.showupfee class Player(BasePlayer): # Player Role: def role(self): if self.id_in_group == 3: return 'receiver' else: return 'sender' # Player Treatment treatment = models.StringField() image_url = models.StringField() cost = models.IntegerField() signal = models.StringField() # Description Characteristics: age = models.IntegerField() gender = models.BooleanField() personality = models.StringField() education = models.StringField() bodymass = models.IntegerField() # Store response: r1 = models.IntegerField() r2 = models.BooleanField() r3 = models.IntegerField() image_shown = models.StringField() # Image include = models.StringField(choices=['Yes', 'No']) choice = models.IntegerField(choices=((1, 'Description 1'), (2, 'Description 2')), widget=widgets.RadioSelect) # Win/Lose among_winners = models.BooleanField() is_winner = models.BooleanField()