from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): instructions_template = 'ultimatum_strategy_beliefs/Instructions.html' name_in_url = 'ultimatum_strategy_beliefs' players_per_group = 2 num_rounds = 1 endowment = c(100) payoff_if_rejected = c(0) offer_increment = c(10) offer_choices = currency_range(0, endowment, offer_increment) offer_choices_count = len(offer_choices) keep_give_amounts = [] for offer in offer_choices: keep_give_amounts.append((offer, endowment - offer)) class Subsession(BaseSubsession): pass def question(amount): return 'Would you accept an offer of {}?'.format(c(amount)) def question_p(amount): return 'How likely (in %) is it that the responder will accept an offer of {}?'.format(c(amount)) class Group(BaseGroup): amount_offered = models.CurrencyField(choices=Constants.offer_choices) offer_accepted = models.BooleanField( doc="if offered amount is accepted (direct response method)" ) # for strategy method response_0 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(0)) response_10 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(10)) response_20 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(20)) response_30 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(30)) response_40 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(40)) response_50 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(50)) response_60 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(60)) response_70 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(70)) response_80 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(80)) response_90 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(90)) response_100 = models.BooleanField( widget=widgets.RadioSelectHorizontal(), verbose_name=question(100)) # for belief elicitation responsep_0 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(0)) responsep_10 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(10)) responsep_20 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(20)) responsep_30 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(30)) responsep_40 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(40)) responsep_50 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(50)) responsep_60 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(60)) responsep_70 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(70)) responsep_80 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(80)) responsep_90 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(90)) responsep_100 = models.PositiveIntegerField( choices=range(0,100+1, 5), widget=None, verbose_name=question_p(100)) def set_payoffs(self): p1, p2 = self.get_players() self.offer_accepted = getattr(self, 'response_{}'.format( int(self.amount_offered))) if self.offer_accepted: p1.payoff = Constants.endowment - self.amount_offered p2.payoff = self.amount_offered else: p1.payoff = Constants.payoff_if_rejected p2.payoff = Constants.payoff_if_rejected class Player(BasePlayer): pass