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'
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
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'
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
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
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
{ "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)"
where competitions.id=? order by competition_problems.letter asc", @id
}
{ "competition_problems", has_many: "CompetitionProblems" }
+ { "jobs", has_many: "Jobs" }
}
}
{ "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
}
}
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
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'
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
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
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', ->
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
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