#1 by caroolin
I have this:
from otree.api import Currency, models, BaseConstants, BaseSubsession, BaseGroup, BasePlayer
from otree.api import Page, WaitPage
doc = """
Market Entry Game
"""
class C(BaseConstants):
NAME_IN_URL = 'market_game'
PLAYERS_PER_GROUP = 2
NUM_ROUNDS = 6
class Subsession(BaseSubsession):
market_condition = models.StringField()
def creating_session(self):
print("creating_session is being called") # Debug print
condition_sequence = ['Favorable', 'Unfavorable', 'Moderate']
round_index = (self.round_number - 1) % 3
self.market_condition = condition_sequence[round_index]
print("Market condition set to:", self.market_condition)
class Group(BaseGroup):
def set_payoffs(self):
for p in self.get_players():
p.set_payoff()
class Player(BasePlayer):
decision = models.StringField(choices=['Enter', 'Hold'])
def set_payoff(self):
other_player = self.get_others_in_group()[0]
condition = self.subsession.market_condition
decision = self.decision
other_decision = other_player.decision
if condition == 'Favorable':
if decision == 'Enter' and other_decision == 'Hold':
self.payoff = Currency(100)
other_player.payoff = Currency(10)
elif decision == 'Hold' and other_decision == 'Enter':
self.payoff = Currency(10)
other_player.payoff = Currency(100)
elif decision == 'Enter' and other_decision == 'Enter':
self.payoff = Currency(50)
other_player.payoff = Currency(50)
elif decision == 'Hold' and other_decision == 'Hold':
self.payoff = Currency(10)
other_player.payoff = Currency(10)
elif condition == 'Unfavorable':
if decision == 'Enter' and other_decision == 'Hold':
self.payoff = Currency(-5)
other_player.payoff = Currency(10)
elif decision == 'Hold' and other_decision == 'Enter':
self.payoff = Currency(10)
other_player.payoff = Currency(-5)
elif decision == 'Enter' and other_decision == 'Enter':
self.payoff = Currency(-10)
other_player.payoff = Currency(-10)
elif decision == 'Hold' and other_decision == 'Hold':
self.payoff = Currency(10)
other_player.payoff = Currency(10)
elif condition == 'Moderate':
if decision == 'Enter' and other_decision == 'Hold':
self.payoff = Currency(40)
other_player.payoff = Currency(10)
elif decision == 'Hold' and other_decision == 'Enter':
self.payoff = Currency(10)
other_player.payoff = Currency(40)
elif decision == 'Enter' and other_decision == 'Enter':
self.payoff = Currency(20)
other_player.payoff = Currency(20)
elif decision == 'Hold' and other_decision == 'Hold':
self.payoff = Currency(10)
other_player.payoff = Currency(10)
# PAGES
class MarketConditionPage(Page):
@staticmethod
def vars_for_template(player):
print(player)
return {'market_condition': player.subsession.market_condition}
class DecisionPage(Page):
form_model = 'player'
form_fields = ['decision']
class ResultsWaitPage(WaitPage):
after_all_players_arrive = 'set_payoffs'
class Results(Page):
@staticmethod
def vars_for_template(player):
return {
'my_decision': player.decision,
'other_player_decision': player.get_others_in_group()[0].decision,
'my_payoff': player.payoff,
'other_player_payoff': player.get_others_in_group()[0].payoff,
'market_condition': player.subsession.market_condition
}
page_sequence = [MarketConditionPage, DecisionPage, ResultsWaitPage, Results]
And get this when running the otree devserver:
TypeError: subsession.market_condition is None. Accessing a null field is generally considered an error. Or, if this is intentional, use field_maybe_none()
But I do not want none, but the game to start with my sequence.
Anybody know how to adapt?
Thank you!
Best,
Carolin
#2 by Fanist
Are you using the new version of o-Tree? If so, the usage of creating_session() seems incorrect. Put all functions (creating_session(), set_payoffs ..) outside the Class and let them be standalone. You can add a print in the function to see whether it is triggered when running the code.