mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-02-02 21:20:08 +08:00
Merge pull request #2611 from okriuchykhin/ok_SCI_4698
Fix handling of deleted repositories in reports [SCI-4698]
This commit is contained in:
commit
56b9a3ee2c
4 changed files with 33 additions and 37 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue