from ._builtin import Page import time class MyPage(Page): def is_displayed(self): return self.round_number <= self.session.num_rounds def get_timeout_seconds(self): return 50000 def before_next_page(self): if self.timeout_happened: self.player.timeout_happened = True class Dobble(MyPage): form_model = 'player' form_fields = ['dobble_answer', 'answer_time'] def get_timeout_seconds(self): return self.session.config['game_play_timeout_seconds'] def vars_for_template(self): self.template = self.session.config['card_items_number'] return { **self.session.round_cards[self.template][self.round_number], 'template': self.template, 'total_score': 0, 'player_selection': self.player.participant.selection } def before_next_page(self): super().before_next_page() self.template = self.session.config['card_items_number'] self.player.calculate_answer(self.template) if self.player.correct_answer or self.player.timeout_happened: time.sleep(1.2) else: time.sleep(self.session.config['wrong_answer_freeze_time']) if is_end_of_period(self): self.participant.feedback[self.player.participant.selection].append( float(self.participant.period_score) / float(self.session.config['rounds'])) class NewThemeIntro(MyPage): form_model = 'player' form_fields = ['selection'] def is_displayed(self): is_displayed = super().is_displayed() and self.round_number % self.session.config['rounds'] == 1 if is_displayed: self.player.new_period() return is_displayed def before_next_page(self): if self.timeout_happened: self.player.is_dropout = True self.player.participant.vars['dropout'] = self.player.is_dropout else: self.player.is_dropout = False self.player.participant.vars['dropout'] = self.player.is_dropout self.player.participant.selection = self.player.selection def vars_for_template(self): return { "timeout_seconds": self.session.config['timeout_seconds'], "period_number": get_current_period_number(self) } class Feedback(MyPage): def is_displayed(self): return super().is_displayed() and is_end_of_period(self) def vars_for_template(self): return { "animal_theme_max_average": max(self.session.feedback['Animal'], default=0.0), "food_theme_max_average": max(self.session.feedback['Food'], default=0.0), "logo_theme_max_average": max(self.session.feedback['Summer'], default=0.0), "player_theme_average": float(self.player.participant.period_score) / float(self.session.config['rounds']), "player_selection": self.player.participant.selection, "maximum_y_value": self.session.config['game_play_timeout_seconds'], "others_animal_feedback": self.player.others_animal_feedback.split(), "others_food_feedback": self.player.others_food_feedback.split(), "others_summer_feedback": self.player.others_summer_feedback.split(), } def is_first_round(self): return self.round_number == 1 def is_end_of_period(self): return self.round_number % self.session.config['rounds'] == 0 def get_current_period_number(self): return int(self.round_number / self.session.config['rounds']) + 1 class Dobble4(Dobble): is_displayed = is_first_round template = 4 class Dobble6(Dobble): is_displayed = is_first_round template = 6 class Dobble8(Dobble): is_displayed = is_first_round template = 8 class SelectionDropout(Page): def is_displayed(self): return self.player.participant.vars.get('dropout', False) page_sequence = [NewThemeIntro, SelectionDropout, Dobble, Feedback]