From d08bcc415436d455e87458d95086ed486eab1e7d Mon Sep 17 00:00:00 2001 From: Frank Duncan Date: Tue, 16 Jun 2020 15:31:54 -0500 Subject: [PATCH] Rename Roster::Role to Capability This does not affect other roles such as homepage link roles, and notification roles, but only the roles attached to positions. These weren't actually roles, so the name brings them more in line with their actual purpose (capabilities), and reduces confusion. This is another wide, but not deep, change. Issue #185: Change entity names --- app/admin/ability.rb | 6 +-- app/admin/roster/capabilities.rb | 30 +++++++++++++ app/admin/roster/positions.rb | 12 ++--- app/admin/roster/roles.rb | 30 ------------- app/admin/scheduler/people.rb | 2 +- app/admin/scheduler/shifts.rb | 3 +- app/controllers/root_controller.rb | 2 +- app/helpers/application_helper.rb | 2 +- app/models/incidents/ability.rb | 20 ++++----- app/models/roster/ability.rb | 4 +- app/models/roster/capability.rb | 8 ++++ app/models/roster/capability_membership.rb | 12 +++++ .../{role_scope.rb => capability_scope.rb} | 4 +- app/models/roster/person.rb | 22 +++++----- app/models/roster/position.rb | 4 +- app/models/roster/region.rb | 2 +- app/models/roster/role.rb | 8 ---- app/models/roster/role_membership.rb | 12 ----- app/models/scheduler/ability.rb | 10 ++--- app/views/api/people/show.json.jbuilder | 2 +- app/views/roster/people/show.json.jbuilder | 6 +-- ...202024_rename_roster_role_to_capability.rb | 11 +++++ db/schema.rb | 42 +++++++++--------- db/seeds.rb | 12 ++--- lib/user_info_renderer.rb | 2 +- .../application_controller_spec.rb | 2 +- .../incidents/cas_link_controller_spec.rb | 2 +- .../incidents/cases_controller_spec.rb | 2 +- .../dat_incidents_controller_spec.rb | 10 ++--- .../incidents/event_logs_controller_spec.rb | 2 +- .../incidents/incidents_controller_spec.rb | 16 +++---- .../notifications_controller_spec.rb | 2 +- .../incidents/responders_controller_spec.rb | 2 +- spec/controllers/root_controller_spec.rb | 8 ++-- .../scheduler/shift_assignments_spec.rb | 4 +- .../scheduler/shift_swaps_controller_spec.rb | 4 +- ...roster_roles.rb => roster_capabilities.rb} | 2 +- ..._scopes.rb => roster_capability_scopes.rb} | 4 +- spec/features/admin/basic_admin_pages_spec.rb | 6 +-- .../admin/incident_notification_roles_spec.rb | 2 +- .../incident_response_territories_spec.rb | 2 +- spec/features/admin/region_extra_spec.rb | 2 +- spec/features/admin/root_admin_spec.rb | 2 +- .../admin/system_homepage_links_spec.rb | 2 +- spec/features/admin/system_jobs_spec.rb | 2 +- .../admin/system_named_queries_spec.rb | 2 +- spec/features/incidents/attachments_spec.rb | 2 +- .../incidents/create_incident_spec.rb | 4 +- .../incidents/dispatch_intake_spec.rb | 2 +- spec/features/incidents/global_log_spec.rb | 2 +- .../incidents/incidents_editable_spec.rb | 2 +- .../incidents/initial_incident_report_spec.rb | 4 +- .../incidents/invalid_incident_spec.rb | 2 +- .../incidents/responder_history_spec.rb | 4 +- .../incidents/responders_console_spec.rb | 2 +- .../submit_dat_incident_report_spec.rb | 2 +- .../incidents/subscribe_weekly_report_spec.rb | 2 +- spec/features/incidents/timeline_spec.rb | 2 +- .../scheduler/notifications_settings_spec.rb | 2 +- spec/features/scheduler/people_spec.rb | 4 +- .../scheduler/shift_management_spec.rb | 2 +- .../scheduler/shift_scheduler_spec.rb | 2 +- spec/models/incidents/ability_spec.rb | 12 ++--- spec/models/roster/person_spec.rb | 44 +++++++++---------- spec/models/scheduler/ability_spec.rb | 2 +- spec/support/capabilities.rb | 22 ++++++++++ spec/support/roles.rb | 22 ---------- 67 files changed, 250 insertions(+), 240 deletions(-) create mode 100644 app/admin/roster/capabilities.rb delete mode 100644 app/admin/roster/roles.rb create mode 100644 app/models/roster/capability.rb create mode 100644 app/models/roster/capability_membership.rb rename app/models/roster/{role_scope.rb => capability_scope.rb} (54%) delete mode 100644 app/models/roster/role.rb delete mode 100644 app/models/roster/role_membership.rb create mode 100644 db/migrate/20200616202024_rename_roster_role_to_capability.rb rename spec/factories/{roster_roles.rb => roster_capabilities.rb} (72%) rename spec/factories/{roster_role_scopes.rb => roster_capability_scopes.rb} (56%) create mode 100644 spec/support/capabilities.rb delete mode 100644 spec/support/roles.rb diff --git a/app/admin/ability.rb b/app/admin/ability.rb index a61fce15..69030813 100644 --- a/app/admin/ability.rb +++ b/app/admin/ability.rb @@ -10,7 +10,7 @@ def initialize(region) def initialize(person) - is_config = person.has_role 'region_config' + is_config = person.has_capability 'region_config' if is_config # is site manager can [:read, :update], Roster::Region @@ -18,7 +18,7 @@ def initialize(person) can :manage, Roster::Position can :manage, Roster::CellCarrier can :manage, Roster::Person - can :manage, Roster::Role + can :manage, Roster::Capability can :manage, Scheduler::DispatchConfig can :manage, Scheduler::Shift @@ -46,7 +46,7 @@ def initialize(person) can :manage, :all end - is_admin = person.has_role 'region_admin' + is_admin = person.has_capability 'region_admin' if is_admin region = person.region_id can :read, [Roster::Person, Roster::ShiftTerritory, Roster::Position], region_id: region diff --git a/app/admin/roster/capabilities.rb b/app/admin/roster/capabilities.rb new file mode 100644 index 00000000..ec892471 --- /dev/null +++ b/app/admin/roster/capabilities.rb @@ -0,0 +1,30 @@ +ActiveAdmin.register Roster::Capability, as: 'Capability' do + menu parent: 'Roster' + + controller do + def resource_params + [params.fetch(resource_request_name, {}).permit(:name, :grant_name)] + end + + def collection + @coll ||= apply_scopes(super).preload{[capability_memberships.position, capability_memberships.capability_scopes]} + end + end + + index do + column :name + column :grant_name + column :positions do |capability| + safe_join(capability.capability_memberships.map{|pm| "#{pm.position.name if pm.position} (#{pm.capability_scopes.map(&:scope).join ','})"}, tag(:br)) + end + actions + end + + form do |f| + f.inputs + f.actions + end + + filter :name + filter :grant_name +end diff --git a/app/admin/roster/positions.rb b/app/admin/roster/positions.rb index 9377b712..e11070d3 100644 --- a/app/admin/roster/positions.rb +++ b/app/admin/roster/positions.rb @@ -15,8 +15,8 @@ column :name #column :vc_regex_raw column :hidden - column :roles do |pos| - safe_join(pos.role_memberships.map(&:display_name), tag(:br)) + column :capabilities do |pos| + safe_join(pos.capability_memberships.map(&:display_name), tag(:br)) end actions end @@ -45,16 +45,16 @@ def update def resource_params [params.fetch(resource_request_name, {}).permit(:name, :abbrev, :vc_regex_raw, :hidden, :region_id, :watchfire_role, - :role_memberships_attributes => [:id, :_destroy, :role_id, role_scopes_attributes: [:scope, :id, :_destroy]])] + :capability_memberships_attributes => [:id, :_destroy, :capability_id, capability_scopes_attributes: [:scope, :id, :_destroy]])] end end form do |f| f.inputs f.inputs do - f.has_many :role_memberships, allow_destroy: true do |f| - f.input :role - f.has_many :role_scopes, allow_destroy: true do |f| + f.has_many :capability_memberships, allow_destroy: true do |f| + f.input :capability + f.has_many :capability_scopes, allow_destroy: true do |f| f.input :scope end end diff --git a/app/admin/roster/roles.rb b/app/admin/roster/roles.rb deleted file mode 100644 index d8e43dc4..00000000 --- a/app/admin/roster/roles.rb +++ /dev/null @@ -1,30 +0,0 @@ -ActiveAdmin.register Roster::Role, as: 'Role' do - menu parent: 'Roster' - - controller do - def resource_params - [params.fetch(resource_request_name, {}).permit(:name, :grant_name)] - end - - def collection - @coll ||= apply_scopes(super).preload{[role_memberships.position, role_memberships.role_scopes]} - end - end - - index do - column :name - column :grant_name - column :positions do |role| - safe_join(role.role_memberships.map{|pm| "#{pm.position.name if pm.position} (#{pm.role_scopes.map(&:scope).join ','})"}, tag(:br)) - end - actions - end - - form do |f| - f.inputs - f.actions - end - - filter :name - filter :grant_name -end diff --git a/app/admin/scheduler/people.rb b/app/admin/scheduler/people.rb index 260737c4..6d3d96fb 100644 --- a/app/admin/scheduler/people.rb +++ b/app/admin/scheduler/people.rb @@ -56,7 +56,7 @@ table_for person.position_memberships do column( :name) { |rec| rec.position && rec.position.name } column(:persistent) { |rec| rec.persistent ? 'Yes' : ''} - column(:roles) {|rec| safe_join rec.position.role_memberships.map(&:display_name), tag(:br)} + column(:capabilities) {|rec| safe_join rec.position.capability_memberships.map(&:display_name), tag(:br)} end end end diff --git a/app/admin/scheduler/shifts.rb b/app/admin/scheduler/shifts.rb index 0dfd9628..b0fb54ce 100644 --- a/app/admin/scheduler/shifts.rb +++ b/app/admin/scheduler/shifts.rb @@ -8,7 +8,6 @@ filter :region filter :name filter :abbrev - filter :dispatch_role filter :shift_ends scope :all do |shifts| @@ -94,7 +93,7 @@ controller do def resource_params - [params.fetch(resource_request_name, {}).permit(:name, :abbrev, :shift_category_id, :max_signups, :shift_territory_id, :ordinal, :spreadsheet_ordinal, :dispatch_role, :shift_begins, :shift_ends, :signups_frozen_before, :min_desired_signups, :max_advance_signup, :min_advance_signup, :ignore_shift_territory, :vc_hours_type, :show_in_dispatch_console, :exclusive, :position_ids => [], :shift_time_ids => [])] + [params.fetch(resource_request_name, {}).permit(:name, :abbrev, :shift_category_id, :max_signups, :shift_territory_id, :ordinal, :spreadsheet_ordinal, :shift_begins, :shift_ends, :signups_frozen_before, :min_desired_signups, :max_advance_signup, :min_advance_signup, :ignore_shift_territory, :vc_hours_type, :show_in_dispatch_console, :exclusive, :position_ids => [], :shift_time_ids => [])] end end end diff --git a/app/controllers/root_controller.rb b/app/controllers/root_controller.rb index 6cecdaf5..2422b88f 100644 --- a/app/controllers/root_controller.rb +++ b/app/controllers/root_controller.rb @@ -35,7 +35,7 @@ def inactive expose(:homepage_links) { links = HomepageLink.for_region(current_region).order{[group_ordinal.asc, ordinal.asc]}.includes{roles}.to_a - scopes = current_user.scope_for_role 'homepage_link' + scopes = current_user.scope_for_capability 'homepage_link' links.select{|l| l.role_ids.blank? || (l.roles.map(&:role_scope) & scopes).present? }.group_by(&:group) } end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 10f7c0ca..671f1af9 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,6 +1,6 @@ module ApplicationHelper def has_admin_dashboard_access - @_admin_access = current_user && (current_user.has_role('region_config') || current_user.has_role('region_admin')) + @_admin_access = current_user && (current_user.has_capability('region_config') || current_user.has_capability('region_admin')) end def current_messages diff --git a/app/models/incidents/ability.rb b/app/models/incidents/ability.rb index 15dd4985..9a49abc5 100644 --- a/app/models/incidents/ability.rb +++ b/app/models/incidents/ability.rb @@ -7,19 +7,19 @@ class Incidents::Ability def initialize(person) @person = person @region_scope = [@person.region_id] + Roster::Region.with_incidents_delegate_region_value(@person.region_id).ids - is_admin = person.has_role 'incidents_admin' + is_admin = person.has_capability 'incidents_admin' scopes personal - dispatch_console if is_admin or person.has_role 'dispatch_console' - create_incident if person.has_role 'create_incident' - submit_incident_report if is_admin or person.has_role 'submit_incident_report' - cas_admin if is_admin or person.has_role 'cas_admin' - incident_details if is_admin or person.has_role 'incident_details' - cas_details if is_admin or person.has_role 'cas_details' - see_responses if is_admin or person.has_role 'see_responses' - approve_iir if is_admin or person.has_role 'approve_iir' + dispatch_console if is_admin or person.has_capability 'dispatch_console' + create_incident if person.has_capability 'create_incident' + submit_incident_report if is_admin or person.has_capability 'submit_incident_report' + cas_admin if is_admin or person.has_capability 'cas_admin' + incident_details if is_admin or person.has_capability 'incident_details' + cas_details if is_admin or person.has_capability 'cas_details' + see_responses if is_admin or person.has_capability 'see_responses' + approve_iir if is_admin or person.has_capability 'approve_iir' incidents_admin if is_admin read_only if ENV['READ_ONLY'] @@ -92,7 +92,7 @@ def see_responses end def dispatch_console - scopes = person.scope_for_role('dispatch_console').map(&:to_i) + scopes = person.scope_for_capability('dispatch_console').map(&:to_i) can :dispatch_console, Incidents::Scope, {id: scopes} diff --git a/app/models/roster/ability.rb b/app/models/roster/ability.rb index 9122b037..b40216b7 100644 --- a/app/models/roster/ability.rb +++ b/app/models/roster/ability.rb @@ -13,11 +13,11 @@ def initialize(person) end end - if person.has_role 'region_dat_admin' + if person.has_capability 'region_dat_admin' can [:read, :update], Roster::Person, region_id: person.region_id end - admin_shift_territory_ids = person.scope_for_role('shift_territory_dat_admin') + admin_shift_territory_ids = person.scope_for_capability('shift_territory_dat_admin') if admin_shift_territory_ids.present? # is dat shift_territory admin can [:read, :update], Roster::Person, shift_territory_memberships: {shift_territory_id: admin_shift_territory_ids} end diff --git a/app/models/roster/capability.rb b/app/models/roster/capability.rb new file mode 100644 index 00000000..497234a1 --- /dev/null +++ b/app/models/roster/capability.rb @@ -0,0 +1,8 @@ +class Roster::Capability < ActiveRecord::Base + has_many :capability_memberships, class_name: 'Roster::CapabilityMembership' + validates :name, :grant_name, presence: true + + def display_name + "#{name} (#{grant_name})" + end +end diff --git a/app/models/roster/capability_membership.rb b/app/models/roster/capability_membership.rb new file mode 100644 index 00000000..2f5c5072 --- /dev/null +++ b/app/models/roster/capability_membership.rb @@ -0,0 +1,12 @@ +class Roster::CapabilityMembership < ActiveRecord::Base + belongs_to :position + belongs_to :capability + has_many :capability_scopes + + accepts_nested_attributes_for :capability_scopes, allow_destroy: true + validates :position, :capability, presence: true + + def display_name + "#{capability.try :name} - (#{capability_scopes.map(&:scope).join ','})" + end +end diff --git a/app/models/roster/role_scope.rb b/app/models/roster/capability_scope.rb similarity index 54% rename from app/models/roster/role_scope.rb rename to app/models/roster/capability_scope.rb index 3b8c4bdd..5963138e 100644 --- a/app/models/roster/role_scope.rb +++ b/app/models/roster/capability_scope.rb @@ -1,5 +1,5 @@ -class Roster::RoleScope < ActiveRecord::Base - belongs_to :role_membership +class Roster::CapabilityScope < ActiveRecord::Base + belongs_to :capability_membership def scope val = super diff --git a/app/models/roster/person.rb b/app/models/roster/person.rb index 80fd62e1..2fffa0d7 100644 --- a/app/models/roster/person.rb +++ b/app/models/roster/person.rb @@ -12,7 +12,7 @@ class Roster::Person < ActiveRecord::Base has_many :position_memberships, class_name: 'Roster::PositionMembership' has_many :positions, class_name: 'Roster::Position', through: :position_memberships - has_many :role_memberships, class_name: 'Roster::RoleMembership', through: :positions + has_many :capability_memberships, class_name: 'Roster::CapabilityMembership', through: :positions belongs_to :home_phone_carrier, class_name: 'Roster::CellCarrier' belongs_to :cell_phone_carrier, class_name: 'Roster::CellCarrier' @@ -26,8 +26,8 @@ class Roster::Person < ActiveRecord::Base scope :for_region, ->(region){where{region_id == region}} - scope :has_role_for_scope, -> role_name, scope { - joins{roles.role_scopes.outer}.where{(roles.grant_name == role_name) & ((roles.role_scopes.scope == nil) | (roles.role_scopes.scope == scope.to_s))} + scope :has_capability_for_scope, -> capability_name, scope { + joins{capabilities.capability_scopes.outer}.where{(capabilities.grant_name == capability_name) & ((capabilities.capability_scopes.scope == nil) | (capabilities.capability_scopes.scope == scope.to_s))} } scope :include_carriers, -> { @@ -68,19 +68,19 @@ def self.with_phone_number(number) accepts_nested_attributes_for :shift_territory_memberships, :position_memberships, allow_destroy: true - def has_role(grant_name) - roles_with_scopes.select{|mem| mem.role.grant_name == grant_name}.present? + def has_capability(grant_name) + capabilities_with_scopes.select{|mem| mem.capability.grant_name == grant_name}.present? end - def scope_for_role(grant_name) - roles_with_scopes.select{|mem| mem.role.grant_name == grant_name} - .flat_map{|mem| mem.role_scopes.map(&:scope) } + def scope_for_capability(grant_name) + capabilities_with_scopes.select{|mem| mem.capability.grant_name == grant_name} + .flat_map{|mem| mem.capability_scopes.map(&:scope) } .flat_map{ |scope| scope == 'shift_territory_ids' ? shift_territory_ids : scope} .compact.uniq end - def roles_with_scopes - @roles_with_scopes ||= role_memberships.includes{[role, role_scopes]}.joins{role_scopes.outer}.references(:role) + def capabilities_with_scopes + @capabilities_with_scopes ||= capability_memberships.includes{[capability, capability_scopes]}.joins{capability_scopes.outer}.references(:capability) end def primary_shift_territory @@ -191,6 +191,6 @@ def profile_complete? end def is_active? - vc_is_active or has_role 'always_active' + vc_is_active or has_capability 'always_active' end end diff --git a/app/models/roster/position.rb b/app/models/roster/position.rb index 6feec4d6..f7cb3a5d 100644 --- a/app/models/roster/position.rb +++ b/app/models/roster/position.rb @@ -3,13 +3,13 @@ class Roster::Position < ActiveRecord::Base has_many :position_memberships has_many :people, through: :position_memberships, class_name: 'Roster::Person' - has_many :role_memberships, class_name: 'Roster::RoleMembership' + has_many :capability_memberships, class_name: 'Roster::CapabilityMembership' validates_presence_of :region, :name scope :visible, ->{where{hidden != true}} - accepts_nested_attributes_for :role_memberships, allow_destroy: true + accepts_nested_attributes_for :capability_memberships, allow_destroy: true def vc_regex @compiled_regex ||= (vc_regex_raw.present? && Regexp.new(vc_regex_raw)) diff --git a/app/models/roster/region.rb b/app/models/roster/region.rb index 9afe88fe..927d41cb 100644 --- a/app/models/roster/region.rb +++ b/app/models/roster/region.rb @@ -4,7 +4,7 @@ class Roster::Region < ActiveRecord::Base has_many :shift_territories has_many :positions has_many :people - has_many :roles + has_many :capabilities has_one :vc_import_data diff --git a/app/models/roster/role.rb b/app/models/roster/role.rb deleted file mode 100644 index 5f914f08..00000000 --- a/app/models/roster/role.rb +++ /dev/null @@ -1,8 +0,0 @@ -class Roster::Role < ActiveRecord::Base - has_many :role_memberships, class_name: 'Roster::RoleMembership' - validates :name, :grant_name, presence: true - - def display_name - "#{name} (#{grant_name})" - end -end diff --git a/app/models/roster/role_membership.rb b/app/models/roster/role_membership.rb deleted file mode 100644 index 5802de0e..00000000 --- a/app/models/roster/role_membership.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Roster::RoleMembership < ActiveRecord::Base - belongs_to :position - belongs_to :role - has_many :role_scopes - - accepts_nested_attributes_for :role_scopes, allow_destroy: true - validates :position, :role, presence: true - - def display_name - "#{role.try :name} - (#{role_scopes.map(&:scope).join ','})" - end -end diff --git a/app/models/scheduler/ability.rb b/app/models/scheduler/ability.rb index 4983efd6..1bdd9fac 100644 --- a/app/models/scheduler/ability.rb +++ b/app/models/scheduler/ability.rb @@ -9,19 +9,19 @@ def initialize(person) personal - shift_territory_ids = person.scope_for_role('shift_territory_roster') + shift_territory_ids = person.scope_for_capability('shift_territory_roster') shift_territory_roster(shift_territory_ids) if shift_territory_ids.present? - admin_shift_territory_ids = person.scope_for_role('shift_territory_scheduler') - if person.has_role 'region_scheduler' + admin_shift_territory_ids = person.scope_for_capability('shift_territory_scheduler') + if person.has_capability 'region_scheduler' admin_shift_territory_ids.concat person.region.shift_territory_ids end admin_shift_territory_ids.uniq! scheduler admin_shift_territory_ids if admin_shift_territory_ids.present? - region_dat_admin person.region_id if person.has_role 'region_dat_admin' + region_dat_admin person.region_id if person.has_capability 'region_dat_admin' - dat_admin_shift_territories = person.scope_for_role('shift_territory_dat_admin') + dat_admin_shift_territories = person.scope_for_capability('shift_territory_dat_admin') shift_territory_dat_admin dat_admin_shift_territories if dat_admin_shift_territories.present? # is dat shift_territory admin read_only if ENV['READ_ONLY'] diff --git a/app/views/api/people/show.json.jbuilder b/app/views/api/people/show.json.jbuilder index 6e30b49f..266094b0 100644 --- a/app/views/api/people/show.json.jbuilder +++ b/app/views/api/people/show.json.jbuilder @@ -11,4 +11,4 @@ end json.positions resource.positions do |position| json.name position.name end -json.roles resource.positions.includes{[role_memberships.role_scopes, role_memberships.role]}.flat_map{|p| p.role_memberships.map{|rm| rm.role.grant_name } } \ No newline at end of file +json.capabilities resource.positions.includes{[capability_memberships.capability_scopes, capability_memberships.capability]}.flat_map{|p| p.capability_memberships.map{|rm| rm.capability.grant_name } } \ No newline at end of file diff --git a/app/views/roster/people/show.json.jbuilder b/app/views/roster/people/show.json.jbuilder index 02cefeaa..5bdc4afd 100644 --- a/app/views/roster/people/show.json.jbuilder +++ b/app/views/roster/people/show.json.jbuilder @@ -4,8 +4,8 @@ json.phones resource.phone_order json.region resource.region, :name, :short_name, :id json.positions resource.positions, :name, :abbrev, :id json.shift_territories resource.shift_territories, :name, :abbrev, :id -json.roles resource.role_memberships do |membership| +json.capabilities resource.capability_memberships do |membership| json.extract! membership, :name - json.extract! membership.role, :grant_name - json.role_scopes membership.role_scopes.map(&:scope) if membership.role_scopes.present? + json.extract! membership.capability, :grant_name + json.capability_scopes membership.capability_scopes.map(&:scope) if membership.capability_scopes.present? end \ No newline at end of file diff --git a/db/migrate/20200616202024_rename_roster_role_to_capability.rb b/db/migrate/20200616202024_rename_roster_role_to_capability.rb new file mode 100644 index 00000000..8187d93a --- /dev/null +++ b/db/migrate/20200616202024_rename_roster_role_to_capability.rb @@ -0,0 +1,11 @@ +class RenameRosterRoleToCapability < ActiveRecord::Migration + def change + rename_table :roster_role_memberships, :roster_capability_memberships + rename_table :roster_role_scopes, :roster_capability_scopes + rename_table :roster_roles, :roster_capabilities + + rename_column :roster_capability_memberships, :role_id, :capability_id + rename_column :roster_capability_scopes, :role_membership_id, :capability_membership_id + + end +end diff --git a/db/schema.rb b/db/schema.rb index 953c606b..2238917a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20200616143151) do +ActiveRecord::Schema.define(version: 20200616202024) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -833,6 +833,26 @@ add_index "partners_partners", ["region_id"], name: "index_partners_partners_on_region_id", using: :btree + create_table "roster_capabilities", force: true do |t| + t.string "name" + t.string "grant_name" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "roster_capability_memberships", force: true do |t| + t.integer "capability_id" + t.integer "position_id" + t.string "description" + end + + create_table "roster_capability_scopes", force: true do |t| + t.string "scope" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "capability_membership_id" + end + create_table "roster_cell_carriers", force: true do |t| t.string "name" t.string "sms_gateway" @@ -940,26 +960,6 @@ add_index "roster_regions", ["url_slug"], name: "index_roster_regions_on_url_slug", unique: true, using: :btree - create_table "roster_role_memberships", force: true do |t| - t.integer "role_id" - t.integer "position_id" - t.string "description" - end - - create_table "roster_role_scopes", force: true do |t| - t.string "scope" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "role_membership_id" - end - - create_table "roster_roles", force: true do |t| - t.string "name" - t.string "grant_name" - t.datetime "created_at" - t.datetime "updated_at" - end - create_table "roster_shift_territories", force: true do |t| t.integer "region_id" t.string "name" diff --git a/db/seeds.rb b/db/seeds.rb index 690d71a1..98ddb6c6 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -12,9 +12,9 @@ cell_carrier = Roster::CellCarrier.create! name: 'Verizon', sms_gateway: '@vtext.com' -region_config_role = Roster::Role.create!(name: 'Region Config', grant_name: 'region_config') -region_dat_admin_role = Roster::Role.create!(name: 'Region DAT Admin', grant_name: 'region_dat_admin') -shift_territory_dat_admin_role = Roster::Role.create!(name: 'Shift Territory DAT Admin', grant_name: 'shift_territory_dat_admin') +region_config_capability = Roster::Capability.create!(name: 'Region Config', grant_name: 'region_config') +region_dat_admin_capability = Roster::Capability.create!(name: 'Region DAT Admin', grant_name: 'region_dat_admin') +shift_territory_dat_admin_capability = Roster::Capability.create!(name: 'Shift Territory DAT Admin', grant_name: 'shift_territory_dat_admin') arcba = Roster::Region.create! name:'American Red Cross Bay Area', short_name:'ARCBA', url_slug: 'arcba', code: '05503', time_zone_raw: 'America/Los_Angeles', scheduler_flex_day_start: 28800, scheduler_flex_night_start: 72000 @@ -27,11 +27,11 @@ cc = arcba.shift_territories.create! name: 'Contra Costa', vc_regex_raw: 'Contra Costa', abbrev: 'CC' region_config_position = arcba.positions.create!(name: 'Region Configuration', hidden: true).tap do |position| - position.role_memberships.create!(role: region_config_role) + position.capability_memberships.create!(capability: region_config_capability) end region_dat_admin_position = arcba.positions.create!(name: 'Region DAT Admin', hidden: true).tap do |position| - position.role_memberships.create!(role: region_dat_admin_role) + position.capability_memberships.create!(capability: region_dat_admin_capability) end shift_territory_dat_admin_position = nil @@ -41,7 +41,7 @@ arcba.positions.create!(name: "DAT Administrator - #{shift_territory.name}", vc_regex_raw: "#{shift_territory.name}.*DAT Administrator$"), arcba.positions.create!(name: "Disaster Manager - #{shift_territory.name}", vc_regex_raw: "#{shift_territory.name}.*Disaster Manager$") ].each do |position| - position.role_memberships.create!(role: shift_territory_dat_admin_role) + position.capability_memberships.create!(capability: shift_territory_dat_admin_capability) end shift_territory_dat_admin_position = positions.first if shift_territory == sf end diff --git a/lib/user_info_renderer.rb b/lib/user_info_renderer.rb index 2976e056..4b440113 100644 --- a/lib/user_info_renderer.rb +++ b/lib/user_info_renderer.rb @@ -36,7 +36,7 @@ def vc_profile end def render_position pos - {id: pos.id, region_id: pos.region_id, name: pos.name, roles: pos.role_memberships.map{|r| {name: r.role.grant_name, scope: r.role_scopes.map(&:scope)}}} + {id: pos.id, region_id: pos.region_id, name: pos.name, capabilties: pos.capability_memberships.map{|r| {name: r.capability.grant_name, scope: r.capability_scopes.map(&:scope)}}} end def deployments diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index 4c1c3e45..2075707b 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -23,7 +23,7 @@ def index; render text: 'success'; end it "Does not redirect if has the always_active role" do @person.update_attribute :vc_is_active, false - grant_role! 'always_active' + grant_capability! 'always_active' get :index expect(response).to be_success diff --git a/spec/controllers/incidents/cas_link_controller_spec.rb b/spec/controllers/incidents/cas_link_controller_spec.rb index 9a9d38d4..8ac5c44d 100644 --- a/spec/controllers/incidents/cas_link_controller_spec.rb +++ b/spec/controllers/incidents/cas_link_controller_spec.rb @@ -2,7 +2,7 @@ describe Incidents::CasLinkController, :type => :controller do include LoggedIn - before(:each) { grant_role! 'cas_admin' } + before(:each) { grant_capability! 'cas_admin' } render_views it "displays the list" do diff --git a/spec/controllers/incidents/cases_controller_spec.rb b/spec/controllers/incidents/cases_controller_spec.rb index 9625e865..0f7b84e6 100644 --- a/spec/controllers/incidents/cases_controller_spec.rb +++ b/spec/controllers/incidents/cases_controller_spec.rb @@ -3,7 +3,7 @@ describe Incidents::CasesController, :type => :controller do include LoggedIn render_views - before(:each) { @person.region.incidents_collect_case_details = true; @person.region.save!; grant_role! :submit_incident_report } + before(:each) { @person.region.incidents_collect_case_details = true; @person.region.save!; grant_capability! :submit_incident_report } let!(:incident) { FactoryGirl.create :incident, region: @person.region } diff --git a/spec/controllers/incidents/dat_incidents_controller_spec.rb b/spec/controllers/incidents/dat_incidents_controller_spec.rb index 540a88ba..9325d79b 100644 --- a/spec/controllers/incidents/dat_incidents_controller_spec.rb +++ b/spec/controllers/incidents/dat_incidents_controller_spec.rb @@ -18,11 +18,11 @@ describe "#new" do before(:each) do - grant_role! :submit_incident_report + grant_capability! :submit_incident_report end it "should redirect if there is a valid dat incident already" do - grant_role! :incidents_admin + grant_capability! :incidents_admin incident = FactoryGirl.create :incident, region: @person.region dat = FactoryGirl.create :dat_incident, incident: incident @@ -41,7 +41,7 @@ describe "#edit" do before(:each) do - grant_role! :incidents_admin + grant_capability! :incidents_admin end before(:each) do @incident = FactoryGirl.create :incident, region: @person.region @@ -59,7 +59,7 @@ context "with an existing incident" do before(:each) do - grant_role! :submit_incident_report + grant_capability! :submit_incident_report end before(:each) do @@ -103,7 +103,7 @@ context "updating an existing report" do before(:each) do @incident = FactoryGirl.create :closed_incident, region: @person.region - grant_role! :submit_incident_report + grant_capability! :submit_incident_report end it "should notify the report was filed" do diff --git a/spec/controllers/incidents/event_logs_controller_spec.rb b/spec/controllers/incidents/event_logs_controller_spec.rb index cae01994..2db42be7 100644 --- a/spec/controllers/incidents/event_logs_controller_spec.rb +++ b/spec/controllers/incidents/event_logs_controller_spec.rb @@ -3,7 +3,7 @@ describe Incidents::EventLogsController, :type => :controller do include LoggedIn render_views - before(:each) { grant_role! :submit_incident_report } + before(:each) { grant_capability! :submit_incident_report } let!(:incident) { FactoryGirl.create :incident, region: @person.region } diff --git a/spec/controllers/incidents/incidents_controller_spec.rb b/spec/controllers/incidents/incidents_controller_spec.rb index 01d1508a..cc974953 100644 --- a/spec/controllers/incidents/incidents_controller_spec.rb +++ b/spec/controllers/incidents/incidents_controller_spec.rb @@ -5,7 +5,7 @@ describe "#needs_report" do it "displays the list" do - grant_role! 'submit_incident_report' + grant_capability! 'submit_incident_report' inc = FactoryGirl.create :incident, region: @person.region inc2 = FactoryGirl.create :dat_incident expect(Incidents::Incident.count).to eq(2) @@ -18,7 +18,7 @@ end describe "#show" do - before(:each) { grant_role! 'incidents_admin' } + before(:each) { grant_capability! 'incidents_admin' } let(:inc) {FactoryGirl.create :incident, region: @person.region} it "should succeed with no cas or dat" do inc = FactoryGirl.create :incident, region: @person.region @@ -53,7 +53,7 @@ end describe '#mark_invalid' do - before(:each) { grant_role! 'submit_incident_report' } + before(:each) { grant_capability! 'submit_incident_report' } let!(:inc) {FactoryGirl.create :raw_incident, region: @person.region} before(:each) { allow(Incidents::Notifications::Notification).to receive :create_for_event } @@ -93,7 +93,7 @@ end describe "#close" do - before(:each) { grant_role! 'submit_incident_report' } + before(:each) { grant_capability! 'submit_incident_report' } let(:raw_incident) {FactoryGirl.create :raw_incident, region: @person.region} let(:complete_incident) {FactoryGirl.create :closed_incident, region: @person.region, status: 'open'} @@ -113,7 +113,7 @@ end describe "#reopen" do - before(:each) { grant_role! 'create_incident' } + before(:each) { grant_capability! 'create_incident' } let(:complete_incident) {FactoryGirl.create :closed_incident, region: @person.region} it "should succeed" do @@ -125,7 +125,7 @@ end describe "#create" do - before(:each) { grant_role! 'create_incident' } + before(:each) { grant_capability! 'create_incident' } let(:shift_territory) { @person.region.shift_territories.first } @@ -189,7 +189,7 @@ end describe '#activity' do - before(:each) { grant_role! 'cas_details'; PaperTrail.whodunnit = @person.id } + before(:each) { grant_capability! 'cas_details'; PaperTrail.whodunnit = @person.id } it "should succeed" do get :activity, region_id: @person.region.to_param @@ -200,7 +200,7 @@ describe '#resource_changes', versioning: true do before(:each) { PaperTrail.whodunnit = @person.id } - before(:each) { grant_role! 'cas_details'; PaperTrail.whodunnit = @person.id } + before(:each) { grant_capability! 'cas_details'; PaperTrail.whodunnit = @person.id } it "should provide list of changes to incidents" do i = FactoryGirl.create :incident, region: @person.region diff --git a/spec/controllers/incidents/notifications_controller_spec.rb b/spec/controllers/incidents/notifications_controller_spec.rb index 3a5e5260..9784688c 100644 --- a/spec/controllers/incidents/notifications_controller_spec.rb +++ b/spec/controllers/incidents/notifications_controller_spec.rb @@ -3,7 +3,7 @@ describe Incidents::NotificationsController, :type => :controller do include LoggedIn render_views - before(:each) { @person.region.incidents_use_escalation_levels = true; @person.region.save!; grant_role! :submit_incident_report } + before(:each) { @person.region.incidents_use_escalation_levels = true; @person.region.save!; grant_capability! :submit_incident_report } before(:each) { allow(Incidents::Notifications::Notification).to receive :create } let!(:incident) { FactoryGirl.create :incident, region: @person.region } diff --git a/spec/controllers/incidents/responders_controller_spec.rb b/spec/controllers/incidents/responders_controller_spec.rb index e05ffe43..18d5c75f 100644 --- a/spec/controllers/incidents/responders_controller_spec.rb +++ b/spec/controllers/incidents/responders_controller_spec.rb @@ -36,7 +36,7 @@ let(:person) { FactoryGirl.create :person, work_phone_carrier: FactoryGirl.create(:cell_carrier), region: incident.region } before :each do - grant_role! 'submit_incident_report' + grant_capability! 'submit_incident_report' end describe "POST create" do diff --git a/spec/controllers/root_controller_spec.rb b/spec/controllers/root_controller_spec.rb index 82e9d71a..35c94d60 100644 --- a/spec/controllers/root_controller_spec.rb +++ b/spec/controllers/root_controller_spec.rb @@ -61,10 +61,10 @@ end it "should return a link where the current user has the correct role" do - role = FactoryGirl.create :role, grant_name: 'homepage_link' + capability = FactoryGirl.create :capability, grant_name: 'homepage_link' pos = FactoryGirl.create :position, region: @person.region - mem = Roster::RoleMembership.create role: role, position: pos - mem.role_scopes.create! scope: 'test' + mem = Roster::CapabilityMembership.create capability: capability, position: pos + mem.capability_scopes.create! scope: 'test' @person.positions << pos @person.save @@ -73,7 +73,7 @@ end it "should not return a link where the current user does not have the right role" do - role = FactoryGirl.create :role, grant_name: 'homepage_link' + role = FactoryGirl.create :capability, grant_name: 'homepage_link' link.roles.create! role_scope: 'test' expect(controller.homepage_links.values.flatten).to match_array([]) end diff --git a/spec/controllers/scheduler/shift_assignments_spec.rb b/spec/controllers/scheduler/shift_assignments_spec.rb index bf43dfb7..f3a2aa16 100644 --- a/spec/controllers/scheduler/shift_assignments_spec.rb +++ b/spec/controllers/scheduler/shift_assignments_spec.rb @@ -64,7 +64,7 @@ FactoryGirl.create :shift_assignment, person: pers, date: (Date.today+6+i), shift: shift, shift_time: @shift_time } - grant_role! 'shift_territory_dat_admin', @person.shift_territory_ids, @person + grant_capability! 'shift_territory_dat_admin', @person.shift_territory_ids, @person get :index, format: :ics, api_token: @settings.calendar_api_token, show_shifts: 'all' @@ -80,7 +80,7 @@ FactoryGirl.create :shift_assignment, person: pers, date: (Date.today+i), shift: shift, shift_time: @shift_time } - grant_role! 'shift_territory_dat_admin', @person.shift_territory_ids, @person + grant_capability! 'shift_territory_dat_admin', @person.shift_territory_ids, @person get :index, format: :ics, api_token: @settings.calendar_api_token, show_shifts: 'all' diff --git a/spec/controllers/scheduler/shift_swaps_controller_spec.rb b/spec/controllers/scheduler/shift_swaps_controller_spec.rb index c694618e..18fa2852 100644 --- a/spec/controllers/scheduler/shift_swaps_controller_spec.rb +++ b/spec/controllers/scheduler/shift_swaps_controller_spec.rb @@ -93,12 +93,12 @@ # of @logged_in_person and @person, this was the only test that broke. # # There's something that's not quite getting set, most likely in the - # grant_role code, but it's not obvious. This whole test should + # grant_capability code, but it's not obvious. This whole test should # be reevaluated and make sure it's testing how it should be testing. # # See e0bb7e7 for that removal. xit "should allow accepting a swap to someone else as admin" do - grant_role! 'region_dat_admin'#, @person.shift_territory_ids + grant_capability! 'region_dat_admin'#, @person.shift_territory_ids @assignment.update_attribute :available_for_swap, true post :confirm, shift_assignment_id: @assignment.id, swap_to_id: @person2.id diff --git a/spec/factories/roster_roles.rb b/spec/factories/roster_capabilities.rb similarity index 72% rename from spec/factories/roster_roles.rb rename to spec/factories/roster_capabilities.rb index 4b8dc308..6aee9bf3 100644 --- a/spec/factories/roster_roles.rb +++ b/spec/factories/roster_capabilities.rb @@ -1,7 +1,7 @@ # Read about factories at https://github.com/thoughtbot/factory_girl FactoryGirl.define do - factory :role, :class => 'Roster::Role' do + factory :capability, :class => 'Roster::Capability' do name "MyString" grant_name "MyString" end diff --git a/spec/factories/roster_role_scopes.rb b/spec/factories/roster_capability_scopes.rb similarity index 56% rename from spec/factories/roster_role_scopes.rb rename to spec/factories/roster_capability_scopes.rb index fcbf1fe9..d4db336a 100644 --- a/spec/factories/roster_role_scopes.rb +++ b/spec/factories/roster_capability_scopes.rb @@ -1,8 +1,8 @@ # Read about factories at https://github.com/thoughtbot/factory_girl FactoryGirl.define do - factory :roster_role_scope, :class => 'Roster::RoleScope' do - role nil + factory :roster_capability_scope, :class => 'Roster::CapabilityScope' do + capability nil scope "MyString" end end diff --git a/spec/features/admin/basic_admin_pages_spec.rb b/spec/features/admin/basic_admin_pages_spec.rb index 77b0cd24..9e9882dd 100644 --- a/spec/features/admin/basic_admin_pages_spec.rb +++ b/spec/features/admin/basic_admin_pages_spec.rb @@ -4,7 +4,7 @@ # "can I get to the page" tests describe "Basic Admin Pages", :type => :feature do before(:each) do - grant_role! :region_config + grant_capability! :region_config end it "Visits the Call Logs page" do @@ -180,8 +180,8 @@ it "Visits the Roles page" do visit "/scheduler_admin/people" find("#roster").hover - click_on "Roles" - expect(page).to have_current_path("/scheduler_admin/roles") + click_on "Capabilities" + expect(page).to have_current_path("/scheduler_admin/capabilities") end it "Visits the Dispatch Configs page" do diff --git a/spec/features/admin/incident_notification_roles_spec.rb b/spec/features/admin/incident_notification_roles_spec.rb index 14f979e8..a545740b 100644 --- a/spec/features/admin/incident_notification_roles_spec.rb +++ b/spec/features/admin/incident_notification_roles_spec.rb @@ -2,7 +2,7 @@ describe "Incident Notification Roles Admin Page", :type => :feature do before(:each) do - grant_role! :region_config + grant_capability! :region_config end it "Creates a new Notification Role" do diff --git a/spec/features/admin/incident_response_territories_spec.rb b/spec/features/admin/incident_response_territories_spec.rb index c9f3dd75..8575a1ba 100644 --- a/spec/features/admin/incident_response_territories_spec.rb +++ b/spec/features/admin/incident_response_territories_spec.rb @@ -2,7 +2,7 @@ describe "Incident Response Territories Admin Page", :type => :feature do before(:each) do - grant_role! :region_config + grant_capability! :region_config end it "Creates a new Response Territory" do diff --git a/spec/features/admin/region_extra_spec.rb b/spec/features/admin/region_extra_spec.rb index 43aae549..86a0300d 100644 --- a/spec/features/admin/region_extra_spec.rb +++ b/spec/features/admin/region_extra_spec.rb @@ -5,7 +5,7 @@ # we decided to keep them live. Which means they need tests! describe "Region Extra Configuration Pages", :type => :feature do before(:each) do - grant_role! :region_config + grant_capability! :region_config end it "Update the region shift territories" do diff --git a/spec/features/admin/root_admin_spec.rb b/spec/features/admin/root_admin_spec.rb index 78c09d19..8bfb6934 100644 --- a/spec/features/admin/root_admin_spec.rb +++ b/spec/features/admin/root_admin_spec.rb @@ -6,7 +6,7 @@ visit "/" page.should_not have_text("Admin") - grant_role! :region_config + grant_capability! :region_config visit "/" click_on "Admin" diff --git a/spec/features/admin/system_homepage_links_spec.rb b/spec/features/admin/system_homepage_links_spec.rb index d30b9275..d94d65de 100644 --- a/spec/features/admin/system_homepage_links_spec.rb +++ b/spec/features/admin/system_homepage_links_spec.rb @@ -2,7 +2,7 @@ describe "System Homepage Links Admin Page", :type => :feature do before(:each) do - grant_role! :region_config + grant_capability! :region_config end it "Creates a new Homepage Link" do diff --git a/spec/features/admin/system_jobs_spec.rb b/spec/features/admin/system_jobs_spec.rb index d7f75853..426eab3d 100644 --- a/spec/features/admin/system_jobs_spec.rb +++ b/spec/features/admin/system_jobs_spec.rb @@ -2,7 +2,7 @@ describe "System Jobs Admin Page", :type => :feature do before(:each) do - grant_role! :region_config + grant_capability! :region_config end # Jobs actually get created by enqueing a job, not diff --git a/spec/features/admin/system_named_queries_spec.rb b/spec/features/admin/system_named_queries_spec.rb index fea65216..165bd291 100644 --- a/spec/features/admin/system_named_queries_spec.rb +++ b/spec/features/admin/system_named_queries_spec.rb @@ -2,7 +2,7 @@ describe "System Named Queries Admin Page", :type => :feature do before(:each) do - grant_role! :region_config + grant_capability! :region_config end it "Creates a new Homepage Link" do diff --git a/spec/features/incidents/attachments_spec.rb b/spec/features/incidents/attachments_spec.rb index d6bd6c43..0be5fdab 100644 --- a/spec/features/incidents/attachments_spec.rb +++ b/spec/features/incidents/attachments_spec.rb @@ -3,7 +3,7 @@ describe "Incident Attachments", :type => :feature do it "Should be addable" do - grant_role! 'submit_incident_report' + grant_capability! 'submit_incident_report' incident = FactoryGirl.create :raw_incident, region: @person.region, shift_territory: @person.shift_territories.first, date: Date.current FactoryGirl.create :incidents_scope, region: @person.region diff --git a/spec/features/incidents/create_incident_spec.rb b/spec/features/incidents/create_incident_spec.rb index 065be5b5..8cffd2d0 100644 --- a/spec/features/incidents/create_incident_spec.rb +++ b/spec/features/incidents/create_incident_spec.rb @@ -3,8 +3,8 @@ describe "Manually create incident", :type => :feature do before do - grant_role! :submit_incident_report - grant_role! :incidents_admin + grant_capability! :submit_incident_report + grant_capability! :incidents_admin FactoryGirl.create :incidents_scope, region: @person.region FactoryGirl.create :response_territory, region: @person.region, name: 'SF Response Territory', counties: ['San Francisco, CA'] end diff --git a/spec/features/incidents/dispatch_intake_spec.rb b/spec/features/incidents/dispatch_intake_spec.rb index 0ee3e5f5..1920203f 100644 --- a/spec/features/incidents/dispatch_intake_spec.rb +++ b/spec/features/incidents/dispatch_intake_spec.rb @@ -14,7 +14,7 @@ @scope = FactoryGirl.create :incidents_scope, enable_dispatch_console: true, region: @region - grant_role!(:dispatch_console, [@scope.id]) + grant_capability!(:dispatch_console, [@scope.id]) backup_person = FactoryGirl.create :person, region: @region dc = FactoryGirl.create :scheduler_dispatch_config, region: @region, backup_first: backup_person diff --git a/spec/features/incidents/global_log_spec.rb b/spec/features/incidents/global_log_spec.rb index f77503ec..e48f2424 100644 --- a/spec/features/incidents/global_log_spec.rb +++ b/spec/features/incidents/global_log_spec.rb @@ -3,7 +3,7 @@ describe "View Global Log", :type => :feature do it "Should be submittable" do - grant_role! :incidents_admin + grant_capability! :incidents_admin @region = @person.region @region.incidents_use_global_log = true @region.save! diff --git a/spec/features/incidents/incidents_editable_spec.rb b/spec/features/incidents/incidents_editable_spec.rb index c080ff88..3041d56f 100644 --- a/spec/features/incidents/incidents_editable_spec.rb +++ b/spec/features/incidents/incidents_editable_spec.rb @@ -3,7 +3,7 @@ describe "Invalid Incident Report", :type => :feature do self.use_transactional_fixtures = false before do - grant_role! 'submit_incident_report' + grant_capability! 'submit_incident_report' @region = @person.region @region.incidents_report_editable = true diff --git a/spec/features/incidents/initial_incident_report_spec.rb b/spec/features/incidents/initial_incident_report_spec.rb index 5252a101..90576fb1 100644 --- a/spec/features/incidents/initial_incident_report_spec.rb +++ b/spec/features/incidents/initial_incident_report_spec.rb @@ -12,7 +12,7 @@ end it "Should be editable" do - grant_role! :submit_incident_report + grant_capability! :submit_incident_report visit "/incidents/#{@region.url_slug}/incidents/#{@incident.incident_number}" click_link "IIR" @@ -49,7 +49,7 @@ end it "Should be approvable and unapprovable" do - grant_role! :approve_iir + grant_capability! :approve_iir iir = FactoryGirl.create :complete_initial_incident_report, incident: @incident @incident.event_logs.create event_time: Time.current, event: 'incident_occurred' diff --git a/spec/features/incidents/invalid_incident_spec.rb b/spec/features/incidents/invalid_incident_spec.rb index 31b4f517..73f7c9b3 100644 --- a/spec/features/incidents/invalid_incident_spec.rb +++ b/spec/features/incidents/invalid_incident_spec.rb @@ -4,7 +4,7 @@ #self.use_transactional_fixtures = false it "Should be submittable" do - grant_role! 'submit_incident_report' + grant_capability! 'submit_incident_report' @region = @person.region FactoryGirl.create :incidents_scope, region: @person.region diff --git a/spec/features/incidents/responder_history_spec.rb b/spec/features/incidents/responder_history_spec.rb index 9fa6a4de..7a2b000f 100644 --- a/spec/features/incidents/responder_history_spec.rb +++ b/spec/features/incidents/responder_history_spec.rb @@ -12,7 +12,7 @@ end it "Should be viewable for someone with permissions" do - grant_role! 'see_responses' + grant_capability! 'see_responses' FactoryGirl.create :incidents_scope, region: @person.region visit "/incidents/#{@person.region.url_slug}" @@ -20,7 +20,7 @@ end it "Should have responders" do - grant_role! 'see_responses' + grant_capability! 'see_responses' incident = FactoryGirl.create :incident, region: @person.region, date: Date.current FactoryGirl.create :responder_assignment, person: @person, incident: incident diff --git a/spec/features/incidents/responders_console_spec.rb b/spec/features/incidents/responders_console_spec.rb index 3dcac6c2..1d4add93 100644 --- a/spec/features/incidents/responders_console_spec.rb +++ b/spec/features/incidents/responders_console_spec.rb @@ -7,7 +7,7 @@ end before do - grant_role! :incidents_admin + grant_capability! :incidents_admin @region = @person.region @region.incidents_enable_dispatch_console = true @region.save! diff --git a/spec/features/incidents/submit_dat_incident_report_spec.rb b/spec/features/incidents/submit_dat_incident_report_spec.rb index 69f519b1..b6f05c14 100644 --- a/spec/features/incidents/submit_dat_incident_report_spec.rb +++ b/spec/features/incidents/submit_dat_incident_report_spec.rb @@ -4,7 +4,7 @@ #self.use_transactional_fixtures = false it "Should be submittable" do - grant_role! 'submit_incident_report' + grant_capability! 'submit_incident_report' @region = @person.region FactoryGirl.create :incidents_scope, region: @person.region diff --git a/spec/features/incidents/subscribe_weekly_report_spec.rb b/spec/features/incidents/subscribe_weekly_report_spec.rb index 0b35d2a0..42c0da25 100644 --- a/spec/features/incidents/subscribe_weekly_report_spec.rb +++ b/spec/features/incidents/subscribe_weekly_report_spec.rb @@ -3,7 +3,7 @@ describe "Weekly Report", :type => :feature do it "Should be subscribable" do - grant_role! :incidents_admin + grant_capability! :incidents_admin @scope = FactoryGirl.create :incidents_scope, region: @person.region, report_frequencies: 'weekly,daily' visit "/incidents/#{@scope.url_slug}" diff --git a/spec/features/incidents/timeline_spec.rb b/spec/features/incidents/timeline_spec.rb index b23e7b3f..5eb8f372 100644 --- a/spec/features/incidents/timeline_spec.rb +++ b/spec/features/incidents/timeline_spec.rb @@ -3,7 +3,7 @@ describe "View Timeline", :type => :feature do it "Should be submittable" do - grant_role! :incidents_admin + grant_capability! :incidents_admin @region = @person.region @region.incidents_use_global_log = true @region.save! diff --git a/spec/features/scheduler/notifications_settings_spec.rb b/spec/features/scheduler/notifications_settings_spec.rb index 286a5e02..c9a9fcb8 100644 --- a/spec/features/scheduler/notifications_settings_spec.rb +++ b/spec/features/scheduler/notifications_settings_spec.rb @@ -2,7 +2,7 @@ describe "Notifications Settings Page", :type => :feature do it "Views the default page as admin" do - grant_role! 'region_dat_admin' + grant_capability! 'region_dat_admin' visit "/scheduler/" click_on "Update reminder preferences" diff --git a/spec/features/scheduler/people_spec.rb b/spec/features/scheduler/people_spec.rb index d18bbbd1..faf3e6cc 100644 --- a/spec/features/scheduler/people_spec.rb +++ b/spec/features/scheduler/people_spec.rb @@ -2,14 +2,14 @@ describe "Notifications Settings Page", :type => :feature do it "Views the default page as admin" do - grant_role! 'region_dat_admin' + grant_capability! 'region_dat_admin' visit "/scheduler/" click_on "Show Roster" end it "Updates last shift taken" do - grant_role! 'region_dat_admin' + grant_capability! 'region_dat_admin' visit "/scheduler/" click_on "Show Roster" diff --git a/spec/features/scheduler/shift_management_spec.rb b/spec/features/scheduler/shift_management_spec.rb index cfb826af..aa3a12f9 100644 --- a/spec/features/scheduler/shift_management_spec.rb +++ b/spec/features/scheduler/shift_management_spec.rb @@ -2,7 +2,7 @@ describe "Shift Scheduler Spec", :type => :feature do before :each do - grant_role! "region_dat_admin" + grant_capability! "region_dat_admin" group = FactoryGirl.create :shift_time, region: @person.region, start_offset: 10.hours, end_offset: 22.hours shift_territory = FactoryGirl.create :shift_territory, name: "Shift Territory", region: @person.region diff --git a/spec/features/scheduler/shift_scheduler_spec.rb b/spec/features/scheduler/shift_scheduler_spec.rb index 68c23e4d..c597ddda 100644 --- a/spec/features/scheduler/shift_scheduler_spec.rb +++ b/spec/features/scheduler/shift_scheduler_spec.rb @@ -189,7 +189,7 @@ def month_of_interest_link @other_person.positions = @positions @other_person.shift_territories = @shift_territories - grant_role! 'shift_territory_dat_admin', @other_person.shift_territory_ids, @other_person + grant_capability! 'shift_territory_dat_admin', @other_person.shift_territory_ids, @other_person visit month_of_interest_link all(".shift-checkbox")[5].click diff --git a/spec/models/incidents/ability_spec.rb b/spec/models/incidents/ability_spec.rb index c7454223..ce270def 100644 --- a/spec/models/incidents/ability_spec.rb +++ b/spec/models/incidents/ability_spec.rb @@ -2,20 +2,20 @@ describe Incidents::Ability, :type => :model do - let(:roles) {[]} + let(:capabilities) {[]} let(:region) {FactoryGirl.create :region} let(:person) { double(:person, region: region, id: 10, region_id: region.id).tap{|p| - allow(p).to receive(:has_role) do |role| - roles.include? role + allow(p).to receive(:has_capability) do |capability| + capabilities.include? capability end } } subject { Incidents::Ability.new(person) } - def grant_role(role) - roles << role + def grant_capability(capability) + capabilities << capability end def can! *args @@ -32,7 +32,7 @@ def cannot! *args it {cannot! :mark_invalid, Incidents::Incident} context "As incident report submitter" do - before(:each) {grant_role 'submit_incident_report'} + before(:each) {grant_capability 'submit_incident_report'} it {can! :create, Incidents::DatIncident} it {can! :needs_report, Incidents::Incident} diff --git a/spec/models/roster/person_spec.rb b/spec/models/roster/person_spec.rb index 91e30f74..3228c36c 100644 --- a/spec/models/roster/person_spec.rb +++ b/spec/models/roster/person_spec.rb @@ -4,53 +4,53 @@ let(:region) {FactoryGirl.create :region} let(:person) {FactoryGirl.create :person, positions: [position], region: region} let(:position) {Roster::Position.create name: 'Test Position', region: region} - let(:role) {Roster::Role.create name: 'Test Role', grant_name: grant_name} - let!(:membership) { Roster::RoleMembership.create role: role, position: position} - describe "#has_role" do + let(:capability) {Roster::Capability.create name: 'Test Capability', grant_name: grant_name} + let!(:membership) { Roster::CapabilityMembership.create capability: capability, position: position} + describe "#has_capability" do let(:grant_name) { "test_grant" } - before(:each) { role } + before(:each) { capability } - it "should return true if it has a role without a scope" do - expect(person.has_role( grant_name)).to be_truthy - expect(person.has_role( grant_name + "x")).to be_falsey + it "should return true if it has a capability without a scope" do + expect(person.has_capability( grant_name)).to be_truthy + expect(person.has_capability( grant_name + "x")).to be_falsey end - it "should return true if it has a role with a scope" do - membership.role_scopes.build scope: "test" + it "should return true if it has a capability with a scope" do + membership.capability_scopes.build scope: "test" membership.save! - expect(person.has_role( grant_name)).to be_truthy - expect(person.has_role( grant_name + "x")).to be_falsey + expect(person.has_capability( grant_name)).to be_truthy + expect(person.has_capability( grant_name + "x")).to be_falsey end end - describe "#scope_for_role" do + describe "#scope_for_capability" do let(:grant_name) { "test_grant" } - before(:each) { role } + before(:each) { capability } - it "should return empty if it doesn't have that role" do + it "should return empty if it doesn't have that capability" do - expect(person.scope_for_role( grant_name + "x")).to eq([]) + expect(person.scope_for_capability( grant_name + "x")).to eq([]) end - it "should return the scopes if it has a role with a scope" do - membership.role_scopes.build scope: "test" - membership.role_scopes.build scope: "1" + it "should return the scopes if it has a capability with a scope" do + membership.capability_scopes.build scope: "test" + membership.capability_scopes.build scope: "1" membership.save! - expect(person.scope_for_role( grant_name)).to match_array(['test', 1]) + expect(person.scope_for_capability( grant_name)).to match_array(['test', 1]) end it "should return shift_territory ids for scope if the scope is shift_territory_ids" do - membership.role_scopes.build scope: "shift_territory_ids" - membership.role_scopes.build scope: "424242" + membership.capability_scopes.build scope: "shift_territory_ids" + membership.capability_scopes.build scope: "424242" membership.save! c = person.shift_territories.create name: 'Test Shift Territory', region: region - expect(person.scope_for_role( grant_name)).to match_array(person.shift_territory_ids + [424242]) + expect(person.scope_for_capability( grant_name)).to match_array(person.shift_territory_ids + [424242]) end end end \ No newline at end of file diff --git a/spec/models/scheduler/ability_spec.rb b/spec/models/scheduler/ability_spec.rb index 8328e33f..6b2fa21e 100644 --- a/spec/models/scheduler/ability_spec.rb +++ b/spec/models/scheduler/ability_spec.rb @@ -64,7 +64,7 @@ context "as shift_territory dat admin" do before(:each) do - grant_role! 'shift_territory_dat_admin', @person.shift_territory_ids + grant_capability! 'shift_territory_dat_admin', @person.shift_territory_ids @non_shift_territory_person = FactoryGirl.create :person, region: @person.region end diff --git a/spec/support/capabilities.rb b/spec/support/capabilities.rb new file mode 100644 index 00000000..f48a284c --- /dev/null +++ b/spec/support/capabilities.rb @@ -0,0 +1,22 @@ +module AuthorizationCapabilities + extend ActiveSupport::Concern + included do + def grant_capability!(name, scope=nil, person=nil) + person ||= @person + + capability = Roster::Capability.create! name: name, grant_name: name + pos = Roster::Position.create! name:name, region: person.region + mem = Roster::CapabilityMembership.create! capability: capability, position: pos + if scope + scope.each do |s| + mem.capability_scopes.create scope: s + end + end + person.positions << pos + end + end +end + +RSpec.configure do |config| + config.include AuthorizationCapabilities +end \ No newline at end of file diff --git a/spec/support/roles.rb b/spec/support/roles.rb deleted file mode 100644 index 159789e0..00000000 --- a/spec/support/roles.rb +++ /dev/null @@ -1,22 +0,0 @@ -module AuthorizationRoles - extend ActiveSupport::Concern - included do - def grant_role!(name, scope=nil, person=nil) - person ||= @person - - role = Roster::Role.create! name: name, grant_name: name - pos = Roster::Position.create! name:name, region: person.region - mem = Roster::RoleMembership.create! role: role, position: pos - if scope - scope.each do |s| - mem.role_scopes.create scope: s - end - end - person.positions << pos - end - end -end - -RSpec.configure do |config| - config.include AuthorizationRoles -end \ No newline at end of file