from otree.api import *
author = 'Alistair Munro, Fitawhidan Nashuha, and Gerald Ezra Charles'
doc = """
Post-Session Survey (bilingual: English / Indonesian).
Language is chosen from the SESSION CONFIG key 'language' ('en' or 'id'),
the same source used by the coin-flip game app, so the entire session runs
in one language. Each field's choices are returned by a method that branches
on the language; no runtime mutation of class-level field objects.
"""
class C(BaseConstants):
NAME_IN_URL = 'f_Post_Game_Survey'
PLAYERS_PER_GROUP = None
NUM_ROUNDS = 1
class Subsession(BaseSubsession):
pass
class Group(BaseGroup):
pass
def get_language(player):
return player.session.config.get('language', 'en') == 'en'
class Player(BasePlayer):
# ----------------------------- Demographics ---------------------------
def education_choices(player):
if get_language(player):
return [
['1', 'Primary School'],
['2', 'Junior High School'],
['3', 'Senior High School / Vocational High School'],
['4', 'Vocational School / Diploma (D1/D2/D3)'],
['5', "Bachelor's Degree (S1 / D4)"],
['6', "Master's Degree (S2)"],
['7', 'Doctoral Degree (S3)'],
['95', 'Do not know / Prefer not to answer'],
['99', 'Never attended school'],
]
return [
['1', 'Sekolah Dasar'],
['2', 'Sekolah Menengah Pertama'],
['3', 'Sekolah Menengah Atas / SMK'],
['4', 'Sekolah Kejuruan / Diploma (D1/D2/D3)'],
['5', 'Sarjana (S1 / D4)'],
['6', 'Magister (S2)'],
['7', 'Doktor (S3)'],
['95', 'Tidak tahu / Tidak ingin menjawab'],
['99', 'Tidak pernah bersekolah'],
]
education = models.StringField(
label='',
choices=education_choices,
widget=widgets.RadioSelect
)
HH_Number = models.IntegerField(label='')
HH_5yo = models.IntegerField(min=0, label='')
def HH_Decision_Maker_choices(player):
if get_language(player):
return [
['Me', 'Myself'],
['Spouse', 'My spouse'],
['Father', 'My father'],
['Mother', 'My mother'],
['Sister', 'My sister'],
['Brother', 'My brother'],
['Grandfather', 'My grandfather'],
['Grandmother', 'My grandmother'],
['Uncle', 'My uncle'],
['Aunt', 'My aunt'],
['Others', 'Others'],
]
return [
['Me', 'Saya sendiri'],
['Spouse', 'Pasangan saya'],
['Father', 'Ayah saya'],
['Mother', 'Ibu saya'],
['Sister', 'Saudara perempuan saya'],
['Brother', 'Saudara laki-laki saya'],
['Grandfather', 'Kakek saya'],
['Grandmother', 'Nenek saya'],
['Uncle', 'Paman saya'],
['Aunt', 'Bibi saya'],
['Others', 'Lainnya'],
]
HH_Decision_Maker = models.StringField(
label='',
choices=HH_Decision_Maker_choices,
widget=widgets.RadioSelect
)
def Religion_choices(player):
if get_language(player):
return [
['Islam', 'Islam'],
['Catholic', 'Catholic'],
['Christian', 'Christian'],
['Hindu', 'Hindu'],
['Buddha', 'Buddhism'],
['Konghucu/Confucius', 'Confucianism'],
['Others', 'Others'],
]
return [
['Islam', 'Islam'],
['Catholic', 'Katolik'],
['Christian', 'Kristen'],
['Hindu', 'Hindu'],
['Buddha', 'Buddha'],
['Konghucu/Confucius', 'Konghucu'],
['Others', 'Lainnya'],
]
Religion = models.StringField(
label='',
choices=Religion_choices,
widget=widgets.RadioSelect
)
# --------------------------- Smoking / Alcohol -------------------------
def Smoke_Cigarettes_choices(player):
if get_language(player):
return [[True, 'Yes, I smoke'], [False, 'No, I do not smoke']]
return [[True, 'Ya, saya merokok'], [False, 'Tidak, saya tidak merokok']]
Smoke_Cigarettes = models.BooleanField(
label='',
choices=Smoke_Cigarettes_choices,
widget=widgets.RadioSelect
)
def Smoke_Ecig_choices(player):
if get_language(player):
return [[True, 'Yes'], [False, 'No']]
return [[True, 'Ya'], [False, 'Tidak']]
Smoke_Ecig = models.BooleanField(
label='',
choices=Smoke_Ecig_choices,
widget=widgets.RadioSelect
)
def Smoke_Chew_choices(player):
if get_language(player):
return [[True, 'Yes'], [False, 'No']]
return [[True, 'Ya'], [False, 'Tidak']]
Smoke_Chew = models.BooleanField(
label='',
choices=Smoke_Chew_choices,
widget=widgets.RadioSelect
)
def Smoke_Hookah_choices(player):
if get_language(player):
return [[True, 'Yes'], [False, 'No']]
return [[True, 'Ya'], [False, 'Tidak']]
Smoke_Hookah = models.BooleanField(
label='',
choices=Smoke_Hookah_choices,
widget=widgets.RadioSelect
)
def Drink_Alcohol_choices(player):
if get_language(player):
return [
['No', 'No, I do not consume alcohol'],
['Yes', 'Yes, I consume alcohol'],
['Used to', 'I used to consume alcohol but no longer do'],
]
return [
['No', 'Tidak, saya tidak mengonsumsi alkohol'],
['Yes', 'Ya, saya mengonsumsi alkohol'],
['Used to', 'Saya dulu mengonsumsi alkohol tetapi sekarang tidak'],
]
Drink_Alcohol = models.StringField(
label='',
choices=Drink_Alcohol_choices,
widget=widgets.RadioSelect
)
# ------------------------------ Debt Profile --------------------------
def Debt_A_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_A = models.StringField(
label='',
choices=Debt_A_choices,
widget=widgets.RadioSelect
)
def Debt_B_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_B = models.StringField(
label='',
choices=Debt_B_choices,
widget=widgets.RadioSelect
)
def Debt_Online_Past_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Online_Past = models.StringField(
label='',
choices=Debt_Online_Past_choices,
widget=widgets.RadioSelect
)
def Debt_Paylater_Credit_Past_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Paylater_Credit_Past = models.StringField(
label='',
choices=Debt_Paylater_Credit_Past_choices,
widget=widgets.RadioSelect
)
def Debt_Family_Past_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Family_Past = models.StringField(
label='',
choices=Debt_Family_Past_choices,
widget=widgets.RadioSelect
)
def Debt_Online_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Online = models.StringField(
label='',
choices=Debt_Online_choices,
widget=widgets.RadioSelect
)
def Debt_Paylater_Credit_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Paylater_Credit = models.StringField(
label='',
choices=Debt_Paylater_Credit_choices,
widget=widgets.RadioSelect
)
def Debt_Family_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Family = models.StringField(
label='',
choices=Debt_Family_choices,
widget=widgets.RadioSelect
)
def Debt_Friend_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Friend = models.StringField(
label='',
choices=Debt_Friend_choices,
widget=widgets.RadioSelect
)
def Debt_Private_Lender_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Private_Lender = models.StringField(
label='',
choices=Debt_Private_Lender_choices,
widget=widgets.RadioSelect
)
def Debt_Health_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Health = models.StringField(
label='',
choices=Debt_Health_choices,
widget=widgets.RadioSelect
)
def Debt_Food_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Food = models.StringField(
label='',
choices=Debt_Food_choices,
widget=widgets.RadioSelect
)
def Debt_Capital_choices(player):
if get_language(player):
return [['Yes', 'Yes'], ['No', 'No'], ['Refused', 'I prefer not to answer']]
return [['Yes', 'Ya'], ['No', 'Tidak'], ['Refused', 'Saya menolak menjawab']]
Debt_Capital = models.StringField(
label='',
choices=Debt_Capital_choices,
widget=widgets.RadioSelect
)
def Desperation_Finance_choices(player):
if get_language(player):
return [
['True', 'Yes, I feel financially pressured'],
['False', 'No, I do not feel financially pressured'],
['Refused', 'I prefer not to answer'],
]
return [
['True', 'Ya, saya merasa terdesak secara finansial'],
['False', 'Tidak, saya tidak merasa terdesak secara finansial'],
['Refused', 'Saya menolak menjawab'],
]
Desperation_Finance = models.StringField(
label='',
choices=Desperation_Finance_choices,
widget=widgets.RadioSelect
)
def Quick_Money_choices(player):
if get_language(player):
return [
['Yes', 'Yes'],
['No', 'No'],
['Likely', 'Not sure, but likely'],
['Unlikely', 'Not sure, but unlikely'],
['Refused', 'I prefer not to answer'],
]
return [
['Yes', 'Ya'],
['No', 'Tidak'],
['Likely', 'Saya tidak yakin, tetapi kemungkinan akan melakukannya'],
['Unlikely', 'Saya tidak yakin, tetapi kemungkinan tidak akan melakukannya'],
['Refused', 'Saya menolak menjawab'],
]
Quick_Money = models.StringField(
label='',
choices=Quick_Money_choices,
widget=widgets.RadioSelect
)
# --------------------- World Bank Financial Literacy ------------------
# NOTE: validated instrument — confirm the official Indonesian wording.
def WB_FinLit_1_choices(player):
if get_language(player):
return [
['1', 'I have no knowledge and skills'],
['2', 'My knowledge and skills are inadequate'],
['3', 'My knowledge and skills are sufficient'],
['4', 'My knowledge and skills are good'],
['5', 'My knowledge and skills are very good'],
['99', 'I do not know'],
]
return [
['1', 'Saya tidak memiliki pengetahuan dan keterampilan'],
['2', 'Pengetahuan dan keterampilan saya kurang memadai'],
['3', 'Pengetahuan dan keterampilan saya cukup'],
['4', 'Pengetahuan dan keterampilan saya baik'],
['5', 'Pengetahuan dan keterampilan saya sangat baik'],
['99', 'Saya tidak tahu'],
]
WB_FinLit_1 = models.StringField(
label='',
choices=WB_FinLit_1_choices,
widget=widgets.RadioSelect
)
def WB_FinLit_2_choices(player):
if get_language(player):
return [
['1', 'More than now'],
['2', 'The same as now'],
['3', 'Less than now'],
['99', 'I do not know'],
]
return [
['1', 'Lebih banyak dari sekarang'],
['2', 'Sama seperti sekarang'],
['3', 'Lebih sedikit dari sekarang'],
['99', 'Saya tidak tahu'],
]
WB_FinLit_2 = models.StringField(
label='',
choices=WB_FinLit_2_choices,
widget=widgets.RadioSelect
)
def WB_FinLit_3_choices(player):
if get_language(player):
return [
['1', 'More than Rp12,000,000'],
['2', 'Exactly Rp12,000,000'],
['3', 'Less than Rp12,000,000'],
['99', 'I do not know'],
]
return [
['1', 'Lebih dari Rp12.000.000'],
['2', 'Tepat Rp12.000.000'],
['3', 'Kurang dari Rp12.000.000'],
['99', 'Saya tidak tahu'],
]
WB_FinLit_3 = models.StringField(
label='',
choices=WB_FinLit_3_choices,
widget=widgets.RadioSelect
)
def WB_FinLit_4_choices(player):
if get_language(player):
return [
['1', 'Rp150,000 discount'],
['2', 'Both are the same'],
['3', '10% discount'],
['99', 'I do not know'],
]
return [
['1', 'Diskon Rp150.000'],
['2', 'Keduanya sama'],
['3', 'Diskon 10%'],
['99', 'Saya tidak tahu'],
]
WB_FinLit_4 = models.StringField(
label='',
choices=WB_FinLit_4_choices,
widget=widgets.RadioSelect
)
def WB_FinLit_5_choices(player):
if get_language(player):
return [
['1', '3%'],
['2', '6%'],
['3', '9%'],
['4', '12%'],
['99', 'I do not know'],
]
return [
['1', '3%'],
['2', '6%'],
['3', '9%'],
['4', '12%'],
['99', 'Saya Tidak tahu'],
]
WB_FinLit_5 = models.StringField(
label='',
choices=WB_FinLit_5_choices,
widget=widgets.RadioSelect
)
# ----------------------- OECD Financial Literacy ----------------------
def OECD_FinLit_1_choices(player):
if get_language(player):
return [
['1', 'More than now'],
['2', 'The same'],
['3', 'Less'],
['4', 'Depends on goods'],
['99', 'I do not know'],
]
return [
['1', 'Lebih banyak dari sekarang'],
['2', 'Sama seperti sekarang'],
['3', 'Lebih sedikit dari sekarang'],
['4', 'Tergantung pada jenis barang'],
['99', 'Saya tidak tahu'],
]
OECD_FinLit_1 = models.StringField(
label='',
choices=OECD_FinLit_1_choices,
widget=widgets.RadioSelect
)
def OECD_FinLit_2_choices(player):
if get_language(player):
return [
['1', 'Rp1,200,000'],
['2', 'Rp1,020,000'],
['3', 'Rp1,100,000'],
['99', 'I do not know'],
]
return [
['1', 'Rp1.200.000'],
['2', 'Rp1.020.000'],
['3', 'Rp1.100.000'],
['99', 'Saya tidak tahu'],
]
OECD_FinLit_2 = models.StringField(
label='',
choices=OECD_FinLit_2_choices,
widget=widgets.RadioSelect
)
def OECD_FinLit_3_choices(player):
if get_language(player):
return [
['1', 'Rp1,200,000'], ['2', 'Rp1,020,000'], ['3', 'Rp1,100,000'], ['99', 'I do not know'],
]
return [
['1', 'Rp1,200,000'], ['2', 'Rp1,020,000'], ['3', 'Rp1,100,000'], ['99', 'Saya tidak tahu'],
]
OECD_FinLit_3 = models.StringField(
label='',
choices=OECD_FinLit_3_choices,
widget=widgets.RadioSelect
)
def OECD_FinLit_4_choices(player):
if get_language(player):
return [['True', 'True'], ['False', 'False'], ['99', 'I do not know']]
return [['True', 'Benar'], ['False', 'Salah'], ['99', 'Saya tidak tahu']]
OECD_FinLit_4 = models.StringField(
label='',
choices=OECD_FinLit_4_choices,
widget=widgets.RadioSelect
)
def OECD_FinLit_5_choices(player):
if get_language(player):
return [['True', 'True'], ['False', 'False'], ['99', 'I do not know']]
return [['True', 'Benar'], ['False', 'Salah'], ['99', 'Saya tidak tahu']]
OECD_FinLit_5 = models.StringField(
label='',
choices=OECD_FinLit_5_choices,
widget=widgets.RadioSelect
)
# OECD_FinLit_6 — the only field that carries an inline (bilingual) label.
def OECD_FinLit_6_label(player):
if get_language(player):
return ('True or False: Risk in stock investments can be reduced '
'through diversification.')
return ('Benar atau Salah: Risiko investasi saham dapat dikurangi '
'melalui diversifikasi.')
def OECD_FinLit_6_choices(player):
if get_language(player):
return [['True', 'True'], ['False', 'False'], ['99', 'I do not know']]
return [['True', 'Benar'], ['False', 'Salah'], ['99', 'Saya tidak tahu']]
OECD_FinLit_6 = models.StringField(
label='',
choices=OECD_FinLit_6_choices,
widget=widgets.RadioSelect
)
OECD_FinLit_7 = models.IntegerField(min=0, max=10_000_000, label='')
# -------------------- OECD Additional Literacy Measures ---------------
OECD_Division = models.IntegerField(min=0, max=10_000_000, label='')
def OECD_Time_Value_choices(player):
if get_language(player):
return [
['1', 'More goods'],
['2', 'Almost the same amount'],
['3', 'Less goods'],
['4', 'Depends on the type of goods'],
['5', 'Depends on price changes'],
['99', 'I do not know'],
]
return [
['1', 'Lebih banyak barang'],
['2', 'Hampir sama'],
['3', 'Lebih sedikit barang'],
['4', 'Tergantung jenis barang'],
['5', 'Tergantung perubahan harga'],
['99', 'Saya tidak tahu'],
]
OECD_Time_Value = models.StringField(
label='',
choices=OECD_Time_Value_choices,
widget=widgets.RadioSelect
)
def OECD_Diversification_choices(player):
if get_language(player):
return [['True', 'True'], ['False', 'False'], ['99', 'I do not know']]
return [['True', 'Benar'], ['False', 'Salah'], ['99', 'Saya tidak tahu']]
OECD_Diversification = models.StringField(
label='',
choices=OECD_Diversification_choices,
widget=widgets.RadioSelect
)
def OECD_RisknReturn_choices(player):
if get_language(player):
return [['True', 'True'], ['False', 'False'], ['99', 'I do not know']]
return [['True', 'Benar'], ['False', 'Salah'], ['99', 'Saya tidak tahu']]
OECD_RisknReturn = models.StringField(
label='',
choices=OECD_RisknReturn_choices,
widget=widgets.RadioSelect
)
# ---- DROPPED in the 2nd file — confirm whether to keep ----
OECD_Interest = models.IntegerField(min=0, max=10_000_000, label='')
def OECD_Interest_Compound_choices(player):
if get_language(player):
return [
['1', 'More than Rp110,000'],
['2', 'Exactly Rp110,000'],
['3', 'Less than Rp110,000'],
['4', 'Cannot be determined'],
['99', 'I do not know'],
]
return [
['1', 'Lebih dari Rp110,000'],
['2', 'Rp110,000'],
['3', 'Kurang dari Rp110,000'],
['4', 'Tidak dapat ditentukan'],
['99', 'Saya tidak tahu'],
]
OECD_Interest_Compound = models.StringField(
label='',
choices=OECD_Interest_Compound_choices,
widget=widgets.RadioSelect
)
OECD_Interest_Loan = models.IntegerField(min=0, max=10_000_000, label='')
def OECD_Diversification2_choices(player):
if get_language(player):
return [['True', 'True'], ['False', 'False'], ['99', 'I do not know']]
return [['True', 'Benar'], ['False', 'Salah'], ['99', 'Saya tidak tahu']]
OECD_Diversification2 = models.StringField(
label='',
choices=OECD_Diversification2_choices,
widget=widgets.RadioSelect
)
# ------------------------- General Risk Preference --------------------
def General_Risk_Q_choices(player):
if get_language(player):
return [
['1', 'Very unwilling'],
['2', 'Unwilling'],
['3', 'Somewhat willing'],
['4', 'Willing'],
['5', 'Very willing'],
]
return [
['1', 'Sangat tidak bersedia'],
['2', 'Tidak bersedia'],
['3', 'Cukup bersedia'],
['4', 'Bersedia'],
['5', 'Sangat bersedia'],
]
General_Risk_Q = models.StringField(
label='',
choices=General_Risk_Q_choices,
widget=widgets.RadioSelect
)