From c0c4fc05fdd21a11fb803f9853f1d6d3d802486e Mon Sep 17 00:00:00 2001
From: Arnaud Levy <contact@arnaudlevy.com>
Date: Tue, 17 Oct 2023 19:05:44 +0200
Subject: [PATCH] =?UTF-8?q?=C3=A0=20tester?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/controllers/server/websites_controller.rb |  4 ----
 app/models/communication/website.rb           | 18 ++++++++++++++++++
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/app/controllers/server/websites_controller.rb b/app/controllers/server/websites_controller.rb
index 8e1992e01..a5b335d14 100644
--- a/app/controllers/server/websites_controller.rb
+++ b/app/controllers/server/websites_controller.rb
@@ -27,10 +27,6 @@ class Server::WebsitesController < Server::ApplicationController
 
   def update
     @website.update(website_params)
-    @website.recursive_dependencies.each do |dependency|
-      next unless dependency.respond_to?(:university_id)
-      dependency.update_column :university_id, @website.university_id
-    end
     redirect_to server_website_path(@website), notice: t('admin.successfully_updated_html', model: @website.to_s)
   end
 
diff --git a/app/models/communication/website.rb b/app/models/communication/website.rb
index 0886d3dfc..f94b13404 100644
--- a/app/models/communication/website.rb
+++ b/app/models/communication/website.rb
@@ -81,6 +81,7 @@ class Communication::Website < ApplicationRecord
   validates :default_image, size: { less_than: 5.megabytes }
 
   before_validation :sanitize_fields
+  after_save :manage_university_change
 
   scope :ordered, -> { order(:name) }
   scope :in_production, -> { where(in_production: true) }
@@ -155,4 +156,21 @@ class Communication::Website < ApplicationRecord
     self.repository = Osuny::Sanitizer.sanitize(self.repository, 'string')
     self.url = Osuny::Sanitizer.sanitize(self.url, 'string')
   end
+
+  def manage_university_change
+    if saved_change_to_university_id?
+      recursive_dependencies.each do |dependency|
+        reconnect_dependency dependency
+      end
+    end
+  end
+  
+  def reconnect_dependency(dependency)
+    return unless dependency.respond_to?(:university_id)
+    # vérifier par les connexions qu'un objet indirect n'est pas utilisé dans un autre website
+    return if dependency.connections.where.not(website: self).any?
+    # il faut si l'objet est une person déconnecter le user éventuellement associé.
+    dependency.update_column :user_id, nil if dependency.is_a? University::Person
+    dependency.update_column :university_id, university_id
+  end
 end
-- 
GitLab