Commit bad2d9fee69d536dab5d1bcd9e9ea96e8dec861f
1 parent
fc7e02f2
Exists in
master
and in
29 other branches
Captcha for comment reply and title is not mandatory for comment anymore
Showing
6 changed files
with
49 additions
and
35 deletions
Show diff stats
app/controllers/public/content_viewer_controller.rb
... | ... | @@ -119,7 +119,7 @@ class ContentViewerController < ApplicationController |
119 | 119 | def add_comment |
120 | 120 | @comment.author = user if logged_in? |
121 | 121 | @comment.article = @page |
122 | - if (logged_in? || @comment.reply_of_id || verify_recaptcha(:model => @comment, :message => _('Please type the words correctly'))) && @comment.save | |
122 | + if (logged_in? || verify_recaptcha(:model => @comment, :message => _('Please type the words correctly'))) && @comment.save | |
123 | 123 | @page.touch |
124 | 124 | @comment = nil # clear the comment form |
125 | 125 | redirect_to :action => 'view_page', :profile => params[:profile], :page => @page.explode_path, :view => params[:view] | ... | ... |
app/models/comment.rb
... | ... | @@ -2,7 +2,7 @@ class Comment < ActiveRecord::Base |
2 | 2 | |
3 | 3 | track_actions :leave_comment, :after_create, :keep_params => ["article.title", "article.url", "title", "url", "body"], :custom_target => :action_tracker_target |
4 | 4 | |
5 | - validates_presence_of :title, :body | |
5 | + validates_presence_of :body | |
6 | 6 | belongs_to :article, :counter_cache => true |
7 | 7 | belongs_to :author, :class_name => 'Person', :foreign_key => 'author_id' |
8 | 8 | has_many :children, :class_name => 'Comment', :foreign_key => 'reply_of_id', :dependent => :destroy | ... | ... |
app/views/content_viewer/_comment_form.rhtml
1 | +<script type="text/javascript"> | |
2 | +function submit_comment_form(button) { | |
3 | + <% if logged_in? %> | |
4 | + button.form.confirm.value = 'true'; | |
5 | + button.disabled = true; | |
6 | + button.form.submit(); | |
7 | + return true; | |
8 | + <% else %> | |
9 | + jQuery('#recaptcha-container').show(); | |
10 | + jQuery.colorbox({ inline : true, href : '#recaptcha-container', maxWidth : '600px', maxHeight : '300px' }); | |
11 | + jQuery('#confirm-captcha').unbind('click'); | |
12 | + jQuery('#confirm-captcha').bind('click', function() { | |
13 | + jQuery.colorbox.close(); | |
14 | + button.form.recaptcha_response_field.value = jQuery('#recaptcha_response_field').val(); | |
15 | + button.form.recaptcha_challenge_field.value = jQuery('#recaptcha_challenge_field').val(); | |
16 | + button.form.confirm.value = 'true'; | |
17 | + button.disabled = true; | |
18 | + button.form.submit(); | |
19 | + }); | |
20 | + <% end %> | |
21 | +} | |
22 | +</script> | |
23 | + | |
1 | 24 | <% focus_on = logged_in? ? 'title' : 'name' %> |
2 | 25 | |
3 | 26 | <% if @comment && @comment.errors.any? && @comment.reply_of_id.blank? %> |
... | ... | @@ -19,6 +42,23 @@ |
19 | 42 | <%= content_tag('a', '', :name => 'comment_form') + _('Post a comment') %> |
20 | 43 | </h4> |
21 | 44 | |
45 | +<% unless logged_in? %> | |
46 | + <div id="recaptcha-container" style="display: none"> | |
47 | + <h3><%= _('Please type the two words below') %></h3> | |
48 | + <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %> | |
49 | + <% button_bar do %> | |
50 | + <%= button_to_function :add, _('Confirm'), "return false", :id => "confirm-captcha" %> | |
51 | + <%= button_to_function :cancel, _('Cancel'), "jQuery.colorbox.close()" %> | |
52 | + <% end %> | |
53 | + </div> | |
54 | + | |
55 | + <script type="text/javascript"> | |
56 | + jQuery(document).bind('cbox_cleanup', function() { | |
57 | + jQuery('#recaptcha-container').hide(); | |
58 | + }); | |
59 | + </script> | |
60 | +<% end %> | |
61 | + | |
22 | 62 | <% form_tag( url_for(@page.view_url.merge({:only_path => true})), { :class => 'comment_form' } ) do %> |
23 | 63 | <%= hidden_field_tag(:confirm, 'false') %> |
24 | 64 | |
... | ... | @@ -32,15 +72,16 @@ |
32 | 72 | <%= _('If you are a registered user, you can login and be automatically recognized.') %> |
33 | 73 | </p> |
34 | 74 | |
75 | + <%= hidden_field_tag(:recaptcha_response_field, nil, :id => nil) %> | |
76 | + <%= hidden_field_tag(:recaptcha_challenge_field, nil, :id => nil) %> | |
77 | + | |
35 | 78 | <% end %> |
36 | 79 | |
37 | - <%= required labelled_form_field(_('Title'), text_field(:comment, :title)) %> | |
80 | + <%= labelled_form_field(_('Title'), text_field(:comment, :title)) %> | |
38 | 81 | <%= required labelled_form_field(_('Enter your comment'), text_area(:comment, :body, :rows => 5)) %> |
39 | 82 | |
40 | - <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) unless logged_in? %> | |
41 | - | |
42 | 83 | <% button_bar do %> |
43 | - <%= submit_button('add', _('Post comment'), :onclick => "this.form.confirm.value = 'true'; this.disabled = true; this.form.submit(); return true;") %> | |
84 | + <%= submit_button('add', _('Post comment'), :onclick => "submit_comment_form(this); return false") %> | |
44 | 85 | <%= button_to_function :cancel, _('Cancel'), "f=jQuery(this).parents('.post_comment_box'); f.removeClass('opened'); f.addClass('closed'); return false" %> |
45 | 86 | <% end %> |
46 | 87 | <% end %> | ... | ... |
public/javascripts/application.js
... | ... | @@ -662,7 +662,6 @@ function add_comment_reply_form(button, comment_id) { |
662 | 662 | var f = container.find('.comment_form'); |
663 | 663 | if (f.length == 0) { |
664 | 664 | f = jQuery('#page-comment-form .comment_form').clone(); |
665 | - f.find('#dynamic_recaptcha').remove(); | |
666 | 665 | f.find('.fieldWithErrors').map(function() { jQuery(this).replaceWith(jQuery(this).contents()); }); |
667 | 666 | f.prepend('<input type="hidden" name="comment[reply_of_id]" value="' + comment_id + '" />'); |
668 | 667 | container.append(f); | ... | ... |
public/stylesheets/application.css
... | ... | @@ -6173,31 +6173,6 @@ h1#agenda-title { |
6173 | 6173 | |
6174 | 6174 | /* Captcha */ |
6175 | 6175 | |
6176 | -.comment_reply #recaptcha_area { | |
6177 | - margin-bottom: 3px !important; | |
6178 | -} | |
6179 | - | |
6180 | -.comment_reply .recaptchatable tr td + td + td { | |
6181 | - display: none !important; | |
6182 | -} | |
6183 | - | |
6184 | -.comment_reply .recaptcha-container { | |
6185 | - width: 100%; | |
6186 | - overflow: hidden; | |
6187 | -} | |
6188 | - | |
6189 | -.comment_reply .recaptcha-container:hover { | |
6190 | - overflow: visible; | |
6191 | -} | |
6192 | - | |
6193 | -.comment_reply .recaptcha-container tr:hover td { | |
6194 | - background: transparent; | |
6195 | -} | |
6196 | - | |
6197 | -.comment_reply .recaptcha_image_cell { | |
6198 | - background: transparent !important; | |
6199 | -} | |
6200 | - | |
6201 | 6176 | /* Colorbox */ |
6202 | 6177 | |
6203 | 6178 | #cboxClose { | ... | ... |
test/unit/comment_test.rb
... | ... | @@ -5,8 +5,8 @@ class CommentTest < Test::Unit::TestCase |
5 | 5 | def setup |
6 | 6 | end |
7 | 7 | |
8 | - should 'have a name and require it' do | |
9 | - assert_mandatory(Comment.new, :title) | |
8 | + should 'have a name but not require it' do | |
9 | + assert_optional(Comment.new, :title) | |
10 | 10 | end |
11 | 11 | |
12 | 12 | should 'have a body and require it' do |
... | ... | @@ -197,7 +197,6 @@ class CommentTest < Test::Unit::TestCase |
197 | 197 | comment.valid? |
198 | 198 | |
199 | 199 | assert comment.errors.invalid?(:name) |
200 | - assert comment.errors.invalid?(:title) | |
201 | 200 | assert comment.errors.invalid?(:body) |
202 | 201 | end |
203 | 202 | ... | ... |