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.


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


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

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


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

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

Instance Method Details

#annotate(version = nil) ⇒ Object


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

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)

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

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

#content_for_version(version = nil) ⇒ Object


164
165
166
167
168
169
170
# File 'app/models/wiki_page.rb', line 164

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


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


270
271
272
273
274
275
# File 'app/models/wiki_page.rb', line 270

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


172
173
174
175
176
177
178
179
180
181
182
183
# File 'app/models/wiki_page.rb', line 172

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)

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

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

#is_start_pageObject


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

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


237
238
239
# File 'app/models/wiki_page.rb', line 237

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

#parent_titleObject


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

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

#parent_title=(t) ⇒ Object


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

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


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

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 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


250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
# File 'app/models/wiki_page.rb', line 250

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


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

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


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

def updated_on
  content_attribute(:updated_on)
end

#versionObject


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

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