Add visibility and default public user role fields to protocols [SCI-7819] (#4963)

This commit is contained in:
Alex Kriuchykhin 2023-02-13 16:18:26 +01:00 committed by GitHub
parent 724fe3ebd4
commit b71f360261
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 47 additions and 13 deletions

View file

@ -46,9 +46,9 @@ module UserAssignments
end end
def assign_users_to_protocol(protocol) def assign_users_to_protocol(protocol)
return unless protocol.in_repository_public? return unless protocol.visible?
protocol.add_team_users_as_viewers!(@assigned_by) protocol.create_public_user_assignments!(@assigned_by)
end end
def assign_users_to_report(report) def assign_users_to_report(report)

View file

@ -18,6 +18,7 @@ class Protocol < ApplicationRecord
after_save :update_linked_children after_save :update_linked_children
skip_callback :create, :after, :create_users_assignments, if: -> { in_module? } skip_callback :create, :after, :create_users_assignments, if: -> { in_module? }
enum visibility: { hidden: 0, visible: 1 }
enum protocol_type: { enum protocol_type: {
unlinked: 0, unlinked: 0,
linked: 1, linked: 1,
@ -104,6 +105,9 @@ class Protocol < ApplicationRecord
inverse_of: :protocols, inverse_of: :protocols,
optional: true optional: true
belongs_to :team, inverse_of: :protocols belongs_to :team, inverse_of: :protocols
belongs_to :default_public_user_role,
class_name: 'UserRole',
optional: true
belongs_to :previous_version, belongs_to :previous_version,
class_name: 'Protocol', class_name: 'Protocol',
inverse_of: :next_version, inverse_of: :next_version,
@ -653,11 +657,13 @@ class Protocol < ApplicationRecord
steps.map(&:can_destroy?).all? steps.map(&:can_destroy?).all?
end end
def add_team_users_as_viewers!(assigned_by) def create_public_user_assignments!(assigned_by)
viewer_role = UserRole.find_predefined_viewer_role public_role = default_public_user_role || UserRole.find_predefined_viewer_role
team.user_assignments.where.not(user: assigned_by).find_each do |user_assignment| team.user_assignments.where.not(user: assigned_by).find_each do |team_user_assignment|
new_user_assignment = UserAssignment.find_or_initialize_by(user: user_assignment.user, assignable: self) new_user_assignment = user_assignments.find_or_initialize_by(user: team_user_assignment.user)
new_user_assignment.user_role = viewer_role next if new_user_assignment.manually_assigned?
new_user_assignment.user_role = public_role
new_user_assignment.assigned_by = assigned_by new_user_assignment.assigned_by = assigned_by
new_user_assignment.assigned = :automatically new_user_assignment.assigned = :automatically
new_user_assignment.save! new_user_assignment.save!
@ -667,11 +673,10 @@ class Protocol < ApplicationRecord
private private
def update_user_assignments def update_user_assignments
case protocol_type case visibility
when 'in_repository_public' when 'visible'
assigned_by = protocol_type_was == 'in_repository_archived' && restored_by || added_by create_public_user_assignments!(added_by)
add_team_users_as_viewers!(assigned_by) when 'hidden'
when 'in_repository_private', 'in_repository_archived'
automatic_user_assignments.where.not(user: added_by).destroy_all automatic_user_assignments.where.not(user: added_by).destroy_all
end end
end end

View file

@ -3,20 +3,23 @@
class AddProtocolVersioning < ActiveRecord::Migration[6.1] class AddProtocolVersioning < ActiveRecord::Migration[6.1]
def up def up
change_table :protocols, bulk: true do |t| change_table :protocols, bulk: true do |t|
t.integer :visibility, index: true, default: 0
t.boolean :archived, default: false, null: false, index: true t.boolean :archived, default: false, null: false, index: true
t.integer :version_number, default: 1 t.integer :version_number, default: 1
t.string :version_comment t.string :version_comment
t.references :default_public_user_role, foreign_key: { to_table: :user_roles }
t.references :previous_version, index: true, foreign_key: { to_table: :protocols } t.references :previous_version, index: true, foreign_key: { to_table: :protocols }
t.references :last_modified_by, index: true, foreign_key: { to_table: :users } t.references :last_modified_by, index: true, foreign_key: { to_table: :users }
t.references :published_by, index: true, foreign_key: { to_table: :users } t.references :published_by, index: true, foreign_key: { to_table: :users }
end end
execute( execute(
'UPDATE "protocols" SET "published_on" = "created_at", "published_by_id" = "added_by_id" ' \ 'UPDATE "protocols" SET "published_on" = "created_at", "published_by_id" = "added_by_id" ' \
'WHERE "protocols"."protocol_type" IN (2, 4) ' \ 'WHERE "protocols"."protocol_type" IN (2, 4) ' \
'AND "protocols"."published_on" IS NULL;' 'AND "protocols"."published_on" IS NULL;'
) )
execute( execute(
'UPDATE "protocols" SET "published_by_id" = "added_by_id" ' \ 'UPDATE "protocols" SET "published_by_id" = "added_by_id", "visibility" = 1 ' \
'WHERE "protocols"."protocol_type" = 3;' 'WHERE "protocols"."protocol_type" = 3;'
) )
execute( execute(
@ -36,9 +39,11 @@ class AddProtocolVersioning < ActiveRecord::Migration[6.1]
t.remove_references :published_by t.remove_references :published_by
t.remove_references :last_modified_by t.remove_references :last_modified_by
t.remove_references :previous_version t.remove_references :previous_version
t.remove_references :default_public_user_role
t.remove :version_comment t.remove :version_comment
t.remove :version_number t.remove :version_number
t.remove :archived t.remove :archived
t.remove :visibility
end end
end end
end end

View file

@ -1372,9 +1372,11 @@ CREATE TABLE public.protocols (
updated_at timestamp without time zone NOT NULL, updated_at timestamp without time zone NOT NULL,
published_on timestamp without time zone, published_on timestamp without time zone,
nr_of_linked_children integer DEFAULT 0, nr_of_linked_children integer DEFAULT 0,
visibility integer DEFAULT 0,
archived boolean DEFAULT false NOT NULL, archived boolean DEFAULT false NOT NULL,
version_number integer DEFAULT 1, version_number integer DEFAULT 1,
version_comment character varying, version_comment character varying,
default_public_user_role_id bigint,
previous_version_id bigint, previous_version_id bigint,
last_modified_by_id bigint, last_modified_by_id bigint,
published_by_id bigint published_by_id bigint
@ -5585,6 +5587,13 @@ CREATE INDEX index_protocols_on_archived_by_id ON public.protocols USING btree (
CREATE INDEX index_protocols_on_authors ON public.protocols USING gin (public.trim_html_tags(authors) public.gin_trgm_ops); CREATE INDEX index_protocols_on_authors ON public.protocols USING gin (public.trim_html_tags(authors) public.gin_trgm_ops);
--
-- Name: index_protocols_on_default_public_user_role_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_protocols_on_default_public_user_role_id ON public.protocols USING btree (default_public_user_role_id);
-- --
-- Name: index_protocols_on_description; Type: INDEX; Schema: public; Owner: - -- Name: index_protocols_on_description; Type: INDEX; Schema: public; Owner: -
-- --
@ -5655,6 +5664,13 @@ CREATE INDEX index_protocols_on_restored_by_id ON public.protocols USING btree (
CREATE INDEX index_protocols_on_team_id ON public.protocols USING btree (team_id); CREATE INDEX index_protocols_on_team_id ON public.protocols USING btree (team_id);
--
-- Name: index_protocols_on_visibility; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_protocols_on_visibility ON public.protocols USING btree (visibility);
-- --
-- Name: index_report_elements_on_asset_id; Type: INDEX; Schema: public; Owner: - -- Name: index_report_elements_on_asset_id; Type: INDEX; Schema: public; Owner: -
-- --
@ -7298,6 +7314,14 @@ ALTER TABLE ONLY public.repository_stock_unit_items
ADD CONSTRAINT fk_rails_4c20ff4c1f FOREIGN KEY (last_modified_by_id) REFERENCES public.users(id); ADD CONSTRAINT fk_rails_4c20ff4c1f FOREIGN KEY (last_modified_by_id) REFERENCES public.users(id);
--
-- Name: protocols fk_rails_4c4d4f815a; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.protocols
ADD CONSTRAINT fk_rails_4c4d4f815a FOREIGN KEY (default_public_user_role_id) REFERENCES public.user_roles(id);
-- --
-- Name: repository_status_values fk_rails_4cf67f9f1e; Type: FK CONSTRAINT; Schema: public; Owner: - -- Name: repository_status_values fk_rails_4cf67f9f1e; Type: FK CONSTRAINT; Schema: public; Owner: -
-- --