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.
- checksums.yaml +8 -8
- data/app/controllers/qwester/questionnaires_controller.rb +5 -1
- data/app/helpers/qwester/questionnaires_helper.rb +10 -1
- data/app/models/qwester/answer.rb +1 -1
- data/app/models/qwester/answer_store.rb +12 -2
- data/app/models/qwester/presentation.rb +1 -1
- data/app/models/qwester/presentation_questionnaire.rb +1 -1
- data/app/models/qwester/question.rb +1 -1
- data/app/models/qwester/questionnaire.rb +4 -2
- data/app/models/qwester/questionnaires_question.rb +1 -1
- data/app/models/qwester/rule_set.rb +1 -1
- data/app/views/qwester/questionnaires/_errors.html.erb +9 -0
- data/app/views/qwester/questionnaires/show.html.erb +1 -1
- data/db/migrate/20131119142009_add_must_complete_to_qwester_questionnaires.rb +5 -0
- data/lib/active_admin/admin/presentations.rb +1 -1
- data/lib/active_admin/admin/questionnaires.rb +8 -3
- data/lib/active_admin/admin/questions.rb +5 -1
- data/lib/active_admin/admin/rule_sets.rb +1 -1
- data/lib/qwester/version.rb +5 -1
- data/lib/qwester.rb +4 -0
- data/lib/rails/actionpack/lib/action_controller/base.rb +12 -2
- data/test/dummy/config/initializers/devise.rb +3 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20131119142050_add_must_complete_to_qwester_questionnaires.qwester.rb +6 -0
- data/test/dummy/db/schema.rb +2 -1
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +4328 -0
- data/test/dummy/log/test.log +50044 -0
- data/test/dummy/test/functional/qwester/questionnaires_controller_test.rb +28 -0
- data/test/dummy/tmp/cache/assets/C89/9C0/sprockets%2Fef0400d768d956b1a22f46b922796376 +0 -0
- data/test/dummy/tmp/cache/assets/CED/640/sprockets%2F11932203dc8ff571f5fe9c3877c654e2 +0 -0
- data/test/dummy/tmp/cache/assets/D25/F00/sprockets%2Fad0526f80ffd1529b10e987396979cfd +0 -0
- data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/D95/AB0/sprockets%2Fb9dcf112d4bd336b4027fe71ca6d07d8 +0 -0
- data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/DEA/360/sprockets%2F0b336bfd9ee211df3dbca3532c3c80dd +0 -0
- data/test/dummy/tmp/cache/assets/DFC/940/sprockets%2Fc0cd0c999c4f1fe1bd0b46d3267edb7d +0 -0
- data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/E82/AA0/sprockets%2F5c8e0d124c1f8ea2bfdabf41bfbcb88c +0 -0
- data/test/unit/qwester/answer_store_test.rb +20 -0
- metadata +14 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YWJjNjAyYzVlZDJmYTIxNzM0ZTRiMjFhMTVlYjU0YTQ2ZDhiNWZhOQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YTU1NTBjZTA4ZjEyNjRkMzg4ZjBmN2Q0ZTJiNDI0OGM3N2ZmMjhiNg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDcyNDk5Mjk1ZjZlMTMwMGJiNTg2NzExMzA1OTBiY2Q2ZjVhNjNmZGEyZWI1
|
10
|
+
ZmU2MDkyNjE0MjhmZDc1ZjU5NjY1ZTBjYTBiNDdmMDRiYWVmNmJiMmU5NDli
|
11
|
+
YzY2NmI0OWEzNjcwMzdjY2ZmNmFiMzg3NzEzMmJiNGQ0NDUzMGQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
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,16 +1,18 @@
|
|
1
1
|
module Qwester
|
2
2
|
class AnswerStore < ActiveRecord::Base
|
3
|
-
if Qwester.
|
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,7 +1,7 @@
|
|
1
1
|
module Qwester
|
2
2
|
class Questionnaire < ActiveRecord::Base
|
3
|
-
if Qwester.
|
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
|
)
|
@@ -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 %>
|
@@ -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
|
|
data/lib/qwester/version.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
module Qwester
|
2
|
-
VERSION = "0.3.
|
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
@@ -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
|
-
|
9
|
-
|
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
|
data/test/dummy/db/schema.rb
CHANGED
@@ -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 =>
|
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|
|
data/test/dummy/db/test.sqlite3
CHANGED
Binary file
|