[PATCH conductor 1/2] Fixing return_path in permissions#set_permission_object

ifarkas at redhat.com ifarkas at redhat.com
Wed Dec 21 12:49:11 UTC 2011


From: Imre Farkas <ifarkas at redhat.com>

https://bugzilla.redhat.com/show_bug.cgi?id=766473

The original parameterization of polymorphic_path doesn't work correctly with nested resources.
To handle this @polymorphic_path_extras is used by to_polymorphic_path_param method of the model.
---
 src/app/controllers/application_controller.rb      |    6 ++-
 src/app/controllers/deployables_controller.rb      |    2 +-
 src/app/controllers/permissions_controller.rb      |    7 ++-
 src/app/models/deployable.rb                       |    6 +++
 src/app/views/permissions/_permissions.html.haml   |    4 ++
 .../controllers/permissions_controller_spec.rb     |   43 ++++++++++++++++++++
 6 files changed, 63 insertions(+), 5 deletions(-)
 create mode 100644 src/spec/controllers/permissions_controller_spec.rb

diff --git a/src/app/controllers/application_controller.rb b/src/app/controllers/application_controller.rb
index 7e8394c..0044124 100644
--- a/src/app/controllers/application_controller.rb
+++ b/src/app/controllers/application_controller.rb
@@ -281,15 +281,17 @@ class ApplicationController < ActionController::Base
     %w[asc desc].include?(params[:order_dir]) ? params[:order_dir] : "asc"
   end
 
-  def add_permissions_inline(perm_obj, path_prefix = "")
+  def add_permissions_inline(perm_obj, path_prefix = '', polymorphic_path_extras = {})
     @permission_object = perm_obj
     @path_prefix = path_prefix
+    @polymorphic_path_extras = polymorphic_path_extras
     @roles = Role.find_all_by_scope(@permission_object.class.name)
     set_permissions_header
   end
 
-  def add_permissions_tab(perm_obj, path_prefix = "")
+  def add_permissions_tab(perm_obj, path_prefix = '', polymorphic_path_extras = {})
     @path_prefix = path_prefix
+    @polymorphic_path_extras = polymorphic_path_extras
     if "permissions" == params[:details_tab]
       require_privilege(Privilege::PERM_VIEW, perm_obj)
       @permission_object = perm_obj
diff --git a/src/app/controllers/deployables_controller.rb b/src/app/controllers/deployables_controller.rb
index 07556fb..9ed1aac 100644
--- a/src/app/controllers/deployables_controller.rb
+++ b/src/app/controllers/deployables_controller.rb
@@ -55,7 +55,7 @@ class DeployablesController < ApplicationController
     save_breadcrumb(catalog_deployable_path(@catalog, @deployable), @deployable.name)
     @providers = Provider.all
     @catalogs_options = Catalog.list_for_user(current_user, Privilege::VIEW).select {|c| !@deployable.catalogs.include?(c)}
-    add_permissions_inline(@deployable)
+    add_permissions_inline(@deployable, '', {:catalog_id => @catalog.id})
     @images_details = @deployable.get_image_details
     images = @deployable.fetch_images
     uuids = @deployable.fetch_image_uuids
diff --git a/src/app/controllers/permissions_controller.rb b/src/app/controllers/permissions_controller.rb
index a5c5bb7..3423923 100644
--- a/src/app/controllers/permissions_controller.rb
+++ b/src/app/controllers/permissions_controller.rb
@@ -186,6 +186,7 @@ class PermissionsController < ApplicationController
     obj_type = params[:permission_object_type]
     id = params[:permission_object_id]
     @path_prefix = params[:path_prefix]
+    @polymorphic_path_extras = params[:polymorphic_path_extras]
     @use_tabs = params[:use_tabs]
     unless obj_type or id
       @permission_object = BasePermissionObject.general_permission_scope
@@ -197,9 +198,11 @@ class PermissionsController < ApplicationController
       set_admin_users_tabs 'permissions'
     else
       @return_path = send("#{@path_prefix}polymorphic_path",
-                                     @permission_object,
+                          @permission_object.respond_to?(:to_polymorphic_path_param) ?
+                              @permission_object.to_polymorphic_path_param(@polymorphic_path_extras) :
+                              @permission_object,
                           @use_tabs == "yes" ? {:details_tab => :permissions,
-                            :only_tab => true} : {})
+                                                :only_tab => true} : {})
     end
     require_privilege(required_role, @permission_object)
   end
diff --git a/src/app/models/deployable.rb b/src/app/models/deployable.rb
index 59c4378..414c4d1 100644
--- a/src/app/models/deployable.rb
+++ b/src/app/models/deployable.rb
@@ -192,6 +192,12 @@ class Deployable < ActiveRecord::Base
     end
   end
 
+  def to_polymorphic_path_param(polymorphic_path_extras)
+    catalog = catalogs.find(polymorphic_path_extras[:catalog_id]) if (polymorphic_path_extras.present? &&
+        polymorphic_path_extras.has_key?(:catalog_id))
+    [catalog, self]
+  end
+
   private
 
   def self.apply_search_filter(search)
diff --git a/src/app/views/permissions/_permissions.html.haml b/src/app/views/permissions/_permissions.html.haml
index 8846dd8..3ac19de 100644
--- a/src/app/views/permissions/_permissions.html.haml
+++ b/src/app/views/permissions/_permissions.html.haml
@@ -5,6 +5,10 @@
     %li= restful_submit_tag t('edit'), "multi_update", multi_update_permissions_path, 'POST', :id => 'perm_edit_button', :class => 'hidden'
     = hidden_field_tag :permission_object_type, @permission_object.class.name
     = hidden_field_tag :permission_object_id, @permission_object.id
+
+    - @polymorphic_path_extras.each do |key, value|
+      = hidden_field_tag("polymorphic_path_extras[#{key}]", value)
+
     = hidden_field_tag :path_prefix, @path_prefix
     = hidden_field_tag :use_tabs, @use_tabs ? @use_tabs : (@tabs ? 'yes' : 'no')
 
diff --git a/src/spec/controllers/permissions_controller_spec.rb b/src/spec/controllers/permissions_controller_spec.rb
new file mode 100644
index 0000000..8c4741b
--- /dev/null
+++ b/src/spec/controllers/permissions_controller_spec.rb
@@ -0,0 +1,43 @@
+#
+#   Copyright 2011 Red Hat, Inc.
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+#
+
+require 'spec_helper'
+
+describe PermissionsController do
+
+  before(:each) do
+    @admin_permission = FactoryGirl.create :admin_permission
+    @admin = @admin_permission.user
+  end
+
+  it "should redirect to the appropriate path for the PermissionObject" do
+    mock_warden(@admin)
+
+    @catalog = FactoryGirl.create(:catalog)
+    @deployable = FactoryGirl.create(:deployable)
+    @catalog.deployables << @deployable
+
+    @old_role = FactoryGirl.create(:role)
+    @new_role = FactoryGirl.create(:role)
+    @permission = FactoryGirl.create(:permission, :user => @admin, :role => @old_role, :permission_object => @deployable)
+
+    post :multi_update, :permission_object_id => @deployable.id, :permission_object_type => @deployable.class.to_s,
+        :permission_role_selected => "#{@permission.id},#{@new_role.id}", :polymorphic_path_extras => { 'catalog_id' => @catalog.id}
+
+    response.should redirect_to catalog_deployable_path(@catalog, @deployable)
+  end
+
+end
-- 
1.7.6.4




More information about the aeolus-devel mailing list