from otree.api import * import random import itertools import csv #I nead those to convert csv to matrix #import pandas as pd # import numpy as np doc = """ This is the second session of the iq project. First Subjects have to do IQ test, ... """ # ############################################################################################################# # ##################################### FUNCTIONS ####################################################### # ############################################################################################################# #Determine treatment and control group def creating_session(subsession): scope = itertools.cycle([True, False]) for p in subsession.get_players(): p.HighScope = next(scope) def set_PositiveFeedback(player): with open('work_session2_berlin/static/data.csv', 'r') as df: data = csv.DictReader(df) for row in data: # print(row) if player.Melessa_ID == str(row['ID']): player.PositiveFeedback = int(row['PosFeedback']) def set_ranking(player): with open('work_session2_berlin/static/data.csv', 'r') as df: data = csv.DictReader(df) for row in data: # print(row) #if player.Melessa_ID == int(row['ID']): if player.Melessa_ID == str(row['ID']): player.num_tasks_total = int(row['NumberTasks']) # This function defines the number of negative feedback individuals get def set_NegativeFeedback(player): player.NegativeFeedback = 3 - player.PositiveFeedback def set_extrapayoff3(player): if player.num_tasks_total < 60 and player.BeliefTopHalf3 > max([random.randint(0, 100), random.randint(0, 100)]): player.extraPayoff3 = Constants.extra_payoff elif player.num_tasks_total > 50 and player.BeliefTopHalf3 < min([random.randint(0, 100), random.randint(0, 100)]): player.extraPayoff3 = Constants.extra_payoff else: player.extraPayoff3 = 0 def set_feedback_order(player): with open('work_session2_berlin/static/data.csv', 'r') as df: data = csv.DictReader(df) for row in data: # print(row) # if player.Melessa_ID == int(row['ID']): if player.Melessa_ID == str(row['ID']): player.feedback_order = int(row['Order']) # ############################################################################################################# # ########################################## MODELS ########################################################### # ############################################################################################################# class Constants(BaseConstants): name_in_url = 'work_session2_berlin' players_per_group = None num_rounds = 1 # 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 = 14 days_double = 28 base_tasks = 40 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): Melessa_ID = models.StringField() iq_result = models.IntegerField() # Total Task Number num_tasks_total = models.IntegerField() #Main Outcome Variable of Interest: Beliefs BeliefTopHalf3 = models.IntegerField(min=0, max=100, initial=None, label='Your guess: (enter a value between 0 and 100)') #BeliefBottomHalf3 = models.IntegerField() # Positive and Negative feedback can be between 0 and 3, negative feedback + positive feedback = 3 PositiveFeedback = models.IntegerField() NegativeFeedback = models.IntegerField() ConfirmPosFeedback = models.IntegerField(min=0, max=3, blank=True) ConfirmNegFeedback = models.IntegerField(min=0, max=3, blank=True) feedback_order = models.IntegerField() # New variable that determines whether individual will be reminded of the feedback # (HighScope = FALSE) or not (HighScope = TRUE) HighScope = models.BooleanField() extraPayoff3 = models.IntegerField(initial=0) details_feedback_2=models.BooleanField(initial=False) details_beliefs_3_1 = models.BooleanField(initial=False) details_beliefs_3_2 = models.BooleanField(initial=False) ################################################################################################################### ################################## PAGES #################################################### ################################################################################################################### class GeneralInstructions(Page): form_model = 'player' form_fields = ['Melessa_ID'] @staticmethod def before_next_page(player: Player, timeout_happened): player.participant.melessa_id = player.Melessa_ID @staticmethod def error_message(player: Player, values): with open('work_session2_berlin/static/data.csv', 'r') as df: data = csv.DictReader(df) fehler = 1 for row in data: if values['Melessa_ID'] == str(row['ID']): fehler = 0 if fehler == 1: return 'Number not found. Please use the number you wrote down at the end of the first session.' class Reminder_General(Page): @staticmethod def before_next_page(player, timeout_happened): return dict( # rank=set_ranking(player), PositiveFeedback=set_PositiveFeedback(player), NegativeFeedback=set_NegativeFeedback(player), num_tasks_total=set_ranking(player), feedback_order=set_feedback_order(player), ) class Reminder_LowScope(Page): # I only want this page to be displayed if the player is in the High Scope treatment. @staticmethod def is_displayed(player): return player.HighScope == 0 class ReminderRepetitiona(Page): @staticmethod def is_displayed(player): return player.HighScope == 0 form_model = 'player' form_fields = ['ConfirmNegFeedback', 'ConfirmPosFeedback','details_feedback_2'] @staticmethod def error_message(player: Player, values): if (values['ConfirmNegFeedback'] == None or values['ConfirmPosFeedback'] == None) and values['details_feedback_2']==False: return 'You need to fill in the fields' class ReminderRepetitionb(Page): form_model = 'player' form_fields = ['ConfirmNegFeedback', 'ConfirmPosFeedback'] @staticmethod def is_displayed(player: Player): return player.details_feedback_2==True and player.HighScope==0 @staticmethod def error_message(player: Player, values): if values['ConfirmNegFeedback']==None or values['ConfirmPosFeedback']==None: return 'You need to fill in the fields' class BeliefInstructions3a(Page): form_model = 'player' form_fields = ['details_beliefs_3_1'] @staticmethod def before_next_page(player: Player, timeout_happened): player.participant.high_scope = player.HighScope class BeliefInstructions3b(Page): @staticmethod def is_displayed(player: Player): return player.details_beliefs_3_1==True # Here we elicit subjects belief that they are in the top half class BelievesTopHalf3(Page): form_model = 'player' form_fields = ['BeliefTopHalf3'] @staticmethod def before_next_page(player, timeout_happened): return dict( Rank=set_ranking(player), extraPayoff3=set_extrapayoff3(player), ) class Part1(Page): pass page_sequence = [ GeneralInstructions, Part1, Reminder_General, Reminder_LowScope, ReminderRepetitiona, ReminderRepetitionb, BeliefInstructions3a, BeliefInstructions3b, BelievesTopHalf3, #ChooseToWork, #EnterSolution, #LastPage2, ]