from otree.api import * import time class C(BaseConstants): NAME_IN_URL = 'decoding_work_sp' PLAYERS_PER_GROUP = 4 NUM_ROUNDS = 1 class Group(BaseGroup): pass class Subsession(BaseSubsession): pass class DecodeStrings(ExtraModel): record_id = models.IntegerField(null=False,primary_key=True) letters = models.CharField(max_length=50) numbers = models.CharField(max_length=50) class OnlineWorkers(ExtraModel): worker_id = models.CharField(max_length=50) class Player(BasePlayer): worker_id = models.CharField(initial='e') mturk_dupe = models.IntegerField(initial=0) participant_number = models.IntegerField(default=0) total_compensation = models.StringField(default='Not Finished') player_label = models.StringField() condition = models.IntegerField() employee_label = models.StringField(default='A') pay_period = models.IntegerField() informed_consent = models.StringField(initial=None, choices=[('Yes', 'Yes'), ('No', 'No')], verbose_name='', widget=widgets.RadioSelect()) kc1 = models.StringField(initial=None, choices=['True', 'False'], verbose_name='', widget=widgets.RadioSelect()) kc2 = models.StringField(initial=None, choices=[('a', 'a. 1; 4'), ('b', 'b. 2; 3'), ('c', 'c. 4; 1'), ('d', 'd. 3; 2')], verbose_name='', widget=widgets.RadioSelect()) kc3 = models.StringField(initial=None, choices=['True', 'False'], verbose_name='', widget=widgets.RadioSelect()) kc4 = models.StringField(initial=None, choices=['True', 'False'], verbose_name='', widget=widgets.RadioSelect()) kc5 = models.StringField(initial=None, choices=['True', 'False'], verbose_name='', widget=widgets.RadioSelect()) kc6 = models.StringField(initial=None, choices=['True', 'False'], verbose_name='', widget=widgets.RadioSelect()) kc7 = models.StringField(initial=None, choices=['True', 'False'], verbose_name='', widget=widgets.RadioSelect()) kc8 = models.StringField(initial=None, choices=['True', 'False'], verbose_name='', widget=widgets.RadioSelect()) kc9 = models.StringField(initial=None, choices=['True', 'False'], verbose_name='', widget=widgets.RadioSelect()) kc10 = models.StringField(initial=None, choices=['True', 'False'], verbose_name='', widget=widgets.RadioSelect()) practice_num_attempted = models.IntegerField() practice_num_decoded = models.IntegerField() #FUNCTIONS def creating_session(subsession): session = subsession.session for player in subsession.get_players(): player.condition = session.config['condition'] player.participant.label = 'e' decode_strings_test = [s for s in DecodeStrings.filter() if (s.record_id > 0 and s.record_id < 101)] if not decode_strings_test: DecodeStrings.create(record_id=1, letters='G', numbers='21') DecodeStrings.create(record_id=2, letters='M', numbers='10') DecodeStrings.create(record_id=3, letters='F', numbers='17') DecodeStrings.create(record_id=4, letters='E', numbers='18') DecodeStrings.create(record_id=5, letters='D', numbers='11') DecodeStrings.create(record_id=6, letters='L', numbers='9') DecodeStrings.create(record_id=7, letters='A', numbers='7') DecodeStrings.create(record_id=8, letters='H', numbers='6') DecodeStrings.create(record_id=9, letters='N', numbers='14') DecodeStrings.create(record_id=10, letters='A', numbers='7') DecodeStrings.create(record_id=11, letters='P', numbers='4') DecodeStrings.create(record_id=12, letters='O', numbers='19') DecodeStrings.create(record_id=13, letters='K', numbers='2') DecodeStrings.create(record_id=14, letters='J', numbers='22') DecodeStrings.create(record_id=15, letters='D', numbers='11') DecodeStrings.create(record_id=16, letters='F', numbers='17') DecodeStrings.create(record_id=17, letters='J', numbers='22') DecodeStrings.create(record_id=18, letters='B', numbers='3') DecodeStrings.create(record_id=19, letters='O', numbers='19') DecodeStrings.create(record_id=20, letters='O', numbers='19') DecodeStrings.create(record_id=21, letters='A', numbers='7') DecodeStrings.create(record_id=22, letters='G', numbers='21') DecodeStrings.create(record_id=23, letters='M', numbers='10') DecodeStrings.create(record_id=24, letters='C', numbers='5') DecodeStrings.create(record_id=25, letters='A', numbers='7') DecodeStrings.create(record_id=26, letters='L', numbers='9') DecodeStrings.create(record_id=27, letters='L', numbers='9') DecodeStrings.create(record_id=28, letters='P', numbers='4') DecodeStrings.create(record_id=29, letters='B', numbers='3') DecodeStrings.create(record_id=30, letters='B', numbers='3') DecodeStrings.create(record_id=31, letters='M', numbers='10') DecodeStrings.create(record_id=32, letters='K', numbers='2') DecodeStrings.create(record_id=33, letters='M', numbers='10') DecodeStrings.create(record_id=34, letters='F', numbers='17') DecodeStrings.create(record_id=35, letters='E', numbers='18') DecodeStrings.create(record_id=36, letters='B', numbers='3') DecodeStrings.create(record_id=37, letters='G', numbers='21') DecodeStrings.create(record_id=38, letters='P', numbers='4') DecodeStrings.create(record_id=39, letters='O', numbers='19') DecodeStrings.create(record_id=40, letters='C', numbers='5') DecodeStrings.create(record_id=41, letters='O', numbers='19') DecodeStrings.create(record_id=42, letters='B', numbers='3') DecodeStrings.create(record_id=43, letters='I', numbers='16') DecodeStrings.create(record_id=44, letters='P', numbers='4') DecodeStrings.create(record_id=45, letters='D', numbers='11') DecodeStrings.create(record_id=46, letters='F', numbers='17') DecodeStrings.create(record_id=47, letters='K', numbers='2') DecodeStrings.create(record_id=48, letters='E', numbers='18') DecodeStrings.create(record_id=49, letters='O', numbers='19') DecodeStrings.create(record_id=50, letters='L', numbers='9') DecodeStrings.create(record_id=51, letters='J', numbers='22') DecodeStrings.create(record_id=52, letters='H', numbers='6') DecodeStrings.create(record_id=53, letters='P', numbers='4') DecodeStrings.create(record_id=54, letters='A', numbers='7') DecodeStrings.create(record_id=55, letters='H', numbers='6') DecodeStrings.create(record_id=56, letters='N', numbers='14') DecodeStrings.create(record_id=57, letters='D', numbers='11') DecodeStrings.create(record_id=58, letters='O', numbers='19') DecodeStrings.create(record_id=59, letters='J', numbers='22') DecodeStrings.create(record_id=60, letters='J', numbers='22') DecodeStrings.create(record_id=61, letters='A', numbers='7') DecodeStrings.create(record_id=62, letters='O', numbers='19') DecodeStrings.create(record_id=63, letters='I', numbers='16') DecodeStrings.create(record_id=64, letters='M', numbers='10') DecodeStrings.create(record_id=65, letters='N', numbers='14') DecodeStrings.create(record_id=66, letters='D', numbers='11') DecodeStrings.create(record_id=67, letters='N', numbers='14') DecodeStrings.create(record_id=68, letters='C', numbers='5') DecodeStrings.create(record_id=69, letters='L', numbers='9') DecodeStrings.create(record_id=70, letters='J', numbers='22') DecodeStrings.create(record_id=71, letters='L', numbers='9') DecodeStrings.create(record_id=72, letters='B', numbers='3') DecodeStrings.create(record_id=73, letters='J', numbers='22') DecodeStrings.create(record_id=74, letters='L', numbers='9') DecodeStrings.create(record_id=75, letters='K', numbers='2') DecodeStrings.create(record_id=76, letters='K', numbers='2') DecodeStrings.create(record_id=77, letters='E', numbers='18') DecodeStrings.create(record_id=78, letters='J', numbers='22') DecodeStrings.create(record_id=79, letters='J', numbers='22') DecodeStrings.create(record_id=80, letters='J', numbers='22') DecodeStrings.create(record_id=81, letters='B', numbers='3') DecodeStrings.create(record_id=82, letters='M', numbers='10') DecodeStrings.create(record_id=83, letters='J', numbers='22') DecodeStrings.create(record_id=84, letters='I', numbers='16') DecodeStrings.create(record_id=85, letters='A', numbers='7') DecodeStrings.create(record_id=86, letters='G', numbers='21') DecodeStrings.create(record_id=87, letters='O', numbers='19') DecodeStrings.create(record_id=88, letters='M', numbers='10') DecodeStrings.create(record_id=89, letters='G', numbers='21') DecodeStrings.create(record_id=90, letters='A', numbers='7') DecodeStrings.create(record_id=91, letters='I', numbers='16') DecodeStrings.create(record_id=92, letters='I', numbers='16') DecodeStrings.create(record_id=93, letters='E', numbers='18') DecodeStrings.create(record_id=94, letters='J', numbers='22') DecodeStrings.create(record_id=95, letters='G', numbers='21') DecodeStrings.create(record_id=96, letters='E', numbers='18') DecodeStrings.create(record_id=97, letters='M', numbers='10') DecodeStrings.create(record_id=98, letters='A', numbers='7') DecodeStrings.create(record_id=99, letters='J', numbers='22') DecodeStrings.create(record_id=100, letters='J', numbers='22') # PAGES class IC(Page): form_model = 'player' form_fields = ['informed_consent'] def before_next_page(player, timeout_happened): # See if that worker ID already appears in players, in which case they at least started the experiment if player.participant.label != 'e': worker_match = [w for w in OnlineWorkers.filter() if (w.worker_id == player.participant.label)] if not worker_match: OnlineWorkers.create(worker_id=player.participant.label) player.worker_id = player.participant.label else: player.mturk_dupe = 1 class IC_Decline(Page): @staticmethod def is_displayed(player: Player): return player.informed_consent == "No" class DuplicateWorker(Page): @staticmethod def is_displayed(player: Player): return player.mturk_dupe == 1 class ResultsWaitPage(WaitPage): pass class GenInstructions(Page): pass class TaskInstructions(Page): pass class TaskInstructions2(Page): pass class PerformanceEval(Page): pass class Payoffs(Page): pass class KnowledgeCheck(Page): form_model = 'player' @staticmethod def get_form_fields(player): if player.condition == 3 or player.condition == 4: return ['kc1', 'kc2', 'kc3', 'kc4', 'kc5', 'kc6', 'kc7', 'kc8', 'kc9', 'kc10'] else: return ['kc1', 'kc2', 'kc3', 'kc4', 'kc5', 'kc6', 'kc7', 'kc8', 'kc9'] class Practice(Page): form_model = 'player' form_fields = ['practice_num_attempted', 'practice_num_decoded'] @staticmethod def vars_for_template(player): return dict( decode_strings=[s for s in DecodeStrings.filter() if (s.record_id > 0 and s.record_id < 101)] ) class PostPractice(Page): @staticmethod def before_next_page(player, timeout_happened): player.participant.practice_num_decoded = player.practice_num_decoded player.participant.wait_page_arrival = time.time() page_sequence = \ [ IC, IC_Decline, DuplicateWorker, GenInstructions, TaskInstructions, TaskInstructions2, PerformanceEval, Payoffs, KnowledgeCheck, Practice, PostPractice ]