diff --git a/app/errors/communication/website/lock_error.rb b/app/errors/communication/website/lock_error.rb
new file mode 100644
index 0000000000000000000000000000000000000000..91348df9fd11705006611c45f3eef60c52161875
--- /dev/null
+++ b/app/errors/communication/website/lock_error.rb
@@ -0,0 +1,2 @@
+class Communication::Website::LockError < StandardError
+end
\ No newline at end of file
diff --git a/app/jobs/communication/website/base_job.rb b/app/jobs/communication/website/base_job.rb
index a697b7a609abca005042c479eb9de26cae2499e5..23eaa91794fdd360165fe129e49d86e2cf869357 100644
--- a/app/jobs/communication/website/base_job.rb
+++ b/app/jobs/communication/website/base_job.rb
@@ -9,15 +9,27 @@ class Communication::Website::BaseJob < ApplicationJob
 
   # Retry the job after 1 minute if it is interrupted, to prevent queue from being blocked
   retry_on GoodJob::InterruptError, wait: 1.minute, attempts: Float::INFINITY
+  # Retry the job after 30 seconds when the website was locked.
+  retry_on Communication::Website::LockError, wait: 30.seconds, attempts: Float::INFINITY
 
-  attr_accessor :website_id
+  attr_accessor :website_id, :options
 
-  def perform(website_id)
+  def perform(website_id, options = {})
     @website_id = website_id
+    @options = options
     # Website might be deleted in between
     return unless website.present?
-    # TODO manage lock / unlock
-    execute
+    # Raise if website is locked to retry later
+    raise Communication::Website::LockError.new("Interrupted because of website lock.") if website.locked_for_background_jobs?
+    # We lock the website to prevent race conditions
+    website.lock_for_background_jobs!
+    begin
+      # We execute the job
+      execute
+    ensure
+      # We make sure to unlock the website to allow the other jobs to run
+      website.unlock_for_background_jobs!
+    end
   end
 
   protected
diff --git a/app/jobs/communication/website/direct_object/sync_with_git_job.rb b/app/jobs/communication/website/direct_object/sync_with_git_job.rb
index b8fb27a952fa44b0da2ef2a14ad95d5666fbcab6..c98e11e88c457039a1a3dbabfec79bb5251f7a7d 100644
--- a/app/jobs/communication/website/direct_object/sync_with_git_job.rb
+++ b/app/jobs/communication/website/direct_object/sync_with_git_job.rb
@@ -1,5 +1,6 @@
 class Communication::Website::DirectObject::SyncWithGitJob < Communication::Website::BaseJob
-  def perform(direct_object)
-    direct_object.sync_with_git_safely
+  def execute
+    direct_object = options.fetch(:direct_object)
+    direct_object.sync_with_git_safely if direct_object.present?
   end
 end
\ No newline at end of file
diff --git a/app/jobs/communication/website/indirect_object/sync_with_git_job.rb b/app/jobs/communication/website/indirect_object/sync_with_git_job.rb
index fb2ac66800dc7658e112ebc79f957959e4516072..24e7ac45829c57051e0955ac9a1490f9bbf2d69d 100644
--- a/app/jobs/communication/website/indirect_object/sync_with_git_job.rb
+++ b/app/jobs/communication/website/indirect_object/sync_with_git_job.rb
@@ -1,5 +1,6 @@
 class Communication::Website::IndirectObject::SyncWithGitJob < Communication::Website::BaseJob
-  def perform(website, indirect_object)
-    website.sync_indirect_object_with_git(indirect_object)
+  def execute
+    indirect_object = options.fetch(:indirect_object)
+    website.sync_indirect_object_with_git(indirect_object) if indirect_object.present?
   end
 end
\ No newline at end of file
diff --git a/app/models/concerns/as_indirect_object.rb b/app/models/concerns/as_indirect_object.rb
index 026c01dd8b1dc0448395f80f51fc74035424e52c..0e6911cfde7ee454594ce9ae2bfe8a644fe4072c 100644
--- a/app/models/concerns/as_indirect_object.rb
+++ b/app/models/concerns/as_indirect_object.rb
@@ -74,7 +74,7 @@ module AsIndirectObject
       direct_source.website.connect self, direct_source
     end
     websites.each do |website|
-      Communication::Website::IndirectObject::SyncWithGitJob.perform_later(website, self)
+      Communication::Website::IndirectObject::SyncWithGitJob.perform_later(website.id, indirect_object: self)
     end
   end
 
diff --git a/app/models/concerns/with_git.rb b/app/models/concerns/with_git.rb
index f4c0e347d03588ffdfb3c343c381e52fd19acd44..fb0e90c9c56a8dfe14fb8298559de483b9dc464c 100644
--- a/app/models/concerns/with_git.rb
+++ b/app/models/concerns/with_git.rb
@@ -24,7 +24,7 @@ module WithGit
   end
 
   def sync_with_git
-    Communication::Website::DirectObject::SyncWithGitJob.perform_later(self)
+    Communication::Website::DirectObject::SyncWithGitJob.perform_later(website.id, direct_object: self)
   end
 
   def sync_with_git_safely
diff --git a/app/models/research/hal.rb b/app/models/research/hal.rb
index 704947270ffd7a6bc97ec1468863397dbd834762..c770a40def45b92ba2eb6b13ef55ea3eb0f1b63d 100644
--- a/app/models/research/hal.rb
+++ b/app/models/research/hal.rb
@@ -27,15 +27,12 @@ module Research::Hal
 
   def self.clear_queue!
     ids = []
-    GoodJob::Job.find_each do |job|
-      job_class = job.job_class
+    indirect_object_sync_job_class = "Communication::Website::IndirectObject::SyncWithGitJob"
+    GoodJob::Job.queued.where(job_class: indirect_object_sync_job_class).find_each do |job|
       job_arguments = job.serialized_params["arguments"]
-      indirect_object_gid = job_arguments.last["_aj_globalid"].to_s
-
-      if job_class == "Communication::Website::IndirectObject::SyncWithGitJob" &&
-         indirect_object_gid.include?("Research::Publication")
-        ids << job.id
-      end
+      job_options_argument = job_arguments.last
+      indirect_object_gid = job_options_argument.dig("indirect_object", "_aj_globalid").to_s
+      ids << job.id if indirect_object_gid.include?("Research::Publication")
     end
     GoodJob::Job.where(id: ids).destroy_all
   end
diff --git a/db/schema.rb b/db/schema.rb
index cfbd6e2f3b2335161585516f87a33893c2e2dec8..b62ae4ede5d25e3f24876a02b7018f92f2ea7ba2 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,9 +10,9 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2022_10_03_144016) do
-
+ActiveRecord::Schema[7.1].define(version: 2024_05_18_073335) do
   # These are extensions that must be enabled in order to support this database
+  enable_extension "pg_trgm"
   enable_extension "pgcrypto"
   enable_extension "plpgsql"
   enable_extension "unaccent"
@@ -22,8 +22,8 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.text "body"
     t.string "record_type", null: false
     t.uuid "record_id", null: false
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true
   end
 
@@ -32,7 +32,7 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.string "record_type", null: false
     t.uuid "record_id", null: false
     t.uuid "blob_id", null: false
-    t.datetime "created_at", null: false
+    t.datetime "created_at", precision: nil, null: false
     t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
     t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
   end
@@ -44,8 +44,8 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.text "metadata"
     t.string "service_name", null: false
     t.bigint "byte_size", null: false
-    t.string "checksum", null: false
-    t.datetime "created_at", null: false
+    t.string "checksum"
+    t.datetime "created_at", precision: nil, null: false
     t.uuid "university_id"
     t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
     t.index ["university_id"], name: "index_active_storage_blobs_on_university_id"
@@ -57,12 +57,52 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
   end
 
+  create_table "administration_locations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "university_id", null: false
+    t.string "name"
+    t.text "summary"
+    t.string "address"
+    t.string "zipcode"
+    t.string "city"
+    t.string "country"
+    t.float "latitude"
+    t.float "longitude"
+    t.string "phone"
+    t.string "url"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "slug"
+    t.string "address_additional"
+    t.string "address_name"
+    t.text "featured_image_alt"
+    t.text "featured_image_credit"
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.index ["language_id"], name: "index_administration_locations_on_language_id"
+    t.index ["original_id"], name: "index_administration_locations_on_original_id"
+    t.index ["university_id"], name: "index_administration_locations_on_university_id"
+  end
+
+  create_table "administration_locations_education_programs", id: false, force: :cascade do |t|
+    t.uuid "education_program_id", null: false
+    t.uuid "administration_location_id", null: false
+    t.index ["administration_location_id", "education_program_id"], name: "index_program_location"
+    t.index ["education_program_id", "administration_location_id"], name: "index_location_program"
+  end
+
+  create_table "administration_locations_education_schools", id: false, force: :cascade do |t|
+    t.uuid "education_school_id", null: false
+    t.uuid "administration_location_id", null: false
+    t.index ["administration_location_id", "education_school_id"], name: "index_school_location"
+    t.index ["education_school_id", "administration_location_id"], name: "index_location_school"
+  end
+
   create_table "administration_qualiopi_criterions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.integer "number"
     t.text "name"
     t.text "description"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
   end
 
   create_table "administration_qualiopi_indicators", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
@@ -73,12 +113,29 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.text "proof"
     t.text "requirement"
     t.text "non_conformity"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.text "glossary"
     t.index ["criterion_id"], name: "index_administration_qualiopi_indicators_on_criterion_id"
   end
 
+  create_table "communication_block_headings", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "university_id", null: false
+    t.string "about_type", null: false
+    t.uuid "about_id", null: false
+    t.string "title"
+    t.integer "level", default: 2
+    t.uuid "parent_id"
+    t.integer "position"
+    t.string "slug"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["about_type", "about_id"], name: "index_communication_block_headings_on_about"
+    t.index ["parent_id"], name: "index_communication_block_headings_on_parent_id"
+    t.index ["slug"], name: "index_communication_block_headings_on_slug"
+    t.index ["university_id"], name: "index_communication_block_headings_on_university_id"
+  end
+
   create_table "communication_blocks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "about_type"
@@ -86,47 +143,198 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.integer "template_kind", default: 0, null: false
     t.jsonb "data"
     t.integer "position", default: 0, null: false
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.string "title"
     t.boolean "published", default: true
+    t.uuid "heading_id"
+    t.uuid "communication_website_id"
+    t.string "migration_identifier"
     t.index ["about_type", "about_id"], name: "index_communication_website_blocks_on_about"
+    t.index ["communication_website_id"], name: "index_communication_blocks_on_communication_website_id"
+    t.index ["heading_id"], name: "index_communication_blocks_on_heading_id"
     t.index ["university_id"], name: "index_communication_blocks_on_university_id"
   end
 
+  create_table "communication_extranet_connections", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "university_id", null: false
+    t.uuid "extranet_id", null: false
+    t.string "about_type"
+    t.uuid "about_id"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["about_type", "about_id"], name: "index_communication_extranet_connections_on_object"
+    t.index ["extranet_id"], name: "index_communication_extranet_connections_on_extranet_id"
+    t.index ["university_id"], name: "index_communication_extranet_connections_on_university_id"
+  end
+
+  create_table "communication_extranet_document_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "extranet_id", null: false
+    t.uuid "university_id", null: false
+    t.string "name"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "slug"
+    t.index ["extranet_id"], name: "index_communication_extranet_document_categories_on_extranet_id"
+    t.index ["slug"], name: "index_communication_extranet_document_categories_on_slug"
+    t.index ["university_id"], name: "extranet_document_categories_universities"
+  end
+
+  create_table "communication_extranet_document_kinds", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "extranet_id", null: false
+    t.uuid "university_id", null: false
+    t.string "name"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "slug"
+    t.index ["extranet_id"], name: "index_communication_extranet_document_kinds_on_extranet_id"
+    t.index ["slug"], name: "index_communication_extranet_document_kinds_on_slug"
+    t.index ["university_id"], name: "extranet_document_kinds_universities"
+  end
+
+  create_table "communication_extranet_documents", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "name"
+    t.uuid "university_id", null: false
+    t.uuid "extranet_id", null: false
+    t.boolean "published"
+    t.datetime "published_at"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.uuid "kind_id"
+    t.uuid "category_id"
+    t.index ["category_id"], name: "extranet_document_categories"
+    t.index ["extranet_id"], name: "index_communication_extranet_documents_on_extranet_id"
+    t.index ["kind_id"], name: "index_extranet_document_kinds"
+    t.index ["university_id"], name: "index_communication_extranet_documents_on_university_id"
+  end
+
+  create_table "communication_extranet_post_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "name"
+    t.string "slug"
+    t.uuid "extranet_id", null: false
+    t.uuid "university_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["extranet_id"], name: "index_communication_extranet_post_categories_on_extranet_id"
+    t.index ["slug"], name: "index_communication_extranet_post_categories_on_slug"
+    t.index ["university_id"], name: "index_communication_extranet_post_categories_on_university_id"
+  end
+
+  create_table "communication_extranet_posts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "title"
+    t.boolean "published", default: false
+    t.datetime "published_at"
+    t.uuid "author_id"
+    t.uuid "extranet_id", null: false
+    t.uuid "university_id", null: false
+    t.string "featured_image_alt"
+    t.text "featured_image_credit"
+    t.string "slug"
+    t.text "summary"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.uuid "category_id"
+    t.boolean "pinned", default: false
+    t.index ["author_id"], name: "index_communication_extranet_posts_on_author_id"
+    t.index ["category_id"], name: "index_communication_extranet_posts_on_category_id"
+    t.index ["extranet_id"], name: "index_communication_extranet_posts_on_extranet_id"
+    t.index ["slug"], name: "index_communication_extranet_posts_on_slug"
+    t.index ["university_id"], name: "index_communication_extranet_posts_on_university_id"
+  end
+
   create_table "communication_extranets", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "name"
     t.uuid "university_id", null: false
-    t.string "domain"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.string "host"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.string "about_type"
     t.uuid "about_id"
+    t.string "registration_contact"
+    t.boolean "has_sso", default: false
+    t.text "sso_cert"
+    t.jsonb "sso_mapping"
+    t.string "sso_name_identifier_format"
+    t.integer "sso_provider", default: 0
+    t.string "sso_target_url"
+    t.text "terms"
+    t.text "privacy_policy"
+    t.text "cookies_policy"
+    t.string "color"
+    t.string "sso_button_label"
+    t.boolean "feature_alumni", default: false
+    t.boolean "feature_contacts", default: false
+    t.boolean "feature_library", default: false
+    t.boolean "feature_posts", default: false
+    t.boolean "feature_jobs", default: false
+    t.text "home_sentence"
+    t.text "sass"
+    t.text "css"
     t.index ["about_type", "about_id"], name: "index_communication_extranets_on_about"
     t.index ["university_id"], name: "index_communication_extranets_on_university_id"
   end
 
-  create_table "communication_website_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
-    t.uuid "university_id", null: false
-    t.uuid "communication_website_id", null: false
+  create_table "communication_website_agenda_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "name"
-    t.text "description"
+    t.string "path"
     t.integer "position"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.string "featured_image_alt"
+    t.text "featured_image_credit"
+    t.text "meta_description"
     t.string "slug"
+    t.text "summary"
+    t.uuid "communication_website_id", null: false
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.uuid "university_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.uuid "parent_id"
-    t.text "github_path"
-    t.uuid "program_id"
     t.boolean "is_programs_root", default: false
-    t.string "path"
-    t.string "featured_image_alt"
-    t.text "text"
+    t.uuid "program_id"
+    t.index ["communication_website_id"], name: "idx_communication_website_agenda_cats_on_website_id"
+    t.index ["language_id"], name: "index_communication_website_agenda_categories_on_language_id"
+    t.index ["original_id"], name: "index_communication_website_agenda_categories_on_original_id"
+    t.index ["parent_id"], name: "index_communication_website_agenda_categories_on_parent_id"
+    t.index ["program_id"], name: "index_communication_website_agenda_categories_on_program_id"
+    t.index ["university_id"], name: "index_communication_website_agenda_categories_on_university_id"
+  end
+
+  create_table "communication_website_agenda_events", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "title"
+    t.text "summary"
+    t.uuid "university_id", null: false
+    t.uuid "communication_website_id", null: false
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.boolean "published", default: false
+    t.date "from_day"
+    t.time "from_hour"
+    t.date "to_day"
+    t.time "to_hour"
+    t.text "featured_image_alt"
     t.text "featured_image_credit"
-    t.index ["communication_website_id"], name: "idx_communication_website_post_cats_on_communication_website_id"
-    t.index ["parent_id"], name: "index_communication_website_categories_on_parent_id"
-    t.index ["program_id"], name: "index_communication_website_categories_on_program_id"
-    t.index ["university_id"], name: "index_communication_website_categories_on_university_id"
+    t.text "meta_description"
+    t.uuid "parent_id"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "slug"
+    t.string "subtitle"
+    t.string "time_zone"
+    t.jsonb "add_to_calendar_urls"
+    t.index ["communication_website_id"], name: "index_agenda_events_on_communication_website_id"
+    t.index ["language_id"], name: "index_communication_website_agenda_events_on_language_id"
+    t.index ["original_id"], name: "index_communication_website_agenda_events_on_original_id"
+    t.index ["parent_id"], name: "index_communication_website_agenda_events_on_parent_id"
+    t.index ["slug"], name: "index_communication_website_agenda_events_on_slug"
+    t.index ["university_id"], name: "index_communication_website_agenda_events_on_university_id"
+  end
+
+  create_table "communication_website_agenda_events_categories", id: false, force: :cascade do |t|
+    t.uuid "communication_website_agenda_event_id", null: false
+    t.uuid "communication_website_agenda_category_id", null: false
+    t.index ["communication_website_agenda_category_id", "communication_website_agenda_event_id"], name: "category_event"
+    t.index ["communication_website_agenda_event_id", "communication_website_agenda_category_id"], name: "event_category"
   end
 
   create_table "communication_website_categories_posts", id: false, force: :cascade do |t|
@@ -136,124 +344,74 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.index ["communication_website_post_id", "communication_website_category_id"], name: "post_category"
   end
 
-  create_table "communication_website_git_files", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
-    t.string "previous_path"
-    t.string "about_type", null: false
-    t.uuid "about_id", null: false
-    t.uuid "website_id", null: false
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.string "previous_sha"
-    t.index ["about_type", "about_id"], name: "index_communication_website_github_files_on_about"
-    t.index ["website_id"], name: "index_communication_website_git_files_on_website_id"
-  end
-
-  create_table "communication_website_imported_authors", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
-    t.uuid "university_id", null: false
-    t.uuid "website_id", null: false
-    t.uuid "author_id"
-    t.string "name"
-    t.text "description"
-    t.string "slug"
-    t.string "identifier"
-    t.jsonb "data"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.index ["author_id"], name: "idx_communication_website_imported_auth_on_author"
-    t.index ["university_id"], name: "idx_communication_website_imported_auth_on_university"
-    t.index ["website_id"], name: "idx_communication_website_imported_auth_on_website"
-  end
-
-  create_table "communication_website_imported_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_connections", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "website_id", null: false
-    t.uuid "category_id"
-    t.string "name"
-    t.text "description"
-    t.string "identifier"
-    t.string "slug"
-    t.string "url"
-    t.string "parent"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.jsonb "data"
-    t.index ["category_id"], name: "idx_communication_website_imported_cat_on_category"
-    t.index ["university_id"], name: "idx_communication_website_imported_cat_on_university"
-    t.index ["website_id"], name: "idx_communication_website_imported_cat_on_website"
+    t.string "indirect_object_type", null: false
+    t.uuid "indirect_object_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "direct_source_type"
+    t.uuid "direct_source_id"
+    t.index ["direct_source_type", "direct_source_id"], name: "index_communication_website_connections_on_source"
+    t.index ["indirect_object_type", "indirect_object_id"], name: "index_communication_website_connections_on_object"
+    t.index ["university_id"], name: "index_communication_website_connections_on_university_id"
+    t.index ["website_id"], name: "index_communication_website_connections_on_website_id"
   end
 
-  create_table "communication_website_imported_media", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
-    t.string "identifier"
-    t.jsonb "data"
-    t.text "file_url"
-    t.datetime "created_at"
-    t.datetime "updated_at"
+  create_table "communication_website_git_file_layouts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "path"
+    t.uuid "communication_website_id", null: false
     t.uuid "university_id", null: false
-    t.uuid "website_id", null: false
-    t.string "filename"
-    t.string "mime_type"
-    t.text "variant_urls", default: [], array: true
-    t.index ["university_id"], name: "index_communication_website_imported_media_on_university_id"
-    t.index ["website_id"], name: "index_communication_website_imported_media_on_website_id"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["communication_website_id"], name: "idx_on_communication_website_id_eb9ee4bc34"
+    t.index ["university_id"], name: "index_communication_website_git_file_layouts_on_university_id"
   end
 
-  create_table "communication_website_imported_pages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_git_file_orphans", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "path"
+    t.uuid "communication_website_id", null: false
     t.uuid "university_id", null: false
-    t.uuid "website_id", null: false
-    t.uuid "page_id"
-    t.integer "status", default: 0
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.string "title"
-    t.text "content"
-    t.text "path"
-    t.text "url"
-    t.string "identifier"
-    t.text "excerpt"
-    t.string "parent"
-    t.text "slug"
-    t.jsonb "data"
-    t.uuid "featured_medium_id"
-    t.index ["featured_medium_id"], name: "idx_communication_website_imported_pages_on_featured_medium_id"
-    t.index ["identifier"], name: "index_communication_website_imported_pages_on_identifier"
-    t.index ["page_id"], name: "index_communication_website_imported_pages_on_page_id"
-    t.index ["university_id"], name: "index_communication_website_imported_pages_on_university_id"
-    t.index ["website_id"], name: "index_communication_website_imported_pages_on_website_id"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["communication_website_id"], name: "idx_on_communication_website_id_18bd864000"
+    t.index ["university_id"], name: "index_communication_website_git_file_orphans_on_university_id"
   end
 
-  create_table "communication_website_imported_posts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
-    t.uuid "university_id", null: false
+  create_table "communication_website_git_files", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "previous_path"
+    t.string "about_type", null: false
+    t.uuid "about_id", null: false
     t.uuid "website_id", null: false
-    t.uuid "post_id"
-    t.integer "status", default: 0
-    t.string "title"
-    t.text "excerpt"
-    t.text "content"
-    t.text "path"
-    t.text "url"
-    t.datetime "published_at"
-    t.string "identifier"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.text "slug"
-    t.jsonb "data"
-    t.uuid "featured_medium_id"
-    t.string "author"
-    t.jsonb "categories"
-    t.index ["featured_medium_id"], name: "idx_communication_website_imported_posts_on_featured_medium_id"
-    t.index ["post_id"], name: "index_communication_website_imported_posts_on_post_id"
-    t.index ["university_id"], name: "index_communication_website_imported_posts_on_university_id"
-    t.index ["website_id"], name: "index_communication_website_imported_posts_on_website_id"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "previous_sha"
+    t.index ["about_type", "about_id"], name: "index_communication_website_github_files_on_about"
+    t.index ["website_id"], name: "index_communication_website_git_files_on_website_id"
   end
 
-  create_table "communication_website_imported_websites", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_localizations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "communication_website_id", null: false
+    t.uuid "language_id", null: false
     t.uuid "university_id", null: false
-    t.uuid "website_id", null: false
-    t.integer "status", default: 0
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.index ["university_id"], name: "index_communication_website_imported_websites_on_university_id"
-    t.index ["website_id"], name: "index_communication_website_imported_websites_on_website_id"
+    t.string "name"
+    t.string "social_email"
+    t.string "social_mastodon"
+    t.string "social_peertube"
+    t.string "social_x"
+    t.string "social_github"
+    t.string "social_linkedin"
+    t.string "social_youtube"
+    t.string "social_vimeo"
+    t.string "social_instagram"
+    t.string "social_facebook"
+    t.string "social_tiktok"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["communication_website_id"], name: "idx_on_communication_website_id_ed4630e334"
+    t.index ["language_id"], name: "index_communication_website_localizations_on_language_id"
+    t.index ["university_id"], name: "index_communication_website_localizations_on_university_id"
   end
 
   create_table "communication_website_menu_items", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
@@ -266,8 +424,8 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.uuid "parent_id"
     t.string "about_type"
     t.uuid "about_id"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.text "url"
     t.index ["about_type", "about_id"], name: "index_communication_website_menu_items_on_about"
     t.index ["menu_id"], name: "index_communication_website_menu_items_on_menu_id"
@@ -281,10 +439,14 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.uuid "communication_website_id", null: false
     t.string "title"
     t.string "identifier"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.text "github_path"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.uuid "original_id"
+    t.uuid "language_id", null: false
+    t.boolean "automatic", default: true
     t.index ["communication_website_id"], name: "idx_comm_website_menus_on_communication_website_id"
+    t.index ["language_id"], name: "index_communication_website_menus_on_language_id"
+    t.index ["original_id"], name: "index_communication_website_menus_on_original_id"
     t.index ["university_id"], name: "index_communication_website_menus_on_university_id"
   end
 
@@ -292,61 +454,179 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.uuid "university_id", null: false
     t.uuid "communication_website_id", null: false
     t.string "title"
-    t.text "description"
+    t.text "meta_description"
     t.string "slug"
     t.text "path"
     t.uuid "parent_id"
     t.integer "position", default: 0, null: false
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.boolean "published", default: false
-    t.text "github_path"
     t.string "featured_image_alt"
     t.text "text"
-    t.text "description_short"
     t.string "breadcrumb_title"
     t.text "header_text"
     t.integer "kind"
+    t.text "summary"
     t.string "bodyclass"
-    t.uuid "language_id"
+    t.uuid "language_id", null: false
     t.text "featured_image_credit"
     t.boolean "full_width", default: false
+    t.string "type"
+    t.uuid "original_id"
+    t.string "migration_identifier"
+    t.datetime "published_at"
+    t.boolean "header_cta", default: false
+    t.string "header_cta_url"
+    t.string "header_cta_label"
     t.index ["communication_website_id"], name: "index_communication_website_pages_on_communication_website_id"
     t.index ["language_id"], name: "index_communication_website_pages_on_language_id"
+    t.index ["original_id"], name: "index_communication_website_pages_on_original_id"
     t.index ["parent_id"], name: "index_communication_website_pages_on_parent_id"
+    t.index ["slug"], name: "index_communication_website_pages_on_slug"
     t.index ["university_id"], name: "index_communication_website_pages_on_university_id"
   end
 
+  create_table "communication_website_permalinks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "university_id", null: false
+    t.uuid "website_id", null: false
+    t.string "about_type", null: false
+    t.uuid "about_id", null: false
+    t.string "path"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.boolean "is_current", default: true
+    t.index ["about_type", "about_id"], name: "index_communication_website_permalinks_on_about"
+    t.index ["university_id"], name: "index_communication_website_permalinks_on_university_id"
+    t.index ["website_id"], name: "index_communication_website_permalinks_on_website_id"
+  end
+
+  create_table "communication_website_portfolio_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "name"
+    t.string "slug"
+    t.text "featured_image_alt"
+    t.text "featured_image_credit"
+    t.text "meta_description"
+    t.boolean "is_programs_root", default: false
+    t.string "path"
+    t.integer "position"
+    t.text "summary"
+    t.uuid "communication_website_id", null: false
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.uuid "parent_id"
+    t.uuid "university_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["communication_website_id"], name: "idx_on_communication_website_id_8f309901d4"
+    t.index ["language_id"], name: "idx_on_language_id_6e6ffc92a8"
+    t.index ["original_id"], name: "idx_on_original_id_4cbc9f1290"
+    t.index ["parent_id"], name: "index_communication_website_portfolio_categories_on_parent_id"
+    t.index ["university_id"], name: "idx_on_university_id_a07cc0a296"
+  end
+
+  create_table "communication_website_portfolio_categories_projects", id: false, force: :cascade do |t|
+    t.uuid "communication_website_portfolio_category_id", null: false
+    t.uuid "communication_website_portfolio_project_id", null: false
+    t.index ["communication_website_portfolio_category_id", "communication_website_portfolio_project_id"], name: "idx_on_communication_website_portfolio_category_id__77417ffc96"
+    t.index ["communication_website_portfolio_project_id", "communication_website_portfolio_category_id"], name: "idx_on_communication_website_portfolio_project_id_c_8ffd53123b"
+  end
+
+  create_table "communication_website_portfolio_projects", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "title"
+    t.string "slug"
+    t.text "featured_image_alt"
+    t.text "featured_image_credit"
+    t.integer "year"
+    t.text "meta_description"
+    t.boolean "published", default: false
+    t.text "summary"
+    t.uuid "communication_website_id", null: false
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.uuid "university_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["communication_website_id"], name: "idx_on_communication_website_id_aac12e3adb"
+    t.index ["language_id"], name: "index_communication_website_portfolio_projects_on_language_id"
+    t.index ["original_id"], name: "index_communication_website_portfolio_projects_on_original_id"
+    t.index ["university_id"], name: "idx_on_university_id_ac2f4a0bfc"
+  end
+
+  create_table "communication_website_post_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "university_id", null: false
+    t.uuid "communication_website_id", null: false
+    t.string "name"
+    t.text "meta_description"
+    t.integer "position"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "slug"
+    t.uuid "parent_id"
+    t.uuid "program_id"
+    t.boolean "is_programs_root", default: false
+    t.string "path"
+    t.string "featured_image_alt"
+    t.text "summary"
+    t.text "featured_image_credit"
+    t.uuid "original_id"
+    t.uuid "language_id", null: false
+    t.index ["communication_website_id"], name: "idx_communication_website_post_cats_on_communication_website_id"
+    t.index ["language_id"], name: "index_communication_website_post_categories_on_language_id"
+    t.index ["original_id"], name: "index_communication_website_post_categories_on_original_id"
+    t.index ["parent_id"], name: "index_communication_website_post_categories_on_parent_id"
+    t.index ["program_id"], name: "index_communication_website_post_categories_on_program_id"
+    t.index ["slug"], name: "index_communication_website_post_categories_on_slug"
+    t.index ["university_id"], name: "index_communication_website_post_categories_on_university_id"
+  end
+
   create_table "communication_website_posts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "communication_website_id", null: false
     t.string "title"
-    t.text "description"
+    t.text "meta_description"
     t.boolean "published", default: false
-    t.datetime "published_at"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.text "slug"
-    t.text "github_path"
+    t.datetime "published_at", precision: nil
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "slug"
     t.uuid "author_id"
     t.boolean "pinned", default: false
     t.string "featured_image_alt"
     t.text "text"
-    t.text "description_short"
-    t.uuid "language_id"
+    t.text "summary"
+    t.uuid "language_id", null: false
     t.text "featured_image_credit"
+    t.uuid "original_id"
+    t.string "migration_identifier"
     t.index ["author_id"], name: "index_communication_website_posts_on_author_id"
     t.index ["communication_website_id"], name: "index_communication_website_posts_on_communication_website_id"
     t.index ["language_id"], name: "index_communication_website_posts_on_language_id"
+    t.index ["original_id"], name: "index_communication_website_posts_on_original_id"
+    t.index ["slug"], name: "index_communication_website_posts_on_slug"
     t.index ["university_id"], name: "index_communication_website_posts_on_university_id"
   end
 
+  create_table "communication_website_showcase_tags", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "name"
+    t.string "slug"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+  end
+
+  create_table "communication_website_showcase_tags_websites", id: false, force: :cascade do |t|
+    t.uuid "communication_website_id", null: false
+    t.uuid "communication_website_showcase_tag_id", null: false
+    t.index ["communication_website_id", "communication_website_showcase_tag_id"], name: "index_website_showcase_tag"
+    t.index ["communication_website_showcase_tag_id", "communication_website_id"], name: "index_showcase_tag_website"
+  end
+
   create_table "communication_websites", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "name"
     t.string "url"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.string "access_token"
     t.string "repository"
     t.string "about_type"
@@ -356,7 +636,36 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.text "style"
     t.date "style_updated_at"
     t.string "plausible_url"
+    t.string "git_branch"
+    t.boolean "in_production", default: false
+    t.uuid "default_language_id", null: false
+    t.string "theme_version", default: "NA"
+    t.text "deployment_status_badge"
+    t.boolean "autoupdate_theme", default: true
+    t.boolean "feature_posts", default: true
+    t.boolean "feature_agenda", default: false
+    t.string "social_mastodon"
+    t.string "social_x"
+    t.string "social_linkedin"
+    t.string "social_youtube"
+    t.string "social_vimeo"
+    t.string "social_peertube"
+    t.string "social_instagram"
+    t.string "social_facebook"
+    t.string "social_tiktok"
+    t.boolean "deuxfleurs_hosting", default: true
+    t.string "deuxfleurs_identifier"
+    t.string "social_email"
+    t.string "social_github"
+    t.string "default_time_zone"
+    t.boolean "feature_portfolio", default: false
+    t.boolean "in_showcase", default: true
+    t.datetime "locked_at"
+    t.datetime "git_files_analysed_at"
+    t.boolean "highlighted_in_showcase", default: false
     t.index ["about_type", "about_id"], name: "index_communication_websites_on_about"
+    t.index ["default_language_id"], name: "index_communication_websites_on_default_language_id"
+    t.index ["name"], name: "index_communication_websites_on_name", opclass: :gin_trgm_ops, using: :gin
     t.index ["university_id"], name: "index_communication_websites_on_university_id"
   end
 
@@ -378,21 +687,23 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.integer "attempts", default: 0, null: false
     t.text "handler", null: false
     t.text "last_error"
-    t.datetime "run_at"
-    t.datetime "locked_at"
-    t.datetime "failed_at"
+    t.datetime "run_at", precision: nil
+    t.datetime "locked_at", precision: nil
+    t.datetime "failed_at", precision: nil
     t.string "locked_by"
     t.string "queue"
-    t.datetime "created_at", precision: 6
-    t.datetime "updated_at", precision: 6
+    t.datetime "created_at"
+    t.datetime "updated_at"
+    t.string "signature"
+    t.text "args"
     t.index ["priority", "run_at"], name: "delayed_jobs_priority"
   end
 
   create_table "education_academic_years", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.integer "year"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.index ["university_id"], name: "index_education_academic_years_on_university_id"
   end
 
@@ -408,8 +719,8 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.uuid "program_id", null: false
     t.uuid "academic_year_id", null: false
     t.string "name"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.uuid "school_id", null: false
     t.index ["academic_year_id"], name: "index_education_cohorts_on_academic_year_id"
     t.index ["program_id"], name: "index_education_cohorts_on_program_id"
@@ -430,31 +741,36 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.integer "level", default: 0
     t.string "slug"
     t.uuid "university_id", null: false
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.integer "ects"
     t.text "duration"
+    t.text "summary"
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.index ["language_id"], name: "index_education_diplomas_on_language_id"
+    t.index ["original_id"], name: "index_education_diplomas_on_original_id"
+    t.index ["slug"], name: "index_education_diplomas_on_slug"
     t.index ["university_id"], name: "index_education_diplomas_on_university_id"
   end
 
   create_table "education_programs", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "name"
-    t.integer "level"
     t.integer "capacity"
     t.boolean "continuing"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.uuid "parent_id"
     t.integer "position", default: 0
     t.string "slug"
     t.string "path"
-    t.text "description"
+    t.text "meta_description"
     t.boolean "published", default: false
     t.string "featured_image_alt"
     t.text "accessibility"
     t.text "contacts"
-    t.text "duration"
+    t.string "duration"
     t.text "evaluation"
     t.text "objectives"
     t.text "opportunities"
@@ -472,8 +788,21 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.boolean "initial"
     t.boolean "apprenticeship"
     t.string "registration_url"
+    t.text "summary"
+    t.text "pricing_continuing"
+    t.text "pricing_apprenticeship"
+    t.text "pricing_initial"
+    t.string "bodyclass"
+    t.string "url"
+    t.boolean "qualiopi_certified", default: false
+    t.text "qualiopi_text"
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
     t.index ["diploma_id"], name: "index_education_programs_on_diploma_id"
+    t.index ["language_id"], name: "index_education_programs_on_language_id"
+    t.index ["original_id"], name: "index_education_programs_on_original_id"
     t.index ["parent_id"], name: "index_education_programs_on_parent_id"
+    t.index ["slug"], name: "index_education_programs_on_slug"
     t.index ["university_id"], name: "index_education_programs_on_university_id"
   end
 
@@ -506,21 +835,117 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.string "country"
     t.float "latitude"
     t.float "longitude"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.string "phone"
+    t.string "url"
     t.index ["university_id"], name: "index_education_schools_on_university_id"
   end
 
+  create_table "emergency_messages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "university_id"
+    t.string "name"
+    t.string "role"
+    t.string "subject_fr"
+    t.string "subject_en"
+    t.text "content_fr"
+    t.text "content_en"
+    t.datetime "delivered_at"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.integer "delivered_count"
+    t.index ["university_id"], name: "index_emergency_messages_on_university_id", where: "(university_id IS NOT NULL)"
+  end
+
+  create_table "good_job_batches", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.text "description"
+    t.jsonb "serialized_properties"
+    t.text "on_finish"
+    t.text "on_success"
+    t.text "on_discard"
+    t.text "callback_queue_name"
+    t.integer "callback_priority"
+    t.datetime "enqueued_at"
+    t.datetime "discarded_at"
+    t.datetime "finished_at"
+  end
+
+  create_table "good_job_executions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.uuid "active_job_id", null: false
+    t.text "job_class"
+    t.text "queue_name"
+    t.jsonb "serialized_params"
+    t.datetime "scheduled_at"
+    t.datetime "finished_at"
+    t.text "error"
+    t.integer "error_event", limit: 2
+    t.text "error_backtrace", array: true
+    t.index ["active_job_id", "created_at"], name: "index_good_job_executions_on_active_job_id_and_created_at"
+  end
+
+  create_table "good_job_processes", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.jsonb "state"
+  end
+
+  create_table "good_job_settings", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.text "key"
+    t.jsonb "value"
+    t.index ["key"], name: "index_good_job_settings_on_key", unique: true
+  end
+
+  create_table "good_jobs", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.text "queue_name"
+    t.integer "priority"
+    t.jsonb "serialized_params"
+    t.datetime "scheduled_at"
+    t.datetime "performed_at"
+    t.datetime "finished_at"
+    t.text "error"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.uuid "active_job_id"
+    t.text "concurrency_key"
+    t.text "cron_key"
+    t.uuid "retried_good_job_id"
+    t.datetime "cron_at"
+    t.uuid "batch_id"
+    t.uuid "batch_callback_id"
+    t.boolean "is_discrete"
+    t.integer "executions_count"
+    t.text "job_class"
+    t.integer "error_event", limit: 2
+    t.text "labels", array: true
+    t.index ["active_job_id", "created_at"], name: "index_good_jobs_on_active_job_id_and_created_at"
+    t.index ["batch_callback_id"], name: "index_good_jobs_on_batch_callback_id", where: "(batch_callback_id IS NOT NULL)"
+    t.index ["batch_id"], name: "index_good_jobs_on_batch_id", where: "(batch_id IS NOT NULL)"
+    t.index ["concurrency_key"], name: "index_good_jobs_on_concurrency_key_when_unfinished", where: "(finished_at IS NULL)"
+    t.index ["cron_key", "created_at"], name: "index_good_jobs_on_cron_key_and_created_at_cond", where: "(cron_key IS NOT NULL)"
+    t.index ["cron_key", "cron_at"], name: "index_good_jobs_on_cron_key_and_cron_at_cond", unique: true, where: "(cron_key IS NOT NULL)"
+    t.index ["finished_at"], name: "index_good_jobs_jobs_on_finished_at", where: "((retried_good_job_id IS NULL) AND (finished_at IS NOT NULL))"
+    t.index ["labels"], name: "index_good_jobs_on_labels", where: "(labels IS NOT NULL)", using: :gin
+    t.index ["priority", "created_at"], name: "index_good_job_jobs_for_candidate_lookup", where: "(finished_at IS NULL)"
+    t.index ["priority", "created_at"], name: "index_good_jobs_jobs_on_priority_created_at_when_unfinished", order: { priority: "DESC NULLS LAST" }, where: "(finished_at IS NULL)"
+    t.index ["queue_name", "scheduled_at"], name: "index_good_jobs_on_queue_name_and_scheduled_at", where: "(finished_at IS NULL)"
+    t.index ["scheduled_at"], name: "index_good_jobs_on_scheduled_at", where: "(finished_at IS NULL)"
+  end
+
   create_table "imports", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.integer "number_of_lines"
     t.jsonb "processing_errors"
     t.integer "kind"
     t.integer "status", default: 0
     t.uuid "university_id", null: false
-    t.uuid "user_id", null: false
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.uuid "user_id"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.index ["university_id"], name: "index_imports_on_university_id"
     t.index ["user_id"], name: "index_imports_on_user_id"
   end
@@ -528,29 +953,84 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
   create_table "languages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "name"
     t.string "iso_code"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "summernote_locale"
+  end
+
+  create_table "research_hal_authors", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "docid"
+    t.string "form_identifier"
+    t.string "person_identifier"
+    t.string "first_name"
+    t.string "last_name"
+    t.string "full_name"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["docid"], name: "index_research_hal_authors_on_docid"
+  end
+
+  create_table "research_hal_authors_publications", id: false, force: :cascade do |t|
+    t.uuid "research_publication_id", null: false
+    t.uuid "research_hal_author_id", null: false
+    t.index ["research_hal_author_id", "research_publication_id"], name: "hal_publication_author"
+    t.index ["research_publication_id", "research_hal_author_id"], name: "hal_author_publication"
+  end
+
+  create_table "research_hal_authors_university_people", id: false, force: :cascade do |t|
+    t.uuid "university_person_id", null: false
+    t.uuid "research_hal_author_id", null: false
+    t.index ["research_hal_author_id", "university_person_id"], name: "hal_person_author"
+    t.index ["university_person_id", "research_hal_author_id"], name: "hal_author_person"
+  end
+
+  create_table "research_journal_paper_kinds", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "university_id", null: false
+    t.uuid "journal_id", null: false
+    t.string "title"
+    t.string "slug"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.index ["journal_id"], name: "index_research_journal_paper_kinds_on_journal_id"
+    t.index ["language_id"], name: "index_research_journal_paper_kinds_on_language_id"
+    t.index ["original_id"], name: "index_research_journal_paper_kinds_on_original_id"
+    t.index ["slug"], name: "index_research_journal_paper_kinds_on_slug"
+    t.index ["university_id"], name: "index_research_journal_paper_kinds_on_university_id"
   end
 
   create_table "research_journal_papers", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "title"
-    t.datetime "published_at"
+    t.datetime "published_at", precision: nil
     t.uuid "university_id", null: false
     t.uuid "research_journal_id", null: false
     t.uuid "research_journal_volume_id"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.uuid "updated_by_id"
     t.text "abstract"
-    t.text "references"
+    t.text "bibliography"
     t.text "keywords"
     t.string "slug"
     t.boolean "published", default: false
     t.integer "position"
     t.text "text"
-    t.text "description"
+    t.text "meta_description"
+    t.text "summary"
+    t.uuid "kind_id"
+    t.date "received_at"
+    t.date "accepted_at"
+    t.string "doi"
+    t.text "authors_list"
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.index ["kind_id"], name: "index_research_journal_papers_on_kind_id"
+    t.index ["language_id"], name: "index_research_journal_papers_on_language_id"
+    t.index ["original_id"], name: "index_research_journal_papers_on_original_id"
     t.index ["research_journal_id"], name: "index_research_journal_papers_on_research_journal_id"
     t.index ["research_journal_volume_id"], name: "index_research_journal_papers_on_research_journal_volume_id"
+    t.index ["slug"], name: "index_research_journal_papers_on_slug"
     t.index ["university_id"], name: "index_research_journal_papers_on_university_id"
     t.index ["updated_by_id"], name: "index_research_journal_papers_on_updated_by_id"
   end
@@ -567,29 +1047,36 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.uuid "research_journal_id", null: false
     t.string "title"
     t.integer "number"
-    t.datetime "published_at"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.text "description"
+    t.datetime "published_at", precision: nil
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.text "meta_description"
     t.text "keywords"
     t.string "slug"
     t.string "featured_image_alt"
     t.boolean "published", default: false
     t.text "text"
     t.text "featured_image_credit"
+    t.text "summary"
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.index ["language_id"], name: "index_research_journal_volumes_on_language_id"
+    t.index ["original_id"], name: "index_research_journal_volumes_on_original_id"
     t.index ["research_journal_id"], name: "index_research_journal_volumes_on_research_journal_id"
+    t.index ["slug"], name: "index_research_journal_volumes_on_slug"
     t.index ["university_id"], name: "index_research_journal_volumes_on_university_id"
   end
 
   create_table "research_journals", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "title"
-    t.text "description"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
-    t.string "access_token"
-    t.string "repository"
+    t.text "meta_description"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.string "issn"
+    t.text "summary"
+    t.uuid "language_id", null: false
+    t.index ["language_id"], name: "index_research_journals_on_language_id"
     t.index ["university_id"], name: "index_research_journals_on_university_id"
   end
 
@@ -600,25 +1087,65 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.string "zipcode"
     t.string "city"
     t.string "country"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "address_name"
+    t.string "address_additional"
     t.index ["university_id"], name: "index_research_laboratories_on_university_id"
   end
 
+  create_table "research_laboratories_university_people", id: false, force: :cascade do |t|
+    t.uuid "university_person_id", null: false
+    t.uuid "research_laboratory_id", null: false
+    t.index ["research_laboratory_id", "university_person_id"], name: "person_laboratory"
+    t.index ["university_person_id", "research_laboratory_id"], name: "laboratory_person"
+  end
+
   create_table "research_laboratory_axes", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "research_laboratory_id", null: false
     t.string "name"
-    t.text "description"
+    t.text "meta_description"
     t.integer "position"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.string "short_name"
     t.text "text"
     t.index ["research_laboratory_id"], name: "index_research_laboratory_axes_on_research_laboratory_id"
     t.index ["university_id"], name: "index_research_laboratory_axes_on_university_id"
   end
 
+  create_table "research_publications", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "hal_docid"
+    t.jsonb "data"
+    t.string "title"
+    t.string "url"
+    t.string "ref"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "hal_url"
+    t.date "publication_date"
+    t.string "doi"
+    t.string "slug"
+    t.text "citation_full"
+    t.boolean "open_access"
+    t.text "abstract"
+    t.string "journal_title"
+    t.text "file"
+    t.text "authors_list"
+    t.json "authors_citeproc"
+    t.integer "source", default: 0
+    t.index ["hal_docid"], name: "index_research_publications_on_hal_docid"
+    t.index ["slug"], name: "index_research_publications_on_slug"
+  end
+
+  create_table "research_publications_university_people", id: false, force: :cascade do |t|
+    t.uuid "university_person_id", null: false
+    t.uuid "research_publication_id", null: false
+    t.index ["research_publication_id", "university_person_id"], name: "index_person_publication"
+    t.index ["university_person_id", "research_publication_id"], name: "index_publication_person"
+  end
+
   create_table "research_theses", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "research_laboratory_id", null: false
@@ -629,8 +1156,8 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.date "started_at"
     t.boolean "completed", default: false
     t.date "completed_at"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.index ["author_id"], name: "index_research_theses_on_author_id"
     t.index ["director_id"], name: "index_research_theses_on_director_id"
     t.index ["research_laboratory_id"], name: "index_research_theses_on_research_laboratory_id"
@@ -645,27 +1172,56 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.string "city"
     t.string "country"
     t.boolean "private"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.string "mail_from_name"
     t.string "mail_from_address"
     t.string "sms_sender_name"
     t.date "invoice_date"
     t.integer "invoice_date_yday"
-    t.string "invoice_amount"
     t.boolean "has_sso", default: false
     t.integer "sso_provider", default: 0
     t.string "sso_target_url"
     t.text "sso_cert"
     t.string "sso_name_identifier_format"
     t.jsonb "sso_mapping"
+    t.string "sso_button_label"
+    t.uuid "default_language_id", null: false
+    t.boolean "is_really_a_university", default: true
+    t.float "contribution_amount"
+    t.index ["default_language_id"], name: "index_universities_on_default_language_id"
+    t.index ["name"], name: "index_universities_on_name", opclass: :gin_trgm_ops, using: :gin
+  end
+
+  create_table "university_apps", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "name"
+    t.uuid "university_id", null: false
+    t.string "token"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.boolean "token_was_displayed", default: false
+    t.index ["token"], name: "index_university_apps_on_token", unique: true
+    t.index ["university_id"], name: "index_university_apps_on_university_id"
+  end
+
+  create_table "university_organization_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "name"
+    t.uuid "university_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "slug"
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.index ["language_id"], name: "index_university_organization_categories_on_language_id"
+    t.index ["original_id"], name: "index_university_organization_categories_on_original_id"
+    t.index ["university_id"], name: "index_university_organization_categories_on_university_id"
   end
 
   create_table "university_organizations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "name"
     t.string "long_name"
-    t.text "description"
+    t.text "meta_description"
     t.string "address"
     t.string "zipcode"
     t.string "city"
@@ -676,14 +1232,34 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.boolean "active", default: true
     t.string "siren"
     t.integer "kind", default: 10
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.string "slug"
     t.text "text"
     t.string "nic"
+    t.text "summary"
+    t.string "twitter"
+    t.string "linkedin"
+    t.string "mastodon"
+    t.float "latitude"
+    t.float "longitude"
+    t.string "address_name"
+    t.string "address_additional"
+    t.uuid "language_id"
+    t.uuid "original_id"
+    t.index ["language_id"], name: "index_university_organizations_on_language_id"
+    t.index ["original_id"], name: "index_university_organizations_on_original_id"
+    t.index ["slug"], name: "index_university_organizations_on_slug"
     t.index ["university_id"], name: "index_university_organizations_on_university_id"
   end
 
+  create_table "university_organizations_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "organization_id", null: false
+    t.uuid "category_id", null: false
+    t.index ["category_id"], name: "index_university_organizations_categories_on_category_id"
+    t.index ["organization_id"], name: "index_university_organizations_categories_on_organization_id"
+  end
+
   create_table "university_people", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "user_id"
@@ -693,11 +1269,11 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.boolean "is_researcher"
     t.boolean "is_teacher"
     t.boolean "is_administration"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.string "phone_mobile"
     t.string "email"
-    t.text "description"
+    t.text "meta_description"
     t.boolean "habilitation", default: false
     t.boolean "tenure", default: false
     t.text "biography"
@@ -705,7 +1281,7 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.string "twitter"
     t.string "linkedin"
     t.boolean "is_alumnus", default: false
-    t.text "description_short"
+    t.text "summary"
     t.boolean "is_author"
     t.string "name"
     t.integer "gender"
@@ -716,10 +1292,45 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.string "zipcode"
     t.string "city"
     t.string "country"
+    t.string "mastodon"
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.text "picture_credit"
+    t.integer "address_visibility", default: 0
+    t.integer "linkedin_visibility", default: 0
+    t.integer "twitter_visibility", default: 0
+    t.integer "mastodon_visibility", default: 0
+    t.integer "phone_mobile_visibility", default: 0
+    t.integer "phone_professional_visibility", default: 0
+    t.integer "phone_personal_visibility", default: 0
+    t.integer "email_visibility", default: 0
+    t.index ["language_id"], name: "index_university_people_on_language_id"
+    t.index ["original_id"], name: "index_university_people_on_original_id"
+    t.index ["slug"], name: "index_university_people_on_slug"
     t.index ["university_id"], name: "index_university_people_on_university_id"
     t.index ["user_id"], name: "index_university_people_on_user_id"
   end
 
+  create_table "university_people_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "person_id", null: false
+    t.uuid "category_id", null: false
+    t.index ["category_id"], name: "index_university_people_categories_on_category_id"
+    t.index ["person_id"], name: "index_university_people_categories_on_person_id"
+  end
+
+  create_table "university_person_categories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.string "name"
+    t.uuid "university_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.string "slug"
+    t.uuid "language_id", null: false
+    t.uuid "original_id"
+    t.index ["language_id"], name: "index_university_person_categories_on_language_id"
+    t.index ["original_id"], name: "index_university_person_categories_on_original_id"
+    t.index ["university_id"], name: "index_university_person_categories_on_university_id"
+  end
+
   create_table "university_person_experiences", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "person_id", null: false
@@ -727,8 +1338,8 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.text "description"
     t.integer "from_year"
     t.integer "to_year"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.index ["organization_id"], name: "index_university_person_experiences_on_organization_id"
     t.index ["person_id"], name: "index_university_person_experiences_on_person_id"
     t.index ["university_id"], name: "index_university_person_experiences_on_university_id"
@@ -742,8 +1353,8 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.uuid "target_id", null: false
     t.text "description"
     t.integer "position"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.index ["person_id"], name: "index_university_person_involvements_on_person_id"
     t.index ["target_type", "target_id"], name: "index_university_person_involvements_on_target"
     t.index ["university_id"], name: "index_university_person_involvements_on_university_id"
@@ -755,12 +1366,22 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.uuid "target_id"
     t.text "description"
     t.integer "position"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.index ["target_type", "target_id"], name: "index_university_roles_on_target"
     t.index ["university_id"], name: "index_university_roles_on_university_id"
   end
 
+  create_table "user_favorites", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+    t.uuid "user_id", null: false
+    t.string "about_type", null: false
+    t.uuid "about_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["about_type", "about_id"], name: "index_user_favorites_on_about"
+    t.index ["user_id"], name: "index_user_favorites_on_user_id"
+  end
+
   create_table "users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "first_name"
@@ -769,22 +1390,22 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.string "email", default: "", null: false
     t.string "encrypted_password", default: "", null: false
     t.string "reset_password_token"
-    t.datetime "reset_password_sent_at"
-    t.datetime "remember_created_at"
+    t.datetime "reset_password_sent_at", precision: nil
+    t.datetime "remember_created_at", precision: nil
     t.integer "sign_in_count", default: 0, null: false
-    t.datetime "current_sign_in_at"
-    t.datetime "last_sign_in_at"
+    t.datetime "current_sign_in_at", precision: nil
+    t.datetime "last_sign_in_at", precision: nil
     t.string "current_sign_in_ip"
     t.string "last_sign_in_ip"
     t.string "confirmation_token"
-    t.datetime "confirmed_at"
-    t.datetime "confirmation_sent_at"
+    t.datetime "confirmed_at", precision: nil
+    t.datetime "confirmation_sent_at", precision: nil
     t.string "unconfirmed_email"
     t.integer "failed_attempts", default: 0, null: false
     t.string "unlock_token"
-    t.datetime "locked_at"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
+    t.datetime "locked_at", precision: nil
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
     t.uuid "language_id"
     t.string "mobile_phone"
     t.integer "second_factor_attempts_count", default: 0
@@ -792,11 +1413,12 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
     t.string "encrypted_otp_secret_key_iv"
     t.string "encrypted_otp_secret_key_salt"
     t.string "direct_otp"
-    t.datetime "direct_otp_sent_at"
-    t.datetime "totp_timestamp"
+    t.datetime "direct_otp_sent_at", precision: nil
+    t.datetime "totp_timestamp", precision: nil
     t.string "session_token"
     t.string "picture_url"
     t.string "direct_otp_delivery_method"
+    t.integer "admin_theme", default: 1
     t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
     t.index ["email", "university_id"], name: "index_users_on_email_and_university_id", unique: true
     t.index ["encrypted_otp_secret_key"], name: "index_users_on_encrypted_otp_secret_key", unique: true
@@ -808,64 +1430,122 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
 
   add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
   add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
+  add_foreign_key "administration_locations", "administration_locations", column: "original_id"
+  add_foreign_key "administration_locations", "languages"
+  add_foreign_key "administration_locations", "universities"
   add_foreign_key "administration_qualiopi_indicators", "administration_qualiopi_criterions", column: "criterion_id"
+  add_foreign_key "communication_block_headings", "communication_block_headings", column: "parent_id"
+  add_foreign_key "communication_block_headings", "universities"
+  add_foreign_key "communication_blocks", "communication_block_headings", column: "heading_id"
+  add_foreign_key "communication_blocks", "communication_websites"
   add_foreign_key "communication_blocks", "universities"
+  add_foreign_key "communication_extranet_connections", "communication_extranets", column: "extranet_id"
+  add_foreign_key "communication_extranet_connections", "universities"
+  add_foreign_key "communication_extranet_document_categories", "communication_extranets", column: "extranet_id"
+  add_foreign_key "communication_extranet_document_categories", "universities"
+  add_foreign_key "communication_extranet_document_kinds", "communication_extranets", column: "extranet_id"
+  add_foreign_key "communication_extranet_document_kinds", "universities"
+  add_foreign_key "communication_extranet_documents", "communication_extranet_document_categories", column: "category_id"
+  add_foreign_key "communication_extranet_documents", "communication_extranet_document_kinds", column: "kind_id"
+  add_foreign_key "communication_extranet_documents", "communication_extranets", column: "extranet_id"
+  add_foreign_key "communication_extranet_documents", "universities"
+  add_foreign_key "communication_extranet_post_categories", "communication_extranets", column: "extranet_id"
+  add_foreign_key "communication_extranet_post_categories", "universities"
+  add_foreign_key "communication_extranet_posts", "communication_extranet_post_categories", column: "category_id"
+  add_foreign_key "communication_extranet_posts", "communication_extranets", column: "extranet_id"
+  add_foreign_key "communication_extranet_posts", "universities"
+  add_foreign_key "communication_extranet_posts", "university_people", column: "author_id"
   add_foreign_key "communication_extranets", "universities"
-  add_foreign_key "communication_website_categories", "communication_website_categories", column: "parent_id"
-  add_foreign_key "communication_website_categories", "communication_websites"
-  add_foreign_key "communication_website_categories", "education_programs", column: "program_id"
-  add_foreign_key "communication_website_categories", "universities"
+  add_foreign_key "communication_website_agenda_categories", "communication_website_agenda_categories", column: "original_id"
+  add_foreign_key "communication_website_agenda_categories", "communication_website_agenda_categories", column: "parent_id"
+  add_foreign_key "communication_website_agenda_categories", "communication_websites"
+  add_foreign_key "communication_website_agenda_categories", "education_programs", column: "program_id"
+  add_foreign_key "communication_website_agenda_categories", "languages"
+  add_foreign_key "communication_website_agenda_categories", "universities"
+  add_foreign_key "communication_website_agenda_events", "communication_website_agenda_events", column: "original_id"
+  add_foreign_key "communication_website_agenda_events", "communication_website_agenda_events", column: "parent_id"
+  add_foreign_key "communication_website_agenda_events", "communication_websites"
+  add_foreign_key "communication_website_agenda_events", "languages"
+  add_foreign_key "communication_website_agenda_events", "universities"
+  add_foreign_key "communication_website_connections", "communication_websites", column: "website_id"
+  add_foreign_key "communication_website_connections", "universities"
+  add_foreign_key "communication_website_git_file_layouts", "communication_websites"
+  add_foreign_key "communication_website_git_file_layouts", "universities"
+  add_foreign_key "communication_website_git_file_orphans", "communication_websites"
+  add_foreign_key "communication_website_git_file_orphans", "universities"
   add_foreign_key "communication_website_git_files", "communication_websites", column: "website_id"
-  add_foreign_key "communication_website_imported_authors", "communication_website_imported_websites", column: "website_id"
-  add_foreign_key "communication_website_imported_authors", "universities"
-  add_foreign_key "communication_website_imported_authors", "university_people", column: "author_id"
-  add_foreign_key "communication_website_imported_categories", "communication_website_categories", column: "category_id"
-  add_foreign_key "communication_website_imported_categories", "communication_website_imported_websites", column: "website_id"
-  add_foreign_key "communication_website_imported_categories", "universities"
-  add_foreign_key "communication_website_imported_media", "communication_website_imported_websites", column: "website_id"
-  add_foreign_key "communication_website_imported_media", "universities"
-  add_foreign_key "communication_website_imported_pages", "communication_website_imported_media", column: "featured_medium_id"
-  add_foreign_key "communication_website_imported_pages", "communication_website_imported_websites", column: "website_id"
-  add_foreign_key "communication_website_imported_pages", "communication_website_pages", column: "page_id"
-  add_foreign_key "communication_website_imported_pages", "universities"
-  add_foreign_key "communication_website_imported_posts", "communication_website_imported_media", column: "featured_medium_id"
-  add_foreign_key "communication_website_imported_posts", "communication_website_imported_websites", column: "website_id"
-  add_foreign_key "communication_website_imported_posts", "communication_website_posts", column: "post_id"
-  add_foreign_key "communication_website_imported_posts", "universities"
-  add_foreign_key "communication_website_imported_websites", "communication_websites", column: "website_id"
-  add_foreign_key "communication_website_imported_websites", "universities"
+  add_foreign_key "communication_website_localizations", "communication_websites"
+  add_foreign_key "communication_website_localizations", "languages"
+  add_foreign_key "communication_website_localizations", "universities"
   add_foreign_key "communication_website_menu_items", "communication_website_menu_items", column: "parent_id"
   add_foreign_key "communication_website_menu_items", "communication_website_menus", column: "menu_id"
   add_foreign_key "communication_website_menu_items", "communication_websites", column: "website_id"
   add_foreign_key "communication_website_menu_items", "universities"
+  add_foreign_key "communication_website_menus", "communication_website_menus", column: "original_id"
   add_foreign_key "communication_website_menus", "communication_websites"
+  add_foreign_key "communication_website_menus", "languages"
   add_foreign_key "communication_website_menus", "universities"
+  add_foreign_key "communication_website_pages", "communication_website_pages", column: "original_id"
   add_foreign_key "communication_website_pages", "communication_website_pages", column: "parent_id"
   add_foreign_key "communication_website_pages", "communication_websites"
   add_foreign_key "communication_website_pages", "universities"
+  add_foreign_key "communication_website_permalinks", "communication_websites", column: "website_id"
+  add_foreign_key "communication_website_permalinks", "universities"
+  add_foreign_key "communication_website_portfolio_categories", "communication_website_portfolio_categories", column: "original_id"
+  add_foreign_key "communication_website_portfolio_categories", "communication_website_portfolio_categories", column: "parent_id"
+  add_foreign_key "communication_website_portfolio_categories", "communication_websites"
+  add_foreign_key "communication_website_portfolio_categories", "languages"
+  add_foreign_key "communication_website_portfolio_categories", "universities"
+  add_foreign_key "communication_website_portfolio_projects", "communication_website_portfolio_projects", column: "original_id"
+  add_foreign_key "communication_website_portfolio_projects", "communication_websites"
+  add_foreign_key "communication_website_portfolio_projects", "languages"
+  add_foreign_key "communication_website_portfolio_projects", "universities"
+  add_foreign_key "communication_website_post_categories", "communication_website_post_categories", column: "original_id"
+  add_foreign_key "communication_website_post_categories", "communication_website_post_categories", column: "parent_id"
+  add_foreign_key "communication_website_post_categories", "communication_websites"
+  add_foreign_key "communication_website_post_categories", "education_programs", column: "program_id"
+  add_foreign_key "communication_website_post_categories", "languages"
+  add_foreign_key "communication_website_post_categories", "universities"
+  add_foreign_key "communication_website_posts", "communication_website_posts", column: "original_id"
   add_foreign_key "communication_website_posts", "communication_websites"
   add_foreign_key "communication_website_posts", "universities"
   add_foreign_key "communication_website_posts", "university_people", column: "author_id"
+  add_foreign_key "communication_websites", "languages", column: "default_language_id"
   add_foreign_key "communication_websites", "universities"
   add_foreign_key "education_academic_years", "universities"
   add_foreign_key "education_cohorts", "education_academic_years", column: "academic_year_id"
   add_foreign_key "education_cohorts", "education_programs", column: "program_id"
   add_foreign_key "education_cohorts", "education_schools", column: "school_id"
   add_foreign_key "education_cohorts", "universities"
+  add_foreign_key "education_diplomas", "education_diplomas", column: "original_id"
+  add_foreign_key "education_diplomas", "languages"
   add_foreign_key "education_diplomas", "universities"
+  add_foreign_key "education_programs", "education_programs", column: "original_id"
   add_foreign_key "education_programs", "education_programs", column: "parent_id"
+  add_foreign_key "education_programs", "languages"
   add_foreign_key "education_programs", "universities"
   add_foreign_key "education_schools", "universities"
+  add_foreign_key "emergency_messages", "universities"
   add_foreign_key "imports", "universities"
   add_foreign_key "imports", "users"
+  add_foreign_key "research_journal_paper_kinds", "languages"
+  add_foreign_key "research_journal_paper_kinds", "research_journal_paper_kinds", column: "original_id"
+  add_foreign_key "research_journal_paper_kinds", "research_journals", column: "journal_id"
+  add_foreign_key "research_journal_paper_kinds", "universities"
+  add_foreign_key "research_journal_papers", "languages"
+  add_foreign_key "research_journal_papers", "research_journal_paper_kinds", column: "kind_id"
+  add_foreign_key "research_journal_papers", "research_journal_papers", column: "original_id"
   add_foreign_key "research_journal_papers", "research_journal_volumes"
   add_foreign_key "research_journal_papers", "research_journals"
   add_foreign_key "research_journal_papers", "universities"
   add_foreign_key "research_journal_papers", "users", column: "updated_by_id"
   add_foreign_key "research_journal_papers_researchers", "research_journal_papers", column: "paper_id"
   add_foreign_key "research_journal_papers_researchers", "university_people", column: "researcher_id"
+  add_foreign_key "research_journal_volumes", "languages"
+  add_foreign_key "research_journal_volumes", "research_journal_volumes", column: "original_id"
   add_foreign_key "research_journal_volumes", "research_journals"
   add_foreign_key "research_journal_volumes", "universities"
+  add_foreign_key "research_journals", "languages"
   add_foreign_key "research_journals", "universities"
   add_foreign_key "research_laboratories", "universities"
   add_foreign_key "research_laboratory_axes", "research_laboratories"
@@ -874,15 +1554,32 @@ ActiveRecord::Schema.define(version: 2022_10_03_144016) do
   add_foreign_key "research_theses", "universities"
   add_foreign_key "research_theses", "university_people", column: "author_id"
   add_foreign_key "research_theses", "university_people", column: "director_id"
+  add_foreign_key "universities", "languages", column: "default_language_id"
+  add_foreign_key "university_apps", "universities"
+  add_foreign_key "university_organization_categories", "languages"
+  add_foreign_key "university_organization_categories", "universities"
+  add_foreign_key "university_organization_categories", "university_organization_categories", column: "original_id"
+  add_foreign_key "university_organizations", "languages"
   add_foreign_key "university_organizations", "universities"
+  add_foreign_key "university_organizations", "university_organizations", column: "original_id"
+  add_foreign_key "university_organizations_categories", "university_organization_categories", column: "category_id"
+  add_foreign_key "university_organizations_categories", "university_organizations", column: "organization_id"
+  add_foreign_key "university_people", "languages"
   add_foreign_key "university_people", "universities"
+  add_foreign_key "university_people", "university_people", column: "original_id"
   add_foreign_key "university_people", "users"
+  add_foreign_key "university_people_categories", "university_people", column: "person_id"
+  add_foreign_key "university_people_categories", "university_person_categories", column: "category_id"
+  add_foreign_key "university_person_categories", "languages"
+  add_foreign_key "university_person_categories", "universities"
+  add_foreign_key "university_person_categories", "university_person_categories", column: "original_id"
   add_foreign_key "university_person_experiences", "universities"
   add_foreign_key "university_person_experiences", "university_organizations", column: "organization_id"
   add_foreign_key "university_person_experiences", "university_people", column: "person_id"
   add_foreign_key "university_person_involvements", "universities"
   add_foreign_key "university_person_involvements", "university_people", column: "person_id"
   add_foreign_key "university_roles", "universities"
+  add_foreign_key "user_favorites", "users"
   add_foreign_key "users", "languages"
   add_foreign_key "users", "universities"
 end
diff --git a/test/models/communication/website/dependency_test.rb b/test/models/communication/website/dependency_test.rb
index 51c10a38c2a143fc1ed993869dd7914df945e9f9..aba463b7e3a86dda9c198138e14230aba0ffcac9 100644
--- a/test/models/communication/website/dependency_test.rb
+++ b/test/models/communication/website/dependency_test.rb
@@ -50,7 +50,7 @@ class Communication::Website::DependencyTest < ActiveSupport::TestCase
     # - une tâche de nettoyage des git files (dépendances du bloc supprimé)
     GoodJob::Job.destroy_all
 
-    assert_enqueued_with(job: Communication::Website::DirectObject::SyncWithGitJob, args: [page]) do
+    assert_enqueued_with(job: Communication::Website::DirectObject::SyncWithGitJob, args: [page.communication_website_id, direct_object: page]) do
       assert_enqueued_with(job: Communication::Website::CleanJob) do
         block.destroy
       end