# HG changeset patch # User Jittat Fakcharoenphol # Date 2010-03-11 08:18:40 # Node ID 74436ad04ad0bc2d7d1078a72a64c345d6ed840b # Parent ef21ac5a4e2a493faebbf2f4f5142544bfb65bb6 controllers get available problems from current user diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb --- a/app/controllers/main_controller.rb +++ b/app/controllers/main_controller.rb @@ -107,7 +107,7 @@ def submission @user = User.find(session[:user_id]) - @problems = Problem.find_available_problems + @problems = @user.available_problems if params[:id]==nil @problem = nil @submissions = nil @@ -193,54 +193,13 @@ end end - def problem_list_by_user_contests(user) - contest_problems = [] - pin = {} - user.contests.enabled.each do |contest| - available_problems = contest.problems.available - contest_problems << { - :contest => contest, - :problems => available_problems - } - available_problems.each {|p| pin[p.id] = true} - end - other_avaiable_problems = Problem.available.find_all {|p| pin[p.id]==nil and p.contests.length==0} - contest_problems << { - :contest => nil, - :problems => other_avaiable_problems - } - return contest_problems - end - - def problem_list_for_user(user, contest_problems=nil) - if not Configuration.multicontests? - return Problem.find_available_problems - else - if contest_problems==nil - contest_problems = problem_list_by_user_contests(user) - end - - problems = [] - collected = {} - contest_problems.each do |cp| - cp[:problems].each do |problem| - if not collected[problem.id] - problems << problem - collected[problem.id] = true - end - end - end - return problems - end - end - def prepare_list_information @user = User.find(session[:user_id]) if not Configuration.multicontests? @problems = problem_list_for_user(@user) else - @contest_problems = problem_list_by_user_contests(@user) - @problems = problem_list_for_user(@user, @contest_problems) + @contest_problems = @user.available_problems_group_by_contests + @problems = @user.available_problems end @prob_submissions = {} @problems.each do |p| diff --git a/app/controllers/tasks_controller.rb b/app/controllers/tasks_controller.rb --- a/app/controllers/tasks_controller.rb +++ b/app/controllers/tasks_controller.rb @@ -7,7 +7,7 @@ end def list - @problems = Problem.find_available_problems + @problems = @user.available_problems end # this has contest-wide access control diff --git a/app/models/user.rb b/app/models/user.rb --- a/app/models/user.rb +++ b/app/models/user.rb @@ -197,6 +197,44 @@ return false end + def available_problems_group_by_contests + contest_problems = [] + pin = {} + contests.enabled.each do |contest| + available_problems = contest.problems.available + contest_problems << { + :contest => contest, + :problems => available_problems + } + available_problems.each {|p| pin[p.id] = true} + end + other_avaiable_problems = Problem.available.find_all {|p| pin[p.id]==nil and p.contests.length==0} + contest_problems << { + :contest => nil, + :problems => other_avaiable_problems + } + return contest_problems + end + + def available_problems + if not Configuration.multicontests? + return Problem.find_available_problems + else + contest_problems = [] + pin = {} + contests.enabled.each do |contest| + contest.problems.available.each do |problem| + if not pin.has_key? problem.id + contest_problems << problem + end + pin[problem.id] = true + end + end + other_avaiable_problems = Problem.available.find_all {|p| pin[p.id]==nil and p.contests.length==0} + return contest_problems + other_avaiable_problems + end + end + def can_view_problem?(problem) if not Configuration.multicontests? return problem.available