Noosfero/noosfero

View on GitHub
app/models/approve_article.rb

Summary

Maintainability
A
3 hrs
Test Coverage
class ApproveArticle < Task
  validates_presence_of :requestor_id, :target_id

  validates :requestor, kind_of: { kind: Person }
  validate :allowed_requestor

  def allowed_requestor
    if target
      if target.person? && requestor != target
        self.errors.add(:requestor, _("You can not post articles to other users."))
      end
    end
  end

  def article_title
    article ? article.title : _("(The original text was removed)")
  end

  def article
    Article.find_by id: data[:article_id]
  end

  def article=(value)
    data[:article_id] = value.id
  end

  def name
    data[:name].blank? ? (article ? article.title : _("Article removed.")) : data[:name]
  end

  def name=(value)
    data[:name] = value
  end

  settings_items :closing_statment, :article_parent_id, :highlighted
  settings_items :create_link, type: :boolean, default: false

  def article_parent
    Article.find_by id: article_parent_id.to_i
  end

  def article_parent=(value)
    self.article_parent_id = value.id
  end

  def abstract=(value)
    data[:abstract] = value
  end

  def abstract
    data[:abstract].blank? ? (article ? article.abstract : "") : data[:abstract]
  end

  def body=(value)
    data[:body] = value
  end

  def body
    data[:body].blank? ? (article ? article.body : "") : data[:body]
  end

  def perform
    if create_link
      LinkArticle.create!(reference_article: article, profile: target, parent: article_parent, highlighted: highlighted)
    else
      article.copy!(name: name, abstract: abstract, body: body, profile: target, reference_article: article, parent: article_parent, highlighted: highlighted, source: article.source, last_changed_by_id: article.last_changed_by_id, created_by_id: article.created_by_id)
    end
  end

  def title
    _("New article")
  end

  def icon
    result = { type: :defined_image, src: "/images/icons-app/article-minor.png", name: name }
    result.merge(url: article.url) if article
    return result
  end

  def linked_subject
    { text: name, url: article.url } if article
  end

  def information
    if article
      { message: _("%{requestor} wants to publish the article: %{linked_subject}.").html_safe }
    else
      { message: _("The article was removed.") }
    end
  end

  def accept_details
    true
  end

  def reject_details
    true
  end

  def default_decision
    if article
      "skip"
    else
      "reject"
    end
  end

  def accept_disabled?
    article.blank?
  end

  def target_notification_description
    if article
      _("%{requestor} wants to publish the article: %{article}.") % { requestor: requestor.name, article: article.title }
    else
      _("%{requestor} wanted to publish an article but it was removed.") % { requestor: requestor.name }
    end
  end

  def target_notification_message
    return nil if target.organization? && !target.moderated_articles?

    target_notification_description + "\n\n" +
      _("You need to login on %{system} in order to approve or reject this article.") % { system: target.environment.name }
  end

  def task_finished_message
    if !closing_statment.blank?
      _("Your request for publishing the article \"%{article}\" was approved. Here is the comment left by the admin who approved your article:\n\n%{comment} ") % { article: name, comment: closing_statment }
    else
      _('Your request for publishing the article "%{article}" was approved.') % { article: name }
    end
  end

  def task_cancelled_message
    message = _('Your request for publishing the article "%{article}" was rejected.') % { article: name }
    if !reject_explanation.blank?
      message += " " + _("Here is the reject explanation left by the administrator who rejected your article: \n\n%{reject_explanation}") % { reject_explanation: reject_explanation }
    end
    message
  end
end