#1 by JSM (edited )
Hello,
I run an experiment with groups of 2 where one player makes a decision on one page and the partner makes decision based on the partners inputs on the next page. This back and forth goes on for several pages.
I frequently find myself having to write pages like this:
class MyPage(Page):
form_model = 'player'
formfields = [...]
def vars_for_template(player):
my_group = player.get_others_in_group()
partner = my_group[0]
# Some more code
def js_vars(player):
my_group = player.get_others_in_group()
partner = my_group[0]
# Some more code
def is_displayed(player):
my_group = player.get_others_in_group()
partner = my_group[0]
# Some Code
I understand that calling the get_others_in_group() function multiple times is not efficient and so I am looking for a way to store the player object of the partner maybe once and then just reusing this variable every time I need to access variables of a partner. Or is there any way to reduce the amounts of time to call the get_others_in_group() function?
Is there some way to do this in oTree?
I would be thankful for any idea/help!
#2
by
woodsd42
If there's only a few decisions you could save it at the Player level. E.g. have fields like:
class Player(BasePlayer):
partners_price = models.IntegerField()
partners_quantity = models.IntegerField()
Then you could call get_others_in_group() once in before_next_page() or something, given it sounds like its sequential.
Otherwise, if there's a lot of decisions you could save it at the participant.vars level, perhaps with the relevant entries as a list or dict. However, I don't know how efficient accessing participant.vars is - probably not that bad though.
Finally, another option would be to save the partners id_in_group at the Player level. Then you could call get_player_by_id(n) instead. I don't know if that's more efficient though.