|
- class Contest < ActiveRecord::Base
- attr_accessible :author_id, :budget, :commit, :deadline, :description, :name, :password
- include Redmine::SafeAttributes
-
- belongs_to :author, :class_name => 'User', :foreign_key => :author_id
- has_many :contesting_projects, :dependent => :destroy
- has_many :projects, :through => :contesting_projects
- has_many :contesting_softapplications, :dependent => :destroy
- has_many :softapplications, :through => :contesting_softapplications
- has_many :projects_member, :class_name => 'User', :through => :projects
- has_many :journals_for_messages, :as => :jour, :dependent => :destroy
- has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
- has_many :join_in_competitions, foreign_key: 'competition_id', :dependent => :destroy
- has_many :join_in_contests, class_name: 'JoinInCompetition', foreign_key: 'competition_id', :dependent => :destroy
- has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
- has_many :contestnotifications, :dependent => :destroy, :include => :author
-
-
-
- acts_as_attachable
-
- NAME_LENGTH_LIMIT = 60
- DESCRIPTION_LENGTH_LIMIT = 250
-
- validates_length_of :name, :maximum => NAME_LENGTH_LIMIT
- validates_length_of :description, :maximum => DESCRIPTION_LENGTH_LIMIT
- validates_presence_of :author_id, :name, :deadline
- validates_format_of :deadline, :with => /^[\d]{4}[-][\d]{1,2}[-][\d]{1,2}$/
- # validates_format_of :budget, :with => /^(\d+)$|^(\d+).([0-9]{2})|^(\d+).([0-9]{1})$/
- validate :validate_user
- after_create :act_as_activity
-
- scope :visible, lambda {|*args|
- nil
- }
-
- scope :like, lambda {|arg|
- if arg.blank?
- where(nil)
- else
- pattern = "%#{arg.to_s.strip.downcase}%"
- where("LOWER(id) LIKE :p OR LOWER(name) LIKE :p OR LOWER(description) LIKE :p", :p => pattern)
- end
- }
-
- acts_as_watchable
- acts_as_taggable
-
- acts_as_event :title => Proc.new {|o| "#{l(:label_requirement)} ##{o.id}: #{o.name}" },
- :description => :description,
- :author => :author,
- :url => Proc.new {|o| {:controller => 'contests', :action => 'show_contest', :id => o.id}}
-
- acts_as_activity_provider :find_options => {:include => [:projects, :author]},
- :author_key => :author_id
-
- safe_attributes 'name',
- 'description',
- 'budget',
- 'deadline',
- 'password'
-
-
- def add_jour(user, notes, reference_user_id = 0, options = {})
- if options.count == 0
- self.journals_for_messages << JournalsForMessage.new(:user_id => user.id, :notes => notes, :reply_id => reference_user_id)
- else
- jfm = self.journals_for_messages.build(options)
- jfm.save
- jfm
- end
- end
-
- def self.creat_contests(budget, deadline, name, description=nil)
- self.create(:author_id => User.current.id, :budget => budget,
- :deadline => deadline, :name => name, :description => description, :commit => 0)
- end
-
- def update_contests(budget, deadline, name, description=nil)
- if(User.current.id == self.author_id)
- self.name = name
- self.budget = budget
- self.deadline = deadline
- self.description = description
- self.save
- end
- end
-
- def delete_contests
- unless self.nil?
- if User.current.id == self.author_id
- self.destroy
- end
- end
- end
-
- # Closes open and locked project versions that are completed
- def close_completed_versions_contest
- Version.transaction do
- versions.where(:status => %w(open locked)).all.each do |version|
- if version.completed?
- version.update_attribute(:status, 'closed')
- end
- end
- end
- end
-
- def set_commit(commit)
- self.update_attribute(:commit, commit)
- end
-
- private
-
- def validate_user
- errors.add :author_id, :invalid if author.nil? || !author.active?
- end
-
-
- def act_as_activity
- self.acts << Activity.new(:user_id => self.author_id)
- end
-
- def validate_contest_manager(user_id)
- unless user_id.nil?
- if self.author_id == user_id
- return true
- else
- return false
- end
- end
- end
- end
|