Exemple #1
0
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')
Exemple #2
0
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')
Exemple #3
0
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)
Exemple #7
0
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
    })
Exemple #8
0
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
    })
Exemple #9
0
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)