from otree.api import * import string import csv import random doc = """ This is the third and last session of the work project. """ # ############################################################################################################# # ##################################### FUNCTIONS ####################################################### # ############################################################################################################# def get_id(player): player.Melessa_ID = player.participant.melessa_id def get_payoff(player): player.extrapayofftotal = player.participant.extra_payoff def set_ranking(player): with open('transcription_complete/static/data.csv', 'r') as df: data = csv.DictReader(df) #player.Melessa_ID = get_id(player) for row in data: # print(row) if player.Melessa_ID == str(row['ID']): player.num_tasks_additional = int(row['NumberTasks']) def set_completed(player): with open('transcription_complete/static/data.csv', 'r') as df: #player.Melessa_ID = get_id(player) data = csv.DictReader(df) for row in data: # print(row) if player.Melessa_ID == str(row['ID']): player.num_completed = int(row['Completed']) def set_total(player): player.num_tasks_total = player.num_tasks_additional + Constants.base_tasks def set_todo(player): player.num_todo = player.num_tasks_total - player.num_completed ############################################################################################################## ########################################### MODELS ########################################################### ############################################################################################################## class Constants(BaseConstants): name_in_url = 'transcription_complete' players_per_group = None num_rounds = 80 num_letters = 6 numbers_list = [] for i in range(1, 27): numbers_list.append(i) code_dict = {} for j in range(0, num_rounds + 1): chars_list = list(string.ascii_uppercase) random.shuffle(chars_list) code_dict[j] = chars_list words_dict = {} chiffre_dict = {} for j in range(0, num_rounds + 1): word = '' chiffre = '' for i in range(0, num_letters): k = random.randint(0, 25) word = word + code_dict[j][k] if i == 0: # to prevent a leading space in the string chiffre = chiffre + str(k + 1) else: chiffre = chiffre + ' ' + str(k + 1) words_dict[j] = word chiffre_dict[j] = chiffre # we have to set actual payment when we know how long it takes to do the experiment, these are just example numbers so far. base_payment = 14 extra_payoff = 6 days_single = 7 days_double = 14 base_tasks = 40 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): Melessa_ID = models.StringField() num_tasks_additional = models.IntegerField() num_tasks_total = models.IntegerField() num_completed = models.IntegerField() num_todo = models.IntegerField() extrapayofftotal = models.IntegerField(initial=0) details_task_3 = models.BooleanField(initial=False) def still_to_solve(player): # if player.session.config['stage_1'] == 1: # return Constants.num_training_rounds - (player.round_number - 1) # elif player.session.config['stage_1'] == 0: return player.in_round(1).num_todo - (player.round_number - 1) ################################################################################################################### ################################## PAGES #################################################### ################################################################################################################### class ExplanationTask(Page): def is_displayed(player): return player.round_number == 1 @staticmethod def before_next_page(player: Player, timeout_happened): return dict( Melessa_ID=get_id(player), num_tasks_additional=set_ranking(player), num_tasks_total=set_total(player), num_completed=set_completed(player), num_todo=set_todo(player), extrapayofftotal=get_payoff(player) ) class ResolveA(Page): def is_displayed(player): return player.round_number == 1 form_model = 'player' form_fields = ['details_task_3'] class ResolveB(Page): @staticmethod def is_displayed(player): return player.round_number == 1 and player.details_task_3 == True @staticmethod def vars_for_template(player: Player): return { 'num_letters': Constants.num_letters, #'number_words': Constants.num_training_rounds, 'number_string': Constants.chiffre_dict[0], 'solution': Constants.words_dict[0], 'display_numbers': Constants.numbers_list, 'display_chars': Constants.code_dict[0], 'words_dict': Constants.words_dict, 'chiffre_dict': Constants.chiffre_dict, } class EnterSolution(Page): # template_name = 'transcription_task/EnterSolution.html' @staticmethod def is_displayed(player): return player.round_number <= player.in_round(1).num_todo @staticmethod def vars_for_template(player: Player): return { 'number_string': Constants.chiffre_dict[player.round_number], 'solution': Constants.words_dict[player.round_number], 'display_numbers': Constants.numbers_list, 'display_chars': Constants.code_dict[player.round_number], 'solved_words': player.round_number - 1, 'still_to_solve': player.still_to_solve(), 'words_dict': Constants.words_dict, 'chiffre_dict': Constants.chiffre_dict, } @staticmethod def before_next_page(player, timeout_happened): return { 'solved_words': player.round_number, } class LastPage3(Page): def is_displayed(player): return player.round_number == Constants.num_rounds class Part5(Page): def is_displayed(player): return player.round_number == 1 @staticmethod def before_next_page(player: Player, timeout_happened): return dict( Melessa_ID=get_id(player), num_tasks_additional=set_ranking(player), num_tasks_total=set_total(player), num_completed=set_completed(player), num_todo=set_todo(player), extrapayofftotal=get_payoff(player) ) page_sequence = [ Part5, #ExplanationTask, ResolveA, ResolveB, EnterSolution, #LastPage3, ]