Commit 96b8283eba259184375397902f72b95501ee89ac
1 parent
81752a5c
Exists in
master
and in
29 other branches
[custom-forms] Controllers
Showing
3 changed files
with
304 additions
and
0 deletions
Show diff stats
plugins/custom_forms/controllers/custom_forms_plugin_myprofile_controller.rb
0 → 100644
@@ -0,0 +1,145 @@ | @@ -0,0 +1,145 @@ | ||
1 | +class CustomFormsPluginMyprofileController < MyProfileController | ||
2 | + def index | ||
3 | + @forms = CustomFormsPlugin::Form.from(profile) | ||
4 | + end | ||
5 | + | ||
6 | + def create | ||
7 | + @form = CustomFormsPlugin::Form.new(:profile => profile) | ||
8 | + @fields = [] | ||
9 | + @empty_field = CustomFormsPlugin::Field.new | ||
10 | + if request.post? | ||
11 | + begin | ||
12 | + @form.update_attributes!(params[:form]) | ||
13 | + params[:fields] = format_kind(params[:fields]) | ||
14 | + params[:fields] = format_choices(params[:fields]) | ||
15 | + params[:fields] = set_form_id(params[:fields], @form.id) | ||
16 | + create_fields(new_fields(params)) | ||
17 | + session['notice'] = _('Form created') | ||
18 | + redirect_to :action => 'index' | ||
19 | + rescue Exception => exception | ||
20 | + logger.error(exception.to_s) | ||
21 | + session['notice'] = _('Form could not be created') | ||
22 | + end | ||
23 | + end | ||
24 | + end | ||
25 | + | ||
26 | + def edit | ||
27 | + @form = CustomFormsPlugin::Form.find(params[:id]) | ||
28 | + @fields = @form.fields | ||
29 | + @empty_field = CustomFormsPlugin::TextField.new | ||
30 | + if request.post? | ||
31 | + begin | ||
32 | + @form.update_attributes!(params[:form]) | ||
33 | + params[:fields] = format_kind(params[:fields]) | ||
34 | + params[:fields] = format_choices(params[:fields]) | ||
35 | + remove_fields(params, @form) | ||
36 | + create_fields(new_fields(params)) | ||
37 | + update_fields(edited_fields(params)) | ||
38 | + session['notice'] = _('Form updated') | ||
39 | + redirect_to :action => 'index' | ||
40 | + rescue Exception => exception | ||
41 | + logger.error(exception.to_s) | ||
42 | + session['notice'] = _('Form could not be updated') | ||
43 | + end | ||
44 | + end | ||
45 | + end | ||
46 | + | ||
47 | + def remove | ||
48 | + @form = CustomFormsPlugin::Form.find(params[:id]) | ||
49 | + begin | ||
50 | + @form.destroy | ||
51 | + session[:notice] = _('Form removed') | ||
52 | + rescue | ||
53 | + session[:notice] = _('Form could not be removed') | ||
54 | + end | ||
55 | + redirect_to :action => 'index' | ||
56 | + end | ||
57 | + | ||
58 | + def submissions | ||
59 | + @form = CustomFormsPlugin::Form.find(params[:id]) | ||
60 | + @submissions = @form.submissions | ||
61 | + end | ||
62 | + | ||
63 | + def show_submission | ||
64 | + @submission = CustomFormsPlugin::Submission.find(params[:id]) | ||
65 | + @form = @submission.form | ||
66 | + end | ||
67 | + | ||
68 | + private | ||
69 | + | ||
70 | + def new_fields(params) | ||
71 | + result = params[:fields].map {|id, hash| hash.has_key?(:real_id) ? nil : hash}.compact | ||
72 | + result.delete_if {|field| field[:name].blank?} | ||
73 | + result | ||
74 | + end | ||
75 | + | ||
76 | + def edited_fields(params) | ||
77 | + params[:fields].map {|id, hash| hash.has_key?(:real_id) ? hash : nil}.compact | ||
78 | + end | ||
79 | + | ||
80 | + def create_fields(fields) | ||
81 | + fields.each do |field| | ||
82 | + case field[:type] | ||
83 | + when 'text_field' | ||
84 | + CustomFormsPlugin::TextField.create!(field) | ||
85 | + when 'select_field' | ||
86 | + CustomFormsPlugin::SelectField.create!(field) | ||
87 | + else | ||
88 | + CustomFormsPlugin::Field.create!(field) | ||
89 | + end | ||
90 | + end | ||
91 | + end | ||
92 | + | ||
93 | + def update_fields(fields) | ||
94 | + fields.each do |field_attrs| | ||
95 | + field = CustomFormsPlugin::Field.find(field_attrs.delete(:real_id)) | ||
96 | + field.attributes = field_attrs | ||
97 | + field.save! if field.changed? | ||
98 | + end | ||
99 | + end | ||
100 | + | ||
101 | + def format_kind(fields) | ||
102 | + fields.each do |id, field| | ||
103 | + next if field[:kind].blank? | ||
104 | + kind = field.delete(:kind) | ||
105 | + case kind | ||
106 | + when 'radio' | ||
107 | + field[:list] = false | ||
108 | + field[:multiple] = false | ||
109 | + when 'check_box' | ||
110 | + field[:list] = false | ||
111 | + field[:multiple] = true | ||
112 | + when 'select' | ||
113 | + field[:list] = true | ||
114 | + field[:multiple] = false | ||
115 | + when 'multiple_select' | ||
116 | + field[:list] = true | ||
117 | + field[:multiple] = true | ||
118 | + end | ||
119 | + end | ||
120 | + fields | ||
121 | + end | ||
122 | + | ||
123 | + def format_choices(fields) | ||
124 | + fields.each do |id, field| | ||
125 | + next if !field.has_key?(:choices) | ||
126 | + field[:choices] = field[:choices].map {|key, value| value}.inject({}) do |result, choice| | ||
127 | + hash = (choice[:name].blank? || choice[:value].blank?) ? {} : {choice[:name] => choice[:value]} | ||
128 | + result.merge!(hash) | ||
129 | + end | ||
130 | + end | ||
131 | + fields | ||
132 | + end | ||
133 | + | ||
134 | + def remove_fields(params, form) | ||
135 | + present_fields = params[:fields].map{|id, value| value}.collect {|field| field[:real_id]}.compact | ||
136 | + form.fields.each {|field| field.destroy if !present_fields.include?(field.id.to_s) } | ||
137 | + end | ||
138 | + | ||
139 | + def set_form_id(fields, form_id) | ||
140 | + fields.each do |id, field| | ||
141 | + field[:form_id] = form_id | ||
142 | + end | ||
143 | + fields | ||
144 | + end | ||
145 | +end |
plugins/custom_forms/controllers/custom_forms_plugin_profile_controller.rb
0 → 100644
@@ -0,0 +1,45 @@ | @@ -0,0 +1,45 @@ | ||
1 | +class CustomFormsPluginProfileController < ProfileController | ||
2 | + | ||
3 | + before_filter :has_access, :show | ||
4 | + | ||
5 | + def show | ||
6 | + @form = CustomFormsPlugin::Form.find(params[:id]) | ||
7 | + if user | ||
8 | + @submission ||= CustomFormsPlugin::Submission.find_by_form_id_and_profile_id(@form.id,user.id) | ||
9 | + @submission ||= CustomFormsPlugin::Submission.new(:form_id => @form.id, :profile_id => user.id) | ||
10 | + else | ||
11 | + @submission ||= CustomFormsPlugin::Submission.new(:form_id => @form.id) | ||
12 | + end | ||
13 | + if request.post? | ||
14 | + begin | ||
15 | + extend(CustomFormsPlugin::Helper) | ||
16 | + answers = build_answers(params[:submission], @form) | ||
17 | + failed_answers = answers.select {|answer| !answer.valid? } | ||
18 | + if failed_answers.empty? | ||
19 | + if !user | ||
20 | + @submission.author_name = params[:author_name] | ||
21 | + @submission.author_email = params[:author_email] | ||
22 | + end | ||
23 | + @submission.save! | ||
24 | + answers.map {|answer| answer.submission = @submission; answer.save!} | ||
25 | + else | ||
26 | + @submission.valid? | ||
27 | + failed_answers.each do |answer| | ||
28 | + @submission.errors.add(answer.field.name.to_sym, answer.errors[answer.field.slug.to_sym]) | ||
29 | + end | ||
30 | + end | ||
31 | + session[:notice] = _('Submission saved') | ||
32 | + redirect_to :action => 'show' | ||
33 | + rescue | ||
34 | + session[:notice] = _('Submission could not be saved') | ||
35 | + end | ||
36 | + end | ||
37 | + end | ||
38 | + | ||
39 | + private | ||
40 | + | ||
41 | + def has_access | ||
42 | + form = CustomFormsPlugin::Form.find(params[:id]) | ||
43 | + render_access_denied if !form.accessible_to(user) | ||
44 | + end | ||
45 | +end |
plugins/custom_forms/test/functional/custom_forms_plugin_myprofile_controller_test.rb
0 → 100644
@@ -0,0 +1,114 @@ | @@ -0,0 +1,114 @@ | ||
1 | +require File.dirname(__FILE__) + '/../../../../test/test_helper' | ||
2 | +require File.dirname(__FILE__) + '/../../controllers/custom_forms_plugin_myprofile_controller' | ||
3 | + | ||
4 | +# Re-raise errors caught by the controller. | ||
5 | +class CustomFormsPluginMyprofileController; def rescue_action(e) raise e end; end | ||
6 | + | ||
7 | +class CustomFormsPluginMyprofileControllerTest < ActionController::TestCase | ||
8 | + def setup | ||
9 | + @controller = CustomFormsPluginMyprofileController.new | ||
10 | + @request = ActionController::TestRequest.new | ||
11 | + @response = ActionController::TestResponse.new | ||
12 | + @profile = create_user('profile').person | ||
13 | + login_as(@profile.identifier) | ||
14 | + environment = Environment.default | ||
15 | + environment.enable_plugin(CustomFormsPlugin) | ||
16 | + end | ||
17 | + | ||
18 | + attr_reader :profile | ||
19 | + | ||
20 | + should 'list forms associated with profile' do | ||
21 | + another_profile = fast_create(Profile) | ||
22 | + f1 = CustomFormsPlugin::Form.create!(:profile => profile, :name => 'Free Software') | ||
23 | + f2 = CustomFormsPlugin::Form.create!(:profile => profile, :name => 'Open Source') | ||
24 | + f3 = CustomFormsPlugin::Form.create!(:profile => another_profile, :name => 'Open Source') | ||
25 | + | ||
26 | + get :index, :profile => profile.identifier | ||
27 | + | ||
28 | + assert_includes assigns(:forms), f1 | ||
29 | + assert_includes assigns(:forms), f2 | ||
30 | + assert_not_includes assigns(:forms), f3 | ||
31 | + end | ||
32 | + | ||
33 | + should 'destroy form' do | ||
34 | + form = CustomFormsPlugin::Form.create!(:profile => profile, :name => 'Free Software') | ||
35 | + assert CustomFormsPlugin::Form.exists?(form.id) | ||
36 | + post :remove, :profile => profile.identifier, :id => form.id | ||
37 | + assert !CustomFormsPlugin::Form.exists?(form.id) | ||
38 | + end | ||
39 | + | ||
40 | + should 'create a form' do | ||
41 | + format = '%Y-%m-%d %H:%M' | ||
42 | + begining = Time.now.strftime(format) | ||
43 | + ending = (Time.now + 1.day).strftime('%Y-%m-%d %H:%M') | ||
44 | + assert_difference CustomFormsPlugin::Form, :count, 1 do | ||
45 | + post :create, :profile => profile.identifier, | ||
46 | + :form => { | ||
47 | + :name => 'My Form', | ||
48 | + :access => 'logged', | ||
49 | + :begining => begining, | ||
50 | + :ending => ending, | ||
51 | + :description => 'Cool form'}, | ||
52 | + :fields => { | ||
53 | + 1 => { | ||
54 | + :name => 'Name', | ||
55 | + :default_value => 'Jack', | ||
56 | + :type => 'text_field' | ||
57 | + }, | ||
58 | + 2 => { | ||
59 | + :name => 'Color', | ||
60 | + :list => '1', | ||
61 | + :type => 'select_field', | ||
62 | + :choices => { | ||
63 | + 1 => {:name => 'Red', :value => 'red'}, | ||
64 | + 2 => {:name => 'Blue', :value => 'blue'}, | ||
65 | + 3 => {:name => 'Black', :value => 'black'} | ||
66 | + } | ||
67 | + } | ||
68 | + } | ||
69 | + end | ||
70 | + | ||
71 | + form = CustomFormsPlugin::Form.find_by_name('My Form') | ||
72 | + assert_equal 'logged', form.access | ||
73 | + assert_equal begining, form.begining.strftime(format) | ||
74 | + assert_equal ending, form.ending.strftime(format) | ||
75 | + assert_equal 'Cool form', form.description | ||
76 | + assert_equal 2, form.fields.count | ||
77 | + | ||
78 | + f1 = form.fields.first | ||
79 | + f2 = form.fields.last | ||
80 | + | ||
81 | + assert_equal 'Name', f1.name | ||
82 | + assert_equal 'Jack', f1.default_value | ||
83 | + assert f1.kind_of?(CustomFormsPlugin::TextField) | ||
84 | + | ||
85 | + assert_equal 'Color', f2.name | ||
86 | + assert_equal 'red', f2.choices['Red'] | ||
87 | + assert_equal 'blue', f2.choices['Blue'] | ||
88 | + assert_equal 'black', f2.choices['Black'] | ||
89 | + assert f2.list | ||
90 | + assert f2.kind_of?(CustomFormsPlugin::SelectField) | ||
91 | + end | ||
92 | + | ||
93 | + should 'edit a form' do | ||
94 | + form = CustomFormsPlugin::Form.create!(:profile => profile, :name => 'Free Software') | ||
95 | + field = CustomFormsPlugin::TextField.create!(:form => form, :name => 'License') | ||
96 | + format = '%Y-%m-%d %H:%M' | ||
97 | + begining = Time.now.strftime(format) | ||
98 | + ending = (Time.now + 1.day).strftime('%Y-%m-%d %H:%M') | ||
99 | + | ||
100 | + post :edit, :profile => profile.identifier, :id => form.id, | ||
101 | + :form => {:name => 'My Form', :access => 'logged', :begining => begining, :ending => ending, :description => 'Cool form'}, | ||
102 | + :fields => {1 => {:real_id => field.id.to_s, :name => 'Source'}} | ||
103 | + | ||
104 | + form.reload | ||
105 | + field.reload | ||
106 | + | ||
107 | + assert_equal 'logged', form.access | ||
108 | + assert_equal begining, form.begining.strftime(format) | ||
109 | + assert_equal ending, form.ending.strftime(format) | ||
110 | + assert_equal 'Cool form', form.description | ||
111 | + assert_equal 'Source', field.name | ||
112 | + end | ||
113 | +end | ||
114 | + |