Redmine 4.1.1
This commit is contained in:
parent
33e7b881a5
commit
3d976f1b3b
1593 changed files with 36180 additions and 19489 deletions
|
@ -1,5 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# Redmine - project management software
|
||||
# Copyright (C) 2006-2017 Jean-Philippe Lang
|
||||
# Copyright (C) 2006-2019 Jean-Philippe Lang
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
|
@ -21,16 +23,23 @@ class WikiContent < ActiveRecord::Base
|
|||
self.locking_column = 'version'
|
||||
belongs_to :page, :class_name => 'WikiPage'
|
||||
belongs_to :author, :class_name => 'User'
|
||||
has_many :versions, :class_name => 'WikiContentVersion', :dependent => :delete_all
|
||||
validates_presence_of :text
|
||||
validates_length_of :comments, :maximum => 1024, :allow_nil => true
|
||||
attr_protected :id
|
||||
|
||||
acts_as_versioned
|
||||
|
||||
after_save :send_notification
|
||||
after_save :create_version
|
||||
after_create_commit :send_notification_create
|
||||
after_update_commit :send_notification_update
|
||||
|
||||
scope :without_text, lambda {select(:id, :page_id, :version, :updated_on)}
|
||||
|
||||
def initialize(*args)
|
||||
super
|
||||
if new_record?
|
||||
self.version = 1
|
||||
end
|
||||
end
|
||||
|
||||
def visible?(user=User.current)
|
||||
page.visible?(user)
|
||||
end
|
||||
|
@ -57,118 +66,40 @@ class WikiContent < ActiveRecord::Base
|
|||
true
|
||||
end
|
||||
|
||||
class Version
|
||||
belongs_to :page, :class_name => '::WikiPage'
|
||||
belongs_to :author, :class_name => '::User'
|
||||
attr_protected :data
|
||||
|
||||
acts_as_event :title => Proc.new {|o| "#{l(:label_wiki_edit)}: #{o.page.title} (##{o.version})"},
|
||||
:description => :comments,
|
||||
:datetime => :updated_on,
|
||||
:type => 'wiki-page',
|
||||
:group => :page,
|
||||
:url => Proc.new {|o| {:controller => 'wiki', :action => 'show', :project_id => o.page.wiki.project, :id => o.page.title, :version => o.version}}
|
||||
|
||||
acts_as_activity_provider :type => 'wiki_edits',
|
||||
:timestamp => "#{WikiContent.versioned_table_name}.updated_on",
|
||||
:author_key => "#{WikiContent.versioned_table_name}.author_id",
|
||||
:permission => :view_wiki_edits,
|
||||
:scope => select("#{WikiContent.versioned_table_name}.updated_on, #{WikiContent.versioned_table_name}.comments, " +
|
||||
"#{WikiContent.versioned_table_name}.#{WikiContent.version_column}, #{WikiPage.table_name}.title, " +
|
||||
"#{WikiContent.versioned_table_name}.page_id, #{WikiContent.versioned_table_name}.author_id, " +
|
||||
"#{WikiContent.versioned_table_name}.id").
|
||||
joins("LEFT JOIN #{WikiPage.table_name} ON #{WikiPage.table_name}.id = #{WikiContent.versioned_table_name}.page_id " +
|
||||
"LEFT JOIN #{Wiki.table_name} ON #{Wiki.table_name}.id = #{WikiPage.table_name}.wiki_id " +
|
||||
"LEFT JOIN #{Project.table_name} ON #{Project.table_name}.id = #{Wiki.table_name}.project_id")
|
||||
|
||||
after_destroy :page_update_after_destroy
|
||||
|
||||
def text=(plain)
|
||||
case Setting.wiki_compression
|
||||
when 'gzip'
|
||||
begin
|
||||
self.data = Zlib::Deflate.deflate(plain, Zlib::BEST_COMPRESSION)
|
||||
self.compression = 'gzip'
|
||||
rescue
|
||||
self.data = plain
|
||||
self.compression = ''
|
||||
end
|
||||
else
|
||||
self.data = plain
|
||||
self.compression = ''
|
||||
end
|
||||
plain
|
||||
end
|
||||
|
||||
def text
|
||||
@text ||= begin
|
||||
str = case compression
|
||||
when 'gzip'
|
||||
Zlib::Inflate.inflate(data)
|
||||
else
|
||||
# uncompressed data
|
||||
data
|
||||
end
|
||||
str.force_encoding("UTF-8")
|
||||
str
|
||||
end
|
||||
end
|
||||
|
||||
def project
|
||||
page.project
|
||||
end
|
||||
|
||||
def attachments
|
||||
page.nil? ? [] : page.attachments
|
||||
end
|
||||
|
||||
# Return true if the content is the current page content
|
||||
def current_version?
|
||||
page.content.version == self.version
|
||||
end
|
||||
|
||||
# Returns the previous version or nil
|
||||
def previous
|
||||
@previous ||= WikiContent::Version.
|
||||
reorder('version DESC').
|
||||
includes(:author).
|
||||
where("wiki_content_id = ? AND version < ?", wiki_content_id, version).first
|
||||
end
|
||||
|
||||
# Returns the next version or nil
|
||||
def next
|
||||
@next ||= WikiContent::Version.
|
||||
reorder('version ASC').
|
||||
includes(:author).
|
||||
where("wiki_content_id = ? AND version > ?", wiki_content_id, version).first
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Updates page's content if the latest version is removed
|
||||
# or destroys the page if it was the only version
|
||||
def page_update_after_destroy
|
||||
latest = page.content.versions.reorder("#{self.class.table_name}.version DESC").first
|
||||
if latest && page.content.version != latest.version
|
||||
raise ActiveRecord::Rollback unless page.content.revert_to!(latest)
|
||||
elsif latest.nil?
|
||||
raise ActiveRecord::Rollback unless page.destroy
|
||||
end
|
||||
# Reverts the record to a previous version
|
||||
def revert_to!(version)
|
||||
if version.wiki_content_id == id
|
||||
update_columns(
|
||||
:author_id => version.author_id,
|
||||
:text => version.text,
|
||||
:comments => version.comments,
|
||||
:version => version.version,
|
||||
:updated_on => version.updated_on
|
||||
) && reload
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def send_notification
|
||||
# new_record? returns false in after_save callbacks
|
||||
if id_changed?
|
||||
if Setting.notified_events.include?('wiki_content_added')
|
||||
Mailer.wiki_content_added(self).deliver
|
||||
end
|
||||
elsif text_changed?
|
||||
if Setting.notified_events.include?('wiki_content_updated')
|
||||
Mailer.wiki_content_updated(self).deliver
|
||||
end
|
||||
def create_version
|
||||
versions << WikiContentVersion.new(attributes.except("id"))
|
||||
end
|
||||
|
||||
# Notifies users that a wiki page was created
|
||||
def send_notification_create
|
||||
if Setting.notified_events.include?('wiki_content_added')
|
||||
Mailer.deliver_wiki_content_added(self)
|
||||
end
|
||||
end
|
||||
|
||||
# Notifies users that a wiki page was updated
|
||||
def send_notification_update
|
||||
if Setting.notified_events.include?('wiki_content_updated') && saved_change_to_text?
|
||||
Mailer.deliver_wiki_content_updated(self)
|
||||
end
|
||||
end
|
||||
|
||||
# For backward compatibility
|
||||
# TODO: remove it in Redmine 5
|
||||
Version = WikiContentVersion
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue