# HG changeset patch # User Jittat Fakcharoenphol # Date 2010-02-19 02:17:28 # Node ID 69482b83f9d68f911b44da11afa927449244d719 # Parent 6fd950650700a353a8bf9ae1ac35da5130cce184 imports task description as pdf 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 @@ -12,11 +12,15 @@ end def view - base_filename = File.basename("#{params[:file]}.#{params[:ext]}") - filename = "#{RAILS_ROOT}/data/tasks/#{base_filename}" - #filename = "/home/ioi/web_grader/data/tasks/#{base_filename}" - #filename = "/home/ioi/web_grader/public/images/rails.png" - if !FileTest.exists?(filename) + base_name = params[:file] + if !check_user_viewability(base_name) + redirect_to :action => 'index' and return + end + + base_filename = File.basename("#{base_name}.#{params[:ext]}") + filename = "#{Problem.download_file_basedir}/#{base_filename}" + + if !check_user_viewability(base_name) or !FileTest.exists?(filename) redirect_to :action => 'index' and return end @@ -34,11 +38,17 @@ protected def check_viewability - user = User.find(session[:user_id]) - if user==nil or !Configuration.show_tasks_to?(user) + @user = User.find(session[:user_id]) + if @user==nil or !Configuration.show_tasks_to?(@user) redirect_to :controller => 'main', :action => 'list' return false end end + def check_user_viewability(filename) + # individual file access control shall be added here + return false if not @user + return Configuration.show_tasks_to?(@user) + end + end diff --git a/app/helpers/main_helper.rb b/app/helpers/main_helper.rb --- a/app/helpers/main_helper.rb +++ b/app/helpers/main_helper.rb @@ -1,3 +1,18 @@ module MainHelper + def link_to_description_if_any(name, problem, options={}) + if !problem.url.blank? + return link_to name, problem.url, options + elsif !problem.description_filename.blank? + basename, ext = problem.description_filename.split('.') + options[:controller] = 'tasks' + options[:action] = 'view' + options[:file] = basename + options[:ext] = ext + return link_to name, options + else + return '' + end + end + end diff --git a/app/models/problem.rb b/app/models/problem.rb --- a/app/models/problem.rb +++ b/app/models/problem.rb @@ -10,7 +10,7 @@ DEFAULT_TIME_LIMIT = 1 DEFAULT_MEMORY_LIMIT = 32 - + def self.find_available_problems find(:all, :conditions => {:available => true}, :order => "date_added DESC") end @@ -47,6 +47,10 @@ return problem, importer.log_msg end + def self.download_file_basedir + return "#{RAILS_ROOT}/data/tasks" + end + protected def self.to_i_or_default(st, default) diff --git a/app/views/main/_problem.html.erb b/app/views/main/_problem.html.erb --- a/app/views/main/_problem.html.erb +++ b/app/views/main/_problem.html.erb @@ -4,7 +4,7 @@ <%= "#{problem.full_name} (#{problem.name})" %> - <%= link_to "[#{t 'main.problem_desc'}]", problem.url, :popup => true if (problem.url!=nil) and (problem.url!='') %> + <%= link_to_description_if_any "[#{t 'main.problem_desc'}]", problem %> <%= @prob_submissions[problem_counter][:count] %> diff --git a/data/tasks/.gitignore b/data/tasks/.gitignore new file mode 100644 --- /dev/null +++ b/data/tasks/.gitignore @@ -0,0 +1,1 @@ +[a-zA-Z]* diff --git a/db/migrate/20100219014840_add_description_filename_to_problems.rb b/db/migrate/20100219014840_add_description_filename_to_problems.rb new file mode 100644 --- /dev/null +++ b/db/migrate/20100219014840_add_description_filename_to_problems.rb @@ -0,0 +1,9 @@ +class AddDescriptionFilenameToProblems < ActiveRecord::Migration + def self.up + add_column :problems, :description_filename, :string + end + + def self.down + remove_column :problems, :description_filename + 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 => 20100216162940) do +ActiveRecord::Schema.define(:version => 20100219014840) do create_table "announcements", :force => true do |t| t.string "author" @@ -101,7 +101,7 @@ end create_table "problems", :force => true do |t| - t.string "name", :limit => 30 + t.string "name", :limit => 30 t.string "full_name" t.integer "full_score" t.date "date_added" @@ -110,8 +110,9 @@ t.integer "description_id" t.boolean "test_allowed" t.boolean "output_only" - t.integer "level", :default => 0 + t.integer "level", :default => 0 t.datetime "updated_at" + t.string "description_filename" end create_table "rights", :force => true do |t| diff --git a/lib/testdata_importer.rb b/lib/testdata_importer.rb --- a/lib/testdata_importer.rb +++ b/lib/testdata_importer.rb @@ -1,7 +1,7 @@ require 'tmpdir' class TestdataImporter - + attr :log_msg def initialize(problem) @@ -33,6 +33,7 @@ end @log_msg << import_problem_description(dirname) + @log_msg << import_problem_pdf(dirname) return true end @@ -135,4 +136,16 @@ end end + def import_problem_pdf(dirname) + pdf_files = Dir["#{dirname}/*.pdf"] + if pdf_files.length != 0 + filename = pdf_files[0] + out_filename = "#{Problem.download_file_basedir}/#{@problem.name}.pdf" + File.rename(filename, out_filename) + @problem.description_filename = "#{@problem.name}.pdf" + @problem.save + return "\nProblem pdf imported from #{filename}." + end + end + end