Exemple #1
0
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)
Exemple #2
0
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)
Exemple #3
0
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)
Exemple #4
0
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)