Class: WikiPage

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
Redmine::SafeAttributes
Defined in:
app/models/wiki_page.rb

Constant Summary collapse

DEFAULT_PROTECTED_PAGES =

Wiki pages that are protected by default

%w(sidebar)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Redmine::SafeAttributes

#delete_unsafe_attributes, included, #safe_attribute?, #safe_attribute_names

Constructor Details

#initialize(attributes = nil, *args) ⇒ WikiPage

Returns a new instance of WikiPage.


73
74
75
76
77
78
# File 'app/models/wiki_page.rb', line 73

def initialize(attributes=nil, *args)
  super
  if new_record? && DEFAULT_PROTECTED_PAGES.include?(title.to_s.downcase)
    self.protected = true
  end
end

Instance Attribute Details

#deleted_attachment_idsObject


259
260
261
# File 'app/models/wiki_page.rb', line 259

def deleted_attachment_ids
  Array(@deleted_attachment_ids).map(&:to_i)
end

Returns the value of attribute redirect_existing_links


44
45
46
# File 'app/models/wiki_page.rb', line 44

def redirect_existing_links
  @redirect_existing_links
end

Class Method Details

.pretty_title(str) ⇒ Object


184
185
186
# File 'app/models/wiki_page.rb', line 184

def self.pretty_title(str)
  (str && str.is_a?(String)) ? str.tr('_', ' ') : str
end

Instance Method Details

#annotate(version = nil) ⇒ Object


178
179
180
181
182
# File 'app/models/wiki_page.rb', line 178

def annotate(version=nil)
  version = version ? version.to_i : self.content.version
  c = content.versions.find_by_version(version)
  c ? WikiAnnotate.new(c) : nil
end

#attachments_deletable?(usr = User.current) ⇒ Boolean

Returns:

  • (Boolean)

209
210
211
# File 'app/models/wiki_page.rb', line 209

def attachments_deletable?(usr=User.current)
  editable_by?(usr) && super(usr)
end

#content_for_version(version = nil) ⇒ Object


157
158
159
160
161
162
163
# File 'app/models/wiki_page.rb', line 157

def content_for_version(version=nil)
  if content
    result = content.versions.find_by_version(version.to_i) if version
    result ||= content
    result
  end
end

#delete_redirectsObject

Deletes redirects to this page


149
150
151
# File 'app/models/wiki_page.rb', line 149

def delete_redirects
  WikiRedirect.where(:redirects_to_wiki_id => wiki_id, :redirects_to => title).delete_all
end

#delete_selected_attachmentsObject


263
264
265
266
267
268
# File 'app/models/wiki_page.rb', line 263

def delete_selected_attachments
  if deleted_attachment_ids.present?
    objects = attachments.where(:id => deleted_attachment_ids.map(&:to_i))
    attachments.delete(objects)
  end
end

#diff(version_to = nil, version_from = nil) ⇒ Object


165
166
167
168
169
170
171
172
173
174
175
176
# File 'app/models/wiki_page.rb', line 165

def diff(version_to=nil, version_from=nil)
  version_to = version_to ? version_to.to_i : self.content.version
  content_to = content.versions.find_by_version(version_to)
  content_from = version_from ? content.versions.find_by_version(version_from.to_i) : content_to.try(:previous)
  return nil unless content_to && content_from

  if content_from.version > content_to.version
    content_to, content_from = content_from, content_to
  end

  (content_to && content_from) ? WikiDiff.new(content_to, content_from) : nil
end

#editable_by?(usr) ⇒ Boolean

Returns true if usr is allowed to edit the page, otherwise false

Returns:

  • (Boolean)

205
206
207
# File 'app/models/wiki_page.rb', line 205

def editable_by?(usr)
  !protected? || usr.allowed_to?(:protect_wiki_pages, wiki.project)
end

#is_start_pageObject


223
224
225
226
227
228
# File 'app/models/wiki_page.rb', line 223

def is_start_page
  if @is_start_page.nil?
    @is_start_page = wiki.try(:start_page) == title_was
  end
  @is_start_page
end

#is_start_page=(arg) ⇒ Object


230
231
232
# File 'app/models/wiki_page.rb', line 230

def is_start_page=(arg)
  @is_start_page = arg == '1' || arg == true
end

#parent_titleObject


213
214
215
# File 'app/models/wiki_page.rb', line 213

def parent_title
  @parent_title || (self.parent && self.parent.pretty_title)
end

#parent_title=(t) ⇒ Object


217
218
219
220
221
# File 'app/models/wiki_page.rb', line 217

def parent_title=(t)
  @parent_title = t
  parent_page = t.blank? ? nil : self.wiki.find_page(t)
  self.parent = parent_page
end

#pretty_titleObject


153
154
155
# File 'app/models/wiki_page.rb', line 153

def pretty_title
  WikiPage.pretty_title(title)
end

#projectObject


188
189
190
# File 'app/models/wiki_page.rb', line 188

def project
  wiki.try(:project)
end

#safe_attributes=(attrs, user = User.current) ⇒ Object


89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'app/models/wiki_page.rb', line 89

def safe_attributes=(attrs, user=User.current)
  if attrs.respond_to?(:to_unsafe_hash)
    attrs = attrs.to_unsafe_hash
  end

  return unless attrs.is_a?(Hash)
  attrs = attrs.deep_dup

  # Project and Tracker must be set before since new_statuses_allowed_to depends on it.
  if (w_id = attrs.delete('wiki_id')) && safe_attribute?('wiki_id')
    if (w = Wiki.find_by_id(w_id)) && w.project && user.allowed_to?(:rename_wiki_pages, w.project)
      self.wiki = w
    end
  end

  super attrs, user
end

#save_with_content(content) ⇒ Object

Saves the page and its content if text was changed Return true if the page was saved


243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'app/models/wiki_page.rb', line 243

def save_with_content(content)
  ret = nil
  transaction do
    ret = save
    if content.text_changed?
      begin
        self.content = content
      rescue ActiveRecord::RecordNotSaved
        ret = false
      end
    end
    raise ActiveRecord::Rollback unless ret
  end
  ret
end

#textObject


192
193
194
# File 'app/models/wiki_page.rb', line 192

def text
  content.text if content
end

#title=(value) ⇒ Object


84
85
86
87
# File 'app/models/wiki_page.rb', line 84

def title=(value)
  value = Wiki.titleize(value)
  write_attribute(:title, value)
end

#updated_onObject


196
197
198
# File 'app/models/wiki_page.rb', line 196

def updated_on
  content_attribute(:updated_on)
end

#versionObject


200
201
202
# File 'app/models/wiki_page.rb', line 200

def version
  content_attribute(:version)
end

#visible?(user = User.current) ⇒ Boolean

Returns:

  • (Boolean)

80
81
82
# File 'app/models/wiki_page.rb', line 80

def visible?(user=User.current)
  !user.nil? && user.allowed_to?(:view_wiki_pages, project)
end