Skip to content

Commit 6e56c17

Browse files
authored
Merge pull request #2413 from gnclmorais/reduce-members-loaded-on-new-event
Reduce members loaded on new event
2 parents f0ef572 + c699ee7 commit 6e56c17

File tree

4 files changed

+65
-7
lines changed

4 files changed

+65
-7
lines changed

app/controllers/application_controller.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,15 @@ def redirect_path
105105
end
106106

107107
def authenticate_admin!
108-
redirect_to root_path, notice: "You can't be here" unless logged_in? && current_user.has_role?(:admin)
108+
redirect_to root_path, notice: "You can't be here" unless logged_in? && current_user.is_admin?
109109
end
110110

111111
def authenticate_admin_or_organiser!
112112
redirect_to root_path, notice: "You can't be here" unless manager?
113113
end
114114

115115
def manager?
116-
logged_in? && (current_user.is_admin? || current_user.has_role?(:organiser, :any))
116+
logged_in? && current_user.manager?
117117
end
118118

119119
helper_method :manager?

app/models/member.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,20 @@ 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
5763

64+
def manager?
65+
is_admin? || has_role?(:organiser, :any)
66+
end
67+
5868
def banned?
5969
bans.active.present? || bans.permanent.present?
6070
end

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
:ruby
2+
all_sponsors = Sponsor.all
3+
all_managers = Member.manager.sort_alphabetically
4+
15
= simple_form_for [:admin, @event] do |f|
26
.row
37
.col-12
@@ -34,15 +38,15 @@
3438
%p
3539
%strong Please add sponsors only to either Standard level OR Gold/Silver/Bronze levels.
3640
.col-12
37-
= f.association :sponsors, label: 'Standard sponsors', input_html: { data: { placeholder: 'Select standard sponsors' }}, collection: Sponsor.all
41+
= f.association :sponsors, label: 'Standard sponsors', input_html: { data: { placeholder: 'Select standard sponsors' }}, collection: all_sponsors
3842
.col-12.col-md-6.col-lg-4
39-
= f.association :bronze_sponsors, input_html: { data: { placeholder: 'Select bronze sponsors' }}, collection: Sponsor.all
43+
= f.association :bronze_sponsors, input_html: { data: { placeholder: 'Select bronze sponsors' }}, collection: all_sponsors
4044
.col-12.col-md-6.col-lg-4
41-
= f.association :silver_sponsors, input_html: { data: { placeholder: 'Select silver sponsors' }}, collection: Sponsor.all
45+
= f.association :silver_sponsors, input_html: { data: { placeholder: 'Select silver sponsors' }}, collection: all_sponsors
4246
.col-12.col-md-6.col-lg-4
43-
= f.association :gold_sponsors, input_html: { data: { placeholder: 'Select gold sponsors' }}, collection: Sponsor.all
47+
= f.association :gold_sponsors, input_html: { data: { placeholder: 'Select gold sponsors' }}, collection: all_sponsors
4448
.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 }
49+
= f.input :organisers, collection: all_managers, value_method: :id, label_method: :full_name, selected: @event.organisers.pluck(&:id), input_html: { multiple: true }
4650
.col-12
4751
= f.input :announce_only, as: :boolean, hint: 'Events where invitations are not handled via our application'
4852
.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)