from otree.api import * doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'Survey_U' players_per_group = None num_rounds = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): # Q1 = models.IntegerField( # label= "1. 您是否修過賽局理論或是實驗經濟相關課程:", # choices=[ # [0, '是'],[1, '否'],], # widget=widgets.RadioSelect,) student_id = models.StringField(label="您的學號") id_number = models.StringField(label="您的身份證字號") address = models.StringField(label="您的戶籍地址 ( 鄰里也需要填,請確保每一字都與身分證上的地址完全一致 )", ) address_code = models.StringField(label="戶籍地址郵遞區號(3碼即可) ,若需查詢,填答表格下方網址為郵遞區號查詢網站。", ) gender = models.IntegerField( choices=[[0, '女'], [1, '男'], ], label="1. 您的性別", widget=widgets.RadioSelect, required=True ) age = models.IntegerField(label='2. 您的年齡是:', min=1, max=99, required=True) grade = models.IntegerField( choices=[['0', '大學部 1 年級'], ['1', '大學部 2 年級'], ['2', '大學部 3 年級'], ['3', '大學部 4 年級'], ['4', '大學部 5 年級以上'], ['5', '碩士班學生'], ['6', '博士班學生'], ], label='3. 您的系級', widget=widgets.RadioSelect, required=True ) major = models.IntegerField( choices=[[0, '否'], [1, '是'], ], label='4. 您是否修過經濟相關課程', widget=widgets.RadioSelect, required=True ) principle = models.BooleanField( choices=[['True', '是'], ['False', '否']], label='5. 您是否修過個體經濟學原理 ( 經濟學原理與實習上 )?', widget=widgets.RadioSelect, required=True ) # intermediate = models.BooleanField( # choices=[['True', '是'], ['False', '否']], # label='9. 您是否修過個體經濟學 ( 任何標題為此的課程皆算 )?', # widget=widgets.RadioSelect, # required=True # ) game = models.IntegerField( label= "6. 您是否修過賽局相關課程(如:賽局論或其他完整一學期皆在學習賽局的課程,包含線上課程)?", choices=[ [0, '否'],[1, '是'],], widget=widgets.RadioSelect, required=True ) theory = models.BooleanField( choices=[['True', '是'], ['False', '否']], label='7. 您是否修過個體經濟理論(碩博士班必修)?', widget=widgets.RadioSelect, required=True ) exp = models.IntegerField( label= "8. 您是否修過實驗經濟學相關課程(如:行為賽局論,包含線上課程)?", choices=[ [0, '否'],[1, '是'],], widget=widgets.RadioSelect, required=True ) Q9 = models.IntegerField( label='9. 在第一部份實驗中,當您是第一階段被選中的 4 人時,您採取什麼樣的選擇策略?', choices=[ [0, '固定選擇報酬為 12 的選項 '], [1, '固定選擇報酬為 9 的選項 '], [2, '固定選擇報酬為 2 的選項 '], [3, '固定在報酬為 12 的選項與報酬為 9 的選項之間隨機選擇 '], [4, '固定在報酬為 12 的選項與報酬為 2 的選項之間隨機選擇 '], [5, '固定在報酬為 9 的選項與報酬為 2 的選項之間隨機選擇 '], [6, '在報酬為 12、9、2 的三個選項之間隨機選擇'], [7, '其他'], ], widget=widgets.RadioSelect, ) Q9_1 = models.LongStringField( label='若選擇「其他」,請簡述您採取甚麼樣的選擇策略?', blank=True) #因為要能複選所以改用 Boolean 寫法 # A5_1 = models.BooleanField(blank=True) # A5_2 = models.BooleanField(blank=True) # A5_3 = models.BooleanField(blank=True) # A5_4 = models.BooleanField(blank=True) # A5_5 = models.BooleanField(blank=True) # A5_6 = models.BooleanField(blank=True) # A5_7 = models.BooleanField(blank=True) Q10 = models.IntegerField( label="10. 在第一部份實驗中,當您是第二階段剩餘的 8 人時,當您看到報酬為 12 的選項是唯一最多人選擇時,您採取什麼樣的選擇策略?", choices=[ [0, ' 選擇報酬為 12 的選項 '], [1, ' 選擇報酬為 9 的選項 '], [2, ' 選擇報酬為 2 的選項 '], ], widget=widgets.RadioSelect, ) # A6_1 = models.BooleanField(blank=False) # A6_2 = models.BooleanField(blank=False) # A6_3 = models.BooleanField(blank=False) # A6_4 = models.BooleanField(blank=False) # A6_5 = models.BooleanField(blank=False) # A6_6 = models.BooleanField(blank=False) # A6_7 = models.BooleanField(blank=False) # A6_8 = models.BooleanField(blank=False) # Q11 = models.IntegerField( label="11. 在第一部份實驗中,當您是第二階段剩餘的 8 人時,當您看到報酬為 12 的選項與報酬為 9 的選項並列最多人選擇時,您採取什麼樣的選擇策略?", choices=[ [0, ' 選擇報酬為 12 的選項 '], [1, ' 選擇報酬為 9 的選項 '], [2, ' 選擇報酬為 2 的選項 '],], widget=widgets.RadioSelect, ) Q12 = models.IntegerField( label="12. 在第一部份實驗中,當您是第二階段剩餘的 8 人時,當您看到報酬為 12 的選項與報酬為 2 的選項並列最多人選擇時,您採取什麼樣的選擇策略?", choices=[ [0, ' 選擇報酬為 12 的選項 '], [1, ' 選擇報酬為 9 的選項 '], [2, ' 選擇報酬為 2 的選項 '],], widget=widgets.RadioSelect, ) # A7_1 = models.BooleanField(blank=False) # A7_2 = models.BooleanField(blank=False) # A7_3 = models.BooleanField(blank=False) # A7_4 = models.BooleanField(blank=False) # A7_5 = models.BooleanField(blank=False) # A7_6 = models.BooleanField(blank=False) # A7_7 = models.BooleanField(blank=False) # A7_8 = models.BooleanField(blank=False) # A7_9 = models.BooleanField(blank=False) # A7_10 = models.BooleanField(blank=False) # A7_11 = models.BooleanField(blank=False) # A7_12 = models.BooleanField(blank=False) Q13 = models.IntegerField( label="13. 在第一部份實驗中,當您是第二階段剩餘的 8 人時,當您看到報酬為 12 的選項、報酬為 9 的選項、與報酬為 2 的選項並列最多人選擇時,您採取什麼樣的選擇策略?", choices=[ [0, ' 選擇報酬為 12 的選項 '], [1, ' 選擇報酬為 9 的選項 '], [2, ' 選擇報酬為 2 的選項 '],], widget=widgets.RadioSelect, ) Q14 = models.IntegerField( label="14. 在第二部份實驗中,您採取什麼樣的選擇策略?", choices=[ [0, ' 固定選擇報酬為 12 的選項 '], [1, ' 固定選擇報酬為 9 的選項 '], [2, ' 固定選擇報酬為 2 的選項 '], [3, ' 固定在報酬為 12 與報酬為 9 的選項之間隨機選擇 '], [4, ' 固定在報酬為 12 與報酬為 2 的選項之間隨機選擇 '], [5, ' 固定在報酬為 9 與報酬為 2 的選項之間隨機選擇 '], [6, ' 在報酬為 12、9、2 三個選項之間隨機選擇 '], [7, ' 其他 '], ], widget=widgets.RadioSelect, ) Q14_1 = models.LongStringField( label="若選擇「其他」,請簡述您會採取甚麼樣的選擇策略?", blank=True) # # A8_1 = models.BooleanField(blank=False) # A8_2 = models.BooleanField(blank=False) # A8_3 = models.BooleanField(blank=False) # A8_4 = models.BooleanField(blank=False) # A8_5 = models.BooleanField(blank=False) # A8_6 = models.BooleanField(blank=False) # A8_7 = models.BooleanField(blank=False) # A8_8 = models.BooleanField(blank=False) # A8_9 = models.BooleanField(blank=False) # A8_10 = models.BooleanField(blank=False) # A8_11 = models.BooleanField(blank=False) # exp = models.BooleanField( # choices=[['True', '是'], ['False', '否']], # label='10. 您是否修過實驗經濟學 ( 如行為賽局論 )?', # widget=widgets.RadioSelect, # required=True # ) # game = models.BooleanField( # choices=[['True', '是'], ['False', '否']], # label='4. 您是否修過賽局相關課程 ( 如:賽局論或其他完整一學期皆在學習賽局的課程 )?', # widget=widgets.RadioSelect, # required=True # ) # PAGES class Page1(Page): form_model = 'player' form_fields = ['gender', 'age', 'grade', 'major', 'principle', 'game', 'theory', 'exp', ] class Page2(Page): form_model = 'player' form_fields = ['Q9', 'Q9_1', 'Q10', 'Q11', 'Q12', 'Q13', 'Q14', 'Q14_1', ] class BasicInfo(Page): form_model = 'player' form_fields = ['student_id', 'id_number', 'address', 'address_code'] @staticmethod def error_message(player: Player, values): print('value is', values) if len(values['student_id']) != 9: return '學號長度不正確' elif not values['student_id'][0].isalpha(): return '學號第 1 碼應為英文字母' elif not values['student_id'][1:2].isnumeric(): return '學號格式不正確' elif not values['student_id'][4:8].isnumeric(): return '學號格式不正確' if len(values['id_number']) != 10: return '身份證字號長度不正確' elif not values['id_number'][0].isalpha(): return '身份證字號第 1 碼應為英文字母' elif not values['id_number'][1:9].isnumeric(): return '身份證字號格式不正確' if len(values['address_code']) != 3: return '戶籍地址郵遞區號長度不正確' class Bye(Page): pass page_sequence = [BasicInfo, Page1, Page2, Bye]