#1 by lalalavi (edited )
I have a multi-app project in which the app sequence looks like this: app_sequence=['instructions', 'emotion', 'simple_experiment', 'emotion', 'simple_experiment', 'emotion', 'questionnaire', 'end'], The emotion apps are perfect copies of each other, so that's fine, but the first time we run simple_experiment it needs to be slightly different from the second. The change should look like this: class SplitScreen(Page): @staticmethod def vars_for_template(player): if FIRST TIME SIMPLE_EXPERIMENT player.sReward = 'HR' else: player.sReward = 'LR' url_list = [f'memes/feed{meme}.jpeg' for meme in range(1,410)] random.shuffle(url_list) (...) Is there any elegant way to do this? For sure one could just create a new app with this minimal change but that feels like terrible coding practice because it duplicates everything, and I am not sure how participant fields would solve this issue. Thank you in advance!! :) -----EDIT----- Ok now i see this might be a bigger problem than I thought of since I can't apparently repeat apps.
#2
by
BonnEconLab
Regarding the repetition of apps in app_sequence, have a look at this post from the earlier oTree Google Group: https://groups.google.com/g/otree/c/2Z3d_SStb5o/m/kEjHjBL_BAAJ Regarding the detection whether something has already be done/run, a standard participant variable should suffice, shouldn’t it? That is, for instance, in settings.py include PARTICIPANT_FIELDS = ['simple_experiment_already_run'] In one of your __init__.py files — say, that of your 'instructions' app — include def creating_session(subsession): if subsession.round_number == 1: for player in subsession.get_players(): player.participant.simple_experiment_already_run = False (See https://otree.readthedocs.io/en/latest/treatments.html#treatment-groups-multiple-rounds.) Then, in line with your own suggestion, include something like class SplitScreen(Page): @staticmethod def vars_for_template(player): if player.participant.simple_experiment_already_run == False player.sReward = 'HR' player.participant.simple_experiment_already_run = True else: player.sReward = 'LR' (...)