Example #1
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""",
        min=Constants.min_fixed_payment,
        max=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.BooleanField(
        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

    def return_share_as_percentage(self):
        return utils.float_as_percentage(self.agent_return_share)
Example #2
0
class Player(otree.models.BasePlayer):

    # <built-in>
    group = models.ForeignKey(Group, null=True)
    subsession = models.ForeignKey(Subsession)
    # </built-in>

    gender = models.CharField(
        max_length=10, choices=['Male', 'Female'],
        widget=widgets.RadioSelectHorizontal())

    age = models.IntegerField(min=10, max=100)

    nationality = models.CharField(
        max_length=10, widget=widgets.RadioSelectHorizontal(),
        choices=["Dutch", "Germany", "Spanish", "Other"])

    education_level = models.CharField(
        verbose_name="Highest finished level of education",
        max_length=29,
        choices=["High school", "First year college", "second year college",
                 "third year college", "Bachelor", "Master", "Doctorate"])
    study = models.CharField(
        max_length=29,
        choices=["Chemistry and physics", "Business and Economics", "Law",
                 "Health and medicine", "language and communication",
                 "technique", "Art and cultures", "other"])
Example #3
0
class Player(BasePlayer):

    identification1 = models.PositiveIntegerField(
        initial=None,
        choices=range(1, 8),
        verbose_name='Persons of your same ethnicity living in Xishuangbanna',
        widget=widgets.RadioSelectHorizontal())

    identification2 = models.PositiveIntegerField(
        initial=None,
        choices=range(1, 8),
        verbose_name=
        'Persons of your same ethnicity living outside Xishuangbanna',
        widget=widgets.RadioSelectHorizontal())

    identification3 = models.PositiveIntegerField(
        initial=None,
        choices=range(1, 8),
        verbose_name=
        'Persons with your same confession living in Xishuangbanna',
        widget=widgets.RadioSelectHorizontal())

    identification4 = models.PositiveIntegerField(
        initial=None,
        choices=range(1, 8),
        verbose_name=
        'Persons with your same confession living outside Xishuangbanna',
        widget=widgets.RadioSelectHorizontal())
Example #4
0
class Group(BaseGroup):
    offered_coins = models.CurrencyField(choices=Constants.offered_choices)

    offer_accepted = models.BooleanField()

    punish_dictator = models.BooleanField()

    response_0 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_5 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_10 = models.BooleanField(widget=widgets.RadioSelectHorizontal())

    def set_payoffs(self):
        dictator = self.get_player_by_id(1)
        recipient = self.get_player_by_id(2)
        punisher = self.get_player_by_id(3)
        # if offer is accepted the punisher does not get involved/punish
        if self.offer_accepted:
            if self.amount_offered >= 5:
                dictator.payoff = Constants.endowment - self.amount_offered
                recipient.payoff = self.amount_offered
                punisher.payoff = 0
            else:
                dictator.payoff = Constants.endowment / 2
                recipient.payoff = dictator.payoff
                punisher.payoff = dictator.payoff

        # if the offer is rejected the punisher get invoved and deducts payoff
        # from the dictator or player one
        elif self.punish_dictator:
            # dictators pay is cut in half by the punisher
            dictator.payoff = Constants.endowment / 2
            # recipient gets a quater off the dictators payoff
            recipient.payoff = (dictator.payoff / 2) / 4
            # punisher gets a quater off the dictators payoff
            punisher.payoff = (dictator.payoff / 2) / 4
Example #5
0
class Player(BasePlayer):

    turk_id = models.CharField(
        verbose_name='Please enter your Mechanical Turk ID',
        widget=widgets.TextInput())

    clear = models.PositiveIntegerField(
        choices=[[1, 'Very clear'], [2, 'Somewhat clear'],
                 [3, 'Neither clear nor unclear'], [4, 'Somewhat unclear'],
                 [5, 'Very unclear']],
        verbose_name='How clear were the instructions to play the game?',
        widget=widgets.RadioSelectHorizontal())

    timing_instr = models.PositiveIntegerField(
        choices=[
            [1, 'Very long'],
            [2, 'Somewhat long'],
            [3, 'Just right'],
            [4, 'Somewhat short'],
            [5, 'Very short'],
        ],
        verbose_name=
        'How was the allocated timing to read the instructions? i.e. Did you have enough time to read the instructions before the page automatically forwards?',
        widget=widgets.RadioSelectHorizontal())

    timing_dec = models.PositiveIntegerField(
        choices=[[1, 'Very fast'], [2, 'Somewhat fast'], [3, 'Just right'],
                 [4, 'Somewhat slow'], [5, 'Very slow']],
        verbose_name=
        'How was the allocated timing for the decision making page? (The page each round that asks for your decision) i.e. Did you have enough time to make an informed decision before the page automatically forwards?',
        widget=widgets.RadioSelectHorizontal())

    timing_res = models.PositiveIntegerField(
        choices=[[1, 'Very fast'], [2, 'Somewhat fast'], [3, 'Just right'],
                 [4, 'Somewhat slow'], [5, 'Very slow']],
        verbose_name=
        'How was the allocated timing for the page displaying the results of the game? (The page that shows the outcome for each round) i.e. Did you have enough time to read the results of each round before the page automatically forwards?',
        widget=widgets.RadioSelectHorizontal())

    diff = models.PositiveIntegerField(
        choices=[[1, 'Very easy'], [2, 'Somewhat easy'],
                 [3, 'Neither easy nor difficult'], [4, 'Somewhat difficult'],
                 [5, 'Very difficult']],
        verbose_name='How easy was it to understand the goal of the game?',
        widget=widgets.RadioSelectHorizontal())

    comment = models.CharField(
        verbose_name='Please write any comments or suggestions about the game',
        widget=widgets.Textarea())

    def role(self):
        if self.id_in_group == 1:
            return 'attacker'
        if self.id_in_group == 2:
            return 'defender'
        if self.id_in_group == 3:
            return 'user'
Example #6
0
class Player(BasePlayer):

    health = models.PositiveIntegerField(min=0, max=Constants.max_health)
    resources = models.PositiveIntegerField(min=0)

    use_toilet = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    small_cleaning = models.BooleanField(widget=widgets.RadioSelectHorizontal())

    big_clean = models.BooleanField(widget=widgets.RadioSelectHorizontal())
Example #7
0
class Player(BasePlayer):
    health = models.FloatField(min=0, max=Constants.max_health_condition)
    resources = models.FloatField(min=0)
    resources_overflow = models.FloatField(min=0)

    use_toilet = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    small_cleaning = models.BooleanField(
        widget=widgets.RadioSelectHorizontal())

    big_clean = models.BooleanField(widget=widgets.RadioSelectHorizontal())
Example #8
0
class Player(BasePlayer):

    riskchoice1 = models.CharField(max_length=50,
                                   choices=sorted(Constants.loteries1),
                                   widget=widgets.RadioSelectHorizontal())
    riskchoice2 = models.CharField(max_length=50,
                                   choices=sorted(Constants.loteries2),
                                   widget=widgets.RadioSelectHorizontal())
    riskchoice3 = models.CharField(max_length=50,
                                   choices=sorted(Constants.loteries3),
                                   widget=widgets.RadioSelectHorizontal())
    riskchoice4 = models.CharField(max_length=50,
                                   choices=sorted(Constants.loteries4),
                                   widget=widgets.RadioSelectHorizontal())

    selected_puzzle = models.IntegerField(choices=[1, 2, 3, 4])
    wining_range = models.JSONField(default=None)
    roll = models.IntegerField()

    def get_wining_range(self):
        if not self.wining_range:
            if self.selected_puzzle in (1, 2):
                self.wining_range = [1, 5]
            elif self.selected_puzzle in (3, 4):
                self.wining_range = random.choice(Constants.random_ranges)
        return self.wining_range

    def get_selected_puzzle(self):
        initial_payoff = 0 if self.selected_puzzle in (1, 3) else 10
        if self.selected_puzzle == 1:
            return 1, self.riskchoice1, Constants.loteries1, self.get_wining_range(
            ), initial_payoff
        if self.selected_puzzle == 2:
            return 2, self.riskchoice2, Constants.loteries2, self.get_wining_range(
            ), initial_payoff
        if self.selected_puzzle == 3:
            return 3, self.riskchoice3, Constants.loteries3, self.get_wining_range(
            ), initial_payoff
        return 4, self.riskchoice4, Constants.loteries4, self.get_wining_range(
        ), initial_payoff

    def set_payoff(self):
        self.selected_puzzle = random.randint(1, 4)
        sp, choice, loteries, wrange, initial_payoff = self.get_selected_puzzle(
        )
        lotery = loteries[choice]
        self.roll = random.randint(1, 10)
        if self.roll <= wrange[-1]:
            self.payoff = initial_payoff + lotery[0]
        else:
            self.payoff = initial_payoff + lotery[1]
Example #9
0
class Player(BasePlayer):

    q3_second_game_surprised = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))
    q3_second_game_satisfied = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))
    q3_second_game_upset = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))

    q3_help_each_other_in_the_second_game = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))
    q3_team_spirit = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))
    q3_recommendations_of_actions_to_maximize_everyones_resources = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))

    q3_i_follow_recommendations_of_action_followed = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))
    q3_i_follow_recommendations_of_action_my_advantage = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))

    q3_others_follow_recommendations_of_action_followed = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))
    q3_others_follow_recommendations_of_action_their_advantage = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))

    q3_yopinion_if_they_followed_would_everyone_max_his_resources = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))

    q3_second_game_different_and_is_it_because_of_the_communication = models.TextField(
    )
    q3_the_best_strategy_to_optimize_everyones_resources = models.TextField()

    q3_gender = models.CharField(choices=["Male", "Female"],
                                 widget=widgets.RadioSelectHorizontal())
    q3_birthday = models.DateField(widget=widgets.Input())

    q3_main_subject_in_university = models.TextField()
    q3_already_take_part_in_a_problem_solving = models.BooleanField(
        widget=widgets.RadioSelectHorizontal())

    q3_experiment_itself_was_interessting = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))
    q3_were_you_personally_engaged_achieving_good_results = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))
    q3_dificult_understanding_and_solving_the_problem = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))
    q3_was_it_obvious_what_to_do = models.PositiveIntegerField(
        min=1, max=5, widget=widgets.SliderInput(show_value=False))
    q3_short_feedback = models.TextField()
Example #10
0
class Player(otree.models.BasePlayer):

    # <built-in>
    group = models.ForeignKey(Group, null=True)
    subsession = models.ForeignKey(Subsession)
    # </built-in>

    request_amount = models.PositiveIntegerField(
        doc="""
        Amount requested by this player.
        """,
        verbose_name='Please enter a number from 0 to 100')
    training_amount_mine = models.PositiveIntegerField(
        verbose_name='You would get')
    training_amount_other = models.PositiveIntegerField(
        verbose_name='The other participant would get')
    points = models.PositiveIntegerField()
    feedback = models.PositiveIntegerField(
        choices=((5, 'Very well'), (4, 'Well'), (3, 'OK'), (2, 'Badly'),
                 (1, 'Very badly')),
        widget=widgets.RadioSelectHorizontal(),
        verbose_name='')

    def request_amount_error_message(self, value):
        if not 0 <= value <= Constants.amount_shared:
            return 'Your entry is invalid.'

    def other_player(self):
        """Returns the opponent of the current player"""
        return self.get_others_in_group()[0]
Example #11
0
class Player(BasePlayer):
    # seller
    price = models.CurrencyField(
        min=0,
        max=Constants.INITIAL,
        verbose_name='Please indicate a price (from 0 to %i) you want to sell'
        % Constants.INITIAL)

    quality = models.CurrencyField(
        choices=[(30, 'High'), (20, 'Medium'), (10, 'Low')],
        verbose_name='Please select a quality grade you want to produce',
        widget=widgets.RadioSelectHorizontal())

    # buyer
    choice = models.PositiveIntegerField(
        choices=[(i, 'Buy from seller %i' % i)
                 for i in range(1, Constants.players_per_group)] +
        [(0, 'Buy nothing')],
        blank=True,
        widget=widgets.RadioSelect(),
        verbose_name='And you will')  # seller index

    def role(self):
        if self.id_in_group == 1:
            return 'buyer'
        return 'seller %i' % (self.id_in_group - 1)
Example #12
0
class Player(otree.models.BasePlayer):

    # <built-in>
    group = models.ForeignKey(Group, null=True)
    subsession = models.ForeignKey(Subsession)
    # </built-in>

    contribution = models.PositiveIntegerField(
        default=None,
        doc="""The amount contributed by the player""",
        widget=widgets.TextInput())

    points = models.PositiveIntegerField(null=True)

    question = models.PositiveIntegerField(null=True,
                                           verbose_name='',
                                           widget=widgets.TextInput())
    feedbackq = models.CharField(
        null=True,
        verbose_name='How well do you think this sample game was implemented?',
        widget=widgets.RadioSelectHorizontal())

    def feedbackq_choices(self):
        return ['Very well', 'Well', 'OK', 'Badly', 'Very badly']

    def question_correct(self):
        return self.question == self.subsession.question_correct

    def contribution_error_message(self, value):
        if not 0 <= value <= self.subsession.endowment:
            return 'Your entry is invalid.'
Example #13
0
class Player(otree.models.BasePlayer):
    # <built-in>
    subsession = models.ForeignKey(Subsession)
    group = models.ForeignKey(Group, null=True)
    # </built-in>

    feedback = models.CharField(
        choices=Constants.feedback_choices,
        widget=widgets.RadioSelectHorizontal(),
    )
Example #14
0
class Player(BasePlayer):

    skewchoice1 = models.CharField(max_length=50,
                                   choices=sorted(Constants.skewchoices1),
                                   widget=widgets.RadioSelectHorizontal())
    skewchoice2 = models.CharField(max_length=50,
                                   choices=sorted(Constants.skewchoices2),
                                   widget=widgets.RadioSelectHorizontal(),
                                   null=True,
                                   blank=True)
    skewchoice3 = models.CharField(max_length=50,
                                   choices=sorted(Constants.skewchoices3),
                                   widget=widgets.RadioSelectHorizontal(),
                                   null=True,
                                   blank=True)

    winning_choice = models.IntegerField()

    def selected_skew(self):
        if self.skewchoice3:
            return 3, self.skewchoice3, Constants.skewchoices3[
                self.skewchoice3]
        if self.skewchoice2:
            return 2, self.skewchoice2, Constants.skewchoices2[
                self.skewchoice2]
        return 1, self.skewchoice1, Constants.skewchoices1[self.skewchoice1]

    def set_payoff(self):
        snum, soption, choices = self.selected_skew()

        sample = []
        for idx, e in enumerate(Constants.pie_data):
            sample.extend([idx] * e)

        self.winning_choice = random.choice(sample)
        self.payoff = choices[self.winning_choice]
Example #15
0
class Player(otree.models.BasePlayer):
    BONUS = 10

    # <built-in>
    group = models.ForeignKey(Group, null=True)
    subsession = models.ForeignKey(Subsession)
    # </built-in>

    training_answer_mine = models.PositiveIntegerField(
        null=True, verbose_name='My compensation would be')
    training_answer_others = models.PositiveIntegerField(
        null=True, verbose_name="The other traveler's compensation would be")

    # claim by player
    claim = models.PositiveIntegerField(
        doc="""
        Each player's claim
        """,
        verbose_name='Please enter a number from 2 to 100'
    )
    feedback = models.PositiveIntegerField(
        choices=(
            (5, 'Very well'),
            (4, 'Well'),
            (3, 'OK'),
            (2, 'Badly'),
            (1, 'Very badly')), widget=widgets.RadioSelectHorizontal(),
        verbose_name='')

    def claim_error_message(self, value):
        if not Constants.min_amount\
                <= value <= Constants.max_amount:
            return 'Your entry is invalid.'

    def other_player(self):
        return self.get_others_in_group()[0]

    def set_payoff(self):
        other = self.other_player().claim
        if self.claim < other:
            self.payoff = self.BONUS + self.claim + Constants.reward
        elif self.claim > other:
            self.payoff = self.BONUS + other - Constants.penalty
        else:
            self.payoff = self.BONUS + self.claim
Example #16
0
class Player(BasePlayer):
    points = models.IntegerField(default=0)

    CHOICES = [("one", ""), ("two", ""), ("three", ""), ("four", ""), ("five", ""), ("six", "")]
    CHOICES_8 = [("one", ""), ("two", ""), ("three", ""), ("four", ""),
                 ("five", ""), ("six", ""), ("seven", ""), ("eight", "")]

    raven_1 = models.CharField(widget=widgets.RadioSelectHorizontal(), choices=CHOICES)
    raven_2 = models.CharField(widget=widgets.RadioSelectHorizontal(), choices=CHOICES_8)
    raven_3 = models.CharField(widget=widgets.RadioSelectHorizontal(), choices=CHOICES)
    raven_4 = models.CharField(widget=widgets.RadioSelectHorizontal(), choices=CHOICES)
    raven_5 = models.CharField(widget=widgets.RadioSelectHorizontal(), choices=CHOICES_8)
    raven_6 = models.CharField(widget=widgets.RadioSelectHorizontal(), choices=CHOICES_8)
Example #17
0
class Player(otree.models.BasePlayer):

    # <built-in>
    group = models.ForeignKey(Group, null=True)
    subsession = models.ForeignKey(Subsession)
    # </built-in>
    training_answer_x = models.PositiveIntegerField(
        null=True, verbose_name='Participant A would have')
    training_answer_y = models.PositiveIntegerField(
        null=True, verbose_name='Participant B would have')
    points = models.PositiveIntegerField()
    feedback = models.PositiveIntegerField(
        choices=((5, 'Very well'), (4, 'Well'), (3, 'OK'), (2, 'Badly'),
                 (1, 'Very badly')),
        widget=widgets.RadioSelectHorizontal(),
        verbose_name='')

    def role(self):
        return {1: 'A', 2: 'B'}[self.id_in_group]
Example #18
0
class Player(otree.models.BasePlayer):

    # <built-in>
    group = models.ForeignKey(Group, null=True)
    subsession = models.ForeignKey(Subsession)
    # </built-in>

    # training
    training_buyer_earnings = models.CurrencyField(
        verbose_name="Buyer's period payoff would be")

    training_seller1_earnings = models.CurrencyField(
        verbose_name="Seller 1's period payoff would be")

    training_seller2_earnings = models.CurrencyField(
        verbose_name="Seller 2's period payoff would be")

    # seller
    price = models.CurrencyField(
        min=0, max=Constants.INITIAL,
        verbose_name='Please indicate a price (from 0 to %i) you want to sell'
        % Constants.INITIAL)

    quality = models.CurrencyField(choices=[
        (30, 'High'),
        (20, 'Medium'),
        (10, 'Low')],
        verbose_name='Please select a quality grade you want to produce',
        widget=widgets.RadioSelectHorizontal())

    # buyer
    choice = models.PositiveIntegerField(
        choices=[(i, 'Buy from seller %i' % i) for i in
                 range(1, Constants.players_per_group)] + [(0, 'Buy nothing')],
        blank=True,
        widget=widgets.RadioSelect(),
        verbose_name='And you will')  # seller index

    def role(self):
        if self.id_in_group == 1:
            return 'buyer'
        return 'seller %i' % (self.id_in_group - 1)
Example #19
0
class Player(BasePlayer):
    firstname = models.CharField(initial=None,
                                 verbose_name='Prénom')
    surname = models.CharField(initial=None,
                               verbose_name='Nom')
    sex = models.CharField(initial=None,
                           choices=[('Masculin'), ('Féminin')],
                           verbose_name='Sexe',
                           widget=widgets.RadioSelectHorizontal())
    school = models.CharField(initial=None,
                              verbose_name='Etablissement')


    def save_data_in_dictionary(self):
        self.participant.vars['firstname'] = self.firstname
        self.participant.vars['surname'] = self.surname
        self.participant.vars['sex'] = self.sex
        self.participant.vars['school'] = self.school


    def role(self):
        return {1: 'Experimenter', 2: 'Player'}[self.id_in_group]
Example #20
0
class Player(otree.models.BasePlayer):

    risk_points = models.DecimalField(max_digits=12, decimal_places=2)

    GAMBLES = (
        ('1', "Gamble 1"),
        ('2', "Gamble 2"),
        ('3', "Gamble 3"),
        ('4', "Gamble 4"),
        ('5', "Gamble 5"),
    )

    URNS = (
        ('0', "Black: ? |  White: ?"),
        ('1', "Black:50% | White:50%"),
    )

    COLORS = (
        ('0', "Black"),
        ('1', "White"),
    )

    risk_flip = models.IntegerField(
        doc="The flip chosen by the computer. 0:Heads 1: Tails")

    risk_choice = models.CharField(
        initial=None,
        choices=GAMBLES,
        verbose_name="Choose the gamble you to play",
        doc=
        "The coinflip gamble the subject wants to play.  Variable takes value 1,...,5 which correspond to     Gamble 1, ..., Gamble 5."
    )
    risk_payoff = models.DecimalField(max_digits=12, decimal_places=2)

    amb_chosen_game = models.CharField(
        doc="The game randomly choosen by the computer among the ten available."
    )
    amb_chosen_ball = models.CharField(
        doc="The ball chosen by the computer; 0: Black,1: White")
    amb_payoff = models.DecimalField(max_digits=12, decimal_places=2)
    amb_points = models.DecimalField(max_digits=12, decimal_places=2)

    amb_choice1_urn = models.CharField(
        initial=None,
        choices=URNS,
    )
    amb_choice1_color = models.CharField(
        initial=None,
        choices=COLORS,
        widget=widgets.RadioSelectHorizontal(),
        verbose_name="")

    amb_choice2_urn = models.CharField(
        initial=None,
        choices=URNS,
    )
    amb_choice2_color = models.CharField(
        initial=None,
        choices=COLORS,
        widget=widgets.RadioSelectHorizontal(),
        verbose_name="")

    amb_choice3_urn = models.CharField(
        initial=None,
        choices=URNS,
    )
    amb_choice3_color = models.CharField(
        initial=None,
        choices=COLORS,
        widget=widgets.RadioSelectHorizontal(),
        verbose_name="")

    amb_choice4_urn = models.CharField(
        initial=None,
        choices=URNS,
    )
    amb_choice4_color = models.CharField(
        initial=None,
        choices=COLORS,
        widget=widgets.RadioSelectHorizontal(),
        verbose_name="")

    amb_choice5_urn = models.CharField(
        initial=None,
        choices=URNS,
    )
    amb_choice5_color = models.CharField(
        initial=None,
        choices=COLORS,
        widget=widgets.RadioSelectHorizontal(),
        verbose_name="")

    amb_choice6_urn = models.CharField(
        initial=None,
        choices=URNS,
    )
    amb_choice6_color = models.CharField(
        initial=None,
        choices=COLORS,
        widget=widgets.RadioSelectHorizontal(),
        verbose_name="")

    amb_choice7_urn = models.CharField(
        initial=None,
        choices=URNS,
    )
    amb_choice7_color = models.CharField(
        initial=None,
        choices=COLORS,
        widget=widgets.RadioSelectHorizontal(),
        verbose_name="")

    amb_choice8_urn = models.CharField(
        initial=None,
        choices=URNS,
    )
    amb_choice8_color = models.CharField(
        initial=None,
        choices=COLORS,
        widget=widgets.RadioSelectHorizontal(),
        verbose_name="")

    amb_choice9_urn = models.CharField(
        initial=None,
        choices=URNS,
    )
    amb_choice9_color = models.CharField(
        initial=None,
        choices=COLORS,
        widget=widgets.RadioSelectHorizontal(),
        verbose_name="")

    amb_choice10_urn = models.CharField(
        initial=None,
        choices=URNS,
    )
    amb_choice10_color = models.CharField(
        initial=None,
        choices=COLORS,
        widget=widgets.RadioSelectHorizontal(),
        verbose_name="")

    def get_chosen_urn(self):
        urn = getattr(self, "amb_choice{}_urn".format(self.amb_chosen_game))
        if urn == "0":
            u = "Black: ? | White: ?"
        else:
            u = "Black: 50% | White: 50%"
        return u

    def get_chosen_color(self):
        color = getattr(self,
                        "amb_choice{}_color".format(self.amb_chosen_game))
        if color == "0":
            c = "Black"
        else:
            c = "White"
        return c

    def get_drawn_color(self):
        if self.amb_chosen_ball == "0":
            color = "Black"
        else:
            color = "White"
        return color

    def set_amb_payoffs(self):
        self.amb_chosen_game = random.choice(range(1, 11))
        gamble = Constants.URNDICT[str(self.amb_chosen_game)]
        urn = getattr(self, "amb_choice{}_urn".format(self.amb_chosen_game))
        color = getattr(self,
                        "amb_choice{}_color".format(self.amb_chosen_game))
        self.amb_chosen_ball = random.choice(Constants.URNS[str(urn)])
        if self.amb_chosen_ball == color:
            self.amb_points = gamble[int(urn)]
            self.amb_payoff = self.amb_points * self.session.real_world_currency_per_point
        else:
            self.amb_points = 0
            self.amb_payoff = 0
        self.participant.vars['amb_points'] = self.amb_points
        self.participant.vars['amb_payoff'] = self.amb_payoff

    def set_risk_payoffs(self):

        flip = random.choice([0, 1])
        self.risk_flip = flip
        result = Constants.RISKDICT[self.risk_choice]
        self.risk_points = result[flip]
        self.risk_payoff = Decimal(
            result[flip]) * self.session.real_world_currency_per_point
        self.participant.vars['risk_points'] = self.risk_points
        self.participant.vars['risk_payoff'] = self.risk_payoff

    def set_payoffs(self):
        self.payoff = sum([self.risk_payoff, self.amb_payoff])

    def flipcoin(self):
        result = random.choice([0, 1])
        self.risk_flip = result

    def get_form_fields(self):
        form_fields = []
        for x in range(1, len(Constants.URNDICT) + 1):
            form_fields.append("amb_choice{}_urn".format(x))
            form_fields.append("amb_choice{}_color".format(x))
        return form_fields
Example #21
0
class Group(otree.models.BaseGroup):

    subsession = models.ForeignKey(Subsession)

    strategy = models.BooleanField(
        doc="""Whether this group uses strategy method""")

    amount_offered = models.CurrencyField(choices=Constants.offer_choices)

    offer_accepted = models.BooleanField(
        doc="if offered amount is accepted (direct response method)")

    response_0 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_10 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_20 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_30 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_40 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_50 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_60 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_70 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_80 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_90 = models.BooleanField(widget=widgets.RadioSelectHorizontal())
    response_100 = models.BooleanField(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
Example #22
0
class Player(BasePlayer):
    q3_second_game_results_surprised = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_second_game_results_satisfied = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_second_game_results_upset = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))

    q3_second_game_teamwork = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_second_game_teamspirit = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_communication_inputs_maxresources_how_useful = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_followed_communication_inputs = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_took_advantage_communication_inputs = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_majority_followed_communication_inputs = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_majority_took_advantage_communication_inputs = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_minority_followed_communication_inputs = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_minority_took_advantage_communication_inputs = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_how_max_resources_communication_inputs_if_followed = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_after_second_round_like_others = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_second_round_impressions = models.TextField()
    q3_best_strategy_to_max_resources = models.TextField()
    q3_gender = models.CharField(choices=["M", "F"],
                                 widget=widgets.RadioSelectHorizontal())
    q3_birthday = models.DateField(widget=widgets.Input())
    q3_main_subject_in_university = models.TextField()
    q3_already_take_part_in_a_problem_solving = models.CharField(
        max_length=255, widget=widgets.RadioSelect(), choices=['Ja', 'Nein'])
    q3_already_took_part_x_times_for_x_months = models.TextField(
        default='X Male und das letzte Mal vor X Monaten.')
    q3_experiment_itself_was_interessting = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_were_you_personally_engaged_achieving_good_results = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_dificult_understanding_and_solving_the_problem = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_was_it_obvious_what_to_do = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_count_unclear_questions = models.TextField()
    q3_unclear_questions_description = models.TextField()
    q3_technical_issues = models.CharField(max_length=255,
                                           widget=widgets.RadioSelect(),
                                           choices=['Ja', 'Nein'])
    q3_technical_issues_details = models.TextField()
    q3_opinion_about_questions_and_hypotheses = models.TextField()

    # confidant

    q3_confidant_second_game_teamwork = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_confidant_second_game_teamspirit = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_confidant_majority_followed_communication_inputs = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_confidant_majority_took_advantage_communication_inputs = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_confidant_minority_followed_communication_inputs = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_confidant_minority_took_advantage_communication_inputs = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_confidant_best_strategy_to_max_resources = models.TextField()
    q3_confidant_gender = models.CharField(
        choices=["M", "F"], widget=widgets.RadioSelectHorizontal())
    q3_confidant_birthday = models.DateField(widget=widgets.Input())
    q3_confidant_main_subject_in_university = models.TextField()
    q3_confidant_already_take_part_in_a_problem_solving = models.CharField(
        max_length=255, widget=widgets.RadioSelect(), choices=['Ja', 'Nein'])
    q3_confidant_already_took_part_x_times_for_x_months = models.TextField(
        default='X Male und das letzte Mal vor X Monaten.')
    q3_confidant_experiment_itself_was_interessting = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_confidant_were_you_personally_engaged_achieving_good_results = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_confidant_dificult_understanding_and_solving_the_problem = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_confidant_was_it_obvious_what_to_do = models.PositiveIntegerField(
        min=1, max=10, widget=widgets.SliderInput(show_value=False))
    q3_confidant_count_unclear_questions = models.TextField()
    q3_confidant_unclear_questions_description = models.TextField()
    q3_confidant_technical_issues = models.CharField(
        max_length=255, widget=widgets.RadioSelect(), choices=['Ja', 'Nein'])
    q3_confidant_technical_issues_details = models.TextField()
Example #23
0
class Player(otree.models.BasePlayer):

    # <built-in>
    group = models.ForeignKey(Group, null=True)
    subsession = models.ForeignKey(Subsession)
    # </built-in>

    player_name = models.CharField(max_length=255)
    avatar = models.CharField(max_length=255)

    genero = models.CharField(
        max_length=30, widget=widgets.RadioSelectHorizontal(),
        choices=[Constants.hombre, Constants.mujer], verbose_name="Seleccióne su género")

    # bloque 1
    block_1_last_question_clicked = models.IntegerField(default=0, widget=widgets.HiddenInput())

    satisfecho_con_la_vida = models.PositiveIntegerField(
        verbose_name=(
            "En una escala del 1 al 10, donde 1 es nada satisfecho y 10 "
            "totalmente satisfecho, en general ¿qué tan satisfecha(o) se "
            "encuentra usted con su vida? Usted puede escoger cualquier "
            "número entre 1 y 10."), choices=range(1,11),
            widget=widgets.RadioSelectHorizontal(), default=1)

    cuartos_en_el_hogar = models.PositiveIntegerField(
        widget=widgets.SliderInput(), max=20,
        verbose_name=("¿Cuántos cuartos hay en su hogar sin contar pasillos, ni baños?"), min=1, default=1)

    cuantos_cuartos_se_usan_para_dormir = models.PositiveIntegerField(
        widget=widgets.SliderInput(), max=20,
        verbose_name=("Y de esos cuartos, ¿cuántos usan para dormir?"), min=1, default=1)

    habitantes = models.PositiveIntegerField(
        widget=widgets.SliderInput(), max=20,
        verbose_name=("¿Cuántas personas viven en su hogar contando ancianos y niños?"), min=1, default=1)

    focos = models.PositiveIntegerField(
        widget=widgets.SliderInput(), max=50,
        verbose_name=(
            "Contando todos los focos que utiliza para iluminar su hogar, "
            "incluyendo los de techos, paredes y lámparas de buró o piso, "
            "dígame, ¿Cuántos focos tiene en su vivienda?"), min=1, default=1)

    con_quien_vive = models.CharField(
        verbose_name=("¿Con quién vive actualmente?"), max_length=255, default="---",
        choices=["---", "Solo", "Con una pareja", "Con amigos", "Con esposo(a)", "Con familia", "Otro"])

    cuenta_con_automovil = models.BooleanField(
        verbose_name=("Automóvil propio excluyendo taxis"),
        widget=widgets.RadioSelectHorizontal(), default=False)
    cuantos_automovil = models.PositiveIntegerField(default=0)

    cuenta_con_televisor = models.BooleanField(
        verbose_name=("Televisor"),
        widget=widgets.RadioSelectHorizontal(), default=False)
    cuantos_televisor = models.PositiveIntegerField(default=0)

    cuenta_con_celular = models.BooleanField(
        verbose_name=("Teléfono Celular"),
        widget=widgets.RadioSelectHorizontal(), default=False)
    cuantos_celular = models.PositiveIntegerField(default=0)

    cuenta_con_computadora = models.BooleanField(
        verbose_name=("Computadora de escritorio o portátil"),
        widget=widgets.RadioSelectHorizontal(), default=False)
    cuantos_computadora = models.PositiveIntegerField(default=0)

    cuenta_con_bano = models.BooleanField(
        verbose_name=("Baño completo con regadera y excusado para uso exclusivo del hogar"),
        widget=widgets.RadioSelectHorizontal(), default=False)
    cuantos_bano = models.PositiveIntegerField(default=0)

    cuenta_con_servidumbre = models.BooleanField(
        verbose_name=("Personas de servicio doméstico como limpieza, jardinero o chofer"),
        widget=widgets.RadioSelectHorizontal(), default=False)
    cuantos_servidumbre = models.PositiveIntegerField(default=0)

    tarjeta_de_credito = models.BooleanField(
        verbose_name=("Cuenta usted con tarjeta de crédito"),
        widget=widgets.RadioSelectHorizontal(), default=False)

    altura = models.FloatField(
        verbose_name=("Aproximadamente, ¿qué estatura tiene usted? (en metros)"),
        min=0, widget=widgets.SliderInput(attrs={'step': '0.01', 'max': '2.5'}), default=0)

    peso = models.PositiveIntegerField(
        verbose_name=("Aproximadamente, ¿qué peso tiene usted? (en kilogramos)"),
        min=0, max=200, widget=widgets.SliderInput(), default=0)

    ejercicio_fisico = models.BooleanField(
        verbose_name=("Durante las últimas dos semanas, ¿ha realizado usted ejercicio físico fuera del trabajo?"),
        widget=widgets.RadioSelectHorizontal(), default=False)

    cigarrillo = models.BooleanField(
        verbose_name=("Durante las últimas dos semanas, ¿ha fumado algún cigarrillo o puro?"),
        widget=widgets.RadioSelectHorizontal(), default=False)

    vive_con_padre = models.BooleanField(
        widget=widgets.RadioSelectHorizontal(), default=False)
    vive_con_madre = models.BooleanField(
        widget=widgets.RadioSelectHorizontal(), default=False)

    edad_padre = models.PositiveIntegerField(
        choices=range(30, 101), default=30)
    edad_madre = models.PositiveIntegerField(
        choices=range(30, 101), default=30)

    padre_habla_dialecto_indigena = models.BooleanField(
        widget=widgets.RadioSelectHorizontal(), default=False)
    madre_habla_dialecto_indigena = models.BooleanField(
        widget=widgets.RadioSelectHorizontal(), default=False)

    padre_habla_lengua_extranjera = models.BooleanField(
        widget=widgets.RadioSelectHorizontal(), default=False)
    madre_habla_lengua_extranjera = models.BooleanField(
        widget=widgets.RadioSelectHorizontal(), default=False)

    nivel_educacion_padre = models.CharField(
        choices=["---", "Primaria", "Secundaria", "Preparatoria", "Universitario"],
        max_length=50, default="---")
    nivel_educacion_madre = models.CharField(
        choices=["---", "Primaria", "Secundaria", "Preparatoria", "Universitario"],
        max_length=50, default="---")

    # bloque 2
    block_2_last_question_clicked = models.IntegerField(default=0, widget=widgets.HiddenInput())

    riqueza_hogar_14_anios = models.PositiveIntegerField(
        widget=widgets.RadioSelectHorizontal(),
        verbose_name=(
            "Comparando el hogar donde vivía a los 14 años con todos los "
            "hogares actuales de México y usando una escala de 1 a 10, en la "
            "que 1 son los hogares más pobres y 10 son los más ricos, ¿dónde "
            "pondría usted su hogar de ese entonces?"),
        choices=range(1, 11), default=1)

    TRABAJOS = ("---", "Patrón o empleador ", "Trabajador por cuenta propia ",
            "Empleado u obrero del sector público",
            "Empleado u obrero del sector privado", "Servicio Doméstico (por pago)",
            "Quehaceres del hogar (sin pago) ", "Trabajador sin pago ",
            "Fuerzas armadas y del orden")

    padre_trabajaba_14_anios = models.BooleanField(widget=widgets.RadioSelectHorizontal(), default=False)
    madre_trabajaba_14_anios = models.BooleanField(widget=widgets.RadioSelectHorizontal(), default=False)
    padre_ocupacion_14_anios = models.CharField(max_length=255, choices=TRABAJOS, default=TRABAJOS[0])
    madre_ocupacion_14_anios = models.CharField(max_length=255, choices=TRABAJOS, default=TRABAJOS[0])
    padre_trabajo_servicios_medicos_14_anios = models.BooleanField(widget=widgets.RadioSelectHorizontal(), default=False)
    madre_trabajo_servicios_medicos_14_anios = models.BooleanField(widget=widgets.RadioSelectHorizontal(), default=False)

    CON_QUIEN_VIVIA = (
        "---", "Solo con el padre", "Solo con la madre",
        "Con ambos, padre y madre", "Con otra familia", "Otra persona")
    con_quien_vivia_14_anios = models.CharField(
        verbose_name=("Cuando usted tenía alrededor de 14 años ¿con quién vivía?"),
        choices=CON_QUIEN_VIVIA, default=CON_QUIEN_VIVIA[0], max_length=255)

    MUCHO_REGULAR_POCO_NADA = ["---", "Mucho", "Regular", "Poco", "Nada"]
    padre_emocionalmente_cerano_14_anios = models.CharField(
        max_length=20, choices=MUCHO_REGULAR_POCO_NADA, default=MUCHO_REGULAR_POCO_NADA[0])
    madre_emocionalmente_cerano_14_anios = models.CharField(
        max_length=20, choices=MUCHO_REGULAR_POCO_NADA, default=MUCHO_REGULAR_POCO_NADA[0])
    padre_entendia_problemas_14_anios = models.CharField(
        max_length=20, choices=MUCHO_REGULAR_POCO_NADA, default=MUCHO_REGULAR_POCO_NADA[0])
    madre_entendia_problemas_14_anios = models.CharField(
        max_length=20, choices=MUCHO_REGULAR_POCO_NADA, default=MUCHO_REGULAR_POCO_NADA[0])
    padre_actividades_escolares_14_anios = models.CharField(
        max_length=20, choices=MUCHO_REGULAR_POCO_NADA, default=MUCHO_REGULAR_POCO_NADA[0])
    madre_actividades_escolares_14_anios = models.CharField(
        max_length=20, choices=MUCHO_REGULAR_POCO_NADA, default=MUCHO_REGULAR_POCO_NADA[0])
    padre_actividades_tiempo_libre_14_anios = models.CharField(
        max_length=20, choices=MUCHO_REGULAR_POCO_NADA, default=MUCHO_REGULAR_POCO_NADA[0])
    madre_actividades_tiempo_libre_14_anios = models.CharField(
        max_length=20, choices=MUCHO_REGULAR_POCO_NADA, default=MUCHO_REGULAR_POCO_NADA[0])
    padre_reglas_claras_14_anios = models.CharField(
        max_length=20, choices=MUCHO_REGULAR_POCO_NADA, default=MUCHO_REGULAR_POCO_NADA[0])
    madre_reglas_claras_14_anios = models.CharField(
        max_length=20, choices=MUCHO_REGULAR_POCO_NADA, default=MUCHO_REGULAR_POCO_NADA[0])

    relacion_padres_14_anios = models.CharField(
        verbose_name=("¿La relación entre sus padres generalmente era: excelente, buena, regular, mala o muy mala?"),
        max_length=20, default="---",
        choices=["---", "Excelente", "Buena", "Regular", "Mala", "Muy mala"])

    FAMILIA_FRECUENCIA = ("Siempre", "Frecuentemente", "Pocas veces", "Nunca", "Omitir")
    familia_frecuencia_insultos_14_anios = models.CharField(
        verbose_name=("¿Con qué frecuencia ocurrían INSULTOS, GRITOS o AMENAZAS en su familia?"),
        max_length=20, choices=FAMILIA_FRECUENCIA, default=FAMILIA_FRECUENCIA[-1])
    familia_frecuencia_cercania_14_anios = models.CharField(
        verbose_name=("¿Con qué frecuencia los miembros de su familia se sentían muy cercanos los unos de los otros?"),
        max_length=20, choices=FAMILIA_FRECUENCIA, default=FAMILIA_FRECUENCIA[-1])
    frequencia_miedos_14_anios = models.CharField(
        verbose_name=("¿Con qué frecuencia la/lo molestaban miedos o preocupaciones?"),
        max_length=20, choices=FAMILIA_FRECUENCIA, default=FAMILIA_FRECUENCIA[-1])

    madre_trabajo_por_ingreso_desde_que_nacio = models.BooleanField(
        verbose_name=("¿Su madre trabajo por un ingreso en algún momento desde que usted nació hasta el día de hoy?"),
        widget=widgets.RadioSelectHorizontal(), default=False)

    madre_trabajo_periodos_de_su_vida_0_4_anios = models.BooleanField(
        verbose_name=("0 a 4 años de edad"), widget=widgets.RadioSelectHorizontal(), default=False)

    madre_trabajo_periodos_de_su_vida_5_9_anios = models.BooleanField(
        verbose_name=("5 a 9 años de edad"), widget=widgets.RadioSelectHorizontal(), default=False)

    madre_trabajo_periodos_de_su_vida_10_14_anios = models.BooleanField(
        verbose_name=("10 a 14 años de edad"), widget=widgets.RadioSelectHorizontal(), default=False)

    madre_trabajo_periodos_de_su_vida_15_19_anios = models.BooleanField(
        verbose_name=("15 a 19 años de edad"), widget=widgets.RadioSelectHorizontal(), default=False)

    tiene_hermanos = models.BooleanField(
        verbose_name=("¿Tiene usted hermanos o hermanas?"),
        widget=widgets.RadioSelectHorizontal(), default=False)

    numero_de_hermano_que_es_usted = models.PositiveIntegerField(
        verbose_name=(
            "Ahora piense en sus hermanos ordenándolos del mayor al menor "
            "aunque hayan fallecido y dígame qué número de hermano es usted."),
        choices=range(1, 11), default=1, widget=widgets.RadioSelectHorizontal())

    HERMANOS_1_10 = ["---"] + [str(i) for i in range(1, 11)]
    hermanos_que_son = models.CharField(choices=HERMANOS_1_10, max_length=10, default=HERMANOS_1_10[0])
    hermanas_que_son = models.CharField(choices=HERMANOS_1_10, max_length=10, default=HERMANOS_1_10[0])
    hermanos_viven_con_usted_actualmente = models.CharField(choices=HERMANOS_1_10, max_length=10, default=HERMANOS_1_10[0])
    hermanas_viven_con_usted_actualmente = models.CharField(choices=HERMANOS_1_10, max_length=10, default=HERMANOS_1_10[0])
    hermanos_trabajan_por_pago_actualmente = models.CharField(choices=HERMANOS_1_10, max_length=10, default=HERMANOS_1_10[0])
    hermanas_trabajan_por_pago_actualmente = models.CharField(choices=HERMANOS_1_10, max_length=10, default=HERMANOS_1_10[0])

    espera_trabajar_remonerado_mayor_parte_de_su_vida = models.BooleanField(
        widget=widgets.RadioSelectHorizontal(),
        verbose_name=("¿Espera usted trabajar de forma remunerada la mayor parte de su vida?"), default=False)

    TRABAJO_FUTURO = [
        "---", "Asalariado", "Auto-empleado", "Dueño de negocio",
        "Dueño de empresa", "Ninguna de las anteriores"]
    de_que_manera_espera_trabajar = models.CharField(
        verbose_name="¿De qué manera espera trabajar?",
        choices=TRABAJO_FUTURO, max_length=100, default=TRABAJO_FUTURO[0])

    cuanto_cree_que_ganaria_en_30_anios = models.PositiveIntegerField(
        widget=widgets.SliderInput(), max=100000,
        verbose_name=(
            "Imagine que usted tiene 30 años el día de hoy y está trabajando "
            "de forma remunerada. ¿Cuánto cree que ganaría al mes por su trabajo?"), default=0)

    cree_que_tendra_hijo = models.CharField(
        verbose_name="Cree que usted tenga un hijo en algún momento de la vida?",
        choices=["---", "Si", "No", "Ya lo tuvo"], max_length=100, default="---")

    edad_de_primer_hijo = models.PositiveIntegerField(
        verbose_name=("¿A qué edad espera tener su primer hijo?"), choices=range(1, 100), default=0)

    edad_tuvo_primer_hijo = models.PositiveIntegerField(
        verbose_name=("¿A qué edad tuvo a su primer hijo?"), choices=range(1, 100), default=0)

    # BLOQUE 3
    block_3_last_question_clicked = models.IntegerField(default=0, widget=widgets.HiddenInput())

    RANGO_1_10 = range(1, 11)

    hogar_actual_vs_mexico = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Comparando su hogar actual con todos los hogares actuales de México y usando una escala de 1 a 10, en la que 1 son los hogares más pobres y 10 son los más ricos, ¿dónde pondría usted su hogar actual?"))

    cuanto_depende_de_usted_que_le_vaya_bien = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("En una escala del 1 al 10, donde 1 es “nada depende de usted” y 10 es “todo depende de usted”, ¿qué tanto depende de usted misma(o) que le vaya bien en este año y el próximo?"))

    gobierno_o_sociedad_pobreza = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0],
        widget=widgets.RadioSelectHorizontal(), verbose_name=("Pobreza"))
    gobierno_o_sociedad_delincuencia = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0],
        widget=widgets.RadioSelectHorizontal(), verbose_name=("Delincuencia"))
    gobierno_o_sociedad_narcotrafico = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0],
        widget=widgets.RadioSelectHorizontal(), verbose_name=("Narcotráfico"))
    gobierno_o_sociedad_corrupcion = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0],
        widget=widgets.RadioSelectHorizontal(), verbose_name=("Corrupción"))
    gobierno_o_sociedad_educacion = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0],
        widget=widgets.RadioSelectHorizontal(), verbose_name=("Mala o Poca Educación"))
    gobierno_o_sociedad_discriminacion = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0],
        widget=widgets.RadioSelectHorizontal(), verbose_name=("Discriminación"))
    gobierno_o_sociedad_adicciones_y_enfermedades = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0],
        widget=widgets.RadioSelectHorizontal(), verbose_name=("Atención de adicciones y enfermedades"))

    dispuesto_a_tomar_riesgos = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("En una escala del 1 al 10, donde 1 es nada dispuesto y 10 totalmente dispuesto, ¿qué tan dispuesto está a tomar riesgos?"))

    describe_como_persona_abstengo_hacer_cosas_hoy = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Me abstengo de cosas hoy para poder tener más mañana"))
    describe_como_persona_retrazo_cosas = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Tiendo a retrasar cosas aun cuando sería mejor hacerlas de una vez"))
    describe_como_persona_asumo_gente_tiene_mejores_intenciones = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Mientras no esté convencido de lo contrario, siempre asumo que la gente tiene las mejores intenciones"))
    describe_como_persona_no_entiendo_pelea_no_le_beneficia = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("No entiendo por qué alguna gente dedica su vida a pelear por una causa que no les beneficia directamente"))
    describe_como_persona_ayudo_al_que_me_ayudo = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Realizo un gran esfuerzo para ayudar a alguien que me ha ayudado antes"))
    describe_como_persona_me_vengo = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Si alguien me hace algo malo a propósito, trataré de regresárselo"))

    que_tan_impulsivo_se_considera = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("En una escala del 1 al 10, donde 1 es totalmente y 10 es nada, ¿qué tan impulsivo se considera?"))

    dispuesto_a_confiar = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Confiar en otras personas"))
    dispuesto_a_compartir = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Compartir algo con otras personas sin nada a cambio"))
    dispuesto_a_regresar_favor = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Regresar un favor a un extraño"))
    dispuesto_a_castigar = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Castigar a alguien debido a una conducta injusta aun cuando es costoso. Ej. Decirle a una persona que no tire basura en la calle aun cuando esa persona se puede enojar y decirle algo."))

    que_tan_paciente_se_considera = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("En una escala del 1 al 10, donde 1 es muy paciente y 10 es muy impaciente, ¿qué tan paciente o impaciente se considera? Usted puede escoger cualquier número entre 1 y 10."))

    acuerdo_con_educacion_genera_ingreso = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("El nivel educativo determina el nivel de ingreso de una persona"))
    acuerdo_con_hombres_mas_trabajo_que_mujeres = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Cuando no hay mucho trabajo, los hombres deberían de tener preferencia a un trabajo antes que las mujeres"))
    acuerdo_con_esposa_que_gana_mas_genera_dinero = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("La esposa que gana más dinero que el esposo genera problemas"))
    acuerdo_con_no_se_puede_confiar_en_nadie = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Hoy en día, no se puede confiar en nadie más"))
    acuerdo_con_camino_de_mi_vida = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("El camino de mi vida depende de mí"))
    acuerdo_con_he_logrado_lo_que_merezco = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("En comparación con otros, no he logrado lo que merezco"))
    acuerdo_con_logros_suerte = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Lo que se logra en la vida es principalmente una cuestión de destino o suerte"))
    acuerdo_con_otros_deciden_por_mi = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Frecuentemente tengo la sensación de que otros toman decisiones sobre mi vida"))
    acuerdo_con_puedo_influir_en_condicion_social = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Si uno es social o políticamente activo, se puede influir en las condiciones sociales"))
    acuerdo_con_trabajar_duro_exito = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Hay que trabajar duro para alcanzar el éxito"))
    acuerdo_con_dudo_de_mi_mismo = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Si enfrento dificultades en la vida, frecuentemente dudo de mí mismo"))
    acuerdo_con_oportunidades_dadas_por_condiciones_sociales = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Las oportunidades que tengo en la vida están determinadas por las condiciones sociales"))
    acuerdo_con_habilidades_mas_que_esfuerzo = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Las habilidades con las que nací son más importantes que todo el esfuerzo que yo pueda hacer"))
    acuerdo_con_poco_control_de_la_vida = models.PositiveIntegerField(
        choices=RANGO_1_10, default=RANGO_1_10[0], widget=widgets.RadioSelectHorizontal(),
        verbose_name=("Tengo poco control sobre las cosas que suceden en mi vida"))

    TOTALMENTE_MUCHO_REGULAR_POCO_NADA = ("---", "Totalmente", "Mucho", "Regular", "Poco", "Nada")
    que_tanto_es_es_reservado = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Es reservado(a)"))
    que_tanto_es_confiable = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Es generalmente confiable"))
    que_tanto_es_flojo = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Tiende a ser flojo(a)"))
    que_tanto_es_relajado = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Es relajado(a) o maneja bien el estrés"))
    que_tanto_es_artista = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Tiene intereses artísticos"))
    que_tanto_es_sociable = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Es extrovertido(a) o sociable"))
    que_tanto_es_falla_en_los_demas = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Tiende a encontrar fallas en los demás"))
    que_tanto_es_nervioso = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Se pone nervioso(a) fácilmente"))
    que_tanto_es_imaginador = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Tiene una imaginación activa"))

    que_tanto_lo_describe_ideas_me_distraen = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Algunas veces nuevas ideas y proyectos me distraen de mis proyectos e ideas anteriores"))
    que_tanto_lo_describe_contratiempos_desanima = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Los contratiempos no me desaniman"))
    que_tanto_lo_describe_persona_trabajadora = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Soy una persona muy trabajadora"))
    que_tanto_lo_describe_pierdo_interes = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Me obsesiono con ideas o proyectos por un tiempo, pero pierdo el interés rápidamente."))
    que_tanto_lo_describe_persigo_diferentes_metas = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Frecuentemente me pongo una meta pero más tarde persigo una diferente."))
    que_tanto_lo_describe_dificultades_para_concentracion = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Tengo dificultades para mantener mi concentración en proyectos que toman más de unos cuantos meses en completarse."))
    que_tanto_lo_describe_termino_lo_que_comienzo = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Termino todo lo que comienzo"))
    que_tanto_lo_describe_efuerzo_en_mi_trabajo = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Pongo mucho esfuerzo en los trabajos que realizo"))
    que_tanto_lo_describe_malos_habitos = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Me cuesta romper malos hábitos"))
    que_tanto_lo_describe_cosas_inapropiadas = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Frecuentemente digo cosas inapropiadas"))
    que_tanto_lo_describe_resisto_tentaciones = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Soy muy bueno para resistir tentaciones"))
    que_tanto_lo_describe_me_arrepiento = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Hago cosas que se sienten bien en el momento pero después me arrepiento de ellas"))
    que_tanto_lo_describe_hago_cosas_sin_pensar = models.CharField(
        choices=TOTALMENTE_MUCHO_REGULAR_POCO_NADA, default=TOTALMENTE_MUCHO_REGULAR_POCO_NADA[0],
        max_length=30, verbose_name=("Frecuentemente hago cosas sin pensar en todas las opciones"))

    apuesta_loteria_1000 = models.PositiveIntegerField(
        verbose_name=("Imagine un juego de lotería con diez boletos numerados del 1 al 10, cuyo premio al número ganador es de $1,000. ¿Cuánto estaría dispuesto a pagar por un boleto para participar en ella?"),
        min=0, max=1000, widget=widgets.SliderInput(), default=0)

    donar_1000 = models.PositiveIntegerField(
        verbose_name=("Imagine la siguiente situación: El día de hoy usted recibe inesperadamente $1,000. ¿Cuánto consideraría donar a una buena causa?"),
        min=0, max=1000, widget=widgets.SliderInput(), default=0)

    pagan_100_esperar_3_meses = models.PositiveIntegerField(
        min=1000, max=50000,  widget=widgets.SliderInput(),
        verbose_name=("¿Cuánto le tendrían que pagar dentro de tres meses para que pueda esperar este tiempo?"), default=0)
    que_tanto_lo_describe_1_anio = models.PositiveIntegerField(
        min=1000, max=50000,  widget=widgets.SliderInput(),
        verbose_name=("Y ahora, ¿cuánto le tendrían que pagar dentro de un año para que pueda esperar ese tiempo?"), default=0)

    # bloque 4
    block_4_last_question_clicked = models.IntegerField(default=0, widget=widgets.HiddenInput())

    # MUJERES
    mestruando = models.BooleanField(
        verbose_name="¿Se encuentra usted menstruando el día de hoy?", default=False, widget=widgets.RadioSelectHorizontal())

    fecha_ultima_regla = models.DateField(
        default=lambda: timezone.now().date(),
        verbose_name="Fecha de comienzo de última regla (si no recuerda con precisión, favor de indicar la fecha más próxima).")
    fecha_siguiente_regla = models.DateField(
        default=lambda: timezone.now().date(),
        verbose_name="Fecha esperada de comienzo de siguiente regla (si no puede calcular con precisión, favor de indicar la fecha más próxima independientemente de si usted es regular o irregular)")

    anticonceptivos = models.BooleanField(
        verbose_name="¿Utiliza pastillas anticonceptivas?", default=False, widget=widgets.RadioSelectHorizontal())

    duracion_del_sangrado = models.PositiveIntegerField(
        verbose_name=("¿Normalmente, cuántos días dura el sangrado?"),
        widget=widgets.SliderInput(), default=5, min=1, max=10)

    # HOMBRES
    trabaja_empresa_dependencia_publica = models.BooleanField(
        verbose_name="Actualmente se encuentra trabajando en alguna empresa o dependencia pública?",
        default=False, widget=widgets.RadioSelectHorizontal())

    fecha_busqueda_empleo = models.DateField(
        default=lambda: timezone.now().date(),
        verbose_name="Aproximadamente, cuando fue la última fecha en que buscó empleo?.")
    fecha_fin_de_estudios  = models.DateField(
        default=lambda: timezone.now().date(),
        verbose_name="Fecha en la que dio por terminados sus estudios?")

    discriminacion_laboral = models.BooleanField(
        verbose_name="Desde su perspectiva, alguna vez ha sido victima de discriminación laboral?",
        default=False, widget=widgets.RadioSelectHorizontal())

    que_tanto_presencio_discriminacion = models.PositiveIntegerField(
        verbose_name=("En una escala del 1 al 10, que tanto ha presenciado discriminación, para usted o algún compañero, en el campo laboral?"),
        widget=widgets.SliderInput(), default=5, min=1, max=10)


    # Bloque 5
    FIGURE_CHOICES_6 = ['---', '1', '2', '3', '4', '5', '6']

    fig1 = models.CharField(
        verbose_name="fig1.jpg",
        max_length=10, choices=FIGURE_CHOICES_6, default=FIGURE_CHOICES_6[0])
    fig2 = models.CharField(
        verbose_name="fig2.jpg",
        max_length=10, choices=FIGURE_CHOICES_6, default=FIGURE_CHOICES_6[0])
    fig3 = models.CharField(
        verbose_name="fig3.jpg",
        max_length=10, choices=FIGURE_CHOICES_6, default=FIGURE_CHOICES_6[0])
    fig4 = models.CharField(
        verbose_name="fig4.jpg",
        max_length=10, choices=FIGURE_CHOICES_6, default=FIGURE_CHOICES_6[0])

    FIGURE_CHOICES_8 = ['---', '1', '2', '3', '4', '5', '6', '7', '8']
    fig5 = models.CharField(
        verbose_name="fig5.jpg",
        max_length=10, choices=FIGURE_CHOICES_8, default=FIGURE_CHOICES_8[0])
    fig6 = models.CharField(
        verbose_name="fig6.jpg",
        max_length=10, choices=FIGURE_CHOICES_8, default=FIGURE_CHOICES_8[0])
    fig7 = models.CharField(
        verbose_name="fig7.jpg",
        max_length=10, choices=FIGURE_CHOICES_8, default=FIGURE_CHOICES_8[0])
    fig8 = models.CharField(
        verbose_name="fig8.jpg",
        max_length=10, choices=FIGURE_CHOICES_8, default=FIGURE_CHOICES_8[0])
    fig9 = models.CharField(
        verbose_name="fig9.jpg",
        max_length=10, choices=FIGURE_CHOICES_8, default=FIGURE_CHOICES_8[0])
    fig10 = models.CharField(
        verbose_name="fig10.jpg",
        max_length=10, choices=FIGURE_CHOICES_8, default=FIGURE_CHOICES_8[0])
Example #24
0
class Player(otree.models.BasePlayer):

    # <built-in>
    group = models.ForeignKey(Group, null=True)
    subsession = models.ForeignKey(Subsession)
    # </built-in>

    player_name = models.CharField(max_length=255)
    avatar = models.CharField(max_length=255)

    # section 1.1
    dispuesto_a_apostar = models.CurrencyField(
        default=0,
        choices=map(c, [
            0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80,
            85, 90, 95, 100
        ]))
    gano_apuesta = models.BooleanField()

    # section 1.2
    bolsa_o_25_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "25 ECUs con seguridad")])
    #~ gano_bolsa_o_25_con_seguridad = models.PositiveIntegerField()

    bolsa_o_30_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "30 ECUs con seguridad")])
    #~ gano_bolsa_o_30_con_seguridad = models.PositiveIntegerField()

    bolsa_o_35_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "35 ECUs con seguridad")])
    #~ gano_bolsa_o_35_con_seguridad = models.PositiveIntegerField()

    bolsa_o_40_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "40 ECUs con seguridad")])
    #~ gano_bolsa_o_40_con_seguridad = models.PositiveIntegerField()

    bolsa_o_45_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "45 ECUs con seguridad")])
    #~ gano_bolsa_o_45_con_seguridad = models.PositiveIntegerField()

    bolsa_o_50_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "50 ECUs con seguridad")])
    #~ gano_bolsa_o_50_con_seguridad = models.PositiveIntegerField()

    bolsa_o_55_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "55 ECUs con seguridad")])
    #~ gano_bolsa_o_55_con_seguridad = models.PositiveIntegerField()

    bolsa_o_60_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "60 ECUs con seguridad")])
    #~ gano_bolsa_o_60_con_seguridad = models.PositiveIntegerField()

    bolsa_o_65_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "65 ECUs con seguridad")])
    #~ gano_bolsa_o_65_con_seguridad = models.PositiveIntegerField()

    bolsa_o_70_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "70 ECUs con seguridad")])
    #~ gano_bolsa_o_70_con_seguridad = models.PositiveIntegerField()

    bolsa_o_75_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "75 ECUs con seguridad")])
    #~ gano_bolsa_o_75_con_seguridad = models.PositiveIntegerField()

    bolsa_o_80_con_seguridad = models.CharField(
        max_length=255,
        widget=widgets.RadioSelectHorizontal(),
        default="bolsa",
        choices=[("bolsa", "Seleccionar de la bolsa"),
                 ("seguridad", "80 ECUs con seguridad")])
    #~ gano_bolsa_o_80_con_seguridad = models.PositiveIntegerField()

    caso_seleccionado_para_12 = models.CharField(max_length=255)
    color_bola_al_azar = models.CharField(max_length=50,
                                          choices=["blanca", "roja"])

    def set_payoff_11(self):
        self.gano_apuesta = random.choice([True, False])
        if self.gano_apuesta:
            self.payoff += (self.dispuesto_a_apostar *
                            3) - self.dispuesto_a_apostar
        else:
            self.payoff -= self.dispuesto_a_apostar

    def set_payoff_12(self):
        caso_ecus = random.choice(
            [25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80])
        self.caso_seleccionado_para_12 = "bolsa_o_{}_con_seguridad".format(
            caso_ecus)
        seleccion = getattr(self, self.caso_seleccionado_para_12)
        if seleccion == "seguridad":
            self.payoff += caso_ecus
        else:
            self.color_bola_al_azar = random.choice(["roja", "blanca"])
            if self.color_bola_al_azar == "blanca":
                self.payoff += 100
Example #25
0
class Player(BasePlayer):

    contribution = models.CurrencyField(
        min=0,
        max=Constants.endowment,
        doc="""The amount contributed by the player""",
    )

    enter_emotion = models.CharField(blank=True)

    acceptance = models.CharField()

    accept = models.CharField(choices=['Yes', 'No'])

    gender = models.CharField(choices=['Male', 'Female', 'Other'])

    age = models.PositiveIntegerField()

    income = models.PositiveIntegerField()

    why = models.CharField()

    irritation = models.CharField(widget=widgets.RadioSelectHorizontal(),
                                  choices=['0', '1', '2', '3', '4', '5'])

    guilt = models.CharField(widget=widgets.RadioSelectHorizontal(),
                             choices=['0', '1', '2', '3', '4', '5'])

    confusion = models.CharField(widget=widgets.RadioSelectHorizontal(),
                                 choices=['0', '1', '2', '3', '4', '5'])

    admiration = models.CharField(widget=widgets.RadioSelectHorizontal(),
                                  choices=['0', '1', '2', '3', '4', '5'])

    empathy = models.CharField(widget=widgets.RadioSelectHorizontal(),
                               choices=['0', '1', '2', '3', '4', '5'])

    general_feeling = models.CharField(
        widget=widgets.RadioSelectHorizontal(),
        choices=['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5'])

    education = models.CharField(choices=[
        'Some Primary', 'Completed Primary', 'Some Secondary',
        'Completed Secondary', 'Some University', 'Completed University',
        'Masters', 'Doctorate'
    ])

    occupation = models.CharField()

    feedback = models.CharField(blank=True)

    question1 = models.CurrencyField()

    question2 = models.CurrencyField()

    question3 = models.CurrencyField()

    cumulative_total = models.CurrencyField()

    question1_truth = models.BooleanField(initial=False)

    question2_truth = models.BooleanField(initial=False)

    question3_truth = models.BooleanField(initial=False)

    def question_correct1(self):
        self.question1_truth = (self.question1 != Constants.question_correct)
        return self.question1_truth

    def question_correct2(self):
        self.question2_truth = (self.question2 != Constants.question_correct)
        return self.question2_truth

    def question_correct3(self):
        if (self.question3 != Constants.question_correct):
            self.question3_truth = False
        else:
            self.question3_truth = True
        return self.question3_truth

    def accept_payment(self):
        return self.accept == Constants.typical_response

    def cumulative_payoff(self):
        self.cumulative_total = sum([p.payoff for p in self.in_all_rounds()])
        return self.cumulative_total
Example #26
0
class Player(BasePlayer):
    sex = models.IntegerField(initial=None,
                              choices=[(1, 'Femme'), (0, 'Homme')],
                              verbose_name='Sexe',
                              widget=widgets.RadioSelect())
    sisters_brothers = models.IntegerField(
        initial=None,
        choices=[(1, 'Oui'), (0, 'Non')],
        verbose_name='Avez-vous des frères et soeurs',
        widget=widgets.RadioSelect())
    religion = models.IntegerField(initial=None,
                                   choices=[(0, 'Catholique'), (1, 'Juive'),
                                            (2, 'Musulmane'),
                                            (3, 'Protestante'),
                                            (4, 'Autres religions'),
                                            (5, 'Aucune')],
                                   verbose_name='Religion',
                                   widget=widgets.RadioSelect())
    religion_practice = models.IntegerField(
        initial='0',
        verbose_name=
        'Pratiquez-vous régulièrement votre religion ? (de 0: Jamais,'
        'à 5: Toujours)',
        widget=widgets.SliderInput(attrs={
            'step': '1',
            'min': '0',
            'max': '5'
        }))
    student = models.IntegerField(initial=None,
                                  choices=[(1, 'Oui'), (0, 'Non')],
                                  verbose_name='Etes-vous étudiant(e) ?',
                                  widget=widgets.RadioSelect())
    field_of_studies = models.IntegerField(
        initial=None,
        choices=[(0, 'Economie-Gestion'), (1, 'Droit'),
                 (2, 'Sciences politiques'), (3, 'Psychologie'),
                 (4, 'Autres sciences sociales'), (5, 'Mathématiques'),
                 (6, 'Sciences'), (7, 'Autres')],
        verbose_name=
        'Discipline étudiée (actuellement ou lorsque vous étiez étudiant(e)) ?',
        widget=widgets.RadioSelect())
    level_of_study = models.IntegerField(initial=None,
                                         choices=[
                                             (0, 'Licence'), (1, 'Master'),
                                             (2, 'Doctorat'), (3, 'Autres')
                                         ],
                                         verbose_name="Niveau d'études",
                                         widget=widgets.RadioSelect())
    couple = models.IntegerField(initial=None,
                                 choices=[(1, 'Oui'), (0, 'Non')],
                                 verbose_name='Etes-vous en couple ?',
                                 widget=widgets.RadioSelect())
    previous_participation = models.IntegerField(
        initial=None,
        choices=[(1, 'Oui'), (0, 'Non')],
        verbose_name=
        'Avez-vous déjà participé à une expérience en laboratoire ?',
        widget=widgets.RadioSelect())
    boring_task = models.IntegerField(
        initial=None,
        choices=[(0, 'Très ennuyeuses'), (1, 'Plutot ennuyeuses'),
                 (2, 'Peu ennuyeuses'), (3, 'Pas du tout ennuyeuses')],
        verbose_name=
        "Selon vous, les tâches que vous avez accomplies au début de "
        "l'expérience (le curseur qui devait être placé au milieu d'un trait) "
        "étaient ?",
        widget=widgets.RadioSelect())
    risk_aversion = models.IntegerField(
        initial='0',
        choices=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        widget=widgets.RadioSelectHorizontal())

    confiance = models.IntegerField(
        initial=None,
        choices=[(0, 'Je ne sais pas'), (1, 'On n’est jamais trop prudent '),
                 (2, 'La plupart des gens sont dignes de confiance')],
        verbose_name=
        "Généralement parlant, direz-vous que la plupart des gens sont dignes de confiance ou que l’on n’est jamais trop prudent avec les gens ?",
        widget=widgets.RadioSelect())
    groupe = models.IntegerField(
        choices=[(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D'), (4, 'E'), (5, 'F'),
                 (6, 'G')],
        verbose_name=
        "Veuillez indiquer dans quelle mesure vous vous sentez envers les autres membres de votre groupe de la partie 2.",
    )
Example #27
0
class Player(BasePlayer):

    decision1 = models.CharField(max_length=50, choices=sorted(Constants.options), widget=widgets.RadioSelectHorizontal())
    decision2 = models.CharField(max_length=50, choices=sorted(Constants.options), widget=widgets.RadioSelectHorizontal())
    decision3 = models.CharField(max_length=50, choices=sorted(Constants.options), widget=widgets.RadioSelectHorizontal())
    decision4 = models.CharField(max_length=50, choices=sorted(Constants.options), widget=widgets.RadioSelectHorizontal())
    decision5 = models.CharField(max_length=50, choices=sorted(Constants.options), widget=widgets.RadioSelectHorizontal())
    decision6 = models.CharField(max_length=50, choices=sorted(Constants.options), widget=widgets.RadioSelectHorizontal())
    decision7 = models.CharField(max_length=50, choices=sorted(Constants.options), widget=widgets.RadioSelectHorizontal())
    decision8 = models.CharField(max_length=50, choices=sorted(Constants.options), widget=widgets.RadioSelectHorizontal())
    decision9 = models.CharField(max_length=50, choices=sorted(Constants.options), widget=widgets.RadioSelectHorizontal())
    decision10 = models.CharField(max_length=50, choices=sorted(Constants.options), widget=widgets.RadioSelectHorizontal())

    selected_decision = models.IntegerField()

    def get_decision(self):
        option = getattr(self, "decision{}".format(self.selected_decision))
        return option, Constants.options[option], Constants.decisions[self.selected_decision-1]

    def set_payoff(self):
        self.selected_decision = random.randint(1, 10)
        option, option_desc, decision = self.get_decision()
        self.payoff = decision[option]

    def fields_iterator(self):
        for idx in range(1, 11):
            yield getattr(self, "decision{}".format(idx))
Example #28
0
class Player(otree.models.BasePlayer):

    # <built-in>
    group = models.ForeignKey(Group, null=True)
    subsession = models.ForeignKey(Subsession)
    # </built-in>

    player_name = models.CharField(max_length=255)
    avatar = models.CharField(max_length=255)

    virtual_oponent = models.CharField(max_length=255,
                                       choices=list(
                                           Constants.virtual_comb.keys()))

    n_simple_propuesta = models.CurrencyField(
        choices=range(0, 201),
        verbose_name="¿Cuánto le gustaría ofrecer?",
        default=0)
    n_simple_respuesta = models.CharField(
        widget=widgets.RadioSelectHorizontal(),
        max_length=250,
        choices=["Aceptar", "Rechazar"],
        default="Aceptar")

    n_empresa_trabajador_propuesta = models.CurrencyField(
        verbose_name="¿Cuánto le gustaría ofrecer como salario?",
        choices=range(0, 201),
        default=0)
    n_empresa_trabajador_propuestas = models.TextField(default="[]")

    n_empresa_trabajador_respuesta = models.CharField(
        widget=widgets.RadioSelectHorizontal(),
        max_length=250,
        choices=["Aceptar", "Rechazar"],
        default="Aceptar")
    n_empresa_trabajador_contrapropuesta = models.CurrencyField(
        verbose_name="Contraoferta de salario:",
        choices=range(0, 201),
        default=0)
    n_empresa_trabajador_contrapropuestas = models.TextField(default="[]")

    n_empresa_trabajador_finalizacion_forzada = models.BooleanField(
        default=False)

    def all_propuestas(self):
        return json.loads(self.n_empresa_trabajador_propuestas)

    def add_propuesta(self, v):
        lista = self.all_propuestas()
        lista.append(int(v))
        self.n_empresa_trabajador_propuestas = json.dumps(lista)

    def all_contrapropuestas(self):
        return json.loads(self.n_empresa_trabajador_contrapropuestas)

    def add_contrapropuesta(self, v):
        lista = self.all_contrapropuestas()
        lista.append(int(v))
        self.n_empresa_trabajador_contrapropuestas = json.dumps(lista)

    def role(self):
        if self.subsession.get_current_game() == Constants.n_simple:
            if self.id_in_group == 1:
                return Constants.proponente
            elif self.id_in_group == 2:
                return Constants.respondente
        elif self.subsession.get_current_game(
        ) == Constants.n_empresa_trabajador:
            if self.id_in_group == 1:
                return Constants.empresa
            elif self.id_in_group == 2:
                return Constants.trabajador

    def avatarb64(self):
        if not self.avatar:
            return Constants.default_avatar_b64
        if not hasattr(self, "_avatarb64"):
            path = os.path.join(settings.BASE_DIR, "participants_conf",
                                self.avatar)
            with open(path) as fp:
                self._avatarb64 = "data:image/{};base64,{}".format(
                    self.avatar.rsplit(".", 1)[1].lower(),
                    fp.read().encode("base64"))
        return self._avatarb64
Example #29
0
class Player(BasePlayer):

    response_example = models.CharField(max_length=255,
                                        choices=Constants.example["options"],
                                        widget=widgets.RadioSelectHorizontal())

    response_q1 = models.CharField(max_length=255,
                                   choices=Constants.questions[0]["options"],
                                   widget=widgets.RadioSelectHorizontal())
    response_q2 = models.CharField(max_length=255,
                                   choices=Constants.questions[1]["options"],
                                   widget=widgets.RadioSelectHorizontal())
    response_q3 = models.CharField(max_length=255,
                                   choices=Constants.questions[2]["options"],
                                   widget=widgets.RadioSelectHorizontal())
    response_q4 = models.CharField(max_length=255,
                                   choices=Constants.questions[3]["options"],
                                   widget=widgets.RadioSelectHorizontal())
    response_q5 = models.CharField(max_length=255,
                                   choices=Constants.questions[4]["options"],
                                   widget=widgets.RadioSelectHorizontal())
    response_q6 = models.CharField(max_length=255,
                                   choices=Constants.questions[5]["options"],
                                   widget=widgets.RadioSelectHorizontal())
    response_q7 = models.CharField(max_length=255,
                                   choices=Constants.questions[6]["options"],
                                   widget=widgets.RadioSelectHorizontal())
    response_q8 = models.CharField(max_length=255,
                                   choices=Constants.questions[7]["options"],
                                   widget=widgets.RadioSelectHorizontal())
    response_q9 = models.CharField(max_length=255,
                                   choices=Constants.questions[8]["options"],
                                   widget=widgets.RadioSelectHorizontal())
    response_q10 = models.CharField(max_length=255,
                                    choices=Constants.questions[9]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q11 = models.CharField(max_length=255,
                                    choices=Constants.questions[10]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q12 = models.CharField(max_length=255,
                                    choices=Constants.questions[11]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q13 = models.CharField(max_length=255,
                                    choices=Constants.questions[12]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q14 = models.CharField(max_length=255,
                                    choices=Constants.questions[13]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q15 = models.CharField(max_length=255,
                                    choices=Constants.questions[14]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q16 = models.CharField(max_length=255,
                                    choices=Constants.questions[15]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q17 = models.CharField(max_length=255,
                                    choices=Constants.questions[16]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q18 = models.CharField(max_length=255,
                                    choices=Constants.questions[17]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q19 = models.CharField(max_length=255,
                                    choices=Constants.questions[18]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q20 = models.CharField(max_length=255,
                                    choices=Constants.questions[19]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q21 = models.CharField(max_length=255,
                                    choices=Constants.questions[20]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q22 = models.CharField(max_length=255,
                                    choices=Constants.questions[21]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q23 = models.CharField(max_length=255,
                                    choices=Constants.questions[22]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q24 = models.CharField(max_length=255,
                                    choices=Constants.questions[23]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q25 = models.CharField(max_length=255,
                                    choices=Constants.questions[24]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q26 = models.CharField(max_length=255,
                                    choices=Constants.questions[25]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q27 = models.CharField(max_length=255,
                                    choices=Constants.questions[26]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q28 = models.CharField(max_length=255,
                                    choices=Constants.questions[27]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q29 = models.CharField(max_length=255,
                                    choices=Constants.questions[28]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q30 = models.CharField(max_length=255,
                                    choices=Constants.questions[29]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q31 = models.CharField(max_length=255,
                                    choices=Constants.questions[30]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q32 = models.CharField(max_length=255,
                                    choices=Constants.questions[31]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q33 = models.CharField(max_length=255,
                                    choices=Constants.questions[32]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q34 = models.CharField(max_length=255,
                                    choices=Constants.questions[33]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q35 = models.CharField(max_length=255,
                                    choices=Constants.questions[34]["options"],
                                    widget=widgets.RadioSelectHorizontal())
    response_q36 = models.CharField(max_length=255,
                                    choices=Constants.questions[35]["options"],
                                    widget=widgets.RadioSelectHorizontal())
Example #30
0
class Player(otree.models.BasePlayer):
    # <built-in>
    subsession = models.ForeignKey(Subsession)
    group = models.ForeignKey(Group, null=True)
    # </built-in>

    # initial shares and cash
    cash = models.MoneyField(default=20)
    shares = models.PositiveIntegerField(default=5)

    # order fields
    bp = models.MoneyField(default=0.00,
                           doc="""maximum buying price per share""")
    bn = models.PositiveIntegerField(default=0,
                                     doc="""number of shares willing to buy""")
    sp = models.MoneyField(default=0.00,
                           doc="""minimum selling price per share""")
    sn = models.PositiveIntegerField(
        default=0, doc="""number of shares willing to sell.""")

    def bn_choices(self):
        return range(0, self.shares + 1, 1)

    def bn_error_message(self, value):
        pass

    def sn_choices(self):
        return range(0, self.shares + 1, 1)

    def bp_choices(self):
        return money_range(0, self.cash, 0.5)

    def sp_choices(self):
        return money_range(0, self.cash, 0.5)

    def other_player(self):
        """Returns other player in group. Only valid for 2-player groups."""
        return self.get_others_in_group()[0]

    QUESTION_1_CHOICES = [
        'P=3, N=2',
        'P=2, N=3',
        'P=2.5, N=3',
        'P=2.5, N=2',
        'No transaction will take place',
    ]
    QUESTION_2_CHOICES = [
        '$8, $12', '$12, $8', '$8, $8', '$12, $12', '$10, $10'
    ]

    understanding_question_1 = models.CharField(max_length=100,
                                                null=True,
                                                choices=QUESTION_1_CHOICES,
                                                verbose_name='',
                                                widget=widgets.RadioSelect())
    understanding_question_2 = models.CharField(max_length=100,
                                                null=True,
                                                choices=QUESTION_2_CHOICES,
                                                verbose_name='',
                                                widget=widgets.RadioSelect())

    feedbackq = models.CharField(
        null=True,
        verbose_name='How well do you think this sample game was implemented?',
        widget=widgets.RadioSelectHorizontal())

    def feedbackq_choices(self):
        return ['Very well', 'Well', 'OK', 'Badly', 'Very badly']

    # check correct answers
    def is_understanding_question_1_correct(self):
        return self.understanding_question_1 == Constants.understanding_1_correct

    def is_understanding_question_2_correct(self):
        return self.understanding_question_2 == Constants.understanding_2_correct