from otree.api import * doc = """ Each player decides what job to choose ... game made by Galiya """ class C(BaseConstants): NAME_IN_URL = 'usaid_game' PLAYERS_PER_GROUP = 10 NUM_ROUNDS = 10 INSTRUCTIONS_TEMPLATE = 'usaid_game/instructions.html' #ROUND_INSTRUCTIONS = 'usaid_game/round_instructions.html' SALARY_MIN = 80000 SALARY_MAX = 160000 STEP = (SALARY_MAX - SALARY_MIN)/PLAYERS_PER_GROUP class Subsession(BaseSubsession): pass class Group(BaseGroup): num_blue_jobseekers = models.IntegerField() num_white_jobseekers= models.IntegerField() class Player(BasePlayer): consent = models.BooleanField( choices=[[True, 'Даю согласие на участие в исследовании'], [False, 'Отказываюсь от участия в исследовании']]) position = models.IntegerField(label='Введите номер Вашего компьютера:') jobseeker = models.BooleanField( choices=[[True, 'Рабочие профессии (например, строитель, швея, тракторист, парикмахер, столяр и т.д.)'], [False, 'Офисные профессии (например, секретарь, бухгалтер, менеджер, маркетолог, IT специалист и т.д.)']], label='Выберите один из двух видов профессий:', widget=widgets.RadioSelect ) age = models.IntegerField(label='Ваш возраст?', min=10, max=100) finance = models.IntegerField(label='Представьте себе лестницу из шести ступеней, самая бедная семья поселения находится внизу(первая ступень), а самая богатая семья этого поселения находится наверху(шестая ступень). На каком этапе находится ваша семья сегодня?', min=1, max=6) gender = models.StringField( choices=[['Мужской', 'Мужской'], ['Женский', 'Женский']], label='Укажите ваш пол?', widget=widgets.RadioSelect, ) city = models.StringField( choices=[['Алматы', 'Алматы'], ['Нур-Султан', 'Нур-Султан'], ['другой', 'другой']], label='Где Вы проживаете?', widget=widgets.RadioSelect, ) education = models.StringField( choices=[['Не имею образования', 'Не имею образования'], ['Начальное образование', 'Начальное образование'], ['Основное среднее образование', 'Основное среднее образование'], ['Общее среднее образование', 'Общее среднее образование'], ['Начальное профессиональное образование', 'Начальное профессиональное образование'], ['Среднее профессиональное(специальное) образование', 'Среднее профессиональное(специальное) образование'], ['Техническое и профессиональное образование', 'Техническое и профессиональное образование'], ['Незаконченное высшее образование', 'Незаконченное высшее образование'], ['Высшее образование', 'Высшее образование'], ['Послевузовское образование(магистратура)', 'Послевузовское образование(магистратура)'], ['Послевузовское образование(докторантура)', 'Послевузовское образование(докторантура)'], ['отказываюсь отвечать', 'отказываюсь отвечать']], label='Ваш уровень образования?', widget=widgets.RadioSelect, ) education_mother = models.StringField( choices=[['Не имею образования', 'Не имею образования'], ['Начальное образование', 'Начальное образование'], ['Основное среднее образование', 'Основное среднее образование'], ['Общее среднее образование', 'Общее среднее образование'], ['Начальное профессиональное образование', 'Начальное профессиональное образование'], ['Среднее профессиональное(специальное) образование', 'Среднее профессиональное(специальное) образование'], ['Техническое и профессиональное образование', 'Техническое и профессиональное образование'], ['Незаконченное высшее образование', 'Незаконченное высшее образование'], ['Высшее образование', 'Высшее образование'], ['Послевузовское образование(магистратура)', 'Послевузовское образование(магистратура)'], ['Послевузовское образование(докторантура)', 'Послевузовское образование(докторантура)'], ['отказываюсь отвечать', 'отказываюсь отвечать']], label='Уровень образования матери?', widget=widgets.RadioSelect, ) education_father = models.StringField( choices=[['Не имею образования', 'Не имею образования'], ['Начальное образование', 'Начальное образование'], ['Основное среднее образование', 'Основное среднее образование'], ['Общее среднее образование', 'Общее среднее образование'], ['Начальное профессиональное образование', 'Начальное профессиональное образование'], ['Среднее профессиональное(специальное) образование', 'Среднее профессиональное(специальное) образование'], ['Техническое и профессиональное образование', 'Техническое и профессиональное образование'], ['Незаконченное высшее образование', 'Незаконченное высшее образование'], ['Высшее образование', 'Высшее образование'], ['Послевузовское образование(магистратура)', 'Послевузовское образование(магистратура)'], ['Послевузовское образование(докторантура)', 'Послевузовское образование(докторантура)'], ['отказываюсь отвечать', 'отказываюсь отвечать']], label='Уровень образования отца?', widget=widgets.RadioSelect, ) job_father = models.StringField( choices=[['Офисная профессия', 'Офисная профессия'], ['Рабочая профессия', 'Рабочая профессия'], ['Не применимо', 'Не применимо'], ['отказываюсь отвечать', 'отказываюсь отвечать']], label = 'Профессия Вашего отца?', widget = widgets.RadioSelect, ) job_mother = models.StringField( choices=[['Офисная профессия', 'Офисная профессия'], ['Рабочая профессия', 'Рабочая профессия'], ['Не применимо', 'Не применимо'], ['отказываюсь отвечать', 'отказываюсь отвечать']], label = 'Профессия Вашей матери?', widget = widgets.RadioSelect, ) blue_job_salary = models.IntegerField( label='По Вашему мнению, каков средний уровень заработной платы для рабочей профессии в вашем регионе?') white_job_salary = models.IntegerField( label='По Вашему мнению, каков средний уровень заработной платы для офисной профессии в вашем регионе?') employment_status = models.StringField( choices=[['Да', 'Да'], ['Нет', 'Нет'], ['отказазываюсь отвечать', 'отказазываюсь отвечать']], label = 'Есть ли у вас в настоящее время работа или деятельность, приносящая доход?', widget = widgets.RadioSelect, ) employment = models.StringField( choices=[['Разовая / временная / сезонная работа', 'Разовая / временная / сезонная работа'], [' Семейная / самостоятельная занятость(неполный рабочий день)', ' Семейная / самостоятельная занятость(неполный рабочий день)'], [' Семейная / самостоятельная занятость(полный рабочий день)', ' Семейная / самостоятельная занятость(полный рабочий день)'], [' Занятость по найму(неполный рабочий день)', ' Занятость по найму(неполный рабочий день)'], [' Занятость по найму(полный рабочий день)', ' Занятость по найму(полный рабочий день)'], ['отказываюсь отвечать', 'отказываюсь отвечать'], ['Не применимо', 'Не применимо']], label = 'Если применимо, Как бы вы ЛУЧШЕ описали бы свой статус занятости или ситуацию в данный момент?', widget = widgets.RadioSelect, ) job_self = models.StringField( choices=[['Офисная профессия', 'Офисная профессия'], ['Рабочая профессия', 'Рабочая профессия'], ['отказываюсь отвечать', 'отказываюсь отвечать']], label = 'По Вашему мнению, какая профессия подходит Вам более исходя из Ваших навыков?', widget = widgets.RadioSelect, ) unemployment = models.StringField( choices=[['Менее 1 месяца', 'Менее 1 месяца'], ['1 - 6 месяцев', '1 - 6 месяцев'], ['6 - 12 месяцев', '6 - 12 месяцев'], ['Более года', 'Более года'], ['отказываюсь отвечать', 'отказываюсь отвечать'], ['Не применимо', 'Не применимо']], label = 'Если применимо, как долго вы не работали и не занимались приносящей доход деятельностью?', widget = widgets.RadioSelect, ) # FUNCTIONS def set_payoffs(group: Group): players = group.get_players() group.num_blue_jobseekers = sum([p.jobseeker for p in players]) group.num_white_jobseekers = C.PLAYERS_PER_GROUP-sum([p.jobseeker for p in players]) for p in players: p.payoff = C.SALARY_MIN + C.STEP * sum([p.jobseeker for p in players]) if p.jobseeker: p.payoff = C.SALARY_MAX - C.STEP * sum([p.jobseeker for p in players]) # PAGES class ConsentForm(Page): def is_displayed(player: Player): return player.round_number == 1 class Introduction(Page): def is_displayed(player: Player): return player.round_number == 1 form_model = 'player' form_fields = ['position'] class Decision(Page): form_model = 'player' form_fields = ['jobseeker'] class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results(Page): def vars_for_template(player: Player): return dict(others = player.get_others_in_group(), round_1_players = player.in_round(1).get_others_in_group(), mean_rounds = sum([p.payoff for p in player.in_all_rounds()])/player.round_number, payoff_other = C.SALARY_MAX + C.SALARY_MIN - player.payoff) class Finalsurvey(Page): form_model = 'player' form_fields = ['age', 'finance', 'gender', 'city', 'education', 'education_mother', 'education_father', 'job_father', 'job_mother', 'blue_job_salary', 'white_job_salary', 'employment_status', 'employment', 'job_self', 'unemployment' ] def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class Exit(Page): def vars_for_template(player: Player): return dict(final_payoff = 2000 + 0.02*sum([p.payoff for p in player.in_all_rounds()])/C.NUM_ROUNDS) def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS page_sequence = [ ConsentForm, Introduction, Decision, ResultsWaitPage, Results, Finalsurvey, Exit ]