Skip to content

Commit 8cf7d58

Browse files
committed
Scope selectable organisers on new event
Only admins or organisers can create new events, so we were loading thousands of students… Not anymore. Fixes #2411
1 parent 3153a71 commit 8cf7d58

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

app/models/member.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ class Member < ApplicationRecord
5151

5252
scope :with_skill, ->(skill_name) { tagged_with(skill_name) }
5353

54+
scope :admin, -> { with_role(:admin) }
55+
scope :organiser, -> { with_role(:organiser, :any) }
56+
scope :manager, -> { admin.or(organiser).distinct }
57+
58+
scope :sort_alphabetically, -> { order(:name, :surname) }
59+
5460
acts_as_taggable_on :skills
5561

5662
attr_accessor :attendance, :newsletter

app/views/admin/events/_form.html.haml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
:ruby
2+
all_managers = Member.manager.sort_alphabetically
3+
14
= simple_form_for [:admin, @event] do |f|
25
.row
36
.col-12
@@ -42,7 +45,7 @@
4245
.col-12.col-md-6.col-lg-4
4346
= f.association :gold_sponsors, input_html: { data: { placeholder: 'Select gold sponsors' }}, collection: Sponsor.all
4447
.col-12
45-
= f.input :organisers, collection: Member.all, value_method: :id, label_method: :full_name, selected: @event.organisers.map(&:id), input_html: { multiple: true }
48+
= f.input :organisers, collection: all_managers, value_method: :id, label_method: :full_name, selected: @event.organisers.pluck(&:id), input_html: { multiple: true }
4649
.col-12
4750
= f.input :announce_only, as: :boolean, hint: 'Events where invitations are not handled via our application'
4851
.col-12

spec/models/member_spec.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,50 @@
164164
expect(Member.find_members_by_name('').size).to eq(0)
165165
end
166166
end
167+
end
168+
169+
describe '.admin' do
170+
it 'returns members with admin role' do
171+
admin_member = Fabricate(:member)
172+
admin_member.add_role :admin
173+
non_admin = Fabricate(:member)
174+
175+
expect(described_class.admin).to include(admin_member)
176+
expect(described_class.admin).not_to include(non_admin)
177+
end
178+
end
179+
180+
describe '.organiser' do
181+
it 'returns members with organiser role' do
182+
chapter = Fabricate(:chapter)
183+
organiser = Fabricate(:member)
184+
organiser.add_role :organiser, chapter
185+
non_organiser = Fabricate(:member)
167186

187+
expect(described_class.organiser).to include(organiser)
188+
expect(described_class.organiser).not_to include(non_organiser)
189+
end
190+
end
191+
192+
describe '.manager' do
193+
it 'returns both admins and organisers' do
194+
admin_member = Fabricate(:member)
195+
admin_member.add_role :admin
196+
197+
chapter = Fabricate(:chapter)
198+
organiser = Fabricate(:member)
199+
organiser.add_role :organiser, chapter
200+
# Add another role to test for duplicates
201+
organiser.add_role :admin
202+
203+
non_manager = Fabricate(:member)
204+
205+
managers = described_class.manager
206+
207+
expect(managers).to include(admin_member, organiser)
208+
expect(managers).not_to include(non_manager)
209+
210+
expect(managers.size).to eq(managers.distinct.size)
211+
end
168212
end
169213
end

0 commit comments

Comments
 (0)