from otree.api import * import random import time doc = """ SHARP VERSION - Collective treatment - SESSION 4 """ class C(BaseConstants): TREATMENT = "COLLECTIVE" # add/select before starting the show "MIXED"/"INDIVIDUAL"/"COLLECTIVE" EXPECTED_TIME = 45 # minutes that the experiment takes.. 5 mins per task round + rest g1_round = 18 g2_round = 7 g3_round = 18 g4_round = 4 g5_round = 6 g6_round = 8 NAME_IN_URL = 'COLLECTIVE4' # CHANGE before deploying wr to other treatments PLAYERS_PER_GROUP = 4 # workers per group + 1 manager included ###check! MIN_ROUNDS = 4 ###check! MAX_ROUNDS = 21 ###check! NUM_ROUNDS = MAX_ROUNDS ## SETTLE POLICY BEFORE STARTING W_MULTIPLIER = 1 M_MULTIPLIER = 1 COMP_COST = 2 ###check! FIX_COST = 20 ###check! MIN_ISSUE = 5 WORSENING = 40 # probability 40% that the issue worsens, integer between 0 and 100 ###check! TIME_LIMIT = 45 # time per round ###check! PARTICIP_W = 5 ## participation fees PARTICIP_M = 5 PARTICIP_FEE = 5 B_MULTIPLIER = 2 BONUS_SHARE = .2 ###check! CHAT_TIME_LIMIT = 30 ###check! ECUEUR = 1/20 # 1eur to 20 ecu COMP_COST = 2 # cost per complaining person ###check! -- already defined STOP_PROB = 0.15 # 15% random stopping probability # ISSUE STARTING SETTINGS + slider display settings # region ISSUE_START = 5000 ISSUE_FINISH0 = 5000 ISSUE_FINISH1 = 10000 ISSUE_FINISH2 = 15000 ISSUE_FINISH3 = 25000 ISSUE_FINISH4 = 45000 ####### SLIDER SETTINGS ###### SLIDER_W = 40 ## graphics SLIDER_H = 10 SLIDER_MAX = "100" ### max and min values of sliders SLIDER_MIN = "0" # endregion class Subsession(BaseSubsession): pass class Group(BaseGroup): all_present = models.StringField(choices = ["TRUE", "FALSE"], initial = "FALSE") delay = models.FloatField(min=0, initial=0) complaint = models.StringField(choices=["No complaint", "Collective"] ,initial = "No complaint") #"Individual complaint") w1_bon = models.FloatField(min=0, max=100,initial=0, label=" The amount to Worker 1") w2_bon = models.FloatField(min=0, max=100,initial=0, label=" The amount to Worker 2") w3_bon = models.FloatField(min=0, max=100,initial=0, label=" The amount to Worker 3") w1_bon_pct = models.FloatField(initial = 0) w2_bon_pct = models.FloatField(initial=0) w3_bon_pct = models.FloatField(initial=0) delayW1 = models.IntegerField(min=0, initial=0) delayW2 = models.IntegerField(min=0, initial=0) delayW3 = models.IntegerField(min=0, initial=0) complaining_cost = models.FloatField(min = 0, initial = 0) stop_round = models.IntegerField(initial=C.MAX_ROUNDS) pass class Player(BasePlayer): treatment = models.StringField(choices=["MIXED", "COLLECTIVE", "INDIVIDUAL"], initial = C.TREATMENT) #identifier = models.IntegerField() position = models.StringField() activity = models.StringField(choices = ["FALSE", "TRUE" ], initial = "FALSE") p_number_sent = models.IntegerField(min=0, label=" ") p_decision = models.StringField(choices=["Yes", "No"], widget=widgets.RadioSelectHorizontal, label=" ") p_complain = models.StringField(choices=["Yes", "No"], widget=widgets.RadioSelectHorizontal, label=" ") complaining_choice = models.StringField(choices=["Collective complaint", "Individual complaint"], widget=widgets.RadioSelectHorizontal, label=" ") missed_units = models.IntegerField(min=0, initial=0, label=" ", max=1000) fix = models.BooleanField() round_payoff = models.FloatField(min=0, initial=0) final_payoff = models.FloatField(min=0, initial=0) ## DEMOGRAPHICS + RISK age = models.IntegerField(min = 0, max = 99, label ="What is your age?") gender = models.StringField(choices = ["Male", "Female", "Non-binary", "Prefer not to say"], label = "What is your gender?") study = models.StringField(label = "What is your field of study?", max_length = 50) risk0 = models.StringField(choices = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], label = "In general, how willing or unwilling you are to take risks?") ## RISK MEASURES folded below # region risk1 = models.StringField(choices= ["50/50 chance", "Sure payment"], label = "") risk2 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk3 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk4 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk5 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk6 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk7 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk8 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk9 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk10 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk11 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk12 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk13 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk14 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk15 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk16 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk17 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk18 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk19 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk20 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk21 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk22 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk23 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk24 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk25 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk26 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk27 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk28 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk29 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk30 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") risk31 = models.StringField(choices=["50/50 chance", "Sure payment"], label="") # endregion ## COMPREHENSION CHECK vars folded #region answer_1 = models.StringField(choices=['40%',"50%", '60%', "70%"], label="Question 1: What is the probability that the issue will not occur" " or will not get worse in the next round?", widget=widgets.RadioSelect) answer_2 = models.StringField(choices=['58 ECU', '61 ECU', '65 ECU', "73 ECU"], label="Question 2: There is 78 ECU in the company budget and" " the manager decides to fix the issue. How many ECU will be left in the company budget" " after that action?", widget=widgets.RadioSelect) answer_3 = models.StringField(choices=['0', '1', "2", "3"], label="Question 3: You and one of your fellow workers decided to complain. " "How many complaining messages the manager receives?", widget=widgets.RadioSelect) answer_4 = models.StringField(choices=['0 ECU', '2 ECU', "4 ECU", "6 ECU"], label="Question 4: How much would complaining from Question 3" " subtract from manager's payoff?", widget=widgets.RadioSelect) answer_5 = models.StringField(choices=['Yes', 'No'], label="Question 5: Can the manager see the workers' communication?", widget=widgets.RadioSelect) #endregion ## sliders points = models.IntegerField(initial=0, min=0) ## SLIDER VALUES folded #region slider_value1 = models.FloatField(min=0, max=100) slider_value2 = models.FloatField(min=0, max=100) slider_value3 = models.FloatField(min=0, max=100) slider_value4 = models.FloatField(min=0, max=100) slider_value5 = models.FloatField(min=0, max=100) slider_value6 = models.FloatField(min=0, max=100) slider_value7 = models.FloatField(min=0, max=100) slider_value8 = models.FloatField(min=0, max=100) slider_value9 = models.FloatField(min=0, max=100) slider_value10 = models.FloatField(min=0, max=100) slider_value11 = models.FloatField(min=0, max=100) slider_value12 = models.FloatField(min=0, max=100) slider_value13 = models.FloatField(min=0, max=100) slider_value14 = models.FloatField(min=0, max=100) slider_value15 = models.FloatField(min=0, max=100) slider_value16 = models.FloatField(min=0, max=100) slider_value17 = models.FloatField(min=0, max=100) slider_value18 = models.FloatField(min=0, max=100) slider_value19 = models.FloatField(min=0, max=100) slider_value20 = models.FloatField(min=0, max=100) slider_value21 = models.FloatField(min=0, max=100) slider_value22 = models.FloatField(min=0, max=100) slider_value23 = models.FloatField(min=0, max=100) slider_value24 = models.FloatField(min=0, max=100) slider_value25 = models.FloatField(min=0, max=100) slider_value26 = models.FloatField(min=0, max=100) slider_value27 = models.FloatField(min=0, max=100) slider_value28 = models.FloatField(min=0, max=100) slider_value29 = models.FloatField(min=0, max=100) slider_value30 = models.FloatField(min=0, max=100) slider_value31 = models.FloatField(min=0, max=100) slider_value32 = models.FloatField(min=0, max=100) slider_value33 = models.FloatField(min=0, max=100) slider_value34 = models.FloatField(min=0, max=100) slider_value35 = models.FloatField(min=0, max=100) slider_value36 = models.FloatField(min=0, max=100) slider_value37 = models.FloatField(min=0, max=100) slider_value38 = models.FloatField(min=0, max=100) slider_value39 = models.FloatField(min=0, max=100) slider_value40 = models.FloatField(min=0, max=100) ## random numbers n_1 = models.IntegerField(initial=0, min=0, max=100) n_2 = models.IntegerField(initial=0, min=0, max=100) n_3 = models.IntegerField(initial=0, min=0, max=100) n_4 = models.IntegerField(initial=0, min=0, max=100) n_5 = models.IntegerField(initial=0, min=0, max=100) n_6 = models.IntegerField(initial=0, min=0, max=100) n_7 = models.IntegerField(initial=0, min=0, max=100) n_8 = models.IntegerField(initial=0, min=0, max=100) n_9 = models.IntegerField(initial=0, min=0, max=100) n_10 = models.IntegerField(initial=0, min=0, max=100) n_11 = models.IntegerField(initial=0, min=0, max=100) n_12 = models.IntegerField(initial=0, min=0, max=100) n_13 = models.IntegerField(initial=0, min=0, max=100) n_14 = models.IntegerField(initial=0, min=0, max=100) n_15 = models.IntegerField(initial=0, min=0, max=100) n_16 = models.IntegerField(initial=0, min=0, max=100) n_17 = models.IntegerField(initial=0, min=0, max=100) n_18 = models.IntegerField(initial=0, min=0, max=100) n_19 = models.IntegerField(initial=0, min=0, max=100) n_20 = models.IntegerField(initial=0, min=0, max=100) n_21 = models.IntegerField(initial=0, min=0, max=100) n_22 = models.IntegerField(initial=0, min=0, max=100) n_23 = models.IntegerField(initial=0, min=0, max=100) n_24 = models.IntegerField(initial=0, min=0, max=100) n_25 = models.IntegerField(initial=0, min=0, max=100) n_26 = models.IntegerField(initial=0, min=0, max=100) n_27 = models.IntegerField(initial=0, min=0, max=100) n_28 = models.IntegerField(initial=0, min=0, max=100) n_29 = models.IntegerField(initial=0, min=0, max=100) n_30 = models.IntegerField(initial=0, min=0, max=100) n_31 = models.IntegerField(initial=0, min=0, max=100) n_32 = models.IntegerField(initial=0, min=0, max=100) n_33 = models.IntegerField(initial=0, min=0, max=100) n_34 = models.IntegerField(initial=0, min=0, max=100) n_35 = models.IntegerField(initial=0, min=0, max=100) n_36 = models.IntegerField(initial=0, min=0, max=100) n_37 = models.IntegerField(initial=0, min=0, max=100) n_38 = models.IntegerField(initial=0, min=0, max=100) n_39 = models.IntegerField(initial=0, min=0, max=100) n_40 = models.IntegerField(initial=0, min=0, max=100) # endregion pass # PAGES class OOstart(Page): pass class Welcome(Page): def is_displayed(player): return player.round_number == 1 def before_next_page(player, timeout_happened): player.participant.vars["sessionID"] = player.id_in_subsession player.activity = "TRUE" pass class InstructionsW(Page): def is_displayed(player): return player.id_in_group != 1 and player.round_number == 1 def vars_for_template(player): return {'experiment_id': player.id_in_group - 1} def before_next_page(player, timeout_happened): name = "Worker " + str(player.id_in_group - 1) player.position = name pass class InstructionsM(Page): def is_displayed(player): return player.id_in_group == 1 and player.round_number == 1 def vars_for_template(player): return {'experiment_id': player.id_in_group} def before_next_page(player, timeout_happened): player.position = "Manager" if player.id_in_subsession == 1: player.group.stop_round = C.g1_round if player.id_in_subsession == 5: player.group.stop_round = C.g2_round if player.id_in_subsession == 9: player.group.stop_round = C.g3_round if player.id_in_subsession == 13: player.group.stop_round = C.g4_round if player.id_in_subsession == 17: player.group.stop_round = C.g5_round if player.id_in_subsession == 21: player.group.stop_round = C.g6_round ## DEMOGRAPHICS and RISK SURVEY class Demographics(Page): def is_displayed(player): return player.round_number == 1 form_model = 'player' form_fields = ["age", "gender", "study"] pass class Risk0(Page): def is_displayed(player): return player.round_number == 1 form_model = "player" form_fields = ["risk0"] pass ## THE INTERDEPENDENT 30 RISK QUESTIONS folded # region class Risk1(Page): template_name = 'INDIVIDUAL/RISK/Risk1.html' def is_displayed(player): return player.round_number == 1 form_model = "player" form_fields = ["risk1"] class Risk2(Page): template_name = 'INDIVIDUAL/RISK/Risk2.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk1") == "Sure payment") form_model = "player" form_fields = ["risk2"] class Risk3(Page): template_name = 'INDIVIDUAL/RISK/Risk3.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk2") == "Sure payment") form_model = "player" form_fields = ["risk3"] class Risk4(Page): template_name = 'INDIVIDUAL/RISK/Risk4.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk3") == "50/50 chance") form_model = "player" form_fields = ["risk4"] class Risk5(Page): template_name = 'INDIVIDUAL/RISK/Risk5.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk4") == "50/50 chance") form_model = "player" form_fields = ["risk5"] class Risk6(Page): template_name = 'INDIVIDUAL/RISK/Risk6.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk4") == "Sure payment") form_model = "player" form_fields = ["risk6"] class Risk7(Page): template_name = 'INDIVIDUAL/RISK/Risk7.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk3") == "Sure payment") form_model = "player" form_fields = ["risk7"] class Risk8(Page): template_name = 'INDIVIDUAL/RISK/Risk8.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk7") == "50/50 chance") form_model = "player" form_fields = ["risk8"] class Risk9(Page): template_name = 'INDIVIDUAL/RISK/Risk9.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk7") == "Sure payment") form_model = "player" form_fields = ["risk9"] class Risk10(Page): template_name = 'INDIVIDUAL/RISK/Risk10.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk2") == "50/50 chance") form_model = "player" form_fields = ["risk10"] class Risk11(Page): template_name = 'INDIVIDUAL/RISK/Risk11.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk10") == "Sure payment") form_model = "player" form_fields = ["risk11"] class Risk12(Page): template_name = 'INDIVIDUAL/RISK/Risk12.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk11") == "Sure payment") form_model = "player" form_fields = ["risk12"] class Risk13(Page): template_name = 'INDIVIDUAL/RISK/Risk13.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk11") == "50/50 chance") form_model = "player" form_fields = ["risk13"] class Risk14(Page): template_name = 'INDIVIDUAL/RISK/Risk14.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk10") == "50/50 chance") form_model = "player" form_fields = ["risk14"] class Risk15(Page): template_name = 'INDIVIDUAL/RISK/Risk15.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk14") == "50/50 chance") form_model = "player" form_fields = ["risk15"] class Risk16(Page): template_name = 'INDIVIDUAL/RISK/Risk16.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk14") == "Sure payment") form_model = "player" form_fields = ["risk16"] class Risk17(Page): template_name = 'INDIVIDUAL/RISK/Risk17.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk1") == "50/50 chance") form_model = "player" form_fields = ["risk17"] class Risk18(Page): template_name = 'INDIVIDUAL/RISK/Risk18.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk17") == "Sure payment") form_model = "player" form_fields = ["risk18"] class Risk19(Page): template_name = 'INDIVIDUAL/RISK/Risk19.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk18") == "Sure payment") form_model = "player" form_fields = ["risk19"] class Risk20(Page): template_name = 'INDIVIDUAL/RISK/Risk20.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk19") == "50/50 chance") form_model = "player" form_fields = ["risk20"] class Risk21(Page): template_name = 'INDIVIDUAL/RISK/Risk21.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk19") == "Sure payment") form_model = "player" form_fields = ["risk21"] class Risk22(Page): template_name = 'INDIVIDUAL/RISK/Risk22.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk18") == "50/50 chance") form_model = "player" form_fields = ["risk22"] class Risk23(Page): template_name = 'INDIVIDUAL/RISK/Risk23.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk22") == "50/50 chance") form_model = "player" form_fields = ["risk23"] class Risk24(Page): template_name = 'INDIVIDUAL/RISK/Risk24.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk22") == "Sure payment") form_model = "player" form_fields = ["risk24"] class Risk25(Page): template_name = 'INDIVIDUAL/RISK/Risk25.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk17") == "50/50 chance") form_model = "player" form_fields = ["risk25"] class Risk26(Page): template_name = 'INDIVIDUAL/RISK/Risk26.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk25") == "Sure payment") form_model = "player" form_fields = ["risk26"] class Risk27(Page): template_name = 'INDIVIDUAL/RISK/Risk27.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk26") == "50/50 chance") form_model = "player" form_fields = ["risk27"] class Risk28(Page): template_name = 'INDIVIDUAL/RISK/Risk28.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk26") == "Sure payment") form_model = "player" form_fields = ["risk28"] class Risk29(Page): template_name = 'INDIVIDUAL/RISK/Risk29.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk25") == "50/50 chance") form_model = "player" form_fields = ["risk29"] class Risk30(Page): template_name = 'INDIVIDUAL/RISK/Risk30.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk29") == "Sure payment") form_model = "player" form_fields = ["risk30"] class Risk31(Page): template_name = 'INDIVIDUAL/RISK/Risk31.html' def is_displayed(player): return (player.round_number == 1 and player.field_maybe_none("risk29") == "50/50 chance") form_model = "player" form_fields = ["risk31"] # endregion ### COMPREHENSION class Comprehension(Page): form_model = 'player' form_fields = ['answer_1', 'answer_2', "answer_3","answer_4", "answer_5"] def is_displayed(player): return player.round_number == 1 def error_message(self, values): errors = [] if values['answer_1'] != '60%': errors.append('Question 1 is incorrect.') if values['answer_2'] != '58 ECU': errors.append('Question 2 is incorrect.') if values['answer_3'] != '1': errors.append('Question 3 is incorrect.') if values['answer_4'] != '4 ECU': errors.append('Question 4 is incorrect.') if values['answer_5'] != 'No': errors.append('Question 5 is incorrect.') if errors: return errors ###### # if values['answer_3'] != 'Collective': # errors.append('Question 3 is incorrect.') ### #### REAL EFFORT TASKS class S_Starter(Page): def is_displayed(player): return player.id_in_group != 1 def before_next_page(player, timeout_happened): if (player.round_number == 1 and len(player.group.get_players()) == 4): player.group.all_present = "TRUE" class SRound0(Page): form_model = "player" form_fields = ['slider_value1', 'slider_value2', 'slider_value3', 'slider_value4', 'slider_value5', 'slider_value6', 'slider_value7', 'slider_value8', 'slider_value9', 'slider_value10', 'slider_value11', 'slider_value12', 'slider_value13', 'slider_value14', 'slider_value15', 'slider_value16', 'slider_value17', 'slider_value18', 'slider_value19', 'slider_value20', 'slider_value21', 'slider_value22', 'slider_value23', 'slider_value24', 'slider_value25', 'slider_value26', 'slider_value27', 'slider_value28', 'slider_value29', 'slider_value30', 'slider_value31', 'slider_value32', 'slider_value33', 'slider_value34', 'slider_value35', 'slider_value36', 'slider_value37', 'slider_value38', 'slider_value39', 'slider_value40', "p_number_sent"] def is_displayed(player): if player.round_number == 1: return player.id_in_group != 1 else: past_player = player.in_round(player.round_number - 1) return ((player.id_in_group == 2 and past_player.group.delayW1 == 0) or (player.id_in_group == 3 and past_player.group.delayW2 == 0) or (player.id_in_group == 4 and past_player.group.delayW3 == 0)) timeout_seconds = C.TIME_LIMIT @staticmethod def vars_for_template(player: Player): start_issue = C.ISSUE_START player.n_1 = random.randint(1, 100) player.n_2 = random.randint(1, 100) player.n_3 = random.randint(1, 100) player.n_4 = random.randint(1, 100) player.n_5 = random.randint(1, 100) player.n_6 = random.randint(1, 100) player.n_7 = random.randint(1, 100) player.n_8 = random.randint(1, 100) player.n_9 = random.randint(1, 100) player.n_10 = random.randint(1, 100) player.n_11 = random.randint(1, 100) player.n_12 = random.randint(1, 100) player.n_13 = random.randint(1, 100) player.n_14 = random.randint(1, 100) player.n_15 = random.randint(1, 100) player.n_16 = random.randint(1, 100) player.n_17 = random.randint(1, 100) player.n_18 = random.randint(1, 100) player.n_19 = random.randint(1, 100) player.n_20 = random.randint(1, 100) player.n_21 = random.randint(1, 100) player.n_22 = random.randint(1, 100) player.n_23 = random.randint(1, 100) player.n_24 = random.randint(1, 100) player.n_25 = random.randint(1, 100) player.n_26 = random.randint(1, 100) player.n_27 = random.randint(1, 100) player.n_28 = random.randint(1, 100) player.n_29 = random.randint(1, 100) player.n_30 = random.randint(1, 100) player.n_31 = random.randint(1, 100) player.n_32 = random.randint(1, 100) player.n_33 = random.randint(1, 100) player.n_34 = random.randint(1, 100) player.n_35 = random.randint(1, 100) player.n_36 = random.randint(1, 100) player.n_37 = random.randint(1, 100) player.n_38 = random.randint(1, 100) player.n_39 = random.randint(1, 100) player.n_40 = random.randint(1, 100) @staticmethod def before_next_page(player, timeout_happened): if player.slider_value1 == player.n_1: player.points += 1 if player.slider_value2 == player.n_2: player.points += 1 if player.slider_value3 == player.n_3: player.points += 1 if player.slider_value4 == player.n_4: player.points += 1 if player.slider_value5 == player.n_5: player.points += 1 if player.slider_value6 == player.n_6: player.points += 1 if player.slider_value7 == player.n_7: player.points += 1 if player.slider_value8 == player.n_8: player.points += 1 if player.slider_value9 == player.n_9: player.points += 1 if player.slider_value10 == player.n_10: player.points += 1 if player.slider_value11 == player.n_11: player.points += 1 if player.slider_value12 == player.n_12: player.points += 1 if player.slider_value13 == player.n_13: player.points += 1 if player.slider_value14 == player.n_14: player.points += 1 if player.slider_value15 == player.n_15: player.points += 1 if player.slider_value16 == player.n_16: player.points += 1 if player.slider_value17 == player.n_17: player.points += 1 if player.slider_value18 == player.n_18: player.points += 1 if player.slider_value19 == player.n_19: player.points += 1 if player.slider_value20 == player.n_20: player.points += 1 if player.slider_value21 == player.n_21: player.points += 1 if player.slider_value22 == player.n_22: player.points += 1 if player.slider_value23 == player.n_23: player.points += 1 if player.slider_value24 == player.n_24: player.points += 1 if player.slider_value25 == player.n_25: player.points += 1 if player.slider_value26 == player.n_26: player.points += 1 if player.slider_value27 == player.n_27: player.points += 1 if player.slider_value28 == player.n_28: player.points += 1 if player.slider_value29 == player.n_29: player.points += 1 if player.slider_value30 == player.n_30: player.points += 1 if player.slider_value31 == player.n_31: player.points += 1 if player.slider_value32 == player.n_32: player.points += 1 if player.slider_value33 == player.n_33: player.points += 1 if player.slider_value34 == player.n_34: player.points += 1 if player.slider_value35 == player.n_35: player.points += 1 if player.slider_value36 == player.n_36: player.points += 1 if player.slider_value37 == player.n_37: player.points += 1 if player.slider_value38 == player.n_38: player.points += 1 if player.slider_value39 == player.n_39: player.points += 1 if player.slider_value40 == player.n_40: player.points += 1 player.p_number_sent = player.points pass class SRound1(Page): form_model = "player" form_fields = ['slider_value1', 'slider_value2', 'slider_value3', 'slider_value4', 'slider_value5', 'slider_value6', 'slider_value7', 'slider_value8', 'slider_value9', 'slider_value10', 'slider_value11', 'slider_value12', 'slider_value13', 'slider_value14', 'slider_value15', 'slider_value16', 'slider_value17', 'slider_value18', 'slider_value19', 'slider_value20', 'slider_value21', 'slider_value22', 'slider_value23', 'slider_value24', 'slider_value25', 'slider_value26', 'slider_value27', 'slider_value28', 'slider_value29', 'slider_value30', 'slider_value31', 'slider_value32', 'slider_value33', 'slider_value34', 'slider_value35', 'slider_value36', 'slider_value37', 'slider_value38', 'slider_value39', 'slider_value40', "p_number_sent"] def is_displayed(player): rund = max(player.round_number - 1, 1) past_player = player.in_round(rund) return ((player.id_in_group == 2 and past_player.group.delayW1 == 5) or (player.id_in_group == 3 and past_player.group.delayW2 == 5) or (player.id_in_group == 4 and past_player.group.delayW3 == 5)) timeout_seconds = C.TIME_LIMIT @staticmethod def vars_for_template(player: Player): start_issue = C.ISSUE_START player.n_1 = random.randint(1, 100) player.n_2 = random.randint(1, 100) player.n_3 = random.randint(1, 100) player.n_4 = random.randint(1, 100) player.n_5 = random.randint(1, 100) player.n_6 = random.randint(1, 100) player.n_7 = random.randint(1, 100) player.n_8 = random.randint(1, 100) player.n_9 = random.randint(1, 100) player.n_10 = random.randint(1, 100) player.n_11 = random.randint(1, 100) player.n_12 = random.randint(1, 100) player.n_13 = random.randint(1, 100) player.n_14 = random.randint(1, 100) player.n_15 = random.randint(1, 100) player.n_16 = random.randint(1, 100) player.n_17 = random.randint(1, 100) player.n_18 = random.randint(1, 100) player.n_19 = random.randint(1, 100) player.n_20 = random.randint(1, 100) player.n_21 = random.randint(1, 100) player.n_22 = random.randint(1, 100) player.n_23 = random.randint(1, 100) player.n_24 = random.randint(1, 100) player.n_25 = random.randint(1, 100) player.n_26 = random.randint(1, 100) player.n_27 = random.randint(1, 100) player.n_28 = random.randint(1, 100) player.n_29 = random.randint(1, 100) player.n_30 = random.randint(1, 100) player.n_31 = random.randint(1, 100) player.n_32 = random.randint(1, 100) player.n_33 = random.randint(1, 100) player.n_34 = random.randint(1, 100) player.n_35 = random.randint(1, 100) player.n_36 = random.randint(1, 100) player.n_37 = random.randint(1, 100) player.n_38 = random.randint(1, 100) player.n_39 = random.randint(1, 100) player.n_40 = random.randint(1, 100) @staticmethod def before_next_page(player, timeout_happened): if player.slider_value1 == player.n_1: player.points += 1 if player.slider_value2 == player.n_2: player.points += 1 if player.slider_value3 == player.n_3: player.points += 1 if player.slider_value4 == player.n_4: player.points += 1 if player.slider_value5 == player.n_5: player.points += 1 if player.slider_value6 == player.n_6: player.points += 1 if player.slider_value7 == player.n_7: player.points += 1 if player.slider_value8 == player.n_8: player.points += 1 if player.slider_value9 == player.n_9: player.points += 1 if player.slider_value10 == player.n_10: player.points += 1 if player.slider_value11 == player.n_11: player.points += 1 if player.slider_value12 == player.n_12: player.points += 1 if player.slider_value13 == player.n_13: player.points += 1 if player.slider_value14 == player.n_14: player.points += 1 if player.slider_value15 == player.n_15: player.points += 1 if player.slider_value16 == player.n_16: player.points += 1 if player.slider_value17 == player.n_17: player.points += 1 if player.slider_value18 == player.n_18: player.points += 1 if player.slider_value19 == player.n_19: player.points += 1 if player.slider_value20 == player.n_20: player.points += 1 if player.slider_value21 == player.n_21: player.points += 1 if player.slider_value22 == player.n_22: player.points += 1 if player.slider_value23 == player.n_23: player.points += 1 if player.slider_value24 == player.n_24: player.points += 1 if player.slider_value25 == player.n_25: player.points += 1 if player.slider_value26 == player.n_26: player.points += 1 if player.slider_value27 == player.n_27: player.points += 1 if player.slider_value28 == player.n_28: player.points += 1 if player.slider_value29 == player.n_29: player.points += 1 if player.slider_value30 == player.n_30: player.points += 1 if player.slider_value31 == player.n_31: player.points += 1 if player.slider_value32 == player.n_32: player.points += 1 if player.slider_value33 == player.n_33: player.points += 1 if player.slider_value34 == player.n_34: player.points += 1 if player.slider_value35 == player.n_35: player.points += 1 if player.slider_value36 == player.n_36: player.points += 1 if player.slider_value37 == player.n_37: player.points += 1 if player.slider_value38 == player.n_38: player.points += 1 if player.slider_value39 == player.n_39: player.points += 1 if player.slider_value40 == player.n_40: player.points += 1 player.p_number_sent = player.points pass class SRound2(Page): form_model = "player" form_fields = ['slider_value1', 'slider_value2', 'slider_value3', 'slider_value4', 'slider_value5', 'slider_value6', 'slider_value7', 'slider_value8', 'slider_value9', 'slider_value10', 'slider_value11', 'slider_value12', 'slider_value13', 'slider_value14', 'slider_value15', 'slider_value16', 'slider_value17', 'slider_value18', 'slider_value19', 'slider_value20', 'slider_value21', 'slider_value22', 'slider_value23', 'slider_value24', 'slider_value25', 'slider_value26', 'slider_value27', 'slider_value28', 'slider_value29', 'slider_value30', 'slider_value31', 'slider_value32', 'slider_value33', 'slider_value34', 'slider_value35', 'slider_value36', 'slider_value37', 'slider_value38', 'slider_value39', 'slider_value40', "p_number_sent"] def is_displayed(player): rund = max(player.round_number - 1, 1) past_player = player.in_round(rund) return ((player.id_in_group == 2 and past_player.group.delayW1 == 10) or (player.id_in_group == 3 and past_player.group.delayW2 == 10) or (player.id_in_group == 4 and past_player.group.delayW3 == 10)) timeout_seconds = C.TIME_LIMIT @staticmethod def vars_for_template(player: Player): start_issue = C.ISSUE_START player.n_1 = random.randint(1, 100) player.n_2 = random.randint(1, 100) player.n_3 = random.randint(1, 100) player.n_4 = random.randint(1, 100) player.n_5 = random.randint(1, 100) player.n_6 = random.randint(1, 100) player.n_7 = random.randint(1, 100) player.n_8 = random.randint(1, 100) player.n_9 = random.randint(1, 100) player.n_10 = random.randint(1, 100) player.n_11 = random.randint(1, 100) player.n_12 = random.randint(1, 100) player.n_13 = random.randint(1, 100) player.n_14 = random.randint(1, 100) player.n_15 = random.randint(1, 100) player.n_16 = random.randint(1, 100) player.n_17 = random.randint(1, 100) player.n_18 = random.randint(1, 100) player.n_19 = random.randint(1, 100) player.n_20 = random.randint(1, 100) player.n_21 = random.randint(1, 100) player.n_22 = random.randint(1, 100) player.n_23 = random.randint(1, 100) player.n_24 = random.randint(1, 100) player.n_25 = random.randint(1, 100) player.n_26 = random.randint(1, 100) player.n_27 = random.randint(1, 100) player.n_28 = random.randint(1, 100) player.n_29 = random.randint(1, 100) player.n_30 = random.randint(1, 100) player.n_31 = random.randint(1, 100) player.n_32 = random.randint(1, 100) player.n_33 = random.randint(1, 100) player.n_34 = random.randint(1, 100) player.n_35 = random.randint(1, 100) player.n_36 = random.randint(1, 100) player.n_37 = random.randint(1, 100) player.n_38 = random.randint(1, 100) player.n_39 = random.randint(1, 100) player.n_40 = random.randint(1, 100) @staticmethod def before_next_page(player, timeout_happened): if player.slider_value1 == player.n_1: player.points += 1 if player.slider_value2 == player.n_2: player.points += 1 if player.slider_value3 == player.n_3: player.points += 1 if player.slider_value4 == player.n_4: player.points += 1 if player.slider_value5 == player.n_5: player.points += 1 if player.slider_value6 == player.n_6: player.points += 1 if player.slider_value7 == player.n_7: player.points += 1 if player.slider_value8 == player.n_8: player.points += 1 if player.slider_value9 == player.n_9: player.points += 1 if player.slider_value10 == player.n_10: player.points += 1 if player.slider_value11 == player.n_11: player.points += 1 if player.slider_value12 == player.n_12: player.points += 1 if player.slider_value13 == player.n_13: player.points += 1 if player.slider_value14 == player.n_14: player.points += 1 if player.slider_value15 == player.n_15: player.points += 1 if player.slider_value16 == player.n_16: player.points += 1 if player.slider_value17 == player.n_17: player.points += 1 if player.slider_value18 == player.n_18: player.points += 1 if player.slider_value19 == player.n_19: player.points += 1 if player.slider_value20 == player.n_20: player.points += 1 if player.slider_value21 == player.n_21: player.points += 1 if player.slider_value22 == player.n_22: player.points += 1 if player.slider_value23 == player.n_23: player.points += 1 if player.slider_value24 == player.n_24: player.points += 1 if player.slider_value25 == player.n_25: player.points += 1 if player.slider_value26 == player.n_26: player.points += 1 if player.slider_value27 == player.n_27: player.points += 1 if player.slider_value28 == player.n_28: player.points += 1 if player.slider_value29 == player.n_29: player.points += 1 if player.slider_value30 == player.n_30: player.points += 1 if player.slider_value31 == player.n_31: player.points += 1 if player.slider_value32 == player.n_32: player.points += 1 if player.slider_value33 == player.n_33: player.points += 1 if player.slider_value34 == player.n_34: player.points += 1 if player.slider_value35 == player.n_35: player.points += 1 if player.slider_value36 == player.n_36: player.points += 1 if player.slider_value37 == player.n_37: player.points += 1 if player.slider_value38 == player.n_38: player.points += 1 if player.slider_value39 == player.n_39: player.points += 1 if player.slider_value40 == player.n_40: player.points += 1 player.p_number_sent = player.points pass class SRound3(Page): form_model = "player" form_fields = ['slider_value1', 'slider_value2', 'slider_value3', 'slider_value4', 'slider_value5', 'slider_value6', 'slider_value7', 'slider_value8', 'slider_value9', 'slider_value10', 'slider_value11', 'slider_value12', 'slider_value13', 'slider_value14', 'slider_value15', 'slider_value16', 'slider_value17', 'slider_value18', 'slider_value19', 'slider_value20', 'slider_value21', 'slider_value22', 'slider_value23', 'slider_value24', 'slider_value25', 'slider_value26', 'slider_value27', 'slider_value28', 'slider_value29', 'slider_value30', 'slider_value31', 'slider_value32', 'slider_value33', 'slider_value34', 'slider_value35', 'slider_value36', 'slider_value37', 'slider_value38', 'slider_value39', 'slider_value40', "p_number_sent"] def is_displayed(player): rund = max(player.round_number - 1,1) past_player = player.in_round(rund) return ((player.id_in_group == 2 and past_player.group.delayW1 == 20) or (player.id_in_group == 3 and past_player.group.delayW2 == 20) or (player.id_in_group == 4 and past_player.group.delayW3 == 20)) timeout_seconds = C.TIME_LIMIT @staticmethod def vars_for_template(player: Player): start_issue = C.ISSUE_START player.n_1 = random.randint(1, 100) player.n_2 = random.randint(1, 100) player.n_3 = random.randint(1, 100) player.n_4 = random.randint(1, 100) player.n_5 = random.randint(1, 100) player.n_6 = random.randint(1, 100) player.n_7 = random.randint(1, 100) player.n_8 = random.randint(1, 100) player.n_9 = random.randint(1, 100) player.n_10 = random.randint(1, 100) player.n_11 = random.randint(1, 100) player.n_12 = random.randint(1, 100) player.n_13 = random.randint(1, 100) player.n_14 = random.randint(1, 100) player.n_15 = random.randint(1, 100) player.n_16 = random.randint(1, 100) player.n_17 = random.randint(1, 100) player.n_18 = random.randint(1, 100) player.n_19 = random.randint(1, 100) player.n_20 = random.randint(1, 100) player.n_21 = random.randint(1, 100) player.n_22 = random.randint(1, 100) player.n_23 = random.randint(1, 100) player.n_24 = random.randint(1, 100) player.n_25 = random.randint(1, 100) player.n_26 = random.randint(1, 100) player.n_27 = random.randint(1, 100) player.n_28 = random.randint(1, 100) player.n_29 = random.randint(1, 100) player.n_30 = random.randint(1, 100) player.n_31 = random.randint(1, 100) player.n_32 = random.randint(1, 100) player.n_33 = random.randint(1, 100) player.n_34 = random.randint(1, 100) player.n_35 = random.randint(1, 100) player.n_36 = random.randint(1, 100) player.n_37 = random.randint(1, 100) player.n_38 = random.randint(1, 100) player.n_39 = random.randint(1, 100) player.n_40 = random.randint(1, 100) @staticmethod def before_next_page(player, timeout_happened): if player.slider_value1 == player.n_1: player.points += 1 if player.slider_value2 == player.n_2: player.points += 1 if player.slider_value3 == player.n_3: player.points += 1 if player.slider_value4 == player.n_4: player.points += 1 if player.slider_value5 == player.n_5: player.points += 1 if player.slider_value6 == player.n_6: player.points += 1 if player.slider_value7 == player.n_7: player.points += 1 if player.slider_value8 == player.n_8: player.points += 1 if player.slider_value9 == player.n_9: player.points += 1 if player.slider_value10 == player.n_10: player.points += 1 if player.slider_value11 == player.n_11: player.points += 1 if player.slider_value12 == player.n_12: player.points += 1 if player.slider_value13 == player.n_13: player.points += 1 if player.slider_value14 == player.n_14: player.points += 1 if player.slider_value15 == player.n_15: player.points += 1 if player.slider_value16 == player.n_16: player.points += 1 if player.slider_value17 == player.n_17: player.points += 1 if player.slider_value18 == player.n_18: player.points += 1 if player.slider_value19 == player.n_19: player.points += 1 if player.slider_value20 == player.n_20: player.points += 1 if player.slider_value21 == player.n_21: player.points += 1 if player.slider_value22 == player.n_22: player.points += 1 if player.slider_value23 == player.n_23: player.points += 1 if player.slider_value24 == player.n_24: player.points += 1 if player.slider_value25 == player.n_25: player.points += 1 if player.slider_value26 == player.n_26: player.points += 1 if player.slider_value27 == player.n_27: player.points += 1 if player.slider_value28 == player.n_28: player.points += 1 if player.slider_value29 == player.n_29: player.points += 1 if player.slider_value30 == player.n_30: player.points += 1 if player.slider_value31 == player.n_31: player.points += 1 if player.slider_value32 == player.n_32: player.points += 1 if player.slider_value33 == player.n_33: player.points += 1 if player.slider_value34 == player.n_34: player.points += 1 if player.slider_value35 == player.n_35: player.points += 1 if player.slider_value36 == player.n_36: player.points += 1 if player.slider_value37 == player.n_37: player.points += 1 if player.slider_value38 == player.n_38: player.points += 1 if player.slider_value39 == player.n_39: player.points += 1 if player.slider_value40 == player.n_40: player.points += 1 player.p_number_sent = player.points pass class SRound4(Page): form_model = "player" form_fields = ['slider_value1', 'slider_value2', 'slider_value3', 'slider_value4', 'slider_value5', 'slider_value6', 'slider_value7', 'slider_value8', 'slider_value9', 'slider_value10', 'slider_value11', 'slider_value12', 'slider_value13', 'slider_value14', 'slider_value15', 'slider_value16', 'slider_value17', 'slider_value18', 'slider_value19', 'slider_value20', 'slider_value21', 'slider_value22', 'slider_value23', 'slider_value24', 'slider_value25', 'slider_value26', 'slider_value27', 'slider_value28', 'slider_value29', 'slider_value30', 'slider_value31', 'slider_value32', 'slider_value33', 'slider_value34', 'slider_value35', 'slider_value36', 'slider_value37', 'slider_value38', 'slider_value39', 'slider_value40', "p_number_sent"] def is_displayed(player): rund = max(player.round_number - 1, 1) past_player = player.in_round(rund) return ((player.id_in_group == 2 and past_player.group.delayW1 > 20) or (player.id_in_group == 3 and past_player.group.delayW2 > 20) or (player.id_in_group == 4 and past_player.group.delayW3 > 20)) timeout_seconds = C.TIME_LIMIT @staticmethod def vars_for_template(player: Player): start_issue = C.ISSUE_START player.n_1 = random.randint(1, 100) player.n_2 = random.randint(1, 100) player.n_3 = random.randint(1, 100) player.n_4 = random.randint(1, 100) player.n_5 = random.randint(1, 100) player.n_6 = random.randint(1, 100) player.n_7 = random.randint(1, 100) player.n_8 = random.randint(1, 100) player.n_9 = random.randint(1, 100) player.n_10 = random.randint(1, 100) player.n_11 = random.randint(1, 100) player.n_12 = random.randint(1, 100) player.n_13 = random.randint(1, 100) player.n_14 = random.randint(1, 100) player.n_15 = random.randint(1, 100) player.n_16 = random.randint(1, 100) player.n_17 = random.randint(1, 100) player.n_18 = random.randint(1, 100) player.n_19 = random.randint(1, 100) player.n_20 = random.randint(1, 100) player.n_21 = random.randint(1, 100) player.n_22 = random.randint(1, 100) player.n_23 = random.randint(1, 100) player.n_24 = random.randint(1, 100) player.n_25 = random.randint(1, 100) player.n_26 = random.randint(1, 100) player.n_27 = random.randint(1, 100) player.n_28 = random.randint(1, 100) player.n_29 = random.randint(1, 100) player.n_30 = random.randint(1, 100) player.n_31 = random.randint(1, 100) player.n_32 = random.randint(1, 100) player.n_33 = random.randint(1, 100) player.n_34 = random.randint(1, 100) player.n_35 = random.randint(1, 100) player.n_36 = random.randint(1, 100) player.n_37 = random.randint(1, 100) player.n_38 = random.randint(1, 100) player.n_39 = random.randint(1, 100) player.n_40 = random.randint(1, 100) @staticmethod def before_next_page(player, timeout_happened): if player.slider_value1 == player.n_1: player.points += 1 if player.slider_value2 == player.n_2: player.points += 1 if player.slider_value3 == player.n_3: player.points += 1 if player.slider_value4 == player.n_4: player.points += 1 if player.slider_value5 == player.n_5: player.points += 1 if player.slider_value6 == player.n_6: player.points += 1 if player.slider_value7 == player.n_7: player.points += 1 if player.slider_value8 == player.n_8: player.points += 1 if player.slider_value9 == player.n_9: player.points += 1 if player.slider_value10 == player.n_10: player.points += 1 if player.slider_value11 == player.n_11: player.points += 1 if player.slider_value12 == player.n_12: player.points += 1 if player.slider_value13 == player.n_13: player.points += 1 if player.slider_value14 == player.n_14: player.points += 1 if player.slider_value15 == player.n_15: player.points += 1 if player.slider_value16 == player.n_16: player.points += 1 if player.slider_value17 == player.n_17: player.points += 1 if player.slider_value18 == player.n_18: player.points += 1 if player.slider_value19 == player.n_19: player.points += 1 if player.slider_value20 == player.n_20: player.points += 1 if player.slider_value21 == player.n_21: player.points += 1 if player.slider_value22 == player.n_22: player.points += 1 if player.slider_value23 == player.n_23: player.points += 1 if player.slider_value24 == player.n_24: player.points += 1 if player.slider_value25 == player.n_25: player.points += 1 if player.slider_value26 == player.n_26: player.points += 1 if player.slider_value27 == player.n_27: player.points += 1 if player.slider_value28 == player.n_28: player.points += 1 if player.slider_value29 == player.n_29: player.points += 1 if player.slider_value30 == player.n_30: player.points += 1 if player.slider_value31 == player.n_31: player.points += 1 if player.slider_value32 == player.n_32: player.points += 1 if player.slider_value33 == player.n_33: player.points += 1 if player.slider_value34 == player.n_34: player.points += 1 if player.slider_value35 == player.n_35: player.points += 1 if player.slider_value36 == player.n_36: player.points += 1 if player.slider_value37 == player.n_37: player.points += 1 if player.slider_value38 == player.n_38: player.points += 1 if player.slider_value39 == player.n_39: player.points += 1 if player.slider_value40 == player.n_40: player.points += 1 player.p_number_sent = player.points pass ### summary class TaskResult(Page): def is_displayed(player): return player.id_in_group != 1 def vars_for_template(player): production = player.p_number_sent if production == 1: unit = "unit" else: unit = "units" return{"prod":production, "unit":unit} #### CHAT class Chat(Page): #timeout_seconds = C.CHAT_TIME_LIMIT def is_displayed(player): return player.id_in_group != 1 @staticmethod def vars_for_template(player): rund = str(player.round_number) +"_"+ str(player.group.id) time = C.CHAT_TIME_LIMIT def chat_nickname(player): nick = 'Worker {}'.format(player.id_in_group - 1) nick1 = nick + "." + str(player.round_number) return nick return {"nickname": chat_nickname(player), "rund":rund, "time":time} #return dict( # nickname= chat_nickname(player) #) ### complaining process class Complaining(Page): form_model = 'player' form_fields = ['p_complain'] def is_displayed(player): return player.id_in_group != 1 pass class MissedUnits(Page): form_model = 'player' form_fields = ['missed_units'] def is_displayed(player): return player.id_in_group != 1 and player.p_complain == "Yes" pass class ComplainingChoice(Page): form_model = "player" form_fields = ["complaining_choice"] def is_displayed(player): return player.id_in_group != 1 and player.p_complain == "Yes" #### cont here!!!! pass ### ROUND Payoffs ## waipage before deciding the vote class MyWaitPage(WaitPage): def after_all_players_arrive(self): c_treshold = 0 if self.group.get_player_by_id(2).p_complain == "Yes": c_treshold += 1 if self.group.get_player_by_id(3).p_complain == "Yes": c_treshold += 1 if self.group.get_player_by_id(4).p_complain == "Yes": c_treshold += 1 if c_treshold > 0: cc = "Individual complaint" else: cc = "No Complaint" self.group.complaint = cc #### ROUND PAYOFFS ############### class RoundPO_W(Page): def is_displayed(player): return player.id_in_group != 1 def vars_for_template(player): ## needs to be updated for more workers ## add treshold to the other treatments as well! count = 0 if player.group.get_player_by_id(2).p_complain == "Yes": count += 1 if player.group.get_player_by_id(3).p_complain == "Yes": count += 1 if player.group.get_player_by_id(4).p_complain == "Yes": count += 1 if count >1: count = count else: count = 0 xx = player.p_number_sent * C.W_MULTIPLIER xx_total = int(sum(p.round_payoff for p in player.in_previous_rounds()) +xx) return {"payoff": xx, "total_payoff":xx_total, "comp": player.group.complaint, "count" : count} def before_next_page(player, timeout_happened): xx = player.p_number_sent * C.W_MULTIPLIER count = 0 if player.group.get_player_by_id(2).p_complain == "Yes": count += 1 if player.group.get_player_by_id(3).p_complain == "Yes": count += 1 if player.group.get_player_by_id(4).p_complain == "Yes": count += 1 if count >1: player.group.complaint = "Collective" pass #### Manager's turn #observation class ManagerObserves(Page): def is_displayed(player): return player.id_in_group == 1 def vars_for_template(player): player_2 = player.group.get_player_by_id(2) player_2_value = player_2.p_number_sent player_3 = player.group.get_player_by_id(3) player_3_value = player_3.p_number_sent player_4 = player.group.get_player_by_id(4) player_4_value = player_4.p_number_sent revenue = (player_2_value + player_3_value + player_4_value ) * C.M_MULTIPLIER # + C.PARTICIP_M ## + player_4_value!! ## add players 4, 5, 6 ..... p2_vector = ([p.p_number_sent for p in player.group.get_player_by_id(2).in_previous_rounds()] + [player.group.get_player_by_id(2).p_number_sent]) p3_vector = ([p.p_number_sent for p in player.group.get_player_by_id(3).in_previous_rounds()] + [player.group.get_player_by_id(3).p_number_sent]) p4_vector = ([p.p_number_sent for p in player.group.get_player_by_id(4).in_previous_rounds()] + [player.group.get_player_by_id(4).p_number_sent]) if player_2_value == 1: unit2 = "unit" else: unit2 = "units" if player_3_value == 1: unit3 = "unit" else: unit3 = "units" if player_4_value == 1: unit4 = "unit" else: unit4 = "units" n = player.round_number names = ["Worker"] + [f"Round {i}" for i in range(1, n + 1)] return {"number_sent2": player_2_value, "number_sent3": player_3_value, "unit2" : unit2, "unit3" : unit3, "unit4":unit4, "revenue": revenue, "all2":p2_vector, "all3":p3_vector, "names":names, "all4":p4_vector , "number_sent4": player_4_value} pass #complaints overview #collective class CollectiveComplaint(Page): def is_displayed(player): return player.id_in_group == 1 and player.group.complaint == "Collective" def vars_for_template(player): x1 = player.group.get_player_by_id(2).missed_units x2 = player.group.get_player_by_id(3).missed_units x3 = player.group.get_player_by_id(4).missed_units if (x1 + x2 + x3) <= 1: unit = "unit" else: unit = "units" cost = 0 x = 0 if player.group.get_player_by_id(2).p_complain == "Yes": x += x1 c1 = "Worker 1 " cost += C.COMP_COST else: c1 = "" if player.group.get_player_by_id(3).p_complain == "Yes": x += x2 c2 = "Worker 2 " cost += C.COMP_COST else: c2 = "" if player.group.get_player_by_id(4).p_complain == "Yes": x += x3 c3 = "Worker 3 " cost += C.COMP_COST else: c3 = "" player.group.complaining_cost = cost ### the following just modifies the pronouns in the message's text if (player.group.get_player_by_id(2).field_maybe_none("complaining_choice") == "Collective complaint" and player.group.get_player_by_id(3).field_maybe_none("complaining_choice") == "Collective complaint") or (player.group.get_player_by_id(2).field_maybe_none("complaining_choice") == "Collective complaint" and player.group.get_player_by_id(4).field_maybe_none("complaining_choice") == "Collective complaint") or (player.group.get_player_by_id(3).field_maybe_none("complaining_choice") == "Collective complaint" and player.group.get_player_by_id(4).field_maybe_none("complaining_choice") == "Collective complaint"): #if (player.group.get_player_by_id(2).field_maybe_none( # "complaining_choice") == "Collective complaint" and player.group.get_player_by_id( # 3).field_maybe_none("complaining_choice") == "Collective complaint"): pronoun1 = "we" pronoun2 = "our" else: pronoun1 = "I" pronoun2 = "my" return {"missed_units": x, "c1":c1, "c2":c2,"c3":c3, "pron1": pronoun1, "pron2":pronoun2, "unit":unit } def before_next_page(player, timeout_happened): player.group.get_player_by_id(1).p_decision = None pass #individual class IndividualComplaint1(Page): def is_displayed(player): return (player.id_in_group == 1 and player.group.get_player_by_id(2).p_complain == "Yes") def vars_for_template(player): xx = player.group.get_player_by_id(2).missed_units if xx == 1: uni = "unit" else: uni = "units" return {"missed_units": xx, "uni": uni} def before_next_page(player, timeout_happened): player.group.get_player_by_id(1).p_decision = None player.group.complaining_cost += C.COMP_COST pass class IndividualComplaint2(Page): def is_displayed(player): return (player.id_in_group == 1 and player.group.get_player_by_id(3).p_complain == "Yes") def vars_for_template(player): xx = player.group.get_player_by_id(3).missed_units if xx == 1: uni = "unit" else: uni = "units" return {"missed_units": xx, "uni": uni} def before_next_page(player, timeout_happened): player.group.get_player_by_id(1).p_decision = None player.group.complaining_cost += C.COMP_COST pass class IndividualComplaint3(Page): def is_displayed(player): return (player.id_in_group == 1 and player.group.get_player_by_id(4).p_complain == "Yes") def vars_for_template(player): xx = player.group.get_player_by_id(4).missed_units if xx == 1: uni = "unit" else: uni = "units" return {"missed_units": xx, "uni": uni} def before_next_page(player, timeout_happened): player.group.get_player_by_id(1).p_decision = None player.group.complaining_cost += C.COMP_COST pass class Decision(Page): form_model = 'player' form_fields = ['p_decision'] def is_displayed(player): return (player.id_in_group == 1 and player.group.complaint != "No complaint") def vars_for_template(self): player_2 = self.group.get_player_by_id(2) player_2_value = player_2.p_number_sent player_3 = self.group.get_player_by_id(3) player_3_value = player_3.p_number_sent player_4 = self.group.get_player_by_id(4) player_4_value = player_4.p_number_sent revenue = (player_2_value + player_3_value + player_4_value) * C.M_MULTIPLIER #+...+ player_4_value...+ C.PARTICIP_M cost = C.FIX_COST total_budget = int(revenue + sum(p.round_payoff for p in self.in_previous_rounds())) #self.p_decision = None return {"number_sent2": player_2_value, "number_sent3": player_3_value, "number_sent4": player_4_value, "cost": cost, "revenue": revenue, "total":total_budget } #"number_sent4": player_4_value def before_next_page(player, timeout_happened): n1 = random.randint(0, 100) n2 = random.randint(0, 100) n3 = random.randint(0, 100) if player.round_number >1: previous_player = player.in_round(player.round_number - 1) player.group.delayW1 = previous_player.group.delayW1 player.group.delayW2 = previous_player.group.delayW2 player.group.delayW3 = previous_player.group.delayW3 if n1 < C.WORSENING and player.group.delayW1 != 0: player.group.delayW1 *= 2 if n1 < C.WORSENING and player.group.delayW1 == 0: player.group.delayW1 = 5 if n2 < C.WORSENING and player.group.delayW2 != 0: player.group.delayW2 *= 2 if n2 < C.WORSENING and player.group.delayW2 == 0: player.group.delayW2 = 5 if n3 < C.WORSENING and player.group.delayW3 != 0: player.group.delayW3 *= 2 if n3 < C.WORSENING and player.group.delayW3 == 0: player.group.delayW3 = 5 if player.p_decision == "Yes": player.group.delayW1 = 0 player.group.delayW2 = 0 player.group.delayW3 = 0 pass class ManagerRoundPayoff(Page): def is_displayed(player): return player.id_in_group == 1 def vars_for_template(player): if player.p_decision == "Yes": xx = (player.group.get_player_by_id(2).p_number_sent + player.group.get_player_by_id(3).p_number_sent + player.group.get_player_by_id(4).p_number_sent )* C.M_MULTIPLIER - C.FIX_COST # ++ player.group.get_player_by_id(4).p_number_sent... + C.PARTICIP_W else: xx = (player.group.get_player_by_id(2).p_number_sent + player.group.get_player_by_id(3).p_number_sent + player.group.get_player_by_id(4).p_number_sent )* C.M_MULTIPLIER #++ player.group.get_player_by_id(4).p_number_sent...+ C.PARTICIP_W total = int(sum(p.round_payoff for p in player.in_previous_rounds() ) + xx) return {"payoff": xx, "total": total} def before_next_page(player, timeout_happened): if player.p_decision == "Yes": xx = (player.group.get_player_by_id(2).p_number_sent + player.group.get_player_by_id(3).p_number_sent + player.group.get_player_by_id(4).p_number_sent )* C.M_MULTIPLIER - C.FIX_COST # + + player.group.get_player_by_id(4).p_number_sent.... + C.PARTICIP_M else: xx = (player.group.get_player_by_id(2).p_number_sent + player.group.get_player_by_id(3).p_number_sent + player.group.get_player_by_id(4).p_number_sent )* C.M_MULTIPLIER #+ + player.group.get_player_by_id(4).p_number_sent...+ C.PARTICIP_M player.round_payoff = xx pass #### total payoffs class ResultsW(Page): def is_displayed(player): return player.id_in_group != 1 def vars_for_template(player): produced = player.p_number_sent if produced == 1: uni = "unit" else: uni = "units" if player.p_complain == "No": comp = "did not" else: comp = "did" if player.group.get_player_by_id(1).p_decision == "Yes": dec = "The manager fixed the issue. In the next round no issue will occur." else: dec = "The manager did not fix the issue. In the next round the issue may occur." total = int(sum(p.round_payoff for p in player.in_previous_rounds() ) + produced) count = 0 if player.group.get_player_by_id(2).p_complain == "Yes": count += 1 if player.group.get_player_by_id(3).p_complain == "Yes": count += 1 if player.group.get_player_by_id(4).p_complain == "Yes": count += 1 if count < 2: count = 0 return{ "prod": produced, "uni": uni, "comp": comp,"dec": dec, "total":total, "count":count} class ResultsM(Page): def is_displayed(player): return player.id_in_group == 1 def vars_for_template(self): player_2 = self.group.get_player_by_id(2) player_2_value = player_2.p_number_sent player_3 = self.group.get_player_by_id(3) player_3_value = player_3.p_number_sent player_4 = self.group.get_player_by_id(4) player_4_value = player_4.p_number_sent p_dec = self.group.get_player_by_id(1).p_decision rund = max(self.round_number - 1, 1) dellay = self.group.in_round(rund).delay roundd = self.round_number round_payoff = int(self.round_payoff) if self.p_decision == "No": fix = "You did not fix any issue." else: fix = "You fixed the issue." if player_2_value == 1: uni1 = "unit" else: uni1 = "units" if player_3_value == 1: uni2 = "unit" else: uni2 = "units" if player_4_value == 1: uni3 = "unit" else: uni3 = "units" total = int(sum(p.round_payoff for p in self.in_previous_rounds() ) +round_payoff) return { 'p_decision': p_dec, "number_sent2": player_2_value, "number_sent3": player_3_value, "number_sent4": player_4_value, "del":dellay, "rund":roundd, "round_payoff": round_payoff, "fix": fix, "uni1": uni1, "uni2":uni2, "uni3": uni3, "total":total, } ### issue generation #def before_next_page(self, timeout_happened): # if self.group.get_player_by_id(1).p_decision == "No": # ## if there is no issue it may get worse from 0 to 5 # if self.group.in_round(max(self.round_number - 1,1)).delay == 0: # randy = random.randint(1, 100) # if randy >= C.PROB_ISSUE_THE_SAME: # delay = C.MIN_ISSUE # self.group.delay = delay # else: # randy = random.randint(1, 100) # if randy >= C.PROB_ISSUE_THE_SAME: # delly = 2 * self.group.in_round(max(self.round_number - 1,1)).delay # self.group.delay = delly ## if "Yes" than issue disappers for the next round #else: # self.group.delay = 0 # pass ## bonus class Bonus4(Page): form_model = "group" form_fields = ['w1_bon', "w2_bon", "w3_bon"] def is_displayed(player): return player.round_number == player.group.in_round(1).stop_round and player.id_in_group == 1 def vars_for_template(player): budget = sum(p.round_payoff for p in player.in_previous_rounds() ) + player.round_payoff b = max(round(budget * C.BONUS_SHARE,2),0) return {"budget":b} def before_next_page(player, timeout_happened): bud = player.group.w1_bon + player.group.w2_bon + player.group.w3_bon if bud > 0: player.group.w1_bon_pct = player.group.w1_bon / bud player.group.w2_bon_pct = player.group.w2_bon / bud player.group.w3_bon_pct = player.group.w3_bon / bud else: player.group.w1_bon_pct = -1 player.group.w2_bon_pct = -1 player.group.w3_bon_pct = -1 def error_message(player, values): budget = sum(p.round_payoff for p in player.in_previous_rounds()) + player.round_payoff b = max(round(budget * C.BONUS_SHARE, 2), 0) if values['w1_bon'] + values['w2_bon'] + values['w3_bon'] != b: return f"The sum of the three numbers must be exactly {b}." ## FINAL PAYOFFS class PayoffM(Page): form_model = "player" def is_displayed(self): return self.round_number == self.group.in_round(1).stop_round and self.id_in_group == 1 def vars_for_template(player): profit = int(sum(p.round_payoff for p in player.in_previous_rounds()) + player.round_payoff) cost = int(sum(p.group.complaining_cost for p in player.in_previous_rounds()) + player.group.complaining_cost) total = round(max(profit * (1 - C.BONUS_SHARE) - cost,0),2) eighty = profit * (1 - C.BONUS_SHARE) player.final_payoff = round(total, 1) return {"profit": profit, "cost":cost, "total" : total, "eighty":eighty} pass class PayoffW2(Page): form_model = "player" def is_displayed(self): return self.round_number == self.group.in_round(1).stop_round and self.id_in_group != 1 def vars_for_template(player): payoff = sum( p.p_number_sent for p in player.in_previous_rounds() ) + player.p_number_sent if player.id_in_group == 2: bonus = player.group.w1_bon if player.id_in_group == 3: bonus = player.group.w2_bon if player.id_in_group == 4: bonus = player.group.w3_bon total = round(payoff + bonus,2) return {"payoff": payoff, "bonus":bonus, "total":total} ### THANKS!! class ThanksPage(Page): def is_displayed(self): return self.round_number == self.group.in_round(1).stop_round def vars_for_template(player): #payoff = round(player.final_payoff * C.ECUEUR,2) if player.id_in_group == 1: payoff = round(player.final_payoff * C.ECUEUR,2) else: pay = sum( p.p_number_sent for p in player.in_previous_rounds() ) + player.p_number_sent if player.id_in_group == 2: bonus = player.group.w1_bon if player.id_in_group == 3: bonus = player.group.w2_bon if player.id_in_group == 4: bonus = player.group.w3_bon payoff = round((pay + bonus)* C.ECUEUR,2) total_payoff = round(payoff + C.PARTICIP_FEE,2) base = "https://maastrichtuniversity.eu.qualtrics.com/jfe/form/SV_cSVUoaL3pJ9V76u" treatment = C.TREATMENT pay = total_payoff link = f"{base}?Treatment={treatment}&Payoff={pay}" return {"payoff": payoff, "tpayoff": total_payoff, "link": link} class WaitPager(WaitPage): pass class IntroWait(WaitPage): def is_displayed(self): return self.round_number == 1 # change so that only in round 1!! wait_for_all_groups = True title_text = "Welcome to the experiment!" body_text = ("Please, wait in silence until all the participants are ready.") pass # imports dev = [ Welcome, InstructionsW, InstructionsM, WaitPager, S_Starter, SRound0, SRound1, SRound2, SRound3,SRound4,TaskResult, WaitPager, Chat, Complaining, MissedUnits, MyWaitPage, ## add collective complaint RoundPO_W, WaitPager, ManagerObserves, CollectiveComplaint,Decision, ManagerRoundPayoff, WaitPager, ResultsM, ResultsW, Bonus4, WaitPager, PayoffM, PayoffW2,ThanksPage] full = [ IntroWait, Welcome, Demographics, Risk0, Risk1, Risk2, Risk3, Risk4, Risk5, Risk6, Risk7, Risk8, Risk9, Risk10, Risk11, Risk12, Risk13, Risk14, Risk15, Risk16, Risk17, Risk18,Risk19, Risk20, Risk21, Risk22, Risk23, Risk24, Risk25, Risk26, Risk27, Risk28, Risk29, Risk30, Risk31, InstructionsW, InstructionsM, Comprehension, WaitPager, S_Starter, SRound0, SRound1, SRound2, SRound3,SRound4,TaskResult, WaitPager, Chat, Complaining, MissedUnits, MyWaitPage, RoundPO_W, WaitPager, ManagerObserves, CollectiveComplaint, Decision, ManagerRoundPayoff, WaitPager, ResultsM, ResultsW, Bonus4, WaitPager, PayoffM, PayoffW2, ThanksPage] page_sequence = full ## dev list!! #page_sequence = [ Welcome, InstructionsW, InstructionsM, # WaitPager, S_Starter, # SRound0, SRound1, SRound2, SRound3,SRound4,TaskResult, # WaitPager, Complaining, MissedUnits, MyWaitPage, ## add collective complaint # RoundPO_W, WaitPager, ManagerObserves, CollectiveComplaint,Decision, # ManagerRoundPayoff, WaitPager, ResultsM, ResultsW, Bonus4, WaitPager, # PayoffM, PayoffW2,ThanksPage] ## full one!! #page_sequence = [ IntroWait, Welcome, Demographics, Risk0, # Risk1, Risk2, Risk3, Risk4, Risk5, Risk6, Risk7, # Risk8, Risk9, Risk10, Risk11, Risk12, Risk13, Risk14, Risk15, Risk16, Risk17, # Risk18,Risk19, Risk20, Risk21, Risk22, Risk23, Risk24, Risk25, Risk26, Risk27, # Risk28, Risk29, Risk30, Risk31, # InstructionsW, InstructionsM, Comprehension, WaitPager, S_Starter, # SRound0, SRound1, SRound2, SRound3,SRound4,TaskResult, # WaitPager, Chat, Complaining, MissedUnits, MyWaitPage, # RoundPO_W, WaitPager, ManagerObserves, Decision, # ManagerRoundPayoff, WaitPager, ResultsM, ResultsW, Bonus4, WaitPager, # PayoffM, PayoffW2, ThanksPage]