qwester 0.3.0 → 0.3.1

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.
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