Class: WikiPage

Inherits:
ApplicationRecord 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

Methods inherited from ApplicationRecord

human_attribute_name

Constructor Details

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

Returns a new instance of WikiPage.



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

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



262
263
264
# File 'app/models/wiki_page.rb', line 262

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

Returns the value of attribute redirect_existing_links.



51
52
53
# File 'app/models/wiki_page.rb', line 51

def redirect_existing_links
  @redirect_existing_links
end

Class Method Details

.pretty_title(str) ⇒ Object



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

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

Instance Method Details

#annotate(version = nil) ⇒ Object



181
182
183
184
185
# File 'app/models/wiki_page.rb', line 181

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)


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

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

#content_for_version(version = nil) ⇒ Object



164
165
166
# File 'app/models/wiki_page.rb', line 164

def content_for_version(version=nil)
  (content && version) ? content.versions.find_by_version(version.to_i) : content
end

#delete_redirectsObject

Deletes redirects to this page



156
157
158
# File 'app/models/wiki_page.rb', line 156

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

#delete_selected_attachmentsObject



266
267
268
269
270
271
# File 'app/models/wiki_page.rb', line 266

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



168
169
170
171
172
173
174
175
176
177
178
179
# File 'app/models/wiki_page.rb', line 168

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)


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

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

#is_start_pageObject



226
227
228
229
230
231
# File 'app/models/wiki_page.rb', line 226

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



233
234
235
# File 'app/models/wiki_page.rb', line 233

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

#parent_titleObject



216
217
218
# File 'app/models/wiki_page.rb', line 216

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

#parent_title=(t) ⇒ Object



220
221
222
223
224
# File 'app/models/wiki_page.rb', line 220

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

#pretty_titleObject



160
161
162
# File 'app/models/wiki_page.rb', line 160

def pretty_title
  WikiPage.pretty_title(title)
end

#projectObject



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

def project
  wiki.try(:project)
end

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



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'app/models/wiki_page.rb', line 96

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
end

#save_with_content(content) ⇒ Object

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



246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
# File 'app/models/wiki_page.rb', line 246

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



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

def text
  content.text if content
end

#title=(value) ⇒ Object



91
92
93
94
# File 'app/models/wiki_page.rb', line 91

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

#updated_onObject



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

def updated_on
  content_attribute(:updated_on)
end

#versionObject



203
204
205
# File 'app/models/wiki_page.rb', line 203

def version
  content_attribute(:version)
end

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

Returns:

  • (Boolean)


87
88
89
# File 'app/models/wiki_page.rb', line 87

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