Example #1
0
def my_submissions():
    session = db_session.create_session()
    submissions = session.query(Submission).filter(Submission.user_id == current_user.id).order_by(
        Submission.sending_time.desc())
    params = base_params("My submissions", -1)
    params["submissions"] = submissions
    return render_template('my_submissions.html', **params)
 def get(self):
     session = db_session.create_session()
     problems = session.query(Problem).all()
     problems_dict_list = []
     for problem in problems:
         problems_dict_list.append(parse_problem(problem))
     return jsonify({'problems': problems_dict_list})
Example #3
0
 def get(self):
     session = db_session.create_session()
     users = session.query(User).all()
     users_dict_list = []
     for user in users:
         users_dict_list.append(parse_user(user))
     return jsonify({'users': users_dict_list})
Example #4
0
 def get(self):
     session = db_session.create_session()
     submissions = session.query(Submission).all()
     submissions_dict_list = []
     for submission in submissions:
         submissions_dict_list.append(parse_submission(submission))
     return jsonify({'submissions': submissions_dict_list})
Example #5
0
def sign_up():
    db_session.global_init(app.config["SQLALCHEMY_DATABASE_URI"])
    session = db_session.create_session()

    form = SignUpForm()
    params = base_params("Sign up", -1)
    params["form"] = form
    if form.validate_on_submit():
        if form.password.data != form.password_repeat.data:
            params["password_error_message"] = "Password mismatch"
            return render_template('sign_up.html', **params)
        if session.query(User).filter(User.login == form.login.data).first():
            params["login_error_message"] = "This username already exists"
            return render_template('sign_up.html', **params)
        if session.query(User).filter(User.email == form.email.data).first():
            params["email_error_message"] = "This email already exists"
            return render_template('sign_up.html', **params)
        user = User(
            login=form.login.data,
            email=form.email.data,
        )
        icon_data = form.icon.data.read()
        if icon_data == b'':
            icon_id = save_default_user_icon()
        else:
            icon_id = save_custom_user_icon(icon_data)
        user.icon_id = icon_id
        user.set_password(form.password.data)
        session.add(user)
        session.commit()
        return redirect('/home')
    return render_template('sign_up.html', **params)
Example #6
0
def profile_edit():
    d_session = db_session.create_session()
    user = d_session.query(User).get(current_user.id)
    params = base_params("Profile edit", -1)
    if "error_parameters" in session.keys():
        for key in session["error_parameters"]:
            params[key] = session["error_parameters"][key]
        session.pop("error_parameters", None)
    params["profile_icon"] = f"/static/user_data/icons/large/{user.icon_id}.png"
    params["user_icon"] = f"/static/user_data/icons/small/{user.icon_id}.png"

    req_ans = str(request.form)
    is_email_form, is_icon_form, is_password_form = 0, 0, 0
    if "email" in req_ans:
        params["email_change_form_visible_errors"] = True
        is_email_form = 1
    elif "password" in req_ans:
        params["password_change_form_visible_errors"] = True
        is_password_form = 1
    elif "Change icon" in req_ans:
        params["icon_change_form_visible_errors"] = True
        is_icon_form = 1
    icon_change_form = IconChangeForm()
    email_change_form = EmailChangeForm()
    password_change_form = PasswordChangeForm()
    params["icon_change_form"] = icon_change_form
    params["email_change_form"] = email_change_form
    params["password_change_form"] = password_change_form
    if icon_change_form.validate_on_submit():  # can put one of 3 form, because they all validating(important line)
        if is_email_form:
            if d_session.query(User).filter(User.email == email_change_form.email.data).first():
                params["email_error_message"] = "This email already linked to another user"
            else:
                user.email = email_change_form.email.data
        if is_icon_form:
            delete_old_user_icon(user.icon_id)
            sleep(.05)
            icon_data = icon_change_form.icon.data.read()
            if icon_data == b'':
                icon_id = save_default_user_icon()
            else:
                icon_id = save_custom_user_icon(icon_data)
            user.icon_id = icon_id
        if is_password_form:
            if password_change_form.new_password.data != password_change_form.new_password_repeat.data:
                params["password_error_message"] = "Password mismatch"
            elif not user.check_password(password_change_form.old_password.data):
                params["password_error_message"] = "Wrong old password"
            else:
                user.set_password(password_change_form.new_password.data)
        d_session.commit()
        error_params = {}
        if "email_error_message" in params.keys():
            error_params["email_error_message"] = params["email_error_message"]
        if "password_error_message" in params.keys():
            error_params["password_error_message"] = params["password_error_message"]
        session["error_parameters"] = error_params
        return redirect(url_for('profile_edit'))
    return render_template('edit_profile.html', **params)
Example #7
0
def editorial(theme, problem_id):
    session = db_session.create_session()
    params = base_params("Editorial", 1)
    params["editorial"] = f"problems/{problem_id}/editorial.html"
    params["active_tab_id"] = 1
    params["code"] = open(f"templates/problems/{problem_id}/author_solution.cpp", "r").read()
    params["problem"] = session.query(Problem).get(problem_id)
    return render_template('editorial.html', **params)
Example #8
0
def submission(submission_id):
    session = db_session.create_session()
    params = base_params("Submission", 1)
    params["submission"] = session.query(Submission).get(submission_id)
    if params["submission"].language == "cpp":
        params["code"] = open(f"data/testing_system/submissions/{submission_id}/submission.cpp", "r").read()
    if params["submission"].language == "py":
        params["code"] = open(f"data/testing_system/submissions/{submission_id}/submission.py", "r").read()
    return render_template('submission.html', **params)
Example #9
0
def my_submissions_on_problem(theme, problem_id):
    session = db_session.create_session()
    submissions = session.query(Submission).filter(Submission.user_id == current_user.id).order_by(
        Submission.sending_time.desc())
    submissions = list(filter(lambda it: it.problem.theme == theme, submissions))
    params = base_params("My submissions", 1)
    params["statement"] = f"problems/{problem_id}/statement.html"
    params["submissions"] = submissions
    params["problem"] = session.query(Problem).get(problem_id)
    params["active_tab_id"] = 2
    return render_template('my_submissions_on_problem.html', **params)
Example #10
0
def log_in():
    form = LogInForm()
    params = base_params("Log in", -1)
    params["form"] = form
    if form.validate_on_submit():
        session = db_session.create_session()
        user = session.query(User).filter(User.login == form.login.data).first()
        if user and user.check_password(form.password.data):
            login_user(user, remember=form.remember_me.data)
            return redirect("/home")
        params["error_message"] = "Wrong login or password"
        return render_template('log_in.html', **params)
    return render_template('log_in.html', **params)
Example #11
0
def problem_list(theme):
    def theme_prettify():
        pretty_theme = theme.split('_')
        pretty_theme = ' '.join([it[0].upper() + it[1:].lower() for it in pretty_theme])
        return pretty_theme

    session = db_session.create_session()
    params = base_params(theme, 1)
    params["problems"] = session.query(Problem).filter(Problem.theme == theme)
    params["theme_title"] = theme_prettify()
    if current_user.is_authenticated:
        params["problems_solved_id"] = [problem.id for problem in current_user.problems_solved]
        params["problems_unsolved_id"] = [problem.id for problem in current_user.problems_unsolved]
    else:
        params["problems_solved_id"] = []
        params["problems_unsolved_id"] = set()
    return render_template('problems_list.html', **params)
Example #12
0
def profile(user_id):
    session = db_session.create_session()

    def parse_user_statistics(user):
        submissions_results = {
            "AC": 0,
            "WA": 0,
            "TLE": 0,
            "MLE": 0,
            "CE": 0,
            "RE": 0
        }
        ans_dict = {
            "AC": 0,
            "WA": 0,
            "TLE": 0,
            "MLE": 0,
            "CE": 0,
            "RE": 0,
            "accuracy": 0,
            "problems_solved": 0,
            "languages": ["C++11"],
            "skills": ["soon..."]
        }
        submissions_num = 0
        for submission in user.submissions:
            for key in submissions_results.keys():
                if key in submission.status:
                    ans_dict[key] += 1
                    break
            submissions_num += 1
        if submissions_num == 0:
            ans_dict["accuracy"] = 100
            return ans_dict
        ans_dict["accuracy"] = int(round(len(user.problems_solved) / submissions_num, 2) * 100)
        return ans_dict

    params = base_params("Profile", -1)
    params["user"] = session.query(User).get(user_id)
    params["user_statistics"] = parse_user_statistics(params["user"])
    params["profile_icon"] = f"/static/user_data/icons/large/{params['user'].icon_id}.png"
    params["table_headers"] = ["AC", "CE", "WA", "TLE", "MLE", "RE"]

    return render_template('profile.html', **params)
Example #13
0
def problem(theme, problem_id):
    session = db_session.create_session()
    form = SubmitForm()
    params = base_params("Fak me", 1)
    params["statement"] = f"problems/{problem_id}/statement.html"
    params["problem"] = session.query(Problem).filter(Problem.id == problem_id, Problem.theme == theme).first()
    params["title"] = params["problem"].title
    params["form"] = form
    params["goBack_href"] = f"/practice/{params['problem'].theme}"
    params["active_tab_id"] = 0
    if form.validate_on_submit():
        code = request.form["code_area"]
        if code == "":
            params["message"] = "You can't submit empty code"
            return render_template('problem.html', **params)
        if not current_user.is_authenticated:
            params["message"] = "You must sign in to submit code"
            return render_template('problem.html', **params)
        submission_id = 1
        if session.query(Submission).first():
            submission_id = session.query(sqlalchemy_func.max(Submission.id)).one()[0] + 1
        submission_folder = f'data/testing_system/submissions/{submission_id}'
        os.mkdir(f'data/testing_system/submissions/{submission_id}')
        language = request.form["language"]
        if language == "cpp":
            open(f"{submission_folder}/solution.cpp", "wb").writelines(
                [line.rstrip('\n').encode(encoding='UTF-8', errors='strict') for line in code])
        if language == "py":
            open(f"{submission_folder}/solution.py", "wb").writelines(
                [line.rstrip('\n').encode(encoding='UTF-8', errors='strict') for line in code])
        submission = Submission(
            id=submission_id,
            user_id=current_user.id,
            problem_id=problem_id,
            status="In queue",
            running_time=0,
            language=language
        )
        session.add(submission)
        session.commit()
        sleep(.5)
        return redirect(f'/practice/{theme}/problems/{problem_id}/my_submissions')
    return render_template('problem.html', **params)
Example #14
0
def test_all_submissions():
    res = {}
    session = db_session.create_session()
    submissions = session.query(Submission).filter(Submission.status == "In queue")
    for submission in submissions:
        try:
            test_submission(submission, res)
        except sqlalchemy.exc.OperationalError:
            continue
        submission.status = res[submission.id]['status']
        submission.running_time = res[submission.id]['running_time']
        if submission.status == "AC":
            if submission.problem in submission.user.problems_unsolved:
                submission.user.problems_unsolved.remove(submission.problem)
            if submission.problem not in submission.user.problems_solved:
                submission.user.problems_solved.append(submission.problem)
        else:
            if submission.problem not in submission.user.problems_unsolved and submission.problem not in submission.user.problems_solved:
                submission.user.problems_unsolved.append(submission.problem)
        session.commit()
 def get(self, problem_id):
     abort_if_problem_not_found(problem_id)
     session = db_session.create_session()
     problem = session.query(Problem).get(problem_id)
     return jsonify({'problem': parse_problem(problem)})
Example #16
0
def abort_if_user_not_found(user_id):
    session = db_session.create_session()
    user = session.query(User).get(user_id)
    if not user:
        abort(404, message=f"User with id {user_id} not found")
Example #17
0
 def get(self, user_id):
     abort_if_user_not_found(user_id)
     session = db_session.create_session()
     user = session.query(User).get(user_id)
     return jsonify({'user': parse_user(user)})
Example #18
0
def abort_if_submission_not_found(submission_id):
    session = db_session.create_session()
    user = session.query(Submission).get(submission_id)
    if not user:
        abort(404, message=f"Submission with id {submission_id} not found")
Example #19
0
def submissions():
    session = db_session.create_session()
    params = base_params("Submissions", 2)
    params["submissions"] = session.query(Submission).order_by(Submission.id.desc()).limit(20).all()
    return render_template('submissions.html', **params)
Example #20
0
 def get(self, submission_id):
     abort_if_submission_not_found(submission_id)
     session = db_session.create_session()
     user = session.query(Submission).get(submission_id)
     return jsonify({'submission': parse_submission(user)})
def abort_if_problem_not_found(problem_id):
    session = db_session.create_session()
    problem = session.query(Problem).get(problem_id)
    if not problem:
        abort(404, message=f"Problem with id {problem_id} not found")
Example #22
0
def load_user(user_id):
    session = db_session.create_session()
    return session.query(User).get(user_id)