Browse Source

Update filter helpers

pull/2535/head
Kat 2 years ago committed by kosiakkatrina
parent
commit
620c9f4c55
  1. 51
      app/helpers/filters_helper.rb
  2. 2
      app/models/organisation.rb
  3. 298
      spec/helpers/filters_helper_spec.rb
  4. 4
      spec/models/user_spec.rb

51
app/helpers/filters_helper.rb

@ -85,21 +85,32 @@ module FiltersHelper
end end
def owning_organisation_filter_options(user, filter_type) def owning_organisation_filter_options(user, filter_type)
if applied_filters(filter_type)["owning_organisation"].present? && user.support? if applied_filters(filter_type)["owning_organisation"].present?
org = Organisation.find(applied_filters(filter_type)["owning_organisation"]) organisation_id = applied_filters(filter_type)["owning_organisation"]
[OpenStruct.new(id: org.id, name: org.name)]
else org = if user.support?
[OpenStruct.new(id: "", name: "Select an option")] Organisation.where(id: organisation_id)&.first
else
Organisation.affiliated_organisations(user.organisation).where(id: organisation_id)&.first
end
return [OpenStruct.new(id: org.id, name: org.name)] if org.present?
end end
[OpenStruct.new(id: "", name: "Select an option")]
end end
def assigned_to_filter_options(filter_type) def assigned_to_filter_options(filter_type)
if applied_filters(filter_type)["assigned_to"] == "specific_user" && applied_filters(filter_type)["user"].present? if applied_filters(filter_type)["assigned_to"] == "specific_user" && applied_filters(filter_type)["user"].present?
user = User.find(applied_filters(filter_type)["user"]) # make sure this doesn't expose anything weird user_id = applied_filters(filter_type)["user"]
[OpenStruct.new(id: user.id, name: user.name, hint: user.email)] user = if user.support?
else User.where(id: user_id)&.first
[OpenStruct.new(id: "", name: "Select an option", hint: "")] else
User.affiliated_users(user.organisation).where(id: user_id)&.first
end
return [OpenStruct.new(id: user.id, name: user.name, hint: user.email)] if user.present?
end end
[OpenStruct.new(id: "", name: "Select an option", hint: "")]
end end
def filter_search_url(category) def filter_search_url(category)
@ -143,12 +154,18 @@ module FiltersHelper
end end
def managing_organisation_filter_options(user, filter_type) def managing_organisation_filter_options(user, filter_type)
if applied_filters(filter_type)["managing_organisation"].present? && user.support? if applied_filters(filter_type)["managing_organisation"].present?
org = Organisation.find(applied_filters(filter_type)["managing_organisation"]) # make sure this doesn't expose anything weird organisation_id = applied_filters(filter_type)["managing_organisation"]
[OpenStruct.new(id: org.id, name: org.name)]
else org = if user.support?
[OpenStruct.new(id: "", name: "Select an option")] Organisation.where(id: organisation_id)&.first
else
Organisation.affiliated_organisations(user.organisation).where(id: organisation_id)&.first
end
return [OpenStruct.new(id: org.id, name: org.name)] if org.present?
end end
[OpenStruct.new(id: "", name: "Select an option")]
end end
def show_scheme_managing_org_filter?(user) def show_scheme_managing_org_filter?(user)
@ -277,11 +294,11 @@ private
return "All" if session_filters["assigned_to"].include?("all") return "All" if session_filters["assigned_to"].include?("all")
return "You" if session_filters["assigned_to"].include?("you") return "You" if session_filters["assigned_to"].include?("you")
User.affiliated_users(current_user.organisationq).find(session_filters["user"].to_i).name User.affiliated_users(current_user.organisation).find(session_filters["user"].to_i).name
selected_user_option = User.affiliated_users(current_user.organisationq).find(session_filters["user"].to_i).name selected_user_option = User.affiliated_users(current_user.organisation).find(session_filters["user"].to_i)
return unless selected_user_option return unless selected_user_option
"#{selected_user_option.name} (#{selected_user_option.hint})" "#{selected_user_option.name} (#{selected_user_option.email})"
end end
def formatted_owned_by_filter(session_filters, filter_type) def formatted_owned_by_filter(session_filters, filter_type)

2
app/models/organisation.rb

@ -18,7 +18,7 @@ class Organisation < ApplicationRecord
belongs_to :absorbing_organisation, class_name: "Organisation", optional: true belongs_to :absorbing_organisation, class_name: "Organisation", optional: true
has_many :absorbed_organisations, class_name: "Organisation", foreign_key: "absorbing_organisation_id" has_many :absorbed_organisations, class_name: "Organisation", foreign_key: "absorbing_organisation_id"
scope :visible, -> { where(discarded_at: nil) } scope :visible, -> { where(discarded_at: nil) }
scope :affiliated_organisations, ->(organisation) { where(id: (organisation.child_organisations + [organisation] + organisation.parent_organisations).map(&:id)) } scope :affiliated_organisations, ->(organisation) { where(id: (organisation.child_organisations + [organisation] + organisation.parent_organisations + organisation.absorbed_organisations).map(&:id)) }
def affiliated_stock_owners def affiliated_stock_owners
ids = [] ids = []

298
spec/helpers/filters_helper_spec.rb

@ -175,27 +175,146 @@ RSpec.describe FiltersHelper do
context "with a support user" do context "with a support user" do
let(:user) { FactoryBot.create(:user, :support, organisation: child_organisation) } let(:user) { FactoryBot.create(:user, :support, organisation: child_organisation) }
it "returns a list of all organisations" do context "when no organisation is selected in the filters" do
expect(owning_organisation_filter_options(user, "lettings_logs")).to match_array([ it "returns an empty list" do
OpenStruct.new(id: "", name: "Select an option"), expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: child_organisation.id, name: "Child organisation"), OpenStruct.new(id: "", name: "Select an option"),
OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), ])
OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), end
OpenStruct.new(id: 99, name: "Other organisation"), end
])
context "when a specific child organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "owning_organisation": child_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: child_organisation.id, name: "Child organisation"),
])
end
end
context "when a specific parent organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "owning_organisation": parent_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"),
])
end
end
context "when a specific absorbed organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "owning_organisation": absorbed_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"),
])
end
end
context "when a specific non related organisation is selected in the filters" do
let(:unrelated_organisation) { create(:organisation, name: "Unrelated organisation") }
before do
session[:lettings_logs_filters] = { "owning_organisation": unrelated_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: unrelated_organisation.id, name: "Unrelated organisation"),
])
end
end
context "when a non existing organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "owning_organisation": 143_542_542 }.to_json
end
it "returns an empty list" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: "", name: "Select an option"),
])
end
end end
end end
context "with a data coordinator user" do context "with a data coordinator user" do
let(:user) { FactoryBot.create(:user, :data_coordinator, organisation: child_organisation) } let(:user) { FactoryBot.create(:user, :data_coordinator, organisation: child_organisation) }
it "returns a list of parent orgs and your own organisation" do context "when no organisation is selected in the filters" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ it "returns an empty list" do
OpenStruct.new(id: "", name: "Select an option"), expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: child_organisation.id, name: "Child organisation"), OpenStruct.new(id: "", name: "Select an option"),
OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), ])
OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), end
]) end
context "when a specific child organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "owning_organisation": child_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: child_organisation.id, name: "Child organisation"),
])
end
end
context "when a specific parent organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "owning_organisation": parent_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"),
])
end
end
context "when a specific absorbed organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "owning_organisation": absorbed_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"),
])
end
end
context "when a specific non related organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "owning_organisation": create(:organisation).id }.to_json
end
it "returns an empty list" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: "", name: "Select an option"),
])
end
end
context "when a non existing organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "owning_organisation": 143_542_542 }.to_json
end
it "returns an empty list" do
expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: "", name: "Select an option"),
])
end
end end
end end
end end
@ -214,27 +333,146 @@ RSpec.describe FiltersHelper do
context "with a support user" do context "with a support user" do
let(:user) { FactoryBot.create(:user, :support, organisation: parent_organisation) } let(:user) { FactoryBot.create(:user, :support, organisation: parent_organisation) }
it "returns a list of all organisations" do context "when no organisation is selected in the filters" do
expect(managing_organisation_filter_options(user, "lettings_logs")).to eq([ it "returns an empty list" do
OpenStruct.new(id: "", name: "Select an option"), expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), OpenStruct.new(id: "", name: "Select an option"),
OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), ])
OpenStruct.new(id: child_organisation.id, name: "Child organisation"), end
OpenStruct.new(id: 99, name: "Other organisation"), end
])
context "when a specific child organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "managing_organisation": child_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: child_organisation.id, name: "Child organisation"),
])
end
end
context "when a specific parent organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "managing_organisation": parent_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"),
])
end
end
context "when a specific absorbed organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "managing_organisation": absorbed_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"),
])
end
end
context "when a specific non related organisation is selected in the filters" do
let(:unrelated_organisation) { create(:organisation, name: "Unrelated organisation") }
before do
session[:lettings_logs_filters] = { "managing_organisation": unrelated_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: unrelated_organisation.id, name: "Unrelated organisation"),
])
end
end
context "when a non existing organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "managing_organisation": 143_542_542 }.to_json
end
it "returns an empty list" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: "", name: "Select an option"),
])
end
end end
end end
context "with a data coordinator user" do context "with a data coordinator user" do
let(:user) { FactoryBot.create(:user, :data_coordinator, organisation: parent_organisation) } let(:user) { FactoryBot.create(:user, :data_coordinator, organisation: parent_organisation) }
it "returns a list of child orgs and your own organisation" do context "when no organisation is selected in the filters" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ it "returns an empty list" do
OpenStruct.new(id: "", name: "Select an option"), expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), OpenStruct.new(id: "", name: "Select an option"),
OpenStruct.new(id: child_organisation.id, name: "Child organisation"), ])
OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), end
]) end
context "when a specific child organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "managing_organisation": child_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: child_organisation.id, name: "Child organisation"),
])
end
end
context "when a specific parent organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "managing_organisation": parent_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"),
])
end
end
context "when a specific absorbed organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "managing_organisation": absorbed_organisation.id }.to_json
end
it "returns the selected organisation in the list" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"),
])
end
end
context "when a specific non related organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "managing_organisation": create(:organisation).id }.to_json
end
it "returns an empty list" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: "", name: "Select an option"),
])
end
end
context "when a non existing organisation is selected in the filters" do
before do
session[:lettings_logs_filters] = { "managing_organisation": 143_542_542 }.to_json
end
it "returns an empty list" do
expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([
OpenStruct.new(id: "", name: "Select an option"),
])
end
end end
end end
end end

4
spec/models/user_spec.rb

@ -174,7 +174,7 @@ RSpec.describe User, type: :model do
end end
it "can filter lettings logs by user, year, status, managing_organisation and owning_organisation" do it "can filter lettings logs by user, year, status, managing_organisation and owning_organisation" do
expect(user.logs_filters).to match_array(%w[years status needstypes assigned_to user managing_organisation owning_organisation bulk_upload_id]) expect(user.logs_filters).to match_array(%w[years status needstypes assigned_to user managing_organisation owning_organisation bulk_upload_id managing_organisation_text_search owning_organisation_text_search user_text_search])
end end
end end
end end
@ -215,7 +215,7 @@ RSpec.describe User, type: :model do
end end
it "can filter lettings logs by user, year, status, managing_organisation and owning_organisation" do it "can filter lettings logs by user, year, status, managing_organisation and owning_organisation" do
expect(user.logs_filters).to match_array(%w[years status needstypes assigned_to user owning_organisation managing_organisation bulk_upload_id]) expect(user.logs_filters).to match_array(%w[years status needstypes assigned_to user owning_organisation managing_organisation bulk_upload_id managing_organisation_text_search owning_organisation_text_search user_text_search])
end end
end end

Loading…
Cancel
Save