Commit 96b8283eba259184375397902f72b95501ee89ac
1 parent
81752a5c
Exists in
master
and in
28 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 @@ |
| 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 @@ |
| 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 @@ |
| 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 | + | ... | ... |