From 00663b25c443cd065581be44b2229b9944398414 Mon Sep 17 00:00:00 2001 From: Chris Zetter <253059100+zetter-rpf@users.noreply.github.com> Date: Mon, 15 Jun 2026 12:38:12 +0100 Subject: [PATCH 1/2] Add roles to school dashboard Make it easier to see who is a student and teacher for user support --- app/controllers/admin/schools_controller.rb | 16 ++++++++ app/dashboards/school_dashboard.rb | 2 + app/fields/school_roles_field.rb | 22 +++++++++++ .../fields/school_roles_field/_show.html.erb | 26 +++++++++++++ spec/features/admin/schools_spec.rb | 38 +++++++++++++++++++ 5 files changed, 104 insertions(+) create mode 100644 app/fields/school_roles_field.rb create mode 100644 app/views/fields/school_roles_field/_show.html.erb diff --git a/app/controllers/admin/schools_controller.rb b/app/controllers/admin/schools_controller.rb index 02b027316..eebc90f59 100644 --- a/app/controllers/admin/schools_controller.rb +++ b/app/controllers/admin/schools_controller.rb @@ -2,6 +2,8 @@ module Admin class SchoolsController < Admin::ApplicationController + helper_method :school_role_users_by_id + def verify service = SchoolVerificationService.new(requested_resource) @@ -33,5 +35,19 @@ def default_sorting_attribute def default_sorting_direction :desc end + + private + + def school_role_users_by_id + @school_role_users_by_id ||= fetch_users_batch(school_role_user_ids) + end + + def school_role_user_ids + requested_resource.roles.where(role: SchoolRolesField::DISPLAYED_ROLES).filter_map(&:user_id).uniq + end + + def fetch_users_batch(user_ids) + User.from_userinfo(ids: user_ids).index_by(&:id) + end end end diff --git a/app/dashboards/school_dashboard.rb b/app/dashboards/school_dashboard.rb index a642cb89b..a4bca57e9 100644 --- a/app/dashboards/school_dashboard.rb +++ b/app/dashboards/school_dashboard.rb @@ -25,6 +25,7 @@ class SchoolDashboard < Administrate::BaseDashboard classes: Field::HasMany, lessons: Field::HasMany, projects: Field::HasMany, + roles: SchoolRolesField, reference: Field::String, district_name: Field::String, district_nces_id: Field::String, @@ -59,6 +60,7 @@ class SchoolDashboard < Administrate::BaseDashboard name user_origin creator + roles creator_role creator_department reference diff --git a/app/fields/school_roles_field.rb b/app/fields/school_roles_field.rb new file mode 100644 index 000000000..69143467d --- /dev/null +++ b/app/fields/school_roles_field.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require 'administrate/field/base' + +class SchoolRolesField < Administrate::Field::Base + DISPLAYED_ROLES = %w[owner teacher].freeze + + def roles + @roles ||= data.where(role: DISPLAYED_ROLES).sort_by(&:created_at) + end + + def user_display(role, users_by_id = {}) + user = users_by_id[role.user_id] + user.present? ? user_dashboard.display_resource(user) : role.user_id + end + + private + + def user_dashboard + @user_dashboard ||= UserDashboard.new + end +end diff --git a/app/views/fields/school_roles_field/_show.html.erb b/app/views/fields/school_roles_field/_show.html.erb new file mode 100644 index 000000000..eb05fdddf --- /dev/null +++ b/app/views/fields/school_roles_field/_show.html.erb @@ -0,0 +1,26 @@ +<%# +Administrate field partial for SchoolRolesField in show view +%> + +<% if field.roles.any? %> +
| Role | +User | +Created | +
|---|---|---|
| <%= role.role.humanize %> | +<%= field.user_display(role, school_role_users_by_id) %> | +<%= l(role.created_at) %> | +