from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random import itertools import numpy as np class Constants(BaseConstants): name_in_url = 'sellers' players_per_group = 4 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) p3 = self.get_player_by_id(3) p4 = self.get_player_by_id(4) for i in range(1, Constants.num_rounds +1): p1.in_round(i).type = 'seller' p2.in_round(i).type = 'seller' p3.in_round(i).type = 'buyer' p4.in_round(i).type = 'C' offer_order = models.IntegerField() def set_offer_order(self): self.offer_order = random.randint(0, 1) def product_offered(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p1.T2_product = random.choice('XY') if p1.T2_product == 'Y': p2.T2_product = 'X' else: p2.T2_product = random.choice('XY') def T2_payoff_calc(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p3 = self.get_player_by_id(3) p4 = self.get_player_by_id(4) if p3.buyer_choice == 0: p1.T2_payoff = 80 p2.T2_payoff = 80 p3.T2_payoff = 80 p4.T2_payoff = 80 elif p3.buyer_choice == 1: if self.offer_order == 0: if p1.T2_product == 'X': p1.T2_payoff = 80 + p1.seller_price_X p2.T2_payoff = 80 p3.T2_payoff = 80 + 50 - p1.seller_price_X p4.T2_payoff = 20 else: p1.T2_payoff = 80 + p1.seller_price_Y p2.T2_payoff = 80 p3.T2_payoff = 80 + 50 - p1.seller_price_Y p4.T2_payoff = 80 else: if p2.T2_product == 'X': p1.T2_payoff = 80 p2.T2_payoff = 80 + p2.seller_price_X p3.T2_payoff = 80 + 50 - p2.seller_price_X p4.T2_payoff = 20 else: p1.T2_payoff = 80 p2.T2_payoff = 80 + p2.seller_price_Y p3.T2_payoff = 80 + 50 - p2.seller_price_Y p4.T2_payoff = 80 elif p3.buyer_choice == 2: if self.offer_order == 0: if p2.T2_product == 'X': p1.T2_payoff = 80 p2.T2_payoff = 80 + p2.seller_price_X p3.T2_payoff = 80 + 50 - p2.seller_price_X p4.T2_payoff = 20 else: p1.T2_payoff = 80 p2.T2_payoff = 80 + p2.seller_price_Y p3.T2_payoff = 80 + 50 - p2.seller_price_Y p4.T2_payoff = 80 else: if p1.T2_product == 'X': p1.T2_payoff = 80 + p1.seller_price_X p2.T2_payoff = 80 p3.T2_payoff = 80 + 50 - p1.seller_price_X p4.T2_payoff = 20 else: p1.T2_payoff = 80 + p1.seller_price_Y p2.T2_payoff = 80 p3.T2_payoff = 80 + 50 - p1.seller_price_Y p4.T2_payoff = 80 ##### 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 zwei Verkäufern, einem Käufer und einem Teilnehmer C wird in jeder der 24 Runden nach dem Zufallsprinzip neu zusammengestellt."], [1, "Jede Gruppe bestehend aus zwei Verkäufern, einem Käufer und einem Teilnehmer C bleibt während der 24 Runden bestehen."], [2, "Jede Gruppe bestehend aus zwei Verkäufern, einem Käufer und einem Teilnehmer C wird nach der Hälfte der Runden nach dem Zufallsprinzip neu zusammengestellt."] ], label="" ) control2 = models.IntegerField( widget=widgets.RadioSelect, choices=[ [0, "behält er seine Anfangsausstattung von 80 Punkten."], [1, "erhält er seine Anfangsausstattung von 80 Punkten plus den Preis, den er für sein Produkt verlangt."], [2, "erhält er seine Anfangsausstattung von 80 Punkten plus 50 Punkte."] ], label="" ) 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 zwei Verkäufern, einem Käufer und einem Teilnehmer C' ' wird in jeder der 24 Runden nach dem Zufallsprinzip neu zusammengestellt.') def control2_error_message(player, value): if value != 1: player.cont2_false += 1 return ('Wenn ein Verkäufer sein Produkt verkauft, ' 'erhält er seine Anfangsausstattung von 80 Punkten plus den Preis, den er für sein Produkt verlangt.') 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 C. ' 'Der Teilnehmer C 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 C.' ' Somit ist die Auszahlung von Teilnehmer C: 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 C. ' 'Der Teilnehmer C 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() belief_buyer_sellers = models.IntegerField( choices=[ [1, "R0"], [2, "R1"], [3, "R2"], [4, "R3"], [5, "R4"], [6, "R5"] ] ) 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()