Show More
Commit Description:
my fault, fixing auto full score to properly handle subtask case
Commit Description:
my fault, fixing auto full score to properly handle subtask case
File last commit:
Show/Diff file:
Action:
app/models/user.rb | 323 lines | 8.3 KiB | text/x-ruby | RubyLexer |
pramook
initial commit...
r0 require 'digest/sha1'
class User < ActiveRecord::Base
has_and_belongs_to_many :roles
jittat
[web] improving readability of test_interface, re: ticket #10...
r64 has_many :test_requests, :order => "submitted_at DESC"
jittat
test interface upload...
r36
jittat
[web] added message feature...
r102 has_many :messages,
:class_name => "Message",
:foreign_key => "sender_id",
:order => 'created_at DESC'
has_many :replied_messages,
:class_name => "Message",
:foreign_key => "receiver_id",
:order => 'created_at DESC'
Jittat Fakcharoenphol
fixed indv contest timing bug (same as in codejom), added user contest stat reset
r247 has_one :contest_stat, :class_name => "UserContestStat", :dependent => :destroy
Jittat Fakcharoenphol
added individual contest mode
r217
jittat
[web] added site and time out basic functionality...
r85 belongs_to :site
jittat
[web] import from site...
r106 belongs_to :country
jittat
[web] added site and time out basic functionality...
r85
Jittat Fakcharoenphol
shows only enabled contests, ordered by name
r285 has_and_belongs_to_many :contests, :uniq => true, :order => 'name'
Jittat Fakcharoenphol
created join tables for contests and users and problems
r268
Jittat Fakcharoenphol
added verify plug-in, fixed form_for, form_tag in views, changed named_scope to scope
r319 scope :activated_users, :conditions => {:activated => true}
jittat
more work on registration...
r157
pramook
initial commit...
r0 validates_presence_of :login
jittat
more work on registration...
r157 validates_uniqueness_of :login
jittat
MERGED 308:HEAD from http://theory.cpe.ku.ac.th/grader/web/branches/ytopc08-2/, removed some registration info...
r162 validates_format_of :login, :with => /^[\_A-Za-z0-9]+$/
validates_length_of :login, :within => 3..30
jittat
more work on registration...
r157
pramook
initial commit...
r0 validates_presence_of :full_name
jittat
disable fullname editing...
r23 validates_length_of :full_name, :minimum => 1
pramook
initial commit...
r0
validates_presence_of :password, :if => :password_required?
validates_length_of :password, :within => 4..20, :if => :password_required?
validates_confirmation_of :password, :if => :password_required?
jittat
MERGED 308:HEAD from http://theory.cpe.ku.ac.th/grader/web/branches/ytopc08-2/, removed some registration info...
r162 validates_format_of :email,
:with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,
:if => :email_validation?
validate :uniqueness_of_email_from_activated_users,
:if => :email_validation?
validate :enough_time_interval_between_same_email_registrations,
:if => :email_validation?
jittat
more work on registration...
r157
jittat
MERGED 308:HEAD from http://theory.cpe.ku.ac.th/grader/web/branches/ytopc08-2/, removed some registration info...
r162 # these are for ytopc
# disable for now
#validates_presence_of :province
jittat
more work on registration...
r157
pramook
initial commit...
r0 attr_accessor :password
before_save :encrypt_new_password
jittat
MERGED 308:HEAD from http://theory.cpe.ku.ac.th/grader/web/branches/ytopc08-2/, removed some registration info...
r162 before_save :assign_default_site
Jittat Fakcharoenphol
added default contest
r308 before_save :assign_default_contest
pramook
initial commit...
r0
Jittat Fakcharoenphol
added pagination to user_admin, using will_paginate plugin
r299 # this is for will_paginate
cattr_reader :per_page
@@per_page = 50
pramook
initial commit...
r0 def self.authenticate(login, password)
user = find_by_login(login)
return user if user && user.authenticated?(password)
end
def authenticated?(password)
jittat
start working on e-mail registration...
r155 if self.activated
hashed_password == User.encrypt(password,self.salt)
else
false
end
pramook
initial commit...
r0 end
def admin?
self.roles.detect {|r| r.name == 'admin' }
end
jittat
add_email_to_user, fix empty problem for_in_place_editing...
r18 def email_for_editing
jittat
disable fullname editing...
r23 if self.email==nil
"(unknown)"
elsif self.email==''
"(blank)"
else
jittat
add_email_to_user, fix empty problem for_in_place_editing...
r18 self.email
end
end
def email_for_editing=(e)
self.email=e
end
def alias_for_editing
jittat
disable fullname editing...
r23 if self.alias==nil
"(unknown)"
elsif self.alias==''
"(blank)"
else
jittat
add_email_to_user, fix empty problem for_in_place_editing...
r18 self.alias
end
end
def alias_for_editing=(e)
self.alias=e
end
jittat
start working on e-mail registration...
r155 def activation_key
jittat
Merged online-registration branch changes r297:303 into the trunk...
r158 if self.hashed_password==nil
encrypt_new_password
end
jittat
start working on e-mail registration...
r155 Digest::SHA1.hexdigest(self.hashed_password)[0..7]
end
def verify_activation_key(key)
key == activation_key
end
jittat
more work on registration...
r157 def self.random_password(length=5)
chars = 'abcdefghjkmnopqrstuvwxyz'
password = ''
length.times { password << chars[rand(chars.length - 1)] }
password
end
jittat
added random user passwords, better user creation by list....
r200 def self.find_non_admin_with_prefix(prefix='')
users = User.find(:all)
return users.find_all { |u| !(u.admin?) and u.login.index(prefix)==0 }
end
Jittat Fakcharoenphol
added individual contest mode
r217 # Contest information
Jittat Fakcharoenphol
lists users in each contest. individual user contest management moved to each contest user list page
r297 def self.find_users_with_no_contest()
users = User.find(:all)
return users.find_all { |u| u.contests.length == 0 }
end
Jittat Fakcharoenphol
added individual contest mode
r217 def contest_time_left
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if GraderConfiguration.contest_mode?
Jittat Fakcharoenphol
added individual contest mode
r217 return nil if site==nil
return site.time_left
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 elsif GraderConfiguration.indv_contest_mode?
time_limit = GraderConfiguration.contest_time_limit
Jittat Fakcharoenphol
started cleaning up tests, fixed fixtures loading error, removed error when contest time limit is uninitialized
r275 if time_limit == nil
return nil
end
Jittat Fakcharoenphol
a cleaner, testable way to log out user after contest changed
r295 if contest_stat==nil or contest_stat.started_at==nil
Jittat Fakcharoenphol
added individual contest mode
r217 return (Time.now.gmtime + time_limit) - Time.now.gmtime
else
finish_time = contest_stat.started_at + time_limit
current_time = Time.now.gmtime
if current_time > finish_time
return 0
else
return finish_time - current_time
end
end
else
return nil
end
end
def contest_finished?
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if GraderConfiguration.contest_mode?
Jittat Fakcharoenphol
added individual contest mode
r217 return false if site==nil
return site.finished?
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 elsif GraderConfiguration.indv_contest_mode?
Jittat Fakcharoenphol
logs out users after contests changed
r294 return false if self.contest_stat(true)==nil
Jittat Fakcharoenphol
added individual contest mode
r217 return contest_time_left == 0
else
return false
end
end
def contest_started?
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if GraderConfiguration.indv_contest_mode?
Jittat Fakcharoenphol
shows contest start confirmation for indv contest
r302 stat = self.contest_stat
return ((stat != nil) and (stat.started_at != nil))
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 elsif GraderConfiguration.contest_mode?
Jittat Fakcharoenphol
added individual contest mode
r217 return true if site==nil
return site.started
else
return true
end
end
Jittat Fakcharoenphol
started cleaning up tests, fixed fixtures loading error, removed error when contest time limit is uninitialized
r275 def update_start_time
stat = self.contest_stat
Jittat Fakcharoenphol
a cleaner, testable way to log out user after contest changed
r295 if stat == nil or stat.started_at == nil
stat ||= UserContestStat.new(:user => self)
stat.started_at = Time.now.gmtime
Jittat Fakcharoenphol
started cleaning up tests, fixed fixtures loading error, removed error when contest time limit is uninitialized
r275 stat.save
end
end
Jittat Fakcharoenphol
added contest problem access control
r282 def problem_in_user_contests?(problem)
problem_contests = problem.contests.all
if problem_contests.length == 0 # this is public contest
return true
end
contests.each do |contest|
if problem_contests.find {|c| c.id == contest.id }
return true
end
end
return false
end
Jittat Fakcharoenphol
controllers get available problems from current user
r288 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
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if not GraderConfiguration.multicontests?
Jittat Fakcharoenphol
controllers get available problems from current user
r288 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
Jittat Fakcharoenphol
added contest problem access control
r282 def can_view_problem?(problem)
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if not GraderConfiguration.multicontests?
Jittat Fakcharoenphol
added contest problem access control
r282 return problem.available
else
return problem_in_user_contests? problem
end
end
jittat
add_email_to_user, fix empty problem for_in_place_editing...
r18 protected
pramook
initial commit...
r0 def encrypt_new_password
return if password.blank?
self.salt = (10+rand(90)).to_s
jittat
[web] added graders_right_to_admin_role, added a few functional tests: main, user_admin, graders, login...
r58 self.hashed_password = User.encrypt(self.password,self.salt)
pramook
initial commit...
r0 end
jittat
MERGED 308:HEAD from http://theory.cpe.ku.ac.th/grader/web/branches/ytopc08-2/, removed some registration info...
r162 def assign_default_site
# have to catch error when migrating (because self.site is not available).
begin
if self.site==nil
self.site = Site.find_by_name('default')
jittat
MERGED change set 372:399 from ytopc08-2 branch...
r190 if self.site==nil
self.site = Site.find(1) # when 'default has be renamed'
end
jittat
MERGED 308:HEAD from http://theory.cpe.ku.ac.th/grader/web/branches/ytopc08-2/, removed some registration info...
r162 end
rescue
end
end
Jittat Fakcharoenphol
added default contest
r308 def assign_default_contest
# have to catch error when migrating (because self.site is not available).
begin
if self.contests.length == 0
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 default_contest = Contest.find_by_name(GraderConfiguration['contest.default_contest_name'])
Jittat Fakcharoenphol
added default contest
r308 if default_contest
self.contests = [default_contest]
end
end
rescue
end
end
pramook
initial commit...
r0 def password_required?
jittat
[web] added graders_right_to_admin_role, added a few functional tests: main, user_admin, graders, login...
r58 self.hashed_password.blank? || !self.password.blank?
pramook
initial commit...
r0 end
jittat
[web] added graders_right_to_admin_role, added a few functional tests: main, user_admin, graders, login...
r58 def self.encrypt(string,salt)
pramook
initial commit...
r0 Digest::SHA1.hexdigest(salt + string)
end
jittat
more work on registration...
r157
def uniqueness_of_email_from_activated_users
jittat
Merged online-registration branch changes r297:303 into the trunk...
r158 user = User.activated_users.find_by_email(self.email)
if user and (user.login != self.login)
jittat
more work on registration...
r157 self.errors.add_to_base("Email has already been taken")
end
end
jittat
Merged online-registration branch changes r297:303 into the trunk...
r158
def enough_time_interval_between_same_email_registrations
jittat
fixed user confirmation bug...
r160 return if !self.new_record?
jittat
MERGED 308:HEAD from http://theory.cpe.ku.ac.th/grader/web/branches/ytopc08-2/, removed some registration info...
r162 return if self.activated
jittat
Merged online-registration branch changes r297:303 into the trunk...
r158 open_user = User.find_by_email(self.email,
:order => 'created_at DESC')
if open_user and open_user.created_at and
(open_user.created_at > Time.now.gmtime - 5.minutes)
self.errors.add_to_base("There are already unactivated registrations with this e-mail address (please wait for 5 minutes)")
end
end
jittat
MERGED 308:HEAD from http://theory.cpe.ku.ac.th/grader/web/branches/ytopc08-2/, removed some registration info...
r162
def email_validation?
begin
return VALIDATE_USER_EMAILS
rescue
return false
end
end
pramook
initial commit...
r0 end