from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random class Constants(BaseConstants): name_in_url = 'nosellers' players_per_group = 2 num_rounds = 5 class Subsession(BaseSubsession): pass class Group(BaseGroup): seller_selection = models.IntegerField( default=99 ) 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 = 'buyer' p2.in_round(i).type = 'C' offer_order = models.IntegerField() ##### TEIL 2 ##### def T2_offer(self): p1 = self.get_player_by_id(1) groups = self.in_round(1).subsession.get_group_matrix() g = 0 for p in self.get_players(): while p1.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_price1 = round_prices[0] self.get_player_by_id(1).T2_product2 = round_products[-1] self.get_player_by_id(1).T2_price2 = 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 = 80 + 50 - p1.T2_price1 p2.T2_payoff = 20 else: p1.T2_payoff = 80 + 50 - p1.T2_price1 p2.T2_payoff = 80 elif p1.buyer_choice == 2: if p1.T2_product2 == 1: p1.T2_payoff = 80 + 50 - p1.T2_price2 p2.T2_payoff = 20 else: p1.T2_payoff = 80 + 50 - p1.T2_price2 p2.T2_payoff = 80 # Data Storage # !!! ONLY SAMPLE DATA !!! @property def li_T2_products(self): return [ # MARKET 1 - PRODUCT COMBINATION [[0, 1], [1, 0], [1, 1], [1, 0], [0, 1], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 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]], # MARKET 2 - PRODUCT COMBINATION [[0, 1], [1, 0], [1, 1], [1, 0], [0, 1], [1, 0], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1]], # MARKET 3 - PRODUCT COMBINATION [[0, 1], [1, 0], [1, 1], [1, 0], [0, 1], [1, 0], [1, 0], [0, 0], [0, 0], [1, 0], [1, 0], [0, 0], [0, 0], [0, 1], [0, 0], [1, 1], [0, 0], [0, 0], [0, 0], [0, 0], [1, 0], [0, 0], [0, 0], [0, 0]], # MARKET 4 - PRODUCT COMBINATION [[0, 1], [1, 0], [1, 1], [1, 0], [0, 1], [1, 0], [1, 0], [1, 1], [1, 1], [1, 1], [1, 0], [1, 1], [1, 1], [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 [ # MARKET 1 - PRICES [[35, 20], [15, 30], [25, 15], [35, 45], [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]], # MARKET 2 - PRICES [[35, 25], [15, 40], [25, 16], [35, 44], [32, 23], [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]], # MARKET 3 - PRICES [[35, 20], [15, 30], [25, 15], [35, 45], [30, 21], [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]], # MARKET 4 - PRICES [[35, 20], [15, 30], [25, 15], [35, 45], [30, 21], [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 3 ##### round_payed = models.IntegerField() def set_payoff(self): self.round_payed = random.randint(1, Constants.num_rounds) for p in self.get_players(): p.payoff = c(p.in_round(self.round_payed).T2_payoff) class Player(BasePlayer): type = models.StringField() # CONTROL QUESTIONS # control1 = models.IntegerField( widget=widgets.RadioSelect, choices=[ [0,"Jede Gruppe bestehend aus einem Käufer und einem Teilnehmer 2 wird in jeder der 24 Runden nach dem Zufallsprinzip neu zusammengestellt."], [1,"Jede Gruppe bestehend aus einem Käufer und einem Teilnehmer 2 bleibt während der 24 Runden bestehen."], [2,"Jede Gruppe bestehend aus einem Käufer und einem Teilnehmer 2 wird nach der Hälfte der Runden nach dem Zufallsprinzip neu zusammengestellt."] ], label="" ) control2 = models.IntegerField() control3 = models.IntegerField( widget=widgets.RadioSelect, choices=[ [0, "erhöht sich seine Auszahlung um 50 Punkte abzüglich des Produktpreises."], [1, "erhöht sich seine Auszahlung um 50 Punkte."], [2, "behält er seine Anfangsausstattung von 80 Punkten."] ], label="" ) control4 = models.IntegerField( widget=widgets.RadioSelect, choices=[0, 20, 60, 80], label="" ) control5 = models.IntegerField( widget=widgets.RadioSelect, choices=[0, 20, 60, 80], label="" ) control6 = models.IntegerField( widget=widgets.RadioSelect, choices=[0, 20, 60, 80], label="" ) cont1_false = models.IntegerField( initial=0, ) cont2_false = models.IntegerField( initial=0, ) cont3_false = models.IntegerField( initial=0, ) cont4_false = models.IntegerField( initial=0, ) cont5_false = models.IntegerField( initial=0, ) cont6_false = models.IntegerField( initial=0, ) def control1_error_message(player, value): if value != 0: player.cont1_false += 1 return ('Jede Gruppe bestehend aus einem Käufer und einem Teilnehmer 2' ' wird in jeder der 24 Runden nach dem Zufallsprinzip neu zusammengestellt.') def control3_error_message(player, value): if value != 0: player.cont3_false += 1 return ('Wenn der Käufer ein Produkt ORANGE oder ein Produkt BLAU kauft,' ' erhöht sich seine Auszahlung um 50 Punkte abzüglich des Produktpreises.') def control4_error_message(player, value): if value != 80: player.cont4_false += 1 return ('Wenn der Käufer kein Produkt kauft, entsteht kein Verlust für den Teilnehmer 2.' ' Der Teilnehmer 2 behält seine Anfangsausstattung von 80 Punkten.') def control5_error_message(player, value): if value != 20: player.cont5_false += 1 return ( 'Wenn der Käufer ein Produkt ORANGE kauft, entsteht ein Verlust von 60 Punkten für den Teilnehmer 2.' ' Somit ist die Auszahlung von Teilnehmer 2: 80 Punkte - 60 Punkte = 20 Punkte.') def control6_error_message(player, value): if value != 80: player.cont6_false += 1 return ('Wenn der Käufer ein Produkt BLAU kauft, entsteht kein Verlust für den Teilnehmer 2.' ' Der Teilnehmer 2 behält seine Anfangsausstattung von 80 Punkten.') T2_product = models.StringField( initial='' ) seller_price_X = models.IntegerField( min=0, max=50, label='' ) seller_price_Y = models.IntegerField( min=20, max=50, label='' ) T2_product1 = models.IntegerField() T2_price1 = models.IntegerField() T2_payoff1 = models.IntegerField() T2_product2 = models.IntegerField() T2_price2 = models.IntegerField() T2_payoff2 = models.IntegerField() buyer_choice = models.IntegerField( min=0, max=2) T2_payoff = models.IntegerField() ##### FRAGEBOGEN ###### age = models.IntegerField( min=16, max=99, label="" ) sex = models.IntegerField( widget=widgets.RadioSelect, choices=[ [0, "weiblich"], [1, "männlich"], [2, "divers"] ], label="", ) experience = models.IntegerField( widget=widgets.RadioSelect, choices=[ [0, "noch nie"], [1, "1 bis 2 mal"], [2, "3 bis 5 mal"], [3, "öfter"] ], label="", ) studies = models.StringField( label="" ) semester = models.IntegerField( min=0, label="" ) markets1 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ) markets2 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ) markets3 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ) markets4 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ) markets5 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ) markets6 = models.IntegerField( choices=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ) verstanden = models.IntegerField( choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"] ] ) not_harming = models.IntegerField( choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"], ] ) ownpayoff = models.IntegerField( choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"] ] ) utilitarian = models.IntegerField( choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"] ] ) quality_check = models.IntegerField( choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"] ] ) x_tendency_buyer = models.IntegerField( choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"] ] ) belief_buyer_sellers = models.IntegerField() partei = models.IntegerField( widget=widgets.RadioSelect, choices=[ [1, "SPD"], [2, "Die Grünen"], [3, "CSU"], [4, "CDU"], [5, "Die Linke"], [6, "FDP"], [7, "AfD"], [8, "Andere Partei"] ] ) pol_selbstein = models.IntegerField( 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()