annotate app/models/news.rb @ 922:ad295b270cd4 live

FIx #446: "non-utf8 paths in repositories blow up repo viewer and reposman" by ensuring the iconv conversion always happens even if source and dest are intended to be the same encoding
author Chris Cannam
date Tue, 13 Mar 2012 16:33:49 +0000
parents 350acce374a2
children ec1c49528f36
rev   line source
Chris@0 1 # Redmine - project management software
Chris@441 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
Chris@0 3 #
Chris@0 4 # This program is free software; you can redistribute it and/or
Chris@0 5 # modify it under the terms of the GNU General Public License
Chris@0 6 # as published by the Free Software Foundation; either version 2
Chris@0 7 # of the License, or (at your option) any later version.
Chris@441 8 #
Chris@0 9 # This program is distributed in the hope that it will be useful,
Chris@0 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 # GNU General Public License for more details.
Chris@441 13 #
Chris@0 14 # You should have received a copy of the GNU General Public License
Chris@0 15 # along with this program; if not, write to the Free Software
Chris@0 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@0 17
Chris@0 18 class News < ActiveRecord::Base
Chris@0 19 belongs_to :project
Chris@0 20 belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
Chris@0 21 has_many :comments, :as => :commented, :dependent => :delete_all, :order => "created_on"
Chris@441 22
Chris@0 23 validates_presence_of :title, :description
Chris@0 24 validates_length_of :title, :maximum => 60
Chris@0 25 validates_length_of :summary, :maximum => 255
Chris@0 26
Chris@0 27 acts_as_searchable :columns => ['title', 'summary', "#{table_name}.description"], :include => :project
Chris@0 28 acts_as_event :url => Proc.new {|o| {:controller => 'news', :action => 'show', :id => o.id}}
Chris@0 29 acts_as_activity_provider :find_options => {:include => [:project, :author]},
Chris@0 30 :author_key => :author_id
Chris@441 31 acts_as_watchable
Chris@441 32
Chris@441 33 after_create :add_author_as_watcher
Chris@441 34
Chris@441 35 named_scope :visible, lambda {|*args| {
Chris@117 36 :include => :project,
Chris@441 37 :conditions => Project.allowed_to_condition(args.shift || User.current, :view_news, *args)
Chris@117 38 }}
Chris@441 39
Chris@0 40 def visible?(user=User.current)
Chris@0 41 !user.nil? && user.allowed_to?(:view_news, project)
Chris@0 42 end
Chris@441 43
Chris@0 44 # returns latest news for projects visible by user
Chris@0 45 def self.latest(user = User.current, count = 5)
Chris@0 46 find(:all, :limit => count, :conditions => Project.allowed_to_condition(user, :view_news), :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
Chris@0 47 end
chris@374 48
Chris@441 49 private
Chris@441 50
Chris@441 51 def add_author_as_watcher
Chris@441 52 Watcher.create(:watchable => self, :user => author)
Chris@441 53 end
Chris@443 54
chris@374 55 # returns latest news for a specific project
chris@374 56 def self.latest_for(project, count = 5)
chris@374 57 find(:all, :limit => count, :conditions => [ "#{News.table_name}.project_id = #{project.id}", Project.allowed_to_condition(User.current, :view_news) ], :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
chris@374 58 end
Chris@0 59 end