from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'Basegame' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 10 MIN_ENDOWMENT = 250.0 MAX_ENDOWMENT = 750.0 TAX = 50.0 P1_ROLE = 'Импортёр' P2_ROLE = 'Инспектор' WEALTH = 200.0 MULTIPLIER = 2.0 REWARD = 150.0 class Subsession(BaseSubsession): pass class Group(BaseGroup): real_endowment = models.IntegerField(min=0, max = 1000) p1_legal = models.IntegerField(label = "Сколько вы хотите провезти через таможню легально, заплатив пошлину?" ) p1_bribe = models.IntegerField(min=0, max=250, initial=0, label="Cколько вы готовы запллатить за нелегальный провоз?") p1_unlegal = models.IntegerField(min=0, max=1000, initial=0, label="Сколько вы готовы провезти нелегально?" ) def p1_legal_error_message(self, value): print('p1_legal value is', value) if value*1.1 > self.real_endowment: return 'С учетом пошлины в 10% это больше, чем у Вас есть!' def p1_unlegal_1 (group): return 1.0*group.real_endowment-group.p1_legal def tax_1 (group): return group.p1_legal*(C.TAX/100) def set_payoffs(group): p1 = group.get_player_by_role(1) p2 = group.get_player_by_role(2) p1.payoff = 1.0*group.p1_legal-group.tax_1-group.p1_bribe+group.p1_unlegal p2.payoff = 1.0*C.WEALTH+group.p1_bribe*C.MULTIPLIER p2_acception = models.BooleanField (initial=False, blank=True, choices= [[True, "Да, принимаю"], [False, "Нет, не принимаю"], ], label='Принимаете ли Вы взятку?' ) p2_reward = models.BooleanField ( initial=False, choices= [[True, "Да, воспользуюсь"], [False, "Нет, не воспользуюсь"], ], label= 'Воспользуетесь ли вы возможностью рассказать о сговоре надзорным органам, ' 'получив при этом указанную сумму денег?' ) p2_dos = models.BooleanField( choices=[[True, "Досмотреть"], [False, "Не досматривать"], ], label='Досмотреть партию товара?' ) class Player(BasePlayer): name = models.StringField(label='Укажите Ваше имя') surname = models.StringField(label='Укажите Вашу фамилию') age = models.IntegerField(min=0, label='Для того, чтобы начать введите Ваш возраст:') sex = models.IntegerField( choices=[ [1, 'Мужской'], [2, 'Женский'], ], widget=widgets.RadioSelect, label="Укажите Ваш пол" ) risk = models.IntegerField( choices=[ [-3, 'Высоко рискую'], [-2, 'Склонен к риску'], [-1, 'Мало рискую'], [0, 'Нейтрален к риску'], [1, 'Не склонен к риску'], [2, 'Осторожен'], [3, 'Максимально осторожен'], ], widget = widgets.RadioSelectHorizontal, label="Насколько по Вашему мнению вы склонны к риску?" ) # Тест на 5-ти факторный опросник личности ex1 = models.IntegerField( choices=[ [-3, '-3'], [-2, '-2'], [-1, '-1'], [0, '0'], [1, '1'], [2, '2'], [3, '3'], ], widget=widgets.RadioSelectHorizontal, label="Я воспринимаю себя как открытого, полного энтузиазма" ) fre1 = models.IntegerField( choices=[ [-3, '-3'], [-2, '-2'], [-1, '-1'], [0, '0'], [1, '1'], [2, '2'], [3, '3'], ], widget=widgets.RadioSelectHorizontal, label="Я воспринимаю себя как критичного, склонного спорить" ) con1 = models.IntegerField( choices=[ [-3, '-3'], [-2, '-2'], [-1, '-1'], [0, '0'], [1, '1'], [2, '2'], [3, '3'], ], widget=widgets.RadioSelectHorizontal, label="Я воспринимаю себя как надежного и дисциплинированного" ) emo1 = models.IntegerField( choices=[ [-3, '-3'], [-2, '-2'], [-1, '-1'], [0, '0'], [1, '1'], [2, '2'], [3, '3'], ], widget=widgets.RadioSelectHorizontal, label="Я воспринимаю себя как тревожного, меня легко расстроить" ) open1 = models.IntegerField( choices=[ [-3, '-3'], [-2, '-2'], [-1, '-1'], [0, '0'], [1, '1'], [2, '2'], [3, '3'], ], widget=widgets.RadioSelectHorizontal, label="Я воспринимаю себя как открытого для нового опыта, сложного" ) ex2 = models.IntegerField( choices=[ [-3, '-3'], [-2, '-2'], [-1, '-1'], [0, '0'], [1, '1'], [2, '2'], [3, '3'], ], widget=widgets.RadioSelectHorizontal, label="Я воспринимаю себя как замкнутого, тихого" ) fre2 = models.IntegerField( choices=[ [-3, '-3'], [-2, '-2'], [-1, '-1'], [0, '0'], [1, '1'], [2, '2'], [3, '3'], ], widget=widgets.RadioSelectHorizontal, label="Я воспринимаю себя как сочувствующего, сердечного" ) con2 = models.IntegerField( choices=[ [-3, '-3'], [-2, '-2'], [-1, '-1'], [0, '0'], [1, '1'], [2, '2'], [3, '3'], ], widget=widgets.RadioSelectHorizontal, label="Я воспринимаю себя как неорганизованного, беспечного" ) emo2 = models.IntegerField( choices=[ [-3, '-3'], [-2, '-2'], [-1, '-1'], [0, '0'], [1, '1'], [2, '2'], [3, '3'], ], widget=widgets.RadioSelectHorizontal, label="Я воспринимаю себя как спокойного, эмоционально устойчивого" ) open2 = models.IntegerField( choices=[ [-3, '-3'], [-2, '-2'], [-1, '-1'], [0, '0'], [1, '1'], [2, '2'], [3, '3'], ], widget=widgets.RadioSelectHorizontal, label="Я воспринимаю себя как обыкновенного, не творческого" ) WF = models.IntegerField( choices=[ [-2, 'Низкий'], [-1, 'Ниже среднего'], [0, 'Средний'], [1, 'Выше среднего'], [2, 'Высокий'], ], widget=widgets.RadioSelectHorizontal, label="Каков по Вашему мнению Ваш ежемесячный доход?" ) # PAGES class Game1(Page): form_model = 'group' form_fields = ['p1_legal'] def is_displayed(self): return self.role == C.P1_ROLE def vars_for_template(self): return { 'subsession': self.subsession, 'group': self.group, 'c_endowment': self.group.real_endowment, 'c_tax': C.TAX, 'max_legal': self.group.real_endowment/(1+0.01*C.TAX) } def error_message(self, values): if values['p1_legal']*(1+0.01*C.TAX) - self.group.real_endowment > 0.01: print(values['p1_legal']*(1+0.01*C.TAX)) return 'На это Вам не хватит денег! :(' class Game2(Page): form_model = 'group' form_fields = ['p2_dos'] def is_displayed(self): return self.role == C.P2_ROLE def vars_for_template(self): return { 'subsession': self.subsession, 'group': self.group } class Game3(Page): form_model = 'group' form_fields = ['p2_acception'] def is_displayed(self): return (self.role == C.P2_ROLE) and (self.group.p2_dos) and (self.group.real_endowment - self.group.p1_legal - self.group.p1_legal * (C.TAX / 100) - self.group.p1_bribe > 0.99) def vars_for_template(self): return { 'subsession': self.subsession, 'group': self.group, 'reward': C.REWARD, 'is_bribe': self.group.p1_bribe>0 } class Results(Page): def vars_for_template(self): return { 'real_endowment': self.group.real_endowment, 'p1_legal': self.group.p1_legal, 'p1_unlegal': self.group.p1_unlegal, 'p1_bribe': self.group.p1_bribe, 'p2_dos': self.group.p2_dos, 'p2_acception': self.group.p2_acception, 'p2_reward': self.group.p2_reward, 'c_reward': C.REWARD, 'c_wealth': C.WEALTH, 'round_number': self.round_number, 'tax_amount': round(0.1*self.group.p1_legal), 'real_value': self.group.p1_legal+self.group.p1_unlegal, 'is_bribe': self.group.p1_bribe>0 } class JustWaitPage(WaitPage): pass class ResultsWaitPage(WaitPage): def after_all_players_arrive(group: Group): print('in after_all_players_arrive') print(group.p1_legal) print(group.p1_bribe) print(group.p1_unlegal) p1 = group.get_player_by_role(C.P1_ROLE) p2 = group.get_player_by_role(C.P2_ROLE) tax = group.tax_1() if group.p2_dos: #досматривает if group.p2_acception: #принимает взятку if group.p2_reward: #сдает импортера властям p1.payoff = group.p1_legal p2.payoff = 1.0*C.WEALTH + C.REWARD else: #не сдает и оставляет себе взятку p1.payoff = group.p1_legal + group.p1_unlegal p2.payoff = 1.0*C.WEALTH + group.p1_bribe else: #не принимает взятку, но досматривает p1.payoff = group.p1_legal p2.payoff = 1.0 * C.WEALTH else: #не досматривает p1.payoff = group.p1_legal + group.p1_unlegal + group.p1_bribe p2.payoff = 1.0 * C.WEALTH def vars_for_template(self): return { 'subsession': self.subsession, 'group': self.group } class Introduction(Page): form_model = 'player' form_fields = ['name', 'surname', 'age', 'sex', 'risk', 'WF'] def is_displayed(player): return player.round_number == 1 def vars_for_template(self): return { 'subsession': self.subsession, 'group': self.group } class Selfreporting(Page): form_model = 'group' form_fields = ['p2_reward'] def is_displayed(self): print("Зашли сюда") if self.role == C.P1_ROLE: print("Selfreporting импортер") return False else: print("Selfreporting инспектор") if not self.group.p2_dos: return False else: print("Selfreporting инспектор досматривает") print(self.group.p2_acception) print(self.round_number) return self.group.p2_acception & (self.round_number > 5) def vars_for_template(self): return { 'subsession': self.subsession, 'group': self.group, 'reward': C.REWARD } class Game5(Page): def is_displayed(self): return (self.role == C.P2_ROLE) & (self.group.real_endowment - self.group.p1_legal - self.group.p1_legal * (C.TAX / 100) - self.group.p1_bribe < 1) class Game4(Page): form_model = 'group' form_fields = ['p1_bribe'] timeout_seconds = 180 def is_displayed(self): return (self.role == C.P1_ROLE) and self.group.real_endowment - self.group.p1_legal - self.group.p1_legal * (C.TAX / 100) - self.group.p1_bribe >= 1 def vars_for_template(self): return { 'p1_legal': self.group.p1_legal, 'real_endowment': self.group.real_endowment, 'total_tax': self.group.p1_legal*(C.TAX/100), 'total_remains': self.group.real_endowment - self.group.p1_legal - self.group.p1_legal*(C.TAX/100) } @staticmethod def before_next_page(player, timeout_happened): group = player.group if group.real_endowment - group.p1_legal - group.p1_legal * (C.TAX / 100) - group.p1_bribe >= 1: group.p1_unlegal = int(group.real_endowment - group.p1_legal - group.p1_legal * (C.TAX / 100) - group.p1_bribe) else: group.p1_unlegal = 0 if timeout_happened: print('Timeout') class Test(Page): form_model = 'player' form_fields = ['ex1', 'fre1', 'con1', 'emo1', 'open1', 'ex2', 'fre2', 'con2', 'emo2', 'open2'] def is_displayed(player): return player.round_number == 1 def vars_for_template(self): return { 'subsession': self.subsession, 'group': self.group } # FUNCTIONS def creating_session(subsession: Subsession): import random print('in creating_session', subsession.round_number) for curr_group in subsession.get_groups(): curr_group.real_endowment = random.randint(C.MIN_ENDOWMENT, C.MAX_ENDOWMENT) print('real_endowment', curr_group.real_endowment) page_sequence = [Introduction, Test, Game1, Game4, JustWaitPage, Game2, Game3, Game5, Selfreporting, ResultsWaitPage, Results] #