|
|
class Course < ActiveRecord::Base
|
|
|
include Redmine::SafeAttributes
|
|
|
|
|
|
STATUS_ACTIVE = 1
|
|
|
STATUS_CLOSED = 5
|
|
|
STATUS_ARCHIVED = 9
|
|
|
|
|
|
attr_accessible :code, :extra, :name, :state, :tea_id, :time , :location, :state, :term, :password
|
|
|
belongs_to :project, :class_name => 'Course', :foreign_key => :extra, primary_key: :identifier
|
|
|
belongs_to :teacher, :class_name => 'User', :foreign_key => :tea_id # 定义一个方法teacher,该方法通过tea_id来调用User表
|
|
|
belongs_to :school, :class_name => 'School', :foreign_key => :school_id #定义一个方法school,该方法通过school_id来调用School表
|
|
|
has_many :bid
|
|
|
validates_presence_of :password, :term
|
|
|
validates_format_of :class_period, :message => "class period can only digital!", :with =>/^[1-9]\d*$/
|
|
|
safe_attributes 'extra',
|
|
|
'time',
|
|
|
'name',
|
|
|
'extra',
|
|
|
'code',
|
|
|
'location',
|
|
|
'tea_id',
|
|
|
'password',
|
|
|
'term',
|
|
|
'password'
|
|
|
|
|
|
scope :active, lambda { where(:status => STATUS_ACTIVE) }
|
|
|
scope :status, lambda {|arg| where(arg.blank? ? nil : {:status => arg.to_i}) }
|
|
|
scope :all_public, lambda { where(:is_public => true) }
|
|
|
scope :visible, lambda {|*args| where(Course.visible_condition(args.shift || User.current, *args)) }
|
|
|
scope :allowed_to, lambda {|*args|
|
|
|
user = User.current
|
|
|
permission = nil
|
|
|
if args.first.is_a?(Symbol)
|
|
|
permission = args.shift
|
|
|
else
|
|
|
user = args.shift
|
|
|
permission = args.shift
|
|
|
end
|
|
|
where(Course.allowed_to_condition(user, permission, *args))
|
|
|
}
|
|
|
|
|
|
|
|
|
#自定义验证
|
|
|
def validate
|
|
|
if !class_period.match([0-9])
|
|
|
errors.add_to_base("class period can only digital")
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def get_endup_time
|
|
|
begin
|
|
|
end_time = Time.parse(self.endup_time)
|
|
|
rescue Exception => e
|
|
|
end_time = Time.parse("3000-01-01")
|
|
|
Rails.logger.error "[Error] course endup_time error. ===> #{e}"
|
|
|
ensure
|
|
|
return end_time
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def get_time
|
|
|
begin
|
|
|
time = Date.new(self.time).to_time
|
|
|
rescue Exception => e
|
|
|
time = Time.parse("3000-01-01")
|
|
|
Rails.logger.error "[Error] course time error. ===> #{e}"
|
|
|
ensure
|
|
|
return time
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def self.allowed_to_condition(user, permission, options={})
|
|
|
perm = Redmine::AccessControl.permission(permission)
|
|
|
base_statement = (perm && perm.read? ? "#{Course.table_name}.status <> #{Course::STATUS_ARCHIVED}" : "#{Course.table_name}.status = #{Course::STATUS_ACTIVE}")
|
|
|
if perm && perm.project_module
|
|
|
# If the permission belongs to a project module, make sure the module is enabled
|
|
|
base_statement << " AND #{Course.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name='#{perm.project_module}')"
|
|
|
end
|
|
|
if options[:project]
|
|
|
project_statement = "#{Course.table_name}.id = #{options[:project].id}"
|
|
|
project_statement << " OR (#{Course.table_name}.lft > #{options[:project].lft} AND #{Course.table_name}.rgt < #{options[:project].rgt})" if options[:with_subprojects]
|
|
|
base_statement = "(#{project_statement}) AND (#{base_statement})"
|
|
|
end
|
|
|
|
|
|
if user.admin?
|
|
|
base_statement
|
|
|
else
|
|
|
statement_by_role = {}
|
|
|
unless options[:member]
|
|
|
role = user.logged? ? Role.non_member : Role.anonymous
|
|
|
if role.allowed_to?(permission)
|
|
|
statement_by_role[role] = "#{Course.table_name}.is_public = #{connection.quoted_true}"
|
|
|
end
|
|
|
end
|
|
|
if user.logged?
|
|
|
user.projects_by_role.each do |role, projects|
|
|
|
if role.allowed_to?(permission) && projects.any?
|
|
|
statement_by_role[role] = "#{Course.table_name}.id IN (#{projects.collect(&:id).join(',')})"
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
if statement_by_role.empty?
|
|
|
"1=0"
|
|
|
else
|
|
|
if block_given?
|
|
|
statement_by_role.each do |role, statement|
|
|
|
if s = yield(role, user)
|
|
|
statement_by_role[role] = "(#{statement} AND (#{s}))"
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
"((#{base_statement}) AND (#{statement_by_role.values.join(' OR ')}))"
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
|
|
|
end
|