import random from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) from otree.db.models import ForeignKey, Model from random import randint author = 'Your name here' doc = """ Your app description """ class BaseSlider(Model): class Meta: abstract = True minimum = models.IntegerField(initial=0) maximum = models.IntegerField(initial=100) start_pos = models.IntegerField() end_pos = models.IntegerField() touched = models.BooleanField(initial=False) centered = models.BooleanField(initial=False) def set_starting_pos(self): self.start_pos = randint(self.minimum, self.maximum) while self.start_pos == (self.maximum - self.minimum) / 2: self.start_pos = randint(self.minimum, self.maximum) def distance_from_center(self): return abs((self.minimum + self.maximum)/2 - int(self.end_pos)) def is_centered(self): self.centered = self.distance_from_center() == 0 return self.centered class SliderPlayer(BasePlayer): class Meta: abstract = True centered_sliders = models.IntegerField() num_sliders = models.PositiveIntegerField() slider_min = models.IntegerField() slider_max = models.IntegerField() def prepare_sliders(self, num=50, min=0, max=100): self.num_sliders = num self.slider_min = min self.slider_max = max for _ in range(self.num_sliders): slider = self.slider_set.create() slider.minimum = self.slider_min slider.maximum = self.slider_max slider.set_starting_pos() slider.save() def count_centered_sliders(self): sum_of_centered = 0 for s in self.slider_set.all(): if s.touched and s.centered: sum_of_centered += 1 self.centered_sliders = sum_of_centered self.participant.vars["sliders"].append(self.centered_sliders) class Player(SliderPlayer): payoff1 = models.CurrencyField() payoff2 = models.CurrencyField() payoff3 = models.CurrencyField() payoff_per_slider1 = models.CurrencyField() payoff_per_slider2 = models.CurrencyField() payoff_per_slider3 = models.CurrencyField() slider_expectation1 = models.IntegerField(min=0, max=48, label="Slider tahmininiz") slider_expectation2 = models.IntegerField(min=0, max=48, label="Slider tahmininiz") slider_expectation3 = models.IntegerField(min=0, max=48, label="Slider tahmininiz") offer_expectation1 = models.IntegerField(min=10, max=100, label="Teklif beklentiniz") offer_expectation2 = models.IntegerField(min=10, max=100, label="Teklif beklentiniz") offer_expectation3 = models.IntegerField(min=10, max=100, label="Teklif beklentiniz") payment_round = models.IntegerField() practice_1 = models.StringField() practice_2 = models.StringField() practice_3 = models.StringField() practice_4 = models.StringField() ad_soyad = models.StringField() mail_tlf = models.StringField() yas = models.StringField() cinsiyet = models.StringField(choices=["Erkek", "Kadın", "Belirtmek İstemiyorum"]) egitim = models.StringField(choices=["Lise", "Üniversite", "Yüksek Lisans"]) class Constants(BaseConstants): name_in_url = 'principal_agent_control' instructions_template = 'principal_agent_control/instructions.html' players_per_group = None num_rounds = 1 multiplier = 1 slider_columns = 4 endowment = c(100) class Subsession(BaseSubsession): def creating_session(self): for p in self.get_players(): if 'sliders' not in p.participant.vars: p.participant.vars["sliders"] = [] if 'payoffs' not in p.participant.vars: p.participant.vars["payoffs"] = [] p.prepare_sliders(num=48, min=0, max=100) class Group(BaseGroup): offer_amount1 = models.CurrencyField( min=10, max=Constants.endowment, doc="""Amount offered by P1""", label="Lütfen 10 ile 100 arasında bir teklif yapın. Eşleştiğiniz kişi sizin teklifinizi aldıktan sonra slider oyununu oynayacaktır. Kazancınız deney kurallarında belirtildiği şekilde belirlenecektir." ) offer_amount2 = models.CurrencyField( min=10, max=Constants.endowment, doc="""Amount offered by P1""", label="Lütfen 10 ile 100 arasında bir teklif yapın. Eşleştiğiniz kişi sizin teklifinizi aldıktan sonra slider oyununu oynayacaktır. Kazancınız deney kurallarında belirtildiği şekilde belirlenecektir." ) offer_amount3 = models.CurrencyField( min=10, max=Constants.endowment, doc="""Amount offered by P1""", label="Lütfen 10 ile 100 arasında bir teklif yapın. Eşleştiğiniz kişi sizin teklifinizi aldıktan sonra slider oyununu oynayacaktır. Kazancınız deney kurallarında belirtildiği şekilde belirlenecektir." ) def centered_sliders(self): p2 = self.get_player_by_id(2) return p2.centered_sliders def offer_calculate1(self): p2 = self.get_player_by_id(2) p2.payoff_per_slider1 = (Constants.endowment - self.offer_amount1 * Constants.multiplier) def offer_calculate2(self): p2 = self.get_player_by_id(2) p2.payoff_per_slider2 = (Constants.endowment - self.offer_amount2 * Constants.multiplier) def offer_calculate3(self): p2 = self.get_player_by_id(2) p2.payoff_per_slider3 = (Constants.endowment - self.offer_amount3 * Constants.multiplier) def set_payoffs1(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p1.payoff1 = (Constants.endowment - self.offer_amount1 * Constants.multiplier) * p2.centered_sliders p2.payoff1 = self.offer_amount1 * Constants.multiplier * p2.centered_sliders p1.participant.vars["payoffs"].append(p1.payoff1) p2.participant.vars["payoffs"].append(p2.payoff1) def set_payoffs2(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p1.payoff2 = (Constants.endowment - self.offer_amount2 * Constants.multiplier) * p2.centered_sliders p2.payoff2 = self.offer_amount2 * Constants.multiplier * p2.centered_sliders p1.participant.vars["payoffs"].append(p1.payoff2) p2.participant.vars["payoffs"].append(p2.payoff2) def set_payoffs3(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p1.payoff3 = (Constants.endowment - self.offer_amount3 * Constants.multiplier) * p2.centered_sliders p2.payoff3 = self.offer_amount3 * Constants.multiplier * p2.centered_sliders p1.participant.vars["payoffs"].append(p1.payoff3) p2.participant.vars["payoffs"].append(p2.payoff3) def set_all_payoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) random1 = random.randint(0,2) p1.payment_round = random1 + 1 random2 = random.randint(0,2) p2.payment_round = random2 + 1 p1.payoff = p1.participant.vars["payoffs"][random1] p2.payoff = p2.participant.vars["payoffs"][random2] class Slider(BaseSlider): player = ForeignKey(Player,on_delete=models.CASCADE)