Job now stores competition
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 17 Sep 2019 01:54:13 +0000 (20:54 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 17 Sep 2019 01:54:13 +0000 (20:54 -0500)
codebox/controllers/admin/competition/delete.moon
codebox/controllers/problem/problem.moon
codebox/controllers/problem/submit.moon
codebox/facades/executer.moon
codebox/migrations.moon
codebox/models/competitions.moon
codebox/models/problems.moon
codebox/services/queries.moon
codebox/views/admin/submission.moon
codebox/views/ssr/job_result.moon
codebox/views/submission/list.moon

index f195133e637fe6bb459118f2d29c16e0615ba96a..dced11204f71120dc924366059835eb124a641e0 100644 (file)
@@ -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'
index 2a6db9a97a79ff0f07ee4c7d75fe44b4a1f3fe2a..edb6856db919ecea469fd32f1ed09bf3dc1eb818 100644 (file)
@@ -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'
 
index 7d740a4d787f73738de8bc07b4aaa745622cf11a..6c2a10fcfbce6940fb9bc7075c9f23ff039b92da 100644 (file)
@@ -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
 
index bae8f0c609f21899edd33087a48408ba92d6cd0e..baa5b6d6e6d888a77bc973ca9eb2909cb748ae00 100644 (file)
@@ -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
index c9ce10bd73ba7858bf4bbb07325fcf5718e36e5a..7062750e52f4136f785fe8f0eb9ee098e6916c43 100644 (file)
@@ -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)"
index 7489692a8d1b8bcc3ecd8007a91dc914c0042bf5..f94e8833feb0d62583f4df3e58e9ad5f3a541cf6 100644 (file)
@@ -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" }
        }
index 3dea83cd9cafc2af0fc7b349534bb0678a6ab12f..f0262f4fa606ff394838fc07cf4727e8512b5057 100644 (file)
@@ -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
                }
        }
index ba72a6d7e29f2de07125bcb0831d8814d6b00d5f..376d16fdcbf6c0cc785c2e473eec2fa0cb912c4d 100644 (file)
@@ -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
index 9380719664e117061f60fc2329d1178b87ea5baf..cb726a510bef5399c32e0d2023cea371fb7dc98d 100644 (file)
@@ -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
index bc78891c00ebded9fb883011d75e9b6621cd3462..b82a2ea627218d1c01e314feb97a863d4f5dc5d9 100644 (file)
@@ -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', ->
index cb5f853cf4a3e239841f09a4e7b275f9f8041c3f..cbb2ca040bf53aae63c27918aad606ecdc18dfbc 100644 (file)
@@ -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