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/3] 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/3] 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) From b51a4e21423286f61b7f551fc170277756f4e192 Mon Sep 17 00:00:00 2001 From: Arnaud Levy Date: Wed, 15 Jul 2026 17:50:56 +0200 Subject: [PATCH 3/3] service --- app/jobs/destroy_university_job.rb | 76 +----------------------------- app/services/osuny/paranoid.rb | 75 +++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 74 deletions(-) create mode 100644 app/services/osuny/paranoid.rb diff --git a/app/jobs/destroy_university_job.rb b/app/jobs/destroy_university_job.rb index 40bbc7c38..a59b85395 100644 --- a/app/jobs/destroy_university_job.rb +++ b/app/jobs/destroy_university_job.rb @@ -1,84 +1,12 @@ 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 - ].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| + Osuny::Paranoid::OBJECTS_NOT_PARANOID.each do |klass| klass.where(university_id: university.id).destroy_all end @@ -88,7 +16,7 @@ def perform(university) user.destroy end - OBJECTS_PARANOID.each do |klass| + Osuny::Paranoid::OBJECTS_PARANOID.each do |klass| klass.with_deleted .where(university: university.id) .find_each(&:really_destroy!) diff --git a/app/services/osuny/paranoid.rb b/app/services/osuny/paranoid.rb new file mode 100644 index 000000000..1311baa31 --- /dev/null +++ b/app/services/osuny/paranoid.rb @@ -0,0 +1,75 @@ +class Osuny::Paranoid + + 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 + ].freeze + OBJECTS_PARANOID = [ + Administration::Location::Localization, + Administration::Location, + Administration::AcademicYear::Localization, + Administration::AcademicYear, + Administration::Cohort::Localization, + Administration::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 + +end \ No newline at end of file