diff --git a/app/helpers/reports_helper.rb b/app/helpers/reports_helper.rb index b0c1dea55..f3badbef0 100644 --- a/app/helpers/reports_helper.rb +++ b/app/helpers/reports_helper.rb @@ -122,10 +122,14 @@ module ReportsHelper ) end - def assign_repository_or_snapshot(my_module, element_id, snapshot, repository) - original_repository = Repository.find_by(id: element_id) if element_id - repository ||= snapshot - repository || my_module.active_snapshot_or_live(original_repository) || original_repository + def assigned_repository_or_snapshot(my_module, element_id, snapshot, repository) + if element_id + repository = Repository.accessible_by_teams(my_module.experiment.project.team).find_by(id: element_id) + repository ||= RepositorySnapshot.joins(my_module: { experiment: :project }) + .where(my_module: { experiments: { project: my_module.experiment.project } }) + .find_by(id: element_id) + end + repository || snapshot end def step_status_label(step) diff --git a/app/models/my_module.rb b/app/models/my_module.rb index ec133c4af..d6410f663 100644 --- a/app/models/my_module.rb +++ b/app/models/my_module.rb @@ -226,32 +226,15 @@ class MyModule < ApplicationRecord (live_repositories + selected_snapshots).sort_by { |r| r.name.downcase } end - def active_snapshot_or_live(rep_or_snap, exclude_snpashot_ids: []) - return unless rep_or_snap - - parent_id = rep_or_snap.is_a?(Repository) ? rep_or_snap.id : rep_or_snap.parent_id - - selected_snapshot_for_repo(parent_id, exclude_snpashot_ids: exclude_snpashot_ids) || - assigned_repositories&.where(id: parent_id)&.first || - repository_snapshots - .where(parent_id: parent_id) - .where.not(id: exclude_snpashot_ids) - .order(updated_at: :desc).first - end - - def update_report_repository_references(rep_or_snap) - ids = if rep_or_snap.is_a?(Repository) - RepositorySnapshot.where(parent_id: rep_or_snap.id).pluck(:id) + def update_report_repository_references(repository) + ids = if repository.is_a?(Repository) + RepositorySnapshot.where(parent_id: repository.id).pluck(:id) else - Repository.where(id: rep_or_snap.parent_id).pluck(:id) + - RepositorySnapshot.where(parent_id: rep_or_snap.parent_id).pluck(:id) + Repository.where(id: repository.parent_id).pluck(:id) + + RepositorySnapshot.where(parent_id: repository.parent_id).pluck(:id) end - report_elements.where(repository_id: ids).update(repository_id: rep_or_snap.id) - end - - def selected_snapshot_for_repo(repository_id, exclude_snpashot_ids: []) - repository_snapshots.where(parent_id: repository_id).where.not(id: exclude_snpashot_ids).where(selected: true).first + report_elements.where(repository_id: ids).update(repository: repository) end def unassigned_users diff --git a/app/models/repository.rb b/app/models/repository.rb index baf66c593..c9cf45c85 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -15,6 +15,7 @@ class Repository < RepositoryBase inverse_of: :original_repository before_save :sync_name_with_snapshots, if: :name_changed? + before_destroy :refresh_report_references_on_destroy, prepend: true validates :name, presence: true, @@ -216,4 +217,15 @@ class Repository < RepositoryBase def sync_name_with_snapshots repository_snapshots.update(name: name) end + + def refresh_report_references_on_destroy + report_elements.find_each do |report_element| + repository_snapshot = report_element.my_module + .repository_snapshots + .where(original_repository: self) + .order(:selected, created_at: :desc) + .first + report_element.update(repository: repository_snapshot) if repository_snapshot + end + end end diff --git a/app/models/repository_snapshot.rb b/app/models/repository_snapshot.rb index d7383a557..df45e7eac 100644 --- a/app/models/repository_snapshot.rb +++ b/app/models/repository_snapshot.rb @@ -3,7 +3,7 @@ class RepositorySnapshot < RepositoryBase enum status: { provisioning: 0, ready: 1, failed: 2 } after_save :refresh_report_references, if: :saved_change_to_selected - before_destroy :refresh_report_references_for_destroy, prepend: true + before_destroy :refresh_report_references_on_destroy, prepend: true belongs_to :original_repository, foreign_key: :parent_id, class_name: 'Repository', @@ -44,19 +44,17 @@ class RepositorySnapshot < RepositoryBase def refresh_report_references if selected - ids = Repository.where(id: parent_id).pluck(:id) + - RepositorySnapshot.where(parent_id: parent_id).pluck(:id) - - ReportElement.where(my_module: my_module).where(repository_id: ids).update(repository_id: id) - elsif original_repository && !my_module.selected_snapshot_for_repo(original_repository.id) + repositories = RepositoryBase.where(id: parent_id).or(RepositoryBase.where(parent_id: parent_id)) + my_module.report_elements.where(repository: repositories).update(repository: self) + elsif original_repository my_module.update_report_repository_references(original_repository) end end - def refresh_report_references_for_destroy - repository_or_snap = original_repository || self - default_view_candidate = - my_module.active_snapshot_or_live(repository_or_snap, exclude_snpashot_ids: [id]) - my_module.update_report_repository_references(default_view_candidate) if default_view_candidate + def refresh_report_references_on_destroy + return my_module.update_report_repository_references(original_repository) if original_repository + + repository_snapshot = my_module.repository_snapshots.where(parent_id: parent_id).order(created_at: :desc).first + my_module.update_report_repository_references(repository_snapshot) if repository_snapshot end end diff --git a/app/views/reports/elements/_my_module_repository_element.html.erb b/app/views/reports/elements/_my_module_repository_element.html.erb index 0ae35153f..09b14e5a6 100644 --- a/app/views/reports/elements/_my_module_repository_element.html.erb +++ b/app/views/reports/elements/_my_module_repository_element.html.erb @@ -1,58 +1,55 @@ -<% if my_module.blank? and @my_module.present? then my_module = @my_module end %> +<% my_module ||= @my_module %> <% element_id ||= nil %> <% repository ||= nil %> <% repository_snapshot ||= nil %> -<% repository = assign_repository_or_snapshot(my_module, element_id, repository, repository_snapshot) %> -<% if order.blank? and @order.present? then order = @order end %> +<% repository = assigned_repository_or_snapshot(my_module, element_id, repository, repository_snapshot) %> +<% order ||= @order %> <% timestamp = Time.current + 1.year - 1.days %> -<% if repository.present? %> - <% rows_json = my_module.repository_json_hot(repository, order) %> -