from otree.api import * import random import itertools import json from collections import Counter doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'strategy_elicitation' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 MAIN_GROUPS = ['control', 'treatment_c', 'treatment_r', 'treatment_b'] class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): main_group = models.StringField() # Resilience Variables res_comprehension_1 = models.BooleanField(label="Deutschland importiert keine Energie") res_comprehension_2 = models.BooleanField(label="Deutschland ist abhängig von Energieimporten") res_comprehension_3 = models.BooleanField(label="Ein resilientes Energiesystem erhöht das Risiko von Schocks") res_comprehension_4 = models.BooleanField(label="Resilienz-Strategien sind mit Kosten verbunden") # Beliefs cost_belief_reshoring = models.IntegerField( choices=[[1, 'Hohe Zusatzkosten'], [2, 'Moderate Zusatzkosten'], [3, 'Geringe Zusatzkosten'], [4, 'Keine Zusatzkosten']], label="Heimische Produktion (Reshoring)", widget=widgets.RadioSelectHorizontal ) cost_belief_friendshoring = models.IntegerField( choices=[[1, 'Hohe Zusatzkosten'], [2, 'Moderate Zusatzkosten'], [3, 'Geringe Zusatzkosten'], [4, 'Keine Zusatzkosten']], label="Handel mit Wertepartnern (Friendshoring)", widget=widgets.RadioSelectHorizontal ) cost_belief_diversification = models.IntegerField( choices=[[1, 'Hohe Zusatzkosten'], [2, 'Moderate Zusatzkosten'], [3, 'Geringe Zusatzkosten'], [4, 'Keine Zusatzkosten']], label="Breite Streuung (Diversifikation)", widget=widgets.RadioSelectHorizontal ) risk_belief_reshoring = models.IntegerField( choices=[[1, 'Nicht erfolgreich'], [2, 'Wenig erfolgreich'], [3, 'Erfolgreich'], [4, 'Sehr erfolgreich']], label="Heimische Produktion (Reshoring)", widget=widgets.RadioSelectHorizontal ) risk_belief_friendshoring = models.IntegerField( choices=[[1, 'Nicht erfolgreich'], [2, 'Wenig erfolgreich'], [3, 'Erfolgreich'], [4, 'Sehr erfolgreich']], label="Handel mit Wertepartnern (Friendshoring)", widget=widgets.RadioSelectHorizontal ) risk_belief_diversification = models.IntegerField( choices=[[1, 'Nicht erfolgreich'], [2, 'Wenig erfolgreich'], [3, 'Erfolgreich'], [4, 'Sehr erfolgreich']], label="Breite Streuung (Diversifikation)", widget=widgets.RadioSelectHorizontal ) preferred_strategy = models.StringField( choices=[ ["reshoring", "Heimische Produktion (Reshoring)"], ["friendshoring", "Handel mit Wertepartnern (Friendshoring)"], ["diversification", "Breite Streuung (Diversifikation)"] ], label="Welche Strategie sollte Deutschland Ihrer Meinung nach hauptsächlich verfolgen, um die Resilienz des Energiesystems zu verbessern?", widget=widgets.RadioSelect ) # H2 Variables h2_knowledge = models.StringField( choices=[ [1, "Noch nie davon gehört"], [2, "Nur selten/ am Rande davon gehört"], [3, "Davon gehört aber kenne mich nicht aus"], [4, "Kenne mich grundlegend aus"], [5, "Kenne mich sehr gut damit aus"] ], label="Haben Sie vor dieser Befragung schonmal etwas von grünem Wasserstoff gehört?", widget=widgets.RadioSelect ) def creating_session(subsession: Subsession): players = subsession.get_players() num_players = len(players) num_groups = len(C.MAIN_GROUPS) repeats = (num_players // num_groups) + 1 # Repeat pattern enough times to cover all players assignment_pool = (C.MAIN_GROUPS * repeats)[:num_players] random.shuffle(assignment_pool) # Assign for player, (main_group) in zip(players, assignment_pool): player.main_group = main_group # --- Debug summary --- counts_main = Counter([p.main_group for p in players]) # --- Debug summary (nested) --- print('--- Group Assignment Summary ---') print(dict(Counter([p.main_group for p in players]))) print('--------------------------------') # PAGES class Res_Strategies(Page): form_model = "player" class Res_Comprehension(Page): form_model = 'player' @staticmethod def get_form_fields(player: Player): form_fields = [ 'res_comprehension_1', 'res_comprehension_2', 'res_comprehension_3', 'res_comprehension_4', ] random.shuffle(form_fields) return form_fields class Beliefs(Page): form_model = "player" form_fields = ["cost_belief_reshoring", "cost_belief_friendshoring", "cost_belief_diversification", "risk_belief_reshoring", "risk_belief_friendshoring", "risk_belief_diversification"] @staticmethod def vars_for_template(player: Player): return { "descriptions": { "reshoring": "Energie wird hauptsächlich in Deutschland erzeugt, nur geringe Teile werden importiert. " "Deutschland ist in diesem Fall kaum von Schocks in anderen Ländern betroffen. " "Die Energiekosten in Deutschland erhöhen sich, da kostengünstige Angebote anderer Länder nicht genutzt werden.", "friendshoring": "Energie wird nur aus Ländern importiert, die Deutschland politisch und gesellschaftlich nahestehen. " "Hierdurch verringert sich das Risiko von politisch bedingten Schocks betroffen zu sein. " "Die Energiekosten in Deutschland erhöhen sich, da kostengünstigere Länder aufgrund ihres politischen Systems ausgeschlossen werden.", "diversification": "Energie wird aus möglichst vielen verschiedenen Ländern weltweit importiert. " "Fällt in diesem Fall ein Lieferant aus, können andere einspringen, sodass negative Folgen für die deutsche Wirtschaft reduziert werden. " "Die Energiekosten in Deutschland erhöhen sich, da zusätzliche Investitionen in Infrastruktur und Produktionsanlagen notwendig sind.", } } class Strat_elicit(Page): form_model = "player" form_fields = ["preferred_strategy"] class H2_Intro(Page): form_model = "player" class H2_Knowledge(Page): form_model = "player" form_fields = ["h2_knowledge"] class Conjoint_Intro(Page): form_model = "player" class Conjoint_Intro_Culture(Page): form_model = "player" class Example(Page): form_model = "player" class Example_Culture(Page): form_model = "player" page_sequence = [Res_Strategies, Res_Comprehension, Beliefs, Strat_elicit, H2_Intro, H2_Knowledge, Conjoint_Intro_Culture] #page_sequence = [Conjoint_Intro_Culture, Example_Culture]