radiant-comments-extension 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG +40 -0
  3. data/HELP_admin.markdown +52 -0
  4. data/HELP_designer.markdown +36 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +53 -0
  7. data/Rakefile +133 -0
  8. data/TODO +6 -0
  9. data/VERSION +1 -0
  10. data/app/controllers/admin/comments_controller.rb +130 -0
  11. data/app/controllers/comments_controller.rb +59 -0
  12. data/app/helpers/admin/comments_helper.rb +7 -0
  13. data/app/models/akismet_spam_filter.rb +37 -0
  14. data/app/models/comment.rb +121 -0
  15. data/app/models/comment_mailer.rb +24 -0
  16. data/app/models/mollom_spam_filter.rb +52 -0
  17. data/app/models/simple_spam_filter.rb +38 -0
  18. data/app/models/spam_filter.rb +43 -0
  19. data/app/views/admin/comments/_comment.rhtml +34 -0
  20. data/app/views/admin/comments/_form.rhtml +36 -0
  21. data/app/views/admin/comments/edit.rhtml +5 -0
  22. data/app/views/admin/comments/index.rhtml +55 -0
  23. data/app/views/admin/pages/_comments.rhtml +0 -0
  24. data/app/views/admin/pages/_edit_comments_enabled.rhtml +8 -0
  25. data/app/views/admin/pages/_index_head_view_comments.rhtml +1 -0
  26. data/app/views/admin/pages/_index_view_comments.rhtml +11 -0
  27. data/app/views/comment_mailer/comment_notification.rhtml +21 -0
  28. data/app/views/comments/_comment.rhtml +1 -0
  29. data/app/views/comments/_form.rhtml +23 -0
  30. data/app/views/comments/_new.rhtml +5 -0
  31. data/autotest/discover.rb +3 -0
  32. data/comments_extension.rb +81 -0
  33. data/cucumber.yml +1 -0
  34. data/db/migrate/001_create_comments.rb +29 -0
  35. data/db/migrate/002_create_snippets.rb +115 -0
  36. data/db/migrate/003_change_filter_id_from_integer_to_string.rb +10 -0
  37. data/db/migrate/004_add_approval_columns.rb +13 -0
  38. data/db/migrate/005_add_mollomid_column.rb +11 -0
  39. data/db/migrate/006_move_config_to_migrations.rb +22 -0
  40. data/db/migrate/007_add_preference_for_simple_spamcheck.rb +12 -0
  41. data/features/support/env.rb +16 -0
  42. data/features/support/paths.rb +16 -0
  43. data/lib/akismet.rb +134 -0
  44. data/lib/comment_page_extensions.rb +41 -0
  45. data/lib/comment_tags.rb +338 -0
  46. data/lib/mollom.rb +246 -0
  47. data/lib/radiant-comments-extension.rb +0 -0
  48. data/lib/tasks/comments_extension_tasks.rake +68 -0
  49. data/public/images/admin/accept.png +0 -0
  50. data/public/images/admin/comment_edit.png +0 -0
  51. data/public/images/admin/comments.png +0 -0
  52. data/public/images/admin/comments_delete.png +0 -0
  53. data/public/images/admin/delete.png +0 -0
  54. data/public/images/admin/email.png +0 -0
  55. data/public/images/admin/error.png +0 -0
  56. data/public/images/admin/link.png +0 -0
  57. data/public/images/admin/page_white_edit.png +0 -0
  58. data/public/images/admin/table_save.png +0 -0
  59. data/public/images/admin/tick.png +0 -0
  60. data/public/stylesheets/admin/comments.css +41 -0
  61. data/radiant-comments-extension.gemspec +133 -0
  62. data/spec/controllers/admin/comments_controller_spec.rb +57 -0
  63. data/spec/controllers/admin/comments_routing_spec.rb +43 -0
  64. data/spec/controllers/page_postback_spec.rb +51 -0
  65. data/spec/datasets/comments_dataset.rb +7 -0
  66. data/spec/models/akismet_spam_filter_spec.rb +61 -0
  67. data/spec/models/comment_spec.rb +148 -0
  68. data/spec/models/comment_tags_spec.rb +55 -0
  69. data/spec/models/mollom_spam_filter_spec.rb +103 -0
  70. data/spec/models/simple_spam_filter_spec.rb +44 -0
  71. data/spec/models/spam_filter_spec.rb +38 -0
  72. data/spec/spec.opts +6 -0
  73. data/spec/spec_helper.rb +36 -0
  74. data/test/fixtures/users.yml +6 -0
  75. data/test/integration/comment_enabling_test.rb +18 -0
  76. data/test/test_helper.rb +24 -0
  77. data/test/unit/comment_test.rb +52 -0
  78. metadata +177 -0
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .DS_Store
2
+ .svn
3
+ pkg/*
data/CHANGELOG ADDED
@@ -0,0 +1,40 @@
1
+ = Git
2
+
3
+ = 0.0.6
4
+
5
+ * Added spam_answer_tag for simple spam protection or CAPTCHA
6
+ * Added comments.notify_creator and comments.notify_updater to send emails to the page creator/updater [Jim Gay]
7
+ * Added accept.png icon and rake task to copy it. [ryan@artofmission.com]
8
+
9
+ = 0.0.5
10
+
11
+ * Pluralized the `comments` tag so that it does not conflict with the standard Radiant `comment` tag. [nathaniel@terralien.com]
12
+ * Added posting confirmation support. [nathaniel@terralien.com]
13
+ * Added validation support. [nathaniel@terralien.com]
14
+ * Allow disabling of input filters. [nathaniel@terralien.com]
15
+ * Updated to work with Radiant 0.6.7. [nathaniel@terralien.com]
16
+
17
+ = 0.0.4
18
+ * Added additional options and formatting to admin interface [rch]
19
+ * Added comment approval options [rch]
20
+ * Comments must now be approved before they will show up [rch]
21
+
22
+ = 0.0.3
23
+ * Changed dependency from admin_parts to shards. [hcf]
24
+ * Added the snippets to a migration, so that the users no longer have to do this manually. [hcf]
25
+ * Changed filter_id from integer to string to make it similar to radiant core. [hcf]
26
+ * Removed the 'Comments' tab, and moved the functionality to the 'Pages' tab instead using shards. [hcf]
27
+ * Added support for filters in comments, through the comment:filter_box_tag tag. [hcf]
28
+ * Simplified the comment snippets. [hcf]
29
+
30
+ = 0.0.2
31
+
32
+ * Added Akismet support.
33
+ * Added admin tools for moderating comments.
34
+ * Added destroy dependency to Page#Comments association.
35
+ * Added no_login_required to CommentsController. Comment should no longer force login when posted.
36
+
37
+ = 0.0.1
38
+
39
+ * Basic comment functionality in place
40
+
@@ -0,0 +1,52 @@
1
+ You have the capability to use 3 different methods of spam blocking with this extension.
2
+
3
+ 1. Logic CAPTCHA (asking a question a spambot would not know)
4
+ 2. [Akismet](http://akismet.com/)
5
+ 3. [Mollom](http://mollom.com/)
6
+
7
+ ## Spam Blocking
8
+
9
+ By default, you will have sample questions that you may ask of your visitors. These questions are difficult
10
+ to easily interpret by robots that may crawl your site looking to leave spam. See your Snippet
11
+ 'comment\_spam\_block' for examples of this.
12
+
13
+ You will need to use the spam\_answer\_tag in your comment forms to present these questions to the user.
14
+
15
+ If you wish disable this simple spam protection mechanism, you can do so using the `require_simple_spam_filter`
16
+ config key, e.g. Radiant::Config['comments.require_simple_spam_filter'] = false
17
+
18
+ To enable the Akismet protection, get yourself an account at http://akismet.com/personal/ for your personal
19
+ blog or at http://akismet.com/commercial/ for your commercial sites. Then set your personal key and url
20
+ in the Radiant::Config.
21
+
22
+ For example:
23
+
24
+ Radiant::Config['comments.akismet_key'] = "6a009ca6ab4e"
25
+ Radiant::Config['comments.akismet_url'] = "yoursite.com"
26
+
27
+ To enable Mollom protection, get yourself an account at http://mollom.com/user/register, add your site and
28
+ set the public and private key pair in the Radiant::Config.
29
+
30
+ Radiant::Config['comments.mollom_privatekey'] = "deadbeef012345"
31
+ Radiant::Config['comments.mollom_publickey'] = "c00fee012345"
32
+
33
+ If both services are configured, this plugin will use the Akismet service. Unset the akismet_key if you
34
+ want to use Mollom.
35
+
36
+ ## Exporting Data
37
+
38
+ To customize the CSV fields you can add an initializer like this:
39
+
40
+ Comment.class_eval do
41
+ def export_columns(format = nil)
42
+ %w[approved? author author_email content referrer]
43
+ end
44
+ end
45
+
46
+ ## Viewing comments
47
+
48
+ You may set the per page number of comments in the Radiant configuration options:
49
+
50
+ Radiant::Config['comments.per_page'] = 100
51
+
52
+ By default, the number of comments per page is 50.
@@ -0,0 +1,36 @@
1
+ ## Spam-blocking Questions
2
+
3
+ By default you'll have a Snippet called 'comment\_spam\_block' which will provide a way to
4
+ ask your site commenters a simple question.
5
+
6
+ <r:random>
7
+ <r:error on="spam_answer"><p style="color:red">Answer <r:message /></p></r:error>
8
+ <r:option>
9
+ <p><label for="comment_spam_answer">What day of the week has the letter "h" in it's name?</label> (required)<br />
10
+ <r:spam_answer_tag answer="Thursday" /></p>
11
+ </r:option>
12
+ <r:option>
13
+ <p><label for="comment_spam_answer">Yellow and blue together make what color?</label> (required)<br />
14
+ <r:spam_answer_tag answer="green" /></p>
15
+ </r:option>
16
+ <r:option>
17
+ <p><label for="comment_spam_answer">What is SPAM spelled backwards?</label> (required)<br />
18
+ <r:spam_answer_tag answer="MAPS" /></p>
19
+ </r:option>
20
+ </r:random>
21
+
22
+ The snippet takes advantage of the built-in Radius tags `r:random` and `r:option` to provide a random
23
+ and less predictable selection of questions for commenters.
24
+
25
+ Be sure to alter this snippet for your site!
26
+
27
+ ## Displaying comments and the comment form
28
+
29
+ In your site layout (or another appropriate place) use the following code to display your comment form:
30
+
31
+ <r:snippet name="comments" />
32
+
33
+ ### After comments are posted...
34
+
35
+ Relative urls will *not* work on comment pages if they fail validation, since the page gets re-rendered
36
+ at a (probably) different level of the hierarchy. Always use absolute urls and you won't have any issues.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2007 Ryan Heneise
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,53 @@
1
+ = Radiant Comments Extension
2
+
3
+ Adds blog-like comment functionality to Radiant. Currently maintained by http://github.com/saturnflyer
4
+
5
+ == Patches
6
+
7
+ If you want to contribute features or fixes please write your specs and code and submit pull requests to these github.com users:
8
+
9
+ - saturnflyer
10
+ - artofmission
11
+
12
+ == Dependencies
13
+
14
+ * Requires Radiant 0.7.1 or greater.
15
+ * Requires will_paginate Rails plugin (http://github.com/mislav/will_paginate/tree/master)
16
+ * Requires fastercsv 1.2.3 or greater.
17
+ * Requires sanitize 1.0.8 or greater.
18
+
19
+ == Installation
20
+
21
+ To install Comments, run:
22
+
23
+ rake radiant:extensions:comments:install
24
+
25
+ This _WILL_ delete any snippets named 'comment', 'comments' and 'comment_form' if these exist.
26
+
27
+ == More Help
28
+
29
+ See the included HELP docs here or read them in your Radiant interface with the Help extension installed.
30
+
31
+ == Contributors
32
+
33
+ * John Muhl
34
+ * Sven Schwyn
35
+ * Gerrit Kaiser
36
+ * Stephen Lombardo
37
+ * Benny Degezelle
38
+ * Frank Louwers (thanks to Jan De Poorter for the Mollom ruby lib)
39
+ * Jim Gay of http://www.saturnflyer.com, sponsored by http://ignitesocialmedia.com/.
40
+ * Michael Hale of http://halethegeek.com/, sponsored by http://ignitesocialmedia.com/.
41
+ * Nathaniel Talbott of http://terralien.com/, sponsored by http://ignitesocialmedia.com/.
42
+ * John Croisant
43
+ * Jon Leighton
44
+ * Witter Cheng
45
+ * Keith Bingman
46
+ * Sean Cribbs, partly sponsored by http://opscode.com/
47
+ * Ryan Heneise
48
+
49
+ If you contribute, go ahead and add your name to the list!
50
+
51
+ == Credits
52
+
53
+ Included icons come from the FamFamFam Silk icon set. http://famfamfam.com
data/Rakefile ADDED
@@ -0,0 +1,133 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gem|
4
+ gem.name = "radiant-comments-extension"
5
+ gem.summary = %Q{Comments Extension for Radiant CMS}
6
+ gem.description = %Q{Adds blog-like comment functionality to Radiant.}
7
+ gem.email = "jim@saturnflyer.com"
8
+ gem.homepage = "http://github.com/saturnflyer/radiant-comments-extension"
9
+ gem.authors = ['Jim Gay', 'Ryan Heneise', 'Sean Cribbs','John Muhl', 'Sven Schwyn', 'Gerrit Kaiser', 'Stephen Lombardo', 'Benny Degezelle', 'Frank Louwers', 'Michael Hale', 'Nathaniel Talbott', 'John Croisant', 'Jon Leighton', 'Witter Cheng', 'Keith Bingman']
10
+ gem.add_development_dependency "radiant"
11
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
12
+ end
13
+ rescue LoadError
14
+ puts "Jeweler (or a dependency) not available. This is only required if you plan to package dashboard as a gem."
15
+ end
16
+
17
+ # Determine where the RSpec plugin is by loading the boot
18
+ unless defined? RADIANT_ROOT
19
+ ENV["RAILS_ENV"] = "test"
20
+ case
21
+ when ENV["RADIANT_ENV_FILE"]
22
+ require File.dirname(ENV["RADIANT_ENV_FILE"]) + "/boot"
23
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
24
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
25
+ else
26
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
27
+ end
28
+ end
29
+
30
+ require 'rake'
31
+ require 'rake/rdoctask'
32
+ require 'rake/testtask'
33
+
34
+ rspec_base = File.expand_path(RADIANT_ROOT + '/vendor/plugins/rspec/lib')
35
+ $LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
36
+ require 'spec/rake/spectask'
37
+ require 'cucumber'
38
+ require 'cucumber/rake/task'
39
+
40
+ # Cleanup the RADIANT_ROOT constant so specs will load the environment
41
+ Object.send(:remove_const, :RADIANT_ROOT)
42
+
43
+ extension_root = File.expand_path(File.dirname(__FILE__))
44
+
45
+ task :default => :spec
46
+ task :stats => "spec:statsetup"
47
+
48
+ desc "Run all specs in spec directory"
49
+ Spec::Rake::SpecTask.new(:spec) do |t|
50
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
51
+ t.spec_files = FileList['spec/**/*_spec.rb']
52
+ end
53
+
54
+ task :features => 'spec:integration'
55
+
56
+ namespace :spec do
57
+ desc "Run all specs in spec directory with RCov"
58
+ Spec::Rake::SpecTask.new(:rcov) do |t|
59
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
60
+ t.spec_files = FileList['spec/**/*_spec.rb']
61
+ t.rcov = true
62
+ t.rcov_opts = ['--exclude', 'spec', '--rails']
63
+ end
64
+
65
+ desc "Print Specdoc for all specs"
66
+ Spec::Rake::SpecTask.new(:doc) do |t|
67
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
68
+ t.spec_files = FileList['spec/**/*_spec.rb']
69
+ end
70
+
71
+ [:models, :controllers, :views, :helpers].each do |sub|
72
+ desc "Run the specs under spec/#{sub}"
73
+ Spec::Rake::SpecTask.new(sub) do |t|
74
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
75
+ t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
76
+ end
77
+ end
78
+
79
+ desc "Run the Cucumber features"
80
+ Cucumber::Rake::Task.new(:integration) do |t|
81
+ t.fork = true
82
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'pretty')]
83
+ # t.feature_pattern = "#{extension_root}/features/**/*.feature"
84
+ t.profile = "default"
85
+ end
86
+
87
+ # Setup specs for stats
88
+ task :statsetup do
89
+ require 'code_statistics'
90
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models)
91
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views)
92
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
93
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
94
+ ::CodeStatistics::TEST_TYPES << "Model specs"
95
+ ::CodeStatistics::TEST_TYPES << "View specs"
96
+ ::CodeStatistics::TEST_TYPES << "Controller specs"
97
+ ::CodeStatistics::TEST_TYPES << "Helper specs"
98
+ ::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
99
+ end
100
+
101
+ namespace :db do
102
+ namespace :fixtures do
103
+ desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
104
+ task :load => :environment do
105
+ require 'active_record/fixtures'
106
+ ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
107
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
108
+ Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ desc 'Generate documentation for the comments extension.'
116
+ Rake::RDocTask.new(:rdoc) do |rdoc|
117
+ rdoc.rdoc_dir = 'rdoc'
118
+ rdoc.title = 'CommentsExtension'
119
+ rdoc.options << '--line-numbers' << '--inline-source'
120
+ rdoc.rdoc_files.include('README')
121
+ rdoc.rdoc_files.include('lib/**/*.rb')
122
+ end
123
+
124
+ # For extensions that are in transition
125
+ desc 'Test the comments extension.'
126
+ Rake::TestTask.new(:test) do |t|
127
+ t.libs << 'lib'
128
+ t.pattern = 'test/**/*_test.rb'
129
+ t.verbose = true
130
+ end
131
+
132
+ # Load any custom rakefiles for extension
133
+ Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
data/TODO ADDED
@@ -0,0 +1,6 @@
1
+ = TODO:
2
+
3
+ * Write better specs.
4
+ * Move tests to specs.
5
+ * Add user notification message when a comment is posted.
6
+ * captcha mollom implementation
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.6
@@ -0,0 +1,130 @@
1
+ class Admin::CommentsController < ApplicationController
2
+
3
+ def index
4
+ @comments = load_comments
5
+ respond_to do |format|
6
+ format.html
7
+ format.csv { send_data @comments.to_csv, :filename => "#{File.basename(request.request_uri)}", :type => 'text/csv' }
8
+ end
9
+ end
10
+
11
+ def destroy
12
+ @comment = Comment.find(params[:id])
13
+ @comment.destroy
14
+ announce_comment_removed
15
+ clear_single_page_cache(@comment)
16
+ redirect_to :back
17
+ rescue ActiveRecord::RecordNotFound
18
+ redirect_to admin_comments_path
19
+ end
20
+
21
+ def destroy_unapproved
22
+ if Comment.unapproved.destroy_all
23
+ flash[:notice] = "You have removed all unapproved comments."
24
+ else
25
+ flash[:notice] = "I was unable to remove all unapproved comments."
26
+ end
27
+ redirect_to :back
28
+ end
29
+
30
+ def edit
31
+ @comment = Comment.find(params[:id])
32
+ rescue ActiveRecord::RecordNotFound
33
+ redirect_to admin_comments_path
34
+ end
35
+
36
+ def show
37
+ redirect_to edit_admin_comment_path(params[:id])
38
+ end
39
+
40
+ def update
41
+ @comment = Comment.find(params[:id])
42
+ begin
43
+ TextFilter.descendants.each do |filter|
44
+ @comment.content_html = filter.filter(@comment.content) if filter.filter_name == @comment.filter_id
45
+ end
46
+ @comment.update_attributes!(params[:comment])
47
+ clear_cache
48
+ flash[:notice] = "Comment Saved"
49
+ redirect_to :action => :index
50
+ rescue Exception => e
51
+ flash[:notice] = "There was an error saving the comment: #{e.message}"
52
+ render :action => :edit
53
+ end
54
+ end
55
+
56
+ def enable
57
+ @page = Page.find(params[:page_id])
58
+ @page.enable_comments = true
59
+ @page.save!
60
+ clear_cache
61
+ flash[:notice] = "Comments have been enabled for #{@page.title}"
62
+ redirect_to admin_pages_url
63
+ end
64
+
65
+ def approve
66
+ @comment = Comment.find(params[:id])
67
+ begin
68
+ @comment.approve!
69
+ rescue Comment::AntispamWarning => e
70
+ antispamnotice = "The antispam engine gave a warning: #{e}<br />"
71
+ end
72
+ clear_single_page_cache(@comment)
73
+ flash[:notice] = "Comment was successfully approved on page #{@comment.page.title}" + (antispamnotice ? " (#{antispamnotice})" : "")
74
+ redirect_to :back
75
+ end
76
+
77
+ def unapprove
78
+ @comment = Comment.find(params[:id])
79
+ begin
80
+ @comment.unapprove!
81
+ rescue Comment::AntispamWarning => e
82
+ antispamnotice = "The antispam engine gave a warning: #{e}"
83
+ end
84
+ clear_single_page_cache(@comment)
85
+ flash[:notice] = "Comment was successfully unapproved on page #{@comment.page.title}" + (antispamnotice ? " (#{antispamnotice})" : "" )
86
+ redirect_to :back
87
+ end
88
+
89
+
90
+ protected
91
+
92
+ def load_comments
93
+ status_scope.paginate(:page => params[:page])
94
+ end
95
+
96
+ def status_scope
97
+ case params[:status]
98
+ when 'approved'
99
+ base_scope.approved
100
+ when 'unapproved'
101
+ base_scope.unapproved
102
+ else
103
+ base_scope
104
+ end
105
+ end
106
+
107
+ def base_scope
108
+ @page = Page.find(params[:page_id]) if params[:page_id]
109
+ @page ? @page.comments : Comment.recent
110
+ end
111
+
112
+ def announce_comment_removed
113
+ flash[:notice] = "The comment was successfully removed from the site."
114
+ end
115
+
116
+ def clear_cache
117
+ if defined?(ResponseCache)
118
+ ResponseCache.instance.clear
119
+ else
120
+ Radiant::Cache.clear
121
+ end
122
+ end
123
+
124
+ def clear_single_page_cache(comment)
125
+ if comment && comment.page
126
+ clear_cache
127
+ end
128
+ end
129
+
130
+ end