['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
--- /dev/null
+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 }
--- /dev/null
+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
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
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'
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}"