from otree.api import * import time import random import math from decimal import Decimal import psycopg2 import itertools class C(BaseConstants): NAME_IN_URL = 'lev_emp' PLAYERS_PER_GROUP = 3 NUM_ROUNDS = 1 # Should make the groups bigger, say, 10? Then have 7 emps, 3 mgrs, so that when running on Prolific I get enough # chances at having managers and employees form groups based on control decisions. # EMPLOYEE1_ROLE = "EmployeeA" # EMPLOYEE2_ROLE = "EmployeeB" # MANAGER_ROLE = "Manager" class Group(BaseGroup): pass class Subsession(BaseSubsession): pass class Player(BasePlayer): condition = models.IntegerField() e_role = models.StringField() worker_id = models.CharField(initial='e') mturk_dupe = models.IntegerField(initial=0) 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=['True', 'False'], 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()) control_decision = models.IntegerField(default=9) control_decision_time = models.StringField() #FUNCTIONS def creating_session(subsession): player_roles = itertools.cycle(['Employee', 'Employee', 'Manager']) session = subsession.session for player in subsession.get_players(): player.condition = session.config['condition'] player.participant.label = 'e' player.e_role = next(player_roles) player.participant.e_role = player.e_role player.participant.control_decision = player.control_decision class OnlineWorkers(ExtraModel): worker_id = models.CharField(max_length=50) # 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 GenInstructions(Page): pass class TaskInstructions1(Page): pass class TaskInstructions2(Page): pass class KnowledgeCheck1(Page): form_model = 'player' form_fields = ['kc1', 'kc2', 'kc3', 'kc4', 'kc5', 'kc6', 'kc7'] class Decision(Page): form_model = 'player' form_fields = ['control_decision', 'control_decision_time'] @staticmethod def before_next_page(player, timeout_happened): player.participant.control_decision = player.control_decision page_sequence = \ [ IC, IC_Decline, DuplicateWorker, GenInstructions, TaskInstructions1, TaskInstructions2, KnowledgeCheck1, Decision ]