from otree.api import *
import random
import pandas as pd
doc = '''
This is the main survey app. It contains
1. Main survey
2. One attention check.
- You can additionally calculate payoffs and save them at a participant field.
'''
class C(BaseConstants):
NAME_IN_URL = 'Part_I'
PLAYERS_PER_GROUP = None
NUM_ROUNDS = 1
Instructions_path = "_templates/global/Instructions.html"
Quit_study_text_path = "_templates/global/Quit_study_text.html"
tasks_path = "_templates/global/tasks/"
Return_redirect = "https://www.wikipedia.org/" #TODO: adjust redirect
# for now only the complete tasks are listed here
#TODO: should we put an average person earned 100 in the question isntead of description?
Task_details = pd.read_csv('_static/Tasks.csv')
class Subsession(BaseSubsession):
pass
class Group(BaseGroup):
pass
class Player(BasePlayer):
# data quality
blur_event_counts = models.StringField(initial=0, blank=True) # logs how often user clicked out of the page
# Attention check 2, 1 was in introduction
Attention_2 = models.BooleanField(choices=[
[False, 'I think both are possible.'],
[True, 'I disagree.'],
[False, 'I agree.'],],
label= 'A 20 year old man can eat 500kg meat and 2 tons of vegetables in one meal.', widget=widgets.RadioSelect)
# Player answers
Task1_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?") #maybe half of the participants should answer with women?
Task1_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?") #maybe half of the participants should answer with women?
Task2_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task2_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task3_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task3_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task4_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task4_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task5_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task5_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task6_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task6_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task7_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task7_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task8_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task8_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task9_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task9_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task10_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task10_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task11_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task11_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task12_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task12_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task13_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task13_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
Task14_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
Task14_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
# uncomment the lines below to see all pages
# Task15_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
# Task15_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
# Task16_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
# Task16_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
# Task17_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
# Task17_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
# Task18_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
# Task18_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
# Task19_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
# Task19_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
# Task20_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
# Task20_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
# Task21_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
# Task21_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
# Task22_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
# Task22_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
# Task23_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
# Task23_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
# Task24_male_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average man earned?")
# Task24_female_FOB = models.FloatField( min=0, max=200, label="How many points do you think an average woman earned?")
#%% Functions
def get_task_details(player, page_number):
treatment = player.participant.Treatment
task = treatment[page_number-1]
task_row = C.Task_details.loc[C.Task_details['Name'] == task]
description = task_row['Task_description'].values[0]
picture_link = f"https://raw.githubusercontent.com/argunaman2022/Survey2/main/_static/Task_pictures/{task}.png"
picture_desc = task_row['Picture_description'].values[0]
return task, description, picture_link, picture_desc, page_number
#%% Base Pages
class MyBasePage(Page):
'MyBasePage contains the functions that are common to all pages'
form_model = 'player'
form_fields = ['blur_event_counts']
@staticmethod
def is_displayed(player: Player):
return player.participant.Allowed
@staticmethod
def vars_for_template(player: Player):
return {'hidden_fields': ['blur_event_counts'], #hide the browser field from the participant, see the page to see how this works. #user_clicked_out
'Instructions': C.Instructions_path,
}
# Pages
class Attention_check_2(MyBasePage):
extra_fields = ['Attention_2']
form_fields = MyBasePage.form_fields + extra_fields
def before_next_page(player: Player, timeout_happened=False):
player.participant.vars['Attention_2'] = player.Attention_2
if (not player.Attention_2 and not player.participant.vars['Attention_1']):
player.participant.vars['Allowed'] = False
player.participant.vars['Attention_passed'] = False
class Task1(MyBasePage):
extra_fields = ['Task1_male_FOB','Task1_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 1)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task2(MyBasePage):
extra_fields = ['Task2_male_FOB','Task2_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 2)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task3(MyBasePage):
extra_fields = ['Task3_male_FOB','Task3_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 3)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task4(MyBasePage):
extra_fields = ['Task4_male_FOB','Task4_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 4)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task5(MyBasePage):
extra_fields = ['Task5_male_FOB','Task5_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 5)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task6(MyBasePage):
extra_fields = ['Task6_male_FOB','Task6_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 6)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task7(MyBasePage):
extra_fields = ['Task7_male_FOB','Task7_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 7)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task8(MyBasePage):
extra_fields = ['Task8_male_FOB','Task8_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 8)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task9(MyBasePage):
extra_fields = ['Task9_male_FOB','Task9_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 9)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task10(MyBasePage):
extra_fields = ['Task10_male_FOB','Task10_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 10)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task11(MyBasePage):
extra_fields = ['Task11_male_FOB','Task11_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 11)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task12(MyBasePage):
extra_fields = ['Task12_male_FOB','Task12_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 12)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task13(MyBasePage):
extra_fields = ['Task13_male_FOB','Task13_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 13)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task14(MyBasePage):
extra_fields = ['Task14_male_FOB','Task14_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 14)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task15(MyBasePage):
extra_fields = ['Task15_male_FOB','Task15_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 15)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task16(MyBasePage):
extra_fields = ['Task16_male_FOB','Task16_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 16)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task17(MyBasePage):
extra_fields = ['Task17_male_FOB','Task17_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 17)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task18(MyBasePage):
extra_fields = ['Task18_male_FOB','Task18_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 18)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task19(MyBasePage):
extra_fields = ['Task19_male_FOB','Task19_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 19)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task20(MyBasePage):
extra_fields = ['Task20_male_FOB','Task20_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 20)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task21(MyBasePage):
extra_fields = ['Task21_male_FOB','Task21_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 21)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task22(MyBasePage):
extra_fields = ['Task22_male_FOB','Task22_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 22)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
class Task23(MyBasePage):
extra_fields = ['Task23_male_FOB','Task23_female_FOB']
form_fields = MyBasePage.form_fields + extra_fields
@staticmethod
def vars_for_template(player: Player):
variables = MyBasePage.vars_for_template(player)
task, description, picture_link, picture_desc, page_number = get_task_details(player, 23)
variables['Task'] = task
variables['Task_description'] = description
variables['Picture_link'] = picture_link
variables['Picture_desc'] = picture_desc
variables['Page_title'] = f'Task {page_number} of 14'
return variables
page_sequence = [
Task1, Task2,
Task3, Task4, Task5, Task6, Task7, Task8, Task9, Task10,
Task11, Task12, Task13, Task14,
#uncomment the line below to see all tasks
# Task15, Task16, Task17, Task18, Task19, Task20, Task21, Task22, Task23,
Attention_check_2,
]