qwester 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|