Ejemplo n.º 1
0
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'
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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(),
    )
Ejemplo n.º 5
0
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
Ejemplo n.º 6
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(),
    )
Ejemplo n.º 7
0
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
Ejemplo n.º 8
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