from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import time class Welcome1(Page): pass class Welcome2(Page): pass class Gender(Page): form_model = 'player' form_fields = ['gender'] def is_displayed(self): return self.session.config['gender'] == 'mw' class Zoom(Page): form_model = 'player' form_fields = ['zoom_code'] def vars_for_template(self): if self.session.config['gender'] == 'mw': if self.player.gender == 'w': bewerber = True else: bewerber = False else: if self.player.id_in_group == 1: bewerber = True else: bewerber = False return dict(bewerber=bewerber) def before_next_page(self): p = self.player if p.zoom_code != Constants.password: p.drop = True p.payoff = 4 class SetGroups2(WaitPage): wait_for_all_groups = True after_all_players_arrive = 'set_new_groups' def is_displayed(self): return not self.player.drop class Instructions(Page): def is_displayed(self): p = self.player return not p.drop class Payoff(Page): def is_displayed(self): p = self.player return not p.drop class Comprehension1(Page): form_model = 'player' form_fields = ['comprehension1'] def is_displayed(self): p = self.player return not p.drop class Comprehension2(Page): form_model = 'player' form_fields = ['comprehension2'] def is_displayed(self): p = self.player return not p.drop class Comprehension3(Page): form_model = 'player' form_fields = ['comprehension3'] def is_displayed(self): p = self.player return not p.drop class Comprehension4(Page): form_model = 'player' form_fields = ['comprehension4'] def is_displayed(self): p = self.player return not p.drop class Negotiation(Page): timeout_seconds = 10 * 60 timer_text = 'Verbleibende Zeit auf dieser Seite: ' def vars_for_template(self): group_id = self.group.id_in_subsession links = Constants.zoom_links # maximal 17 Gruppen, 34-35 Spieler if group_id <= len(links): infos = links[group_id - 1] link = infos['link'] password = infos['password'] else: link = '#' password = 'Bitte fragen Sie Ihren Experimentleiter via Chat.' return dict( link=link, password=password ) def is_displayed(self): p = self.player return not p.drop def before_next_page(self): self.participant.vars['neg_time'] = time.time() if self.timeout_happened: self.player.drop = True self.player.is_dropout = True self.participant.payoff = 0 for p in self.player.get_others_in_group(): p.drop = True p.payoff = 4 p.participant.payoff = 4 else: self.player.opened_zoom = True class Timer(Page): timeout_seconds = 30 * 60 timer_text = 'Verbleibende Zeit für Ihre Verhandlung: ' def vars_for_template(self): group_id = self.group.id_in_subsession links = Constants.zoom_links if group_id <= len(links): infos = links[group_id - 1] link = infos['link'] password = infos['password'] else: link = '#' password = 'Bitte fragen Sie Ihren Experimentleiter via Chat.' return dict( link=link, password=password ) def before_next_page(self): import math # save time until negotiations ended if self.timeout_happened: self.player.negotiation_time = "30min 0sec" elif 'neg_time' in self.participant.vars: t = (time.time() - self.participant.vars['neg_time']) / 60 t2 = math.modf(t) if len(t2) >= 2: m = int(t2[1]) s = int((t2[0] * 60) % 60) self.player.negotiation_time = str(m) + "min " + str(s) + "sec" def is_displayed(self): p = self.player return not p.drop class Wait(WaitPage): def is_displayed(self): p = self.player return not p.drop class Results(Page): live_method = 'live_results' timeout_seconds = 60 * 10 timer_text = 'Verbleibende Zeit um das gemeinsame Verhandlungsergebnis einzugeben:' def before_next_page(self): # set payoffs agreed = self.group.agreed p = self.player if agreed is False: p.payoff = 4 elif agreed is True: role = p.id_in_group result = p.negotiation_result if result is not None: if role == 2: # vorgesetzter if 0 < result < 3500: p.payoff = 12 elif result < 3750: p.payoff = 10 elif result < 4000: p.payoff = 8 else: p.payoff = 6 else: # bewerber if 4000 < result: p.payoff = 12 elif 3750 < result: p.payoff = 10 elif 3500 < result: p.payoff = 8 else: p.payoff = 6 else: p.payoff = 0 else: p.payoff = 0 def is_displayed(self): p = self.player return not p.drop class QuestionnaireA(Page): form_model = 'player' form_fields = ['Competent_other', 'Competent_self', 'Competent_self_by_other', 'Competent_own_background', 'Competent_other_background', 'Competent_own_background_by_other'] def is_displayed(self): p = self.player return not p.drop class QuestionnaireB(Page): form_model = 'player' form_fields = ['professional_other', 'professional_self', 'professional_self_by_other', 'professional_own_background', 'professional_other_background', 'professional_own_background_by_other'] def is_displayed(self): p = self.player return not p.drop class QuestionnaireC(Page): form_model = 'player' form_fields = ['sympathetic_other', 'sympathetic_self', 'sympathetic_self_by_other', 'sympathetic_own_background', 'sympathetic_other_background', 'sympathetic_own_background_by_other'] def is_displayed(self): p = self.player return not p.drop class QuestionnaireD(Page): form_model = 'player' form_fields = ['Performance_other', 'Performance_self', 'Performance_self_by_other'] def is_displayed(self): p = self.player return not p.drop class QuestionnaireE(Page): form_model = 'player' form_fields = ['Sympathetic_background_white', 'professional_background_white', 'competent_background_white', 'likeable_background_white'] def vars_for_template(self): return dict( image_path='Weiss.png' ) def is_displayed(self): p = self.player return not p.drop class QuestionnaireF(Page): form_model = 'player' form_fields = ['Sympathetic_background_livingroom', 'professional_background_livingroom', 'competent_background_livingroom', 'likeable_background_livingroom'] def vars_for_template(self): return dict( image_path='Wohnzimmer.jpg' ) def is_displayed(self): p = self.player return not p.drop class QuestionnaireG(Page): form_model = 'player' form_fields = ['Sympathetic_background_landscape', 'professional_background_landscape', 'competent_background_landscape', 'likeable_background_landscape'] def vars_for_template(self): return dict( image_path='Landschaft.jpg' ) def is_displayed(self): p = self.player return not p.drop class QuestionnaireH(Page): form_model = 'player' form_fields = ['Sympathetic_background_library', 'professional_background_library', 'competent_background_library', 'likeable_background_library'] def vars_for_template(self): return dict( image_path='Bibliothek.jpg' ) def is_displayed(self): p = self.player return not p.drop class QuestionnaireI(Page): form_model = 'player' form_fields = ['Sympathetic_background_plants', 'professional_background_plants', 'competent_background_plants', 'likeable_background_plants'] def vars_for_template(self): return dict( image_path='Pflanzen.jpg' ) def is_displayed(self): p = self.player return not p.drop class QuestionnaireJ(Page): form_model = 'player' form_fields = ['Sympathetic_background_company_logo', 'professional_background_company_logo', 'competent_background_company_logo', 'likeable_background_company_logo'] def vars_for_template(self): return dict( image_path='Firmenlogo.JPG' ) def is_displayed(self): p = self.player return not p.drop class QuestionnaireK(Page): form_model = 'player' form_fields = ['Sympathetic_background_moonscape', 'professional_background_moonscape', 'competent_background_moonscape', 'likeable_background_moonscape'] def vars_for_template(self): return dict( image_path='Mondlandschaft.jpg' ) def is_displayed(self): p = self.player return not p.drop class QuestionnaireL(Page): form_model = 'player' form_fields = ['similarity_with_other', 'virtual_or_real_background'] def is_displayed(self): p = self.player return not p.drop class Questionnaire2(Page): form_model = 'player' form_fields = ['comfortableness', 'own_bg_choice', 'own_bg_positive', 'other_bg_positive'] def is_displayed(self): p = self.player return not p.drop class Questionnaire3(Page): form_model = 'player' form_fields = ['own_bg_effect', 'other_bg_effect'] def is_displayed(self): p = self.player return not p.drop class Questionnaire7(Page): form_model = 'player' form_fields = ['other_sympathetic', 'self_sympathetic', 'confidence', 'other_attractive', 'other_trustworthy'] def is_displayed(self): p = self.player return not p.drop class Questionnaire10(Page): form_model = 'player' form_fields = ['wifi_connection', 'camera', 'microphone'] def is_displayed(self): p = self.player return not p.drop def before_next_page(self): p = self.player if 'instabil' in p.wifi_connection or 'instabil' in p.camera or 'instabil' in p.microphone: p.show_interrupts = True class Questionnaire11(Page): form_model = 'player' form_fields = ['wifi_interrupt', 'camera_interrupt', 'microphone_interrupt'] def get_form_fields(self): p = self.player questions = [] if 'instabil' in p.wifi_connection: questions.append('wifi_interrupt') if 'instabil' in p.camera: questions.append('camera_interrupt') if 'instabil' in p.microphone: questions.append('microphone_interrupt') return questions def is_displayed(self): p = self.player return not p.drop and p.show_interrupts class Questionnaire12(Page): form_model = 'player' form_fields = ['know_partner'] def is_displayed(self): p = self.player return not p.drop class Questionnaire13(Page): form_model = 'player' form_fields = ['birthyear', 'gender2', 'language', 'experience_exp'] def is_displayed(self): p = self.player return not p.drop class Questionnaire14(Page): form_model = 'player' form_fields = ['grade_maths', 'faculty', 'degree', 'semester'] def is_displayed(self): p = self.player return not p.drop class Questionnaire15(Page): form_model = 'player' form_fields = ['risk_aversion'] def is_displayed(self): p = self.player return not p.drop class Questionnaire16(Page): form_model = 'player' form_fields = ['inequity_aversion'] def is_displayed(self): p = self.player return not p.drop class Questionnaire17(Page): form_model = 'player' form_fields = ['reciprocity_q1', 'reciprocity_q2', 'reciprocity_q3'] def is_displayed(self): p = self.player return not p.drop class Questionnaire18(Page): form_model = 'player' form_fields = ['reciprocity_q4', 'reciprocity_q5', 'reciprocity_q6'] def is_displayed(self): p = self.player return not p.drop class Questionnaire19(Page): form_model = 'player' form_fields = ['big_five_q1'] def is_displayed(self): p = self.player return not p.drop class Questionnaire20(Page): form_model = 'player' form_fields = ['big_five_q2', 'big_five_q3', 'big_five_q4'] def is_displayed(self): p = self.player return not p.drop class Questionnaire21(Page): form_model = 'player' form_fields = ['big_five_q5', 'big_five_q6', 'big_five_q7'] def is_displayed(self): p = self.player return not p.drop class Questionnaire22(Page): form_model = 'player' form_fields = ['big_five_q8', 'big_five_q9', 'big_five_q10'] def is_displayed(self): p = self.player return not p.drop class Questionnaire23(Page): form_model = 'player' form_fields = ['big_five_q11', 'big_five_q12', 'big_five_q13'] def is_displayed(self): p = self.player return not p.drop class Questionnaire24(Page): form_model = 'player' form_fields = ['big_five_q14', 'big_five_q15'] def is_displayed(self): p = self.player return not p.drop class Questionnaire25(Page): form_model = 'player' form_fields = ['tech_acc_q1', 'tech_acc_q2'] def is_displayed(self): p = self.player return not p.drop class Questionnaire26(Page): form_model = 'player' form_fields = ['tech_acc_q3', 'tech_acc_q4', 'tech_acc_q5', 'tech_acc_q6'] def is_displayed(self): p = self.player return not p.drop class Questionnaire27(Page): form_model = 'player' form_fields = ['tech_acc_q7', 'tech_acc_q8'] def is_displayed(self): p = self.player return not p.drop class Questionnaire28(Page): form_model = 'player' form_fields = ['tech_acc_q9', 'tech_acc_q10'] def is_displayed(self): p = self.player return not p.drop class Questionnaire29(Page): form_model = 'player' form_fields = ['tech_acc_q11', 'tech_acc_q12', 'tech_acc_q13', 'tech_acc_q14'] def is_displayed(self): p = self.player return not p.drop class Questionnaire30(Page): form_model = 'player' form_fields = ['locuscontr_q1', 'locuscontr_q2'] def is_displayed(self): p = self.player return not p.drop class Questionnaire31(Page): form_model = 'player' form_fields = ['locuscontr_q3', 'locuscontr_q4'] def is_displayed(self): p = self.player return not p.drop class Questionnaire32(Page): form_model = 'player' form_fields = ['locuscontr_q5', 'locuscontr_q6'] def is_displayed(self): p = self.player return not p.drop class Questionnaire33(Page): form_model = 'player' form_fields = ['locuscontr_q7', 'locuscontr_q8'] def is_displayed(self): p = self.player return not p.drop class Questionnaire34(Page): form_model = 'player' form_fields = ['locuscontr_q9', 'locuscontr_q10'] def is_displayed(self): p = self.player return not p.drop class QuestionnaireM(Page): form_model = 'player' form_fields = ['perceived_competence_q1', 'perceived_competence_q2', 'perceived_competence_q3', 'perceived_competence_q4'] def is_displayed(self): p = self.player return not p.drop class PaymentOptions(Page): form_model = 'player' form_fields = ['use_paypal'] def is_displayed(self): p = self.player return not p.is_dropout def app_after_this_page(self, upcoming_apps): if self.player.use_paypal: return "AnonPay" # for Bots def before_next_page(self): self.participant.vars['payment'] = self.participant.payoff if self.player.use_paypal: self.participant.vars['paypal'] = True class Code(Page): def is_displayed(self): p = self.player return not p.drop class Dropouts(Page): def is_displayed(self): p = self.player return p.drop # for Bots def before_next_page(self): self.participant.vars['payment'] = self.participant.payoff page_sequence = [Welcome1, Welcome2, Gender, Zoom, SetGroups2, Instructions, Payoff, Comprehension1, Comprehension2, Comprehension3, Comprehension4, Negotiation, Timer, Wait, Results, QuestionnaireA, QuestionnaireB, QuestionnaireC, QuestionnaireD, QuestionnaireE, QuestionnaireF, QuestionnaireG, QuestionnaireH, QuestionnaireI, QuestionnaireJ, QuestionnaireK, QuestionnaireL, Questionnaire2, Questionnaire3, Questionnaire7, Questionnaire10, Questionnaire11, Questionnaire12, Questionnaire13, Questionnaire14, Questionnaire15, Questionnaire16, Questionnaire17, Questionnaire18, Questionnaire19, Questionnaire20, Questionnaire21, Questionnaire22, Questionnaire23, Questionnaire24, Questionnaire25, Questionnaire26, Questionnaire27, Questionnaire28, Questionnaire29, Questionnaire30, Questionnaire31, Questionnaire32, Questionnaire33, Questionnaire34, QuestionnaireM, PaymentOptions, Code, Dropouts]