from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) from otree.models import player author = 'Timo Promann' doc = """ This is a one-stage group decision game with 2 players per group. """ class Constants(BaseConstants): name_in_url = 'mastergame_groups' players_per_group = 2 num_rounds = 1 minrandom = 1 maxrandom = 6 stakes = c(1) not_correct_answer = c(0) not_correct_report = c(0) coef = 0.2 base_payoff = c(1) payoffs = [0.2, 0.4, 0.6, 0.8, 1, 0] PayoffTable_template = 'mastergame_groups/PayoffTable.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): correct_report = models.BooleanField() def set_payoffs(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) self.correct_report = p1.numberreport == p2.numberreport for p in self.get_players(): if self.correct_report: p.payoff = (p.numberreport * Constants.coef) * (p.numberreport != 6) else: p.payoff = Constants.not_correct_report print(f"REPORT CORRECT {self.correct_report}") print(f'Player {p.id_in_group} reported {p.numberreport}') print(f'Player {p.id_in_group} payoff {p.payoff}') class Player(BasePlayer): honest_report = models.BooleanField() numberreport = models.IntegerField(min=1, max=6, doc="""The number, you chose to report""") age = models.IntegerField() gender = models.StringField(choices=['Female', 'Male', 'Divers'], widget=widgets.RadioSelectHorizontal) income = models.StringField(choices=['<10.000', '10.000-19.999', '20.000-29.999', '30.000-39.999', '40.000-49.999', '50.000-59.999', '60.000-69.999', '70.000-79.999', '80.000-89.999', '90.000-99.999', '100.000<', 'Rather not say']) patience = models.IntegerField(widget=widgets.Slider(), min=0, max=10) negrecip1 = models.IntegerField(widget=widgets.Slider(), min=0, max=10) negrecip2 = models.IntegerField(widget=widgets.Slider(), min=0, max=10) altruism = models.IntegerField(widget=widgets.Slider(), min=0, max=10) risktaking = models.IntegerField(widget=widgets.Slider(), min=0, max=10) posrecip = models.IntegerField(widget=widgets.Slider(), min=0, max=10) negrecip3 = models.IntegerField(widget=widgets.Slider(), min=0, max=10) trust = models.IntegerField(widget=widgets.Slider(), min=0, max=10) feedback = models.LongStringField(blank=True) videochat = models.StringField(choices=['Yes', 'No'], widget=widgets.RadioSelectHorizontal) videochat_problems = models.LongStringField(blank=True) answer_to_question1 = models.StringField(choices=['0.2', '0.4', '0.6', '0.8', '1', '0'], widget=widgets.RadioSelectHorizontal) answer_to_question2 = models.StringField(choices=['0.2', '0.4', '0.6', '0.8', '1', '0'], widget=widgets.RadioSelectHorizontal) is_not_correct = models.BooleanField() is_not_correct2 = models.BooleanField() def check_correct(self): self.is_not_correct = (self.answer_to_question1 != '0') self.is_not_correct2 = (self.answer_to_question2 != '0.2')