def get_level_others_items(session, q_id, est_theta, shadow_bank, ans, db): """ 选出其他层的题目 :param session: :param q_id: :param ans: :param est_theta:估计特质 :param shadow_bank: 影子题库class :return:问题对象 """ # 当前测验所属层数(阶段) level = session['%s_stage' % q_id] # 该层已作答试题列表 # 修改为适合json field # 不该出现于待抽提的题目ID列表 a_level = int(level) not_in_index_list = get_has_answered_que_id_list(ans, a_level=a_level) # 抽出来的题 que = yield shadow_bank(q_id, a_level, est_theta, not_in_index_list, db).get_que() # 保存试题参数到session session['%s_a' % q_id].append(que.slop) session['%s_b' % q_id].append(get_threshold(que)) # 返回试题 raise gen.Return(que)
def get_level_one_item(ans, session, q, level_one_count, db): """ 选出第一层的题目 :param ans: :param session: :param q: 问卷对象 :param level_one_count: 第一层待抽的题目数量 :return: 返回第一次抽取的题目对象 """ que = None # 测验ID q_id = q.id # 生成答题者已经做过的题目的id列表 can_not_in_choices_index = get_has_answered_que_id_list(ans, 1) # 第一层题库的题量 _count = q.level_one_count - len(can_not_in_choices_index) # 没题目直接封权限 if _count < level_one_count: raise HTTPError(403) # 题量/待抽题量,确定每道试题抽取题库的范围 _slice = _count / level_one_count # json field # 选出来的题目放入这个字典 selected_que_dict = {} # 选出来的题名顺序放入这个字典 order_que = {} # 第一阶段的试题存入session的列表 next_item_list = [] choice_question_index_list = [] for i in range(level_one_count): # 上界 pre = _slice * i + 1 # 下界 nxt = _slice * (i + 1) try: choice_question_index = random.choice(xrange(pre, nxt)) except IndexError: choice_question_index = i + 1 choice_question_index_list.append(choice_question_index) if not can_not_in_choices_index: cursor = yield db.execute( """ select * from (select *, row_number() over(order by threshold) row_num from question where questionnaire_id=%s and a_level=%s ) as temp where row_num in %s """, (q.id, 1, tuple(choice_question_index_list))) else: cursor = yield db.execute( """ select * from (select *, row_number() over(order by threshold) row_num from question where questionnaire_id=%s and a_level=%s and not (id in %s) ) as temp where row_num in %s """, (q.id, 1, tuple(can_not_in_choices_index), tuple(choice_question_index_list))) use_question_list = cursor.fetchall() for i, use_question in enumerate(use_question_list): # 保存试题参数到session session['%s_a' % q_id].append(use_question.slop) session['%s_b' % q_id].append(get_threshold(use_question)) # oder_que的key index_key = i + 1 order_que[index_key] = use_question.id selected_que_dict[use_question.id] = { 'a_level': 1, 'slop': use_question.slop, 'threshold': get_threshold(use_question) } if i == 0: que = use_question else: next_item_list.append(use_question) ans.score_answer.update(selected_que_dict) ans.order_answer.update(order_que) # session存入下面题目 session['%s_next_item' % q.id] = next_item_list raise gen.Return(que)
def get_level_one_item(ans, session, q, level_one_count, db): """ 选出第一层的题目 :param ans: :param session: :param q: 问卷对象 :param level_one_count: 第一层待抽的题目数量 :return: 返回第一次抽取的题目对象 """ que = None # 测验ID q_id = q.id # 生成答题者已经做过的题目的id列表 can_not_in_choices_index = get_has_answered_que_id_list(ans, 1) # 第一层题库的题量 _count = q.level_one_count - len(can_not_in_choices_index) # 没题目直接封权限 if _count < level_one_count: raise HTTPError(403) # 题量/待抽题量,确定每道试题抽取题库的范围 _slice = _count / level_one_count # json field # 选出来的题目放入这个字典 selected_que_dict = {} # 选出来的题名顺序放入这个字典 order_que = {} # 第一阶段的试题存入session的列表 next_item_list = [] choice_question_index_list = [] for i in range(level_one_count): # 上界 pre = _slice * i + 1 # 下界 nxt = _slice * (i + 1) try: choice_question_index = random.choice(xrange(pre, nxt)) except IndexError: choice_question_index = i + 1 choice_question_index_list.append(choice_question_index) if not can_not_in_choices_index: cursor = yield db.execute(""" select * from (select *, row_number() over(order by threshold) row_num from question where questionnaire_id=%s and a_level=%s ) as temp where row_num in %s """, (q.id, 1, tuple(choice_question_index_list))) else: cursor = yield db.execute(""" select * from (select *, row_number() over(order by threshold) row_num from question where questionnaire_id=%s and a_level=%s and not (id in %s) ) as temp where row_num in %s """, (q.id, 1, tuple(can_not_in_choices_index), tuple(choice_question_index_list))) use_question_list = cursor.fetchall() for i, use_question in enumerate(use_question_list): # 保存试题参数到session session['%s_a' % q_id].append(use_question.slop) session['%s_b' % q_id].append(get_threshold(use_question)) # oder_que的key index_key = i + 1 order_que[index_key] = use_question.id selected_que_dict[use_question.id] = {'a_level': 1, 'slop': use_question.slop, 'threshold': get_threshold(use_question)} if i == 0: que = use_question else: next_item_list.append(use_question) ans.score_answer.update(selected_que_dict) ans.order_answer.update(order_que) # session存入下面题目 session['%s_next_item' % q.id] = next_item_list raise gen.Return(que)