diff --git a/app/controllers/administrate/application_controller.rb b/app/controllers/administrate/application_controller.rb index 6018e8a710ca3bc0e5d55d1ea1280f056b88e83b..ebe3c9146f049860f2cbcd43fc519ac5e673af22 100644 --- a/app/controllers/administrate/application_controller.rb +++ b/app/controllers/administrate/application_controller.rb @@ -4,7 +4,9 @@ module Administrate def index search_term = params[:search].to_s.strip - resources = Administrate::Search.new(resource_resolver, search_term).run + resources = Administrate::Search.new(scoped_resource, + dashboard_class, + search_term).run resources = resources.includes(*resource_includes) if resource_includes.any? resources = order.apply(resources) resources = resources.page(params[:page]).per(records_per_page) @@ -97,7 +99,7 @@ module Administrate end def dashboard - @_dashboard ||= resource_resolver.dashboard_class.new + @_dashboard ||= dashboard_class.new end def requested_resource @@ -105,7 +107,11 @@ module Administrate end def find_resource(param) - resource_scope.find(param) + scoped_resource.find(param) + end + + def scoped_resource + resource_class.default_scoped end def resource_includes @@ -117,11 +123,14 @@ module Administrate permit(dashboard.permitted_attributes) end - delegate :resource_class, :resource_name, :namespace, :resource_scope, - to: :resource_resolver + delegate :resource_class, :resource_name, :namespace, to: :resource_resolver helper_method :namespace helper_method :resource_name + def dashboard_class + resource_resolver.dashboard_class + end + def resource_resolver @_resource_resolver ||= Administrate::ResourceResolver.new(controller_path) diff --git a/docs/customizing_controller_actions.md b/docs/customizing_controller_actions.md index b78858f9f5750e094dc3b12cf0b0ff0fc7c62223..866d3eeec408e87e1c17170ff3ece66fd21c98e5 100644 --- a/docs/customizing_controller_actions.md +++ b/docs/customizing_controller_actions.md @@ -28,5 +28,15 @@ class Admin::FoosController < Admin::ApplicationController # def find_resource(param) # Foo.find_by!(slug: param) # end + # + # Override this if you have certain roles that require a subset + # this will be used to set the records shown on the `index` action. + # def scoped_resource + # if current_user.super_admin? + # resource_class + # else + # resource_class.with_less_stuff + # end + # end end ``` diff --git a/lib/administrate/resource_resolver.rb b/lib/administrate/resource_resolver.rb index 7f6a25e8c6caf729a9c4d43787a13fff73dac70f..2a68ff0ec0e82ce7098922937b2e16d9b41929ef 100644 --- a/lib/administrate/resource_resolver.rb +++ b/lib/administrate/resource_resolver.rb @@ -16,10 +16,6 @@ module Administrate Object.const_get(resource_class_name) end - def resource_scope - dashboard_class.new.try(:resource_scope) || resource_class.default_scoped - end - def resource_name model_path_parts.map(&:underscore).join("__").to_sym end diff --git a/lib/administrate/search.rb b/lib/administrate/search.rb index 824624694163da8ead11482ea1ddd92d398d8040..2b7fa453b084c74cba288fe52130a092d3a0ddfb 100644 --- a/lib/administrate/search.rb +++ b/lib/administrate/search.rb @@ -3,27 +3,26 @@ require "active_support/core_ext/object/blank" module Administrate class Search - def initialize(resolver, term) - @resolver = resolver + def initialize(scoped_resource, dashboard_class, term) + @dashboard_class = dashboard_class + @scoped_resource = scoped_resource @term = term end def run if @term.blank? - resource_scope.all + @scoped_resource.all else - resource_scope.where(query, *search_terms) + @scoped_resource.where(query, *search_terms) end end private - delegate :resource_class, :resource_scope, to: :resolver - def query search_attributes.map do |attr| table_name = ActiveRecord::Base.connection. - quote_table_name(resource_class.table_name) + quote_table_name(@scoped_resource.table_name) attr_name = ActiveRecord::Base.connection.quote_column_name(attr) "lower(#{table_name}.#{attr_name}) LIKE ?" end.join(" OR ") @@ -40,7 +39,7 @@ module Administrate end def attribute_types - resolver.dashboard_class::ATTRIBUTE_TYPES + @dashboard_class::ATTRIBUTE_TYPES end attr_reader :resolver, :term diff --git a/spec/lib/administrate/resource_resolver_spec.rb b/spec/lib/administrate/resource_resolver_spec.rb index 6458e7955c05794496d517e590ae3d7bda518ac9..5328132179b812e9b204565918712bbd63327469 100644 --- a/spec/lib/administrate/resource_resolver_spec.rb +++ b/spec/lib/administrate/resource_resolver_spec.rb @@ -60,38 +60,6 @@ describe Administrate::ResourceResolver do end end - describe "#resource_scope" do - it "defaults to model default scope when no override defined" do - begin - class Post - def self.default_scoped - "default scope" - end - end - class PostDashboard; end - resolver = Administrate::ResourceResolver.new("admin/posts") - expect(resolver.resource_scope).to eq("default scope") - ensure - remove_constants :PostDashboard, :Post - end - end - - it "uses defined scope when present" do - begin - class Post; end - class PostDashboard - def resource_scope - "a resource scope" - end - end - resolver = Administrate::ResourceResolver.new("admin/posts") - expect(resolver.resource_scope).to eq("a resource scope") - ensure - remove_constants :PostDashboard, :Post - end - end - end - describe "#resource_title" do it "handles global-namepsace models" do resolver = Administrate::ResourceResolver.new("admin/users") diff --git a/spec/lib/administrate/search_spec.rb b/spec/lib/administrate/search_spec.rb index a85807eabd94846e024ba15277f4bc495ecebf82..9785ca54836c7a4873aab689d031173273669bc9 100644 --- a/spec/lib/administrate/search_spec.rb +++ b/spec/lib/administrate/search_spec.rb @@ -17,12 +17,12 @@ describe Administrate::Search do describe "#run" do it "returns all records when no search term" do begin - class User; end - scope = double(all: nil) - resolver = double(resource_class: User, dashboard_class: MockDashboard, - resource_scope: scope) - search = Administrate::Search.new(resolver, nil) - expect(scope).to receive(:all) + class User < ActiveRecord::Base; end + scoped_object = User.default_scoped + search = Administrate::Search.new(scoped_object, + MockDashboard, + nil) + expect(scoped_object).to receive(:all) search.run ensure @@ -32,12 +32,12 @@ describe Administrate::Search do it "returns all records when search is empty" do begin - class User; end - scope = double(all: nil) - resolver = double(resource_class: User, dashboard_class: MockDashboard, - resource_scope: scope) - search = Administrate::Search.new(resolver, " ") - expect(scope).to receive(:all) + class User < ActiveRecord::Base; end + scoped_object = User.default_scoped + search = Administrate::Search.new(scoped_object, + MockDashboard, + " ") + expect(scoped_object).to receive(:all) search.run ensure @@ -48,17 +48,17 @@ describe Administrate::Search do it "searches using lower() + LIKE for all searchable fields" do begin class User < ActiveRecord::Base; end - scope = double(where: nil) - resolver = double(resource_class: User, dashboard_class: MockDashboard, - resource_scope: scope) - search = Administrate::Search.new(resolver, "test") + scoped_object = User.default_scoped + search = Administrate::Search.new(scoped_object, + MockDashboard, + "test") expected_query = [ "lower(\"users\".\"name\") LIKE ?"\ " OR lower(\"users\".\"email\") LIKE ?", "%test%", "%test%", ] - expect(scope).to receive(:where).with(*expected_query) + expect(scoped_object).to receive(:where).with(*expected_query) search.run ensure @@ -69,43 +69,22 @@ describe Administrate::Search do it "converts search term lower case for latin and cyrillic strings" do begin class User < ActiveRecord::Base; end - scope = double(where: nil) - resolver = double(resource_class: User, dashboard_class: MockDashboard, - resource_scope: scope) - search = Administrate::Search.new(resolver, "ТеÑÑ‚ Test") + scoped_object = User.default_scoped + search = Administrate::Search.new(scoped_object, + MockDashboard, + "ТеÑÑ‚ Test") expected_query = [ "lower(\"users\".\"name\") LIKE ?"\ " OR lower(\"users\".\"email\") LIKE ?", "%теÑÑ‚ test%", "%теÑÑ‚ test%", ] - expect(scope).to receive(:where).with(*expected_query) + expect(scoped_object).to receive(:where).with(*expected_query) search.run ensure remove_constants :User end end - - it "respects Dashboard#resource_scope when defined" do - begin - class MockScope - end - class User < ActiveRecord::Base - scope :my_scope, -> { MockScope } - end - class UserDashboard < Administrate::BaseDashboard - def resource_scope - User.my_scope - end - end - resolver = Administrate::ResourceResolver.new("admin/users") - search = Administrate::Search.new(resolver, nil) - expect(MockScope).to receive(:all) - search.run - ensure - remove_constants :User, :UserDashboard, :MockScope - end - end end end