File: app/models/wiki.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  class: Wiki#18
includes
  SafeAttributes ( Redmine )
inherits from
  Base ( ActiveRecord )
has properties
method: visible? / 1 #31
method: sidebar #37
method: find_or_new_page / 1 #43
method: find_page (1/2) / 2 #49
method: page_found_with_redirect? #66
class method: find_page (2/E) / 2 #75
class method: titleize / 1 #90

Class Hierarchy

Object ( Builtin-Module )
Base ( ActiveRecord )
  Wiki    #18

Code

   1  # Redmine - project management software
   2  # Copyright (C) 2006-2011  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  class Wiki < ActiveRecord::Base
  19    include Redmine::SafeAttributes
  20    belongs_to :project
  21    has_many :pages, :class_name => 'WikiPage', :dependent => :destroy, :order => 'title'
  22    has_many :redirects, :class_name => 'WikiRedirect', :dependent => :delete_all
  23 
  24    acts_as_watchable
  25 
  26    validates_presence_of :start_page
  27    validates_format_of :start_page, :with => /^[^,\.\/\?\;\|\:]*$/
  28 
  29    safe_attributes 'start_page'
  30 
  31    def visible?(user=User.current)
  32      !user.nil? && user.allowed_to?(:view_wiki_pages, project)
  33    end
  34 
  35    # Returns the wiki page that acts as the sidebar content
  36    # or nil if no such page exists
  37    def sidebar
  38      @sidebar ||= find_page('Sidebar', :with_redirect => false)
  39    end
  40 
  41    # find the page with the given title
  42    # if page doesn't exist, return a new page
  43    def find_or_new_page(title)
  44      title = start_page if title.blank?
  45      find_page(title) || WikiPage.new(:wiki => self, :title => Wiki.titleize(title))
  46    end
  47 
  48    # find the page with the given title
  49    def find_page(title, options = {})
  50      @page_found_with_redirect = false
  51      title = start_page if title.blank?
  52      title = Wiki.titleize(title)
  53      page = pages.first(:conditions => ["LOWER(title) = LOWER(?)", title])
  54      if !page && !(options[:with_redirect] == false)
  55        # search for a redirect
  56        redirect = redirects.first(:conditions => ["LOWER(title) = LOWER(?)", title])
  57        if redirect
  58          page = find_page(redirect.redirects_to, :with_redirect => false)
  59          @page_found_with_redirect = true
  60        end
  61      end
  62      page
  63    end
  64 
  65    # Returns true if the last page was found with a redirect
  66    def page_found_with_redirect?
  67      @page_found_with_redirect
  68    end
  69 
  70    # Finds a page by title
  71    # The given string can be of one of the forms: "title" or "project:title"
  72    # Examples:
  73    #   Wiki.find_page("bar", project => foo)
  74    #   Wiki.find_page("foo:bar")
  75    def self.find_page(title, options = {})
  76      project = options[:project]
  77      if title.to_s =~ %r{^([^\:]+)\:(.*)$}
  78        project_identifier, title = $1, $2
  79        project = Project.find_by_identifier(project_identifier) || Project.find_by_name(project_identifier)
  80      end
  81      if project && project.wiki
  82        page = project.wiki.find_page(title)
  83        if page && page.content
  84          page
  85        end
  86      end
  87    end
  88 
  89    # turn a string into a valid page title
  90    def self.titleize(title)
  91      # replace spaces with _ and remove unwanted caracters
  92      title = title.gsub(/\s+/, '_').delete(',./?;|:') if title
  93      # upcase the first letter
  94      title = (title.slice(0..0).upcase + (title.slice(1..-1) || '')) if title
  95      title
  96    end
  97  end