feedback.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:4k
源码类别:

Ajax

开发平台:

Others

  1. require_dependency 'spam_protection'
  2. class Feedback < Content
  3.   # Empty, for now, ready to hoist up methods from Comment & Trackback
  4.   set_table_name "feedback"
  5.   include TypoGuid
  6.   validate_on_create :feedback_not_closed
  7.   before_create :create_guid, :article_allows_this_feedback
  8.   before_save :correct_url
  9.   after_save :post_trigger
  10.   after_save :report_classification
  11.   has_state(:state,
  12.             :valid_states => [:unclassified, #initial state
  13.                               :presumed_spam, :just_marked_as_spam, :spam,
  14.                               :just_presumed_ham, :presumed_ham, :just_marked_as_ham, :ham],
  15.             :handles => [:published?, :status_confirmed?, :just_published?,
  16.                          :mark_as_ham, :mark_as_spam, :confirm_classification,
  17.                          :withdraw, :before_save, :after_initialize,
  18.                          :send_notifications, :post_trigger, :report_classification])
  19.   include States
  20.   def self.default_order
  21.     'created_at ASC'
  22.   end
  23.   def to_param
  24.     guid
  25.   end
  26.   def parent
  27.     article
  28.   end
  29.   def permalink_url(anchor=:ignored, only_path=false)
  30.     article.permalink_url("#{self.class.to_s.downcase}-#{id}",only_path)
  31.   end
  32.   def edit_url(anchor=:ignored, only_path=true)
  33.     blog.url_for(:controller => "/admin/#{self.class.to_s.downcase}s", :action =>"edit", :id => id)
  34.   end
  35.   def delete_url(anchor=:ignored, only_path=true)
  36.     blog.url_for(:controller => "/admin/#{self.class.to_s.downcase}s",
  37.                  :action =>"destroy", :id => id)
  38.   end
  39.   def html_postprocess(field, html)
  40.     helper = ContentTextHelpers.new
  41.     helper.sanitize(helper.auto_link(html)).nofollowify
  42.   end
  43.   def correct_url
  44.     return if url.blank?
  45.     returning(url) do
  46.       url.to_s.gsub!(%r{^(?:http://)?(.+)},"http://\1")
  47.     end
  48.   end
  49.   def article_allows_this_feedback
  50.     article &&
  51.       blog_allows_feedback? &&
  52.       article_allows_feedback?
  53.   end
  54.   def blog_allows_feedback?
  55.     true
  56.   end
  57.   def akismet_options
  58.     {:user_ip => ip,
  59.       :comment_type => self.class.to_s.downcase,
  60.       :comment_author => originator,
  61.       :comment_author_email => email,
  62.       :comment_author_url => url,
  63.       :comment_content => body}.merge(additional_akismet_options)
  64.   end
  65.   def additional_akismet_options
  66.     { }
  67.   end
  68.   def spam_fields
  69.     [:title, :body, :ip, :url]
  70.   end
  71.   def classify
  72.     begin
  73.       return :ham if self.user_id
  74.       return :spam if blog.default_moderate_comments
  75.       return :ham unless blog.sp_global
  76.     rescue NoMethodError
  77.     end
  78.     # Yeah, three state logic is evil...
  79.     case sp_is_spam? || akismet_is_spam?
  80.     when nil; :spam
  81.     when true; :spam
  82.     when false; :ham
  83.     end
  84.   end
  85.   def sp_is_spam?(options={})
  86.     sp = SpamProtection.new(blog)
  87.     Timeout.timeout(defined?($TESTING) ? 10 : 30) do
  88.       spam_fields.any? do |field|
  89.         sp.is_spam?(self.send(field))
  90.       end
  91.     end
  92.   rescue Timeout::Error => e
  93.     nil
  94.   end
  95.   def akismet
  96.     Akismet.new(blog.sp_akismet_key, blog.base_url)
  97.   end
  98.   def akismet_is_spam?(options={})
  99.     return false if blog.sp_akismet_key.blank?
  100.     begin
  101.       Timeout.timeout(defined?($TESTING) ? 30 : 60) do
  102.         akismet.commentCheck(akismet_options)
  103.       end
  104.     rescue Timeout::Error => e
  105.       nil
  106.     end
  107.   end
  108.   def mark_as_ham!
  109.     mark_as_ham
  110.     save!
  111.   end
  112.   def mark_as_spam!
  113.     mark_as_spam
  114.     save
  115.   end
  116.   def report_as_spam
  117.     return if blog.sp_akismet_key.blank?
  118.     begin
  119.       Timeout.timeout(defined?($TESTING) ? 5 : 3600) { akismet.submitSpam(akismet_options) }
  120.     rescue Timeout::Error => e
  121.       nil
  122.     end
  123.   end
  124.   def report_as_ham
  125.     return if blog.sp_akismet_key.blank?
  126.     begin
  127.       Timeout.timeout(defined?($TESTING) ? 5 : 3600) { akismet.submitHam(akismet_options) }
  128.     rescue Timeout::Error => e
  129.       nil
  130.     end
  131.   end
  132.   def withdraw!
  133.     withdraw
  134.     self.save!
  135.   end
  136.   def confirm_classification!
  137.     confirm_classification
  138.     self.save
  139.   end
  140.   def feedback_not_closed
  141.     if article.comments_closed?
  142.       errors.add(:article_id, 'Comment are closed')
  143.     end
  144.   end
  145. end