from otree.api import * import random import itertools import json doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'conjoint' PLAYERS_PER_GROUP = None NUM_ROUNDS = 6 ATTRIBUTES = { "Kosten": ["keine Erhöhung", "5% Erhöhung", "10% Erhöhung", "15% Erhöhung"], "Stabilität": ["hoch", "mittel", "niedrig"], "Sicherheit": ["hoch", "mittel", "niedrig"], "Umweltstandards": ["hoch", "mittel", "niedrig"], "Freiheit": ["frei", "teilweise frei", "nicht frei"], "Handelsbeziehung": ["aktiver Handel", "kein Handel"] } ATTRIBUTE_NAMES = list(ATTRIBUTES.keys()) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): profile_A = models.LongStringField() profile_B = models.LongStringField() attr_order = models.LongStringField(blank=True) # stores JSON list of attributes in randomized order # Country Preferences Variables choice = models.StringField( choices=[["A", 'Land A'], ["B", 'Land B']], label="Aus welchem Land sollte Deutschland Ihrer Meinung nach eher grünen Wasserstoff importieren?", widget=widgets.RadioSelect, ) rating_A = models.IntegerField( choices=[[1, "1: sehr schlechter Handelspartner"], [2, "2: schlechter Handelspartner"], [3, "3: eher schlechter Handelspartner"], [4, "4: weder schlecht noch gut"], [5, "5: eher guter Handelspartner"], [6, "6: guter Handelspartner"], [7, "7: sehr guter Handelspartner"]], label="Wie bewerten Sie die beiden Länder als Handelspartner für grünen Wasserstoff?", widget=widgets.RadioSelect, ) rating_B = models.IntegerField( choices=[[1, "1: sehr schlecht"], [2, "2: schlecht"], [3, "3: eher schlecht"], [4, "4: weder schlecht noch gut"], [5, "5: eher gut"], [6, "6: gut"], [7, "7: sehr gut"]], label="Wie bewerten Sie die beiden Länder als Handelspartner für grünen Wasserstoff?", widget=widgets.RadioSelect, ) def get_attribute_order(self): if self.round_number == 1: order = list(C.ATTRIBUTE_NAMES) random.shuffle(order) self.attr_order = json.dumps(order) return order else: first_round_player = self.in_round(1) return json.loads(first_round_player.attr_order) def generate_random_profiles(self): def random_profile(): return { attr: random.choice(levels) for attr, levels in C.ATTRIBUTES.items() } if self.round_number == 1: # fresh profiles for round 1 self.profile_A = json.dumps(random_profile()) self.profile_B = json.dumps(random_profile()) elif self.round_number == C.NUM_ROUNDS: # copy profiles from round 1 for consistency first_round_player = self.in_round(1) self.profile_A = first_round_player.profile_B self.profile_B = first_round_player.profile_A else: # fresh profiles for rounds 2-4 self.profile_A = json.dumps(random_profile()) self.profile_B = json.dumps(random_profile()) def creating_session(subsession: Subsession): for player in subsession.get_players(): # generate profiles in all rounds except round 5 (which copies round 1 automatically) if player.round_number in list(range(1, C.NUM_ROUNDS)): player.generate_random_profiles() class Conjoint1(Page): form_model = 'player' form_fields = ['choice', "rating_A", "rating_B"] def vars_for_template(player: Player): attr_order = player.get_attribute_order() profile_A = json.loads(player.profile_A) profile_B = json.loads(player.profile_B) descriptions = { "Kosten": "In Zeiten von wenig Sonne/ Wind wird der Wasserstoff zur Stromversorgung in Deutschland genutzt. " "Je höher die Importkosten des Wasserstoffes, desto höher sind die Stromkosten in Deutschland. ", "Stabilität": "Die ökonomische und politische Stabilität reflektiert die Rahmenbedingungen des Partnerlandes. " "Eine höhere Stabilität bedeutet unter anderem eine höhere Zuverlässigkeit der Lieferanten und ein geringeres Ausfallrisiko.", "Sicherheit": "Die Sicherheit reflektiert gewalttätige/ militärische Konflikte im Partnerland selbst oder in dessen Umgebung. " "Eine höhere Sicherheit bedeutet unter anderem eine höhere Zuverlässigkeit der Lieferanten und ein geringeres Ausfallrisiko.", "Umweltstandards": "Der Umweltstandard des Partnerlandes umfasst Maßnahmen zur Bekämpfung des Klimawandels sowie zum Schutz von Ökosystemen und Biodiversität. ", "Freiheit": "Die Freiheit des Partnerlandes umfasst politische und zivile Freiheiten, wie z. B. ein demokratisches Wahlrecht und Meinungsfreiheit. ", "Handelsbeziehung": "Es existiert bereits eine aktive Handelsbeziehung im Energiesektor zwischen Deutschland und dem Partnerland." } def pretty_name(name): return name.replace('_', ' ').capitalize() attributes = [] for attr in attr_order: label = pretty_name(attr) desc = descriptions.get(label, "") attributes.append((label, profile_A[attr], profile_B[attr], desc)) return dict(attributes=attributes) def before_next_page(player: Player, timeout_happened): # generate profiles for next round if not round 5 if player.round_number < C.NUM_ROUNDS: next_round = player.round_number + 1 next_player = player.in_round(next_round) next_player.generate_random_profiles() def before_start(self): # Ensure profiles are set for round 5 player before the page loads if player.round_number == C.NUM_ROUNDS: player.generate_random_profiles() page_sequence = [Conjoint1] #page_sequence = []