summaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/concerns/akismet_submittable.rb15
-rw-r--r--app/models/concerns/spammable.rb58
-rw-r--r--app/models/issue.rb2
3 files changed, 58 insertions, 17 deletions
diff --git a/app/models/concerns/akismet_submittable.rb b/app/models/concerns/akismet_submittable.rb
deleted file mode 100644
index 17821688941..00000000000
--- a/app/models/concerns/akismet_submittable.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-module AkismetSubmittable
- extend ActiveSupport::Concern
-
- included do
- has_one :user_agent_detail, as: :subject
- end
-
- def can_be_submitted?
- if user_agent_detail
- user_agent_detail.submittable?
- else
- false
- end
- end
-end
diff --git a/app/models/concerns/spammable.rb b/app/models/concerns/spammable.rb
index 3b8e6df2da9..bbf6a3e0be3 100644
--- a/app/models/concerns/spammable.rb
+++ b/app/models/concerns/spammable.rb
@@ -1,16 +1,70 @@
module Spammable
extend ActiveSupport::Concern
+ include Gitlab::AkismetHelper
+
+ module ClassMethods
+ def attr_spammable(*attrs)
+ attrs.each do |attr|
+ spammable_attrs << attr.to_s
+ end
+ end
+ end
included do
+ has_one :user_agent_detail, as: :subject, dependent: :destroy
attr_accessor :spam
after_validation :check_for_spam, on: :create
+
+ cattr_accessor :spammable_attrs, instance_accessor: false do
+ []
+ end
+ end
+
+ def can_be_submitted?
+ if user_agent_detail
+ user_agent_detail.submittable?
+ else
+ false
+ end
+ end
+
+ def submit_ham
+ return unless akismet_enabled? && can_be_submitted?
+ ham!(user_agent_detail, spammable_text, creator)
+ end
+
+ def submit_spam
+ return unless akismet_enabled? && can_be_submitted?
+ spam!(user_agent_detail, spammable_text, creator)
+ end
+
+ def spam?(env, user)
+ is_spam?(env, user, spammable_text)
end
- def spam?
+ def spam_detected?
@spam
end
def check_for_spam
- self.errors.add(:base, "Your #{self.class.name.underscore} has been recognized as spam and has been discarded.") if spam?
+ self.errors.add(:base, "Your #{self.class.name.underscore} has been recognized as spam and has been discarded.") if spam_detected?
+ end
+
+ private
+
+ def spammable_text
+ result = []
+ self.class.spammable_attrs.each do |entry|
+ result << self.send(entry)
+ end
+ result.reject(&:blank?).join("\n")
+ end
+
+ def creator
+ if self.author_id
+ User.find(self.author_id)
+ elsif self.creator_id
+ User.find(self.creator_id)
+ end
end
end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 6c2635498e5..5408e24b21c 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -37,6 +37,8 @@ class Issue < ActiveRecord::Base
scope :order_due_date_asc, -> { reorder('issues.due_date IS NULL, issues.due_date ASC') }
scope :order_due_date_desc, -> { reorder('issues.due_date IS NULL, issues.due_date DESC') }
+ attr_spammable :title, :description
+
state_machine :state, initial: :opened do
event :close do
transition [:reopened, :opened] => :closed