def append_contest_api(id_): course = Course.get_by_id(id_) if course is None: raise NotFound('Course not found') form = AppendContestForm().validate_for_api().data_ course.append_contest(**form) raise Success('Contest appended')
def modify_course_api(id_): course = Course.get_by_id(id_) if course is None: raise NotFound('Course not found') form = ModifyCourseForm().validate_for_api().data_ course.modify(**form) raise Success('Course has been modified')
def course_detail_api(id_): course = Course.get_by_id(id_) if course is None: raise NotFound('Course not found') return jsonify({ 'code': 0, 'data': course })
def submit_crawl_course_info_task(course_id=None): from tasks import crawl_course_info_task if course_id is None: course_list = Course.search(page_size=-1)['data'] else: course_list = [Course.get_by_id(course_id)] for course in course_list: if course.camp_oj.status == 1: crawl_course_info_task.delay(course.id)
def rating(self): from app.models.camp_models.course import Course from app.models.camp_models.user_contest import UserContest contests = Course.get_by_id(self.course_id).contests res = 0 user_contests = UserContest.query.filter( UserContest.username == self.username, UserContest.contest_id.in_([i.id for i in contests])).all() for user_contest in user_contests: res += user_contest.rating res = round(res, 3) return res
def crawl_course_info(course_id): users = User.search(status=1, page_size=-1)['data'] course = Course.get_by_id(course_id) spider_info = None if course.spider_username or course.spider_password: spider_info = { 'username': course.spider_username, 'password': course.spider_password } spider = globals()[course.camp_oj.name.title() + 'CampSpider'](spider_info) for contest in course.contests: res = spider.get_contest_meta(contest.contest_cid) if not res['success']: continue meta_info = res['data'] max_pass = meta_info['max_pass'] participants = meta_info['participants'] contest.modify(max_pass=max_pass, participants=participants) for problem in meta_info['problems']: CampProblem.get_by_contest_id_and_problem_pid(contest.id, problem) for user in users: oj_username = CourseOJUsername.get_by_username_and_course_id( user.username, course_id) if oj_username is None: continue res = spider.get_user_info(contest.contest_cid, oj_username) if not res['success']: continue oj_username.modify(last_success_time=datetime.datetime.now()) user_info = res['data'] for problem_pid in user_info['pass_list']: problem = CampProblem.get_by_contest_id_and_problem_pid( contest.id, problem_pid) acp = CampAcceptProblem.get_by_username_and_problem_id( user.username, problem.id) if acp is None: CampAcceptProblem.create(username=user.username, contest_id=contest.id, problem_id=problem.id) ac_cnt = len(user_info['pass_list']) rank = user_info['rank'] rating = 200 * ( (participants - rank + 1) / participants) * (ac_cnt / max_pass) rating = round(rating, 3) user_contest = UserContest.get_by_username_and_contest_id( user.username, contest.id) if user_contest is None: user_contest = UserContest.create(username=user.username, contest_id=contest.id) user_contest.modify(ac_cnt=len(user_info['pass_list']), rank=user_info['rank'], rating=rating)
def get_course_username_api(id_): course = Course.get_by_id(id_) if course is None: raise NotFound('Course not found') oj = CampOJ.get_by_id(course.camp_oj_id) if current_user.permission != 1: data = CourseOJUsername.get_by_username_and_course_id( current_user.username, id_ ) if data is None: data = [{ 'username': current_user.username, 'nickname': current_user.nickname, 'oj': oj, 'oj_username': None, 'last_success_time': None }] else: data = [data] else: data = [] for user in User.search(status=1, page_size=-1)['data']: oj_username = None last_success_time = None res = CourseOJUsername.get_by_username_and_course_id( user.username, id_ ) if res: oj_username = res.oj_username last_success_time = res.last_success_time data.append({ 'username': user.username, 'nickname': user.nickname, 'oj': oj, 'oj_username': oj_username, 'last_success_time': last_success_time }) return jsonify({ 'code': 0, 'data': data })
def get_course_rating_api(id_): course = Course.get_by_id(id_) if course is None: raise NotFound('Course not found') data = db.session. \ query(CourseOJUsername.oj_username, func.sum(UserContest.rating)). \ filter(CourseOJUsername.course_id == id_, CourseOJUsername.username == UserContest.username). \ filter(CourseContest.course_id == id_, UserContest.contest_id == CourseContest.id). \ group_by(CourseOJUsername.oj_username).all() temp = {} for item in data: temp.setdefault(item[0], { 'rating': item[1], 'members': [] }) data = db.session.query(CourseOJUsername.oj_username, CourseOJUsername.username, User.nickname). \ filter(CourseOJUsername.username == User.username). \ filter(CourseOJUsername.course_id == id_).all() for item in data: temp.setdefault(item[0], { 'rating': 0, 'members': [] }) temp[item[0]]['members'].append({ 'username': item[1], 'nickname': item[2] }) for item in temp.keys(): rating = temp[item]['rating'] / len(temp[item]['members']) temp[item]['rating'] = round(rating, 3) res = [] for name, info in temp.items(): res.append({ 'team_name': name if len(info['members']) > 1 else info['members'][0]['nickname'], 'members': info['members'], 'rating': info['rating'] }) return jsonify({ 'code': 0, 'data': res })
def modify_course_username_api(id_): course = Course.get_by_id(id_) if course is None: raise NotFound('Course not found') form = ModifyCourseUsernameForm().validate_for_api().data_ if current_user.username != form['username'] and current_user.permission != 1: raise AuthFailed() course_oj_username = CourseOJUsername.get_by_username_and_course_id( form['username'], id_ ) if form['oj_username'] == '' or form['oj_username'] is None: if course_oj_username is not None: course_oj_username.delete() elif course_oj_username is None: CourseOJUsername.create( oj_id=course.camp_oj_id, course_id=course.id, **form ) else: course_oj_username.modify(oj_username=form['oj_username']) raise Success('Course username modified')
def course(self): return Course.get_by_id(self.course_id)