from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import random import datetime import django.utils.timezone import time number_of_questions = Constants.NUMBER_OF_NEED_QUESTIONS + Constants.NUMBER_OF_PRODUCTIVITY_QUESTIONS class TimeoutPage(Page): def get_timeout_seconds(self): return self.player.get_timeout_seconds() def before_next_page(self): if self.session.config.get("is_respondi_study", False): self.player.treatment_number = self.player.participant.vars['treatment_number'] self.player.age = self.player.participant.vars['age'] self.player.gender = self.player.participant.vars['gender'] self.player.net_equivalence_income = self.player.participant.vars['net_equivalence_income'] if self.timeout_happened: self.player.remove_from_quota() self.player.dropout = True def is_displayed(self): return self.player.is_displayed_respondi() # Seite 1 class Einleitung(TimeoutPage): def vars_for_template(self) -> dict: return { 'is_oldenburg_study': self.session.config.get("is_oldenburg_study", False), } def before_next_page(self): super(Einleitung, self).before_next_page() if self.session.config.get("is_respondi_study", False): self.player.treatment_number = self.player.participant.vars['treatment_number'] self.player.age = self.player.participant.vars['age'] self.player.gender = self.player.participant.vars['gender'] self.player.net_equivalence_income = self.player.participant.vars['net_equivalence_income'] # Seite 2 class Hinweise(TimeoutPage): pass # Seite 3-10 (Vignettes) class Vignette(TimeoutPage): form_model = 'player' def get_form_fields(self): formatting = self.player.get_current_question_name() return ('justice_{}_A'.format(formatting), 'justice_{}_B'.format(formatting)) def error_message(self, values): question_data = self.player.get_current_question() endowment = int(question_data['total_endowment']) formatting = self.player.get_current_question_name() first_answer = values['justice_{}_A'.format(formatting)] second_answer = values['justice_{}_B'.format(formatting)] if first_answer + second_answer > endowment: return 'Sie können insgesamt nur maximal ' + str(endowment) + ' Holzscheite verteilen.' elif first_answer + second_answer < endowment: return 'Bitte verteilen Sie alle ' + str(endowment) + ' Holzscheite.' def vars_for_template(self): current_question_number = self.participant.vars['current_question_id'] + 1 question_data = self.player.get_current_question() name_a = self.player.participant.vars['persons'][0] name_b = self.player.participant.vars['persons'][1] name_1 = name_a old_name_1 = self.player.participant.vars['old_person_a'] need_1 = question_data['need_A'] old_need_1 = self.player.participant.vars['old_need_A'] productivity_1 = question_data['chopped_A'] old_productivity_1 = self.player.participant.vars['old_chopped_A'] selector_1 = 'justice_{}_A'.format(self.player.get_current_question_name()) name_2 = name_b old_name_2 = self.player.participant.vars['old_person_b'] need_2 = question_data['need_B'] old_need_2 = self.player.participant.vars['old_need_B'] productivity_2 = question_data['chopped_B'] old_productivity_2 = self.player.participant.vars['old_chopped_B'] selector_2 = 'justice_{}_B'.format(self.player.get_current_question_name()) endowment = question_data['total_endowment'] reversed_order_persons = self.player.reversed_order_persons if reversed_order_persons: name_1, name_2 = name_2, name_1 old_name_1, old_name_2 = old_name_2, old_name_1 productivity_1, productivity_2 = productivity_2, productivity_1 old_productivity_1, old_productivity_2 = old_productivity_2, old_productivity_1 need_1, need_2 = need_2, need_1 old_need_1, old_need_2 = old_need_2, old_need_1 selector_2, selector_1 = selector_1, selector_2 class_list = [] if self.player.is_new_block(): class_list.append('new-block') if name_1 != old_name_1: class_list.append('name_1') if name_2 != old_name_2: class_list.append('name_2') if need_1 != old_need_1: class_list.append('need_1') if need_2 != old_need_2: class_list.append('need_2') if productivity_1 != old_productivity_1: class_list.append('productivity_1') if productivity_2 != old_productivity_2: class_list.append('productivity_2') if endowment != self.player.participant.vars['old_endowment']: class_list.append('endowment') return { 'number_of_questions': number_of_questions, 'current_question_number': current_question_number, 'name_a': name_a, 'name_b': name_b, 'name_1': name_1, 'name_2': name_2, 'productivity_1': productivity_1, 'productivity_2': productivity_2, 'total_productivity': int(productivity_1) + int(productivity_2), 'need_1': need_1, 'need_2': need_2, 'endowment': endowment, 'total_need': int(need_1) + int(need_2), 'selector_1': selector_1, 'selector_2': selector_2, 'class_list': class_list, 'reverse_need_productivity': self.player.reversed_order_need_productivity, 'reverse_names': reversed_order_persons, 'responsibility_is_low': self.player.is_low_reponsibility(), 'is_productivity': self.player.is_currently_productivity() } def before_next_page(self): super(Vignette, self).before_next_page() question_data = self.player.get_current_question() self.player.participant.vars['old_need_A'] = question_data['need_A'] self.player.participant.vars['old_need_B'] = question_data['need_B'] self.player.participant.vars['old_chopped_A'] = question_data['chopped_A'] self.player.participant.vars['old_chopped_B'] = question_data['chopped_B'] self.player.participant.vars['old_endowment'] = question_data['total_endowment'] self.player.participant.vars['current_question_id'] += 1 if self.player.has_new_names(): self.player.participant.vars['old_person_a'] = self.player.participant.vars['persons'][0] self.player.participant.vars['old_person_b'] = self.player.participant.vars['persons'][1] self.player.participant.vars['persons'].pop(0) self.player.participant.vars['persons'].pop(0) # Seite 11 (Fragen zur Studie: Kriterien Entscheidung) class Kriterien(TimeoutPage): form_model = 'player' form_fields = ['kriterien'] # Seite 11 (Fragen zur Studie: Kriterien Entscheidung) class KriterienLikert(TimeoutPage): form_model = 'player' form_fields = ['criteria_likert_need', 'criteria_likert_productivity', 'criteria_likert_equality'] def vars_for_template(self) -> dict: number_of_items = 7 values = range(1, number_of_items + 1) odd = number_of_items % 2 != 0 if odd: colspan = (number_of_items + 1) / 2 else: colspan = number_of_items / 2 return { 'values': values, 'table_header': "Entscheidungskriterium", 'description_left': "überhaupt nicht wichtig", 'description_right': "sehr wichtig", 'colspan': colspan, 'odd': odd } # Seite 12 (Kontrollfrage) class Gerechtigkeit(TimeoutPage): form_model = 'player' form_fields = ['checker_gerechtigkeit'] def before_next_page(self): super(Gerechtigkeit, self).before_next_page() if self.session.config.get("is_respondi_study", False) and self.player.checker_gerechtigkeit != "42": self.player.set_quality_fail() # Seite 13 (Kontrollfrage) class FrageZurStudie(TimeoutPage): form_model = 'player' def get_form_fields(self): form_fields = [] for item in self.player.participant.vars['Checker']: form_fields.append('Checker{}'.format(item)) return form_fields def vars_for_template(self): return { 'questions': self.player.participant.vars['Checker'], } def error_message(self, values): if not (values["CheckerWinter"] or values["CheckerTrinken"] or values["CheckerMuehle"] or values["CheckerWeizen"] or values["CheckerRoggen"] or values["CheckerWinter"] or values[ "CheckerSonnenblumen"]): return 'Bitte wählen Sie mindestens eine Antwort aus!' def before_next_page(self): super(FrageZurStudie, self).before_next_page() if self.session.config.get("is_respondi_study", False) and self.player.check_checkers(): self.player.set_quality_fail() # Seite 14 (Kontrollfrage) class GroessteMenge(TimeoutPage): form_model = 'player' def get_form_fields(self): form_fields = [] for item in self.player.participant.vars['Scheite']: form_fields.append('Scheite{}'.format(item)) return form_fields def vars_for_template(self): return { 'questions': self.player.participant.vars['Scheite'], } def error_message(self, values): if not (values["Scheite3000"] or values["Scheite44"] or values["Scheite770"] or values["Scheite70777"] or values["Scheite55"] or values["Scheite55505"] or values["Scheite9999"]): return 'Bitte wählen Sie mindestens eine Antwort aus!' def before_next_page(self): super(GroessteMenge, self).before_next_page() if self.session.config.get("is_respondi_study", False) and self.player.check_scheite(): pass # self.player.set_quality_fail() # Seite 15 (Fragen zur Studie: Manipulationscheck) class Eigenverantwortung(TimeoutPage): form_model = 'player' form_fields = ['responsibilityNeed', 'responsibilityProductivity'] def vars_for_template(self): if self.player.block_order == 1: need_person_a = self.player.participant.vars['old_person_a'] need_person_b = self.player.participant.vars['old_person_b'] productivity_person_a = self.player.participant.vars['persons'][0] productivity_person_b = self.player.participant.vars['persons'][1] else: productivity_person_a = self.player.participant.vars['old_person_a'] productivity_person_b = self.player.participant.vars['old_person_b'] need_person_a = self.player.participant.vars['persons'][0] need_person_b = self.player.participant.vars['persons'][1] return { 'is_productivity': self.player.is_currently_productivity(), 'block_order': self.player.block_order, 'responsibility_is_low': self.player.is_low_reponsibility(), 'need_person_a': need_person_a, 'need_person_b': need_person_b, 'productivity_person_a': productivity_person_a, 'productivity_person_b': productivity_person_b, } # Seite 16 (Einstellungen: Locus of control) class Einstellungen(TimeoutPage): form_model = 'player' form_fields = ['locusOfControl'] # Seite 17 (Einstellungen zu Armut in Deutschland) class Armut(TimeoutPage): form_model = 'player' form_fields = ['attitudePoverty', 'attitudeSocialAssistance', 'attitudeHomeless', 'attitudeWorkingPoor'] template_name = "responsibility/scales/attitude_scale.html" def vars_for_template(self): return { 'subject': 'Armut', 'label_low': 'Unglück hat/gehabt hat', 'label_high': 'sich nicht genügend anstrengt/angestrengt hat', 'min_value': 1, 'mid_value': 4, 'max_value': 7 } # Seite 18 (Einstellungen zu Reichstum in Deutschland) class Reichtum(TimeoutPage): form_model = 'player' template_name = "responsibility/scales/attitude_scale.html" form_fields = ['attitudeWealth', 'attitudeMillionaires'] def vars_for_template(self): return { 'subject': 'Reichtum', 'label_low': 'Glück hat/gehabt hat', 'label_high': 'sich besonders hart anstrengt/angestrengt hat', 'min_value': 1, 'mid_value': 4, 'max_value': 7 } # Seite 19 (Einschätzung Arm/Reich) class ArmReich(TimeoutPage): form_model = 'player' form_fields = ['thresholdPoor', 'thresholdWealthy'] # Seite 20 (Einstellung Grundsicherung) class Grundsicherung(TimeoutPage): form_model = 'player' form_fields = ['conditionalityOfBasicSecurity'] # Seite 21 (Einstellung Gerechtigkeit) class EinstellungenGerechtigkeit(TimeoutPage): form_model = 'player' def get_form_fields(self): form_fields = [] for item in self.player.participant.vars['BSJO']: form_fields.append('BSJO_{}'.format(item)) return form_fields def vars_for_template(self): number_of_items = 7 values = range(1, number_of_items + 1) odd = number_of_items % 2 != 0 if odd: colspan = number_of_items / 2 else: colspan = (number_of_items - 1) / 2 colspan += 1 return { 'questions': self.player.participant.vars['BSJO'], 'values': values, 'table_header': "Aussage", 'description_left': "stimme gar nicht zu", 'description_right': "stimme voll zu", 'colspan': colspan, 'odd': odd } # Seite 22 (Soziodemografische Fragen) class Soziodemos(TimeoutPage): form_model = 'player' def get_form_fields(self): form_fields = [] if self.session.config.get("is_respondi_study", False): form_fields.extend( ['familyStatus', 'children', 'ownIncome', 'ownWealth', 'householdWealth'] ) else: form_fields.extend( ['gender', 'age', 'familyStatus', 'children', 'householdSize', 'childrenInHousehold', 'ownIncome', 'householdIncome' ] ) form_fields.extend(['ownWealth', 'householdWealth', 'device']) return form_fields # Gesundheit class Gesundheit(TimeoutPage): form_model = 'player' form_fields = ['is_smoker'] class Gesundheit2(TimeoutPage): form_model = 'player' def get_form_fields(self): if self.player.is_smoker: return ('cigarettes_per_day', 'pipes_per_day', 'cigars_per_day', 'e_cigarettes_per_day', 'has_cardiovascular_disease', 'has_metabolic_disease') else: return 'has_cardiovascular_disease', 'has_metabolic_disease' def vars_for_template(self): return { 'is_smoker': self.player.is_smoker } # Seite 23 (Politische Einstellung) class PolitischeEinstellung(TimeoutPage): form_model = 'player' form_fields = ['politicalAttitude'] # Seite 24 (Welche Partei würden Sie wählen?) class Partei(TimeoutPage): form_model = 'player' form_fields = ['party', 'partyOther'] # Seite 25 (Bildungsabschluss) class Bildung(TimeoutPage): form_model = 'player' form_fields = ['degree'] # Seite 26 (Beruf) class Beruf(TimeoutPage): form_model = 'player' form_fields = ['occupation', 'branch'] # Seite 27 (Risiko) class Risiko(TimeoutPage): form_model = 'player' form_fields = ['risk_taking'] # Seite 28 Ende class Ende(Page): def vars_for_template(self): return { 'is_respondi_study': self.session.config.get("is_respondi_study", False), 'is_oldenburg_study': self.session.config.get("is_oldenburg_study", False), 'dropout': self.player.dropout, 'qualityfail': self.player.quality_fail, 'participant_label': self.participant.label, 'respondi_url': self.session.config['respondi_url'], 'session_code': self.session.code } page_sequence = [ Einleitung, # Seite 1 Hinweise] # Seite 2 for x in range(number_of_questions): page_sequence.append(Vignette) page_sequence.extend( ( Kriterien, # Seite 11 KriterienLikert, Gerechtigkeit, # Seite 12 FrageZurStudie, # Seite 13 GroessteMenge, # Seite 14 Eigenverantwortung, # Seite 15 Einstellungen, # Seite 16 Armut, # Seite 17 Reichtum, # Seite 18 ArmReich, # Seite 19 Grundsicherung, # Seite 20 EinstellungenGerechtigkeit, # Seite 21 Soziodemos, # Seite 22 Gesundheit, # Seite 23 Gesundheit2, # Seite 23 PolitischeEinstellung, # Seite 24 Partei, # Seite 25 Bildung, # Seite 26 Beruf, # Seite 27 Risiko, # Seite 28 Ende ) ) # Seite 29