from ._builtin import Page import time import math class MyPage(Page): def is_displayed(self): return self.round_number <= self.session.num_rounds def get_timeout_seconds(self): return self.session.config['timeout_seconds'] 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_new_period = super().is_displayed() and (self.round_number - 1) % self.session.config['rounds'] == 0 if is_new_period: self.player.new_period() return is_new_period and self.round_number == 1 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): form_model = 'player' form_fields = ['selection'] def is_displayed(self): return super().is_displayed() and is_end_of_period(self) def get_timeout_seconds(self): return self.session.config['graph_timeout_seconds'] 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(), "the_other_players_id_for_feedback": self.player.participant.other_chosen_players, "timeout_seconds": self.session.config['graph_timeout_seconds'], "period_number": get_current_period_number(self), "next_period_number": get_current_period_number(self) + 1, "last_period": get_current_period_number(self) >= self.session.config['periods'], 'enforce_wait_time': self.session.config['enforce_wait_time'] * 1000 } 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.field_maybe_none('selection') def get_form_fields(self): if get_current_period_number(self) < self.session.config['periods']: return ['selection'] else: return [] 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(math.ceil(self.round_number / self.session.config['rounds'])) 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) def vars_for_template(self): return { 'redirect_url': self.session.config['timeout_dropout'] } page_sequence = [NewThemeIntro, SelectionDropout, Dobble, Feedback]