class ProposalsDiscussionPlugin::ProposalTask < Task
has_and_belongs_to_many :categories,
class_name: "ProposalsDiscussionPlugin::TaskCategory",
join_table: :proposals_discussion_plugin_task_categories,
foreign_key: :task_id,
association_foreign_key: :category_id
has_one :proposal_evaluation
validates_presence_of :requestor_id, :target_id
validates_associated :article_object
validate :require_category
settings_items :name, :type => String
settings_items :ip_address, :type => String
settings_items :user_agent, :type => String
settings_items :referrer, :type => String
settings_items :article, :type => Hash, :default => {}
settings_items :closing_statment, :article_parent_id
scope :pending_evaluated, lambda { |profile, filter_type, filter_text|
self
.to(profile)
.without_spam.pending
.of(filter_type)
.like('data', filter_text)
.where(:status => ProposalsDiscussionPlugin::ProposalTask::Status.evaluated_statuses)
}
scope :filter_by_status, lambda { |profile, filter_type, filter_text, status_id|
self
.to(profile)
.without_spam.pending
.of(filter_type)
.like('data', filter_text)
.where(:status => status_id)
}
before_create do |task|
if !task.target.nil?
organization = task.target
responsible_candidates = organization.members.by_role(organization.roles.reject {|r| !r.has_permission?('view_tasks')})
task.responsible = responsible_candidates.sample
end
end
before_update do |task|
if task.target.present? && flagged? && task.changes[:status].present?
organization = task.target
responsible_candidates = organization.members.by_role(organization.roles.reject {|r| !r.has_permission?('perform_task')})
task.responsible = responsible_candidates.sample
end
end
def unflagged?
! flagged?
end
def flagged?
flagged_for_approval? || flagged_for_reproval?
end
def flagged_for_approval?
Status::FLAGGED_FOR_APPROVAL.eql?(self.status)
end
def flagged_for_reproval?
Status::FLAGGED_FOR_REPROVAL.eql?(self.status)
end
after_create :schedule_spam_checking
module Status
FLAGGED_FOR_APPROVAL = 5
FLAGGED_FOR_REPROVAL = 6
class << self
def names
[
nil,
N_('Active'), N_('Cancelled'), N_('Finished'),
N_('Hidden'), N_('Flagged for Approval'), N_('Flagged for Reproval')
]
end
def evaluated_statuses
[
FLAGGED_FOR_APPROVAL,
FLAGGED_FOR_REPROVAL
]
end
end
end
def flag_accept_proposal(evaluated_by)
transaction do
if evaluated_by
ProposalsDiscussionPlugin::ProposalEvaluation.new do |evaluation|
evaluation.evaluated_by = evaluated_by
evaluation.flagged_status = Status::FLAGGED_FOR_APPROVAL
evaluation.proposal_task = self
evaluation.save!
end
end
self.status = Status::FLAGGED_FOR_APPROVAL
self.save!
return true
end
end
def flag_reject_proposal(evaluated_by)
transaction do
if evaluated_by
ProposalsDiscussionPlugin::ProposalEvaluation.new do |evaluation|
evaluation.evaluated_by = evaluated_by
evaluation.flagged_status = Status::FLAGGED_FOR_REPROVAL
evaluation.proposal_task = self
evaluation.save!
end
end
self.status = Status::FLAGGED_FOR_REPROVAL
self.save!
return true
end
end
def schedule_spam_checking
self.delay.check_for_spam
end
def sender
requestor.name if requestor
end
def article_parent=(parent)
@article_parent = parent
end
def article_parent
@article_parent ||= Article.find_by_id article_parent_id.to_i
end
def article_object
if @article_object.nil?
@article_object = article_type.new(article.merge(target.present? ? {:profile => target} : {}).except(:type))
@article_object.parent = article_parent
@article_object.author = requestor if requestor.present?
end
@article_object
end
def article_type
if article[:type].present?
type = article[:type].constantize
return type if type < Article
end
TextArticle
end
def perform
article_object.save!
self.data[:article][:id] = article_object[:id]
self.save!
end
def title
_("New proposal")
end
def article_abstract
article[:abstract]
end
def abstract
article_abstract
end
def information
{:message => _("%{requestor} wants to send the following proposal.
%{abstract}"), :variables => {:abstract => CGI.escapeHTML(abstract.to_s)}}
end
def icon
{:type => :profile_image, :profile => requestor, :url => requestor.url}
end
def target_notification_description
_('%{requestor} wants to send a proposal.') % {:requestor => requestor.name}
end
def target_notification_message
target_notification_description + "\n\n" +
_('You will need login to %{system} in order to accept or reject the proposal sent by %{requestor}') % { :system => target.environment.name, :requestor => requestor.name}
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 task_finished_message
if !closing_statment.blank?
_("Your request for publishing the proposal \"%{article}\" was approved. Here is the comment left by the admin who approved your proposal:\n\n%{comment} ") % {:article => name, :comment => closing_statment}
else
_('Your request for publishing the proposal "%{article}" was approved.') % {:article => name}
end
end
def task_cancelled_message
message = _('Your request for publishing the proposal "%{article}" was rejected.') % {:article => name}
if !reject_explanation.blank?
message += " " + _("Here is the reject explanation left by the moderator who rejected your proposal: \n\n%{reject_explanation}") % {:reject_explanation => reject_explanation}
end
message
end
def after_spam!
SpammerLogger.log(ip_address, self)
self.delay.marked_as_spam
end
def after_ham!
self.delay.marked_as_ham
end
def to_liquid_with_proposal_task
hash = to_liquid_without_proposal_task
hash.merge(:article => article_object, :parent => article_parent)
end
alias_method_chain :to_liquid, :proposal_task
def categories_list(field = :name)
categories.pluck(field).join(',') if categories.count > 0
end
def proposal_source
parent = article_parent
parent.name if parent
end
protected
def require_category
if categories.count == 0 && flagged?
errors.add :categories, _('Select at least one category')
end
end
end