diff --git a/README.md b/README.md
index be358fc5f..9579bca21 100644
--- a/README.md
+++ b/README.md
@@ -67,7 +67,7 @@ within our community. ❤️
- [What is Forem?](#what-is-forem)
- [Table of Contents](#table-of-contents)
-- [Community](#community)
+- [Community](#community)
- [Contributing](#contributing)
- [Getting Started](#getting-started)
- [Prerequisites](#prerequisites)
diff --git a/app/controllers/admin/data_update_scripts_controller.rb b/app/controllers/admin/data_update_scripts_controller.rb
index 712fe0e94..1db1ce3f4 100644
--- a/app/controllers/admin/data_update_scripts_controller.rb
+++ b/app/controllers/admin/data_update_scripts_controller.rb
@@ -16,5 +16,11 @@ module Admin
def force_run
DataUpdateWorker.perform_async(params[:id])
end
+
+ private
+
+ def authorize_admin
+ authorize DataUpdateScript, :access?, policy_class: InternalPolicy
+ end
end
end
diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb
index 7c0d00a96..125fbe93b 100644
--- a/app/helpers/admin_helper.rb
+++ b/app/helpers/admin_helper.rb
@@ -37,6 +37,10 @@ module AdminHelper
PROFILE_ADMIN = { name: "config: profile setup", controller: "profile_fields" }.freeze
+ TECH_MENU_ITEMS = [
+ { name: "data_update_scripts", controller: "data_update_scripts" },
+ ].sort_by { |menu_item| menu_item[:name] }
+
def admin_menu_items
return MENU_ITEMS unless FeatureFlag.enabled?(:profile_admin)
diff --git a/app/lib/constants/role.rb b/app/lib/constants/role.rb
index 60a694e7c..7c71a04be 100644
--- a/app/lib/constants/role.rb
+++ b/app/lib/constants/role.rb
@@ -9,6 +9,7 @@ module Constants
SPECIAL_ROLES = ["Admin",
"Super Admin",
+ "Tech Admin",
"Resource Admin: Article",
"Resource Admin: Comment",
"Resource Admin: BufferUpdate",
@@ -20,6 +21,7 @@ module Constants
"Resource Admin: HtmlVariant",
"Resource Admin: DisplayAd",
"Resource Admin: ListingCategory",
- "Resource Admin: Tag"].freeze
+ "Resource Admin: Tag",
+ "Resource Admin: DataUpdateScript"].freeze
end
end
diff --git a/app/models/data_update_script.rb b/app/models/data_update_script.rb
index 7e16c67dd..9959f152c 100644
--- a/app/models/data_update_script.rb
+++ b/app/models/data_update_script.rb
@@ -2,6 +2,7 @@ class DataUpdateScript < ApplicationRecord
DIRECTORY = Rails.root.join("lib/data_update_scripts").freeze
NAMESPACE = "DataUpdateScripts".freeze
STATUSES = { enqueued: 0, working: 1, succeeded: 2, failed: 3 }.freeze
+ resourcify
enum status: STATUSES
diff --git a/app/services/moderator/manage_activity_and_roles.rb b/app/services/moderator/manage_activity_and_roles.rb
index 4dfc61692..8bd3a53c6 100644
--- a/app/services/moderator/manage_activity_and_roles.rb
+++ b/app/services/moderator/manage_activity_and_roles.rb
@@ -78,6 +78,14 @@ module Moderator
check_super_admin
remove_negative_roles
user.add_role :super_admin
+ when "Tech Admin"
+ check_super_admin
+ remove_negative_roles
+ user.add_role :tech_admin
+ # DataUpdateScripts falls under the admin namespace
+ # and hence requires a single_resource_admin role to view
+ # this technical admin resource
+ user.add_role(:single_resource_admin, DataUpdateScript)
when /^(Resource Admin: )/
check_super_admin
remove_negative_roles
diff --git a/app/views/admin/admin_portals/index.html.erb b/app/views/admin/admin_portals/index.html.erb
index 7d2be8338..9e4da7778 100644
--- a/app/views/admin/admin_portals/index.html.erb
+++ b/app/views/admin/admin_portals/index.html.erb
@@ -21,4 +21,20 @@
<% end %>
+
+
+
+
Tech Resources
+ <% AdminHelper::TECH_MENU_ITEMS.each do |tech_menu_item| %>
+
+ <% end %>
+
+
+
diff --git a/app/views/admin/shared/_navbar.html.erb b/app/views/admin/shared/_navbar.html.erb
index 398d87d04..71893b96f 100644
--- a/app/views/admin/shared/_navbar.html.erb
+++ b/app/views/admin/shared/_navbar.html.erb
@@ -1,4 +1,4 @@
-<% admin_menu_items.each do |menu_item| %>
+<% menu_items.each do |menu_item| %>
" href="/admin/<%= menu_item[:controller] %>">
<%= menu_item[:name].to_s.titleize %>
diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb
index 0323f3f38..60c75b6fb 100644
--- a/app/views/layouts/admin.html.erb
+++ b/app/views/layouts/admin.html.erb
@@ -56,11 +56,13 @@
">
<% unless controller_name == "admin_portals" %>
-
+
<% end %>
<% flash.each do |type, message| %>
diff --git a/config/routes.rb b/config/routes.rb
index 60a79e2ec..f0b9858d3 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -49,9 +49,6 @@ Rails.application.routes.draw do
{ rack_protection: { except: %i[authenticity_token form_token json_csrf
remote_token http_origin session_hijacking] } })
mount flipper_ui, at: "feature_flags"
-
- resources :data_update_scripts, only: %i[index show]
- post "/data_update_scripts/:id/force_run", to: "data_update_scripts#force_run"
end
namespace :users do
@@ -66,6 +63,11 @@ Rails.application.routes.draw do
destroy], path: "listings/categories"
resources :comments, only: [:index]
+ resources :data_update_scripts, only: %i[index show] do
+ member do
+ post :force_run
+ end
+ end
resources :events, only: %i[index create update new edit]
resources :feedback_messages, only: %i[index show]
resources :invitations, only: %i[index new create destroy]
diff --git a/lib/data_update_scripts/20210203104631_add_single_resource_admin_role_to_users_with_tech_admin.rb b/lib/data_update_scripts/20210203104631_add_single_resource_admin_role_to_users_with_tech_admin.rb
new file mode 100644
index 000000000..f3b915ed9
--- /dev/null
+++ b/lib/data_update_scripts/20210203104631_add_single_resource_admin_role_to_users_with_tech_admin.rb
@@ -0,0 +1,10 @@
+module DataUpdateScripts
+ class AddSingleResourceAdminRoleToUsersWithTechAdmin
+ def run
+ users_with_tech_admin_role = Role.find_by(name: "tech_admin").users
+ users_with_tech_admin_role.find_each do |user|
+ user.add_role(:single_resource_admin, DataUpdateScript)
+ end
+ end
+ end
+end
diff --git a/spec/lib/data_update_scripts/add_single_resource_admin_role_to_users_with_tech_admin_spec.rb b/spec/lib/data_update_scripts/add_single_resource_admin_role_to_users_with_tech_admin_spec.rb
new file mode 100644
index 000000000..99510d4de
--- /dev/null
+++ b/spec/lib/data_update_scripts/add_single_resource_admin_role_to_users_with_tech_admin_spec.rb
@@ -0,0 +1,28 @@
+require "rails_helper"
+require Rails.root.join(
+ "lib/data_update_scripts/20210203104631_add_single_resource_admin_role_to_users_with_tech_admin.rb",
+)
+
+describe DataUpdateScripts::AddSingleResourceAdminRoleToUsersWithTechAdmin do
+ let!(:tech_admin1) { create(:user, :tech_admin) }
+ let!(:tech_admin2) { create(:user, :tech_admin) }
+ let!(:admin) { create(:user, :admin) }
+
+ it "adds single_resource_admin roles to users with tech_admin roles" do
+ described_class.new.run
+
+ expect(tech_admin1.reload.roles.pluck(:name)).to include("single_resource_admin")
+ expect(tech_admin2.reload.roles.pluck(:name)).to include("single_resource_admin")
+ end
+
+ it "sets the correct resource type for the single_resource_admin role" do
+ described_class.new.run
+ expect(tech_admin2.reload.roles.pluck(:resource_type)).to include("DataUpdateScript")
+ end
+
+ it "does not add single_resource_admin roles alongside other roles" do
+ described_class.new.run
+ expect(admin.reload.roles.pluck(:name)).not_to include("single_resource_admin")
+ end
+
+end
diff --git a/spec/services/moderator/manage_activity_and_roles_spec.rb b/spec/services/moderator/manage_activity_and_roles_spec.rb
index 2a710d3aa..131c22fa4 100644
--- a/spec/services/moderator/manage_activity_and_roles_spec.rb
+++ b/spec/services/moderator/manage_activity_and_roles_spec.rb
@@ -34,6 +34,16 @@ RSpec.describe Moderator::ManageActivityAndRoles, type: :service do
expect(user.has_role?(:admin)).to be true
end
+ it "updates user to tech admin" do
+ described_class.handle_user_roles(
+ admin: admin,
+ user: user,
+ user_params: { note_for_current_role: "Upgrading to tech admin", user_status: "Tech Admin" },
+ )
+ expect(user.has_role?(:tech_admin)).to be true
+ expect(user.has_role?(:single_resource_admin, DataUpdateScript)).to be true
+ end
+
it "updates user to single resource admin" do
described_class.handle_user_roles(
admin: admin,