from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random class Constants(BaseConstants): name_in_url = 'allocation' players_per_group = 2 num_rounds = 2 class Subsession(BaseSubsession): pass class Group(BaseGroup): def set_roles(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) for i in range(1, Constants.num_rounds +1): p1.in_round(i).type = '1' p2.in_round(i).type = '2' ##### TEIL 2 ##### def T2_offer(self): groups = self.subsession.get_group_matrix() g = 0 while self.id_in_subsession not in groups[g]: g = g + 1 group_products = self.li_T2_products[g] group_prices = self.li_T2_prices[g] round_products = group_products[self.round_number - 1] round_prices = group_prices[self.round_number - 1] self.get_player_by_id(1).T2_product1 = round_products[0] self.get_player_by_id(1).T2_payoff1 = 80 + 50 - round_prices[0] self.get_player_by_id(1).T2_product2 = round_products[-1] self.get_player_by_id(1).T2_payoff2 = 80 + 50 - round_prices[-1] def T2_payoff_calc(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) if p1.buyer_choice == 0: p1.T2_payoff = 80 p2.T2_payoff = 80 elif p1.buyer_choice == 1: if p1.T2_product1 == 1: p1.T2_payoff = p1.T2_payoff1 p2.T2_payoff = 20 else: p1.T2_payoff = p1.T2_payoff1 p2.T2_payoff = 80 elif p1.buyer_choice == 2: if p1.T2_product2 == 1: p1.T2_payoff = p1.T2_payoff2 p2.T2_payoff = 20 else: p1.T2_payoff = p1.T2_payoff2 p2.T2_payoff = 80 # Data Storage # !!! ONLY SAMPLE DATA !!! @property def li_T2_products(self): return [ [[0, 0], [0, 0], [0, 0], [1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], #1 [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [1, 0], [0, 0], [0, 0], [0, 0]], [[1, 1], [0, 1], [1, 1], [1, 0], [0, 1], [1, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], #2 [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1]], [[0, 1], [1, 0], [0, 0], [0, 0], [0, 1], [1, 0], [1, 0], [0, 0], [0, 0], [1, 0], [1, 0], [0, 0], [0, 0], #3 [0, 1], [0, 0], [1, 1], [0, 0], [0, 0], [0, 0], [0, 0], [1, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 1], [1, 1], [1, 0], [1, 0], [1, 1], [1, 1], [1, 1], [1, 0], [1, 1], [1, 1], #4 [1, 1], [1, 0], [1, 0], [0, 1], [0, 1], [0, 0], [0, 1], [0, 1], [1, 0], [0, 1], [0, 1]] ] @property def li_T2_prices(self): return [ [[20, 35], [30, 25], [30, 21], [20, 30], [30, 21], [30, 25], [30, 45], [30, 40], [45, 50], [50, 45], [48, 50], [45, 47], [45, 44], [35, 30], [35, 30], [35, 30], [30, 29], [50, 29], [45, 50], [45, 44], [50, 40], [45, 45], [45, 40], [38, 35]], [[30, 40], [50, 25], [40, 30], [35, 30], [40, 30], [40, 30], [30, 30], [30, 30], [25, 30], [30, 20], [25, 25], [20, 25], [25, 20], [20, 20], [20, 20], [15, 20], [20, 15], [15, 15], [10, 10], [10, 10], [10, 10], [10, 10], [10, 10], [10, 10]], [[50, 25], [10, 40], [35, 40], [40, 35], [34, 30], [50, 32], [35, 35], [40, 35], [35, 32], [25, 29], [35, 35], [40, 33], [32, 3], [35, 25], [25, 33], [20, 30], [30, 35], [30, 33], [30, 25], [31, 30], [10, 28], [30, 50], [40, 35], [35, 30]], [[30, 30], [25, 30], [25, 30], [25, 15], [15, 40], [30, 20], [40, 30], [40, 20], [25, 40], [30, 25], [30, 30], [30, 30], [25, 25], [28, 25], [24, 20], [35, 30], [30, 20], [25, 24], [25, 30], [25, 20], [25, 20], [20, 20], [25, 20], [20, 20]] ] ##### TEIL 4 ##### part_payed = models.IntegerField() round_payed = models.IntegerField() def set_payoff(self): self.part_payed = random.randint(1, 2) self.round_payed = random.randint(1, Constants.num_rounds) for p in self.get_players(): if self.part_payed == 1: p.payoff = c(p.in_round(1).T1_payoff) else: p.payoff = c(p.in_round(self.round_payed).T2_payoff) class Player(BasePlayer): type = models.StringField() ##### Teil 1 ##### t_order = models.IntegerField() T1_payoff = models.IntegerField() T1_choice_X1 = models.IntegerField() T1_choice_X2 = models.IntegerField() T1_choice_X3 = models.IntegerField() T1_choice_X4 = models.IntegerField() T1_choice_X5 = models.IntegerField() T1_choice_X6 = models.IntegerField() T1_choice_X7 = models.IntegerField() T1_choice_X8 = models.IntegerField() T1_choice_X9 = models.IntegerField() T1_choice_X10 = models.IntegerField() T1_choice_X11 = models.IntegerField() T1_choice_X12 = models.IntegerField() T1_choice_X13 = models.IntegerField() T1_choice_X14 = models.IntegerField() T1_choice_Y1 = models.IntegerField() T1_choice_Y2 = models.IntegerField() T1_choice_Y3 = models.IntegerField() T1_choice_Y4 = models.IntegerField() T1_choice_Y5 = models.IntegerField() T1_choice_Y6 = models.IntegerField() T1_choice_Y7 = models.IntegerField() T1_choice_Y8 = models.IntegerField() T1_choice_Y9 = models.IntegerField() T1_choice_Y10 = models.IntegerField() T1_choice_Y11 = models.IntegerField() T1_choice_Y12 = models.IntegerField() T1_choice_Y13 = models.IntegerField() T1_choice_Y14 = models.IntegerField() def table_sequence(self): if self.type == '1': self.t_order = random.choice([1, 2]) else: pass def T1_payoff_calc(self): li_values = [self.field_maybe_none('T1_choice_X1'), self.field_maybe_none('T1_choice_X2'), self.field_maybe_none('T1_choice_X3'), self.field_maybe_none('T1_choice_X4'), self.field_maybe_none('T1_choice_X5'), self.field_maybe_none('T1_choice_X6'), self.field_maybe_none('T1_choice_X7'), self.field_maybe_none('T1_choice_X8'), self.field_maybe_none('T1_choice_X9'), self.field_maybe_none('T1_choice_X10'), self.field_maybe_none('T1_choice_X11'), self.field_maybe_none('T1_choice_X12'), self.field_maybe_none('T1_choice_X13'), self.field_maybe_none('T1_choice_X14'), self.field_maybe_none('T1_choice_Y1'), self.field_maybe_none('T1_choice_Y2'), self.field_maybe_none('T1_choice_Y3'), self.field_maybe_none('T1_choice_Y4'), self.field_maybe_none('T1_choice_Y5'), self.field_maybe_none('T1_choice_Y6'), self.field_maybe_none('T1_choice_Y7'), self.field_maybe_none('T1_choice_Y8'), self.field_maybe_none('T1_choice_Y9'), self.field_maybe_none('T1_choice_Y10'), self.field_maybe_none('T1_choice_Y11'), self.field_maybe_none('T1_choice_Y12'), self.field_maybe_none('T1_choice_Y13'), self.field_maybe_none('T1_choice_Y14')] li_keys = ["T1_choice_X1", "T1_choice_X2", "T1_choice_X3", "T1_choice_X4", "T1_choice_X5", "T1_choice_X6", "T1_choice_X7", "T1_choice_X8", "T1_choice_X9", "T1_choice_X10", "T1_choice_X11", "T1_choice_X12", "T1_choice_X13", "T1_choice_X14", "T1_choice_Y1", "T1_choice_Y2", "T1_choice_Y3", "T1_choice_Y4", "T1_choice_Y5", "T1_choice_Y6", "T1_choice_Y7", "T1_choice_Y8", "T1_choice_Y9", "T1_choice_Y10", "T1_choice_Y11", "T1_choice_Y12", "T1_choice_Y13", "T1_choice_Y14"] value = li_values[random.randint(1, 28) - 1] key = li_keys[random.randint(1, 28) - 1] if self.type == '1': if value == 0: self.T1_payoff = 80 else: self.T1_payoff = 80 + 50 - value elif self.type == '2': if value == 0: self.T1_payoff = 80 else: X = 'X' if X in key: self.T1_payoff = 20 else: self.T1_payoff = 80 ##### Teil2 ##### # Control questions # cont1_T2_false = models.IntegerField(initial=0) cont2_T2_false = models.IntegerField(initial=0) control1_T2 = models.IntegerField(widget=widgets.RadioSelect, choices=[ [0, "Sie können Ihre Rolle als Teilnehmer 1 oder Teilnehmer 2 während der Gesamtdauer der Studie wechseln."], [1, "Sie behalten Ihre Rolle als Teilnehmer 1 oder Teilnehmer 2 für die Gesamtdauer der Studie."] ], label="") control2_T2 = models.IntegerField(widget=widgets.RadioSelect, choices=[ [0, "Jede Gruppe bestehend aus einem Teilnehmer 1 und einem Teilnehmer 2 wird in jeder der 24 Runden nach dem Zufallsprinzip neu zusammengestellt."], [1, "Jede Gruppe bestehend aus einem Teilnehmer 1 und einem Teilnehmer 2 bleibt während der 24 Runden bestehen."] ], label="") def control1_T2_error_message(player, value): if value != 1: player.cont1_T2_false += 1 return 'Sie behalten Ihre Rolle als Teilnehmer 1 oder Teilnehmer 2 für die Gesamtdauer der Studie.' def control2_T2_error_message(player, value): if value != 0: player.cont2_T2_false += 1 return 'Jede Gruppe bestehend aus einem Teilnehmer 1 und einem Teilnehmer 2 wird in jeder der 24 Runden nach dem Zufallsprinzip neu zusammengestellt.' T2_product1 = models.IntegerField() T2_payoff1 = models.IntegerField() T2_product2 = models.IntegerField() T2_payoff2 = models.IntegerField() buyer_choice = models.IntegerField(min=0, max=2) T2_payoff = models.IntegerField() ##### TEIL 3 ###### age = models.IntegerField(min=16, max=99, label="") sex = models.IntegerField(initial=None, widget=widgets.RadioSelect, label="", choices=[[0, "weiblich"], [1, "männlich"], [2, "divers"]]) experience = models.IntegerField(initial=None, widget=widgets.RadioSelect, label="", choices=[[0, "noch nie"], [1, "1 bis 2 mal"], [2, "3 bis 5 mal"], [3, "öfter"]]) studies = models.StringField(label="") markets1 = models.IntegerField(initial=None, choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) markets2 = models.IntegerField(initial=None, choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) markets3 = models.IntegerField(initial=None, choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) markets4 = models.IntegerField(initial=None, choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) markets5 = models.IntegerField(initial=None, choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) markets6 = models.IntegerField(initial=None, choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) verstanden = models.IntegerField(initial=None, blank=True, choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"]]) not_harming_member = models.IntegerField(initial=None, choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"]]) ownpayoff = models.IntegerField(initial=None, choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"]]) utilitarian = models.IntegerField(initial=None, choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"]]) quality_check = models.IntegerField(initial=None, choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"]]) wtp_x_buyer = models.IntegerField(initial=None, choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"]]) wtp_y_buyer = models.IntegerField(initial=None, choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"]]) x_tendency_buyer = models.IntegerField(initial=None, choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"]]) partei = models.IntegerField(initial=None, widget=widgets.RadioSelect, choices=[ [1, "SPD"], [2, "Grüne"], [3, "CSU"], [4, "CDU"], [5, "LINKE"], [6, "FDP"], [7, "AfD"], [8, "Andere Partei"]]) pol_selbstein = models.IntegerField(initial=None, widget=widgets.RadioSelectHorizontal, choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"], [7, "R6"], [8, "R7"], [9, "R8"], [10, "R9"]]) allocation1 = models.FloatField() allocation2 = models.FloatField() allocation3 = models.FloatField() allocation4 = models.FloatField() allocation5 = models.FloatField() allocation6 = models.FloatField() ### Payment Info ### name = models.StringField(label="Vorname:") surname = models.StringField(label="Nachname:") method = models.StringField(widget=widgets.RadioSelect, choices=["Banküberweisung", "PayPal"], label="Zahlungsmethode:", initial=0) IBAN = models.StringField() mail = models.StringField()