from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants class Introduction(Page): """Instruction for players how to play game """ def is_displayed(self): return self.round_number == 1 def vars_for_template(self): if self.player.cp_error: return {'message': 'Please, re-read the instructions!', 'endowment': Constants.endowment} else: return {'endowment': Constants.endowment} class Round1(Page): """Info Round 1""" class UQ_s(Page): """Comprehension Question""" form_model = 'player' form_fields = ['uq1', 'uq2', 'uq3'] def is_displayed(self): return self.player.role() == 'sender' # Function to redirect to instructions page if the comprehension answers are wrong: def before_next_page(self): p = self.player p.cp_error = False p.uq4 = 1 p.uq5 = 1 for k, v in Constants.correct_answers.items(): if getattr(p, k) != v: p.cp_error = True break if p.cp_error: for f in self.form_fields: setattr(p, f, None) self._is_frozen = False self._index_in_pages -= 3 self.participant._index_in_pages -= 3 class UQ_r(Page): """Comprehension Question""" form_model = 'player' form_fields = ['uq4', 'uq5'] def is_displayed(self): return self.player.role() == 'receiver' # Function to redirect to instructions page if the comprehension answers are wrong: def before_next_page(self): p = self.player p.cp_error = False p.uq1 = 3 p.uq2 = 1 p.uq3 = 3 for k, v in Constants.correct_answers.items(): if getattr(p, k) != v: p.cp_error = True break if p.cp_error: for f in self.form_fields: setattr(p, f, None) self._is_frozen = False self._index_in_pages -= 4 self.participant._index_in_pages -= 4 class SignalingCredit(Page): """Player chooses whether to signal to show creditworthiness""" form_model = 'player' form_fields = ['change_c', 'change_c_choice', 'unit_change_c_age', 'unit_change_c_weight', 'unit_change_c_height', 'new_age'] def is_displayed(self): return self.player.role() == 'sender' def vars_for_template(self): age = self.participant.vars['age'] weight = self.participant.vars['weight'] height = self.participant.vars['height'] income = self.participant.vars['income'] return {'age': age, 'weight': weight, 'height': height, 'income': income} def before_next_page(self): self.player.update_income = self.participant.vars['income'] if self.player.change_c_choice == 1: self.player.update_age = self.player.participant.vars['age'] + self.player.unit_change_c_age self.player.update_weight = self.player.participant.vars['weight'] self.player.update_height = self.player.participant.vars['height'] elif self.player.change_c_choice == 2: self.player.update_age = self.player.participant.vars['age'] self.player.update_weight = self.player.participant.vars['weight'] + self.player.unit_change_c_weight self.player.update_height = self.player.participant.vars['height'] elif self.player.change_c_choice == 3: self.player.update_age = self.player.participant.vars['age'] self.player.update_weight = self.player.participant.vars['weight'] self.player.update_height = self.player.participant.vars['height'] + self.player.unit_change_c_height class InfoWaitPage1(WaitPage): group_by_arrival_time = True def vars_for_template(self): if self.player.role() == 'receiver': body_text = "Waiting for the Senders to provide the information." else: body_text = "Waiting for the Receiver to rate your information." return {'body_text': body_text} class RatingCredit(Page): """Player chooses whether to signal to show creditworthiness""" form_model = 'player' form_fields = ['rating_c_p2', 'rating_c_p3', 'checkslider', 'checkslider2'] def checkslider_error_message(self, value): if not value: return 'Make your decisions using all the sliders (1)!' def checkslider2_error_message(self, value): if not value: return 'Make your decisions using all the sliders (2)!' def is_displayed(self): return self.player.role() == 'receiver' def vars_for_template(self): others = [p for p in self.player.get_others_in_group()] p2 = 0 p3 = 0 p4 = 0 p5 = 0 for p in others: if p.id_in_group == 2: p2 = p elif p.id_in_group == 3: p3 = p elif p.id_in_group == 4: p4 = p else: p5 = p return {"others": others, "p2": p2, "p3": p3, "p4": p4, "p5": p5, "p2_rating": self.player.rating_c_p2, "p3_rating": self.player.rating_c_p3, "p4_rating": self.player.rating_c_p4, "p5_rating": self.player.rating_c_p5, "update_age": self.player.update_age, "update_weight": self.player.update_weight, "update_height": self.player.update_height, "income": self.player.update_income } class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): self.group.set_payoffs() class ResultsSender(Page): def is_displayed(self): return self.player.role() == 'sender' def before_next_page(self): self.participant.vars['payoff_game1'] = self.player.payoff def vars_for_template(self): others = [p for p in self.player.get_others_in_group()] p2 = 0 p3 = 0 p4 = 0 p5 = 0 for p in others: if p.id_in_group == 2: p2 = p elif p.id_in_group == 3: p3 = p elif p.id_in_group == 4: p4 = p else: p5 = p return{"others": others, "p2": p2, "p3": p3, "p4": p4, "p5": p5, "p2_rating": self.player.rating_c_p2, "p3_rating": self.player.rating_c_p3, "p4_rating": self.player.rating_c_p4, "p5_rating": self.player.rating_c_p5, "update_age": self.player.update_age, "update_weight": self.player.update_weight, "update_height": self.player.update_height, "income": self.player.update_income } class ResultsReceiver(Page): def is_displayed(self): return self.player.role() == 'receiver' def before_next_page(self): self.participant.vars['payoff_game1'] = self.player.payoff def vars_for_template(self): others = [p for p in self.player.get_others_in_group()] p2 = 0 p3 = 0 p4 = 0 p5 = 0 for p in others: if p.id_in_group == 2: p2 = p elif p.id_in_group == 3: p3 = p elif p.id_in_group == 4: p4 = p else: p5 = p return {"others": others, "p2": p2, "p3": p3, "p4": p4, "p5": p5, "p2_rating": self.player.rating_c_p2, "p3_rating": self.player.rating_c_p3, "p4_rating": self.player.rating_c_p4, "p5_rating": self.player.rating_c_p5 } page_sequence = [ SignalingCredit ]