qwester 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +8 -8
  2. data/app/controllers/qwester/questionnaires_controller.rb +5 -1
  3. data/app/helpers/qwester/questionnaires_helper.rb +10 -1
  4. data/app/models/qwester/answer.rb +1 -1
  5. data/app/models/qwester/answer_store.rb +12 -2
  6. data/app/models/qwester/presentation.rb +1 -1
  7. data/app/models/qwester/presentation_questionnaire.rb +1 -1
  8. data/app/models/qwester/question.rb +1 -1
  9. data/app/models/qwester/questionnaire.rb +4 -2
  10. data/app/models/qwester/questionnaires_question.rb +1 -1
  11. data/app/models/qwester/rule_set.rb +1 -1
  12. data/app/views/qwester/questionnaires/_errors.html.erb +9 -0
  13. data/app/views/qwester/questionnaires/show.html.erb +1 -1
  14. data/db/migrate/20131119142009_add_must_complete_to_qwester_questionnaires.rb +5 -0
  15. data/lib/active_admin/admin/presentations.rb +1 -1
  16. data/lib/active_admin/admin/questionnaires.rb +8 -3
  17. data/lib/active_admin/admin/questions.rb +5 -1
  18. data/lib/active_admin/admin/rule_sets.rb +1 -1
  19. data/lib/qwester/version.rb +5 -1
  20. data/lib/qwester.rb +4 -0
  21. data/lib/rails/actionpack/lib/action_controller/base.rb +12 -2
  22. data/test/dummy/config/initializers/devise.rb +3 -0
  23. data/test/dummy/db/development.sqlite3 +0 -0
  24. data/test/dummy/db/migrate/20131119142050_add_must_complete_to_qwester_questionnaires.qwester.rb +6 -0
  25. data/test/dummy/db/schema.rb +2 -1
  26. data/test/dummy/db/test.sqlite3 +0 -0
  27. data/test/dummy/log/development.log +4328 -0
  28. data/test/dummy/log/test.log +50044 -0
  29. data/test/dummy/test/functional/qwester/questionnaires_controller_test.rb +28 -0
  30. data/test/dummy/tmp/cache/assets/C89/9C0/sprockets%2Fef0400d768d956b1a22f46b922796376 +0 -0
  31. data/test/dummy/tmp/cache/assets/CED/640/sprockets%2F11932203dc8ff571f5fe9c3877c654e2 +0 -0
  32. data/test/dummy/tmp/cache/assets/D25/F00/sprockets%2Fad0526f80ffd1529b10e987396979cfd +0 -0
  33. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  34. data/test/dummy/tmp/cache/assets/D95/AB0/sprockets%2Fb9dcf112d4bd336b4027fe71ca6d07d8 +0 -0
  35. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  36. data/test/dummy/tmp/cache/assets/DEA/360/sprockets%2F0b336bfd9ee211df3dbca3532c3c80dd +0 -0
  37. data/test/dummy/tmp/cache/assets/DFC/940/sprockets%2Fc0cd0c999c4f1fe1bd0b46d3267edb7d +0 -0
  38. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  39. data/test/dummy/tmp/cache/assets/E82/AA0/sprockets%2F5c8e0d124c1f8ea2bfdabf41bfbcb88c +0 -0
  40. data/test/unit/qwester/answer_store_test.rb +20 -0
  41. metadata +14 -2
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- Njk1Yzc3YmU1NzA5MDQxN2RiOWY4NjU4NTY4ODcwMmU1MWUwMjdmYw==
4
+ YWJjNjAyYzVlZDJmYTIxNzM0ZTRiMjFhMTVlYjU0YTQ2ZDhiNWZhOQ==
5
5
  data.tar.gz: !binary |-
6
- ODVkMDE2ZjNhODUyYjU4YjRiMGI5ZGQwMWM2YTNlNjI4YThhOWYzOA==
6
+ YTU1NTBjZTA4ZjEyNjRkMzg4ZjBmN2Q0ZTJiNDI0OGM3N2ZmMjhiNg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- N2RjNGJhNDk3ZjlhZmU0M2E3MWNlNzc4YjkyNDA3ZTQ1NmJiY2VmMjNmNzFk
10
- ZDMzYzQ2MGFiOThjZDg5ZWM0MWQ0MzgwOWZhOTliMzE5N2JkMGI3YzgyYjg0
11
- YjgwNjRkNDhkMTQyMzQ2ODAxNDNlNThmOWQ0MzliNjJkY2JjNTE=
9
+ NDcyNDk5Mjk1ZjZlMTMwMGJiNTg2NzExMzA1OTBiY2Q2ZjVhNjNmZGEyZWI1
10
+ ZmU2MDkyNjE0MjhmZDc1ZjU5NjY1ZTBjYTBiNDdmMDRiYWVmNmJiMmU5NDli
11
+ YzY2NmI0OWEzNjcwMzdjY2ZmNmFiMzg3NzEzMmJiNGQ0NDUzMGQ=
12
12
  data.tar.gz: !binary |-
13
- M2VhNGE3N2UzMGQ1NTgxNDM3N2MyNGE3YWQwY2Q4ZmIxNjU2ZTgxZWM3YWVm
14
- ZjY1Yzc4OTE2N2JmMGVkY2U0MzIzYzY2NzE5MzA1MDYzNDFjZGM1NDg4OTRl
15
- NTI3MmNmZDJiM2UwY2RlMjIyZDUxMzM2MTMwNTk2NGE2N2MwNTc=
13
+ OTQyY2RlNjFlOGFhODI2ZjUxZDRhOGQ5ODY3MDFmZjBkNDNmMGNlYjMwNDYy
14
+ NTNjY2Y0MzQwYWFjN2M4YjRmNzA1ZmU0YmQ5OTk1MjJmODFlZTMyOGY2NWQy
15
+ ZTY3MTI3OTlkNjNkNDNiMTc2NjUzZjJhNTU4MjcxYWRiODk2ODE=
@@ -12,7 +12,11 @@ module Qwester
12
12
  def update
13
13
  @questionnaire = Qwester::Questionnaire.find(params[:id])
14
14
  update_qwester_answer_store
15
- redirect_to questionnaires_path
15
+ if @questionnaire.errors.empty?
16
+ redirect_to questionnaires_path
17
+ else
18
+ render :show
19
+ end
16
20
  end
17
21
 
18
22
  def reset
@@ -15,12 +15,21 @@ module Qwester
15
15
  end
16
16
 
17
17
  def answer_checked(answer)
18
- answer_store_answers.include? answer
18
+ answer_store_answers.include?(answer) || params_includes_answer(answer)
19
19
  end
20
20
 
21
21
  def answer_store_answers
22
22
  answer_store = get_qwester_answer_store
23
23
  answer_store ? answer_store.answers : []
24
24
  end
25
+
26
+ # params should be of form: "question_id"=>{"1"=>{"answer_ids"=>["1"]}}
27
+ def params_includes_answer(answer)
28
+ question_ids = params[:question_id]
29
+ return nil unless question_ids.kind_of? Hash
30
+ answers = question_ids[answer.question_id.to_s]
31
+ return nil unless answers.kind_of? Hash
32
+ answers.values.flatten.include?(answer.id.to_s)
33
+ end
25
34
  end
26
35
  end
@@ -1,6 +1,6 @@
1
1
  module Qwester
2
2
  class Answer < ActiveRecord::Base
3
- if Qwester.rails_version == '3'
3
+ if Qwester.rails_three?
4
4
  attr_accessible :value, :question_id, :position, :weighting
5
5
  end
6
6
 
@@ -1,16 +1,18 @@
1
1
  module Qwester
2
2
  class AnswerStore < ActiveRecord::Base
3
- if Qwester.rails_version == '3'
3
+ if Qwester.rails_three?
4
4
  attr_accessible
5
5
  end
6
6
 
7
7
  has_and_belongs_to_many(
8
8
  :answers,
9
+ :class_name => 'Qwester::Answer',
9
10
  :join_table => :qwester_answer_stores_answers,
10
11
  :uniq => true
11
12
  )
12
13
  has_and_belongs_to_many(
13
- :questionnaires,
14
+ :questionnaires,
15
+ :class_name => 'Qwester::Questionnaire',
14
16
  :join_table => :qwester_answer_stores_questionnaires,
15
17
  :uniq => true
16
18
  )
@@ -38,8 +40,16 @@ module Qwester
38
40
  make_copy
39
41
  end
40
42
 
43
+ def completed_questionnaires
44
+ questionnaires.select{|q| (q.questions.collect(&:id) - completed_question_ids).empty?}
45
+ end
46
+
41
47
  private
42
48
 
49
+ def completed_question_ids
50
+ answers.collect(&:question_id)
51
+ end
52
+
43
53
  def generate_session_id
44
54
  if !self.session_id or self.session_id.empty?
45
55
  self.session_id = session_id_not_in_database
@@ -1,6 +1,6 @@
1
1
  module Qwester
2
2
  class Presentation < ActiveRecord::Base
3
- if Qwester.rails_version == '3'
3
+ if Qwester.rails_three?
4
4
  attr_accessible :description, :name, :title, :questionnaire_ids, :default
5
5
  end
6
6
 
@@ -1,6 +1,6 @@
1
1
  module Qwester
2
2
  class PresentationQuestionnaire < ActiveRecord::Base
3
- if Qwester.rails_version == '3'
3
+ if Qwester.rails_three?
4
4
  attr_accessible :presentation_id, :questionnaire_id
5
5
  end
6
6
 
@@ -1,6 +1,6 @@
1
1
  module Qwester
2
2
  class Question < ActiveRecord::Base
3
- if Qwester.rails_version == '3'
3
+ if Qwester.rails_three?
4
4
  attr_accessible :title, :description, :ref, :answers_attributes, :multi_answer
5
5
  end
6
6
 
@@ -1,7 +1,7 @@
1
1
  module Qwester
2
2
  class Questionnaire < ActiveRecord::Base
3
- if Qwester.rails_version == '3'
4
- attr_accessible :title, :description, :button_image, :question_ids
3
+ if Qwester.rails_three?
4
+ attr_accessible :title, :description, :button_image, :question_ids, :must_complete
5
5
  end
6
6
 
7
7
  has_many(
@@ -11,6 +11,7 @@ module Qwester
11
11
 
12
12
  has_many(
13
13
  :questions,
14
+ :class_name => 'Qwester::Question',
14
15
  :uniq => true,
15
16
  :through => :questionnaires_questions,
16
17
  :order => 'position'
@@ -18,6 +19,7 @@ module Qwester
18
19
 
19
20
  has_many(
20
21
  :answers,
22
+ :class_name => 'Qwester::Answer',
21
23
  :through => :questions,
22
24
  :uniq => true
23
25
  )
@@ -1,6 +1,6 @@
1
1
  module Qwester
2
2
  class QuestionnairesQuestion < ActiveRecord::Base
3
- if Qwester.rails_version == '3'
3
+ if Qwester.rails_three?
4
4
  attr_accessible :position
5
5
  end
6
6
 
@@ -1,7 +1,7 @@
1
1
  require 'array_logic'
2
2
  module Qwester
3
3
  class RuleSet < ActiveRecord::Base
4
- if Qwester.rails_version == '3'
4
+ if Qwester.rails_three?
5
5
  attr_accessible :title, :description, :answers, :url, :rule, :answer_ids, :link_text, :warning_id, :presentation
6
6
  end
7
7
 
@@ -0,0 +1,9 @@
1
+ <% if @questionnaire and @questionnaire.errors.present? %>
2
+ <div class="error">
3
+ <h2>Error detected</h2>
4
+ <ul>
5
+ <% @questionnaire.errors.full_messages.each do |message| %>
6
+ <%= content_tag('li', message, class: 'error_message') %>
7
+ <% end %>
8
+ </div>
9
+ <% end %>
@@ -5,7 +5,7 @@
5
5
  <% else %>
6
6
  <h2>Questions</h2>
7
7
  <% end %>
8
-
8
+ <%= render 'errors' %>
9
9
  <%= form_for(@questionnaire, :url => questionnaire_path(@questionnaire)) do |form| %>
10
10
  <ul>
11
11
 
@@ -0,0 +1,5 @@
1
+ class AddMustCompleteToQwesterQuestionnaires < ActiveRecord::Migration
2
+ def change
3
+ add_column :qwester_questionnaires, :must_complete, :boolean
4
+ end
5
+ end
@@ -66,7 +66,7 @@ module Qwester
66
66
  ]
67
67
  )
68
68
  end
69
- end
69
+ end unless Qwester.rails_three?
70
70
 
71
71
  member_action :move_up do
72
72
  presentation = Presentation.find(params[:id])
@@ -16,6 +16,9 @@ module Qwester
16
16
  column :questions do |questionnaire|
17
17
  questionnaire.questions.count
18
18
  end
19
+ column :must_complete do |questionnaire|
20
+ questionnaire.must_complete? ? 'Yes' : 'No'
21
+ end
19
22
  default_actions
20
23
  end
21
24
 
@@ -27,6 +30,7 @@ module Qwester
27
30
  else
28
31
  f.input :description, :input_html => { :rows => 3}
29
32
  end
33
+ f.input :must_complete
30
34
  f.input :button_image, :as => :file, :hint => f.template.image_tag(f.object.button_image.url(:link))
31
35
  f.input :questions, :as => :check_boxes, :collection => Question.all
32
36
  end
@@ -37,12 +41,12 @@ module Qwester
37
41
  def permitted_params
38
42
  params.permit(
39
43
  qwester_questionnaire: [
40
- :title, :description, :button_image,
44
+ :title, :description, :button_image, :must_complete,
41
45
  {question_ids: []}
42
46
  ]
43
- )
47
+ )
44
48
  end
45
- end
49
+ end unless Qwester.rails_three?
46
50
 
47
51
  show do
48
52
  div do
@@ -55,6 +59,7 @@ module Qwester
55
59
 
56
60
  div do
57
61
  h3 'Questions'
62
+ para("#{qwester_questionnaire.must_complete? ? 'A' : 'Not a'}ll must be completed")
58
63
  ul :id => 'question_list'
59
64
  qwester_questionnaire.questions.each do |question|
60
65
  li do
@@ -69,6 +69,10 @@ module Qwester
69
69
  @qwester_question.build_standard_answers
70
70
  end
71
71
 
72
+ end
73
+
74
+ controller do
75
+
72
76
  def permitted_params
73
77
  params.permit(
74
78
  qwester_question: [
@@ -78,7 +82,7 @@ module Qwester
78
82
  )
79
83
  end
80
84
 
81
- end
85
+ end unless Qwester.rails_three?
82
86
 
83
87
  end if defined?(ActiveAdmin)
84
88
 
@@ -149,7 +149,7 @@ EOF
149
149
  ]
150
150
  )
151
151
  end
152
- end
152
+ end unless Qwester.rails_three?
153
153
 
154
154
  show do
155
155
  div do
@@ -1,10 +1,14 @@
1
1
  module Qwester
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
4
4
 
5
5
  # History
6
6
  # =======
7
7
  #
8
+ # 0.3.1 - Adds facility to mark as questionnaire as 'must complete'
9
+ # When set, all questions must be answered before a questionnaire can be
10
+ # successfully submitted.
11
+ #
8
12
  # 0.3.0 - Allows qwester to be hosted in a rails 4 app
9
13
  #
10
14
  # 0.2.2 - Removes require statements not needed in production
data/lib/qwester.rb CHANGED
@@ -35,5 +35,9 @@ module Qwester
35
35
  def self.rails_version
36
36
  @rails_version ||= Rails.version.split('.').first if defined? Rails
37
37
  end
38
+
39
+ def self.rails_three?
40
+ rails_version == '3'
41
+ end
38
42
 
39
43
  end
@@ -5,8 +5,11 @@ module ActionController
5
5
  def update_qwester_answer_store
6
6
  if params_includes_answers?
7
7
  get_qwester_answer_store(true)
8
- add_answers_to_qwester_answer_store
9
- add_questionnaire_to_qwester_answer_store
8
+ ActiveRecord::Base.transaction do
9
+ add_answers_to_qwester_answer_store
10
+ add_questionnaire_to_qwester_answer_store
11
+ ensure_complete_all_questionnaires_completed
12
+ end
10
13
  end
11
14
  end
12
15
 
@@ -95,5 +98,12 @@ module ActionController
95
98
  def add_questionnaire_to_qwester_answer_store
96
99
  @qwester_answer_store.questionnaires << @questionnaire
97
100
  end
101
+
102
+ def ensure_complete_all_questionnaires_completed
103
+ if @questionnaire.must_complete? and !@qwester_answer_store.completed_questionnaires.include?(@questionnaire)
104
+ @questionnaire.errors.add(:base, "All questions must be answered in this questionnaire")
105
+ end
106
+ raise ActiveRecord::Rollback unless @questionnaire.errors.empty?
107
+ end
98
108
  end
99
109
  end
@@ -1,6 +1,9 @@
1
1
  # Use this hook to configure devise mailer, warden hooks and so forth.
2
2
  # Many of these configuration options can be set straight in your model.
3
3
  Devise.setup do |config|
4
+
5
+ config.secret_key = '778bf64a3ff719bae4179047012814a0ab280525f3b37e8bc9aba3b2928b2e110588950a4231070581e2155495a5bff3f252d5ce51a9dbcb25410cb76d356b57'
6
+
4
7
  # ==> Mailer Configuration
5
8
  # Configure the e-mail address which will be shown in Devise::Mailer,
6
9
  # note that it will be overwritten if you use your own mailer class with default "from" parameter.
Binary file
@@ -0,0 +1,6 @@
1
+ # This migration comes from qwester (originally 20131119142009)
2
+ class AddMustCompleteToQwesterQuestionnaires < ActiveRecord::Migration
3
+ def change
4
+ add_column :qwester_questionnaires, :must_complete, :boolean
5
+ end
6
+ end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended to check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(:version => 20130502082731) do
14
+ ActiveRecord::Schema.define(:version => 20131119142050) do
15
15
 
16
16
  create_table "active_admin_comments", :force => true do |t|
17
17
  t.string "resource_id", :null => false
@@ -118,6 +118,7 @@ ActiveRecord::Schema.define(:version => 20130502082731) do
118
118
  t.string "button_image_content_type"
119
119
  t.integer "button_image_file_size"
120
120
  t.datetime "button_image_updated_at"
121
+ t.boolean "must_complete"
121
122
  end
122
123
 
123
124
  create_table "qwester_questionnaires_questions", :force => true do |t|
Binary file