aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/refinery/blog_comment.rb
blob: f7c1c84e710ce42c72603c180dd7d68126325b35 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
module Refinery
  class BlogComment < ActiveRecord::Base

    attr_accessible :name, :email, :message

    filters_spam :author_field => :name,
                 :email_field => :email,
                 :message_field => :body

    belongs_to :post, :class_name => 'Refinery::BlogPost', :foreign_key => 'blog_post_id'

    acts_as_indexed :fields => [:name, :email, :message]

    alias_attribute :message, :body

    validates :name, :message, :presence => true
    validates :email, :format => { :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i }

    scope :unmoderated, :conditions => {:state => nil}
    scope :approved, :conditions => {:state => 'approved'}
    scope :rejected, :conditions => {:state => 'rejected'}
    
    self.per_page = Setting.find_or_set(:blog_comments_per_page, 10)

    def avatar_url(options = {})
      options = {:size => 60}
      require 'digest/md5'
      size = ("?s=#{options[:size]}" if options[:size])
      "http://gravatar.com/avatar/#{Digest::MD5.hexdigest(self.email.to_s.strip.downcase)}#{size}.jpg"
    end

    def approve!
      self.update_attribute(:state, 'approved')
    end

    def reject!
      self.update_attribute(:state, 'rejected')
    end

    def rejected?
      self.state == 'rejected'
    end

    def approved?
      self.state == 'approved'
    end

    def unmoderated?
      self.state.nil?
    end

    def self.toggle!
      currently = Refinery::Setting.find_or_set(:comments_allowed, true, {
        :scoping => 'blog'
      })
      Refinery::Setting.set(:comments_allowed, {:value => !currently, :scoping => 'blog'})
    end

    before_create do |comment|
      unless Moderation.enabled?
        comment.state = comment.ham? ? 'approved' : 'rejected'
      end
    end

    module Moderation
      class << self
        def enabled?
          Refinery::Setting.find_or_set(:comment_moderation, true, {
            :scoping => 'blog',
            :restricted => false
          })
        end

        def toggle!
          new_value = {
            :value => !BlogComment::Moderation.enabled?,
            :scoping => 'blog',
            :restricted => false
          }
          if Refinery::Setting.respond_to?(:set)
            Refinery::Setting.set(:comment_moderation, new_value)
          else
            Refinery::Setting[:comment_moderation] = new_value
          end
        end
      end
    end

    module Notification
      class << self
        def recipients
          Refinery::Setting.find_or_set(:comment_notification_recipients, (Refinery::Role[:refinery].users.first.email rescue ''),
          {
            :scoping => 'blog',
            :restricted => false
          })
        end

        def recipients=(emails)
          new_value = {
            :value => emails,
            :scoping => 'blog',
            :restricted => false
          }
          if Refinery::Setting.respond_to?(:set)
            Refinery::Setting.set(:comment_notification_recipients, new_value)
          else
            Refinery::Setting[:comment_notification_recipients] = new_value
          end
        end

        def subject
          Refinery::Setting.find_or_set(:comment_notification_subject, "New inquiry from your website", {
            :scoping => 'blog',
            :restricted => false
          })
        end

        def subject=(subject_line)
          new_value = {
            :value => subject_line,
            :scoping => 'blog',
            :restricted => false
          }
          if Refinery::Setting.respond_to?(:set)
            Refinery::Setting.set(:comment_notification_subject, new_value)
          else
            Refinery::Setting[:comment_notification_subject] = new_value
          end
        end
      end
    end

  end
end