From: Brendan Hansen Date: Tue, 17 Sep 2019 01:54:13 +0000 (-0500) Subject: Job now stores competition X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=96672d03a46693d754a3a10b4244242b3d5cbd02;p=codebox.git Job now stores competition --- diff --git a/codebox/controllers/admin/competition/delete.moon b/codebox/controllers/admin/competition/delete.moon index f195133..dced112 100644 --- a/codebox/controllers/admin/competition/delete.moon +++ b/codebox/controllers/admin/competition/delete.moon @@ -20,6 +20,11 @@ make_controller for cp in *comp_problems cp\delete! + jobs = comp\get_jobs! + if jobs + for job in *jobs + job\delete! + comp\delete! redirect_to: @url_for 'admin.competition' diff --git a/codebox/controllers/problem/problem.moon b/codebox/controllers/problem/problem.moon index 2a6db9a..edb6856 100644 --- a/codebox/controllers/problem/problem.moon +++ b/codebox/controllers/problem/problem.moon @@ -1,7 +1,7 @@ import make_controller from require "controllers.controller" import from_json, to_json from require 'lapis.util' import assert_valid from require 'lapis.validate' -import capture_errors, yield_error from require 'lapis.application' +import capture_errors, capture_errors_json, yield_error from require 'lapis.application' import Competitions, Problems from require 'models' make_controller @@ -11,11 +11,13 @@ make_controller middleware: { 'logged_in' } scripts: { "pie_chart" } - get: => + get: capture_errors_json => @navbar.selected = 1 if @params.problem_name @problem = Problems\find short_name: @params.problem_name + unless @problem\get_is_active! + yield_error 'Problem is not active' render: 'problem.problem' diff --git a/codebox/controllers/problem/submit.moon b/codebox/controllers/problem/submit.moon index 7d740a4..6c2a10f 100644 --- a/codebox/controllers/problem/submit.moon +++ b/codebox/controllers/problem/submit.moon @@ -35,8 +35,9 @@ make_controller return json: { status: 'problem not found' } test_cases = problem\get_test_cases! + competition = Competitions\find active: true - id = @executer\request @params.lang, @params.code, @user.id, problem.id, test_cases, problem.time_limit + id = @executer\request @params.lang, @params.code, @user.id, problem.id, competition.id, test_cases, problem.time_limit json: id diff --git a/codebox/facades/executer.moon b/codebox/facades/executer.moon index bae8f0c..baa5b6d 100644 --- a/codebox/facades/executer.moon +++ b/codebox/facades/executer.moon @@ -6,7 +6,7 @@ import format_date from require 'lapis.db' import Jobs from require 'models' class ExecuterFacade - request: (lang, code, user_id, problem_id, test_cases, time_limit) => + request: (lang, code, user_id, problem_id, competition_id, test_cases, time_limit) => body = http.simple "#{config.executer_addr}/request", { :lang :code @@ -22,10 +22,11 @@ class ExecuterFacade job_id: job_id user_id: user_id problem_id: problem_id + competition_id: competition_id status: Jobs.statuses\for_db 'queued' lang: lang code: code - time_initiated: format_date! + time_initiated: os.time! } job_id diff --git a/codebox/migrations.moon b/codebox/migrations.moon index c9ce10b..7062750 100644 --- a/codebox/migrations.moon +++ b/codebox/migrations.moon @@ -19,10 +19,11 @@ import insert from require "lapis.db" { "job_id", types.varchar unique: true }, { "user_id", types.foreign_key }, { "problem_id", types.foreign_key }, + { "competition_id", types.foreign_key }, { "status", types.enum }, { "lang", types.varchar }, { "code", types.text null: true }, - { "time_initiated", types.time }, + { "time_initiated", types.integer }, { "data", types.text null: true }, "PRIMARY KEY (id)" diff --git a/codebox/models/competitions.moon b/codebox/models/competitions.moon index 7489692..f94e883 100644 --- a/codebox/models/competitions.moon +++ b/codebox/models/competitions.moon @@ -18,4 +18,5 @@ class Competitions extends Model where competitions.id=? order by competition_problems.letter asc", @id } { "competition_problems", has_many: "CompetitionProblems" } + { "jobs", has_many: "Jobs" } } diff --git a/codebox/models/problems.moon b/codebox/models/problems.moon index 3dea83c..f0262f4 100644 --- a/codebox/models/problems.moon +++ b/codebox/models/problems.moon @@ -17,20 +17,34 @@ class Problems extends Model } { "competitions", has_many: "CompetitionProblems" } { "correct_jobs", fetch: => - (db.query "select count(job_id) from jobs where problem_id=? and status=4", @id)[1].count + (db.query "select count(job_id) from jobs + inner join competitions on jobs.competition_id = competitions.id + where competitions.active=TRUE and jobs.problem_id=? and jobs.status=4", @id)[1].count } { "wrong_answer_jobs", fetch: => - (db.query "select count(job_id) from jobs where problem_id=? and status=5", @id)[1].count + (db.query "select count(job_id) from jobs + inner join competitions on jobs.competition_id = competitions.id + where competitions.active=TRUE and jobs.problem_id=? and jobs.status=5", @id)[1].count } { "timed_out_jobs", fetch: => - (db.query "select count(job_id) from jobs where problem_id=? and status=6", @id)[1].count + (db.query "select count(job_id) from jobs + inner join competitions on jobs.competition_id = competitions.id + where competitions.active=TRUE and jobs.problem_id=? and jobs.status=6", @id)[1].count } { "error_jobs", fetch: => - (db.query "select count(job_id) from jobs where problem_id=? and status in ?", @id, + (db.query "select count(job_id) from jobs + inner join competitions on jobs.competition_id = competitions.id + where competitions.active=TRUE and jobs.problem_id=? and jobs.status in ?", @id, db.list { Jobs.statuses\for_db 'compile_err' Jobs.statuses\for_db 'error' } )[1].count + }, + { "is_active", fetch: => + (db.select "count(problems.id) from problems + inner join competition_problems on competition_problems.problem_id = problems.id + inner join competitions on competitions.id = competition_problems.competition_id + where competitions.active=TRUE and problem_id=?", @id)[1].count > 0 } } diff --git a/codebox/services/queries.moon b/codebox/services/queries.moon index ba72a6d..376d16f 100644 --- a/codebox/services/queries.moon +++ b/codebox/services/queries.moon @@ -5,7 +5,8 @@ import Jobs from require 'models' has_correct_submission: (user_id, problem_name) -> count = db.select "count(problems.id) from problems inner join jobs on problems.id = jobs.problem_id - where jobs.status=? and jobs.user_id=? and problems.short_name=? + inner join competitions on jobs.competition_id=competitions.id + where competitions.active=TRUE and jobs.status=? and jobs.user_id=? and problems.short_name=? ", (Jobs.statuses\for_db 'correct'), user_id, problem_name return count[1].count > 0 @@ -13,7 +14,8 @@ import Jobs from require 'models' has_incorrect_submission: (user_id, problem_name) -> count = db.select "count(problems.id) from problems inner join jobs on problems.id = jobs.problem_id - where jobs.status in ? and jobs.user_id=? and problems.short_name=? + inner join competitions on jobs.competition_id=competitions.id + where competitions.active=TRUE and jobs.status in ? and jobs.user_id=? and problems.short_name=? ", (db.list { Jobs.statuses\for_db 'wrong_answer' @@ -24,6 +26,6 @@ import Jobs from require 'models' return count[1].count > 0 - get_jobs_by_user_and_problem: (user_id, problem_id) -> - db.select "* from jobs where user_id=? and problem_id=? order by time_initiated desc", user_id, problem_id + get_jobs_by_user_and_problem_and_competition: (user_id, problem_id, competition_id) -> + db.select "* from jobs where user_id=? and problem_id=? and competition_id=? order by time_initiated desc", user_id, problem_id, competition_id } \ No newline at end of file diff --git a/codebox/views/admin/submission.moon b/codebox/views/admin/submission.moon index 9380719..cb726a5 100644 --- a/codebox/views/admin/submission.moon +++ b/codebox/views/admin/submission.moon @@ -23,6 +23,9 @@ class AdminSubmission extends html.Widget div class: 'highlight pad-12 split-lr', -> span 'Problem id:' span job.problem_id + div class: 'highlight pad-12 split-lr', -> + span 'Competition id:' + span job.competition_id div class: 'highlight pad-12 split-lr', -> span 'Language:' span job.lang diff --git a/codebox/views/ssr/job_result.moon b/codebox/views/ssr/job_result.moon index bc78891..b82a2ea 100644 --- a/codebox/views/ssr/job_result.moon +++ b/codebox/views/ssr/job_result.moon @@ -72,7 +72,7 @@ class JobResultView extends html.Widget div "#{@problem}" div class: "highlight pad-l-12 pad-r-12 pad-t-4 pad-b-4 split-lr", -> div "Time submittted:" - div "#{@time_started}" + div "#{ os.date '%c', @time_started }" div -> if @show_slash div class: 'header-line', -> diff --git a/codebox/views/submission/list.moon b/codebox/views/submission/list.moon index cb5f853..cbb2ca0 100644 --- a/codebox/views/submission/list.moon +++ b/codebox/views/submission/list.moon @@ -9,7 +9,7 @@ class SubmissionList extends html.Widget for prob in *@problems div class: 'header-line', -> div prob.name div class: 'box', -> - jobs = @queries.get_jobs_by_user_and_problem @user.id, prob.id + jobs = @queries.get_jobs_by_user_and_problem_and_competition @user.id, prob.id, @competition.id if #jobs == 0 div class: 'pad-12', "No submissions to this problem." return @@ -25,7 +25,7 @@ class SubmissionList extends html.Widget div Jobs.statuses\to_name job.status div job.lang\upper! div "Average run time" - div job.time_initiated + div (os.date '%c', job.time_initiated) correct = 0 wrong = 0