from otree.api import * import random from otree.models import player doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'interaction_02' PLAYERS_PER_GROUP = 4 # workers per group + 1 manager included MIN_ROUNDS = 2 MAX_ROUNDS = 2 NUM_ROUNDS = random.randint(MIN_ROUNDS, MAX_ROUNDS) W_MULTIPLIER = 4 M_MULTIPLIER = 1 COMP_COST = 2 FIX_COST = 5 MIN_ISSUE = 5 PROB_ISSUE_THE_SAME = 0 # meaning 99% chance to worsen TIME_LIMIT = 10 # 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 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) #w1_bonus = models.StringField(choices = ["Add", "0", "Subtract"], widget = widgets.RadioSelectHorizontal, initial = "0", label=" Worker 1") #w2_bonus = models.StringField(choices = ["Add", "0", "Subtract"], widget = widgets.RadioSelectHorizontal, initial = "0", label=" Worker 2") w1_bon = models.IntegerField(min = 0, max = C.BONUS_BUDGET,label=" The amount to Worker 1") w2_bon = models.IntegerField(min=0, max = C.BONUS_BUDGET, label=" The amount to Worker 2") w3_bon = models.IntegerField(min=0, max = C.BONUS_BUDGET, label=" The amount to Worker 3") #number_sent = models.IntegerField() #decision = models.StringField(choices = ["Yes","No"], widget = widgets.RadioSelect ) 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=" " ) missed_units = models.IntegerField(min=0, initial = 0, label=" ", max = 1000000 ) 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 ########################## ### WELCOME class Welcome(Page): def is_displayed(player): return player.round_number == 1 ## INSTRUCTIONS ########### 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 #### COMPREHENSION class ComprehensionW(Page): def is_displayed(player): return (player.id_in_group != 1 and player.round_number == 1) class ComprehensionM(Page): def is_displayed(player): return player.id_in_group == 1 and player.round_number == 1 ### SLIDER STARTER ####### class SliderStarter(Page): def is_displayed(player): return player.id_in_group != 1 #### SLIDERS ##### class SliderRound0(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 SliderRound1(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 SliderRound2(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 SliderRound3(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 SliderRound4(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 ### WORKERS' COMPLAINING PROCESS##################3 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" #### MANAGER'S TURN #############333 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 ## 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]) 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, "number_sent4": player_4_value, "revenue": revenue, "all2":p2_vector, "all3":p3_vector, "all4":p4_vector , "names":names} pass class ManagerComplainsCollect(Page): def is_displayed(player): return player.id_in_group == 1 and (player.group.get_player_by_id(2).p_complain == "Yes" or player.group.get_player_by_id(3).p_complain == "Yes" or player.group.get_player_by_id(4).p_complain == "Yes") 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 player.group.get_player_by_id(2).p_complain == "Yes": c1 = "Worker 1 " else: c1 = " " if player.group.get_player_by_id(3).p_complain == "Yes": c2 = "Worker 2 " else: c2 = " " if player.group.get_player_by_id(4).p_complain == "Yes": c3 = "Worker 3" else: c3 = " " if (player.group.get_player_by_id(2).p_complain == "Yes" and player.group.get_player_by_id(3).p_complain == "Yes") or (player.group.get_player_by_id(2).p_complain == "Yes" and player.group.get_player_by_id(4).p_complain == "Yes") or (player.group.get_player_by_id(3).p_complain == "Yes" and player.group.get_player_by_id(4).p_complain == "Yes"): pronoun1 = "we" pronoun2 = "our" else: pronoun1 = "I" pronoun2 = "my" return {"missed_units": x1 + x2 +x3, "c1":c1, "c2":c2, "c3":c3, "pron1": pronoun1, "pron2":pronoun2} pass pass class ManagerComplains1(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 return {"missed_units": xx} pass class ManagerComplains2(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 return {"missed_units": xx} pass class ManagerComplains3(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 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.get_player_by_id(2).p_complain == "Yes" or player.group.get_player_by_id(3).p_complain == "Yes" or player.group.get_player_by_id(4).p_complain == "Yes") 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 + C.PARTICIP_M cost = C.FIX_COST return {"number_sent2": player_2_value, "number_sent3": player_3_value, "number_sent4": player_4_value, "cost": cost, "revenue": revenue } pass ##### WAITING PAGE/S ###########3 class WaitPager(WaitPage): pass #### ROUND PAYOFFS ############### class WorkerRoundPayoff(Page): def is_displayed(player): return player.id_in_group != 1 def vars_for_template(player): if player.p_complain == "Yes": xx = player.p_number_sent * C.W_MULTIPLIER - C.COMP_COST + C.PARTICIP_W else: xx = player.p_number_sent * C.W_MULTIPLIER + C.PARTICIP_W return {"payoff": xx} def before_next_page(player, timeout_happened): if player.p_complain == "Yes": xx = player.p_number_sent * C.W_MULTIPLIER - C.COMP_COST + C.PARTICIP_W else: xx = player.p_number_sent * C.W_MULTIPLIER + C.PARTICIP_W player.round_payoff = xx 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 + 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 + 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 + player.group.get_player_by_id(4).p_number_sent)* C.M_MULTIPLIER - C.FIX_COST + 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 + C.PARTICIP_M player.round_payoff = xx pass #### RESULTS ############### 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." return{ "prod": produced, "uni": uni, "comp": comp,"dec": dec} 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 Bonus not used anymore class Bonus(Page): form_model = 'group' form_fields = ['w1_bonus', "w2_bonus"] def is_displayed(self): return self.round_number == C.NUM_ROUNDS and self.id_in_group == 1 ## not used anymore 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 def error_message(group, values): if values['w1_bon'] + values['w2_bon'] + values['w3_bon'] != C.BONUS_BUDGET: return "The sum of the three numbers must be exactly 10." ## 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 = int(player.in_round(C.EVAL).round_payoff) round = C.EVAL player.final_payoff = int(payoff) return {"payoff": payoff, "round":round} 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 = int(player.in_round(C.EVAL).round_payoff) + int(player.group.in_round(C.NUM_ROUNDS).w1_bon) round_po = int(player.in_round(C.EVAL).round_payoff) bonus_po = player.group.in_round(C.NUM_ROUNDS).w1_bon player.final_payoff = int(payoff) elif player.id_in_group == 3: payoff = int(player.in_round(C.EVAL).round_payoff) + int(player.group.in_round(C.NUM_ROUNDS).w2_bon) round_po = int(player.in_round(C.EVAL).round_payoff) bonus_po = player.group.in_round(C.NUM_ROUNDS).w2_bon player.final_payoff = int(payoff) elif player.id_in_group == 4: payoff = int(player.in_round(C.EVAL).round_payoff) + int(player.group.in_round(C.NUM_ROUNDS).w3_bon) round_po = int(player.in_round(C.EVAL).round_payoff) bonus_po = player.group.in_round(C.NUM_ROUNDS).w3_bon player.final_payoff = int(payoff) #### and add extra players else: payoff = 999999 round = C.EVAL Idd = player.id_in_group return {"payoff": payoff, "round":round, "id": Idd, "bonus": bonus_po, "round_po": round_po} ### THANKS!! class ThanksPage(Page): def is_displayed(self): return self.round_number == C.NUM_ROUNDS page_sequence = [ Welcome, InstructionsW, InstructionsM, ComprehensionW, ComprehensionM, SliderStarter, SliderRound0, SliderRound1, SliderRound2, SliderRound3, SliderRound4, Complaining, MissedUnits ,WorkerRoundPayoff, WaitPager, ManagerObserves, ManagerComplainsCollect, Decision, ManagerRoundPayoff, WaitPager, ResultsW, ResultsM, Bonus2, WaitPager, PayoffM, PayoffW, ThanksPage ]