from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import pandas as pd def create_pages(sequence: list, page_group_number: int): page_group = Constants.PAGES_DATA[Constants.PAGES_DATA.page_group == page_group_number] for index, row in page_group.iterrows(): page_name = str(row['page']) if not pd.isna(row['page']) else None parent_page = str(row['parent_page']) if not pd.isna(row['parent_page']) else "DefaultPage" title = str(row['title']) if not pd.isna(row['title']) else "" instructions = str(row['instructions']) if not pd.isna(row['instructions']) else "" hide_lines = bool(row['hide_lines']) if not pd.isna(row['hide_lines']) else False page = type(page_name, (globals()[parent_page],), {"title": title, "instructions": instructions, "hide_lines": hide_lines}) globals()[page_name] = page sequence.append(page) class TimeoutPage(Page): def get_timeout_seconds(self): return self.player.get_timeout_seconds() def before_next_page(self): if self.timeout_happened: self.player.drop_out() def is_displayed(self): return self.player.is_displayed() class DefaultPage(TimeoutPage): template_name = "ma_jan/templates/DefaultTemplate.html" form_model = 'player' title = "" instructions = "" hide_lines = False other_list = [] randomization_list = [] def get_form_fields(self): randomized_questions = self.participant.vars.get(f'{self.__class__.__name__}_questions', []) if len(self.form_fields) > 0: return self.form_fields elif len(randomized_questions) > 0: return randomized_questions else: return self.player.get_formfields_for_page(self.__class__.__name__) def vars_for_template(self) -> dict: if len(self.other_list) > 0: other_list = self.other_list else: other_list = self.player.get_other_list(self.__class__.__name__) return dict( title=self.title, instructions=self.instructions, other_list=other_list, randomization_list=self.randomization_list, hide_lines=self.hide_lines, ) def before_next_page(self): super().before_next_page() class Introduction(TimeoutPage): template_name = "ma_jan/orga/Introduction.html" def vars_for_template(self) -> dict: return dict( timeout_minutes=self.session.config.get("timeout_minutes", 90) ) def before_next_page(self): super().before_next_page() class Instructions(TimeoutPage): template_name = "ma_jan/orga/Instructions.html" # TODO: Add red highlighting to higher values than allowed class Vignette(TimeoutPage): template_name = "ma_jan/vignette/Vignette.html" form_model = 'player' def get_form_fields(self): return self.player.get_current_question_names() def error_message(self, values): question_data = self.player.get_current_question() endowment = question_data['productivity_a'] + question_data['productivity_b'] first_answer, second_answer = self.player.get_current_question_names() if values[first_answer] + values[second_answer] > endowment: return 'You can only distribute ' + str(endowment) + ' logs in total.' elif values[first_answer] + values[second_answer] < endowment: return 'Please distribute all ' + str(endowment) + ' logs.' def vars_for_template(self): return self.player.get_data_for_vignette() def before_next_page(self): super().before_next_page() self.player.vignette_index += 1 class Justice(TimeoutPage): template_name = "ma_jan/checkers/Justice.html" form_model = 'player' form_fields = ['checker_attention'] def before_next_page(self): super().before_next_page() if "42" not in self.player.checker_attention: self.player.quality_fails += 1 class SurveyQuestions(TimeoutPage): template_name = "ma_jan/checkers/SurveyQuestions.html" form_model = 'player' def get_form_fields(self): form_fields = [] for item in self.player.participant.vars['order_checker_vignette']: form_fields.append('checker_vignette_{}'.format(item)) return form_fields def before_next_page(self): super().before_next_page() self.player.check_checkers() class LargestAmount(DefaultPage): title = "Questions about the study" def vars_for_template(self) -> dict: template_vars = super().vars_for_template() # TODO: Enable automatic randomization of choices template_vars["randomization_list"] = [ ["checker_logs", self.player.participant.vars.get("order_log_choices")]] return template_vars def before_next_page(self): super().before_next_page() self.player.check_scheite() class Accountability(TimeoutPage): template_name = "ma_jan/vignette/Accountability.html" form_model = 'player' form_fields = ['accountability_need', 'accountability_productivity'] class Results(Page): template_name = "ma_jan/orga/Results.html" page_sequence = [] page_sequence.extend([Introduction, Instructions, ]) page_sequence.extend([Vignette] * len(Constants.VIGNETTE_DATA.index)) create_pages(page_sequence, 3) page_sequence.extend([ Justice, SurveyQuestions, LargestAmount, Accountability, ] ) create_pages(page_sequence, 5) create_pages(page_sequence, 6) create_pages(page_sequence, 7) page_sequence.extend([Results])