Adding and removing problems from competitions
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 5 Sep 2019 20:17:37 +0000 (15:17 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 5 Sep 2019 20:17:37 +0000 (15:17 -0500)
codebox/app/app.moon
codebox/controllers/admin/competition/add_problem.moon [new file with mode: 0644]
codebox/controllers/admin/competition/delete_problem.moon [new file with mode: 0644]
codebox/models/competitions.moon
codebox/views/admin/competition/edit.moon

index 06f6d197c50ed654479d74640dda85980fc2bae6..cd18b101faeaebc5a2a8124fe4648684f3a0e303 100644 (file)
@@ -66,6 +66,8 @@ class extends lapis.Application
        ['admin.competition.new': "/admin/competition/new"]: controller "admin.competition.new"
        ['admin.competition.edit': "/admin/competition/edit/:competition_id"]: controller "admin.competition.edit"
        ['admin.competition.delete': "/admin/competition/delete/:competition_id"]: controller "admin.competition.delete"
+       ['admin.competition.add_problem': "/admin/competition/add_problem"]: controller "admin.competition.add_problem"
+       ['admin.competition.delete_problem': "/admin/competition/delete_problem"]: controller "admin.competition.delete_problem"
 
        [test: '/test']: =>
                user = Users\find 5
diff --git a/codebox/controllers/admin/competition/add_problem.moon b/codebox/controllers/admin/competition/add_problem.moon
new file mode 100644 (file)
index 0000000..b87551f
--- /dev/null
@@ -0,0 +1,37 @@
+import make_controller from require "controllers.controller"
+import assert_valid from require "lapis.validate"
+import capture_errors, capture_errors_json, yield_error from require 'lapis.application'
+import Competitions, Problems, CompetitionProblems from require 'models'
+
+make_controller
+       middleware: { 'logged_in', 'admin_required' }
+
+       post: capture_errors_json =>
+        assert_valid @params, {
+            { "competition_id", exists: true, is_integer: true }
+            { "problem_name", exists: true }
+            { "letter", exists: true }
+        }
+
+        comp = Competitions\find @params.competition_id
+        unless comp
+            yield_error 'Competition not found'
+            return
+
+        problem = Problems\find short_name: @params.problem_name
+        unless problem
+            yield_error 'Problem not found'
+            return
+
+        comp_prob = CompetitionProblems\select "where competition_id=? and problem_id=?", @params.competition_id, problem.id
+        if #comp_prob > 0
+            yield_error 'Problem already in competition'
+            return
+        
+        CompetitionProblems\create {
+            competition_id: @params.competition_id
+            problem_id: problem.id
+            letter: @params.letter
+        }
+
+               redirect_to: @url_for 'admin.competition.edit', { competition_id: @params.competition_id }
diff --git a/codebox/controllers/admin/competition/delete_problem.moon b/codebox/controllers/admin/competition/delete_problem.moon
new file mode 100644 (file)
index 0000000..b2ba0e2
--- /dev/null
@@ -0,0 +1,19 @@
+import make_controller from require "controllers.controller"
+import assert_valid from require "lapis.validate"
+import capture_errors, capture_errors_json, yield_error from require 'lapis.application'
+import Competitions, Problems, CompetitionProblems from require 'models'
+
+make_controller
+       middleware: { 'logged_in', 'admin_required' }
+
+       get: capture_errors_json =>
+        assert_valid @params, {
+            { "competition_id", exists: true, is_integer: true }
+            { "problem_id", exists: true, is_integer: true }
+        }
+
+        comp_prob = CompetitionProblems\select "where competition_id=? and problem_id=?", @params.competition_id, @params.problem_id
+        for cp in *comp_prob
+            cp\delete!
+
+        redirect_to: @url_for "admin.competition.edit", { competition_id: @params.competition_id }
\ No newline at end of file
index ff738ceeb05d3f81be10eebf978ebea0e63c427e..7e720d5a3b7ee68999d83071ec07542c01b73080 100644 (file)
@@ -4,7 +4,7 @@ db = require 'lapis.db'
 class Competitions extends Model
        @relations: {
                { "problems", fetch: =>
-                       db.select "problems.name, problems.short_name, problems.kind, problems.time_limit, competition_problems.letter
+                       db.select "problems.id AS problem_id, problems.name, problems.short_name, problems.kind, problems.time_limit, competition_problems.letter
                        from problems
                        inner join competition_problems on problems.id = competition_problems.problem_id
                        inner join competitions on competition_problems.competition_id = competitions.id
index 297a52f2606b51528bb19b778d810ff9ad2cbaad..98425eca805fbafe83164286dd7b32dc2b312261 100644 (file)
@@ -33,10 +33,10 @@ class AdminCompetitionEdit extends html.Widget
                                                                                div class: 'pad-12', -> text "#{cp.name}"
 
                                                                        div class: 'pad-12 button-list', ->
-                                                                               a 'Remove'
+                                                                               a href: (@url_for "admin.competition.delete_problem", {}, { competition_id: @comp.id, problem_id: cp.problem_id }), 'Remove'
 
                                        h2 class: 'mar-t-32', "Add problem"
-                                       form method: 'POST', action: '/test', ->
+                                       form method: 'POST', action: (@url_for 'admin.competition.add_problem'), ->
                                                input type: 'hidden', name: 'competition_id', value: "#{@comp.id}", ""
 
                                                label for: 'problem_name', 'Problem name'
@@ -45,7 +45,7 @@ class AdminCompetitionEdit extends html.Widget
                                                                option value: "#{prob.short_name}", "#{prob.name}"
 
                                                label for: 'letter', 'Problem letter'
-                                               element 'select', ->
+                                               element 'select', name: 'letter', ->
                                                        for i = 0, 25, 1
                                                                letter = string.char (65 + i)
                                                                option value: "#{letter}", "#{letter}"