from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'selection_experiment_indo' PLAYERS_PER_GROUP = 3 NUM_ROUNDS = 1 endowment = 200000 class Subsession(BaseSubsession): pass class Group(BaseGroup): treatment = models.StringField() patronage_chosen = models.IntegerField( label = "Siapa di antara peserta lain yang ingin Anda pilih sebagai pejabat publik?", widget=widgets.RadioSelectHorizontal, choices=[ [2, "P2"], [3, "P3"]]) remaining_amount = models.IntegerField() payoff1 = models.IntegerField( label = "Peserta 1", min = 0 ) payoff2 = models.IntegerField( min=0, label="Peserta 2" ) payoff3 = models.IntegerField( min=0, label="Peserta 3" ) #payoff4 = models.IntegerField( # min=0, # label="Peserta 4" #) #payoff5 = models.IntegerField( # min=0, # label="Peserta 5" #) dictator_payoff = models.IntegerField( min=0, max=200000, label="Saya ingin menyimpan:" ) public_official = models.IntegerField() def payoff1_max(self): return 200000 - self.dictator_payoff def payoff2_max(self): return 200000 - self.dictator_payoff def payoff3_max(self): return 200000 - self.dictator_payoff #def payoff4_max(self): # return 200000 - self.dictator_payoff #def payoff5_max(self): # return 200000 - self.dictator_payoff #score for merit condition top_score = models.IntegerField() class Player(BasePlayer): # the stuff that will be presented to patron for selection age = models.IntegerField(label = "Berapa usia Anda?", min = 18, max = 99, blank = True) education = models.IntegerField( label = "Apa jenjang pendidikan tertinggi Anda?", widget = widgets.RadioSelectHorizontal, choices=[ [1, "SD"], [2, "SMP"], [3, "SMA"], [4, "S1/S2/S3"]]) gender = models.IntegerField(label = "Apa jenis kelamin Anda?", widget = widgets.RadioSelectHorizontal, choices = [[1, "Laki-laki"], [2, "Perempuan"]]) province = models.IntegerField(label = "Apa Provinsi Anda?", # widget = widgets.RadioSelectHorizontal, choices = [[1, "Aceh"], [2, "Sumatera Utara"], [3, "Sumatera Barat"], [4, "Riau"], [5, "Jambi"], [6, "Sumatera Selatan"], [7, "Bengkulu"],[8, "Lampung"], [9, "Bangka Belitung"],[10, "Kepulauan Riau"],[11, "DKI Jakarta"], [12, "Jawa Barat"], [13, "Jawa Tengah"],[14, "DI Yogyakarta"],[15, "Jawa Timur"], [16, "Banten"], [17, "Bali"], [18, "NTB"],[19, "NTT"],[20, "Kalimantan Barat"],[21, "Kalimantan Tengah"], [22, "Kalimantan Selatan"],[23, "Kalimantan Timur"],[24, "Kalimantan Utara"], [25, "Sulawesi Utara"],[26, "Sulawesi Tengah"],[27, "Sulawesi Selatan"], [28, "Sulawesi Tenggara"], [29, "Gorontalo"], [30, "Sulawesi Barat"], [31, "Maluku"], [32, "Maluku Utara"], [33, "Papua Barat"], [34, "Papua"]]) religion = models.IntegerField(label = "Apa agama Anda?", widget = widgets.RadioSelectHorizontal, choices = [[1, "Islam"], [2, "Kristen (Protestan)"], [3, "Katholik"], [4, "Hindu"], [5, "Buddha"], [6, "Lain-lain"]]) ethnicity = models.IntegerField(label = "Apa suku/etnis Anda?", widget = widgets.RadioSelectHorizontal, choices = [[1, "Jawa"], [2, "Sunda"], [3, "Melayu"], [4, "Madura"], [5, "Bugis"], [6, "Betawi"], [7, "Batak"], [8, "Minang"], [9, "Bali"], [10, "Lain-lain"]]) is_age = models.BooleanField(label ="Apakah Anda berusia 18 tahun atau lebih?", choices = [ [True, "Iya"], [False, "Tidak"]]) is_consent = models.BooleanField(label ="Apakah Anda setuju untuk berpartisipasi dalam penelitian ini?", choices = [ [True, "Iya, bersedia"], [False, "Tidak, saya tidak bersedia"]]) #bf1 = models.IntegerField(label = "Cenderung mencari kesalahan orang lain", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf2 = models.IntegerField(label = "Suka menolong dan tidak mementingkan diri sendiri dengan orang lain", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf3 = models.IntegerField(label = "Memulai pertengkaran dengan orang lain", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf4 = models.IntegerField(label = "Saya mudah memaafkan orang lain", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf5 = models.IntegerField(label = "Secara umum mudah percaya", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf6 = models.IntegerField(label = "Suka bekerja sama dengan orang lain.", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf7 = models.IntegerField(label = "Melakukan pekerjaan secara menyeluruh", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf8 = models.IntegerField(label = "Bisa agak ceroboh", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf9 = models.IntegerField(label = "Pekerja yang bisa diandalkan", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf10 = models.IntegerField(label = "Cenderung tidak terorganisir", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf11 = models.IntegerField(label = "Cenderung malas", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf12 = models.IntegerField(label = "Tekun hingga tugas selesai", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) #bf13 = models.IntegerField(label = "Mudah teralihkan perhatiannya", # widget = widgets.RadioSelectHorizontal, # choices = [[1, "Sangat Setuju"], [2, "Setuju"], [3, "Netral"], # [4, "Tidak Setuju"], [5, "Sangat Tidak Setuju"]]) vign_1 = models.IntegerField(label = "Anda sedang berusaha memberikan kontrak pemeliharaan jalan kepada perusahaan swasta. Tawaran terbaik dan hemat biaya, dari ABC Corporation, diajukan sehari setelah batas waktu lelang berakhir. CEO ABC Corporation juga mengirim email kepada Anda untuk meminta maaf. Pada skala 1-5, seberapa besar kemungkinan Anda menerima tawaran dari ABC Corporation?", widget = widgets.RadioSelect, choices = [[1, "Pasti akan menolak tawaran tersebut"], [2, "Mungkin akan menolak tawaran tersebut"], [3, "Tidak lebih atau kurang mungkin menerima tawaran tersebut"], [4, "Mungkin akan menerima tawaran tersebut"], [5, "Pasti akan menerima tawaran tersebut"]]) vign_2 = models.IntegerField(label = "Anda adalah seorang dokter yang memprioritaskan pasien berdasarkan tingkat keparahan penyakit dan urgensi perawatan. Di triase, Anda didekati oleh seorang pasien dengan sakit kepala parah, yang meminta untuk melompat ke depan nomor antrian yang diberikan kepadanya. Dia mengatakan karena dia ada di sini saat istirahat makan siang dan harus segera kembali ke kantor. Pada skala 1-5, seberapa besar kemungkinan Anda membiarkan pasien maju dalam antrian?", widget = widgets.RadioSelect, choices = [[1, "Pasti akan mengizinkan pasien untuk maju dalam antrian"], [2, "Kemungkinan besar akan mengizinkan pasien untuk maju dalam antrean"], [3, "Netral"], [4, "Kemungkinan besar tidak akan mengizinkan pasien untuk maju dalam antrean"], [5, "Pasti tidak akan mengizinkan pasien untuk maju dalam antrian"]]) vign_3 = models.IntegerField(label = "Anda telah bekerja di departemen Kementerian Luar Negeri selama lebih dari tiga tahun. Selama periode ini, Anda telah membiasakan diri dengan semua kebijakan yang mengatur operasi departemen Anda. Atasan baru Anda baru saja bergabung ke departemen Anda setelah dipindahkan dari tempat lain. Dia memberi Anda instruksi yang Anda tahu jelas tidak efisien untuk mengatur berkas dan akan memperlambat semuanya. Meskipun Anda sudah memberitahukan hal ini kepada atasan baru Anda, dia tidak setuju dengan Anda dan meminta Anda untuk mengikuti instruksinya. Pada skala 1-5, seberapa besar kemungkinan Anda menerima instruksinya?", widget = widgets.RadioSelect, choices = [[1, "Pasti akan mengikuti instruksi atasan"], [2, "Mungkin akan mengikuti instruksi atasan"], [3, "Kurang lebih/tidak akan mengikuti instruksi atasan"], [4, "Mungkin akan mengatur berkas dengan cara yang lebih efisien."], [5, "Pasti akan mengatur berkas dengan cara yang lebih efisien"]]) vign_4 = models.IntegerField(label = "Anda adalah seorang bupati yang berhubungan dengan banyak politisi lokal karena jabatan Anda. Di daerah Anda, saudara laki-laki Anda mencalonkan diri sebagai kandidat politik. Dia meminta bantuan Anda untuk menghubungkannya dengan politisi lokal lainnya melalui jaringan Anda, yang menurutnya dapat membantunya dalam kampanye pemilihannya. Dari skala 1 sampai 5, seberapa besar kemungkinan Anda akan membantunya?", widget = widgets.RadioSelect, choices = [[1, "Pasti tidak akan membantu saudara Anda dengan permintaannya"], [2, "Mungkin tidak akan membantu saudara Anda dengan permintaannya"], [3, "Tidak lebih/kurang mungkin membantu saudara Anda dengan permintaannya"], [4, "Mungkin akan membantu saudara Anda dengan permintaannya"], [5, "Pasti akan membantu saudara Anda dengan permintaannya"]]) vign_5 = models.IntegerField(label = "Anda adalah manajer distrik di kantor lokal. Baru-baru ini, Anda mendengar desas-desus bahwa salah satu bawahan Anda, John, secara pribadi mengungkapkan kurangnya kepercayaan pada kepemimpinan Anda kepada seorang kolega dan tidak menyukai Anda secara pribadi. Dia juga ingin dipromosikan keluar dari departemen Anda. Hari ini, sebuah proyek ditugaskan ke departemen Anda yang membutuhkan pemimpin tim. Anda tahu bahwa John adalah pilihan terbaik untuk pemimpin tim, tetapi memberinya peran ini akan meningkatkan pengaruhnya di kantor dan peluang untuk promosinya. Pada skala 1 sampai 5, seberapa besar kemungkinan Anda menugaskan John sebagai pemimpin tim?", widget = widgets.RadioSelect, choices = [[1, "Pasti tidak akan menugaskannya sebagai pemimpin tim"], [2, "Mungkin tidak akan menugaskannya sebagai pemimpin tim"], [3, "Tidak lebih atau kurang mungkin menugaskan dia sebagai pemimpin tim"], [4, "Mungkin akan menugaskan dia sebagai pemimpin tim"], [5, "Pasti akan menugaskan dia sebagai pemimpin tim"]]) attn_check1 = models.IntegerField( label = "Comprehension Question:", widget = widgets.RadioSelectHorizontal, choices = [ [1, "50,000 IDR"], [2, "100,000 IDR"], [3, "150,000 IDR"], [4, "200,000 IDR"], [5, "250,000 IDR"], ]) #merit_attn1 = models.IntegerField( # label = "Berapa banyak pertanyaan yang akan anda jawab?", # widget = widgets.RadioSelectHorizontal, # choices = [ # [1, "15 Pertanyaan"], # [2, "12 Pertanyaan"], # [3, "10 Pertanyaan"], # [4, "8 Pertanyaan"], # [5, "5 Pertanyaan"], # ]) #patronage_attn1 = models.IntegerField( # label = "Apakah atasan dapat memilih dirinya sendiri untuk menjabat sebagai pejabat publik?", # widget = widgets.RadioSelectHorizontal, # choices = [ # [1, "Ya"], # [2, "Tidak"] # ]) #random_attn1 = models.IntegerField( # label = "Berapa banyak pejabat publik yang akan ada?", # widget = widgets.RadioSelectHorizontal, # choices = [ # [1, "1"], # [2, "2"] # ]) overall_attn2 = models.IntegerField( label = "Berapa banyak pertanyaan yang akan dijawab oleh pejabat publik?", widget = widgets.RadioSelectHorizontal, choices = [ [1, "15 Pertanyaan"], [2, "12 Pertanyaan"], [3, "10 Pertanyaan"], [4, "8 Pertanyaan"], [5, "5 Pertanyaan"], ]) overall_attn4 = models.IntegerField( label = "Siapa yang memutuskan berapa banyak uang yang akan didapatkan oleh para pemain lain?", widget = widgets.RadioSelectHorizontal, choices = [ [1, "Pejabat Publik"], [2, "Peserta Lainnya"] ]) overall_attn5 = models.IntegerField( label = "Benar atau salah: Anda harus mengisi kuesioner untuk menerima pembayaran", widget = widgets.RadioSelectHorizontal, choices = [ [1, "Benar"], [2, "Salah"] ]) #MERIT QUESTIONS score_merit = models.IntegerField() #3 is correct #merit1 = models.IntegerField( # label = "Menteri-menteri negara adalah pembantu presiden. Hal tersebut diatur dalam UUD 1945, yaitu ...", # widget = widgets.RadioSelectHorizontal, # choices=[ # [1, "Pasal 18"], # [2, "Pasal 19"], # [3, "Pasal 17"], # [4, "Pasal 16"], # [5, "Pasal 12"]]) #2 is correct merit2 = models.IntegerField( label = "Mahkamah Agung mempunyai hak untuk menguji terhadap peraturan perundang- undangan yang berlaku, kecuali ...", widget = widgets.RadioSelectHorizontal, choices=[ [1, "Peraturan Pemerintah"], [2, "Keputusan Presiden"], [3, "Keputusan Menteri"], [4, "Peraturan Daerah"], [5, "Undang-undang produk DPR"]]) #4 is correct #merit3 = models.IntegerField( # label = "Yang bukan merupakan dampak/akibat dari Dekrit Presiden 5 Juli 1959 adalah...", # widget = widgets.RadioSelectHorizontal, # choices=[ # [1, "Konstituante dibubarkan"], # [2, "UUDS tidak berlaku"], # [3, "Kembali ke UUD 1945"], # [4, "Dibentuk DPRS"], # [5, "Dibentuk DPAS"]]) #3 is correct merit4 = models.IntegerField( label = "Karena berhasil mengalahkan Portugis, Fatahillah mengganti nama Sunda Kelapa menjadi ...", widget = widgets.RadioSelectHorizontal, choices=[ [1, "Batavia"], [2, "Jakarta"], [3, "Jayakarta"], [4, "Betawi"], [5, "Jawa Barat"]]) #2 is correct #merit5 = models.IntegerField( # label = "Konferensi Meja Bundar diselenggarakan di kota …", # widget = widgets.RadioSelectHorizontal, # choices=[ # [1, "Amsterdam"], # [2, "Den Haag"], # [3, "Belgia"], # [4, "Kolombo"], # [5, "New York"]]) #5 is correct merit6 = models.IntegerField( label = "Nasionalisme atau semangat kebangsaan merupakan cerminan Pancasila sila yang..", widget = widgets.RadioSelectHorizontal, choices=[ [1, "Pertama"], [2, "Kedua"], [3, "Kelima"], [4, "Keempat"], [5, "Ketiga"]]) #1 is correct #merit7 = models.IntegerField( # label = "Siapakah nama jenderal VOC (Vereenigde Oost Indische Compagnie) yang pertama?", # widget = widgets.RadioSelectHorizontal, # choices=[ # [1, "Pieter Both"], # [2, "Cornellius de Houtman"], # [3, "Van Den Bosch"], # [4, "Herman Willem Daendels"], # [5, "Jan Pieterszoon Coen"]]) #3 is correct merit8 = models.IntegerField( label = "Pada seleksi CPNS, sebanyak 200 peserta mengikutinya. Jika diketahui terdapat 5/6 dari 120 peserta perempuan diterima departemen kehutanan dan sisanya diterima di departemen pertanian, serta 3⁄4 dari 80 peserta laki-laki diterima di departemen pertanian dan sisanya di departemen kehutanan, maka persentase siswa perempuan terhadap siswa laki-laki yang diterima di departemen kehutanan adalah ...", widget = widgets.RadioSelectHorizontal, choices=[ [1, "10%"], [2, "15%"], [3, "20%"], [4, "34%"], [5, "41%"]]) #2 is correct merit9 = models.IntegerField( label = "Wahana = ", widget = widgets.RadioSelectHorizontal, choices=[ [1, "tempat bermain "], [2, "sarana"], [3, "gurun"], [4, "sauna"], [5, "menarik"]]) #1 is correct #merit10 = models.IntegerField( # label = "Berapakah yang harus dikurangi dari penjumlahan 1⁄2 dan 1/3 agar diperoleh rata-rata 1/6?", # widget = widgets.RadioSelectHorizontal, # choices=[ # [1, "1/3"], # [2, "1/4"], # [3, "4/5"], # [4, "1/2"], # [5, "3/4"]]) post1 = models.IntegerField( label = "Proses pemilihan perwakilan kelompok sudah adil", widget = widgets.RadioSelectHorizontal, choices=[ [1, "Sangat Tidak Setuju"], [2, "Tidak Setuju"], [3, "Netral"], [4, "Setuju "], [5, "Sangat Setuju"], [6, "Memilih untuk tidak mengatakan"]]) post2 = models.IntegerField( label = "Perwakilan kelompok adalah orang yang paling tepat untuk peran tersebut", widget = widgets.RadioSelectHorizontal, choices=[ [1, "Sangat Tidak Setuju"], [2, "Tidak Setuju"], [3, "Netral"], [4, "Setuju "], [5, "Sangat Setuju"], [6, "Memilih untuk tidak mengatakan"]]) post3 = models.IntegerField( label = "Alokasi dana Rp200.000,00 itu adil", widget = widgets.RadioSelectHorizontal, choices=[ [1, "Sangat Tidak Setuju"], [2, "Tidak Setuju"], [3, "Netral"], [4, "Setuju "], [5, "Sangat Setuju"], [6, "Memilih untuk tidak mengatakan"]]) post4 = models.IntegerField( label = "Saya pantas mendapatkan jumlah uang tunai yang saya terima", widget = widgets.RadioSelectHorizontal, choices=[ [1, "Sangat Tidak Setuju"], [2, "Tidak Setuju"], [3, "Netral"], [4, "Setuju "], [5, "Sangat Setuju"], [6, "Memilih untuk tidak mengatakan"]]) post5 = models.IntegerField( label = "Orang tidak bisa dipercaya", widget = widgets.RadioSelectHorizontal, choices=[ [1, "Sangat Tidak Setuju"], [2, "Tidak Setuju"], [3, "Netral"], [4, "Setuju "], [5, "Sangat Setuju"], [6, "Memilih untuk tidak mengatakan"]]) post6_dictator = models.IntegerField( label = "Saya akan melakukan pekerjaan yang lebih baik dalam mengalokasikan uang (hanya berlaku untuk non-pejabat publik)", widget = widgets.RadioSelectHorizontal, choices=[ [1, "Sangat Tidak Setuju"], [2, "Tidak Setuju"], [3, "Netral"], [4, "Setuju "], [5, "Sangat Setuju"], [6, "Memilih untuk tidak mengatakan"]]) phone_number = models.LongStringField( label = "Terakhir, cantumkan nomor telepon Anda agar kami dapat memproses pembayaran Anda:", blank = False ) ewallet = models.IntegerField( label = "Pilih layanan e-wallet untuk mendepositkan kompensasi untuk partisipasi Anda", widget=widgets.RadioSelectHorizontal, choices=[ [1, "DANA (e-wallet)"], [2, "OVO"], [3, "GoPay"], [4, "Linkaja "], [5, "ShopeePay"]] ) #class SortitionPlayer(Player): # pass #class PatronagePlayer(Player): # patron = models.BooleanField() # is this player the patron # public_official = models.BooleanField() #is this player the public official #FUNCTIONS #This is for assigning the treatment condition of the group #def creating_session(subsession): # Old code # import itertools # treatments = itertools.cycle(["random", "merit", "patronage"]) # Logic of selecting a random remaining treatment # import random # treatments = ["random", "merit", "patronage"] # empty treatment list is not accounted for in logic below # remaining_treatments = list(range(len(treatments))) # integer array keeping track of remaining treatments that are unassigned # for group in subsession.get_groups(): # if not remaining_treatments: # Case when remaining_treatments list is empty -> meaning all treatments have been already been assigned once before # remaining_treatments = list(range(len(treatments))) # resetting the list # random_treatment_index = random.choice(remaining_treatments) # group.treatment = treatments[random_treatment_index] # print('set condition to', group.treatment) # remaining_treatments.remove(random_treatment_index) # PAGES #PRE EXPERIMENT PAGES # PAGES class ConsentPage(Page): form_model = "player" form_fields = ["is_age", "is_consent"] class GameEnd(Page): ### Display only to participants who pass all 2 mandatory conditions @staticmethod def is_displayed(player): return player.is_age == False or player.is_consent == False class SurveyPre(Page): form_model = "player" form_fields = ["age","gender", "education", "province", "religion", "ethnicity"] ### Store the variable gender for next use #def before_next_page(player, timeout_happened): # player.participant.gender = player.gender #class SurveyPre2(Page): # form_model = "player" # form_fields = ["bf1", "bf2", "bf3", "bf4", "bf5", "bf6", "bf7", "bf8", "bf9", "bf10", "bf11", "bf12", "bf13"] ### Store the variable gender for next use #def before_next_page(player, timeout_happened): # player.participant.gender = player.gender class InstructionsPatronage1(Page): timeout_second = 90 # form_model = "player" # form_fields = ["patronage_attn1"] @staticmethod def is_displayed(player): group = player.group return group.treatment == "patronage" # @staticmethod # def error_message(player: Player, values): # if values["patronage_attn1"] != 2: # return "Jawaban Anda salah. Silakan baca lagi pertanyaannya." class InstructionsAll2(Page): form_model = "player" form_fields = ["overall_attn2"] timeout_seconds = 90 @staticmethod def error_message(player: Player, values): if values["overall_attn2"] != 5: return "Jawaban Anda salah. Silakan baca lagi pertanyaannya." class InstructionsAll3(Page): form_model = "player" form_fields = ["attn_check1"] timeout_seconds = 90 @staticmethod def error_message(player: Player, values): if values["attn_check1"] != 3: return "Jawaban Anda salah. Silakan baca lagi pertanyaannya." class InstructionsAll4(Page): form_model = "player" form_fields = ["overall_attn5"] timeout_seconds = 90 @staticmethod def error_message(player: Player, values): if values["overall_attn5"] != 1: return "Jawaban Anda salah. Silakan baca lagi pertanyaannya." class SelectionPatronage(Page): form_model = 'group' timeout_seconds = 60 def get_form_fields(player: Player): group = player.group if player.id_in_group == 1: return ["patronage_chosen"] else: pass def is_displayed(player): group = player.group #return group.treatment == "patronage" and player.id_in_group == 1 return group.treatment == "patronage" def vars_for_template(player: Player): return dict(others=player.get_others_in_group()) def before_next_page(player, timeout_happened): import random group = player.group if timeout_happened and player.id_in_group == 1: group.patronage_chosen = random.randint(2,3) group.public_official = group.patronage_chosen class StartWait(WaitPage): title_text = "Mohon ditunggu..." body_text = "Kami sedang mencari peserta lain. Jangan tutup halaman ini..." group_by_arrival_time = True def after_all_players_arrive(group: Group): session = group.session treats = session.past_groups group_num = group.id_in_subsession group_num = group_num - 2 group.treatment = treats[group_num] class InstructionsIntroduction(Page): timeout_seconds = 90 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant player.age = participant.age player.gender = participant.gender player.education = participant.education player.province = participant.province player.religion = participant.religion player.ethnicity = participant.ethnicity class InstructionsMerit(Page): timeout_seconds = 90 # form_model = "player" # form_fields = ["merit_attn1"] @staticmethod def is_displayed(player): group = player.group return group.treatment == "merit" # @staticmethod # def error_message(player: Player, values): # if values["merit_attn1"] != 3: # return "Jawaban itu salah. Silakan baca instruksi dengan hati-hati." class SelectionMerit(Page): timeout_seconds = 180 def is_displayed(player): group = player.group return group.treatment == "merit" form_model = 'player' form_fields = ['merit2', 'merit4', 'merit6', 'merit8', 'merit9'] class MeritReveal(Page): timeout_seconds = 45 def is_displayed(player): group = player.group return group.treatment == "merit" class InstructionsRandom(Page): timeout_seconds = 90 # form_model = "player" # form_fields = ["random_attn1"] @staticmethod def is_displayed(player): group = player.group return group.treatment == "random" def before_next_page(player, timeout_happened): import random group = player.group group.public_official = random.randint(1, 3) # @staticmethod # def error_message(player: Player, values): # if values["random_attn1"] != 1: # return "Jawaban itu salah. Silakan baca instruksi dengan hati-hati." class SelectionRandom(Page): timeout_seconds = 60 pass class VignetteQuestions1(Page): timeout_seconds = 90 form_model = "player" form_fields = ['vign_1'] class VignetteQuestions2(Page): timeout_seconds = 90 form_model = "player" form_fields = ['vign_2'] class VignetteQuestions3(Page): timeout_seconds = 90 form_model = "player" form_fields = ['vign_3'] class VignetteQuestions4(Page): timeout_seconds = 90 form_model = "player" form_fields = ['vign_4'] class VignetteQuestions5(Page): timeout_seconds = 90 form_model = "player" form_fields = ['vign_5'] class ResultsWaitPage(WaitPage): #for the unselected title_text = "Mohon ditunggu..." body_text = "Kami sedang menunggu peserta lain. Jangan tutup halaman ini..." class DictatorKeep(Page): form_model = "group" def is_displayed(player): group = player.group return player.id_in_group == group.public_official def get_form_fields(player: Player): group = player.group patron_id = group.public_official if patron_id == 1: return ['dictator_payoff', 'payoff2', 'payoff3'] elif patron_id == 2: return ['dictator_payoff', 'payoff1', 'payoff3'] elif patron_id == 3: return ['dictator_payoff', 'payoff1', 'payoff2'] # def before_next_page(player): # group = player.group # group.remaining_amount = 500000 - player.dictator_payoff def vars_for_template(player: Player): group = player.group return dict(others = player.get_others_in_group()) # group = player.group # return dict(others=player.get_others_in_group() @staticmethod def error_message(player: Player, values): group = player.group public_official_id = group.public_official if public_official_id == 1 and values['dictator_payoff'] + values['payoff2'] + values['payoff3'] > 200000: return 'Tidak boleh melebihi Rp200.000' elif public_official_id == 1 and values['dictator_payoff'] + values['payoff2'] + values['payoff3'] < 100000: return 'Pastikan untuk mengalokasikan uang Rp200.000' elif public_official_id == 2 and values['dictator_payoff'] + values['payoff1'] + values['payoff3'] > 200000: return 'Tidak boleh melebihi Rp200.000' elif public_official_id == 2 and values['dictator_payoff'] + values['payoff1'] + values['payoff3'] < 100000: return 'Pastikan untuk mengalokasikan uang Rp200.000' elif public_official_id == 3 and values['dictator_payoff'] + values['payoff2'] + values['payoff1'] > 200000: return 'Tidak boleh melebihi Rp200.000' elif public_official_id == 3 and values['dictator_payoff'] + values['payoff2'] + values['payoff1'] < 100000: return 'Pastikan untuk mengalokasikan uang Rp200.000' def before_next_page(player, timeout_happened): group = player.group public_official_id = group.public_official if public_official_id == 1: group.payoff1 = group.dictator_payoff elif public_official_id == 2: group.payoff2 = group.dictator_payoff elif public_official_id == 3: group.payoff3 = group.dictator_payoff if timeout_happened: group.payoff1 = 66666 group.payoff2 = 66666 group.payoff3 = 66666 #class DictatorAllocate(Page): # form_model = "group" # @staticmethod # def get_form_fields(player: Player): # group = player.group # patron_id = group.public_official # if patron_id == 1: # return ['payoff2', 'payoff3'] # elif patron_id == 2: # return ['payoff1', 'payoff3'] # elif patron_id == 3: # return ['payoff1', 'payoff2'] #elif patron_id == 4: # return ['payoff1', 'payoff2', 'payoff3', 'payoff5'] #else: # return ['payoff1', 'payoff2', 'payoff3', 'payoff4'] # def is_displayed(player): # group = player.group # return player.id_in_group == group.public_official # def vars_for_template(player: Player): # group = player.group # return dict(others=player.get_others_in_group(), # remainder=200000 - group.dictator_payoff) # @staticmethod # def error_message(player: Player, values): # group = player.group # public_official_id = group.public_official # if public_official_id == 1 and values['payoff2'] + values['payoff3'] > 200000-group.dictator_payoff: # return 'The sums cannot exceed' + str(group.remaining_amount) # elif public_official_id == 2 and values['payoff1'] + values['payoff3'] > 200000-group.dictator_payoff: # return 'The sums cannot exceed' + str(group.remaining_amount) # elif public_official_id == 3 and values['payoff2'] + values['payoff1'] > 200000-group.dictator_payoff: # return 'The sums cannot exceed' + str(group.remaining_amount) #elif public_official_id == 4 and values['payoff2'] + values['payoff3'] > 200000-group.dictator_payoff: # return 'The sums cannot exceed' + str(group.remaining_amount) #elif public_official_id == 5 and values['payoff2'] + values['payoff3'] > 200000-group.dictator_payoff: # return 'The sums cannot exceed' + str(group.remaining_amount) #class ResultsWaitPage(WaitPage): # after_all_players_arrive = set_payoffs #class AllocateWaitPage(WaitPage): # def compute_remain(group): # group.remaining_amount = 200000 - group.dictator_payoff # public_official_id = group.public_official # if public_official_id == 1: # group.payoff1 = group.dictator_payoff # elif public_official_id == 2: # group.payoff2 = group.dictator_payoff # elif public_official_id == 3: # group.payoff3 = group.dictator_payoff #elif public_official_id == 4: # group.payoff4 = group.dictator_payoff #elif public_official_id == 5: # group.payoff5 = group.dictator_payoff # after_all_players_arrive = compute_remain class MeritScoreWaitPage(WaitPage): title_text = "Mohon ditunggu..." body_text = "Kami sedang menunggu peserta lain. Jangan tutup halaman ini..." def is_displayed(player): group = player.group return group.treatment == "merit" def compute_scores(group): players = group.get_players() for p in players: score = 0 #if p.merit1 == 3: # change the correct answers, of course... # score = score + 1 if p.merit2 == 2: score = score + 1 #if p.merit3 == 4: # score = score + 1 if p.merit4 == 3: score = score + 1 #if p.merit5 == 2: # score = score + 1 if p.merit6 == 5: score = score + 1 #if p.merit7 == 1: # score = score + 1 if p.merit8 == 3: score = score + 1 if p.merit9 == 2: score = score + 1 #if p.merit10 == 1: # score = score + 1 p.score_merit = score after_all_players_arrive = compute_scores class MeritScoreSortPage(WaitPage): title_text = "Mohon ditunggu..." body_text = "Kami sedang menunggu peserta lain. Jangan tutup halaman ini..." def is_displayed(player): group = player.group return group.treatment == "merit" def sort_players(group): import random players = group.get_players() scores = [p.score_merit for p in players] max_score = max(scores) group.top_score = max_score winner_ids = [] for p in players: if p.score_merit == max_score: winner_ids.append(p.id_in_group) winner_po = random.choice(winner_ids) group.public_official = winner_po after_all_players_arrive = sort_players class WaitForP1(WaitPage): title_text = "Mohon ditunggu..." body_text = "Kami sedang menunggu peserta lain. Jangan tutup halaman ini..." class Results(Page): def vars_for_template(player): group = player.group if player.id_in_group == 1: return dict( total_payout=group.payoff1 + 50000 ) if player.id_in_group == 2: return dict( total_payout=group.payoff2 + 50000 ) if player.id_in_group == 3: return dict( total_payout=group.payoff3 + 50000 ) #if player.id_in_group == 4: # return dict( # total_payout=group.payoff4 + 50000 # ) #if player.id_in_group == 5: # return dict( # total_payout=group.payoff5 + 50000 # ) class SurveyPost(Page): form_model = "player" def get_form_fields(player: Player): group = player.group po_id = group.public_official if po_id == player.id_in_group: return ["post1", "post2", "post3", "post4", "post5", "post6_dictator", "phone_number", "ewallet"] elif po_id != player.id_in_group: return ["post1", "post2", "post3", "post4", "post5", "phone_number", "ewallet"] # def error_message(player: Player, values): # if len(str(values["phone_number"])) < 10 or len(str(values["phone_number"])) > 13: # return "Please enter a valid mobile phone number (omit the country code)" class EndDictatorSurvey(Page): pass class EndNonDictatorSurvey(Page): pass class Debrief(Page): pass page_sequence = [StartWait, InstructionsIntroduction, InstructionsPatronage1, InstructionsMerit, InstructionsRandom, InstructionsAll2, InstructionsAll3, InstructionsAll4, WaitForP1, SelectionMerit, SelectionPatronage, MeritScoreWaitPage, MeritScoreSortPage, MeritReveal, WaitForP1, VignetteQuestions1, VignetteQuestions2, VignetteQuestions3, VignetteQuestions4, VignetteQuestions5, DictatorKeep, ResultsWaitPage, Results, SurveyPost, Debrief]