class Player(otree.models.BasePlayer): # <built-in> group = models.ForeignKey(Group, null=True) subsession = models.ForeignKey(Subsession) # </built-in> training_question_1 = models.CharField( max_length=100, choices=[ 'Player 1 gets 0 points, Player 2 gets 0 points', 'Player 1 gets 100 points, Player 2 gets 100 points', 'Player 1 gets 100 points, Player 2 gets 0 points', 'Player 1 gets 0 points, Player 2 gets 100 points' ], widget=widgets.RadioSelect()) def is_training_question_1_correct(self): return self.training_question_1 == Constants.training_1_correct penny_side = models.CharField(choices=['Heads', 'Tails'], doc="""Heads or tails""", widget=widgets.RadioSelect()) is_winner = models.NullBooleanField(doc="""Whether player won the round""") def other_player(self): """Returns the opponent of the current player""" return self.get_others_in_group()[0] def role(self): if self.id_in_group == 1: return 'Player 1' if self.id_in_group == 2: return 'Player 2'
class Group(otree.models.BaseGroup): # <built-in> subsession = models.ForeignKey(Subsession) # </built-in> players_per_group = 2 total_return = models.MoneyField( doc="""Total return from agent's effort = [Return for single unit of agent's work effort] * [Agent's work effort]""" ) agent_fixed_pay = models.MoneyField( doc="""Amount offered as fixed pay to agent""" ) agent_return_share = models.FloatField( doc="""Agent's share of total return""", ) agent_work_effort = models.PositiveIntegerField( doc="""Agent's work effort, [1, 10]""", ) agent_work_cost = models.MoneyField( doc="""Agent's cost of work effort""" ) contract_accepted = models.NullBooleanField( doc="""Whether agent accepts proposal""", widget=widgets.RadioSelect(), ) # choices def agent_fixed_pay_choices(self): return money_range(-Constants.max_fixed_payment, Constants.max_fixed_payment, 0.50) def agent_work_effort_choices(self): return range(1, 10+1) def agent_return_share_choices(self): return Constants.agent_return_share_choices def set_payoffs(self): principal = self.get_player_by_role('principal') agent = self.get_player_by_role('agent') if not self.contract_accepted: principal.payoff = Constants.reject_principal_pay agent.payoff = Constants.reject_agent_pay else: self.agent_work_cost = cost_from_effort(self.agent_work_effort) self.total_return = return_from_effort(self.agent_work_effort) money_to_agent = self.agent_return_share*self.total_return + self.agent_fixed_pay agent.payoff = money_to_agent - self.agent_work_cost principal.payoff = self.total_return - money_to_agent
class Group(otree.models.BaseGroup): # <built-in> subsession = models.ForeignKey(Subsession) # </built-in> total_return = models.CurrencyField( doc="""Total return from agent's effort = [Return for single unit of agent's work effort] * [Agent's work effort]""") agent_fixed_pay = models.CurrencyField( doc="""Amount offered as fixed pay to agent""", bounds=[Constants.min_fixed_payment, Constants.max_fixed_payment], verbose_name='Fixed Payment (from %i to %i)' % (Constants.min_fixed_payment, Constants.max_fixed_payment)) agent_return_share = models.FloatField( choices=Constants.agent_return_share_choices, doc="""Agent's share of total return""", verbose_name='Return Share', widget=widgets.RadioSelectHorizontal()) agent_work_effort = models.PositiveIntegerField( choices=range(1, 10 + 1), doc="""Agent's work effort, [1, 10]""", widget=widgets.RadioSelectHorizontal(), ) agent_work_cost = models.CurrencyField( doc="""Agent's cost of work effort""") contract_accepted = models.NullBooleanField( doc="""Whether agent accepts proposal""", widget=widgets.RadioSelect(), choices=( (True, 'Accept'), (False, 'Reject'), )) def set_payoffs(self): principal = self.get_player_by_role('principal') agent = self.get_player_by_role('agent') if not self.contract_accepted: principal.payoff = Constants.reject_principal_pay agent.payoff = Constants.reject_agent_pay else: self.agent_work_cost = cost_from_effort(self.agent_work_effort) self.total_return = return_from_effort(self.agent_work_effort) money_to_agent = self.agent_return_share * \ self.total_return + self.agent_fixed_pay agent.payoff = money_to_agent - self.agent_work_cost principal.payoff = self.total_return - money_to_agent principal.payoff += Constants.bonus agent.payoff += Constants.bonus
class Player(otree.models.BasePlayer): # <built-in> group = models.ForeignKey(Group, null=True) subsession = models.ForeignKey(Subsession) # </built-in> volunteer = models.NullBooleanField( doc="""Whether player volunteers""", widget=widgets.RadioSelect(), )
class Player(otree.models.BasePlayer): # <built-in> subsession = models.ForeignKey(Subsession) group = models.ForeignKey(Group, null=True) # </built-in> accept = models.NullBooleanField(widget=widgets.RadioSelect()) def set_payoff(self): """Calculate payoff, which is zero for the survey""" self.payoff = 0
class Player(otree.models.BasePlayer): # <built-in> group = models.ForeignKey(Group, null=True) subsession = models.ForeignKey(Subsession) # </built-in> training_my_payoff = models.CurrencyField( verbose_name='My payoff would be') volunteer = models.NullBooleanField( doc="""Whether player volunteers""", widget=widgets.RadioSelect(), )
class Player(otree.models.BasePlayer): # <built-in> group = models.ForeignKey(Group, null=True) subsession = models.ForeignKey(Subsession) # </built-in> training_question_1 = models.CharField(max_length=100, null=True, verbose_name='', widget=widgets.RadioSelect()) def training_question_1_choices(self): return [ 'Player 1 gets 0 points, Player 2 gets 0 points', 'Player 1 gets 100 points, Player 2 gets 100 points', 'Player 1 gets 100 points, Player 2 gets 0 points', 'Player 1 gets 0 points, Player 2 gets 100 points' ] def is_training_question_1_correct(self): return self.training_question_1 == self.subsession.training_1_correct points_earned = models.PositiveIntegerField(default=0, doc="""Points earned""") penny_side = models.CharField(choices=['Heads', 'Tails'], doc="""Heads or tails""", widget=widgets.RadioSelect()) is_winner = models.NullBooleanField(doc="""Whether player won the round""") def other_player(self): """Returns the opponent of the current player""" return self.other_players_in_group()[0] def role(self): if self.id_in_group == 1: return 'Player 1' if self.id_in_group == 2: return 'Player 2' def set_payoff(self): self.payoff = 0
class Group(otree.models.BaseGroup): subsession = models.ForeignKey(Subsession) strategy = models.NullBooleanField( doc="""Whether this group uses strategy method""") amount_offered = models.CurrencyField(choices=Constants.offer_choices) offer_accepted = models.NullBooleanField( doc="if offered amount is accepted (direct response method)") response_0 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) response_10 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) response_20 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) response_30 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) response_40 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) response_50 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) response_60 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) response_70 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) response_80 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) response_90 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) response_100 = models.NullBooleanField( widget=widgets.RadioSelectHorizontal()) def set_payoffs(self): p1, p2 = self.get_players() if self.strategy: 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