Description:
added codejom_status model for computing level with basic user update
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r219:95cc49d72ca8 - - 9 files changed: 79 inserted, 1 deleted

@@ -0,0 +1,5
1 + class CodejomStatus < ActiveRecord::Base
2 +
3 + belongs_to :user
4 +
5 + end
@@ -0,0 +1,15
1 + class CreateCodejomStatuses < ActiveRecord::Migration
2 + def self.up
3 + create_table :codejom_statuses do |t|
4 + t.integer :user_id
5 + t.boolean :alive
6 + t.integer :num_problems_passed
7 +
8 + t.timestamps
9 + end
10 + end
11 +
12 + def self.down
13 + drop_table :codejom_statuses
14 + end
15 + end
@@ -0,0 +1,11
1 + # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2 +
3 + one:
4 + user_id: 1
5 + alive: false
6 + num_problems_passed: 1
7 +
8 + two:
9 + user_id: 1
10 + alive: false
11 + num_problems_passed: 1
@@ -0,0 +1,8
1 + require 'test_helper'
2 +
3 + class CodejomStatusTest < ActiveSupport::TestCase
4 + # Replace this with your real tests.
5 + test "the truth" do
6 + assert true
7 + end
8 + end
@@ -195,96 +195,97
195 end
195 end
196
196
197 def submit_solution
197 def submit_solution
198 problem = Problem.find(params[:id])
198 problem = Problem.find(params[:id])
199 user = User.find(session[:user_id])
199 user = User.find(session[:user_id])
200 recent_assignment = user.get_recent_test_pair_assignment_for problem
200 recent_assignment = user.get_recent_test_pair_assignment_for problem
201 if recent_assignment == nil
201 if recent_assignment == nil
202 flash[:notice] = 'You have not requested for any input data for this problem. Please download an input first.'
202 flash[:notice] = 'You have not requested for any input data for this problem. Please download an input first.'
203 redirect_to :action => 'list' and return
203 redirect_to :action => 'list' and return
204 end
204 end
205
205
206 if recent_assignment.submitted
206 if recent_assignment.submitted
207 flash[:notice] = 'You have already submitted an incorrect solution for this input. Please download a new input data.'
207 flash[:notice] = 'You have already submitted an incorrect solution for this input. Please download a new input data.'
208 redirect_to :action => 'list' and return
208 redirect_to :action => 'list' and return
209 end
209 end
210
210
211 if params[:file] == nil
211 if params[:file] == nil
212 flash[:notice] = 'You have not submitted any output.'
212 flash[:notice] = 'You have not submitted any output.'
213 redirect_to :action => 'list' and return
213 redirect_to :action => 'list' and return
214 end
214 end
215
215
216 submitted_solution = params[:file].read
216 submitted_solution = params[:file].read
217 test_pair = recent_assignment.test_pair
217 test_pair = recent_assignment.test_pair
218 passed = test_pair.grade(submitted_solution)
218 passed = test_pair.grade(submitted_solution)
219 points = passed ? 100 : 0
219 points = passed ? 100 : 0
220 submission = Submission.new(:user => user,
220 submission = Submission.new(:user => user,
221 :problem => problem,
221 :problem => problem,
222 :source => submitted_solution,
222 :source => submitted_solution,
223 :source_filename => params['file'].original_filename,
223 :source_filename => params['file'].original_filename,
224 :language_id => 0,
224 :language_id => 0,
225 :submitted_at => Time.new.gmtime,
225 :submitted_at => Time.new.gmtime,
226 :graded_at => Time.new.gmtime,
226 :graded_at => Time.new.gmtime,
227 :points => points)
227 :points => points)
228 submission.save
228 submission.save
229 recent_assignment.submitted = true
229 recent_assignment.submitted = true
230 recent_assignment.save
230 recent_assignment.save
231
231
232 status = user.get_submission_status_for(problem)
232 status = user.get_submission_status_for(problem)
233 if status == nil
233 if status == nil
234 status = SubmissionStatus.new :user => user, :problem => problem, :submission_count => 0
234 status = SubmissionStatus.new :user => user, :problem => problem, :submission_count => 0
235 end
235 end
236
236
237 status.submission_count += 1
237 status.submission_count += 1
238 status.passed = passed
238 status.passed = passed
239 status.save
239 status.save
240
240
241 if passed
241 if passed
242 flash[:notice] = 'Correct solution.'
242 flash[:notice] = 'Correct solution.'
243 + user.update_codejom_status
243 else
244 else
244 flash[:notice] = 'Incorrect solution.'
245 flash[:notice] = 'Incorrect solution.'
245 end
246 end
246 redirect_to :action => 'list'
247 redirect_to :action => 'list'
247 end
248 end
248
249
249 protected
250 protected
250
251
251 def prepare_announcements(recent=nil)
252 def prepare_announcements(recent=nil)
252 if Configuration.show_tasks_to?(@user)
253 if Configuration.show_tasks_to?(@user)
253 @announcements = Announcement.find_published(true)
254 @announcements = Announcement.find_published(true)
254 else
255 else
255 @announcements = Announcement.find_published
256 @announcements = Announcement.find_published
256 end
257 end
257 if recent!=nil
258 if recent!=nil
258 recent_id = recent.to_i
259 recent_id = recent.to_i
259 @announcements = @announcements.find_all { |a| a.id > recent_id }
260 @announcements = @announcements.find_all { |a| a.id > recent_id }
260 end
261 end
261 end
262 end
262
263
263 def prepare_list_information
264 def prepare_list_information
264 @user = User.find(session[:user_id])
265 @user = User.find(session[:user_id])
265
266
266 all_problems = Problem.find_available_problems
267 all_problems = Problem.find_available_problems
267
268
268 passed = {}
269 passed = {}
269 sub_count = {}
270 sub_count = {}
270 @user.submission_statuses.each do |status|
271 @user.submission_statuses.each do |status|
271 if status.passed
272 if status.passed
272 passed[status.problem_id] = true
273 passed[status.problem_id] = true
273 end
274 end
274 sub_count[status.problem_id] = status.submission_count
275 sub_count[status.problem_id] = status.submission_count
275 end
276 end
276
277
277 @problems = all_problems.reject { |problem| passed.has_key? problem.id }
278 @problems = all_problems.reject { |problem| passed.has_key? problem.id }
278
279
279 @prob_submissions = Array.new
280 @prob_submissions = Array.new
280 @problems.each do |p|
281 @problems.each do |p|
281 if sub_count.has_key? p.id
282 if sub_count.has_key? p.id
282 @prob_submissions << { :count => sub_count[p.id] }
283 @prob_submissions << { :count => sub_count[p.id] }
283 else
284 else
284 @prob_submissions << { :count => 0 }
285 @prob_submissions << { :count => 0 }
285 end
286 end
286 end
287 end
287 prepare_announcements
288 prepare_announcements
288 end
289 end
289
290
290 def check_viewability
291 def check_viewability
@@ -1,79 +1,84
1 class Problem < ActiveRecord::Base
1 class Problem < ActiveRecord::Base
2
2
3 belongs_to :description
3 belongs_to :description
4 has_many :test_pairs, :dependent => :delete_all
4 has_many :test_pairs, :dependent => :delete_all
5
5
6 validates_presence_of :name
6 validates_presence_of :name
7 validates_format_of :name, :with => /^\w+$/
7 validates_format_of :name, :with => /^\w+$/
8 validates_presence_of :full_name
8 validates_presence_of :full_name
9
9
10 DEFAULT_TIME_LIMIT = 1
10 DEFAULT_TIME_LIMIT = 1
11 DEFAULT_MEMORY_LIMIT = 32
11 DEFAULT_MEMORY_LIMIT = 32
12
12
13 def test_pair_count
13 def test_pair_count
14 @test_pair_count ||= test_pairs.size
14 @test_pair_count ||= test_pairs.size
15 end
15 end
16
16
17 def uses_random_test_pair?
17 def uses_random_test_pair?
18 test_pair_count != 0
18 test_pair_count != 0
19 end
19 end
20
20
21 def random_test_pair(forbidden_numbers=nil)
21 def random_test_pair(forbidden_numbers=nil)
22 begin
22 begin
23 test_num = 1 + rand(test_pair_count)
23 test_num = 1 + rand(test_pair_count)
24 end while forbidden_numbers!=nil and forbidden_numbers.include? test_num
24 end while forbidden_numbers!=nil and forbidden_numbers.include? test_num
25 test_pairs.find_by_number test_num
25 test_pairs.find_by_number test_num
26 end
26 end
27
27
28 def self.find_available_problems
28 def self.find_available_problems
29 find(:all, :conditions => {:available => true}, :order => "date_added DESC")
29 find(:all, :conditions => {:available => true}, :order => "date_added DESC")
30 end
30 end
31
31
32 + # TODO: may try to optimize this using cache
33 + def self.available_problem_count
34 + return Problem.find_available_problems.length
35 + end
36 +
32 def self.create_from_import_form_params(params, old_problem=nil)
37 def self.create_from_import_form_params(params, old_problem=nil)
33 problem = old_problem || Problem.new
38 problem = old_problem || Problem.new
34 import_params = Problem.extract_params_and_check(params, problem)
39 import_params = Problem.extract_params_and_check(params, problem)
35
40
36 if not problem.valid?
41 if not problem.valid?
37 return problem, 'Error importing'
42 return problem, 'Error importing'
38 end
43 end
39
44
40 problem.full_score = 100
45 problem.full_score = 100
41 problem.date_added = Time.new
46 problem.date_added = Time.new
42 problem.test_allowed = true
47 problem.test_allowed = true
43 problem.output_only = false
48 problem.output_only = false
44 problem.available = false
49 problem.available = false
45
50
46 if not problem.save
51 if not problem.save
47 return problem, 'Error importing'
52 return problem, 'Error importing'
48 end
53 end
49
54
50 import_to_db = params.has_key? :import_to_db
55 import_to_db = params.has_key? :import_to_db
51
56
52 importer = TestdataImporter.new(problem)
57 importer = TestdataImporter.new(problem)
53
58
54 if not importer.import_from_file(import_params[:file],
59 if not importer.import_from_file(import_params[:file],
55 import_params[:time_limit],
60 import_params[:time_limit],
56 import_params[:memory_limit],
61 import_params[:memory_limit],
57 import_to_db)
62 import_to_db)
58 problem.errors.add_to_base('Import error.')
63 problem.errors.add_to_base('Import error.')
59 end
64 end
60
65
61 return problem, importer.log_msg
66 return problem, importer.log_msg
62 end
67 end
63
68
64 protected
69 protected
65
70
66 def self.to_i_or_default(st, default)
71 def self.to_i_or_default(st, default)
67 if st!=''
72 if st!=''
68 st.to_i
73 st.to_i
69 else
74 else
70 default
75 default
71 end
76 end
72 end
77 end
73
78
74 def self.extract_params_and_check(params, problem)
79 def self.extract_params_and_check(params, problem)
75 time_limit = Problem.to_i_or_default(params[:time_limit],
80 time_limit = Problem.to_i_or_default(params[:time_limit],
76 DEFAULT_TIME_LIMIT)
81 DEFAULT_TIME_LIMIT)
77 memory_limit = Problem.to_i_or_default(params[:memory_limit],
82 memory_limit = Problem.to_i_or_default(params[:memory_limit],
78 DEFAULT_MEMORY_LIMIT)
83 DEFAULT_MEMORY_LIMIT)
79
84
@@ -1,74 +1,77
1 require 'digest/sha1'
1 require 'digest/sha1'
2
2
3 class User < ActiveRecord::Base
3 class User < ActiveRecord::Base
4
4
5 has_and_belongs_to_many :roles
5 has_and_belongs_to_many :roles
6
6
7 has_many :test_requests, :order => "submitted_at DESC"
7 has_many :test_requests, :order => "submitted_at DESC"
8
8
9 has_many :messages,
9 has_many :messages,
10 :class_name => "Message",
10 :class_name => "Message",
11 :foreign_key => "sender_id",
11 :foreign_key => "sender_id",
12 :order => 'created_at DESC'
12 :order => 'created_at DESC'
13
13
14 has_many :replied_messages,
14 has_many :replied_messages,
15 :class_name => "Message",
15 :class_name => "Message",
16 :foreign_key => "receiver_id",
16 :foreign_key => "receiver_id",
17 :order => 'created_at DESC'
17 :order => 'created_at DESC'
18
18
19 has_many :test_pair_assignments, :dependent => :delete_all
19 has_many :test_pair_assignments, :dependent => :delete_all
20 has_many :submission_statuses
20 has_many :submission_statuses
21
21
22 has_one :contest_stat, :class_name => "UserContestStat"
22 has_one :contest_stat, :class_name => "UserContestStat"
23
23
24 belongs_to :site
24 belongs_to :site
25 belongs_to :country
25 belongs_to :country
26
26
27 + # For Code Jom
28 + has_one :codejom_status
29 +
27 named_scope :activated_users, :conditions => {:activated => true}
30 named_scope :activated_users, :conditions => {:activated => true}
28
31
29 validates_presence_of :login
32 validates_presence_of :login
30 validates_uniqueness_of :login
33 validates_uniqueness_of :login
31 validates_format_of :login, :with => /^[\_A-Za-z0-9]+$/
34 validates_format_of :login, :with => /^[\_A-Za-z0-9]+$/
32 validates_length_of :login, :within => 3..30
35 validates_length_of :login, :within => 3..30
33
36
34 validates_presence_of :full_name
37 validates_presence_of :full_name
35 validates_length_of :full_name, :minimum => 1
38 validates_length_of :full_name, :minimum => 1
36
39
37 validates_presence_of :password, :if => :password_required?
40 validates_presence_of :password, :if => :password_required?
38 validates_length_of :password, :within => 4..20, :if => :password_required?
41 validates_length_of :password, :within => 4..20, :if => :password_required?
39 validates_confirmation_of :password, :if => :password_required?
42 validates_confirmation_of :password, :if => :password_required?
40
43
41 validates_format_of :email,
44 validates_format_of :email,
42 :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,
45 :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,
43 :if => :email_validation?
46 :if => :email_validation?
44 validate :uniqueness_of_email_from_activated_users,
47 validate :uniqueness_of_email_from_activated_users,
45 :if => :email_validation?
48 :if => :email_validation?
46 validate :enough_time_interval_between_same_email_registrations,
49 validate :enough_time_interval_between_same_email_registrations,
47 :if => :email_validation?
50 :if => :email_validation?
48
51
49 # these are for ytopc
52 # these are for ytopc
50 # disable for now
53 # disable for now
51 #validates_presence_of :province
54 #validates_presence_of :province
52
55
53 attr_accessor :password
56 attr_accessor :password
54
57
55 before_save :encrypt_new_password
58 before_save :encrypt_new_password
56 before_save :assign_default_site
59 before_save :assign_default_site
57
60
58 def self.authenticate(login, password)
61 def self.authenticate(login, password)
59 user = find_by_login(login)
62 user = find_by_login(login)
60 return user if user && user.authenticated?(password)
63 return user if user && user.authenticated?(password)
61 end
64 end
62
65
63 def authenticated?(password)
66 def authenticated?(password)
64 if self.activated
67 if self.activated
65 hashed_password == User.encrypt(password,self.salt)
68 hashed_password == User.encrypt(password,self.salt)
66 else
69 else
67 false
70 false
68 end
71 end
69 end
72 end
70
73
71 def admin?
74 def admin?
72 self.roles.detect {|r| r.name == 'admin' }
75 self.roles.detect {|r| r.name == 'admin' }
73 end
76 end
74
77
@@ -176,96 +179,114
176 # Contest information
179 # Contest information
177
180
178 def contest_time_left
181 def contest_time_left
179 if Configuration.contest_mode?
182 if Configuration.contest_mode?
180 return nil if site==nil
183 return nil if site==nil
181 return site.time_left
184 return site.time_left
182 elsif Configuration.indv_contest_mode?
185 elsif Configuration.indv_contest_mode?
183 time_limit = Configuration.contest_time_limit
186 time_limit = Configuration.contest_time_limit
184 if contest_stat==nil
187 if contest_stat==nil
185 return (Time.now.gmtime + time_limit) - Time.now.gmtime
188 return (Time.now.gmtime + time_limit) - Time.now.gmtime
186 else
189 else
187 finish_time = contest_stat.started_at + time_limit
190 finish_time = contest_stat.started_at + time_limit
188 current_time = Time.now.gmtime
191 current_time = Time.now.gmtime
189 if current_time > finish_time
192 if current_time > finish_time
190 return 0
193 return 0
191 else
194 else
192 return finish_time - current_time
195 return finish_time - current_time
193 end
196 end
194 end
197 end
195 else
198 else
196 return nil
199 return nil
197 end
200 end
198 end
201 end
199
202
200 def contest_finished?
203 def contest_finished?
201 if Configuration.contest_mode?
204 if Configuration.contest_mode?
202 return false if site==nil
205 return false if site==nil
203 return site.finished?
206 return site.finished?
204 elsif Configuration.indv_contest_mode?
207 elsif Configuration.indv_contest_mode?
205 time_limit = Configuration.contest_time_limit
208 time_limit = Configuration.contest_time_limit
206
209
207 return false if contest_stat==nil
210 return false if contest_stat==nil
208
211
209 return contest_time_left == 0
212 return contest_time_left == 0
210 else
213 else
211 return false
214 return false
212 end
215 end
213 end
216 end
214
217
215 def contest_started?
218 def contest_started?
216 if Configuration.contest_mode?
219 if Configuration.contest_mode?
217 return true if site==nil
220 return true if site==nil
218 return site.started
221 return site.started
219 else
222 else
220 return true
223 return true
221 end
224 end
222 end
225 end
223
226
227 + # For Code Jom
228 + def update_codejom_status
229 + status = codejom_status || CodejomStatus.new(:user => self)
230 + problem_count = Problem.available_problem_count
231 + status.num_problems_passed = (self.submission_statuses.find_all {|s| s.passed}).length
232 + status.alive = (problem_count - (status.num_problems_passed)) <= CODEJOM_MAX_ALIVE_LEVEL
233 + status.save
234 + end
235 +
236 + def codejom_level
237 + problem_count = Problem.available_problem_count
238 + if codejom_status!=nil
239 + return problem_count - codejom_status.num_problems_passed
240 + else
241 + return problem_count
242 + end
243 + end
244 +
224 protected
245 protected
225 def encrypt_new_password
246 def encrypt_new_password
226 return if password.blank?
247 return if password.blank?
227 self.salt = (10+rand(90)).to_s
248 self.salt = (10+rand(90)).to_s
228 self.hashed_password = User.encrypt(self.password,self.salt)
249 self.hashed_password = User.encrypt(self.password,self.salt)
229 end
250 end
230
251
231 def assign_default_site
252 def assign_default_site
232 # have to catch error when migrating (because self.site is not available).
253 # have to catch error when migrating (because self.site is not available).
233 begin
254 begin
234 if self.site==nil
255 if self.site==nil
235 self.site = Site.find_by_name('default')
256 self.site = Site.find_by_name('default')
236 if self.site==nil
257 if self.site==nil
237 self.site = Site.find(1) # when 'default has be renamed'
258 self.site = Site.find(1) # when 'default has be renamed'
238 end
259 end
239 end
260 end
240 rescue
261 rescue
241 end
262 end
242 end
263 end
243
264
244 def password_required?
265 def password_required?
245 self.hashed_password.blank? || !self.password.blank?
266 self.hashed_password.blank? || !self.password.blank?
246 end
267 end
247
268
248 def self.encrypt(string,salt)
269 def self.encrypt(string,salt)
249 Digest::SHA1.hexdigest(salt + string)
270 Digest::SHA1.hexdigest(salt + string)
250 end
271 end
251
272
252 def uniqueness_of_email_from_activated_users
273 def uniqueness_of_email_from_activated_users
253 user = User.activated_users.find_by_email(self.email)
274 user = User.activated_users.find_by_email(self.email)
254 if user and (user.login != self.login)
275 if user and (user.login != self.login)
255 self.errors.add_to_base("Email has already been taken")
276 self.errors.add_to_base("Email has already been taken")
256 end
277 end
257 end
278 end
258
279
259 def enough_time_interval_between_same_email_registrations
280 def enough_time_interval_between_same_email_registrations
260 return if !self.new_record?
281 return if !self.new_record?
261 return if self.activated
282 return if self.activated
262 open_user = User.find_by_email(self.email,
283 open_user = User.find_by_email(self.email,
263 :order => 'created_at DESC')
284 :order => 'created_at DESC')
264 if open_user and open_user.created_at and
285 if open_user and open_user.created_at and
265 (open_user.created_at > Time.now.gmtime - 5.minutes)
286 (open_user.created_at > Time.now.gmtime - 5.minutes)
266 self.errors.add_to_base("There are already unactivated registrations with this e-mail address (please wait for 5 minutes)")
287 self.errors.add_to_base("There are already unactivated registrations with this e-mail address (please wait for 5 minutes)")
267 end
288 end
268 end
289 end
269
290
270 def email_validation?
291 def email_validation?
271 begin
292 begin
@@ -58,48 +58,52
58
58
59 end
59 end
60
60
61 # Add new inflection rules using the following format
61 # Add new inflection rules using the following format
62 # (all these examples are active by default):
62 # (all these examples are active by default):
63 # Inflector.inflections do |inflect|
63 # Inflector.inflections do |inflect|
64 # inflect.plural /^(ox)$/i, '\1en'
64 # inflect.plural /^(ox)$/i, '\1en'
65 # inflect.singular /^(ox)en/i, '\1'
65 # inflect.singular /^(ox)en/i, '\1'
66 # inflect.irregular 'person', 'people'
66 # inflect.irregular 'person', 'people'
67 # inflect.uncountable %w( fish sheep )
67 # inflect.uncountable %w( fish sheep )
68 # end
68 # end
69
69
70 # Add new mime types for use in respond_to blocks:
70 # Add new mime types for use in respond_to blocks:
71 # Mime::Type.register "text/richtext", :rtf
71 # Mime::Type.register "text/richtext", :rtf
72 # Mime::Type.register "application/x-mobile", :mobile
72 # Mime::Type.register "application/x-mobile", :mobile
73
73
74 # Include your application configuration below
74 # Include your application configuration below
75
75
76 # If you want to manage graders through web interface, set the path to
76 # If you want to manage graders through web interface, set the path to
77 # the grader directory below. This dir is where raw, ev, ev-exam,
77 # the grader directory below. This dir is where raw, ev, ev-exam,
78 # scripts reside. All grader scripts will be in
78 # scripts reside. All grader scripts will be in
79 # #{GRADER_ROOT_DIR}/scripts.
79 # #{GRADER_ROOT_DIR}/scripts.
80 GRADER_ROOT_DIR = ''
80 GRADER_ROOT_DIR = ''
81
81
82 # These are where inputs and outputs of test requests are stored
82 # These are where inputs and outputs of test requests are stored
83 TEST_REQUEST_INPUT_FILE_DIR = RAILS_ROOT + '/data/test_request/input'
83 TEST_REQUEST_INPUT_FILE_DIR = RAILS_ROOT + '/data/test_request/input'
84 TEST_REQUEST_OUTPUT_FILE_DIR = RAILS_ROOT + '/data/test_request/output'
84 TEST_REQUEST_OUTPUT_FILE_DIR = RAILS_ROOT + '/data/test_request/output'
85
85
86 # To use ANALYSIS MODE, provide the testcases/testruns breakdown,
86 # To use ANALYSIS MODE, provide the testcases/testruns breakdown,
87 # and the directory of the grading result (usually in judge's dir).
87 # and the directory of the grading result (usually in judge's dir).
88 TASK_GRADING_INFO_FILENAME = RAILS_ROOT + '/config/tasks.yml'
88 TASK_GRADING_INFO_FILENAME = RAILS_ROOT + '/config/tasks.yml'
89
89
90 # TODO: change this to where results are kept.
90 # TODO: change this to where results are kept.
91 GRADING_RESULT_DIR = 'RESULT-DIR'
91 GRADING_RESULT_DIR = 'RESULT-DIR'
92
92
93 # Change this to allow importing testdata into database as test-pairs.
93 # Change this to allow importing testdata into database as test-pairs.
94 # This is mainly for Code Jom contest.
94 # This is mainly for Code Jom contest.
95 ALLOW_TEST_PAIR_IMPORT = false
95 ALLOW_TEST_PAIR_IMPORT = false
96
96
97 # Uncomment so that the system validates user e-mails
97 # Uncomment so that the system validates user e-mails
98 # VALIDATE_USER_EMAILS = true
98 # VALIDATE_USER_EMAILS = true
99
99
100 # Uncomment so that Apache X-Sendfile is used when delivering files
100 # Uncomment so that Apache X-Sendfile is used when delivering files
101 # (e.g., in /tasks/view).
101 # (e.g., in /tasks/view).
102 # USE_APACHE_XSENDFILE = true
102 # USE_APACHE_XSENDFILE = true
103
103
104 # Uncomment so that configuration is read only once when the server is loaded
104 # Uncomment so that configuration is read only once when the server is loaded
105 # Configuration.enable_caching
105 # Configuration.enable_caching
106 +
107 + # OPTIONS FOR CODE JOM
108 + # --------------------
109 + CODEJOM_MAX_ALIVE_LEVEL = 10
@@ -1,72 +1,80
1 # This file is auto-generated from the current state of the database. Instead of editing this file,
1 # This file is auto-generated from the current state of the database. Instead of editing this file,
2 # please use the migrations feature of Active Record to incrementally modify your database, and
2 # please use the migrations feature of Active Record to incrementally modify your database, and
3 # then regenerate this schema definition.
3 # then regenerate this schema definition.
4 #
4 #
5 # Note that this schema.rb definition is the authoritative source for your database schema. If you need
5 # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6 # to create the application database on another system, you should be using db:schema:load, not running
6 # to create the application database on another system, you should be using db:schema:load, not running
7 # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
7 # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8 # you'll amass, the slower it'll run and the greater likelihood for issues).
8 # you'll amass, the slower it'll run and the greater likelihood for issues).
9 #
9 #
10 # It's strongly recommended to check this file into your version control system.
10 # It's strongly recommended to check this file into your version control system.
11
11
12 - ActiveRecord::Schema.define(:version => 20100124054458) do
12 + ActiveRecord::Schema.define(:version => 20100124191250) do
13
13
14 create_table "announcements", :force => true do |t|
14 create_table "announcements", :force => true do |t|
15 t.string "author"
15 t.string "author"
16 t.text "body"
16 t.text "body"
17 t.boolean "published"
17 t.boolean "published"
18 t.datetime "created_at"
18 t.datetime "created_at"
19 t.datetime "updated_at"
19 t.datetime "updated_at"
20 t.boolean "frontpage", :default => false
20 t.boolean "frontpage", :default => false
21 t.boolean "contest_only", :default => false
21 t.boolean "contest_only", :default => false
22 t.string "title"
22 t.string "title"
23 end
23 end
24
24
25 + create_table "codejom_statuses", :force => true do |t|
26 + t.integer "user_id"
27 + t.boolean "alive"
28 + t.integer "num_problems_passed"
29 + t.datetime "created_at"
30 + t.datetime "updated_at"
31 + end
32 +
25 create_table "configurations", :force => true do |t|
33 create_table "configurations", :force => true do |t|
26 t.string "key"
34 t.string "key"
27 t.string "value_type"
35 t.string "value_type"
28 t.string "value"
36 t.string "value"
29 t.datetime "created_at"
37 t.datetime "created_at"
30 t.datetime "updated_at"
38 t.datetime "updated_at"
31 t.text "description"
39 t.text "description"
32 end
40 end
33
41
34 create_table "countries", :force => true do |t|
42 create_table "countries", :force => true do |t|
35 t.string "name"
43 t.string "name"
36 t.datetime "created_at"
44 t.datetime "created_at"
37 t.datetime "updated_at"
45 t.datetime "updated_at"
38 end
46 end
39
47
40 create_table "descriptions", :force => true do |t|
48 create_table "descriptions", :force => true do |t|
41 t.text "body"
49 t.text "body"
42 t.boolean "markdowned"
50 t.boolean "markdowned"
43 t.datetime "created_at"
51 t.datetime "created_at"
44 t.datetime "updated_at"
52 t.datetime "updated_at"
45 end
53 end
46
54
47 create_table "grader_processes", :force => true do |t|
55 create_table "grader_processes", :force => true do |t|
48 t.string "host", :limit => 20
56 t.string "host", :limit => 20
49 t.integer "pid"
57 t.integer "pid"
50 t.string "mode"
58 t.string "mode"
51 t.boolean "active"
59 t.boolean "active"
52 t.datetime "created_at"
60 t.datetime "created_at"
53 t.datetime "updated_at"
61 t.datetime "updated_at"
54 t.integer "task_id"
62 t.integer "task_id"
55 t.string "task_type"
63 t.string "task_type"
56 t.boolean "terminated"
64 t.boolean "terminated"
57 end
65 end
58
66
59 add_index "grader_processes", ["host", "pid"], :name => "index_grader_processes_on_ip_and_pid"
67 add_index "grader_processes", ["host", "pid"], :name => "index_grader_processes_on_ip_and_pid"
60
68
61 create_table "languages", :force => true do |t|
69 create_table "languages", :force => true do |t|
62 t.string "name", :limit => 10
70 t.string "name", :limit => 10
63 t.string "pretty_name"
71 t.string "pretty_name"
64 t.string "ext", :limit => 10
72 t.string "ext", :limit => 10
65 t.string "common_ext"
73 t.string "common_ext"
66 end
74 end
67
75
68 create_table "messages", :force => true do |t|
76 create_table "messages", :force => true do |t|
69 t.integer "sender_id"
77 t.integer "sender_id"
70 t.integer "receiver_id"
78 t.integer "receiver_id"
71 t.integer "replying_message_id"
79 t.integer "replying_message_id"
72 t.text "body"
80 t.text "body"
You need to be logged in to leave comments. Login now