from otree.api import * doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'survey_t' 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,) name=models.StringField(label="1. 您的姓名 ? ( 請務必填寫正確 )") student_id = models.StringField(label="2. 您的學號 ? ( 學號第 1 碼應大寫 )") id_number= models.StringField(label="3. 您的身份證字號 ? ( 請務必填寫正確 )") address=models.StringField(label="4. 您的戶籍地址 ? ( 鄰里也需要填,請確保每一字都與身分證上的地址完全一致 )",) address_code=models.StringField(label="5. 您的戶籍地址郵遞區號 ? ( 3 碼即可 ,若需要可點選填答表格下方網址查詢郵遞區號 ) ",) gender = models.IntegerField( label= "1. 您的性別 ?", choices=[ [0, '男'],[1, '女'],], widget=widgets.RadioSelect,) age = models.IntegerField(label='2. 您的年齡 ?', min=17, max=99, required = True) major = models.IntegerField( choices=[['0', '是'], ['1', '否'],], label='3. 您是否是經濟系、農經系、或管理學院的學生 ?', widget=widgets.RadioSelect,) grade = models.IntegerField( choices=[['0', '大學部 1 年級'], ['1', '大學部 2 年級'],['2', '大學部 3 年級'], ['3', '大學部 4 年級'],['4', '大學部 5 年級以上'], ['5', '碩士班學生'],['6', '博士班學生'], ], label='4. 您的系級 ?', widget=widgets.RadioSelect,) Q1 = models.IntegerField( label= "5. 下列哪個選項,最符合您選擇回合決策思考過程 ?", choices=[ [0, '隨機選擇某一個方案'],[1, '固定選擇 X 方案 '],[2, '固定選擇 Y 方案 '],[3, '在 X 方案和 Y 方案之間策略性選擇'],], widget=widgets.RadioSelect,) Q2 = models.LongStringField( label= "6. 承上題,您為何做這樣的決策 ?") Q3 = models.IntegerField( label= "7. 在選擇回合,您是否有考慮到可能被選為小組長且小組長責任重大,因此更加謹慎做選擇 ?", choices=[ [0, '是'],[1, '否 '],], widget=widgets.RadioSelect,) Q4 = models.IntegerField( label= "8. 在選擇回合,您是否有被另外一組大組所做的決策或被選中的人數影響到自己的決策 ?", choices=[ [0, '是'],[1, '否 '],], widget=widgets.RadioSelect,) Q5 = models.IntegerField( label= "9. 在遊戲回合,您採用什麼樣的策略來極大化整組的報酬 ?", choices=[ [0, '記固定位置的數字 ( 比如第一排或最後一排 )'],[1, '記固定數字 ( 比如 1-4 或 5-8 )'],[2, '盡可能全部都記住 '],], widget=widgets.RadioSelect,) principle = models.BooleanField( choices=[['True', '是'], ['False', '否']], label='10. 您是否修過個體經濟學原理 ? ( 或其他同等級大一經濟學課程如 : 經濟學原理上 ) ', widget=widgets.RadioSelect, required = True ) intermediate = models.BooleanField( choices=[['True', '是'], ['False', '否']], label='11. 您是否修過個體經濟學 ? ( 或其他同等級大二經濟學課程如 : 個體經濟學甲 ) ', widget=widgets.RadioSelect, required = True ) theory = models.BooleanField( choices=[['True', '是'], ['False', '否']], label='12. 您是否修過個體經濟理論 ? ( 碩博士班必修 ) ', widget=widgets.RadioSelect, required = True ) exp = models.BooleanField( choices=[['True', '是'], ['False', '否']], label='13. 您是否修過實驗經濟學相關課程 ? ( 如 : 行為賽局論 ) ', widget=widgets.RadioSelect, required = True ) game = models.BooleanField( choices=[['True', '是'], ['False', '否']], label='14. 您是否修過賽局相關課程 ? ( 如 : 賽局論或其他完整一學期皆在學習賽局的課程 ) ', widget=widgets.RadioSelect, required = True ) # PAGES class Page1(Page): form_model = 'player' form_fields = ['gender','age','major','grade','Q1','Q2','Q3','Q4','Q5'] class Page2(Page): form_model = 'player' form_fields = ['principle', 'intermediate', 'theory','exp', 'game'] class BasicInfo(Page): form_model = 'player' form_fields = ['name','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'][0].isupper(): return '學號第 1 碼應大寫' elif not values['student_id'][1:2].isnumeric(): return '學號格式不正確' elif not values['student_id'][4:9].isnumeric(): return '學號格式不正確' if len(values['id_number']) != 10: return '身份證字號長度不正確' elif not values['id_number'][0].isupper(): return '身份證字號第 1 碼應大寫' elif not values['id_number'][0].isalpha(): return '身份證字號第 1 碼應為英文字母' elif not values['id_number'][1:10].isnumeric(): return '身份證字號格式不正確' if len(values['address_code']) != 3: return '戶籍地址郵遞區號長度不正確' class bye(Page): pass page_sequence = [BasicInfo,Page1,Page2,bye]