This repository has been archived by the owner on Mar 29, 2019. It is now read-only.
/
wiki_content.rb
129 lines (108 loc) · 3.33 KB
/
wiki_content.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#-- encoding: UTF-8
#-- copyright
# ChiliProject is a project management system.
#
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# See doc/COPYRIGHT.rdoc for more details.
#++
require 'zlib'
class WikiContent < ActiveRecord::Base
belongs_to :page, :class_name => 'WikiPage', :foreign_key => 'page_id'
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
validates_presence_of :text
validates_length_of :comments, :maximum => 255, :allow_nil => true
attr_accessor :comments
before_save :comments_to_journal_notes
acts_as_journalized :event_type => 'wiki-page',
:event_title => Proc.new {|o| "#{l(:label_wiki_edit)}: #{o.page.title} (##{o.version})"},
:event_url => Proc.new {|o| {:controller => 'wiki', :action => 'show', :id => o.page.title, :project_id => o.page.wiki.project, :version => o.version}},
:activity_type => 'wiki_edits',
:activity_permission => :view_wiki_edits,
:activity_find_options => { :include => { :page => { :wiki => :project } } }
def activity_type
'wiki_edits'
end
def visible?(user=User.current)
page.visible?(user)
end
def project
page.project
end
def attachments
page.nil? ? [] : page.attachments
end
# Returns the mail adresses of users that should be notified
def recipients
notified = project.notified_users
notified.reject! {|user| !visible?(user)}
notified.collect(&:mail)
end
# FIXME: Deprecate
def versions
journals
end
def version
new_record? ? 0 : last_journal.version
end
private
def comments_to_journal_notes
self.init_journal(author, comments)
end
# FIXME: This is for backwards compatibility only. Remove once we decide it is not needed anymore
WikiContentJournal.class_eval do
attr_protected :data
after_save :compress_version_text
# Wiki Content might be large and the data should possibly be compressed
def compress_version_text
self.text = changes["text"].last if changes["text"]
self.text ||= self.journaled.text
end
def text=(plain)
case Setting.wiki_compression
when "gzip"
begin
text_hash :text => Zlib::Deflate.deflate(plain, Zlib::BEST_COMPRESSION), :compression => Setting.wiki_compression
rescue
text_hash :text => plain, :compression => ''
end
else
text_hash :text => plain, :compression => ''
end
plain
end
def text_hash(hash)
changes.delete("text")
changes["data"] = hash[:text]
changes["compression"] = hash[:compression]
update_attribute(:changes, changes)
end
def text
@text ||= case changes["compression"]
when "gzip"
data = Zlib::Inflate.inflate(changes["data"])
if data.respond_to? :force_encoding
data.force_encoding("UTF-8")
else
data
end
else
# uncompressed data
changes["data"]
end
end
# Returns the previous version or nil
def previous
@previous ||= journaled.journals.at(version - 1)
end
# FIXME: Deprecate
def versioned
journaled
end
end
end