Example #1
0
    def post(self):
        data = request.get_json()
        if data and USERNAME in data:
            user = UserModel.get_by_username(data[USERNAME])
            oj_data = OjModel.get_by_username(data[USERNAME])
            if not user:
                return {MESSAGE: "User Not Found"}, 404
            else:
                return {
                           FIRST_NAME: user.first_name,
                           LAST_NAME: user.last_name,
                           USERNAME: user.username,
                           EMAIL: user.email,
                           OJ_INFO: oj_data.oj_info if oj_data else {},
                           "delete_access": user.is_admin
                       }, 200

        else:
            user_list = []
            for user in UserModel.get_all_users():
                oj_data = OjModel.get_by_username(user[USERNAME])
                user_list.append(
                    {
                        FIRST_NAME: user[FIRST_NAME],
                        LAST_NAME: user[LAST_NAME],
                        USERNAME: user[USERNAME],
                        EMAIL: user[EMAIL],
                        OJ_INFO: oj_data.oj_info if oj_data else {}
                    }
                )
            return {
                       "user_list": user_list,
                       "delete_access": UserModel.get_by_username(get_jwt_identity()).is_admin
                   }, 200
def get_todos(username, classroom_name):
    user = UserModel.get_by_username(username)
    oj_info = OjModel.get_by_username(username)
    if not user or not oj_info:
        return None
    oj_info = oj_info.oj_info
    todo_list = []
    if VJUDGE not in oj_info or USERNAME not in oj_info[
            VJUDGE] or not oj_info[VJUDGE][USERNAME]:
        todo_list.append("Please add your Vjudge username in your profile")
    if CODEFORCES not in oj_info or USERNAME not in oj_info[
            CODEFORCES] or not oj_info[CODEFORCES][USERNAME]:
        todo_list.append("Please add your Codeforces username in your profile")
    if ATCODER not in oj_info or USERNAME not in oj_info[
            ATCODER] or not oj_info[ATCODER][USERNAME]:
        todo_list.append("Please add your Atcoder username in your profile")

    timestamp = datetime.now().timestamp() * 1000

    all_todos = TodosModel.get_todos_by_group(group="all")
    for todo in all_todos:
        if timestamp <= todo["expires_on"]:
            todo_list.append(todo["todo"])

    classroom_todos = TodosModel.get_todos_by_group(group=classroom_name)
    for todo in classroom_todos:
        if timestamp <= todo["expires_on"]:
            todo_list.append(todo["todo"])

    return todo_list
Example #3
0
    def put(self):
        user = UserModel.get_by_username(get_jwt_identity())
        data = request.get_json()
        if not user or not user.is_admin:
            return {MESSAGE: "admin privilege required"}, 400

        if not data or CLASSROOM_NAME not in data:
            return {MESSAGE: "invalid data"}, 400

        classroom = ClassroomModel.get_by_classroom_name(data[CLASSROOM_NAME])
        if not classroom:
            return {MESSAGE: "classroom not found"}, 404

        vjudge_username = {}
        for username in data["user_list"]:
            user = UserModel.get_by_username(username)
            if not user:
                return {MESSAGE: "user not found"}, 404
            try:
                vjudge_handle = OjModel.get_by_username(
                    username).oj_info["VJudge"]["username"]
            except:
                continue
            vjudge_username[username] = vjudge_handle

        data["user_details"] = {"vjudge_username": vjudge_username}
        classroom.update_to_mongo(data)
        classroom = ClassroomModel.get_by_classroom_name(data[CLASSROOM_NAME])
        threading.Thread(target=update_students, args=[classroom]).start()
        return {MESSAGE: "data updated"}, 200
Example #4
0
    def put(self):
        data = request.get_json()
        identity = get_jwt_identity()
        user = UserModel.get_by_username(identity)

        if not user:
            return {MESSAGE: "user not found"}, 400

        if EMAIL in data:
            email_user = UserModel.get_by_email(data[EMAIL])
            if EMAIL in data and email_user and email_user != user:
                return {MESSAGE: "email already exists"}, 400
            if not WhitelistEmailsModel.check_email(data[EMAIL]):
                return {MESSAGE: "email is not valid"}, 400

        if PASSWORD in data:
            if "old_password" not in data:
                return {MESSAGE: "current password is required to set new password"}, 400
            if not UserModel.login_valid_username(user.username, data["old_password"]):
                return {MESSAGE: "wrong current password"}, 400
            del data["old_password"]

        user.update_to_mongo(data)

        oj_info = OjModel.get_by_username(identity)
        if oj_info:
            oj_info.update_to_mongo(data)

        threading.Thread(target=update_user_with_username, args=[user.username]).start()
        return {MESSAGE: "User data is being updated"}, 200
Example #5
0
    def post(self):
        data = request.get_json()
        user = UserModel.get_by_username(get_jwt_identity())
        if not user.is_admin:
            return {MESSAGE: "admin privilege required"}, 400
        if not data or CLASSROOM_NAME not in data:
            return {MESSAGE: "invalid data"}, 400
        if ClassroomModel.get_by_classroom_name(data[CLASSROOM_NAME]):
            return {MESSAGE: "A classroom with that name already exists"}, 400

        vjudge_username = {}
        for username in data["user_list"]:
            user = UserModel.get_by_username(username)
            if not user:
                return {MESSAGE: "user not found"}, 404
            try:
                vjudge_handle = OjModel.get_by_username(
                    username).oj_info["VJudge"]["username"]
            except:
                continue
            vjudge_username[username] = vjudge_handle

        data["user_details"] = {"vjudge_username": vjudge_username}
        classroom = ClassroomModel(**data)
        classroom.save_to_mongo()
        threading.Thread(target=update_students, args=[classroom]).start()
        return {MESSAGE: "Classroom created successfully."}, 201
Example #6
0
    def post(self):
        data = request.get_json()
        if UserModel.get_by_username(data[USERNAME]):
            return {MESSAGE: "A user with that username already exists"}, 400

        if UserModel.get_by_email(data[EMAIL]):
            return {MESSAGE: "A user with that email already exists"}, 400

        if not WhitelistEmailsModel.check_email(data[EMAIL]):
            return {MESSAGE: "email is not valid"}, 400

        data["password"] = UserModel.encrypt_password(data["password"])
        user = UserModel(**data)
        user.save_to_mongo()

        oj_data = OjModel(data[USERNAME])
        oj_data.save_to_mongo()
        # app.logger.info("User created successfully " + user.username + " " + user.email)
        return {MESSAGE: "User created successfully."}, 201
Example #7
0
 def delete(self):
     user = UserModel.get_by_username(get_jwt_identity())
     if not user.is_admin:
         return {MESSAGE: "admin privilege required"}, 400
     data = request.get_json()
     user = UserModel.get_by_username(data[USERNAME])
     if not user:
         return {MESSAGE: "User Not Found"}, 404
     user.delete_from_db()
     oj_info = OjModel.get_by_username(data[USERNAME])
     oj_info.delete_from_db()
     return {MESSAGE: "User deleted."}, 200
Example #8
0
 def get(self):
     identity = get_jwt_identity()
     user = UserModel.get_by_username(identity)
     if not user:
         return {MESSAGE: "user not found"}, 400
     oj_data = OjModel.get_by_username(identity)
     return {
                FIRST_NAME: user.first_name,
                LAST_NAME: user.last_name,
                USERNAME: user.username,
                EMAIL: user.email,
                OJ_INFO: oj_data.oj_info if oj_data else {}
            }, 200
    def post(self):
        data = request.get_json()
        username = get_jwt_identity()
        if data and USERNAME in data:
            username = data[USERNAME]
        classroom_name = ""
        if "classroom_name" in data:
            classroom_name = data["classroom_name"]
        else:
            classroom_list = ClassroomModel.get_all_classrooms({})
            # print(username, classroom_list)
            for classroom in classroom_list:
                if username not in classroom["user_list"]:
                    continue
                curr_name = classroom["classroom_name"]
                if curr_name == "rated":
                    classroom_name = curr_name
                    break
                else:
                    if classroom_name == "":
                        classroom_name = curr_name
                    else:
                        if int(curr_name[1, len(curr_name) - 1]) > int(
                                classroom_name[1, len(classroom_name) - 1]):
                            classroom_name = curr_name
        student = StudentModel.get_by_username_and_classroom_name(
            username, classroom_name)
        if not student:
            return {MESSAGE: "no data found"}, 404

        res = student.json()

        vjudge_username = OjModel.get_vjudge_username(username)
        if not vjudge_username:
            return res, 200

        contest_data = ContestDataModel.get_vjudge_contest_data()
        last_day_solve = get_last_day_solve(contest_data.data, vjudge_username)
        last_30_days_solve = get_last_30_days_solve(contest_data.data,
                                                    vjudge_username)
        todo_list = get_todos(username, classroom_name)
        announcement_list = get_announcements(username, classroom_name)

        res["last_day_solve"] = last_day_solve
        res["last_30_days_solve"] = last_30_days_solve
        res["todo_list"] = todo_list
        res["announcement_list"] = announcement_list
        return res, 200
Example #10
0
def update_students(classroom):
    StudentModel.remove({CLASSROOM_NAME: classroom.classroom_name})
    for username in classroom.user_list:
        user = UserModel.get_by_username(username)
        if not user:
            print("not found user: "******"no student found with username = "******" in classroom " + str(classroom.classroom_name))
            continue
        long_contests = []
        for contest in classroom.vjudge_contest_list:
            long_contests.append({
                "contest_title":
                contest["contest_title"],
                "contest_id":
                contest["contest_id"],
                "total_problems":
                contest["total_problems"],
                "minimum_solve_required":
                contest["minimum_solve_required"],
                "solved_problems":
                vjudge_sraper.solve_details_in_contest_from_data(
                    data=data_map[contest[CONTEST_ID]],
                    username=vjudge_handle),
                "contest_type":
                contest["contest_type"]
            })
        new_values = {"long_contests": long_contests}
        student.update_to_mongo(new_values)
Example #11
0
def get_rank_list_from_db(user_list, contest_list, start_time, end_time):
    contest_data = Database.find_one("contest_data",
                                     {"name": "vjudge_contest_data"})
    header = ["username", "Total Solve", "Tasks Completed"]
    data_map = contest_data["data"]
    for contest in contest_list:
        if contest[CONTEST_ID] in data_map:
            header.append(data_map[contest[CONTEST_ID]]["title"])
        else:
            header.append(contest[CONTEST_ID])

    rank_list = []
    for username in user_list:
        solve_list = [username]
        total_solve = 0
        min_solve_required = 0
        min_solve_completed = 0

        try:
            vjudge_handle = OjModel.get_by_username(
                username).oj_info[VJUDGE][USERNAME]
        except:
            continue
        for contest in contest_list:
            if contest[CONTEST_ID] in data_map and vjudge_handle in data_map[
                    contest[CONTEST_ID]]["submission"]:
                solve_count = count_in_range(
                    data_map[contest[CONTEST_ID]]["submission"][vjudge_handle],
                    start_time, end_time)
            else:
                solve_count = 0
            min_solve_completed = min_solve_completed + min(
                solve_count, contest["minimum_solve_required"])
            min_solve_required = min_solve_required + contest[
                "minimum_solve_required"]
            total_solve += solve_count
            solve_list.append(int(solve_count))

        tasks = (min_solve_completed * 100) // min_solve_required
        solve_list.insert(1, total_solve)
        solve_list.insert(2, tasks)
        rank_list.append(solve_list)

    rank_list = sorted(rank_list, key=lambda row: row[1], reverse=True)
    rank_list.insert(0, header)
    return rank_list
Example #12
0
def get_rank_list_live(user_list,
                       contest_list,
                       start_time,
                       end_time,
                       contest_data=None):
    header = ["username"]
    data_map = {}
    for contest in contest_list:
        if contest_data and contest[CONTEST_ID] in contest_data:
            data = contest_data[contest[CONTEST_ID]]
        else:
            data = vjudge_sraper.get_contest_details_data(contest[CONTEST_ID])
        data_map[contest[CONTEST_ID]] = data
        header.append(vjudge_sraper.get_contest_name_from_data(data))
    header.append("Total Solve")

    rank_list = []
    for username in user_list:
        vjudge_handle = None
        solve_list = [username]
        total_solve = 0
        try:
            vjudge_handle = OjModel.get_by_username(
                username).oj_info[VJUDGE][USERNAME]
        except:
            continue
        for contest in contest_list:
            solve_count = vjudge_sraper.solve_details_in_contest_from_data_with_timestamp(
                data=data_map[contest[CONTEST_ID]],
                username=vjudge_handle,
                end_time=end_time,
                start_time=start_time)
            total_solve += solve_count
            solve_list.append(int(solve_count))
        solve_list.append(total_solve)
        rank_list.append(solve_list)

    rank_list = sorted(rank_list,
                       key=lambda row: row[len(row) - 1],
                       reverse=True)
    rank_list.insert(0, header)
    return rank_list
Example #13
0
    def post(self):
        data = request.get_json()
        identity = get_jwt_identity()
        user = UserModel.get_by_username(identity)

        if not user:
            return {MESSAGE: "user not found"}, 400

        if EMAIL in data:
            email_user = UserModel.get_by_email(data[EMAIL])
            if EMAIL in data and email_user and email_user != user:
                return {MESSAGE: "email already exists"}, 400

        user.update_to_mongo(data)

        oj_info = OjModel.get_by_username(identity)
        if oj_info:
            oj_info.update_to_mongo(data)

        update_user_with_username(user.username)
        return {MESSAGE: "data updated"}, 200
Example #14
0
def update_user_with_username(username):
    user = OjModel.get_by_username(username)
    oj_profiles = user.oj_info
    try:
        vjudge_data = vjudge_details(oj_profiles[VJUDGE][USERNAME])
    except:
        vjudge_data = {}
    for oj in vjudge_data:
        if oj not in oj_profiles:
            oj_profiles[oj] = {USERNAME: None, SOLVE_LIST: vjudge_data[oj]}
        else:
            oj_profiles[oj][SOLVE_LIST] = vjudge_data[oj]
        oj_profiles[oj][SOLVE_LIST] = [
            str(x) for x in oj_profiles[oj][SOLVE_LIST]
        ]  # converting to list of strings

    update_profile(oj_profiles, CODEFORCES, cf_details)
    update_profile(oj_profiles, ATCODER, atc_details)
    # update_json(oj_profiles, LIGHTOJ, loj_details)

    user.update_to_mongo({"oj_info": oj_profiles})