mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-11-12 09:20:45 +08:00
Add migration for new user assignments to projects [SCI-5478]
This commit is contained in:
parent
49194d1a45
commit
d8cffe53c7
6 changed files with 89 additions and 14 deletions
|
|
@ -4,5 +4,5 @@ class UserAssignment < ApplicationRecord
|
||||||
belongs_to :assignable, polymorphic: true
|
belongs_to :assignable, polymorphic: true
|
||||||
belongs_to :user_role
|
belongs_to :user_role
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
belongs_to :assigned_by, foreign_key: 'assigned_by_id', class_name: 'User'
|
belongs_to :assigned_by, foreign_key: 'assigned_by_id', class_name: 'User', optional: true
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,9 @@ class UserRole < ApplicationRecord
|
||||||
def self.owner_role
|
def self.owner_role
|
||||||
new(
|
new(
|
||||||
name: I18n.t('user_roles.predefined.owner'),
|
name: I18n.t('user_roles.predefined.owner'),
|
||||||
permissions: ProjectPermissions.constants + ExperimentPermissions.constants + MyModulePermissions.constants,
|
permissions: ProjectPermissions.constants.map { |const| ProjectPermissions.const_get(const) } +
|
||||||
|
ExperimentPermissions.constants.map { |const| ExperimentPermissions.const_get(const) } +
|
||||||
|
MyModulePermissions.constants.map { |const| MyModulePermissions.const_get(const) },
|
||||||
predefined: true
|
predefined: true
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
@ -76,7 +78,8 @@ class UserRole < ApplicationRecord
|
||||||
ProjectPermissions::READ,
|
ProjectPermissions::READ,
|
||||||
ExperimentPermissions::READ,
|
ExperimentPermissions::READ,
|
||||||
MyModulePermissions::READ
|
MyModulePermissions::READ
|
||||||
]
|
],
|
||||||
|
predefined: true
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ module PermissionExtends
|
||||||
CREATE_COMMENTS
|
CREATE_COMMENTS
|
||||||
MANAGE_COMMENTS
|
MANAGE_COMMENTS
|
||||||
MANAGE_TAGS
|
MANAGE_TAGS
|
||||||
).each { |permission| const_set(permission, permission.underscore) }
|
).each { |permission| const_set(permission, "project_#{permission.underscore}") }
|
||||||
end
|
end
|
||||||
|
|
||||||
module ExperimentPermissions
|
module ExperimentPermissions
|
||||||
|
|
@ -24,7 +24,7 @@ module PermissionExtends
|
||||||
CLONE
|
CLONE
|
||||||
MOVE
|
MOVE
|
||||||
CREATE_TASKS
|
CREATE_TASKS
|
||||||
).each { |permission| const_set(permission, permission.underscore) }
|
).each { |permission| const_set(permission, "experiment_#{permission.underscore}") }
|
||||||
end
|
end
|
||||||
|
|
||||||
module MyModulePermissions
|
module MyModulePermissions
|
||||||
|
|
@ -41,7 +41,7 @@ module PermissionExtends
|
||||||
MANAGE_COMMENTS
|
MANAGE_COMMENTS
|
||||||
CREATE_REPOSITORY_SNAPSHOT
|
CREATE_REPOSITORY_SNAPSHOT
|
||||||
MANAGE_REPOSITORY_SNAPSHOT
|
MANAGE_REPOSITORY_SNAPSHOT
|
||||||
).each { |permission| const_set(permission, permission.underscore) }
|
).each { |permission| const_set(permission, "task_#{permission.underscore}") }
|
||||||
end
|
end
|
||||||
|
|
||||||
module RepositoryPermissions
|
module RepositoryPermissions
|
||||||
|
|
@ -59,6 +59,6 @@ module PermissionExtends
|
||||||
CREATE_COLUMN
|
CREATE_COLUMN
|
||||||
UPDATE_COLUMN
|
UPDATE_COLUMN
|
||||||
DELETE_COLUMN
|
DELETE_COLUMN
|
||||||
).each { |permission| const_set(permission, permission.underscore) }
|
).each { |permission| const_set(permission, "inventory_#{permission.underscore}") }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ class CreateUserRolesAndAssignments < ActiveRecord::Migration[6.1]
|
||||||
t.string :name
|
t.string :name
|
||||||
t.boolean :predefined, default: false
|
t.boolean :predefined, default: false
|
||||||
t.string :permissions, array: true, default: []
|
t.string :permissions, array: true, default: []
|
||||||
t.references :created_by, foreign_key: { to_table: :users }, null: false
|
t.references :created_by, foreign_key: { to_table: :users }, null: true
|
||||||
t.references :last_modified_by, foreign_key: { to_table: :users }, null: false
|
t.references :last_modified_by, foreign_key: { to_table: :users }, null: true
|
||||||
|
|
||||||
t.timestamps
|
t.timestamps
|
||||||
end
|
end
|
||||||
|
|
@ -16,7 +16,7 @@ class CreateUserRolesAndAssignments < ActiveRecord::Migration[6.1]
|
||||||
t.references :assignable, polymorphic: true, null: false
|
t.references :assignable, polymorphic: true, null: false
|
||||||
t.references :user, foreign_key: true, null: false
|
t.references :user, foreign_key: true, null: false
|
||||||
t.references :user_role, foreign_key: true, null: false
|
t.references :user_role, foreign_key: true, null: false
|
||||||
t.references :assigned_by, foreign_key: { to_table: :users }, null: false
|
t.references :assigned_by, foreign_key: { to_table: :users }, null: true
|
||||||
|
|
||||||
t.timestamps
|
t.timestamps
|
||||||
end
|
end
|
||||||
|
|
|
||||||
71
db/migrate/20210222123823_migrate_to_new_user_roles.rb
Normal file
71
db/migrate/20210222123823_migrate_to_new_user_roles.rb
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class MigrateToNewUserRoles < ActiveRecord::Migration[6.1]
|
||||||
|
def change
|
||||||
|
reversible do |dir|
|
||||||
|
dir.up do
|
||||||
|
owner_role = UserRole.owner_role
|
||||||
|
owner_role.save!
|
||||||
|
normal_user_role = UserRole.normal_user_role
|
||||||
|
normal_user_role.save!
|
||||||
|
technician_role = UserRole.technician_role
|
||||||
|
technician_role.save!
|
||||||
|
viewer_role = UserRole.viewer_role
|
||||||
|
viewer_role.save!
|
||||||
|
|
||||||
|
create_user_assignments(UserProject.owner, owner_role)
|
||||||
|
create_user_assignments(UserProject.normal_user, normal_user_role)
|
||||||
|
create_user_assignments(UserProject.technician, technician_role)
|
||||||
|
create_user_assignments(UserProject.viewer, viewer_role)
|
||||||
|
|
||||||
|
UserProject.delete_all
|
||||||
|
end
|
||||||
|
dir.down do
|
||||||
|
project_assignments = UserAssignment.joins(:user_role).where(assignable_type: 'Project')
|
||||||
|
create_user_project(
|
||||||
|
project_assignments.where(user_role: { name: I18n.t('user_roles.predefined.owner'), predefined: true }),
|
||||||
|
'owner'
|
||||||
|
)
|
||||||
|
create_user_project(
|
||||||
|
project_assignments.where(user_role: { name: I18n.t('user_roles.predefined.normal_user'), predefined: true }),
|
||||||
|
'normal_user'
|
||||||
|
)
|
||||||
|
create_user_project(
|
||||||
|
project_assignments.where(user_role: { name: I18n.t('user_roles.predefined.technician'), predefined: true }),
|
||||||
|
'technician'
|
||||||
|
)
|
||||||
|
create_user_project(
|
||||||
|
project_assignments.where(user_role: { name: I18n.t('user_roles.predefined.viewer'), predefined: true }),
|
||||||
|
'viewer'
|
||||||
|
)
|
||||||
|
|
||||||
|
UserAssignment.joins(:user_role).where(user_role: { predefined: true }).delete_all
|
||||||
|
UserRole.where(predefined: true).delete_all
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def create_user_assignments(user_projects, user_role)
|
||||||
|
user_projects.includes(:user, :project).find_in_batches(batch_size: 100) do |user_project_batch|
|
||||||
|
user_assignments = []
|
||||||
|
user_project_batch.each do |user_project|
|
||||||
|
user_assignments << UserAssignment.new(user: user_project.user,
|
||||||
|
assignable: user_project.project,
|
||||||
|
user_role: user_role)
|
||||||
|
end
|
||||||
|
UserAssignment.import(user_assignments)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_user_project(user_roles, role)
|
||||||
|
user_roles.includes(:user, :assignable).find_in_batches(batch_size: 100) do |user_role_batch|
|
||||||
|
user_projects = []
|
||||||
|
user_role_batch.each do |user_role|
|
||||||
|
user_projects << UserProject.new(user: user_role.user, project: user_role.assignable, role: role)
|
||||||
|
end
|
||||||
|
UserProject.import(user_projects)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -2440,7 +2440,7 @@ CREATE TABLE public.user_assignments (
|
||||||
assignable_id bigint NOT NULL,
|
assignable_id bigint NOT NULL,
|
||||||
user_id bigint NOT NULL,
|
user_id bigint NOT NULL,
|
||||||
user_role_id bigint NOT NULL,
|
user_role_id bigint NOT NULL,
|
||||||
assigned_by_id bigint NOT NULL,
|
assigned_by_id bigint,
|
||||||
created_at timestamp(6) without time zone NOT NULL,
|
created_at timestamp(6) without time zone NOT NULL,
|
||||||
updated_at timestamp(6) without time zone NOT NULL
|
updated_at timestamp(6) without time zone NOT NULL
|
||||||
);
|
);
|
||||||
|
|
@ -2611,8 +2611,8 @@ CREATE TABLE public.user_roles (
|
||||||
name character varying,
|
name character varying,
|
||||||
predefined boolean DEFAULT false,
|
predefined boolean DEFAULT false,
|
||||||
permissions character varying[] DEFAULT '{}'::character varying[],
|
permissions character varying[] DEFAULT '{}'::character varying[],
|
||||||
created_by_id bigint NOT NULL,
|
created_by_id bigint,
|
||||||
last_modified_by_id bigint NOT NULL,
|
last_modified_by_id bigint,
|
||||||
created_at timestamp(6) without time zone NOT NULL,
|
created_at timestamp(6) without time zone NOT NULL,
|
||||||
updated_at timestamp(6) without time zone NOT NULL
|
updated_at timestamp(6) without time zone NOT NULL
|
||||||
);
|
);
|
||||||
|
|
@ -7336,6 +7336,7 @@ INSERT INTO "schema_migrations" (version) VALUES
|
||||||
('20201209165626'),
|
('20201209165626'),
|
||||||
('20210128105457'),
|
('20210128105457'),
|
||||||
('20210128105458'),
|
('20210128105458'),
|
||||||
('20210202214508');
|
('20210202214508'),
|
||||||
|
('20210222123823');
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue