import random import json from datetime import datetime, timezone from otree.api import * doc = """ Instructions and language choice. """ def get_language_and_lexicon(player, strict=True): from .lexicon_fr import Lexicon as LexiconFR from .lexicon_en import Lexicon as LexiconEN lang = ( player.participant.vars['language'] if strict else player.participant.vars.get('language') or player.field_maybe_none('language') ) if lang not in ['fr', 'en']: raise ValueError(f"Unsupported or missing language: {lang}") if lang == 'fr': return LexiconFR, 'fr' else: return LexiconEN, 'en' class C(BaseConstants): NAME_IN_URL = 'instructions' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass def creating_session(subsession): for player in subsession.get_players(): player.participant.vars['language'] = 'en' class Group(BaseGroup): pass def utc_now_iso(): return datetime.now(timezone.utc).isoformat() def append_page_timestamp(player, field_name, page_name): raw = player.field_maybe_none(field_name) or '{}' try: payload = json.loads(raw) except json.JSONDecodeError: payload = {} if field_name == 'page_shown_at_utc' and page_name in payload: return payload[page_name] = utc_now_iso() setattr(player, field_name, json.dumps(payload, ensure_ascii=True)) class Player(BasePlayer): language = models.StringField() page_shown_at_utc = models.LongStringField(blank=True) page_submitted_at_utc = models.LongStringField(blank=True) # FUNCTIONS # No creating_session function needed - treatment assignment removed # PAGES class LanguageSelection(Page): form_model = 'player' form_fields = ['language'] @staticmethod def is_displayed(player): return player.round_number == 1 @staticmethod def before_next_page(player, timeout_happened): append_page_timestamp(player, 'page_submitted_at_utc', LanguageSelection.__name__) if player.language: player.participant.vars['language'] = player.language @staticmethod def vars_for_template(player): append_page_timestamp(player, 'page_shown_at_utc', LanguageSelection.__name__) return {} class Instructions(Page): @staticmethod def is_displayed(player): return 'language' in player.participant.vars @staticmethod def vars_for_template(player): append_page_timestamp(player, 'page_shown_at_utc', Instructions.__name__) from . import get_language_and_lexicon Lexicon, lang = get_language_and_lexicon(player) return dict( Lexicon=Lexicon, lang=lang, ) @staticmethod def before_next_page(player, timeout_happened): append_page_timestamp(player, 'page_submitted_at_utc', Instructions.__name__) page_sequence = [Instructions]