from json import JSONDecodeError import itertools from otree.api import * import random doc = """ Containing all the tasks . """ class C(BaseConstants): NAME_IN_URL = 'Questions' PLAYERS_PER_GROUP = None NUM_ROUNDS = 8 TIMER_TEXT = "Verbleibende Zeit:" TREATMENTS_NAMES = ['Normal', 'Debug'] def read_csv(): import csv import random f = open(__name__ + '/analogy.csv', encoding='utf-8-sig') rows = list(csv.DictReader(f)) # print(rows) return rows def aread_csv(): import csv d = open(__name__ + '/nums.csv', encoding='utf-8-sig') srows = list(csv.DictReader(d)) # print(srows) return srows class Subsession(BaseSubsession): TREATMENT = models.StringField(initial='Debug') def creating_session(subsession: Subsession): subsession.TREATMENT = 'Debug' if 'fs_treatment' in subsession.session.config: subsession.TREATMENT = subsession.session.config['fs_treatment'] print("Treatment",subsession.TREATMENT) # Split stimuli into first 20 and last 20 questions stimuli = read_csv() stimuli_first_20 = stimuli[:20] stimuli_last_20 = stimuli[20:40] # Assign the number of trials for each player for p in subsession.get_players(): p.num_trials = len(stimuli_first_20) # Get the used indices from session variables, or initialize an empty list used_indicesA = p.participant.vars.get('used_indicesA', []) # Generate a unique random index if there are available questions if len(used_indicesA) < len(stimuli_first_20): available_indices = [i for i in range(len(stimuli_first_20)) if i not in used_indicesA] random_index = random.choice(available_indices) used_indicesA.append(random_index) p.participant.vars['used_indicesA'] = used_indicesA # Create the trial using the random index Trial.create(player=p, **stimuli_first_20[random_index]) # Assign the number of trials for each player for r in subsession.get_players(): r.num_trials = len(stimuli_last_20) # Get the used indices from session variables, or initialize an empty list used_indicesA = r.participant.vars.get('used_indicesA', []) # Generate a unique random index if there are available questions if len(used_indicesA) < len(stimuli_last_20): available_indices = [i for i in range(len(stimuli_last_20)) if i not in used_indicesA] random_index = random.choice(available_indices) used_indicesA.append(random_index) r.participant.vars['used_indicesA'] = used_indicesA # Create the trial using the random index Trial1.create(player=r, **stimuli_last_20[random_index]) # Split astimuli into first 20 and last 20 questions astimuli = aread_csv() astimuli_first_20 = astimuli[:20] astimuli_last_20 = astimuli[20:40] # Assign the number of trials_1 for each player for q in subsession.get_players(): q.num_trials_1 = len(astimuli_first_20) # Get the used indices from session variables, or initialize an empty list used_indices = q.participant.vars.get('used_indices', []) print("usedvalues Num",used_indices) # Generate a unique random index if there are available questions if len(used_indices) < len(astimuli_first_20): available_indices = [i for i in range(len(astimuli_first_20)) if i not in used_indices] random_index = random.choice(available_indices) used_indices.append(random_index) q.participant.vars['used_indices'] = used_indices # Create the numb using the random index Numb.create(player=q, **astimuli_first_20[random_index]) # Assign the number of trials_1 for each player for s in subsession.get_players(): s.num_trials_1 = len(astimuli_last_20) # Get the used indices from session variables, or initialize an empty list used_indices = s.participant.vars.get('used_indices', []) print("usedvalues Num1",used_indices) # Generate a unique random index if there are available questions if len(used_indices) < len(astimuli_last_20): available_indices = [i for i in range(len(astimuli_last_20)) if i not in used_indices] random_index = random.choice(available_indices) used_indices.append(random_index) s.participant.vars['used_indices'] = used_indices # Create the numb1 using the random index Numb1.create(player=s, **astimuli_last_20[random_index]) class Group(BaseGroup): pass class Player(BasePlayer): # Analogy num_correct = models.IntegerField(initial=0) num_correct1 = models.IntegerField(initial=0) raw_responses = models.LongStringField() raw_responses1 = models.LongStringField() num_trials = models.IntegerField() num_trials_1 = models.IntegerField() total_user_input = models.IntegerField(initial=0) user_input = models.IntegerField(label="Bitte geben Sie hier Ihre Antwort ein:") user_input1 = models.IntegerField(label="Bitte geben Sie hier Ihre Antwort ein:") total_Apoints = models.IntegerField(initial=0) Apoints = models.IntegerField(initial=0) Apoints2 = models.IntegerField(initial=0) # 7Counting Variables num7 = models.IntegerField() num7_1 = models.IntegerField() num7_2 = models.IntegerField() num7_3 = models.IntegerField() count_7num = models.IntegerField(label="Bitte geben Sie hier Ihre Antwort ein:" ) count_7num1 = models.IntegerField(label="Bitte geben Sie hier Ihre Antwort ein:") count_7num2 = models.IntegerField(label="Bitte geben Sie hier Ihre Antwort ein:") count_7num3 = models.IntegerField(label="Bitte geben Sie hier Ihre Antwort ein:") sum_7points = models.IntegerField(initial=0) total_7_points = models.IntegerField(initial=0) count_7_points = models.IntegerField(initial=0) count_7_points1 = models.IntegerField(initial=0) count_7_points2 = models.IntegerField(initial=0) count_7_points3 = models.IntegerField(initial=0) number_points = models.IntegerField(initial=0) number_points2 = models.IntegerField(initial=0) sum_7 = models.IntegerField(initial=0) sum_user = models.IntegerField(initial=0) sum_correct = models.IntegerField(initial=0) total_user_sum = models.IntegerField() def get_timeout_seconds1(player: Player): participant = player.participant import time return participant.expiry - time.time() def is_displayed1(player: Player): """only returns True if there is time left.""" return get_timeout_seconds1(player) > 0 class Numb(ExtraModel): player = models.Link(Player) round_number = models.IntegerField() question = models.StringField() solution = models.StringField() class Numb1(ExtraModel): player = models.Link(Player) round_number = models.IntegerField() question = models.StringField() solution = models.StringField() def to_dict_num(tnumb: Numb): print("nummmm", tnumb) return dict( round_number=tnumb.round_number, questions=tnumb.question, solutions=tnumb.solution, ) def to_dict_num1(tnumb1: Numb1): print("nummmm1", tnumb1) return dict( round_number=tnumb1.round_number, questions=tnumb1.question, solutions=tnumb1.solution, ) class Trial(ExtraModel): player = models.Link(Player) round_number = models.IntegerField() question = models.StringField() optionA = models.StringField() optionB = models.StringField() optionC = models.StringField() optionD = models.StringField() optionE = models.StringField() solution = models.StringField() choice = models.StringField() is_correct = models.BooleanField() class Trial1(ExtraModel): player = models.Link(Player) round_number = models.IntegerField() question = models.StringField() optionA = models.StringField() optionB = models.StringField() optionC = models.StringField() optionD = models.StringField() optionE = models.StringField() solution = models.StringField() choice = models.StringField() is_correct = models.BooleanField() class ATrial(ExtraModel): player = models.Link(Player) question = models.StringField() solution = models.StringField() choice = models.StringField() is_correct = models.BooleanField() def to_dict_trial(trial: Trial): return dict( round_number=trial.round_number, question=trial.question, optionA=trial.optionA, optionB=trial.optionB, optionC=trial.optionC, optionD=trial.optionD, optionE=trial.optionE, solution=trial.solution, id=trial.id, ) def to_dict_trial1(trial1: Trial1): return dict( round_number=trial1.round_number, question=trial1.question, optionA=trial1.optionA, optionB=trial1.optionB, optionC=trial1.optionC, optionD=trial1.optionD, optionE=trial1.optionE, solution=trial1.solution, id=trial1.id, ) # PAGES class Intro(Page): timeout_seconds = 5 timer_text = "Verbleibende Zeit:" def before_next_page(player: Player, timeout_happened): participant = player.participant import time participant.expiry = time.time() + 160 print(participant.expiry) # # @staticmethod # def is_displayed(player): # return player.round_number == 1 class Analogy(Page): form_model = 'player' form_fields = ['raw_responses'] # timeout_seconds = 60 is_displayed = is_displayed1 get_timeout_seconds = get_timeout_seconds1 timer_text = "Verbleibende Zeit:" @staticmethod def js_vars(player: Player): stimuli = [to_dict_trial(trial) for trial in Trial.filter(player=player)] return dict(trials=stimuli) @staticmethod def vars_for_template(player: Player): return { 'Normal': player.subsession.TREATMENT == 'Normal' } @staticmethod def before_next_page(player: Player, timeout_happened): import json try: responses = json.loads(player.raw_responses) except JSONDecodeError: responses = {} # Set an empty dictionary as the default value if not responses: # Check if responses is empty for trial in Trial.filter(player=player): trial.choice = 0 # Set choice to 0 (or any other value representing no selection) trial.is_correct = False # Set is_correct to False else: for trial in Trial.filter(player=player): trial.choice = responses.get(str(trial.id), 0) # Use get() to retrieve the value, defaulting to 0 if not found trial.is_correct = trial.choice == trial.solution player.num_correct = sum(trial.is_correct for trial in Trial.filter(player=player)) player.Apoints = player.num_correct * 2 player.raw_responses = '' class Analogy1(Page): form_model = 'player' form_fields = ['raw_responses1'] # timeout_seconds = 60 is_displayed = is_displayed1 get_timeout_seconds = get_timeout_seconds1 timer_text = "Verbleibende Zeit:" @staticmethod def js_vars(player: Player): stimuli1 = [to_dict_trial1(trial1) for trial1 in Trial1.filter(player=player)] return dict(trials1=stimuli1) @staticmethod def vars_for_template(player: Player): return { 'Normal': player.subsession.TREATMENT == 'Normal' } @staticmethod def before_next_page(player: Player, timeout_happened): import json try: responses = json.loads(player.raw_responses1) except json.JSONDecodeError: responses = {} # Set an empty dictionary as the default value if not responses: # Check if responses is empty for trial1 in Trial1.filter(player=player): trial1.choice = 0 # Set choice to 0 (or any other value representing no selection) trial1.is_correct = False # Set is_correct to False else: for trial1 in Trial1.filter(player=player): trial1.choice = responses.get(str(trial1.id), 0) # Use get() to retrieve the value, defaulting to 0 if not found trial1.is_correct = trial1.choice == trial1.solution player.num_correct1 = sum(trial1.is_correct for trial1 in Trial1.filter(player=player)) player.Apoints2 = player.num_correct1 * 2 player.raw_responses1 = '' class NumberSeq(Page): form_model = 'player' form_fields = ['user_input'] # timeout_seconds = 60 is_displayed = is_displayed1 get_timeout_seconds = get_timeout_seconds1 timer_text = "Verbleibende Zeit:" @staticmethod def js_vars(player: Player): astimuli = [to_dict_num(tnumb) for tnumb in Numb.filter(player=player)] # print("aaa",dict(tnumb=astimuli)) return dict(tnumb=astimuli) @staticmethod def vars_for_template(player: Player): return { 'Normal': player.subsession.TREATMENT == 'Normal' } # test = Numb.filter(player=player) # print("valeee", test) @staticmethod def before_next_page(player: Player, timeout_happened): for tnumb in Numb.filter(player=player): if player.user_input == int(tnumb.solution): player.number_points = 2 class NumberSeq1(Page): form_model = 'player' form_fields = ['user_input1'] # timeout_seconds = 60 is_displayed = is_displayed1 get_timeout_seconds = get_timeout_seconds1 timer_text = "Verbleibende Zeit:" @staticmethod def js_vars(player: Player): astimuli1 = [to_dict_num1(tnumb1) for tnumb1 in Numb1.filter(player=player)] # print("aaa1",dict(tnumb1=astimuli1)) return dict(tnumb1=astimuli1) # test = Numb.filter(player=player) # print("valeee", test) @staticmethod def vars_for_template(player: Player): return { 'Normal': player.subsession.TREATMENT == 'Normal' } @staticmethod def before_next_page(player: Player, timeout_happened): for tnumb1 in Numb1.filter(player=player): if player.user_input1 == int(tnumb1.solution): player.number_points2 = 2 class RRandomNum(Page): form_model = 'player' form_fields = ['count_7num'] # timeout_seconds = 60 is_displayed = is_displayed1 get_timeout_seconds = get_timeout_seconds1 timer_text = "Verbleibende Zeit:" def vars_for_template(player: Player): i = 1 solution = 0 counts_7 = [0] * 15 LINE_LENGTH = 15 numbers = [0] * 15 # // Fill all 16 lines with numbers while (i <= 15): # // Initialize variables j = 1 # val_t = 0 counts_7[i - 1] = 0 innerlist = [0] * 15 # // Fill a line up to LINE_LENGTH while (j <= LINE_LENGTH): val_t = 0 val = random.randint(0, 9) # // val_t = val_t * MULTI; val_t = val_t + val # // Repeat under certain condition, prevent leading 0 if (val_t == 0 and j == 1): j = 0 # // Add solution if value is a 7 if (val == 7): counts_7[i - 1] = counts_7[i - 1] + 1 innerlist[j - 1] = str(val_t) j = j + 1 numbers[i - 1] = ''.join(innerlist) solution = solution + counts_7[i - 1] i = i + 1 # if Player.count_7 == solution: # return { # Player.count_7_points == 2, # print("Points",Player.count_7_points) # } player.num7 = solution print("solution", player.num7) # if Player.count_7 == solution: # Player.count_7_points = 2 # else: # Player.count_7_points = 0 return { # print("numbers", numbers), # print("solution", counts_7), "Numbers": numbers, "solution": player.num7, 'Normal': player.subsession.TREATMENT == 'Normal' # print("solutions", solutions) } @staticmethod def before_next_page(player: Player, timeout_happened): if player.count_7num == player.num7: player.count_7_points = 4; if player.count_7num == player.num7 +1: player.count_7_points = 3; if player.count_7num == player.num7 -1: player.count_7_points = 3; if player.count_7num == player.num7 +2: player.count_7_points = 2; if player.count_7num == player.num7 -2: player.count_7_points = 2; if player.count_7num == player.num7 +3: player.count_7_points = 1; if player.count_7num == player.num7 - 3: player.count_7_points = 1; # else: # return player.count_7_points == 1 class srandom(Page): form_model = 'player' form_fields = ['count_7num1'] # timeout_seconds = 60 is_displayed = is_displayed1 get_timeout_seconds = get_timeout_seconds1 timer_text = "Verbleibende Zeit:" def vars_for_template(player: Player): i = 1 solution = 0 counts_7 = [0] * 15 LINE_LENGTH = 15 numbers = [0] * 15 # // Fill all 16 lines with numbers while (i <= 15): # // Initialize variables j = 1 # val_t = 0 counts_7[i - 1] = 0 innerlist = [0] * 15 # // Fill a line up to LINE_LENGTH while (j <= LINE_LENGTH): val_t = 0 val = random.randint(0, 9) # // val_t = val_t * MULTI; val_t = val_t + val # // Repeat under certain condition, prevent leading 0 if (val_t == 0 and j == 1): j = 0 # // Add solution if value is a 7 if (val == 7): counts_7[i - 1] = counts_7[i - 1] + 1 innerlist[j - 1] = str(val_t) j = j + 1 numbers[i - 1] = ''.join(innerlist) solution = solution + counts_7[i - 1] i = i + 1 # if Player.count_7 == solution: # return { # Player.count_7_points == 2, # print("Points",Player.count_7_points) # } player.num7_1 = solution print("solution2", player.num7_1) # if Player.count_7 == solution: # Player.count_7_points = 2 # else: # Player.count_7_points = 0 return { # print("numbers", numbers), # print("solution", counts_7), "Numbers": numbers, "solution": player.num7_1, 'Normal': player.subsession.TREATMENT == 'Normal' # print("solutions", solutions) } @staticmethod def before_next_page(player: Player, timeout_happened): if player.count_7num1 == player.num7_1: player.count_7_points1 = 4; if player.count_7num1 == player.num7_1 + 1: player.count_7_points1 = 3; if player.count_7num1 == player.num7_1 - 1: player.count_7_points1 = 3; if player.count_7num1 == player.num7_1 + 2: player.count_7_points1 = 2; if player.count_7num1 == player.num7_1 - 2: player.count_7_points1 = 2; if player.count_7num1 == player.num7_1 + 3: player.count_7_points1 = 1; if player.count_7num1 == player.num7_1 - 3: player.count_7_points1 = 1; class srandom1(Page): form_model = 'player' form_fields = ['count_7num2'] # timeout_seconds = 60 is_displayed = is_displayed1 get_timeout_seconds = get_timeout_seconds1 timer_text = "Verbleibende Zeit:" def vars_for_template(player: Player): i = 1 solution = 0 counts_7 = [0] * 15 LINE_LENGTH = 15 numbers = [0] * 15 # // Fill all 16 lines with numbers while (i <= 15): # // Initialize variables j = 1 # val_t = 0 counts_7[i - 1] = 0 innerlist = [0] * 15 # // Fill a line up to LINE_LENGTH while (j <= LINE_LENGTH): val_t = 0 val = random.randint(0, 9) # // val_t = val_t * MULTI; val_t = val_t + val # // Repeat under certain condition, prevent leading 0 if (val_t == 0 and j == 1): j = 0 # // Add solution if value is a 7 if (val == 7): counts_7[i - 1] = counts_7[i - 1] + 1 innerlist[j - 1] = str(val_t) j = j + 1 numbers[i - 1] = ''.join(innerlist) solution = solution + counts_7[i - 1] i = i + 1 # if Player.count_7 == solution: # return { # Player.count_7_points == 2, # print("Points",Player.count_7_points) # } player.num7_2 = solution print("solution3", player.num7_2) # if Player.count_7 == solution: # Player.count_7_points = 2 # else: # Player.count_7_points = 0 return { # print("numbers", numbers), # print("solution", counts_7), "Numbers": numbers, "solution": player.num7_2, 'Normal': player.subsession.TREATMENT == 'Normal' # print("solutions", solutions) } @staticmethod def before_next_page(player: Player, timeout_happened): if player.count_7num2 == player.num7_2: player.count_7_points2 = 4; if player.count_7num2 == player.num7_2 + 1: player.count_7_points2 = 3; if player.count_7num2 == player.num7_2 - 1: player.count_7_points2 = 3; if player.count_7num2 == player.num7_2 + 2: player.count_7_points2 = 2; if player.count_7num2 == player.num7_2 - 2: player.count_7_points2 = 2; if player.count_7num2 == player.num7_2 + 3: player.count_7_points2 = 1; if player.count_7num2 == player.num7_2 - 3: player.count_7_points2 = 1; class srandom2(Page): form_model = 'player' form_fields = ['count_7num3'] # timeout_seconds = 60 is_displayed = is_displayed1 get_timeout_seconds = get_timeout_seconds1 timer_text = "Verbleibende Zeit:" def vars_for_template(player: Player): i = 1 solution = 0 counts_7 = [0] * 15 LINE_LENGTH = 15 numbers = [0] * 15 # // Fill all 16 lines with numbers while (i <= 15): # // Initialize variables j = 1 # val_t = 0 counts_7[i - 1] = 0 innerlist = [0] * 15 # // Fill a line up to LINE_LENGTH while (j <= LINE_LENGTH): val_t = 0 val = random.randint(0, 9) # // val_t = val_t * MULTI; val_t = val_t + val # // Repeat under certain condition, prevent leading 0 if (val_t == 0 and j == 1): j = 0 # // Add solution if value is a 7 if (val == 7): counts_7[i - 1] = counts_7[i - 1] + 1 innerlist[j - 1] = str(val_t) j = j + 1 numbers[i - 1] = ''.join(innerlist) solution = solution + counts_7[i - 1] i = i + 1 # if Player.count_7 == solution: # return { # Player.count_7_points == 2, # print("Points",Player.count_7_points) # } player.num7_3 = solution print("solution4", player.num7_3) # if Player.count_7 == solution: # Player.count_7_points = 2 # else: # Player.count_7_points = 0 return { # print("numbers", numbers), # print("solution", counts_7), "Numbers": numbers, "solution": player.num7_3, 'Normal': player.subsession.TREATMENT == 'Normal' # print("solutions", solutions) } @staticmethod # conditoin for the upper value def before_next_page(player: Player, timeout_happened): if player.count_7num3 == player.num7_3: player.count_7_points3 = 4; if player.count_7num3 == player.num7_3 + 1: player.count_7_points3 = 3; if player.count_7num3 == player.num7_3 - 1: player.count_7_points3 = 3; if player.count_7num3 == player.num7_3 + 2: player.count_7_points3 = 2; if player.count_7num3 == player.num7_3 - 2: player.count_7_points3 = 2; if player.count_7num3 == player.num7_3 + 3: player.count_7_points3 = 1; if player.count_7num3 == player.num7_3 - 3: player.count_7_points3 = 1; class WaitPage(WaitPage): def vars_for_template(player: Player): return dict( body_text="Bitte warten Sie."#change the text of the waitpage ) class Results(Page): timeout_seconds = 15 timer_text = "Verbleibende Zeit:" def vars_for_template(player: Player): player.total_7_points = player.count_7_points + player.count_7_points1 + player.count_7_points2 + player.count_7_points3 player.total_user_input= player.number_points + player.number_points2 player.total_Apoints = player.Apoints + player.Apoints2 print("total 7 points", player.total_7_points) print("total 2 points", player.total_user_input) print("total 3 points", player.total_Apoints) return { "A": player.total_7_points, "B": player.total_user_input, "C": player.total_Apoints, } class FResults(Page): form_model = 'player' def vars_for_template(player: Player): sum_7 = 0 sum_user = 0 sum_correct = 0 for p in player.in_all_rounds(): sum_7 += p.total_7_points sum_user += p.total_user_input sum_correct += p.total_Apoints # result = player.in_all_rounds() # print("result") player.sum_7 = sum_7 player.sum_user = sum_user player.sum_correct = sum_correct player.total_user_sum = player.sum_7 + player.sum_user + player.sum_correct player.payoff = player.total_user_sum return { "sum_7":player.sum_7, "sum_user":player.sum_user, "sum_correct":player.sum_correct, "total" : player.total_user_sum } @staticmethod def is_displayed(player): return player.round_number == C.NUM_ROUNDS # def js_vars(player: Player): # player.total_7_points = player.count_7_points + player.count_7_points1 + player.count_7_points2 + player.count_7_points3 # # print("total 7 points", player.total_7_points ) # # def vars_for_template(player: Player): # player.total_7_points = player.count_7_points + player.count_7_points1 + player.count_7_points2 + player.count_7_points3 # # return { # "Total", player.total_7_points # } # class FResults(Page): # class Results(Page): # form_model = 'player' # # def is_displayed(player: Player): # return C.NUM_ROUNDS == 3 # pass # @staticmethod # def vars_for_template(player: Player): # return dict(trials=Trial.filter(player=player)) # # # # # def custom_export(players): # yield ['participant', 'question', 'choice', 'is_correct'] # # for player in players: # participant = player.participant # # trials = Trial.filter(player=player) # # for t in trials: # yield [participant.code, t.question, t.choice, t.is_correct] page_sequence = [Intro, RRandomNum, Analogy, srandom, NumberSeq, srandom1, Analogy1, srandom2, NumberSeq1, Results, FResults]