from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Vartanov' doc = """ Изучаем отношение к риску """ class Constants(BaseConstants): name_in_url = 'risk_vs_advrtsmnt' players_per_group = None num_rounds = 11 lotteries_array = ['risk_vs_advrtsmnt/Lottery1.html', 'risk_vs_advrtsmnt/Lottery2.html', 'risk_vs_advrtsmnt/Lottery3.html', 'risk_vs_advrtsmnt/Lottery4.html', 'risk_vs_advrtsmnt/Lottery5.html', 'risk_vs_advrtsmnt/Lottery6.html', 'risk_vs_advrtsmnt/Lottery7.html', 'risk_vs_advrtsmnt/Lottery8.html', 'risk_vs_advrtsmnt/Lottery9.html', 'risk_vs_advrtsmnt/Lottery10.html', 'risk_vs_advrtsmnt/Lottery11.html', 'risk_vs_advrtsmnt/Lottery12.html', 'risk_vs_advrtsmnt/Lottery13.html', 'risk_vs_advrtsmnt/AdvertisementPage.html'] class Subsession(BaseSubsession): random_outcome = models.PositiveIntegerField() a_payoff = models.IntegerField() b_payoff = models.IntegerField() c_payoff = models.IntegerField() alternatives = models.IntegerField() def creating_session(self): self.random_outcome = random.randint(1, 1000) playrs = self.get_players() if self.round_number == 1: paying_round = random.randint(1, Constants.num_rounds) self.session.vars['paying_round'] = paying_round if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 499: self.b_payoff = 2 else: self.b_payoff = 0 self.alternatives = 2 elif self.round_number == 2: self.alternatives = 3 if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 499: self.b_payoff = 1 else: self.b_payoff = 0 if self.random_outcome <= 499: self.c_payoff = 2 else: self.c_payoff = 0 elif self.round_number == 3: self.alternatives = 3 if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 499: self.b_payoff = 2 else: self.b_payoff = 0 if self.random_outcome <= 249: self.c_payoff = 2 else: self.c_payoff = 0 elif self.round_number == 4: self.alternatives = 3 if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 748: self.b_payoff = 1 else: self.b_payoff = 0 if self.random_outcome <= 499: self.c_payoff = 2 else: self.c_payoff = 0 elif self.round_number == 5: self.alternatives = 3 if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 499: self.b_payoff = 2 else: self.b_payoff = 0 if self.random_outcome <= 100: self.c_payoff = 3 else: self.c_payoff = 0 elif self.round_number == 6: self.alternatives = 2 if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 499: self.b_payoff = 2 else: self.b_payoff = 0 elif self.round_number == 7: self.alternatives = 2 if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 499: self.b_payoff = 2 else: self.b_payoff = 0 elif self.round_number == 8: self.alternatives = 3 if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 499: self.b_payoff = 1 else: self.b_payoff = 0 if self.random_outcome <= 524: self.c_payoff = 2 else: self.c_payoff = 0 elif self.round_number == 9: self.alternatives = 3 if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 499: self.b_payoff = 2 else: self.b_payoff = 0 if self.random_outcome <= 249: self.c_payoff = 2 else: self.c_payoff = 0 elif self.round_number == 10: self.alternatives = 3 if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 748: self.b_payoff = 1 else: self.b_payoff = 0 if self.random_outcome <= 499: self.c_payoff = 2 else: self.c_payoff = 0 else: self.alternatives = 3 if self.random_outcome <= 900: self.a_payoff = 1 else: self.a_payoff = 0 if self.random_outcome <= 499: self.b_payoff = 2 else: self.b_payoff = 0 if self.random_outcome <= 100: self.c_payoff = 3 else: self.c_payoff = 0 class Group(BaseGroup): def set_payoffs(self): playrs = self.get_players() for p in playrs: if self.subsession.alternatives == 2: p.decision = p.decision_binary if p.decision_binary == 'A': p.current_payoff = self.subsession.a_payoff else: p.current_payoff = self.subsession.b_payoff else: p.decision = p.decision_ternary if p.decision_ternary == 'A': p.current_payoff = self.subsession.a_payoff elif p.decision_ternary == 'B': p.current_payoff = self.subsession.b_payoff else: p.current_payoff = self.subsession.c_payoff p.random_outcome = self.subsession.random_outcome p.pay_round = False if self.round_number == self.session.vars['paying_round']: p.total_payoff = p.current_payoff p.pay_round = True class Player(BasePlayer): decision_binary = models.CharField( choices=['A', 'B'], verbose_name='Альтернатива', widget=widgets.RadioSelectHorizontal) decision_ternary = models.CharField( choices=['A', 'B', 'C'], verbose_name='Альтернатива', widget=widgets.RadioSelectHorizontal) current_payoff = models.IntegerField() random_outcome = models.PositiveIntegerField() room_group = models.CharField( choices=['417', '303', 'На удаленке, дома', '304'], verbose_name='Номер кабинета', widget=widgets.RadioSelect) student_group = models.CharField( choices=['401', '402', '403', '404'], verbose_name='Номер группы', widget=widgets.RadioSelect) risky_ad = models.BooleanField() determ_ad = models.BooleanField() consum_ad = models.BooleanField() determophob_ad = models.BooleanField() text_ad = models.BooleanField() visual_ad = models.BooleanField() any_ad = models.BooleanField() total_payoff = models.PositiveIntegerField() pay_round = models.BooleanField() decision = models.CharField()