diff --git a/app/controllers/codejom_controller.rb b/app/controllers/codejom_controller.rb --- a/app/controllers/codejom_controller.rb +++ b/app/controllers/codejom_controller.rb @@ -1,13 +1,37 @@ class CodejomController < ApplicationController before_filter :admin_authorization - before_filter :authenticate def index @user = User.find(session[:user_id]) @problems = Problem.find(:all) - @available_problems = @problems.find_all {|p| not p.available } + @levels = @problems.collect {|p| p.level}.uniq.sort + @available_problems = {} + @levels.each do |level| + @available_problems[level] = [] + end + @problems.find_all {|p| not p.available }.each do |problem| + @available_problems[problem.level] << problem + end @activated_problems = @problems.find_all {|p| p.available } end + def random_problem + level = params[:id].to_i + + problems = Problem.unavailable.level(level).all + puts problems + if problems.length!=0 + if problems.length != 1 + problem = problems[rand(problems.length)] + else + problem = problems[0] + end + problem.available = true + problem.save + end + + redirect_to :action => 'index' + end + end diff --git a/app/controllers/problems_controller.rb b/app/controllers/problems_controller.rb --- a/app/controllers/problems_controller.rb +++ b/app/controllers/problems_controller.rb @@ -6,6 +6,9 @@ in_place_edit_for :problem, :full_name in_place_edit_for :problem, :full_score + # for codejom + in_place_edit_for :problem, :level + def index list render :action => 'list' diff --git a/app/models/problem.rb b/app/models/problem.rb --- a/app/models/problem.rb +++ b/app/models/problem.rb @@ -3,6 +3,13 @@ belongs_to :description has_many :test_pairs, :dependent => :delete_all + named_scope :level, lambda { |level| + { :conditions => { :level => level }} + } + + named_scope :unavailable, { :conditions => { :available => false }} + + validates_presence_of :name validates_format_of :name, :with => /^\w+$/ validates_presence_of :full_name diff --git a/app/views/codejom/index.html.haml b/app/views/codejom/index.html.haml --- a/app/views/codejom/index.html.haml +++ b/app/views/codejom/index.html.haml @@ -1,9 +1,21 @@ %h1 Code Jom Control Panel -%h2= "Available problems (#{@available_problems.length})" -%ul - - @available_problems.each do |problem| - %li= problem.name +%h2 Available problems +%table{:class => "codejom-problems"} + %tr + - @levels.each do |level| + %th= "Level #{level} (#{@available_problems[level].length})" + %tr + - @levels.each do |level| + %td + - @available_problems[level].each do |problem| + = problem.name + %br/ + %tr + - @levels.each do |level| + %td{:class => 'random-button'} + - form_tag :action => 'random_problem', :id => level do + = submit_tag 'Random' %h2= "Activated problems (#{@activated_problems.length})" - @activated_problems.each do |problem| diff --git a/app/views/problems/list.rhtml b/app/views/problems/list.rhtml --- a/app/views/problems/list.rhtml +++ b/app/views/problems/list.rhtml @@ -28,6 +28,7 @@ Name Full name + Level Full score Date added Avail? @@ -39,6 +40,7 @@ <% @problem=problem %> <%= in_place_editor_field :problem, :name, {}, :rows=>1 %> <%= in_place_editor_field :problem, :full_name, {}, :rows=>1 %> + <%= in_place_editor_field :problem, :level, {}, :rows=>1 %> <%= in_place_editor_field :problem, :full_score, {}, :rows=>1 %> <%= problem.date_added %> <%= problem.available %> diff --git a/db/migrate/20100209145331_add_level_to_problems.rb b/db/migrate/20100209145331_add_level_to_problems.rb new file mode 100644 --- /dev/null +++ b/db/migrate/20100209145331_add_level_to_problems.rb @@ -0,0 +1,9 @@ +class AddLevelToProblems < ActiveRecord::Migration + def self.up + add_column :problems, :level, :integer, :default => 0 + end + + def self.down + remove_column :problems, :level, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20100129041917) do +ActiveRecord::Schema.define(:version => 20100209145331) do create_table "announcements", :force => true do |t| t.string "author" @@ -93,6 +93,7 @@ t.integer "description_id" t.boolean "test_allowed" t.boolean "output_only" + t.integer "level", :default => 0 end create_table "rights", :force => true do |t| diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -277,3 +277,13 @@ -moz-border-radius: 2px; -webkit-border-radius: 5px; border-radius: 5px; } + +table.codejom-problems th { + background: #000070; + color: white; } +table.codejom-problems td { + width: 200px; + vertical-align: top; + text-align: center; } + table.codejom-problems td.random-button { + background: lightgrey; } diff --git a/public/stylesheets/sass/application.sass b/public/stylesheets/sass/application.sass --- a/public/stylesheets/sass/application.sass +++ b/public/stylesheets/sass/application.sass @@ -324,3 +324,15 @@ -moz-border-radius: 2px -webkit-border-radius: 5px border-radius: 5px + +table.codejom-problems + th + background: #000070 + color: white + td + width: 200px + vertical-align: top + text-align: center + + &.random-button + background: lightgrey \ No newline at end of file