qwester 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -255,37 +255,4 @@ initializer:
255
255
 
256
256
  Qwester.active_admin_menu = 'none'
257
257
 
258
- See test/dummy/config/initializers/qwester.rb for an example
259
-
260
- You will also need to add the following to your config/routes so that you can
261
- reorder items:
262
-
263
- namespace :admin do
264
- resources :questionnaires do
265
- resources :questions, :only => [:move_up, :move_down] do
266
- member do
267
- get :move_up
268
- get :move_down
269
- end
270
- end
271
- end
272
-
273
- resources :questions do
274
- resources :answers, :only => [:move_up, :move_down, :remove] do
275
- member do
276
- get :move_up
277
- get :move_down
278
- get :remove
279
- end
280
- end
281
- end
282
-
283
- resources :rule_sets do
284
- resources :answers, :only => [:add, :delete] do
285
- member do
286
- put :add
287
- put :delete
288
- end
289
- end
290
- end
291
- end
258
+ See test/dummy/config/initializers/qwester.rb for an example
@@ -2,11 +2,16 @@ module Qwester
2
2
  class Presentation < ActiveRecord::Base
3
3
  attr_accessible :description, :name, :title, :questionnaire_ids, :default
4
4
 
5
- has_many :presentation_questionnaires
5
+ has_many(
6
+ :presentation_questionnaires,
7
+ :order => 'position'
8
+ )
6
9
 
7
10
  has_many(
8
11
  :questionnaires,
9
- :through => :presentation_questionnaires
12
+ :through => :presentation_questionnaires,
13
+ :uniq => true,
14
+ :order => 'position'
10
15
  )
11
16
  accepts_nested_attributes_for :questionnaires
12
17
 
@@ -41,5 +46,31 @@ module Qwester
41
46
  self.title = self.name.humanize unless self.title.present?
42
47
  end
43
48
 
49
+ def method_missing(symbol, *args, &block)
50
+ if symbol.to_sym == :position || acts_as_list_method?(symbol)
51
+ pass_acts_as_list_method_to(presentation_questionnaires, symbol, args.first)
52
+ else
53
+ super
54
+ end
55
+ end
56
+
57
+ # Allows acts_as_list methods to be used within the questionnaire.
58
+ #
59
+ # Usage:
60
+ #
61
+ # questionnaire.move_to_top(question)
62
+ # questionnaire.last?(question)
63
+ #
64
+ def pass_acts_as_list_method_to(presentation_questionnaires, symbol, questionnaire)
65
+ raise "A Questionnaire is needed to identify the PresentationQuesti" unless questionnaire.kind_of? Questionnaire
66
+ presentation_questionnaire = presentation_questionnaires.where(:questionnaire_id => questionnaire.id).first
67
+ presentation_questionnaire.send(symbol) if presentation_questionnaire
68
+ end
69
+
70
+ def acts_as_list_method?(symbol)
71
+ methods = ActiveRecord::Acts::List::InstanceMethods.instance_methods + ActiveRecord::Acts::List::InstanceMethods.private_instance_methods
72
+ methods.include?(symbol.to_sym)
73
+ end
74
+
44
75
  end
45
76
  end
@@ -4,5 +4,7 @@ module Qwester
4
4
 
5
5
  belongs_to :presentation
6
6
  belongs_to :questionnaire
7
+
8
+ acts_as_list :scope => :presentation
7
9
  end
8
10
  end
@@ -46,35 +46,22 @@ module Qwester
46
46
 
47
47
  private
48
48
  def method_missing(symbol, *args, &block)
49
- if acts_as_list_method?(symbol)
50
- pass_method_to_questionnaires_question(symbol, args.first)
51
- else
49
+ if symbol.to_sym == :position || acts_as_list_method?(symbol)
50
+ pass_acts_as_list_method_to_questionnaires_question(symbol, args.first)
51
+ else
52
52
  super
53
53
  end
54
54
  end
55
55
 
56
56
  # Allows acts_as_list methods to be used within the questionnaire.
57
- # If questions were the act_as_list object, you could do things like this
58
- #
59
- # questionnaire.questions.last.move_higher
60
- #
61
- # However, as questions are used on multiple questionnaires and they
62
- # need to be independently sortable within each questionnaire, it is the
63
- # through table model QuestionnairesQuestion that acts_as_list. To change
64
- # position the change must be made in the context of the questionnaire.
65
- # pass_method_to_questionnaires_question in combination with method_missing,
66
- # allows you to pass to a questionnaire the acts_as_list method together with
67
- # the question it needs to effect. The equivalent move_higher call then becomes:
68
- #
69
- # questionnaire.move_higher(questionnaire.questions.last)
70
- #
71
- # You can also do:
72
- #
57
+ #
58
+ # Usage:
59
+ #
73
60
  # questionnaire.move_to_top(question)
74
61
  # questionnaire.last?(question)
75
62
  #
76
- def pass_method_to_questionnaires_question(symbol, question)
77
- raise "A Question is needed to identify QuestionnairesQuestion" unless question.kind_of? Question
63
+ def pass_acts_as_list_method_to_questionnaires_question(symbol, question)
64
+ raise "A Question is needed to identify the QuestionnairesQuestion" unless question.kind_of? Question
78
65
  questionnaires_question = questionnaires_questions.where(:question_id => question.id).first
79
66
  questionnaires_question.send(symbol) if questionnaires_question
80
67
  end
@@ -83,6 +70,5 @@ module Qwester
83
70
  ActiveRecord::Acts::List::InstanceMethods.instance_methods.include?(symbol.to_sym)
84
71
  end
85
72
 
86
-
87
73
  end
88
74
  end
@@ -0,0 +1,5 @@
1
+ class AddPositionToQwesterPresentationQuestionnaires < ActiveRecord::Migration
2
+ def change
3
+ add_column :qwester_presentation_questionnaires, :position, :integer
4
+ end
5
+ end
@@ -28,6 +28,15 @@ module Qwester
28
28
  div(:style => 'display:inline-block;margin-right:20px;') do
29
29
  para image_tag(questionnaire.button_image.url(:thumbnail))
30
30
  para questionnaire.title
31
+ move_up_link = "&nbsp;"
32
+ move_down_link = "&nbsp;"
33
+ unless qwester_presentation.first?(questionnaire)
34
+ move_up_link = link_to('<', move_up_admin_qwester_presentation_path(qwester_presentation, :questionnaire_id => questionnaire.id))
35
+ end
36
+ unless qwester_presentation.last?(questionnaire)
37
+ move_down_link = link_to('>', move_down_admin_qwester_presentation_path(qwester_presentation, :questionnaire_id => questionnaire.id))
38
+ end
39
+ para [move_up_link, 'move', move_down_link].join(' ').html_safe
31
40
  end
32
41
  end
33
42
  para "Default: Will be inital presentation of quesitonnaires" if qwester_presentation.default?
@@ -48,5 +57,19 @@ module Qwester
48
57
  f.buttons
49
58
  end
50
59
 
60
+ member_action :move_up do
61
+ presentation = Presentation.find(params[:id])
62
+ questionnaire = Questionnaire.find(params[:questionnaire_id])
63
+ presentation.move_higher(questionnaire)
64
+ redirect_to admin_qwester_presentation_path(presentation)
65
+ end
66
+
67
+ member_action :move_down do
68
+ presentation = Presentation.find(params[:id])
69
+ questionnaire = Questionnaire.find(params[:questionnaire_id])
70
+ presentation.move_lower(questionnaire)
71
+ redirect_to admin_qwester_presentation_path(presentation)
72
+ end
73
+
51
74
  end
52
75
  end
@@ -1,10 +1,12 @@
1
1
  module Qwester
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
4
4
 
5
5
  # History
6
6
  # =======
7
7
  #
8
+ # 0.2.1 - Allows questionnaires to be positioned within a presentation
9
+ #
8
10
  # 0.2.0 - Adds weighting to answers
9
11
  # Weighting can be used to give some answers greater weight in comparisons.
10
12
  # Weighting can be aliased.
@@ -1,8 +1,8 @@
1
1
  namespace :qwester do
2
2
 
3
- # Usage: rake data:reset_positions RAILS_ENV=production
3
+ # Usage: rake data:reset_questionnaire_positions RAILS_ENV=production
4
4
  desc "Goes through each of the acts_as_list objects and resets the positions based on order they were added to the database"
5
- task :reset_positions => :environment do
5
+ task :reset_questionnaire_positions => :environment do
6
6
 
7
7
  Qwester::Questionnaire.all.each do |questionnaire|
8
8
  first_id = questionnaire.questionnaires_questions.minimum(:id)
@@ -22,4 +22,14 @@ namespace :qwester do
22
22
  after = Qwester::AnswerStore.count
23
23
  puts "#{before - after} answer stores removed, with #{after} remaining."
24
24
  end
25
+
26
+ desc "Reset positions of questionnaires within presentations"
27
+ task :reset_presentation_questionnaires_positions => :environment do
28
+ Qwester::Presentation.all.each do |presentation|
29
+ presentation.presentation_questionnaires.each_with_index do |presentation_questionnaire, index|
30
+ presentation_questionnaire.update_attribute(:position, index + 1)
31
+ end
32
+ puts "Presentation '#{presentation.name}' questionnaires postitioned #{presentation.presentation_questionnaires.collect(&:position)}"
33
+ end
34
+ end
25
35
  end
@@ -1,6 +1,6 @@
1
1
  # Be sure to restart your server when you modify this file.
2
2
 
3
- Dummy::Application.config.session_store :cookie_store, key: '_dummy_session'
3
+ Dummy::Application.config.session_store(:cookie_store, key: '_dummy_session')
4
4
 
5
5
  # Use the database for sessions instead of the cookie-based default,
6
6
  # which shouldn't be used to store highly confidential information
@@ -5,7 +5,7 @@
5
5
 
6
6
  # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7
7
  ActiveSupport.on_load(:action_controller) do
8
- wrap_parameters format: [:json]
8
+ wrap_parameters(format: [:json])
9
9
  end
10
10
 
11
11
  # Disable root element in JSON by default.
Binary file
@@ -0,0 +1,6 @@
1
+ # This migration comes from qwester (originally 20130502082540)
2
+ class AddPositionToQwesterPresentationQuestionnaires < ActiveRecord::Migration
3
+ def change
4
+ add_column :qwester_presentation_questionnaires, :position, :integer
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 => 20130402085424) do
14
+ ActiveRecord::Schema.define(:version => 20130502082731) do
15
15
 
16
16
  create_table "active_admin_comments", :force => true do |t|
17
17
  t.string "resource_id", :null => false
@@ -97,6 +97,7 @@ ActiveRecord::Schema.define(:version => 20130402085424) do
97
97
  t.integer "presentation_id"
98
98
  t.datetime "created_at", :null => false
99
99
  t.datetime "updated_at", :null => false
100
+ t.integer "position"
100
101
  end
101
102
 
102
103
  create_table "qwester_presentations", :force => true do |t|
Binary file