noodall-form-builder 0.2.11 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +2 -1
 - data/app/controllers/noodall/form_responses_controller.rb +5 -3
 - data/app/models/noodall/field.rb +1 -1
 - data/app/models/noodall/form.rb +1 -1
 - data/app/models/noodall/form_response.rb +12 -13
 - data/app/views/noodall/form_responses/_form.html.erb +1 -1
 - data/features/form_module.feature +6 -3
 - data/features/step_definitions/form_builder_steps.rb +1 -1
 - data/features/step_definitions/spam_steps.rb +5 -0
 - data/lib/noodall/form_builder/version.rb +1 -1
 - data/spec/dummy/config/initializers/dragonfly.rb +0 -1
 - metadata +6 -5
 
    
        data/Gemfile
    CHANGED
    
    
| 
         @@ -10,14 +10,16 @@ module Noodall 
     | 
|
| 
       10 
10 
     | 
    
         
             
                  @form = Noodall::Form.find(params[:form_id])
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
                  @form_response = @form.responses.build(params[:form_response])
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
      
 13 
     | 
    
         
            +
                  
         
     | 
| 
      
 14 
     | 
    
         
            +
                  #If the form response hasn't been constructed properly (i.e. a random spam POST)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  raise MongoMapper::DocumentNotFound, "Form response does not match form" unless @form_response.correct_fields?
         
     | 
| 
      
 16 
     | 
    
         
            +
                  
         
     | 
| 
       14 
17 
     | 
    
         
             
                  @form_response.ip = request.remote_ip
         
     | 
| 
       15 
18 
     | 
    
         
             
                  @form_response.referrer = request.referer if @form_response.referrer.blank?
         
     | 
| 
       16 
19 
     | 
    
         
             
                  @form_response.created_at = Time.zone.now
         
     | 
| 
       17 
20 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
                  respond_to do |format|
         
     | 
| 
      
 21 
     | 
    
         
            +
                  respond_to do |format|        
         
     | 
| 
       19 
22 
     | 
    
         
             
                    if @form_response.valid? and @form_response.save
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
23 
     | 
    
         
             
                      if @form_response.is_spam?
         
     | 
| 
       22 
24 
     | 
    
         
             
                        logger.info "Form response was deemed to be spam: #{@form_response.inspect}"
         
     | 
| 
       23 
25 
     | 
    
         
             
                      else
         
     | 
    
        data/app/models/noodall/field.rb
    CHANGED
    
    
    
        data/app/models/noodall/form.rb
    CHANGED
    
    | 
         @@ -12,7 +12,7 @@ module Noodall 
     | 
|
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
                MANDATORY_FIELDS = ['Name','Email']
         
     | 
| 
       14 
14 
     | 
    
         
             
                many :fields, :class => Noodall::Field
         
     | 
| 
       15 
     | 
    
         
            -
                many :responses, :class => Noodall::FormResponse do
         
     | 
| 
      
 15 
     | 
    
         
            +
                many :responses, :class => Noodall::FormResponse, :foreign_key => 'noodall_form_id' do
         
     | 
| 
       16 
16 
     | 
    
         
             
                  def ham
         
     | 
| 
       17 
17 
     | 
    
         
             
                    self.select {|r| r.spaminess < (self.class.defensio_config['spam_threshold'] || 0.75)}
         
     | 
| 
       18 
18 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -21,6 +21,13 @@ module Noodall 
     | 
|
| 
       21 
21 
     | 
    
         
             
                def required_fields
         
     | 
| 
       22 
22 
     | 
    
         
             
                  self.form.fields.select{ |f| f.required? }
         
     | 
| 
       23 
23 
     | 
    
         
             
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
                
         
     | 
| 
      
 25 
     | 
    
         
            +
                def correct_fields?
         
     | 
| 
      
 26 
     | 
    
         
            +
                  self.form.fields.each do |f|
         
     | 
| 
      
 27 
     | 
    
         
            +
                    return false unless self.respond_to?(f.name.downcase.to_sym)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
                  return true
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
       24 
31 
     | 
    
         | 
| 
       25 
32 
     | 
    
         
             
                def approve!
         
     | 
| 
       26 
33 
     | 
    
         
             
                  self.approved = true
         
     | 
| 
         @@ -53,12 +60,13 @@ module Noodall 
     | 
|
| 
       53 
60 
     | 
    
         
             
                def check_for_spam
         
     | 
| 
       54 
61 
     | 
    
         
             
                  if self.defensio_signature.blank?
         
     | 
| 
       55 
62 
     | 
    
         
             
                    status, response = self.class.defensio.post_document(self.defensio_attributes)
         
     | 
| 
       56 
     | 
    
         
            -
                    return unless status == 200
         
     | 
| 
      
 63 
     | 
    
         
            +
                    return true unless status == 200
         
     | 
| 
       57 
64 
     | 
    
         | 
| 
       58 
65 
     | 
    
         
             
                    self.defensio_signature = response['signature']
         
     | 
| 
       59 
66 
     | 
    
         
             
                    self.spaminess = response['spaminess']
         
     | 
| 
       60 
67 
     | 
    
         
             
                    self.approved = response['allow']
         
     | 
| 
       61 
68 
     | 
    
         
             
                  end
         
     | 
| 
      
 69 
     | 
    
         
            +
                  return true 
         
     | 
| 
       62 
70 
     | 
    
         
             
                end
         
     | 
| 
       63 
71 
     | 
    
         | 
| 
       64 
72 
     | 
    
         
             
                def self.defensio
         
     | 
| 
         @@ -91,20 +99,11 @@ module Noodall 
     | 
|
| 
       91 
99 
     | 
    
         
             
                validate :custom_validation
         
     | 
| 
       92 
100 
     | 
    
         | 
| 
       93 
101 
     | 
    
         
             
                def custom_validation
         
     | 
| 
       94 
     | 
    
         
            -
                  return if required_fields.nil? || !self.new_record?
         
     | 
| 
      
 102 
     | 
    
         
            +
                  return true if required_fields.nil? || !self.new_record?
         
     | 
| 
       95 
103 
     | 
    
         
             
                  required_fields.each do |field|
         
     | 
| 
       96 
     | 
    
         
            -
                    self. 
     | 
| 
       97 
     | 
    
         
            -
                  end
         
     | 
| 
       98 
     | 
    
         
            -
                end
         
     | 
| 
       99 
     | 
    
         
            -
                
         
     | 
| 
       100 
     | 
    
         
            -
                def method_missing(method)
         
     | 
| 
       101 
     | 
    
         
            -
                  # If the form doesn't have a field that matches this method, act normally. Otherwise, return nil to show the field is empty. 
         
     | 
| 
       102 
     | 
    
         
            -
                  if form.fields.select{|f| f.underscored_name.to_sym == method}.empty? 
         
     | 
| 
       103 
     | 
    
         
            -
                    super
         
     | 
| 
       104 
     | 
    
         
            -
                  else
         
     | 
| 
       105 
     | 
    
         
            -
                    return nil
         
     | 
| 
      
 104 
     | 
    
         
            +
                    self.errors.add(field.underscored_name.to_sym, "can't be empty") if self.send(field.underscored_name).blank?
         
     | 
| 
       106 
105 
     | 
    
         
             
                  end
         
     | 
| 
      
 106 
     | 
    
         
            +
                  return true if self.errors.empty? 
         
     | 
| 
       107 
107 
     | 
    
         
             
                end
         
     | 
| 
       108 
     | 
    
         
            -
                
         
     | 
| 
       109 
108 
     | 
    
         
             
              end
         
     | 
| 
       110 
109 
     | 
    
         
             
            end
         
     | 
| 
         @@ -5,7 +5,7 @@ 
     | 
|
| 
       5 
5 
     | 
    
         
             
                <%= error_messages_for :object => form_response %>
         
     | 
| 
       6 
6 
     | 
    
         
             
            <%    for field in form.fields %>
         
     | 
| 
       7 
7 
     | 
    
         
             
                  <div class="form-wrap">
         
     | 
| 
       8 
     | 
    
         
            -
                    <%= render :partial => "noodall/form_responses/fields/#{field 
     | 
| 
      
 8 
     | 
    
         
            +
                    <%= render :partial => "noodall/form_responses/fields/#{field_type(field)}", :locals => {:form_response => form_response, :f => f, :field => field} %>
         
     | 
| 
       9 
9 
     | 
    
         
             
                  </div>
         
     | 
| 
       10 
10 
     | 
    
         
             
            <%   end %>
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
         @@ -36,9 +36,12 @@ Feature: Form Module 
     | 
|
| 
       36 
36 
     | 
    
         | 
| 
       37 
37 
     | 
    
         
             
                Then the email address of the form should receive an email detailing the information submitted
         
     | 
| 
       38 
38 
     | 
    
         
             
                And they should receive an email confirming the request has been sent
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
      
 39 
     | 
    
         
            +
                
         
     | 
| 
      
 40 
     | 
    
         
            +
              Scenario: Bad data is POSTed
         
     | 
| 
      
 41 
     | 
    
         
            +
                Given content exists with a form added via the contact module
         
     | 
| 
      
 42 
     | 
    
         
            +
                Then some random fields are POSTed by a spam bot
         
     | 
| 
      
 43 
     | 
    
         
            +
                #todo - better way to structure this feature?
         
     | 
| 
      
 44 
     | 
    
         
            +
                
         
     | 
| 
       42 
45 
     | 
    
         
             
              Scenario: Validation
         
     | 
| 
       43 
46 
     | 
    
         
             
                Given content exists with a form added via the contact module
         
     | 
| 
       44 
47 
     | 
    
         
             
                When a website visitor visits the content
         
     | 
| 
         @@ -65,7 +65,7 @@ When /^I click "([^\"]*)" on the forms row in the Form List$/ do |arg1| 
     | 
|
| 
       65 
65 
     | 
    
         
             
            end
         
     | 
| 
       66 
66 
     | 
    
         | 
| 
       67 
67 
     | 
    
         
             
            Then /^I should receive a CSV file containing all the responses to that form$/ do
         
     | 
| 
       68 
     | 
    
         
            -
              CSV.parse(page. 
     | 
| 
      
 68 
     | 
    
         
            +
              CSV.parse(page.source).should have(10).things # 9 rows plus header
         
     | 
| 
       69 
69 
     | 
    
         
             
            end
         
     | 
| 
       70 
70 
     | 
    
         | 
| 
       71 
71 
     | 
    
         | 
| 
         @@ -1 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'noodall/dragonfly'
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,13 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: noodall-form-builder
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
              hash:  
     | 
| 
      
 4 
     | 
    
         
            +
              hash: 19
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
              segments: 
         
     | 
| 
       7 
7 
     | 
    
         
             
              - 0
         
     | 
| 
       8 
     | 
    
         
            -
              -  
     | 
| 
       9 
     | 
    
         
            -
              -  
     | 
| 
       10 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 8 
     | 
    
         
            +
              - 3
         
     | 
| 
      
 9 
     | 
    
         
            +
              - 0
         
     | 
| 
      
 10 
     | 
    
         
            +
              version: 0.3.0
         
     | 
| 
       11 
11 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       12 
12 
     | 
    
         
             
            authors: 
         
     | 
| 
       13 
13 
     | 
    
         
             
            - Steve England
         
     | 
| 
         @@ -17,7 +17,7 @@ autorequire: 
     | 
|
| 
       17 
17 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       18 
18 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
            date: 2011-07- 
     | 
| 
      
 20 
     | 
    
         
            +
            date: 2011-07-12 00:00:00 +01:00
         
     | 
| 
       21 
21 
     | 
    
         
             
            default_executable: 
         
     | 
| 
       22 
22 
     | 
    
         
             
            dependencies: 
         
     | 
| 
       23 
23 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
         @@ -116,6 +116,7 @@ files: 
     | 
|
| 
       116 
116 
     | 
    
         
             
            - features/step_definitions/email_steps.rb
         
     | 
| 
       117 
117 
     | 
    
         
             
            - features/step_definitions/form_builder_steps.rb
         
     | 
| 
       118 
118 
     | 
    
         
             
            - features/step_definitions/sign_in_steps.rb
         
     | 
| 
      
 119 
     | 
    
         
            +
            - features/step_definitions/spam_steps.rb
         
     | 
| 
       119 
120 
     | 
    
         
             
            - features/step_definitions/web_steps.rb
         
     | 
| 
       120 
121 
     | 
    
         
             
            - features/support/defensio_mock.rb
         
     | 
| 
       121 
122 
     | 
    
         
             
            - features/support/env.rb
         
     |