from otree.api import * from Instructions import C as GC from Instructions import creating_session as cs_Intro from checkFunctions import addCheckVars import numpy.random as rnd import random import pandas as pd doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'Task' PLAYERS_PER_GROUP = None NUM_ROUNDS = GC.iNumTrials NUM_PROUNDS = GC.iPracticeRounds # In between round messages BetweenTrialMessages = { "1": f"Now you will have {GC.iPracticeRounds} practice rounds.", str(int(GC.iPracticeRounds+1)): "The practice rounds are over." } # Image imgCandidate = "global/figures/candidate.png" imgNumbers = "global/figures/numbers/n_" # Confidence page iLikertConf = 7 sConfQuestion = f"From 1 to {iLikertConf}, how confident are you on your choice?" sLeftConf = "Very unsure" sRightConf = "Very sure" class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): # DVs iChooseB = models.IntegerField() iConfidence = models.IntegerField() dRT_dec = models.FloatField() dRT_conf = models.FloatField() dTime2first = models.FloatField() # Attention variables sNames = models.LongStringField(blank=True) sDT = models.LongStringField(blank=True) # Candidates sCandA = models.StringField() sCandB = models.StringField() # Timestamps sStartDec = models.StringField() sEndDec = models.StringField() sStartCross = models.StringField() sEndCross = models.StringField() sStartConf = models.StringField() sEndConf = models.StringField() # Other sBetweenPosition = models.StringField() def creating_session(subsession): # Load Session variables s = subsession.session cs_Intro(subsession) for player in subsession.get_players(): p = player.participant player.sCandA = p.lTrials[player.round_number-1][0] player.sCandB = p.lTrials[player.round_number-1][1] player.sBetweenPosition = random.sample(['left','right'],1)[0] def attributeList(lAttrA,lAttrB,lPos): Attributes = { 'gma': { "name": "GMA", "id" : "gma", "valueA": f"{C.imgNumbers}{lAttrA[0]}.png", "valueB": f"{C.imgNumbers}{lAttrB[0]}.png", }, 'con': { "name": "Conscientiousness", "id" : "con", "valueA": f"{C.imgNumbers}{lAttrA[1]}.png", "valueB": f"{C.imgNumbers}{lAttrB[1]}.png", }, 'int': { "name": "Interview", "id" : "int", "valueA": f"{C.imgNumbers}{lAttrA[2]}.png", "valueB": f"{C.imgNumbers}{lAttrB[2]}.png", }, 'gender': { "name": "Gender", "id" : "gender", "valueA": f"{C.imgNumbers}{lAttrA[3]}.png", "valueB": f"{C.imgNumbers}{lAttrB[3]}.png", }, 'rand': { "name": "Random", "id" : "rand", "valueA": f"{C.imgNumbers}{lAttrA[4]}.png", "valueB": f"{C.imgNumbers}{lAttrB[4]}.png", }, } lValues = [] for id in lPos: lValues.append(Attributes[id]) return lValues # PAGES class Between(Page): form_model = 'player' form_fields = [ 'sStartCross','sEndCross' ] @staticmethod def js_vars(player: Player): return dict( position = player.sBetweenPosition ) @staticmethod def vars_for_template(player: Player): p = player.participant lAttr = [] for attr in p.lEmployerOrder: match attr: case 0: lAttr.append(f"is a {p.sEmployerGender.lower()}") case 1: lAttr.append(f"is {p.sEmployerAge}
years old") case 2: lAttr.append(f"has a {p.sEmployerMath}
maths level") return dict( lAttr = lAttr, ) class PracticeRoundMessage(Page): template_name = 'global/Message.html' form_model = 'player' form_fields = [] @staticmethod def is_displayed(player: Player): return str(player.round_number) in C.BetweenTrialMessages.keys() @staticmethod def vars_for_template(player: Player): return dict( MessageText = C.BetweenTrialMessages[str(player.round_number)] ) class Decision(Page): form_model = 'player' form_fields = [ 'sStartDec','sEndDec', 'dRT_dec', 'sNames', 'sDT' , 'dTime2first', 'iChooseB'] @staticmethod def vars_for_template(player: Player): # Order of attributes (from participant var) p = player.participant lPos = p.lPos # Candidates values lValuesA = list(player.sCandA) lValuesB = list(player.sCandB) return dict( lAttr = attributeList(lValuesA,lValuesB,lPos), ) @staticmethod def before_next_page(player: Player, timeout_happened): p = player.participant if player.round_number == p.iSelectedTrial: p.bChoseA = player.iChooseB==0 print(f"Decision in selected trial recorded: {p.bChoseA}") class Confidence(Page): form_model = 'player' form_fields = [ 'sStartConf','sEndConf', 'dRT_conf','iConfidence'] @staticmethod def vars_for_template(player: Player): p = player.participant return dict( lScale = list(range(1,C.iLikertConf+1)) ) page_sequence = [PracticeRoundMessage,Between,Decision,Confidence] addCheckVars(Player, page_sequence)