oTree Forum >

Problem with treatment group and display selected pages.

#1 by trungnguyen2004

problem with is_display for different groups:

Hello everyone, I'm new at using otree and I have run into a problem that I hope to seek advice from everyone.
Currently, my project is to randomly assign Set A and Set B for participants. When a participant is assigned to set A, PageA will be display, and so on.
However: I have run into the problem using these line of code:

from otree.api import *

doc = """
Your app description
"""

class C(BaseConstants):
    NAME_IN_URL = 'survey'
    PLAYERS_PER_GROUP = None
    NUM_ROUNDS = 1

class Subsession(BaseSubsession):
    def creating_session(self):
        import random
        for player in self.get_players():
            player.set_assignment = random.choice(['Set A', 'Set B'])
            print('Assigned set_assignment:', player.set_assignment)

class Group(BaseGroup):
    pass

class Player(BasePlayer):
    set_assignment = models.StringField()

    q1_setA = models.StringField(
        label="S1. 100% chance of getting $7 <br> R1. 20% chance of getting $10, 75% chance of getting $7, and 5% chance of getting nothing.",
        choices=['S1', 'R1'],
        widget=widgets.RadioSelect
    )
    q2_setA = models.StringField(
        label="The second question asks the respondent to choose from lotteries S2 and R2:<br>S2. 25% chance of getting $7 and 75% chance of getting nothing; <br> R2. 20% chance of getting $10 and 80% chance of getting nothing.",
        choices=['S2', 'R2'],
        widget=widgets.RadioSelect
    )
    q1_setB = models.StringField(
        label="S1. 100% chance of getting $700 <br> R1. 20% chance of getting $10, 75% chance of getting $7, and 5% chance of getting nothing.",
        choices=['S1', 'R1'],
        widget=widgets.RadioSelect
    )
    q2_setB = models.StringField(
        label="The second question asks the respondent to choose from lotteries S2 and R2:<br>S2. 25% chance of getting $7 and 75% chance of getting nothing; <br> R2. 20% chance of getting $10 and 80% chance of getting nothing.",
        choices=['S2', 'R2'],
        widget=widgets.RadioSelect
    )

# PAGES
class SetAPage(Page):
    form_model = 'player'
    form_fields = ['q1_setA', 'q2_setA']

    def is_displayed(self):
        if self.set_assignment:
            return self.set_assignment == 'Set A'
        return False

class SetBPage(Page):
    form_model = 'player'
    form_fields = ['q1_setB', 'q2_setB']

    def is_displayed(self):
        if self.set_assignment:
            return self.set_assignment == 'Set B'
        return False

class ResultsWaitPage(WaitPage):
    pass

class Results(Page):
    pass

page_sequence = [SetAPage, SetBPage]


Please help me with some advice.
Thank you everyone.

#2 by henning99

Inside your is_displayed function the if statement seems off. You are trying to use an if statement on a string value.
Try this:

@staticmethod
    def is_displayed(player):
        return player.set_assignment == 'Set A'

#3 by henning99

Also you are using self. maybe you need use player.

Write a reply

Set forum username