From 2719cb87c70781031f4bbcac0f4ca0500259b64e Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Sat, 2 Mar 2013 14:52:03 +0100 Subject: [PATCH] use state machine from controller and handle exception --- app/controllers/contexts_controller.rb | 71 ++++++++++++--------- app/views/contexts/_context_form.html.erb | 5 +- test/functional/contexts_controller_test.rb | 11 +++- 3 files changed, 54 insertions(+), 33 deletions(-) diff --git a/app/controllers/contexts_controller.rb b/app/controllers/contexts_controller.rb index a8dc33fa..7a312abd 100644 --- a/app/controllers/contexts_controller.rb +++ b/app/controllers/contexts_controller.rb @@ -91,47 +91,30 @@ class ContextsController < ApplicationController # Edit the details of the context # def update - params['context'] ||= {} - success_text = if params['field'] == 'name' && params['value'] - params['context']['id'] = params['id'] - params['context']['name'] = params['value'] - end + process_params_for_update - @original_context_state = @context.state @context.attributes = params["context"] @saved = @context.save + @state_saved = set_state_for_update(@new_state) + @saved = @saved && @state_saved if @saved - if boolean_param('wants_render') - @state_changed = (@original_context_state != @context.state) - @new_state = @context.state if @state_changed - @active_contexts = current_user.contexts.active - @hidden_contexts = current_user.contexts.hidden - @closed_contexts = current_user.contexts.closed - respond_to do |format| - format.js - end + @state_changed = (@original_context_state != @context.state) + @new_state = @context.state if @state_changed + @active_contexts = current_user.contexts.active + @hidden_contexts = current_user.contexts.hidden + @closed_contexts = current_user.contexts.closed + end - # TODO is this param ever used? is this dead code? - - elsif boolean_param('update_context_name') - @contexts = current_user.projects - render :template => 'contexts/update_context_name.js.rjs' - return - else - render :text => success_text || 'Success' - end - else - respond_to do |format| - format.js - format.xml { + respond_to do |format| + format.js + format.xml { if @saved render :xml => @context.to_xml( :except => :user_id ) else render :text => "Error on update: #{@context.errors.full_messages.inject("") {|v, e| v + e + " " }}", :status => 409 end } - end end end @@ -269,4 +252,34 @@ class ContextsController < ApplicationController init_data_for_sidebar end + def process_params_for_update + params['context'] ||= {} + @success_text = if params['field'] == 'name' && params['value'] + params['context']['id'] = params['id'] + params['context']['name'] = params['value'] + end + + @original_context_state = @context.state + @new_state = params['context']['state'] + params['context'].delete('state') + end + + def set_state_for_update(new_state) + begin + unless @original_context_state == new_state + if new_state == 'active' + @context.activate! + elsif new_state == 'hidden' + @context.hide! + elsif new_state == 'closed' + @context.close! + end + end + return true + rescue AASM::InvalidTransition + @context.errors.add(:state, "cannot be changed. The context cannot be closed if you have uncompleted actions in this context") + return false + end + end + end diff --git a/app/views/contexts/_context_form.html.erb b/app/views/contexts/_context_form.html.erb index 0079816b..996c9197 100644 --- a/app/views/contexts/_context_form.html.erb +++ b/app/views/contexts/_context_form.html.erb @@ -15,9 +15,8 @@
<% ['active', 'hidden', 'closed'].each do | state | %> <%= radio_button(:context, 'state', state, {:tabindex => next_tab_index}) %> <%= state.titlecase %> - <% end %> - - + <% end %> +

diff --git a/test/functional/contexts_controller_test.rb b/test/functional/contexts_controller_test.rb index 269419f8..d1295e18 100644 --- a/test/functional/contexts_controller_test.rb +++ b/test/functional/contexts_controller_test.rb @@ -31,7 +31,16 @@ class ContextsControllerTest < ActionController::TestCase assert_ajax_create_increments_count '@newcontext' end - # text feed + def test_update_handles_invalid_state_change + login_as :admin_user + context = users(:admin_user).contexts.first + xhr :put, :update, :id => context.id, :context => {:name => "@name", :state => 'closed'} + + assert_response 200 + assert /The context cannot be closed if you have uncompleted actions/.match(@response.body) + end + + # TXT feed def test_text_feed_content login_as :admin_user