From: Brendan Hansen Date: Thu, 5 Sep 2019 20:17:37 +0000 (-0500) Subject: Adding and removing problems from competitions X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=23d620e45eabf9edcbd4b867258679050664c438;p=codebox.git Adding and removing problems from competitions --- diff --git a/codebox/app/app.moon b/codebox/app/app.moon index 06f6d19..cd18b10 100644 --- a/codebox/app/app.moon +++ b/codebox/app/app.moon @@ -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 index 0000000..b87551f --- /dev/null +++ b/codebox/controllers/admin/competition/add_problem.moon @@ -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 index 0000000..b2ba0e2 --- /dev/null +++ b/codebox/controllers/admin/competition/delete_problem.moon @@ -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 diff --git a/codebox/models/competitions.moon b/codebox/models/competitions.moon index ff738ce..7e720d5 100644 --- a/codebox/models/competitions.moon +++ b/codebox/models/competitions.moon @@ -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 diff --git a/codebox/views/admin/competition/edit.moon b/codebox/views/admin/competition/edit.moon index 297a52f..98425ec 100644 --- a/codebox/views/admin/competition/edit.moon +++ b/codebox/views/admin/competition/edit.moon @@ -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}"