From 7c5dce6d8a218547ef5c355c40c112b7e422e6c7 Mon Sep 17 00:00:00 2001 From: Jeremy Prevost Date: Thu, 3 Oct 2024 09:52:33 -0400 Subject: [PATCH 1/3] Restrict SearchEvent and Term Administrate actions Why are these changes being introduced: * Our config was allowing Terms and SearchEvents to be created and edited in Administrate which is not intended Relevant ticket(s): * https://mitlibraries.atlassian.net/browse/TCO-92 How does this address that need: * Restricts routes which is how Administrate determins which features to enable * Terms and SearchEvents cannot be created or edited in Administrate * This still allows admins to destroy a Term in case we determine it contains sensitive information. SearchEvents can only be destroyed by destroying the associated Term and relying on Rails to cleanup the relationship. --- config/routes.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index ac74994..c8a2a83 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,8 +16,8 @@ resources :categories # Search activity models - resources :search_events - resources :terms + resources :search_events, only: [:index, :show] + resources :terms, only: [:index, :show, :destroy] # Tacos administration resources :users From ddb7c7f4d1b168a82a355ea95571e95cb264d6f8 Mon Sep 17 00:00:00 2001 From: Jeremy Prevost Date: Thu, 3 Oct 2024 09:53:40 -0400 Subject: [PATCH 2/3] Add Categorization read-only dashboard Why are these changes being introduced: * It will be convenient to have a mechansim in-app for authenticated users to look at our Categorizations prior to us building out custom reports/dashboards Relevant ticket(s): * https://mitlibraries.atlassian.net/browse/TCO-93 How does this address that need: * Adds a read-only administrate dashboard for Categorizations * Updates ability.rb to allow all authenticated users to view the dashboard Document any side effects to this change: This introduces minor changes to how Term and SearchEvents displays througout the Dashboards. Overall I think this is an improvement, but there may be edge cases where this change is not desired. --- .../admin/categorizations_controller.rb | 48 ++++++++++++ app/dashboards/categorization_dashboard.rb | 75 +++++++++++++++++++ app/dashboards/search_event_dashboard.rb | 1 - app/dashboards/term_dashboard.rb | 10 ++- app/models/ability.rb | 6 ++ config/routes.rb | 1 + 6 files changed, 136 insertions(+), 5 deletions(-) create mode 100644 app/controllers/admin/categorizations_controller.rb create mode 100644 app/dashboards/categorization_dashboard.rb diff --git a/app/controllers/admin/categorizations_controller.rb b/app/controllers/admin/categorizations_controller.rb new file mode 100644 index 0000000..5a1b2b1 --- /dev/null +++ b/app/controllers/admin/categorizations_controller.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module Admin + class CategorizationsController < Admin::ApplicationController + # Overwrite any of the RESTful controller actions to implement custom behavior + # For example, you may want to send an email after a foo is updated. + # + # def update + # super + # send_foo_updated_email(requested_resource) + # end + + # Override this method to specify custom lookup behavior. + # This will be used to set the resource for the `show`, `edit`, and `update` + # actions. + # + # def find_resource(param) + # Foo.find_by!(slug: param) + # end + + # The result of this lookup will be available as `requested_resource` + + # 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 + + # Override `resource_params` if you want to transform the submitted + # data before it's persisted. For example, the following would turn all + # empty values into nil values. It uses other APIs such as `resource_class` + # and `dashboard`: + # + # def resource_params + # params.require(resource_class.model_name.param_key). + # permit(dashboard.permitted_attributes(action_name)). + # transform_values { |value| value == "" ? nil : value } + # end + + # See https://administrate-demo.herokuapp.com/customizing_controller_actions + # for more information + end +end diff --git a/app/dashboards/categorization_dashboard.rb b/app/dashboards/categorization_dashboard.rb new file mode 100644 index 0000000..548c089 --- /dev/null +++ b/app/dashboards/categorization_dashboard.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +require 'administrate/base_dashboard' + +class CategorizationDashboard < Administrate::BaseDashboard + # ATTRIBUTE_TYPES + # a hash that describes the type of each of the model's fields. + # + # Each different type represents an Administrate::Field object, + # which determines how the attribute is displayed + # on pages throughout the dashboard. + ATTRIBUTE_TYPES = { + id: Field::Number, + category: Field::BelongsTo, + confidence: Field::Number.with_options(decimals: 2), + detector_version: Field::String, + term: Field::BelongsTo, + created_at: Field::DateTime, + updated_at: Field::DateTime + }.freeze + + # COLLECTION_ATTRIBUTES + # an array of attributes that will be displayed on the model's index page. + # + # By default, it's limited to four items to reduce clutter on index pages. + # Feel free to add, remove, or rearrange items. + COLLECTION_ATTRIBUTES = %i[ + id + category + confidence + detector_version + term + ].freeze + + # SHOW_PAGE_ATTRIBUTES + # an array of attributes that will be displayed on the model's show page. + SHOW_PAGE_ATTRIBUTES = %i[ + id + category + confidence + detector_version + term + created_at + updated_at + ].freeze + + # FORM_ATTRIBUTES + # an array of attributes that will be displayed + # on the model's form (`new` and `edit`) pages. + FORM_ATTRIBUTES = %i[ + category + confidence + detector_version + term + ].freeze + + # COLLECTION_FILTERS + # a hash that defines filters that can be used while searching via the search + # field of the dashboard. + # + # For example to add an option to search for open resources by typing "open:" + # in the search field: + # + # COLLECTION_FILTERS = { + # open: ->(resources) { resources.where(open: true) } + # }.freeze + COLLECTION_FILTERS = {}.freeze + + # Overwrite this method to customize how categorizations are displayed + # across all pages of the admin dashboard. + # + # def display_resource(categorization) + # "Categorization ##{categorization.id}" + # end +end diff --git a/app/dashboards/search_event_dashboard.rb b/app/dashboards/search_event_dashboard.rb index 922d58a..fe72c69 100644 --- a/app/dashboards/search_event_dashboard.rb +++ b/app/dashboards/search_event_dashboard.rb @@ -25,7 +25,6 @@ class SearchEventDashboard < Administrate::BaseDashboard COLLECTION_ATTRIBUTES = %i[ id source - term created_at ].freeze diff --git a/app/dashboards/term_dashboard.rb b/app/dashboards/term_dashboard.rb index c8d1090..578416e 100644 --- a/app/dashboards/term_dashboard.rb +++ b/app/dashboards/term_dashboard.rb @@ -13,6 +13,7 @@ class TermDashboard < Administrate::BaseDashboard id: Field::Number, phrase: Field::String, search_events: Field::HasMany, + categorizations: Field::HasMany, created_at: Field::DateTime, updated_at: Field::DateTime }.freeze @@ -23,7 +24,7 @@ class TermDashboard < Administrate::BaseDashboard # By default, it's limited to four items to reduce clutter on index pages. # Feel free to add, remove, or rearrange items. COLLECTION_ATTRIBUTES = %i[ - id + categorizations phrase search_events created_at @@ -35,6 +36,7 @@ class TermDashboard < Administrate::BaseDashboard id phrase search_events + categorizations created_at updated_at ].freeze @@ -62,7 +64,7 @@ class TermDashboard < Administrate::BaseDashboard # Overwrite this method to customize how terms are displayed # across all pages of the admin dashboard. # - # def display_resource(term) - # "Term ##{term.id}" - # end + def display_resource(term) + term.phrase + end end diff --git a/app/models/ability.rb b/app/models/ability.rb index 6687700..de0619f 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -12,9 +12,15 @@ def initialize(user) # Start of Rules for all authenticated user with no additional roles required return if user.blank? + # Allow all authenticated users to performa all CRUD actions on Suggested Resources can :manage, :detector__suggested_resource can :manage, Detector::SuggestedResource + # Allow all authenticated users to view the Categorization index and show dashboards + can %w[index show], :categorization + can :read, Categorization + + # Allow all authenticated users to view reports can :view, :report # End of Rules for all authenticated user with no additional roles required diff --git a/config/routes.rb b/config/routes.rb index c8a2a83..de42371 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -14,6 +14,7 @@ resources :detectors resources :detector_categories resources :categories + resources :categorizations, only: [:index, :show] # Search activity models resources :search_events, only: [:index, :show] From ce88138dbdac9eac9fd822f6701967a123dce50b Mon Sep 17 00:00:00 2001 From: Jeremy Prevost Date: Fri, 4 Oct 2024 15:05:29 -0400 Subject: [PATCH 3/3] Update categorization view order and add nav link --- app/dashboards/categorization_dashboard.rb | 4 ++-- app/models/ability.rb | 2 +- app/views/layouts/_site_nav.html.erb | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/dashboards/categorization_dashboard.rb b/app/dashboards/categorization_dashboard.rb index 548c089..86d04bb 100644 --- a/app/dashboards/categorization_dashboard.rb +++ b/app/dashboards/categorization_dashboard.rb @@ -26,20 +26,20 @@ class CategorizationDashboard < Administrate::BaseDashboard # Feel free to add, remove, or rearrange items. COLLECTION_ATTRIBUTES = %i[ id + term category confidence detector_version - term ].freeze # SHOW_PAGE_ATTRIBUTES # an array of attributes that will be displayed on the model's show page. SHOW_PAGE_ATTRIBUTES = %i[ id + term category confidence detector_version - term created_at updated_at ].freeze diff --git a/app/models/ability.rb b/app/models/ability.rb index de0619f..0451a9a 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -18,7 +18,7 @@ def initialize(user) # Allow all authenticated users to view the Categorization index and show dashboards can %w[index show], :categorization - can :read, Categorization + can %i[read view], Categorization # Allow all authenticated users to view reports can :view, :report diff --git a/app/views/layouts/_site_nav.html.erb b/app/views/layouts/_site_nav.html.erb index f5f798f..a0686b8 100644 --- a/app/views/layouts/_site_nav.html.erb +++ b/app/views/layouts/_site_nav.html.erb @@ -19,6 +19,9 @@ <% if can? :manage, :detector__suggested_resource %> <%= link_to('Suggested Resources', admin_detector_suggested_resources_path, class: 'nav-item') %> <% end %> + <% if can? :view, Categorization %> + <%= link_to('Categorizations', admin_categorizations_path, class: 'nav-item') %> + <% end %> <% if can? :view, :report %> <%= link_to('Reports', report_path, class: 'nav-item') %> <% end %>