Пример #1
0
def get_courses_list():
    # 返回图和返回文章的接口分离
    # 因为文章还要翻页 查询文章直接在mongodb中查询
    # 因为不需要做查询相关度排序, 提供排序为, 年份, 默认(字典序), 被引量

    try:
        course_params = CourseListParams(request.args)
        # validate params passed in
        if not course_params.validate():
            raise ValidationError
        # return courses
        node_id = course_params.node_id.data
        page = course_params.page.data
        page_size = course_params.page_size.data
        # order = course_params.order.data

        node = DB['nodes'].find_one({'nid': node_id})
        if not node:
            raise ValueError('no such node id exists')
        extents = node['extent']
        courses = DB['courses'].find({'cid': {"$in": extents}}) \
                                .limit(page_size) \
                                .skip((page-1)*page_size)
        # if order == 'time':
        #     courses = DB['courses'].find({'cid': {"$in": extents}}) \
        #                         .sort([('date',-1)]).limit(page_size) \
        #                         .skip((page-1)*page_size)
        # elif order == 'citation':
        #     courses = DB['courses'].find({'cid': {"$in": extents}}) \
        #                         .sort([('citation',-1)]).limit(page_size) \
        #                         .skip((page-1)*page_size)
        courses = [after_pop(d, '_id') for d in courses]
        response = Response(ResponseType.SUCCESS)
        response.update_attr('courses', courses)
        response.update_attr('page', page)
        response.update_attr('pageSize', page_size)
        response.update_attr('totalSize', len(extents))
    except ValidationError as ve:
        print(ve)
        response = Response(ResponseType.PARAMETERS_ERR)
    except ValueError as ve:
        response = Response.get_custom_response(ResponseType.FAILURE, str(ve))
    except Exception as e:
        print(e)
        response = Response(ResponseType.INTERNAL_ERR)

    return response.get_json()
Пример #2
0
def user_rating():
    """
    打分
    /api/user-rating
    """

    try:
        token = request.headers.get('Authorization', '')

        # by convention jwt token is like "Bearer <token string>"
        uname = verify_auth_token(token[7:])
        if not uname:
            raise ValueError('Invalid Token')

        user = DB['users'].find_one({'username': uname})
        user_rates = user.get('rates', [])
        user_eval = user.get('evaluation', [])

        if not user_rates:
            user_rates = []
        if not user_eval:
            user_eval = []
        response = Response(ResponseType.SUCCESS)
        response.update_attr(
            'rates', {str(rate['cid']): rate['rate']
                      for rate in user_rates})
        response.update_attr(
            'evaluation',
            {str(rate['cid']): rate['rate']
             for rate in user_eval})

    except ValueError as ve:
        response = Response.get_custom_response(ResponseType.FAILURE, str(ve))
    except Exception as e:
        print(e)
        response = Response(ResponseType.INTERNAL_ERR)

    return response.get_json()
Пример #3
0
def rating():
    """
    打分
    /api/rating?course_id=<int>&rate=<int>&is_evaluation=<bool>
    """

    try:
        rate_params = RatingParams(request.args)
        if not rate_params.validate():
            raise ValidationError
        rate = rate_params.rate.data
        course_id = rate_params.course_id.data
        is_evalution = rate_params.is_evaluation.data
        token = request.headers.get('Authorization', '')

        # by convention jwt token is like "Bearer <token string>"
        uname = verify_auth_token(token[7:])
        if not uname:
            raise ValueError('Invalid Token')

        if is_evalution:
            # check whether this rate exists
            if not DB['users'].find_one({
                    'username': uname,
                    'evaluation.cid': course_id
            }):
                DB['users'].update({'username': uname}, {
                    '$push': {
                        'evaluation': {
                            'cid': course_id,
                            'rate': rate
                        }
                    }
                })
            else:
                DB['users'].update(
                    {
                        'username': uname,
                        'evaluation.cid': course_id
                    }, {'$set': {
                        'evaluation.$.rate': rate
                    }})
        else:
            # check whether this rate exists
            if not DB['users'].find_one({
                    'username': uname,
                    'rates.cid': course_id
            }):
                DB['users'].update(
                    {'username': uname},
                    {'$push': {
                        'rates': {
                            'cid': course_id,
                            'rate': rate
                        }
                    }})
            else:
                DB['users'].update({
                    'username': uname,
                    'rates.cid': course_id
                }, {'$set': {
                    'rates.$.rate': rate
                }})

        response = Response(ResponseType.SUCCESS)

    except ValidationError:
        response = Response(ResponseType.VALIDATION_ERR)
    except ValueError as ve:
        response = Response.get_custom_response(ResponseType.FAILURE, str(ve))
    except Exception as e:
        print(e)
        response = Response(ResponseType.INTERNAL_ERR)

    return response.get_json()
Пример #4
0
def recommend_courses():
    """
    recommend courses
    /api/recommend?page=<int>&page_size=<int>
    """

    try:
        recommend_params = RecommendCoursesParams(request.args)
        if not recommend_params.validate():
            raise ValidationError

        page = recommend_params.page.data
        page_size = recommend_params.page_size.data
        mode = recommend_params.mode.data
        token = request.headers.get('Authorization', '')

        # auth validation
        uname = verify_auth_token(token[7:])
        if not uname:
            raise ValueError('Invalid Token')

        # find user
        user = DB['users'].find_one({'username': uname})
        if not user:
            raise ValueError('User Not Found')

        # create user model
        user_rates = user.get('rates', None)
        if not user_rates:
            return Response.get_custom_response(
                ResponseType.FAILURE, "unable to recommend").get_json()

        course_vectors = COURSE_VECTORS_DICT[str(mode)]
        user_model = recommend(user_rates, course_vectors)

        # store user model
        DB['users'].update({'username': uname},
                           {'$set': {
                               'usermodel': user_model
                           }})

        user_courses = [x['cid'] for x in user_model]

        # change the order the full rating items
        user_rates_dict = {x['cid']: x['rate'] for x in user_rates}
        rate5 = [c for c in user_courses if user_rates_dict.get(c, 0) == 5]
        rate4 = [c for c in user_courses if user_rates_dict.get(c, 0) == 4]
        other_rates = [
            c for c in user_courses if user_rates_dict.get(c, 0) < 4
        ]
        user_courses = rate5 + rate4 + other_rates

        courses = [
            after_pop(DB['courses'].find_one({'cid': a}), '_id')
            for a in user_courses[(page - 1) * page_size:page * page_size]
        ]

        response = Response(ResponseType.SUCCESS)
        response.update_attr('courses', courses)
        response.update_attr('page', page)
        response.update_attr('pageSize', page_size)
        response.update_attr('totalSize', len(user_courses))

    except ValidationError:
        response = Response(ResponseType.VALIDATION_ERR)
    except ValueError as ve:
        response = Response.get_custom_response(ResponseType.FAILURE, str(ve))
    except Exception as e:
        print('unknown err', e)
        response = Response(ResponseType.INTERNAL_ERR)
    return response.get_json()