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()
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()
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()
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()