From b62e74fbe3380dba0648fcc33bb8d083b8636ece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= Date: Mon, 15 Jun 2026 15:37:28 +0200 Subject: [PATCH 1/2] WIP DestroyUniversityJob --- app/jobs/destroy_university_job.rb | 93 ++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 app/jobs/destroy_university_job.rb diff --git a/app/jobs/destroy_university_job.rb b/app/jobs/destroy_university_job.rb new file mode 100644 index 000000000..7da79b6a2 --- /dev/null +++ b/app/jobs/destroy_university_job.rb @@ -0,0 +1,93 @@ +class DestroyUniversityJob < ApplicationJob + queue_as :whales + + OBJECTS_NOT_PARANOID = [ + Search, + Communication::Media::Context, + Communication::Media::Localization, + Communication::Media, + Communication::Media::Category::Localization, + Communication::Media::Category, + Communication::Media::Collection::Localization, + Communication::Media::Collection, + Communication::Extranet::Document::Localization, + Communication::Extranet::Document, + Communication::Extranet::Document::Category::Localization, + Communication::Extranet::Document::Category, + Communication::Extranet::Document::Kind::Localization, + Communication::Extranet::Document::Kind, + Communication::Extranet::Post::Category::Localization, + Communication::Extranet::Post::Category, + Communication::Extranet::Post::Localization, + Communication::Extranet::Post, + Communication::Extranet::Connection, + Communication::Extranet::Localization, + Communication::Extranet, + Education::Program::Category::Localization, + Education::Program::Category, + University::Organization::Category::Localization, + University::Organization::Category, + University::Person::Category::Localization, + University::Person::Category, + University::App, + EmergencyMessage, + Import, + User + ].freeze + OBJECTS_PARANOID = [ + Administration::Location::Localization, + Administration::Location, + Education::AcademicYear::Localization, + Education::AcademicYear, + Education::Cohort::Localization, + Education::Cohort, + Education::Diploma::Localization, + Education::Diploma, + Education::Program::Localization, + Education::Program, + Education::School::Localization, + Education::School, + Research::Journal::Paper::Kind::Localization, + Research::Journal::Paper::Kind, + Research::Journal::Volume::Localization, + Research::Journal::Volume, + Research::Journal::Paper::Localization, + Research::Journal::Paper, + Research::Journal::Localization, + Research::Journal, + Research::Laboratory::Axis::Localization, + Research::Laboratory::Axis, + Research::Thesis::Localization, + Research::Thesis, + Research::Laboratory::Localization, + Research::Laboratory, + University::Organization::Localization, + University::Organization, + University::Person::Experience::Localization, + University::Person::Experience, + University::Person::Involvement::Localization, + University::Person::Involvement, + University::Role::Localization, + University::Role, + University::Person::Localization, + University::Person, + Communication::Block # We finish by blocks to avoid foreign key issues + ].freeze + + def perform(university) + # Destroy all the websites of the university + university.websites.each do |website| + Communication::Website::DestroyWebsiteJob.perform_now(website) + end + OBJECTS_NOT_PARANOID.each do |klass| + klass.where(university_id: university.id).destroy_all + end + OBJECTS_PARANOID.each do |klass| + klass.with_deleted + .where(university: university.id) + .find_each(&:really_destroy!) + end + university.destroy + end + +end From d77b0971a2cf053c03fe1ec5c78e61793e0e06e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= Date: Mon, 15 Jun 2026 16:01:01 +0200 Subject: [PATCH 2/2] user custom logic --- app/jobs/destroy_university_job.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/jobs/destroy_university_job.rb b/app/jobs/destroy_university_job.rb index 7da79b6a2..40bbc7c38 100644 --- a/app/jobs/destroy_university_job.rb +++ b/app/jobs/destroy_university_job.rb @@ -31,8 +31,7 @@ class DestroyUniversityJob < ApplicationJob University::Person::Category, University::App, EmergencyMessage, - Import, - User + Import ].freeze OBJECTS_PARANOID = [ Administration::Location::Localization, @@ -82,6 +81,13 @@ def perform(university) OBJECTS_NOT_PARANOID.each do |klass| klass.where(university_id: university.id).destroy_all end + + # Custom logic for users as we need to prevent server admin from being destroyed of all universities + User.where(university_id: university.id).find_each do |user| + user.skip_server_admin_sync = true if user.server_admin? + user.destroy + end + OBJECTS_PARANOID.each do |klass| klass.with_deleted .where(university: university.id)