Patch #36416 ยป 0001-Cleanup-more-dependent-objects-on-project-delete.patch
app/models/project.rb | ||
---|---|---|
30 | 30 |
IDENTIFIER_MAX_LENGTH = 100 |
31 | 31 | |
32 | 32 |
# Specific overridden Activities |
33 |
has_many :time_entry_activities |
|
33 |
has_many :time_entry_activities, :dependent => :destroy
|
|
34 | 34 |
has_many :memberships, :class_name => 'Member', :inverse_of => :project |
35 | 35 |
# Memberships of active users only |
36 | 36 |
has_many :members, |
... | ... | |
43 | 43 |
belongs_to :default_version, :class_name => 'Version' |
44 | 44 |
belongs_to :default_assigned_to, :class_name => 'Principal' |
45 | 45 |
has_many :time_entries, :dependent => :destroy |
46 |
has_many :queries, :dependent => :delete_all
|
|
46 |
has_many :queries, :dependent => :destroy
|
|
47 | 47 |
has_many :documents, :dependent => :destroy |
48 | 48 |
has_many :news, lambda {includes(:author)}, :dependent => :destroy |
49 | 49 |
has_many :issue_categories, lambda {order(:name)}, :dependent => :delete_all |
db/migrate/20220125182055_delete_orphaned_activities_and_queries_roles.rb | ||
---|---|---|
1 |
class DeleteOrphanedActivitiesAndQueriesRoles < ActiveRecord::Migration[6.1] |
|
2 |
def self.up |
|
3 |
TimeEntryActivity.left_outer_joins(:project).where(projects:{id: nil}).where.not(project_id: nil).delete_all |
|
4 | ||
5 |
queries_roles = "#{Query.table_name_prefix}queries_roles#{Query.table_name_suffix}" |
|
6 |
queries = Query.table_name |
|
7 |
ActiveRecord::Base.connection.execute "DELETE #{queries_roles} FROM #{queries_roles} LEFT OUTER JOIN #{queries} ON #{queries_roles}.query_id = #{queries}.id WHERE #{queries}.id IS NULL" |
|
8 |
end |
|
9 | ||
10 |
def self.down |
|
11 |
# no-op |
|
12 |
end |
|
13 |
end |
test/unit/project_test.rb | ||
---|---|---|
233 | 233 |
# some boards |
234 | 234 |
assert @ecookbook.boards.any? |
235 | 235 | |
236 |
# generate some dependent objects |
|
237 |
overridden_activity = TimeEntryActivity.new({:name => "Project", :project => @ecookbook}) |
|
238 |
assert overridden_activity.save! |
|
239 | ||
240 |
query = IssueQuery.generate!(:project => @ecookbook, :visibility => Query::VISIBILITY_ROLES, :roles => Role.where(:id => [1, 3]).to_a) |
|
241 | ||
236 | 242 |
@ecookbook.destroy |
237 | 243 |
# make sure that the project non longer exists |
238 | 244 |
assert_raise(ActiveRecord::RecordNotFound) {Project.find(@ecookbook.id)} |
... | ... | |
240 | 246 |
assert_not Member.where(:project_id => @ecookbook.id).exists? |
241 | 247 |
assert_not Board.where(:project_id => @ecookbook.id).exists? |
242 | 248 |
assert_not Issue.where(:project_id => @ecookbook.id).exists? |
249 |
assert_not Enumeration.where(:project_id => @ecookbook.id).exists? |
|
250 | ||
251 |
assert_not Query.where(:project_id => @ecookbook.id).exists? |
|
252 |
assert_nil ActiveRecord::Base.connection.select_value("SELECT 1 FROM queries_roles WHERE query_id = #{query.id}") |
|
243 | 253 |
end |
244 | 254 | |
245 | 255 |
def test_destroy_should_destroy_subtasks |