Skip to content

Commit 753d634

Browse files
committed
Add roles to school dashboard
Make it easier to see who is a student and teacher for user support
1 parent 21c9d1b commit 753d634

5 files changed

Lines changed: 104 additions & 0 deletions

File tree

app/controllers/admin/schools_controller.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
module Admin
44
class SchoolsController < Admin::ApplicationController
5+
helper_method :school_role_users_by_id
6+
57
def verify
68
service = SchoolVerificationService.new(requested_resource)
79

@@ -33,5 +35,19 @@ def default_sorting_attribute
3335
def default_sorting_direction
3436
:desc
3537
end
38+
39+
private
40+
41+
def school_role_users_by_id
42+
@school_role_users_by_id ||= fetch_users_batch(school_role_user_ids)
43+
end
44+
45+
def school_role_user_ids
46+
requested_resource.roles.where(role: SchoolRolesField::DISPLAYED_ROLES).filter_map(&:user_id).uniq
47+
end
48+
49+
def fetch_users_batch(user_ids)
50+
User.from_userinfo(ids: user_ids).index_by(&:id)
51+
end
3652
end
3753
end

app/dashboards/school_dashboard.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class SchoolDashboard < Administrate::BaseDashboard
2525
classes: Field::HasMany,
2626
lessons: Field::HasMany,
2727
projects: Field::HasMany,
28+
roles: SchoolRolesField,
2829
reference: Field::String,
2930
district_name: Field::String,
3031
district_nces_id: Field::String,
@@ -59,6 +60,7 @@ class SchoolDashboard < Administrate::BaseDashboard
5960
name
6061
user_origin
6162
creator
63+
roles
6264
creator_role
6365
creator_department
6466
reference

app/fields/school_roles_field.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# frozen_string_literal: true
2+
3+
require 'administrate/field/base'
4+
5+
class SchoolRolesField < Administrate::Field::Base
6+
DISPLAYED_ROLES = %w[owner teacher].freeze
7+
8+
def roles
9+
@roles ||= data.where(role: DISPLAYED_ROLES).sort_by(&:created_at)
10+
end
11+
12+
def user_display(role, users_by_id = {})
13+
user = users_by_id[role.user_id]
14+
user.present? ? user_dashboard.display_resource(user) : role.user_id
15+
end
16+
17+
private
18+
19+
def user_dashboard
20+
@user_dashboard ||= UserDashboard.new
21+
end
22+
end
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<%#
2+
Administrate field partial for SchoolRolesField in show view
3+
%>
4+
5+
<% if field.roles.any? %>
6+
<table>
7+
<thead>
8+
<tr>
9+
<th>Role</th>
10+
<th>User</th>
11+
<th>Created</th>
12+
</tr>
13+
</thead>
14+
<tbody>
15+
<% field.roles.each do |role| %>
16+
<tr>
17+
<td><%= role.role.humanize %></td>
18+
<td><%= field.user_display(role, school_role_users_by_id) %></td>
19+
<td><%= l(role.created_at) %></td>
20+
</tr>
21+
<% end %>
22+
</tbody>
23+
</table>
24+
<% else %>
25+
<%= t("administrate.fields.has_many.none", default: "–") %>
26+
<% end %>

spec/features/admin/schools_spec.rb

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,44 @@
7777
end
7878
end
7979

80+
describe 'GET #show with roles' do
81+
let(:creator) { create(:user) }
82+
let(:school) { create(:school, creator_id: creator.id) }
83+
let(:owner) { create(:user, name: 'Olivia Owner', email: 'owner@example.com') }
84+
let(:teacher) { create(:user, name: 'Tariq Teacher', email: 'teacher@example.com') }
85+
let(:student) { create(:user, name: 'Sam Student', email: 'student@example.com') }
86+
let(:role_users) do
87+
[
88+
owner,
89+
teacher
90+
]
91+
end
92+
93+
before do
94+
create(:owner_role, school:, user_id: owner.id)
95+
create(:teacher_role, school:, user_id: teacher.id)
96+
create(:student_role, school:, user_id: student.id)
97+
98+
allow(User).to receive(:from_userinfo).with(ids: creator.id).and_return([creator])
99+
allow(User).to receive(:from_userinfo).with(ids: contain_exactly(owner.id, teacher.id)).and_return(role_users)
100+
101+
get admin_school_path(school)
102+
end
103+
104+
it 'lists owner and teacher roles with names and emails' do
105+
expect(User).to have_received(:from_userinfo).with(ids: contain_exactly(owner.id, teacher.id)).once
106+
expect(response.body).to include('Owner')
107+
expect(response.body).to include('Olivia Owner (owner@example.com)')
108+
expect(response.body).to include('Teacher')
109+
expect(response.body).to include('Tariq Teacher (teacher@example.com)')
110+
end
111+
112+
it 'does not list student roles' do
113+
expect(response.body).not_to include('Sam Student')
114+
expect(response.body).not_to include('student@example.com')
115+
end
116+
end
117+
80118
describe 'POST #verify' do
81119
let(:creator) { create(:user) }
82120
let(:verified_at) { nil }

0 commit comments

Comments
 (0)