File: app/models/wiki_content.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  class: WikiContent#20
inherits from
  Base ( ActiveRecord )
has properties
method: visible? / 1 #29
method: project #33
method: attachments #37
method: recipients #42
method: current_version? #49
  class: Version#53
inherits from
  Object ( Builtin-Module )
has properties
method: text= / 1 #76
method: text #93
method: project #107
method: current_version? #112
method: previous #117

Class Hierarchy

Object ( Builtin-Module )
Base ( ActiveRecord )
  WikiContent    #20
Version ( WikiContent ) — #53

Code

   1  # Redmine - project management software
   2  # Copyright (C) 2006-2012  Jean-Philippe Lang
   3  #
   4  # This program is free software; you can redistribute it and/or
   5  # modify it under the terms of the GNU General Public License
   6  # as published by the Free Software Foundation; either version 2
   7  # of the License, or (at your option) any later version.
   8  #
   9  # This program is distributed in the hope that it will be useful,
  10  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  # GNU General Public License for more details.
  13  #
  14  # You should have received a copy of the GNU General Public License
  15  # along with this program; if not, write to the Free Software
  16  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17 
  18  require 'zlib'
  19 
  20  class WikiContent < ActiveRecord::Base
  21    set_locking_column :version
  22    belongs_to :page, :class_name => 'WikiPage', :foreign_key => 'page_id'
  23    belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
  24    validates_presence_of :text
  25    validates_length_of :comments, :maximum => 255, :allow_nil => true
  26 
  27    acts_as_versioned
  28 
  29    def visible?(user=User.current)
  30      page.visible?(user)
  31    end
  32 
  33    def project
  34      page.project
  35    end
  36 
  37    def attachments
  38      page.nil? ? [] : page.attachments
  39    end
  40 
  41    # Returns the mail adresses of users that should be notified
  42    def recipients
  43      notified = project.notified_users
  44      notified.reject! {|user| !visible?(user)}
  45      notified.collect(&:mail)
  46    end
  47 
  48    # Return true if the content is the current page content
  49    def current_version?
  50      true
  51    end
  52 
  53    class Version
  54      belongs_to :page, :class_name => '::WikiPage', :foreign_key => 'page_id'
  55      belongs_to :author, :class_name => '::User', :foreign_key => 'author_id'
  56      attr_protected :data
  57 
  58      acts_as_event :title => Proc.new {|o| "#{l(:label_wiki_edit)}: #{o.page.title} (##{o.version})"},
  59                    :description => :comments,
  60                    :datetime => :updated_on,
  61                    :type => 'wiki-page',
  62                    :url => Proc.new {|o| {:controller => 'wiki', :action => 'show', :project_id => o.page.wiki.project, :id => o.page.title, :version => o.version}}
  63 
  64      acts_as_activity_provider :type => 'wiki_edits',
  65                                :timestamp => "#{WikiContent.versioned_table_name}.updated_on",
  66                                :author_key => "#{WikiContent.versioned_table_name}.author_id",
  67                                :permission => :view_wiki_edits,
  68                                :find_options => {:select => "#{WikiContent.versioned_table_name}.updated_on, #{WikiContent.versioned_table_name}.comments, " +
  69                                                             "#{WikiContent.versioned_table_name}.#{WikiContent.version_column}, #{WikiPage.table_name}.title, " +
  70                                                             "#{WikiContent.versioned_table_name}.page_id, #{WikiContent.versioned_table_name}.author_id, " +
  71                                                             "#{WikiContent.versioned_table_name}.id",
  72                                                  :joins => "LEFT JOIN #{WikiPage.table_name} ON #{WikiPage.table_name}.id = #{WikiContent.versioned_table_name}.page_id " +
  73                                                            "LEFT JOIN #{Wiki.table_name} ON #{Wiki.table_name}.id = #{WikiPage.table_name}.wiki_id " +
  74                                                            "LEFT JOIN #{Project.table_name} ON #{Project.table_name}.id = #{Wiki.table_name}.project_id"}
  75 
  76      def text=(plain)
  77        case Setting.wiki_compression
  78        when 'gzip'
  79        begin
  80          self.data = Zlib::Deflate.deflate(plain, Zlib::BEST_COMPRESSION)
  81          self.compression = 'gzip'
  82        rescue
  83          self.data = plain
  84          self.compression = ''
  85        end
  86        else
  87          self.data = plain
  88          self.compression = ''
  89        end
  90        plain
  91      end
  92 
  93      def text
  94        @text ||= begin
  95          str = case compression
  96                when 'gzip'
  97                  Zlib::Inflate.inflate(data)
  98                else
  99                  # uncompressed data
 100                  data
 101                end
 102          str.force_encoding("UTF-8") if str.respond_to?(:force_encoding)
 103          str
 104        end
 105      end
 106 
 107      def project
 108        page.project
 109      end
 110 
 111      # Return true if the content is the current page content
 112      def current_version?
 113        page.content.version == self.version
 114      end
 115 
 116      # Returns the previous version or nil
 117      def previous
 118        @previous ||= WikiContent::Version.find(:first,
 119                                                :order => 'version DESC',
 120                                                :include => :author,
 121                                                :conditions => ["wiki_content_id = ? AND version < ?", wiki_content_id, version])
 122      end
 123    end
 124  end