from otree.api import * import random doc = """ simple experimental design for both treatments and voting """ class C(BaseConstants): NAME_IN_URL = 'simple' PLAYERS_PER_GROUP = 3 # workers per group + 1 manager included MIN_ROUNDS = 3 MAX_ROUNDS = 4 NUM_ROUNDS = random.randint(MIN_ROUNDS, MAX_ROUNDS) W_MULTIPLIER = 1 M_MULTIPLIER = 1 COMP_COST = 2 FIX_COST = 5 MIN_ISSUE = 5 PROB_ISSUE_THE_SAME = 0 # meaning 99% chance to worsen TIME_LIMIT = 3 # time per round BONUS = 5 # BONUS IN ECU EVAL = random.randint(1, NUM_ROUNDS) ## random period to allocate payoff PARTICIP_W = 5 ## participation fees PARTICIP_M = 5 BONUS_BUDGET = 10 B_MULTIPLIER = 2 BONUS_SHARE = .2 CHAT_TIME_LIMIT = 100 ECUEUR = 1/10 # 1eur to 20 ecu 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" class Subsession(BaseSubsession): pass class Group(BaseGroup): delay = models.FloatField(min=0, initial=0) eval_round = models.FloatField(min=0, initial=C.NUM_ROUNDS) complaint = models.StringField(initial = "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") pass class Player(BasePlayer): p_number_sent = models.IntegerField(min=0, label=" ") p_decision = models.StringField(choices=["Yes", "No"], widget=widgets.RadioSelectHorizontal, initial = "No", 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) ## sliders points = models.IntegerField(initial=0, min=0) 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) pass # PAGES class Welcome(Page): def is_displayed(player): return player.round_number == 1 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} 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} pass ###class Comprehension(Page): ## pass #### REAL EFFORT TASKS class S_Starter(Page): def is_displayed(player): return player.id_in_group != 1 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): rund = max(player.round_number - 1, 1) return player.id_in_group != 1 and player.group.in_round(rund).delay == 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) return player.id_in_group != 1 and player.group.in_round(rund).delay == 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) return player.id_in_group != 1 and player.group.in_round(rund).delay == 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) return player.id_in_group != 1 and player.group.in_round(rund).delay == 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) return player.id_in_group != 1 and player.group.in_round(rund).delay >= 40 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 #### 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) 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} #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 #### 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! xx = player.p_number_sent * C.W_MULTIPLIER c_treshold = 0 try: d1 = player.group.get_player_by_id(2).complaining_choice c_treshold += 1 except: d1 = 0 try: d2 = player.group.get_player_by_id(3).complaining_choice c_treshold += 1 except: d2 = 0 #d3 = player.group.get_player_by_id(4) voting = 0 if d1 == "Collective complaint": voting += 1 elif d1 == "Individual complaint": voting += -1 elif d2 == "Collective complaint": voting += 1 elif d2 == "Individual complaint": voting += -1 if (voting > 0 and c_treshold > 1): player.group.complaint = "Collective complaint" elif voting <0: player.group.complaint = "Individual complaint"\ elif voting == 0 and c_treshold > 0: x = random.randint(0, 1) if x == 0: player.group.complaint = "Collective complaint" else: player.group.complaint = "Individual complaint" else: player.group.complaint = "No Complaint" comp = player.group.complaint return {"payoff": xx, "d1":d1, "d2":d2, "comp": player.group.complaint} def before_next_page(player, timeout_happened): xx = player.p_number_sent * C.W_MULTIPLIER player.round_payoff = xx 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 ) * 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 complaint" 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) <= 1: unit = "unit" else: unit = "units" x = 0 if player.group.get_player_by_id(2).p_complain == "Yes": x += x1 c1 = "Worker 1 " else: c1 = "" if player.group.get_player_by_id(3).p_complain == "Yes": x += x2 c2 = "Worker 2 " else: c2 = "" #if player.group.get_player_by_id(2).p_complain == "Yes": # x += x3 # c3 = "Worker 3 " #else: # c3 = "" ### 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, "pron1": pronoun1, "pron2":pronoun2, "unit":unit } #"c3":c3, 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.complaint == "Individual complaint" 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 pass class IndividualComplaint2(Page): def is_displayed(player): return (player.id_in_group == 1 and player.group.complaint == "Individual complaint" 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 pass #class ManagerComplains3(Page): # def is_displayed(player): # return (player.id_in_group == 1 and player.group.field_maybe_none(complaint) == "Individual complaint" and # player.group.get_player_by_id(4).field_maybe_none(p_complain) == "Yes") #def vars_for_template(player): # xx = player.group.get_player_by_id(4).missed_units # return {"missed_units": xx} #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 ) * C.M_MULTIPLIER #+...+ player_4_value...+ C.PARTICIP_M cost = C.FIX_COST #self.p_decision = None return {"number_sent2": player_2_value, "number_sent3": player_3_value , "cost": cost, "revenue": revenue } #"number_sent4": player_4_value 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 )* 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 )* C.M_MULTIPLIER #++ player.group.get_player_by_id(4).p_number_sent...+ C.PARTICIP_W return {"payoff": xx} 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 )* 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 )* 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." mode = player.group.complaint return{ "prod": produced, "uni": uni, "comp": comp,"dec": dec, "mode":mode} 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" 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, } ### 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 Bonus2(Page): form_model = "group" form_fields = ['w1_bon', "w2_bon" , "w3_bon"] def is_displayed(self): return self.round_number == C.NUM_ROUNDS and self.id_in_group == 1 and (self.group.get_player_by_id(2)) def vars_for_template(player): if player.group.get_player_by_id(1).p_decision == "Yes": budget = ((player.group.get_player_by_id(2).p_number_sent + player.group.get_player_by_id(3).p_number_sent) * C.M_MULTIPLIER - C.FIX_COST ) * C.BONUS_SHARE if budget <0: b = 0 else: b = round(budget, 2) else: budget = ((player.group.get_player_by_id(2).p_number_sent + player.group.get_player_by_id(3).p_number_sent) * C.M_MULTIPLIER ) * C.BONUS_SHARE if budget < 0: b = 0 else: b = round(budget, 2) return {"budget":b} def error_message(player, values): if player.group.get_player_by_id(1).p_decision == "Yes": budget = ((player.group.get_player_by_id(2).p_number_sent + player.group.get_player_by_id(3).p_number_sent) * C.M_MULTIPLIER - C.FIX_COST) * C.BONUS_SHARE if budget < 0: b = 0 else: b = round(budget, 2) else: budget = ((player.group.get_player_by_id(2).p_number_sent + player.group.get_player_by_id(3).p_number_sent) * C.M_MULTIPLIER) * C.BONUS_SHARE if budget < 0: b = 0 else: b = round(budget, 2) if values['w1_bon'] + values['w2_bon'] + values['w3_bon'] != b: return f"The sum of the three numbers must be exactly {b}." if values['w1_bon'] < 0: return "The amount to Worker 1 has to be non-negative." if values['w2_bon'] < 0: return "The amount to Worker 2 has to be non-negative." if values['w3_bon'] < 0: return "The amount to Worker 3 has to be non-negative." ### bonus 3 - share of company profit, cannot be negative - not displayed to the manager, # no negative values class Bonus3(Page): form_model = "group" form_fields = ['w1_bon', "w2_bon", "w3_bon"] def is_displayed(player): if player.in_round(C.EVAL).p_decision == "No": try: budget = (player.group.get_player_by_id(2).in_round(C.EVAL).field_maybe_none("p_number_sent") + player.group.get_player_by_id(3).in_round(C.EVAL).field_maybe_none("p_number_sent")) except: budget = 0 else: try: budget = (player.group.get_player_by_id(2).in_round(C.EVAL).field_maybe_none("p_number_sent") + player.group.get_player_by_id(3).in_round(C.EVAL).field_maybe_none("p_number_sent")) - C.FIX_COST except: budget = 0 return player.round_number == C.NUM_ROUNDS and player.id_in_group == 1 and budget >0 def vars_for_template(player): if player.in_round(C.EVAL).p_decision == "No": budget = (player.group.get_player_by_id(2).in_round(C.EVAL).p_number_sent + player.group.get_player_by_id(3).in_round(C.EVAL).p_number_sent) * C.BONUS_SHARE else: budget = (player.group.get_player_by_id(2).in_round(C.EVAL).p_number_sent + player.group.get_player_by_id(3).in_round(C.EVAL).p_number_sent - C.FIX_COST ) * C.BONUS_SHARE b = round(budget, 2) return {"budget":b} def error_message(player, values): if player.in_round(C.EVAL).p_decision == "No": budget = (player.group.get_player_by_id(2).in_round(C.EVAL).p_number_sent + player.group.get_player_by_id(3).in_round(C.EVAL).p_number_sent) * C.BONUS_SHARE else: budget = (player.group.get_player_by_id(2).in_round(C.EVAL).p_number_sent + player.group.get_player_by_id(3).in_round(C.EVAL).p_number_sent - C.FIX_COST) * C.BONUS_SHARE b = round(budget, 2) 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 == C.NUM_ROUNDS and self.id_in_group == 1 def vars_for_template(player): payoff = round((player.in_round(C.EVAL).round_payoff) * (1 - C.BONUS_SHARE),2) Round = C.EVAL player.final_payoff = payoff euro = round(payoff * C.ECUEUR,2) player.payoff = euro return {"payoff": payoff, "round":Round, "eur":euro} pass class PayoffW(Page): form_model = "player" #form_fields = ["final_payoff"] def is_displayed(self): return self.round_number == C.NUM_ROUNDS and self.id_in_group != 1 def vars_for_template(player): if player.id_in_group == 2: payoff = player.in_round(C.EVAL).round_payoff + player.group.in_round(C.NUM_ROUNDS).w1_bon round_po = player.in_round(C.EVAL).round_payoff bonus_po = player.group.in_round(C.NUM_ROUNDS).w1_bon player.final_payoff = round(payoff,2) euro = round(payoff * C.ECUEUR,2) player.payoff = euro elif player.id_in_group == 3: payoff = player.in_round(C.EVAL).round_payoff + player.group.in_round(C.NUM_ROUNDS).w2_bon round_po = player.in_round(C.EVAL).round_payoff bonus_po = player.group.in_round(C.NUM_ROUNDS).w2_bon player.final_payoff = round(payoff,2) euro = round(payoff * C.ECUEUR, 2) player.payoff = euro #elif player.id_in_group == 4: # payoff = player.in_round(C.EVAL).round_payoff + player.group.in_round(C.NUM_ROUNDS).w3_bon # round_po = player.in_round(C.EVAL).round_payoff # bonus_po = player.group.in_round(C.NUM_ROUNDS).w3_bon # player.final_payoff = round(payoff,2) #### and add extra players else: payoff = 0.999 Round = C.EVAL Idd = player.id_in_group return {"payoff": payoff, "round":Round, "id": Idd, "bonus": bonus_po, "round_po": round_po, "eur" : euro} ### THANKS!! class ThanksPage(Page): def is_displayed(self): return self.round_number == C.NUM_ROUNDS def vars_for_template(player): payoff = round(player.final_payoff * C.ECUEUR,2) return {"payoff": payoff} class ThanksPage2(Page): def is_displayed(self): return self.round_number == C.NUM_ROUNDS pass class WaitPager(WaitPage): pass page_sequence = [Welcome, InstructionsW, InstructionsM, S_Starter, SRound0, SRound1, SRound2, SRound3,SRound4,WaitPager, Chat, Complaining, MissedUnits, ComplainingChoice, WaitPager, RoundPO_W, WaitPager, ManagerObserves, CollectiveComplaint, IndividualComplaint1, IndividualComplaint2, Decision, ManagerRoundPayoff, WaitPager, ResultsM, ResultsW, Bonus3, WaitPager, PayoffM, PayoffW,ThanksPage]