Merge pull request #2611 from okriuchykhin/ok_SCI_4698

Fix handling of deleted repositories in reports [SCI-4698]
This commit is contained in:
Miha Mencin 2020-05-27 08:43:38 +02:00 committed by GitHub
commit 56b9a3ee2c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 37 deletions

View file

@ -123,9 +123,11 @@ module ReportsHelper
end end
def assign_repository_or_snapshot(my_module, element_id, snapshot, repository) def assign_repository_or_snapshot(my_module, element_id, snapshot, repository)
original_repository = Repository.find_by(id: element_id) if element_id if element_id
repository ||= snapshot repository = my_module.repositories.find_by(id: element_id)
repository || my_module.active_snapshot_or_live(original_repository) || original_repository repository ||= my_module.repository_snapshots.find_by(id: element_id)
end
repository || snapshot
end end
def step_status_label(step) def step_status_label(step)

View file

@ -53,6 +53,7 @@ class MyModule < ApplicationRecord
has_many :my_module_repository_rows, has_many :my_module_repository_rows,
inverse_of: :my_module, dependent: :destroy inverse_of: :my_module, dependent: :destroy
has_many :repository_rows, through: :my_module_repository_rows has_many :repository_rows, through: :my_module_repository_rows
has_many :repositories, -> { group(:id) }, through: :repository_rows
has_many :repository_snapshots, has_many :repository_snapshots,
dependent: :destroy, dependent: :destroy,
inverse_of: :my_module inverse_of: :my_module
@ -226,32 +227,15 @@ class MyModule < ApplicationRecord
(live_repositories + selected_snapshots).sort_by { |r| r.name.downcase } (live_repositories + selected_snapshots).sort_by { |r| r.name.downcase }
end end
def active_snapshot_or_live(rep_or_snap, exclude_snpashot_ids: []) def update_report_repository_references(repository)
return unless rep_or_snap ids = if repository.is_a?(Repository)
RepositorySnapshot.where(parent_id: repository.id).pluck(:id)
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)
else else
Repository.where(id: rep_or_snap.parent_id).pluck(:id) + Repository.where(id: repository.parent_id).pluck(:id) +
RepositorySnapshot.where(parent_id: rep_or_snap.parent_id).pluck(:id) RepositorySnapshot.where(parent_id: repository.parent_id).pluck(:id)
end end
report_elements.where(repository_id: ids).update(repository_id: rep_or_snap.id) report_elements.where(repository_id: ids).update(repository: repository)
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
end end
def unassigned_users def unassigned_users

View file

@ -15,6 +15,7 @@ class Repository < RepositoryBase
inverse_of: :original_repository inverse_of: :original_repository
before_save :sync_name_with_snapshots, if: :name_changed? before_save :sync_name_with_snapshots, if: :name_changed?
before_destroy :refresh_report_references_on_destroy, prepend: true
validates :name, validates :name,
presence: true, presence: true,
@ -215,4 +216,15 @@ class Repository < RepositoryBase
def sync_name_with_snapshots def sync_name_with_snapshots
repository_snapshots.update(name: name) repository_snapshots.update(name: name)
end 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 end

View file

@ -3,7 +3,7 @@
class RepositorySnapshot < RepositoryBase class RepositorySnapshot < RepositoryBase
enum status: { provisioning: 0, ready: 1, failed: 2 } enum status: { provisioning: 0, ready: 1, failed: 2 }
after_save :refresh_report_references, if: :saved_change_to_selected 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, belongs_to :original_repository, foreign_key: :parent_id,
class_name: 'Repository', class_name: 'Repository',
@ -44,19 +44,17 @@ class RepositorySnapshot < RepositoryBase
def refresh_report_references def refresh_report_references
if selected if selected
ids = Repository.where(id: parent_id).pluck(:id) + repositories = RepositoryBase.where(id: parent_id).or(RepositoryBase.where(parent_id: parent_id))
RepositorySnapshot.where(parent_id: parent_id).pluck(:id) my_module.report_elements.where(repository: repositories).update(repository: self)
elsif original_repository
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)
my_module.update_report_repository_references(original_repository) my_module.update_report_repository_references(original_repository)
end end
end end
def refresh_report_references_for_destroy def refresh_report_references_on_destroy
repository_or_snap = original_repository || self return my_module.update_report_repository_references(original_repository) if original_repository
default_view_candidate =
my_module.active_snapshot_or_live(repository_or_snap, exclude_snpashot_ids: [id]) repository_snapshot = my_module.repository_snapshots.where(parent_id: parent_id).order(created_at: :desc).first
my_module.update_report_repository_references(default_view_candidate) if default_view_candidate my_module.update_report_repository_references(repository_snapshot) if repository_snapshot
end end
end end