from otree.api import Currency as c, currency_range from . import models from ._builtin import Page, WaitPage from .models import Constants import random class Welcome(Page): form_model = 'player' form_fields = ['student_group'] def vars_for_template(self): return { 'second_show': self.subsession.round_number == 7 } def is_displayed(self): return self.round_number == 1 class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): pass def is_displayed(self): return self.round_number < Constants.num_rounds class Results(Page): def vars_for_template(self): russia_paid = self.player.russia_quant*self.subsession.russia_price flowers_paid = self.player.flowers_quant*self.subsession.flowers_price berries_paid = self.player.berries_quant * self.subsession.berries_price total_paid = russia_paid+flowers_paid+berries_paid remainder = self.player.deposit - total_paid to_pay = remainder/2 return { 'player_in_all_rounds': self.player.in_previous_rounds(), 'current_round': self.subsession.round_number, 'berries_total': berries_paid, 'rus_total': russia_paid, 'flowers_total': flowers_paid, 'flowers_bought': self.player.flowers_quant, 'berries_bought': self.player.berries_quant, 'russia_bought': self.player.russia_quant, 'deposit': self.player.deposit, 'total_paid': self.player.russia_quant*self.subsession.russia_price + self.player.flowers_quant*self.subsession.flowers_price + self.player.berries_quant * self.subsession.berries_price, 'remainder': remainder, 'to_pay': to_pay } def is_displayed(self): return self.round_number < Constants.num_rounds class AdvertisementPage(Page): timeout_seconds = 45 def vars_for_template(self): return { 'player_in_all_rounds': self.player.in_previous_rounds(), 'current_round': self.subsession.round_number, 'berries_adv': self.player.berries_ad, 'rus_adv': self.player.russia_ad, 'flowers_adv': self.player.flowers_ad } def is_displayed(self): p = self.player if p.in_round(1).student_group == '401': if self.round_number < 7: p.flowers_ad = False p.russia_ad = False p.berries_ad = False elif p.in_round(1).student_group == '402': if self.round_number > 6: p.flowers_ad = False p.russia_ad = False p.berries_ad = False else: rand_seed = bool(random.getrandbits(1)) if rand_seed: if self.round_number < 7: p.flowers_ad = False p.russia_ad = False p.berries_ad = False else: if self.round_number > 6: p.flowers_ad = False p.russia_ad = False p.berries_ad = False to_show = p.flowers_ad or p.russia_ad or p.berries_ad return to_show and self.round_number < Constants.num_rounds class EstimatePage(Page): form_model = 'player' form_fields = ['my_berries_price', 'my_russia_price', 'my_flowers_price'] def vars_for_template(self): return { 'second_show': self.subsession.round_number == 7, 'student_group': self.player.in_round(1).student_group } def is_displayed(self): return self.round_number == 1 or self.round_number == 7 def error_message(self, values): smth_is_negative = (values['my_berries_price'] < 1 or values['my_russia_price'] < 1 or values['my_flowers_price'] < 1) if smth_is_negative: return 'Цена не должна быть нулевой или отрицательной!' class Purchase(Page): form_model = 'player' form_fields = ['berries_quant', 'russia_quant', 'flowers_quant'] def error_message(self, values): if values['berries_quant']*self.subsession.berries_price + values['russia_quant']*self.subsession.russia_price + values['flowers_quant']*self.subsession.flowers_price > self.player.deposit: return 'На это Вам не хватит денег! :(' def vars_for_template(self): return { 'current_round': self.subsession.round_number, 'deposit': self.player.deposit, 'current_berries': self.subsession.berries_price, 'current_russia': self.subsession.russia_price, 'current_flowers': self.subsession.flowers_price } def is_displayed(self): return self.round_number < Constants.num_rounds class TotalResult(Page): def is_displayed(self): return self.round_number == Constants.num_rounds def vars_for_template(self): pay_round = self.session.vars['paying_round'] p = self.player.in_all_rounds() return { 'paying_round': pay_round, 'choice_string': self.player.in_round(pay_round).choice_string, 'to_pay': self.player.in_round(pay_round).to_pay, 'player_in_all_rounds': p } page_sequence = [ Welcome, EstimatePage, AdvertisementPage, Purchase, Results, ResultsWaitPage, TotalResult ]