from otree.api import Currency as c, currency_range from ._builtin import Page from .models import Constants from collections import Counter import random class Consent(Page): def is_displayed(self): return self.round_number == 1 def before_next_page(self): self.session.vars['loyalty_card_b'] = 0 self.session.vars['loyalty_card_c'] = 0 class Demographics(Page): form_model = 'player' form_fields = ['age', 'gender', 'prolific_id'] def is_displayed(self): return self.round_number == 1 class Instructions(Page): def is_displayed(self): return self.round_number == 1 class Selection(Page): form_model = 'player' form_fields = ['selection'] def before_next_page(self): if self.player.selection == 'A': self.player.score += Constants.add_points self.player.score = self.player.score + random.randint(-4, 4) elif self.player.selection == 'B': self.player.score += Constants.add_points self.session.vars['loyalty_card_b'] += random.choice([2, -1]) if self.session.vars['loyalty_card_b'] >= 10: self.session.vars['loyalty_card_b'] = 0 self.player.extra_rounds = 1 else: self.player.score += Constants.add_points self.session.vars['loyalty_card_c'] += random.choice([0, 1]) if self.session.vars['loyalty_card_c'] >= 10: self.session.vars['loyalty_card_c'] = 0 self.player.extra_rounds = 1 def vars_for_template(self): num_extra_rounds = sum([p.extra_rounds for p in self.player.in_previous_rounds()]) sum_loyalty_b = self.session.vars['loyalty_card_b'] sum_loyalty_c = self.session.vars['loyalty_card_c'] previous_round = self.round_number - 1 if previous_round == 0: previous_round = 1 return { 'current_round': str(self.round_number) + '/' + str(Constants.min_rounds + num_extra_rounds), 'total_score': sum([p.score for p in self.player.in_all_rounds()]), 'previous_round_score': self.player.in_round(previous_round).score, 'loyalty_b': str(sum_loyalty_b) + '/10', 'loyalty_c': str(sum_loyalty_c) + '/10' } class Results(Page): def is_displayed(self): num_extra_rounds = sum([p.extra_rounds for p in self.player.in_previous_rounds()]) if num_extra_rounds == 0: return self.round_number == Constants.min_rounds elif num_extra_rounds == 1: return self.round_number == Constants.min_rounds + 1 else: return self.round_number == Constants.num_rounds def vars_for_template(self): selection_counter = Counter([p.selection for p in self.player.in_all_rounds()]) return { 'total_A_selections': selection_counter['A'], 'total_B_selections': selection_counter['B'], 'total_C_selections': selection_counter['C'], 'total_score': sum([p.score for p in self.player.in_all_rounds()]) } page_sequence = [ Consent, Demographics, Instructions, Selection, Results ]