From defdef430ef965be9cd54dc7ceb3da56f5444883 Mon Sep 17 00:00:00 2001
From: pabois <pierreandre.boissinot@noesya.coop>
Date: Fri, 9 Feb 2024 18:16:47 +0100
Subject: [PATCH] some changes on server screens & all server texts in locales

---
 .../server/websites/batch-sync-themes.js      |   2 +-
 app/controllers/server/blocks_controller.rb   |   9 +-
 .../server/dashboard_controller.rb            |   8 +-
 .../server/emergency_messages_controller.rb   |   3 +-
 .../server/languages_controller.rb            |   3 +
 .../server/universities_controller.rb         |   4 +-
 app/controllers/server/websites_controller.rb |  25 ++--
 app/models/communication/website.rb           |   8 --
 .../website/with_git_repository.rb            |   3 +
 .../communication/website/with_theme.rb       |  13 ++
 app/models/emergency_message.rb               |   2 +
 app/services/filters/server/websites.rb       |  36 ++++--
 app/services/git/providers/github.rb          |   2 +-
 app/services/osuny/theme_info.rb              |  17 +++
 app/views/server/blocks/index.html.erb        |   6 +-
 app/views/server/blocks/show.html.erb         |  51 +++++---
 app/views/server/dashboard/index.html.erb     |  10 +-
 .../server/emergency_messages/index.html.erb  |   9 +-
 .../server/emergency_messages/show.html.erb   |   4 +-
 app/views/server/languages/index.html.erb     |   6 +-
 app/views/server/universities/_form.html.erb  |   2 +-
 app/views/server/universities/index.html.erb  |  22 ++--
 app/views/server/universities/show.html.erb   |   8 +-
 app/views/server/websites/_list.html.erb      |  38 ++++--
 app/views/server/websites/edit.html.erb       |   9 +-
 app/views/server/websites/index.html.erb      |  12 +-
 .../server/websites/manage_versions.html.erb  |  68 ----------
 app/views/server/websites/show.html.erb       |  21 ++--
 config/application.sample.yml                 |  41 +++----
 config/locales/communication/en.yml           | 116 +++++++++---------
 config/locales/communication/fr.yml           | 116 +++++++++---------
 config/locales/en.yml                         |  21 ----
 config/locales/fr.yml                         |  21 ----
 config/locales/server_admin/en.yml            |  69 +++++++++++
 config/locales/server_admin/fr.yml            |  69 +++++++++++
 config/locales/university/en.yml              |   5 -
 config/locales/university/fr.yml              |   5 -
 config/routes/server.rb                       |   1 -
 db/schema.rb                                  |  74 +++++------
 39 files changed, 540 insertions(+), 399 deletions(-)
 create mode 100644 app/services/osuny/theme_info.rb
 delete mode 100644 app/views/server/websites/manage_versions.html.erb
 create mode 100644 config/locales/server_admin/en.yml
 create mode 100644 config/locales/server_admin/fr.yml

diff --git a/app/assets/javascripts/server/websites/batch-sync-themes.js b/app/assets/javascripts/server/websites/batch-sync-themes.js
index d0a0be0b9..2bf80067a 100644
--- a/app/assets/javascripts/server/websites/batch-sync-themes.js
+++ b/app/assets/javascripts/server/websites/batch-sync-themes.js
@@ -25,7 +25,7 @@ window.osuny.websites.batchSyncThemes = {
 
 window.addEventListener('DOMContentLoaded', function () {
     'use strict';
-    if (document.body.classList.contains('websites-manage_versions')) {
+    if (document.body.classList.contains('websites-index')) {
         window.osuny.websites.batchSyncThemes.init();
     }
 });
diff --git a/app/controllers/server/blocks_controller.rb b/app/controllers/server/blocks_controller.rb
index 73e756470..0b9da835e 100644
--- a/app/controllers/server/blocks_controller.rb
+++ b/app/controllers/server/blocks_controller.rb
@@ -1,19 +1,21 @@
 class Server::BlocksController < Server::ApplicationController
+  
   before_action :load_template, except: [:index]
 
   def index
-    @templates = Communication::Block.template_kinds.keys
+    @templates = Kaminari.paginate_array(Communication::Block.template_kinds.keys.sort_by { |k| t("enums.communication.block.template_kind.#{k}") }).page(params[:page])
     breadcrumb
   end
 
   def show
+    @blocks = @blocks.page(params[:page])
     breadcrumb
     add_breadcrumb t("enums.communication.block.template_kind.#{@template}")
   end
 
   def resave
-    @blocks.find_each &:save
-    redirect_to server_block_path(@template), notice: "#{@blocks.count} blocks saved"
+    @blocks.find_each(&:save)
+    redirect_back fallback_location: server_block_path(@template), notice: t('server_admin.blocks.blocks_saved', count: @blocks.count)
   end
 
   protected
@@ -27,4 +29,5 @@ class Server::BlocksController < Server::ApplicationController
     super
     add_breadcrumb Communication::Block.model_name.human(count: 2), server_blocks_path
   end
+  
 end
diff --git a/app/controllers/server/dashboard_controller.rb b/app/controllers/server/dashboard_controller.rb
index e52c6bfa9..39e3ed86d 100644
--- a/app/controllers/server/dashboard_controller.rb
+++ b/app/controllers/server/dashboard_controller.rb
@@ -1,16 +1,18 @@
 class Server::DashboardController < Server::ApplicationController
+
   def index
     @parts = [
       {
-        title: "#{University.count} #{University.model_name.human(count: 2).downcase}",
+        title: "#{University.count} #{University.model_name.human(count: University.count).downcase}",
         path: server_universities_path
       },
       {
-        title: "#{Communication::Website.count} #{Communication::Website.model_name.human(count: 2).downcase}",
+        title: "#{Communication::Website.count} #{Communication::Website.model_name.human(count: Communication::Website.count).downcase}",
         path: server_websites_path
       }
     ]
-    @websites = Communication::Website.updatable_theme.ordered
+    @websites = Communication::Website.for_older_theme_version(Osuny::ThemeInfo.getCurrentVersion).ordered
     breadcrumb
   end
+  
 end
diff --git a/app/controllers/server/emergency_messages_controller.rb b/app/controllers/server/emergency_messages_controller.rb
index 923993508..aa0de711b 100644
--- a/app/controllers/server/emergency_messages_controller.rb
+++ b/app/controllers/server/emergency_messages_controller.rb
@@ -1,8 +1,9 @@
 class Server::EmergencyMessagesController < Server::ApplicationController
+  
   load_and_authorize_resource
 
   def index
-    @emergency_messages = @emergency_messages.reorder(created_at: :desc)
+    @emergency_messages = @emergency_messages.ordered.page(params[:page])
     breadcrumb
   end
 
diff --git a/app/controllers/server/languages_controller.rb b/app/controllers/server/languages_controller.rb
index c1920985e..afe261e61 100644
--- a/app/controllers/server/languages_controller.rb
+++ b/app/controllers/server/languages_controller.rb
@@ -1,7 +1,9 @@
 class Server::LanguagesController < Server::ApplicationController
+
   load_and_authorize_resource
 
   def index
+    @languages = @languages.ordered.page(params[:page])
     breadcrumb
   end
 
@@ -59,4 +61,5 @@ class Server::LanguagesController < Server::ApplicationController
   def language_params
     params.require(:language).permit(:name, :iso_code, :summernote_locale)
   end
+  
 end
diff --git a/app/controllers/server/universities_controller.rb b/app/controllers/server/universities_controller.rb
index 79433bfcd..09b66f114 100644
--- a/app/controllers/server/universities_controller.rb
+++ b/app/controllers/server/universities_controller.rb
@@ -1,8 +1,9 @@
 class Server::UniversitiesController < Server::ApplicationController
+
   load_and_authorize_resource
 
   def index
-    @universities = @universities.ordered
+    @universities = @universities.ordered.page(params[:page])
     breadcrumb
   end
 
@@ -67,4 +68,5 @@ class Server::UniversitiesController < Server::ApplicationController
       :is_really_a_university
     )
   end
+  
 end
diff --git a/app/controllers/server/websites_controller.rb b/app/controllers/server/websites_controller.rb
index b118fd306..5fb758131 100644
--- a/app/controllers/server/websites_controller.rb
+++ b/app/controllers/server/websites_controller.rb
@@ -1,6 +1,7 @@
 class Server::WebsitesController < Server::ApplicationController
-  before_action :load_websites, only: [:index, :manage_versions, :clean_and_rebuild_all_websites]
-  before_action :load_website, except: [:index, :manage_versions, :clean_and_rebuild_all_websites]
+
+  before_action :load_websites, only: [:index, :clean_and_rebuild_all_websites]
+  before_action :load_website, except: [:index, :clean_and_rebuild_all_websites]
 
   has_scope :for_theme_version
   has_scope :for_production
@@ -9,21 +10,15 @@ class Server::WebsitesController < Server::ApplicationController
   has_scope :for_updatable_theme
 
   def index
+    @websites = @websites.ordered.page(params[:page]).per(100)
     breadcrumb
   end
 
-  def manage_versions
-    @websites = @websites.with_repository.with_url
-    load_filters
-    breadcrumb
-    add_breadcrumb "Gestion des versions"
-  end
-
   def clean_and_rebuild_all_websites
     @websites.find_each do |website|
       website.clean_and_rebuild
     end
-    redirect_back(fallback_location: manage_versions_server_websites_path, notice: t('server_admin.websites.clean_and_rebuild_all_websites_notice'))
+    redirect_back(fallback_location: server_websites_path, notice: t('server_admin.websites.clean_and_rebuild_all_websites_notice'))
   end
 
   def sync_theme_version
@@ -36,7 +31,11 @@ class Server::WebsitesController < Server::ApplicationController
 
   def show
     breadcrumb
-    add_breadcrumb @website
+  end
+
+  def edit
+    breadcrumb
+    add_breadcrumb t('edit')
   end
 
   def update
@@ -50,6 +49,9 @@ class Server::WebsitesController < Server::ApplicationController
   def breadcrumb
     super
     add_breadcrumb Communication::Website.model_name.human(count: 2), server_websites_path
+    if @website
+      add_breadcrumb @website, server_website_path(@website)
+    end
   end
 
   def load_websites
@@ -59,4 +61,5 @@ class Server::WebsitesController < Server::ApplicationController
   def load_website
     @website = Communication::Website.find params[:id]
   end
+
 end
diff --git a/app/models/communication/website.rb b/app/models/communication/website.rb
index cac6e7952..3e195c5de 100644
--- a/app/models/communication/website.rb
+++ b/app/models/communication/website.rb
@@ -88,7 +88,6 @@ class Communication::Website < ApplicationRecord
   scope :ordered, -> { order(:name) }
   scope :in_production, -> { where(in_production: true) }
   scope :for_production, -> (production) { where(in_production: production) }
-  scope :for_theme_version, -> (version) { where(theme_version: version) }
   scope :for_search_term, -> (term) {
     where("
       unaccent(communication_websites.name) ILIKE unaccent(:term) OR
@@ -96,15 +95,8 @@ class Communication::Website < ApplicationRecord
     ", term: "%#{sanitize_sql_like(term)}%")
   }
   scope :for_update, -> (autoupdate) { where(autoupdate_theme: autoupdate) }
-  scope :for_updatable_theme, -> (status) { updatable_theme if status == 'true' }
-  scope :with_repository, -> { where.not(repository: [nil, '']) }
   scope :with_url, -> { where.not(url: [nil, '']) }
   scope :with_access_token, -> { where.not(access_token: [nil, '']) }
-  scope :updatable_theme, -> {
-    with_repository.
-    with_url.
-    with_access_token
-  }
 
   def to_s
     "#{name}"
diff --git a/app/models/communication/website/with_git_repository.rb b/app/models/communication/website/with_git_repository.rb
index ba361574d..b384f932c 100644
--- a/app/models/communication/website/with_git_repository.rb
+++ b/app/models/communication/website/with_git_repository.rb
@@ -7,6 +7,9 @@ module Communication::Website::WithGitRepository
              dependent: :destroy
 
     after_save :destroy_obsolete_git_files, if: :should_clean_on_git?
+
+    scope :with_repository, -> { where.not(repository: [nil, '']) }
+
   end
 
   def git_repository
diff --git a/app/models/communication/website/with_theme.rb b/app/models/communication/website/with_theme.rb
index 32416661a..b76d364f9 100644
--- a/app/models/communication/website/with_theme.rb
+++ b/app/models/communication/website/with_theme.rb
@@ -5,6 +5,15 @@ module Communication::Website::WithTheme
     scope :with_automatic_update, -> { where(autoupdate_theme: true) }
     scope :with_manual_update, -> { where(autoupdate_theme: false) }
 
+    scope :for_theme_version, -> (version) { where(theme_version: version) }
+    scope :for_older_theme_version, -> (version) { where.not(theme_version: version) }
+    scope :for_updatable_theme, -> (status) { updatable_theme if status == 'true' }
+    scope :updatable_theme, -> {
+      with_repository.
+      with_url.
+      with_access_token
+    }
+
     def self.autoupdate_websites
       Communication::Website.with_automatic_update.find_each do |website|
         website.update_theme_version
@@ -21,6 +30,10 @@ module Communication::Website::WithTheme
     "#{url}/osuny-theme-version"
   end
 
+  def theme_updatable?
+    repository.present? && url.present? && access_token.present?
+  end
+
   protected
 
   def current_theme_version
diff --git a/app/models/emergency_message.rb b/app/models/emergency_message.rb
index 7419fb1c2..f482c6b5c 100644
--- a/app/models/emergency_message.rb
+++ b/app/models/emergency_message.rb
@@ -28,6 +28,8 @@ class EmergencyMessage < ApplicationRecord
 
   validates :name, :subject_fr, :subject_en, :content_fr, :content_en, presence: true
 
+  scope :ordered, -> { order(created_at: :desc) }
+
   def deliver!
     users_fr = target.where(language_id: Language.find_by(iso_code: 'fr').id)
     users_fr.each do |user|
diff --git a/app/services/filters/server/websites.rb b/app/services/filters/server/websites.rb
index ae3d8081d..ffc0ca85f 100644
--- a/app/services/filters/server/websites.rb
+++ b/app/services/filters/server/websites.rb
@@ -5,16 +5,36 @@ module Filters
       add_search
       add :for_theme_version,
           ::Communication::Website.all.pluck(:theme_version).uniq.sort,
-          'Filtrer par version du thème'
-      add :for_production,
-          [{ to_s: I18n.t('true'), id: 'true' }, { to_s: I18n.t('false'), id: 'false' }],
-          'Filtrer par état de production'
+          I18n.t(
+            'filters.attributes.element',
+            element: I18n.t('server_admin.websites.theme_version').downcase
+          )
+          add :for_production,
+          [
+            { to_s: I18n.t('true'), id: 'true' }, 
+            { to_s: I18n.t('false'), id: 'false' }
+          ],
+          I18n.t(
+            'filters.attributes.element',
+            element: I18n.t('server_admin.websites.production_status').downcase
+          )
       add :for_update,
-          [{ to_s: 'Automatique', id: 'true' }, { to_s: 'Manuelle', id: 'false' }],
-          'Filtrer par mode de mise à jour'
+          [
+            { to_s: I18n.t('server_admin.websites.autoupdate_theme.true'), id: 'true' }, 
+            { to_s:  I18n.t('server_admin.websites.autoupdate_theme.false'), id: 'false' }
+          ],
+          I18n.t(
+            'filters.attributes.element',
+            element: I18n.t('server_admin.websites.update_mode').downcase
+          )
       add :for_updatable_theme,
-          [{ to_s: 'Mise à jour automatique possible', id: 'true' }],
-          'Filtrer par capacité de mise à jour automatique'
+          [
+            { to_s: I18n.t('server_admin.websites.updatable_theme_filter.value'), id: 'true' }
+          ],
+          I18n.t(
+            'filters.attributes.element',
+            element: I18n.t('server_admin.websites.updatable_theme_filter.element').downcase
+          )
 
     end
   end
diff --git a/app/services/git/providers/github.rb b/app/services/git/providers/github.rb
index ac7e7c7e5..7727d65e8 100644
--- a/app/services/git/providers/github.rb
+++ b/app/services/git/providers/github.rb
@@ -124,7 +124,7 @@ class Git::Providers::Github < Git::Providers::Abstract
   end
 
   def current_theme_sha
-    @current_theme_sha ||= client.branch(ENV["GITHUB_WEBSITE_THEME_REPOSITORY"], ENV["GITHUB_WEBSITE_THEME_BRANCH"])[:commit][:sha]
+    @current_theme_sha ||= Osuny::ThemeInfo.getCurrentSha
   end
 
   def tree_item_at_path(path)
diff --git a/app/services/osuny/theme_info.rb b/app/services/osuny/theme_info.rb
new file mode 100644
index 000000000..c077ccece
--- /dev/null
+++ b/app/services/osuny/theme_info.rb
@@ -0,0 +1,17 @@
+class Osuny::ThemeInfo
+
+  def self.getCurrentVersion
+    @last_version ||= client.releases(ENV["GITHUB_WEBSITE_THEME_REPOSITORY"]).first[:tag_name]
+  end
+
+  def self.getCurrentSha
+    @current_theme_sha ||= client.branch(ENV["GITHUB_WEBSITE_THEME_REPOSITORY"], ENV["GITHUB_WEBSITE_THEME_BRANCH"])[:commit][:sha]
+  end
+
+  private
+
+  def self.client
+    @client ||= Octokit::Client.new access_token: ENV["GITHUB_ACCESS_TOKEN"]
+  end
+
+end
diff --git a/app/views/server/blocks/index.html.erb b/app/views/server/blocks/index.html.erb
index e4c4deb89..81969b96e 100644
--- a/app/views/server/blocks/index.html.erb
+++ b/app/views/server/blocks/index.html.erb
@@ -4,8 +4,8 @@
   <table class="<%= table_classes %>">
     <thead>
       <tr>
-        <th><%= Communication::Block.human_attribute_name('name') %></th>
-        <th><%= Communication::Block.human_attribute_name('quantity') %></th>
+        <th><%= t('server_admin.blocks.title') %></th>
+        <th><%= t('server_admin.blocks.quantity') %></th>
       </tr>
     </thead>
     <tbody>
@@ -18,3 +18,5 @@
     </tbody>
   </table>
 </div>
+
+<%= paginate @templates, theme: 'bootstrap-5' %>
\ No newline at end of file
diff --git a/app/views/server/blocks/show.html.erb b/app/views/server/blocks/show.html.erb
index d38c9a304..43dc9ba79 100644
--- a/app/views/server/blocks/show.html.erb
+++ b/app/views/server/blocks/show.html.erb
@@ -4,43 +4,60 @@
   <table class="<%= table_classes %>">
     <thead>
       <tr>
-        <th><%= Communication::Block.human_attribute_name('name') %></th>
-        <th><%= Communication::Block.human_attribute_name('about') %></th>
-        <th><%= Communication::Block.human_attribute_name('data') %></th>
-        <th><%= Communication::Block.human_attribute_name('university') %></th>
-        <th><%= Communication::Block.human_attribute_name('url') %></th>
+        <th><%= t('server_admin.blocks.title') %></th>
+        <th><%= t('server_admin.blocks.about') %></th>
+        <th><%= t('server_admin.blocks.data') %></th>
+        <th><%= University.model_name.human %></th>
+        <th><%= t('server_admin.blocks.url') %></th>
       </tr>
     </thead>
     <tbody>
       <% @blocks.each do |block| %>
-        <% next if block.about.nil?%>
-        <% url = "#{block.about.university.url }#{edit_admin_communication_block_path(block)}" %>
         <tr>
           <td>
             <%= truncate "#{block}" %><br>
             <small><%= block.id %></small>
           </td>
           <td>
-            <%= truncate "#{block.about}" %>
-            <span class="badge bg-dark">
-              <%= block.about.class.model_name.human %>
-            </span>
+            <% if block.about.present? %>
+              <%= truncate "#{block.about}" %>
+              <span class="badge bg-dark">
+                <%= block.about.class.model_name.human %>
+              </span>
+            <% end %>
+          </td>
+          <td class="pe-3" width="600">
+            <%= link_to t('server_admin.blocks.see'), 
+                        "#collpase-#{block.id}", 
+                        class: 'btn btn-xs btn-light', 
+                        role: 'button', 
+                        'data-bs-toggle': 'collapse', 
+                        'aria-expanded': 'false', 
+                        'aria-controls': "collpase-#{block.id}" %>
+            <div class="collapse" id="collpase-<%= block.id %>">
+              <textarea rows="10" class="form-control"><%= block.data %></textarea>
+            </div>
+          </td>
+          <td>
+            <%= link_to block.university, [:server, block.university] %>
           </td>
           <td>
-            <textarea rows="1" class="form-control"><%= block.data %></textarea>
+            <% url = "#{block.university.url }#{edit_admin_communication_block_path(block)}" %>
+            <%= link_to t('server_admin.blocks.open'),
+                        url,
+                        target: :_blank %>
           </td>
-          <td><%= block.about.university %></td>
-          <td><%= link_to 'Open',
-                          url,
-                          target: :_blank %></td>
         </tr>
       <% end %>
     </tbody>
   </table>
 </div>
 
+<%= paginate @blocks, theme: 'bootstrap-5' %>
+
+
 <% content_for :action_bar_right do %>
-  <%= link_to t('resave'),
+  <%= link_to t('server_admin.blocks.resave'),
               resave_server_block_path(@template),
               method: :post,
               class: button_classes %>
diff --git a/app/views/server/dashboard/index.html.erb b/app/views/server/dashboard/index.html.erb
index d112c6976..4a5643e33 100644
--- a/app/views/server/dashboard/index.html.erb
+++ b/app/views/server/dashboard/index.html.erb
@@ -4,12 +4,14 @@
   <% @parts.each do |part| %>
     <div class="col-md-6 d-flex">
       <%= osuny_panel part[:title] do %>
-        <%= link_to 'Voir la liste', part[:path], class: 'btn btn-sm btn-primary stretched-link' %>
+        <%= link_to t('server_admin.see_list'), part[:path], class: 'btn btn-sm btn-primary stretched-link' %>
       <% end %>
     </div>
   <% end %>
 </div>
 
-<%= osuny_panel 'Monitoring' do %>
-  <%= render 'server/websites/list', websites: @websites %>
-<% end %>
+<% if @websites.any? %>
+  <%= osuny_panel t('server_admin.websites.outdated') do %>
+    <%= render 'server/websites/list', websites: @websites %>
+  <% end %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/server/emergency_messages/index.html.erb b/app/views/server/emergency_messages/index.html.erb
index 7948651c2..7df1f2992 100644
--- a/app/views/server/emergency_messages/index.html.erb
+++ b/app/views/server/emergency_messages/index.html.erb
@@ -14,15 +14,15 @@
       <% @emergency_messages.each do |emergency_message| %>
         <tr>
           <td><%= link_to emergency_message, [:server, emergency_message] %></td>
-          <td><%= l emergency_message.delivered_at if emergency_message.delivered? %></td>
+          <td><%= l(emergency_message.delivered_at) if emergency_message.delivered? %></td>
           <td class="text-end">
             <div class="btn-group" role="group">
               <% unless emergency_message.delivered? %>
                 <%= link_to t('edit'),
-                          edit_server_emergency_message_path(emergency_message),
+                          [:edit, :server, emergency_message],
                           class: button_classes %>
                 <%= link_to t('delete'),
-                          server_emergency_message_path(emergency_message),
+                          [:server, emergency_message],
                           method: :delete,
                           data: { confirm: t('please_confirm') },
                           class: button_classes_danger %>
@@ -35,6 +35,9 @@
   </table>
 </div>
 
+<%= paginate @emergency_messages, theme: 'bootstrap-5' %>
+
+
 <% content_for :action_bar_right do %>
   <%= link_to t('create'), new_server_emergency_message_path, class: button_classes %>
 <% end %>
diff --git a/app/views/server/emergency_messages/show.html.erb b/app/views/server/emergency_messages/show.html.erb
index 8da1a471d..092d4cfb7 100644
--- a/app/views/server/emergency_messages/show.html.erb
+++ b/app/views/server/emergency_messages/show.html.erb
@@ -46,9 +46,9 @@
 
 <% content_for :action_bar_right do %>
   <% unless @emergency_message.delivered? %>
-    <%= link_to t('edit'), edit_server_emergency_message_path(@emergency_message), class: button_classes %>
+    <%= link_to t('edit'), [:edit, :server, @emergency_message], class: button_classes %>
     <%= link_to t('server_admin.emergency_messages.deliver'), 
-                deliver_server_emergency_message_path(@emergency_message), 
+                 [:deliver, :server, @emergency_message], 
                 method: :post,
                 data: { confirm: t('please_confirm') },
                 class: button_classes %>
diff --git a/app/views/server/languages/index.html.erb b/app/views/server/languages/index.html.erb
index 61989513b..73ef81ba0 100644
--- a/app/views/server/languages/index.html.erb
+++ b/app/views/server/languages/index.html.erb
@@ -20,10 +20,10 @@
           <td class="text-end">
             <div class="btn-group" role="group">
               <%= link_to t('edit'),
-                        edit_server_language_path(language),
+                        [:edit, :server, language],
                         class: button_classes %>
               <%= link_to t('delete'),
-                        server_language_path(language),
+                        [:server, language],
                         method: :delete,
                         data: { confirm: t('please_confirm') },
                         class: button_classes_danger %>
@@ -35,6 +35,8 @@
   </table>
 </div>
 
+<%= paginate @languages, theme: 'bootstrap-5' %>
+
 <% content_for :action_bar_right do %>
   <%= link_to t('create'), new_server_language_path, class: button_classes %>
 <% end %>
diff --git a/app/views/server/universities/_form.html.erb b/app/views/server/universities/_form.html.erb
index ddc64561c..e539bb0b4 100644
--- a/app/views/server/universities/_form.html.erb
+++ b/app/views/server/universities/_form.html.erb
@@ -51,7 +51,7 @@
     </div>
   </div>
 
-  <h3 class="mt-5"><%= t('university.invoice_informations') %></h3>
+  <h3 class="mt-5"><%= t('server_admin.universities.invoice_informations') %></h3>
   <div class="row">
     <div class="col-md-4">
       <%= f.input :invoice_date %>
diff --git a/app/views/server/universities/index.html.erb b/app/views/server/universities/index.html.erb
index f87777875..3321d3265 100644
--- a/app/views/server/universities/index.html.erb
+++ b/app/views/server/universities/index.html.erb
@@ -1,8 +1,7 @@
 <% content_for :title, "#{ @universities.count} #{University.model_name.human(count:  @universities.count).downcase}" %>
 
 <p>
-  <%= University.contributing.count %>
-  <%= t('university.contributing', count: University.contributing.count) %>
+  <%= t('server_admin.universities.contributing', count: University.contributing.count) %>
 </p>
 
 <div class="table-responsive">
@@ -23,14 +22,17 @@
         <tr>
           <td><%= link_to university, [:server, university] %></td>
           <td><%= link_to university.url, university.url, target: :_blank %></td>
-          <td><%= t university.is_really_a_university %></td>
-          <td><%= university.private ? University.human_attribute_name('private') : University.human_attribute_name('public') %></td>
-          <% if university.contribution_amount.blank? %>
+          <td><%= t(university.is_really_a_university?) %></td>
+          <td>
+            <%= university.private ? University.human_attribute_name('private') : 
+                                     University.human_attribute_name('public') %>
+          </td>
+          <% if university.contribution_amount.to_i.zero? %>
             <td></td>
             <td></td>
           <% else %>
             <td class="<%= university.invoice_proximity.blank? ? '' : "table-#{university.invoice_proximity}" %>">
-              <%= l university.invoice_date, format: "%d %B" if university.invoice_date %>
+              <%= l(university.invoice_date, format: "%d %B") if university.invoice_date %>
             </td>
             <td class="<%= university.invoice_proximity.blank? ? '' : "table-#{university.invoice_proximity}" %>">
               <%= number_to_currency university.contribution_amount, precision: 0 %>
@@ -39,10 +41,10 @@
           <td class="text-end">
             <div class="btn-group" role="group">
               <%= link_to t('edit'),
-                        edit_server_university_path(university),
+                        [:edit, :server, university],
                         class: button_classes %>
               <%= link_to t('delete'),
-                        server_university_path(university),
+                        [:server, university],
                         method: :delete,
                         data: { confirm: t('please_confirm') },
                         class: button_classes_danger %>
@@ -53,13 +55,15 @@
     </tbody>
     <tfoot>
       <tr>
-        <th class="text-start" colspan="5"><%= t('university.contributions_total') %></th>
+        <th class="text-start" colspan="5"><%= t('server_admin.universities.contributions_total') %></th>
         <td class="text-start" colspan="2"><%= number_to_currency University.sum(:contribution_amount), precision: 0 %></td>
       </tr>
     </tfoot>
   </table>
 </div>
 
+<%= paginate @universities, theme: 'bootstrap-5' %>
+
 <% content_for :action_bar_right do %>
   <%= link_to t('create'), new_server_university_path, class: button_classes %>
 <% end %>
diff --git a/app/views/server/universities/show.html.erb b/app/views/server/universities/show.html.erb
index 4a8ff6ea5..c696722b5 100644
--- a/app/views/server/universities/show.html.erb
+++ b/app/views/server/universities/show.html.erb
@@ -13,13 +13,13 @@
             <td class="text-end"><%= t @university.public_send attribute %></td>
           </tr>
         <% end %>
-        <% unless @university.contribution_amount.blank? %>
+        <% unless @university.contribution_amount.to_i.zero? %>
           <tr class="<%= @university.invoice_proximity.blank? ? '' : "table-#{@university.invoice_proximity}" %>">
-            <td><%= t('activerecord.attributes.university.invoice_date') %></td>
+            <td><%= University.human_attribute_name('invoice_date') %></td>
             <td class="text-end"><%= l @university.invoice_date, format: "%d %B" %></td>
           </tr>
           <tr class="<%= @university.invoice_proximity.blank? ? '' : "table-#{@university.invoice_proximity}" %>">
-            <td><%= t('activerecord.attributes.university.contribution_amount') %></td>
+            <td><%= University.human_attribute_name('contribution_amount') %></td>
             <td class="text-end"><%= number_to_currency @university.contribution_amount, precision: 0 %></td>
           </tr>
         <% end %>
@@ -41,7 +41,7 @@
 </div>
 
 <h2 class="mt-5 h3"><%= Communication::Website.model_name.human(count: @university.websites.count) %></h2>
-<%= render 'server/websites/list', websites: @university.websites %>
+<%= render 'server/websites/list', websites: @university.websites.ordered %>
 
 <% content_for :action_bar_right do %>
   <%= link_to t('edit'), edit_server_university_path(@university), class: button_classes %>
diff --git a/app/views/server/websites/_list.html.erb b/app/views/server/websites/_list.html.erb
index a033585a9..cf4be94e0 100644
--- a/app/views/server/websites/_list.html.erb
+++ b/app/views/server/websites/_list.html.erb
@@ -4,10 +4,13 @@
       <tr>
         <th><%= Communication::Website.human_attribute_name('name') %></th>
         <th><%= University.model_name.human %></th>
-        <th>Back-office</th>
-        <th>Site</th>
-        <th colspan="2">Référentiel Git</th>
-        <th>Version</th>
+        <th><%= t('server_admin.websites.back_office') %></th>
+        <th><%= Communication::Website.human_attribute_name('url') %></th>
+        <th><%= t('server_admin.websites.git_repo.full') %></th>
+        <th><%= t('server_admin.websites.update_mode') %></th>
+        <th><%= t('server_admin.websites.git_repo.status') %></th>
+        <th><%= t('server_admin.websites.theme_version') %></th>
+        <th></th>
       </tr>
     </thead>
     <tbody>
@@ -15,29 +18,44 @@
         <tr id="website-<%= website.id %>">
           <td>
             <%= link_to website.name, server_website_path(website) %>
-            <% if website.in_production %>
-              <span class="badge bg-success">Prod</span>
+            <% if website.in_production? %>
+              <span class="badge bg-success"><%= t('server_admin.websites.production') %></span>
             <% end %>
           </td>
           <td><%= link_to website.university,
                           [:server, website.university] %></td>
-          <td><%= link_to 'Admin',
+          <td><%= link_to t('server_admin.websites.admin'),
                           admin_communication_website_url(website, host: website.university.url),
                           target: :_blank,
                           class: 'btn btn-xs btn-light' %></td>
-          <td><%= link_to 'Site',
+          <td><%= link_to Communication::Website.human_attribute_name('url'),
                           website.url,
                           target: :_blank,
                           class: 'btn btn-xs btn-light' if website.url.present? %></td>
-          <td><%= link_to 'Référentiel',
+          <td><%= link_to t('server_admin.websites.git_repo.short'),
                           website.repository_url,
                           target: :_blank,
                           class: 'btn btn-xs btn-light' if website.repository.present? %></td>
+          <td><%= t("server_admin.websites.autoupdate_theme.#{website.autoupdate_theme?}") %></td>
           <td><%= image_tag website.deployment_status_badge,
                             alt: '' if website.deployment_status_badge.present? %></td>
-          <td>
+          <td class="js-version">
             <%= website.theme_version %>
           </td>
+          <td>
+            <% if website.url.present? %>
+              <%= link_to t('server_admin.websites.buttons.theme.sync'),
+                          sync_theme_version_server_website_path(website),
+                          method: :post,
+                          remote: true,
+                          class: "#{button_classes} js-sync-theme-version" if website.theme_updatable? %>
+              <%= link_to t('server_admin.websites.buttons.theme.update'),
+                          update_theme_server_website_path(website),
+                          method: :post,
+                          remote: true,
+                          class: button_classes if website.github? %>
+            <% end %>
+          </td>
         </tr>
       <% end %>
     </tbody>
diff --git a/app/views/server/websites/edit.html.erb b/app/views/server/websites/edit.html.erb
index 612786613..3d66bf10a 100644
--- a/app/views/server/websites/edit.html.erb
+++ b/app/views/server/websites/edit.html.erb
@@ -1,9 +1,16 @@
 <% content_for :title, @website %>
+
 <%= simple_form_for @website, url: server_website_path(@website) do |f| %>
   <%= f.error_notification %>
   <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
 
-  <%= f.association :university, include_blank: false %>
+  <div class="row">
+    <div class="col-md-6">
+      <%= f.association :university, 
+                        include_blank: false,
+                        collection: University.ordered %>
+    </div>
+  </div>
 
   <% content_for :action_bar_right do %>
     <%= submit f %>
diff --git a/app/views/server/websites/index.html.erb b/app/views/server/websites/index.html.erb
index 5bed945b6..3fbe806b3 100644
--- a/app/views/server/websites/index.html.erb
+++ b/app/views/server/websites/index.html.erb
@@ -1,6 +1,6 @@
 <% content_for :title, "#{@websites.count} #{Communication::Website.model_name.human(count: @websites.count).downcase}" %>
 
-<p><%= @websites.in_production.count %> en production</p>
+<p><%= t('server_admin.websites.in_production', count: @websites.in_production.count) %></p>
 
 <%= render  'admin/application/filters',
             current_path: server_websites_path,
@@ -8,8 +8,14 @@
 
 <%= render 'server/websites/list', websites: @websites %>
 
+<%= paginate @websites, theme: 'bootstrap-5' %>
+
 <% content_for :action_bar_left do %>
-  <%= link_to "Gestion des versions",
-              manage_versions_server_websites_path,
+  <%= link_to t('server_admin.websites.update_all_themes'),
+              "#",
+              class: "#{button_classes} js-sync-all-theme-versions" %>
+  <%= link_to t('server_admin.websites.force_clean_and_rebuild'),
+              clean_and_rebuild_all_websites_server_websites_path(current_scopes),
+              method: :post,
               class: button_classes %>
 <% end %>
\ No newline at end of file
diff --git a/app/views/server/websites/manage_versions.html.erb b/app/views/server/websites/manage_versions.html.erb
deleted file mode 100644
index 90eb99a75..000000000
--- a/app/views/server/websites/manage_versions.html.erb
+++ /dev/null
@@ -1,68 +0,0 @@
-<% content_for :title, "Gestion des versions" %>
-
-<p><%= @websites.in_production.count %> en production</p>
-
-<%= render  'admin/application/filters',
-            current_path: manage_versions_server_websites_path,
-            filters: @filters if @filters.any? %>
-
-<div class="table-responsive">
-  <table class="<%= table_classes %> table-hover">
-    <thead>
-      <tr>
-        <th><%= Communication::Website.human_attribute_name('name') %></th>
-        <th><%= University.model_name.human %></th>
-        <th colspan="2">Référentiel Git</th>
-        <th>Version</th>
-        <th>&nbsp;</th>
-      </tr>
-    </thead>
-    <tbody>
-      <% @websites.ordered.each do |website| %>
-        <tr id="website-<%= website.id %>">
-          <td>
-            <%= link_to website.name, server_website_path(website) %>
-            <% if website.in_production %>
-              <span class="badge bg-success">Prod</span>
-            <% end %>
-          </td>
-          <td><%= link_to website.university,
-                          [:server, website.university] %></td>
-          <td><%= link_to 'Référentiel',
-                          website.repository_url,
-                          target: :_blank,
-                          class: 'btn btn-xs btn-light' if website.repository.present? %></td>
-          <td><%= image_tag website.deployment_status_badge,
-                            alt: '' if website.deployment_status_badge.present? %></td>
-          <td>
-            <span class="js-version">
-              <%= website.theme_version %>
-            </span>
-          </td>
-          <td>
-            <%= link_to t('server_admin.websites.buttons.theme.sync'),
-                        sync_theme_version_server_website_path(website),
-                        method: :post,
-                        remote: true,
-                        class: "#{button_classes} js-sync-theme-version" if website.url.present? && website.theme_version_url.present? %>
-            <%= link_to t('server_admin.websites.buttons.theme.update'),
-                        update_theme_server_website_path(website),
-                        method: :post,
-                        remote: true,
-                        class: button_classes if website.url.present? && website.github? %>
-          </td>
-        </tr>
-      <% end %>
-    </tbody>
-  </table>
-</div>
-
-<% content_for :action_bar_left do %>
-  <%= link_to "Synchroniser toutes les versions de thème",
-              "#",
-              class: "#{button_classes} js-sync-all-theme-versions" %>
-  <%= link_to "Tout mettre à jour",
-              clean_and_rebuild_all_websites_server_websites_path(current_scopes),
-              method: :post,
-              class: button_classes %>
-<% end %>
\ No newline at end of file
diff --git a/app/views/server/websites/show.html.erb b/app/views/server/websites/show.html.erb
index c24a62d33..3c1249ee7 100644
--- a/app/views/server/websites/show.html.erb
+++ b/app/views/server/websites/show.html.erb
@@ -1,17 +1,20 @@
 <% content_for :title, @website %>
 
 <p>
-  Université : 
-  <%= link_to @website.university, server_university_path(@website.university) %>
+  <%= t('server_admin.websites.university_html', university: link_to(@website.university, server_university_path(@website.university))) %>
 </p>
 
-<%= @website.pages.count %> pages<br>
-<%= @website.posts.count %> actualités<br>
-<%= @website.events.count %> événements<br>
-<%= @website.connections.count %> connexions 
-  (<%= link_to 'détail', admin_communication_website_connections_url(@website, host: @website.university.url), target: :_blank %>)<br>
-<%= @website.recursive_dependencies.count %> dépendances 
-  (<%= link_to 'détail', admin_communication_website_dependencies_url(@website, host: @website.university.url), target: :_blank %>)<br>
+<%= t('server_admin.websites.pages_count', count: @website.pages.count) %>
+<br>
+<%= t('server_admin.websites.posts_count', count: @website.posts.count) %>
+<br>
+<%= t('server_admin.websites.events_count', count: @website.events.count) %>
+<br>
+<%= t('server_admin.websites.connections_count', count: @website.connections.count) %>
+  (<%= link_to t('server_admin.websites.details'), admin_communication_website_connections_url(@website, host: @website.university.url), target: :_blank %>)
+<br>
+<%= t('server_admin.websites.recursive_dependencies_count', count: @website.recursive_dependencies.count) %>
+  (<%= link_to t('server_admin.websites.details'), admin_communication_website_dependencies_url(@website, host: @website.university.url), target: :_blank %>)
 
 <% content_for :action_bar_right do %>
   <%= link_to t('edit'), edit_server_website_path(@website), class: button_classes %>
diff --git a/config/application.sample.yml b/config/application.sample.yml
index 5c7330196..013ed697d 100644
--- a/config/application.sample.yml
+++ b/config/application.sample.yml
@@ -3,21 +3,33 @@ APPLICATION_ENV: development
 BUGSNAG_JAVASCRIPT_KEY:
 BUGSNAG_RUBY_KEY:
 
+DEUXFLEURS_PASSWORD:
+DEUXFLEURS_USER:
+
 GITHUB_WEBSITE_THEME_BRANCH:
 GITHUB_WEBSITE_THEME_PATH:
 GITHUB_WEBSITE_THEME_REPOSITORY:
 GITHUB_WEBSITE_TEMPLATE_REPOSITORY:
 GITHUB_ACCESS_TOKEN:
 
+KEYCDN_HOST:
+
+LIBRETRANSLATE_API_KEY: 
+
 MAIL_FROM_DEFAULT_ADDRESS:
 MAIL_FROM_DEFAULT_NAME:
 
+MAINTENANCE: "false"
+
+MICROLINK_API_KEY: 
+
+PEXELS_API_KEY:
+
+OSUNY_API_AUTOUPDATE_THEME_KEY:
 # Can be used when working on two incompatible branches (e.g. main & i18n)
 OSUNY_DEVELOPMENT_DBNAME:
-
 OSUNY_STAGING_APP_NAME:
 OSUNY_STAGING_PG_ADDON_ID:
-OSUNY_API_AUTOUPDATE_THEME_KEY:
 
 OTP_SECRET_ENCRYPTION_KEY:
 
@@ -27,35 +39,22 @@ SCALEWAY_OS_ENDPOINT:
 SCALEWAY_OS_REGION:
 SCALEWAY_OS_SECRET_ACCESS_KEY:
 
-KEYCDN_HOST:
-
 SECRET_KEY_BASE:
 
 SEND_IN_BLUE_API_KEY:
 
-SMTP_USER:
 SMTP_PASSWORD:
-
-UNSPLASH_ACCESS_KEY:
-UNSPLASH_SECRET:
-PEXELS_API_KEY:
-
-DEUXFLEURS_USER:
-DEUXFLEURS_PASSWORD:
-
-LIBRETRANSLATE_API_KEY: 
-
-MICROLINK_API_KEY: 
-
-MAINTENANCE: "false"
+SMTP_USER:
 
 # Pour les tests automatisés
 TEST_GITHUB_BRANCH:
 TEST_GITHUB_ENDPOINT: '' # no use for github
-TEST_GITHUB_TOKEN:
 TEST_GITHUB_REPOSITORY:
-
+TEST_GITHUB_TOKEN:
 TEST_GITLAB_BRANCH:
 TEST_GITLAB_ENDPOINT:
-TEST_GITLAB_TOKEN:
 TEST_GITLAB_REPOSITORY:
+TEST_GITLAB_TOKEN:
+
+UNSPLASH_ACCESS_KEY:
+UNSPLASH_SECRET:
diff --git a/config/locales/communication/en.yml b/config/locales/communication/en.yml
index 3ad812aa1..8a693bf26 100644
--- a/config/locales/communication/en.yml
+++ b/config/locales/communication/en.yml
@@ -5,60 +5,6 @@ en:
     models:
       communication: Communication
   activerecord:
-    models:
-      communication/block:
-        one: Content block
-        other: Content blocks
-      communication/extranet:
-        one: Extranet
-        other: Extranets
-      communication/extranet/document:
-        one: Document
-        other: Documents
-      communication/extranet/document/category:
-        one: Category
-        other: Categories
-      communication/extranet/document/kind:
-        one: Kind
-        other: Kinds
-      communication/extranet/post:
-        one: Post
-        other: Posts
-        all: All posts
-      communication/extranet/post/category:
-        one: Category
-        other: Categories
-      communication/website:
-        one: Website
-        other: Websites
-      communication/website/agenda/category:
-        one: Category
-        other: Categories
-      communication/website/agenda/event:
-        one: Event
-        other: Events
-      communication/website/post/category:
-        one: Category
-        other: Categories
-        all: All categories
-      communication/website/connection:
-        one: Connection
-        other: Connections
-      communication/website/menu:
-        one: Menu
-        other: Menus
-        all: All menus
-      communication/website/menu/item:
-        one: Item
-        other: Items
-      communication/website/page:
-        one: Page
-        other: Pages
-        all: All pages
-      communication/website/post:
-        one: Post
-        other: Posts
-        all: All posts
     attributes:
       communication/block:
         title: Name (optional)
@@ -266,6 +212,60 @@ en:
               too_soon: must be after "from day"
             to_hour:
               too_soon: must be after "from hour"
+    models:
+      communication/block:
+        one: Content block
+        other: Content blocks
+      communication/extranet:
+        one: Extranet
+        other: Extranets
+      communication/extranet/document:
+        one: Document
+        other: Documents
+      communication/extranet/document/category:
+        one: Category
+        other: Categories
+      communication/extranet/document/kind:
+        one: Kind
+        other: Kinds
+      communication/extranet/post:
+        one: Post
+        other: Posts
+        all: All posts
+      communication/extranet/post/category:
+        one: Category
+        other: Categories
+      communication/website:
+        one: Website
+        other: Websites
+      communication/website/agenda/category:
+        one: Category
+        other: Categories
+      communication/website/agenda/event:
+        one: Event
+        other: Events
+      communication/website/post/category:
+        one: Category
+        other: Categories
+        all: All categories
+      communication/website/connection:
+        one: Connection
+        other: Connections
+      communication/website/menu:
+        one: Menu
+        other: Menus
+        all: All menus
+      communication/website/menu/item:
+        one: Item
+        other: Items
+      communication/website/page:
+        one: Page
+        other: Pages
+        all: All pages
+      communication/website/post:
+        one: Post
+        other: Posts
+        all: All posts
   admin:
     communication:
       block:
@@ -431,6 +431,10 @@ en:
         unpublished: Unpublished
       security: Security
       see_all: See the full list (%{number} elements)
+  curation:
+    error: Import error, be sure to use a valid URL
+    label: URL of the post to import
+    placeholder: https://...
   enums:
     communication:
       website:
@@ -457,10 +461,6 @@ en:
               persons: Staff
               teachers: Educational staff
               url: URL
-  curation:
-    error: Import error, be sure to use a valid URL
-    label: URL of the post to import
-    placeholder: https://...
   simple_form:
     hints:
       communication_extranet:
diff --git a/config/locales/communication/fr.yml b/config/locales/communication/fr.yml
index 9b43c7125..0f0795523 100644
--- a/config/locales/communication/fr.yml
+++ b/config/locales/communication/fr.yml
@@ -5,60 +5,6 @@ fr:
     models:
       communication: Communication
   activerecord:
-    models:
-      communication/block:
-        one: Bloc de contenu
-        other: Blocs de contenu
-      communication/extranet:
-        one: Extranet
-        other: Extranets
-      communication/extranet/document:
-        one: Document
-        other: Documents
-      communication/extranet/document/category:
-        one: Catégorie
-        other: Catégories
-      communication/extranet/document/kind:
-        one: Type
-        other: Types
-      communication/extranet/post:
-        one: Actualité
-        other: Actualités
-        all: Toutes les actualités
-      communication/extranet/post/category:
-        one: Catégorie
-        other: Catégories
-      communication/website:
-        one: Site Web
-        other: Sites Web
-      communication/website/agenda/category:
-        one: Catégorie
-        other: Catégories
-      communication/website/agenda/event:
-        one: Événement
-        other: Événements
-      communication/website/post/category:
-        one: Catégorie
-        other: Catégories
-        all: Toutes les catégories
-      communication/website/connection:
-        one: Connexion
-        other: Connexions
-      communication/website/menu:
-        one: Menu
-        other: Menus
-        all: Tous les menus
-      communication/website/menu/item:
-        one: Élément
-        other: Éléments
-      communication/website/page:
-        one: Page
-        other: Pages
-        all: Toutes les pages
-      communication/website/post:
-        one: Actualité
-        other: Actualités
-        all: Toutes les actualités
     attributes:
       communication/block:
         title: Nom (facultatif)
@@ -266,6 +212,60 @@ fr:
               too_soon: doit être après jour de début
             to_hour:
               too_soon: doit être après l'heure de début
+    models:
+      communication/block:
+        one: Bloc de contenu
+        other: Blocs de contenu
+      communication/extranet:
+        one: Extranet
+        other: Extranets
+      communication/extranet/document:
+        one: Document
+        other: Documents
+      communication/extranet/document/category:
+        one: Catégorie
+        other: Catégories
+      communication/extranet/document/kind:
+        one: Type
+        other: Types
+      communication/extranet/post:
+        one: Actualité
+        other: Actualités
+        all: Toutes les actualités
+      communication/extranet/post/category:
+        one: Catégorie
+        other: Catégories
+      communication/website:
+        one: Site Web
+        other: Sites Web
+      communication/website/agenda/category:
+        one: Catégorie
+        other: Catégories
+      communication/website/agenda/event:
+        one: Événement
+        other: Événements
+      communication/website/post/category:
+        one: Catégorie
+        other: Catégories
+        all: Toutes les catégories
+      communication/website/connection:
+        one: Connexion
+        other: Connexions
+      communication/website/menu:
+        one: Menu
+        other: Menus
+        all: Tous les menus
+      communication/website/menu/item:
+        one: Élément
+        other: Éléments
+      communication/website/page:
+        one: Page
+        other: Pages
+        all: Toutes les pages
+      communication/website/post:
+        one: Actualité
+        other: Actualités
+        all: Toutes les actualités
   admin:
     communication:
       block:
@@ -431,6 +431,10 @@ fr:
         unpublished: Non publiée
       security: Sécurité
       see_all: Voir la liste complète (%{number} éléments)
+  curation:
+    error: Erreur lors de la curation, veillez à utiliser une URL valide
+    label: URL de l'article à importer
+    placeholder: https://...
   enums:
     communication:
       website:
@@ -457,10 +461,6 @@ fr:
               persons: Équipe
               teachers: Équipe pédagogique
               url: URL
-  curation:
-    error: Erreur lors de la curation, veillez à utiliser une URL valide
-    label: URL de l'article à importer
-    placeholder: https://...
   simple_form:
     hints:
       communication_extranet:
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 27d5ac2c3..5ab109b90 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -321,27 +321,6 @@ en:
   save: Save
   search: Search
   select_language: Select language
-  server_admin:
-    dashboard: Server administration
-    emergency_messages:
-      all_universities: All
-      all_roles: All
-      content: Content
-      deliver: Send
-      delivered: Your message has been sent
-      filters: Filters
-      target: Target
-      users:
-        one: "%{count} user"
-        other: "%{count} users"
-    websites:
-      buttons:
-        theme:
-          sync: Sync version
-          update: Update theme
-      clean_and_rebuild_all_websites_notice: All themes will be updated. This can take a few minutes.
-      sync_theme_version_notice: The theme's version of %{website} has been synced
-      update_theme_notice: The theme of %{website} will be updated in a moment
   seo: SEO
   simple_form:
     error_notification:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 47404bef1..9496ac4e4 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -321,27 +321,6 @@ fr:
   save: Enregistrer
   search: Rechercher
   select_language: Sélectionnez une langue
-  server_admin:
-    dashboard: Administration du serveur
-    emergency_messages:
-      all_universities: Toutes
-      all_roles: Tous
-      content: Contenu
-      deliver: Envoyer
-      delivered: Votre message a bien été envoyé
-      filters: Filtres
-      target: Cible
-      users:
-        one: "%{count} utilisateur"
-        other: "%{count} utilisateurs"
-    websites:
-      buttons:
-        theme:
-          sync: Synchroniser la version
-          update: Mettre à jour le thème
-      clean_and_rebuild_all_websites_notice: Tous les thèmes vont être mis à jour. Cela peut prendre quelques minutes.
-      sync_theme_version_notice: La version du thème de %{website} a été synchronisée
-      update_theme_notice: Le thème de %{website} va être mis à jour dans quelques instants
   seo: SEO
   simple_form:
     error_notification:
diff --git a/config/locales/server_admin/en.yml b/config/locales/server_admin/en.yml
new file mode 100644
index 000000000..2905b62c5
--- /dev/null
+++ b/config/locales/server_admin/en.yml
@@ -0,0 +1,69 @@
+en:
+  server_admin:
+    blocks:
+      about: About
+      blocks_saved:
+        one: "1 block re-saved"
+        other: "%{count} blocks re-saved"
+      data: Data
+      open: Open
+      quantity: Quantity
+      resave: Force those blocks re-save
+      see: See
+      title: Name
+      url: URL
+    dashboard: Server administration
+    emergency_messages:
+      all_universities: All
+      all_roles: All
+      content: Content
+      deliver: Send
+      delivered: Your message has been sent
+      filters: Filters
+      target: Target
+      users:
+        one: "%{count} user"
+        other: "%{count} users"
+    see_list: See the list
+    universities:
+      contributing:
+        one: 1 contributing university
+        other: "%{count} contributing universities"
+      contributions_total: Contributions (total)
+      invoice_informations: Invoice informations
+    websites:
+      admin: Admin
+      autoupdate_theme:
+        false: Manual
+        true: Auto
+      back_office: Back office
+      buttons:
+        theme:
+          sync: Sync version
+          update: Update theme
+      clean_and_rebuild_all_websites_notice: All themes will be updated. This can take a few minutes.
+      connections_count: "%{count} connexions"
+      details: detail
+      events_count: "%{count} events"      
+      force_clean_and_rebuild: Force clean&rebuild of every websites
+      git_repo: 
+        full: Git Repository
+        short: Repository
+        status: Status
+      in_production: "%{count} in production"
+      manage_versions: Manage versions
+      outdated: Those websites are outdated
+      pages_count: "%{count} pages"
+      posts_count: "%{count} posts"
+      production: In production
+      production_status: Production status
+      recursive_dependencies_count: "%{count} dependencies"
+      sync_theme_version_notice: The theme's version of %{website} has been synced
+      theme_version: Theme version
+      university_html: "University: %{university}"
+      update_all_themes: Sync all themes versions
+      update_mode: Update mode
+      updatable_theme_filter:
+        element: Auto-update capability
+        value: Available
+      update_theme_notice: The theme of %{website} will be updated in a moment
\ No newline at end of file
diff --git a/config/locales/server_admin/fr.yml b/config/locales/server_admin/fr.yml
new file mode 100644
index 000000000..d0f2ddb23
--- /dev/null
+++ b/config/locales/server_admin/fr.yml
@@ -0,0 +1,69 @@
+fr:
+  server_admin:
+    blocks:
+      about: Sujet
+      blocks_saved:
+        one: "1 bloc re-sauvé"
+        other: "%{count} blocs re-sauvés"
+      data: Données
+      open: Ouvrir
+      quantity: Quantité
+      resave: Forcer le save de ces blocks
+      see: Voir
+      title: Nom
+      url: URL
+    dashboard: Administration du serveur
+    emergency_messages:
+      all_universities: Toutes
+      all_roles: Tous
+      content: Contenu
+      deliver: Envoyer
+      delivered: Votre message a bien été envoyé
+      filters: Filtres
+      target: Cible
+      users:
+        one: "%{count} utilisateur"
+        other: "%{count} utilisateurs"
+    see_list: Voir la liste
+    universities:
+      contributing:
+        one: 1 université contributrice
+        other: "%{count} universités contributrices"
+      contributions_total: Contributions (total)
+      invoice_informations: Données de facturation
+    websites:
+      admin: Admin
+      autoupdate_theme:
+        false: Manuelle
+        true: Automatique
+      back_office: Back office
+      buttons:
+        theme:
+          sync: Synchroniser la version
+          update: Mettre à jour le thème
+      clean_and_rebuild_all_websites_notice: Tous les thèmes vont être mis à jour. Cela peut prendre quelques minutes.
+      connections_count: "%{count} connexions"
+      details: détail
+      events_count: "%{count} événements"      
+      force_clean_and_rebuild: Forcer le clean&rebuild de tous les sites
+      git_repo: 
+        full: Référentiel Git
+        short: Référentiel
+        status: Statut
+      in_production: "%{count} en production"
+      manage_versions: Gérer les versions
+      outdated: Ces sites ne sont pas à jour
+      pages_count: "%{count} pages"
+      posts_count: "%{count} actualités"
+      production: En prod
+      production_status: État de production
+      recursive_dependencies_count: "%{count} dépendances"
+      sync_theme_version_notice: La version du thème de %{website} a été synchronisée
+      theme_version: Version du thème
+      university_html: "Université : %{university}"
+      update_all_themes: Synchroniser toutes les versions de thème
+      update_mode: Mode de mise à jour
+      updatable_theme_filter:
+        element: Capacité de mise à jour automatique
+        value: Mise à jour automatique possible
+      update_theme_notice: Le thème de %{website} va être mis à jour dans quelques instants
\ No newline at end of file
diff --git a/config/locales/university/en.yml b/config/locales/university/en.yml
index 0422571aa..b9e9e6553 100644
--- a/config/locales/university/en.yml
+++ b/config/locales/university/en.yml
@@ -213,10 +213,6 @@ en:
       regenerate_token: Regenerate token
       token_display_notice: Make sure to store your token somewhere safe. You won’t be able to see it again!
       token_successfully_regenerated: The token was successfully regenerated.
-    contributing:
-      one: contributing university
-      other: contributing universities
-    contributions_total: Contributions (total)
     description:
       text: A university is an institution of higher education, study and research, made up of various establishments called, depending on the tradition, "colleges", "faculties", "institutes", "departments", "centres", "sections", "units" or specific schools, but also a library or workshop, media library or museum, etc. forming a coherent administrative whole with a defined legal status, whether public, private or possibly mixed.
       source: Wikipedia
@@ -231,7 +227,6 @@ en:
           description: Person using Osuny, with an authenticated account
           description_non_university: Person using Osuny, with an authenticated account
     internal_key: Internal Key
-    invoice_informations: Invoice informations
     manage_cohorts: Manage cohorts
     manage_experiences: Manage experiences
     organization:
diff --git a/config/locales/university/fr.yml b/config/locales/university/fr.yml
index f69d50638..ed3e5e769 100644
--- a/config/locales/university/fr.yml
+++ b/config/locales/university/fr.yml
@@ -213,10 +213,6 @@ fr:
       regenerate_token: Regénérer le jeton
       token_display_notice: Assurez-vous de stocker votre jeton secret de manière sécurisée. Vous ne pourrez pas le revoir !
       token_successfully_regenerated: Le jeton a bien été regénéré.
-    contributing:
-      one: université contributrice
-      other: universités contributrices
-    contributions_total: Contributions (total)
     description:
       text: Une université est une institution d'enseignement supérieur, d'étude et de recherche, constituée par la réunion de divers établissements nommés suivant les traditions “collèges”, “facultés”, “instituts”, “départements”, “centres”, “sections”, “unités” ou écoles spécifiques, mais aussi bibliothèque ou atelier, médiathèque ou musée, etc. formant un ensemble administratif cohérent avec un statut de droit défini, public, privé ou éventuellement mixte.
       source: Wikipedia
@@ -231,7 +227,6 @@ fr:
           description: Personne utilisant Osuny, dotée d'un compte authentifié
           description_non_university: Personne utilisant Osuny, dotée d'un compte authentifié
     internal_key: Clé interne
-    invoice_informations: Données de facturation
     manage_cohorts: Gérer les promotions
     manage_experiences: Gérer les expériences professionnelles
     organization:
diff --git a/config/routes/server.rb b/config/routes/server.rb
index daf21fe4a..95473498f 100644
--- a/config/routes/server.rb
+++ b/config/routes/server.rb
@@ -3,7 +3,6 @@ namespace :server do
   resources :languages
   resources :websites do
     collection do
-      get :manage_versions
       post :clean_and_rebuild_all_websites
     end
     member do
diff --git a/db/schema.rb b/db/schema.rb
index 45971753f..3a415f4c6 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -16,7 +16,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
   enable_extension "plpgsql"
   enable_extension "unaccent"
 
-  create_table "action_text_rich_texts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "action_text_rich_texts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "name", null: false
     t.text "body"
     t.string "record_type", null: false
@@ -26,7 +26,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true
   end
 
-  create_table "active_storage_attachments", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "active_storage_attachments", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "name", null: false
     t.string "record_type", null: false
     t.uuid "record_id", null: false
@@ -36,7 +36,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
   end
 
-  create_table "active_storage_blobs", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "active_storage_blobs", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "key", null: false
     t.string "filename", null: false
     t.string "content_type"
@@ -50,7 +50,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_active_storage_blobs_on_university_id"
   end
 
-  create_table "active_storage_variant_records", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "active_storage_variant_records", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "blob_id", null: false
     t.string "variation_digest", null: false
     t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
@@ -90,7 +90,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["education_school_id", "administration_location_id"], name: "index_school_location"
   end
 
-  create_table "administration_qualiopi_criterions", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "administration_qualiopi_criterions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.integer "number"
     t.text "name"
     t.text "description"
@@ -98,7 +98,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.datetime "updated_at", null: false
   end
 
-  create_table "administration_qualiopi_indicators", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "administration_qualiopi_indicators", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "criterion_id", null: false
     t.integer "number"
     t.text "name"
@@ -129,7 +129,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_communication_block_headings_on_university_id"
   end
 
-  create_table "communication_blocks", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_blocks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "about_type"
     t.uuid "about_id"
@@ -235,7 +235,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_communication_extranet_posts_on_university_id"
   end
 
-  create_table "communication_extranets", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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 "host"
@@ -348,7 +348,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["website_id"], name: "index_communication_website_connections_on_website_id"
   end
 
-  create_table "communication_website_git_files", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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
@@ -383,7 +383,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_communication_website_localizations_on_university_id"
   end
 
-  create_table "communication_website_menu_items", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_menu_items", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "website_id", null: false
     t.uuid "menu_id", null: false
@@ -403,7 +403,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["website_id"], name: "index_communication_website_menu_items_on_website_id"
   end
 
-  create_table "communication_website_menus", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_menus", 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"
@@ -419,7 +419,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_communication_website_menus_on_university_id"
   end
 
-  create_table "communication_website_pages", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "communication_website_pages", 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"
@@ -433,10 +433,10 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.boolean "published", default: false
     t.string "featured_image_alt"
     t.text "text"
-    t.text "summary"
     t.string "breadcrumb_title"
     t.text "header_text"
     t.integer "kind"
+    t.text "summary"
     t.string "bodyclass"
     t.uuid "language_id", null: false
     t.text "featured_image_credit"
@@ -453,7 +453,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_communication_website_pages_on_university_id"
   end
 
-  create_table "communication_website_permalinks", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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
@@ -467,7 +467,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["website_id"], name: "index_communication_website_permalinks_on_website_id"
   end
 
-  create_table "communication_website_post_categories", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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"
@@ -494,7 +494,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_communication_website_post_categories_on_university_id"
   end
 
-  create_table "communication_website_posts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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"
@@ -521,7 +521,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_communication_website_posts_on_university_id"
   end
 
-  create_table "communication_websites", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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"
@@ -593,7 +593,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["priority", "run_at"], name: "delayed_jobs_priority"
   end
 
-  create_table "education_academic_years", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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", null: false
@@ -608,7 +608,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_person_id", "education_academic_year_id"], name: "index_person_academic_year"
   end
 
-  create_table "education_cohorts", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "education_cohorts", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "program_id", null: false
     t.uuid "academic_year_id", null: false
@@ -629,7 +629,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_person_id", "education_cohort_id"], name: "index_person_cohort"
   end
 
-  create_table "education_diplomas", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "education_diplomas", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "name"
     t.string "short_name"
     t.integer "level", default: 0
@@ -644,7 +644,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_education_diplomas_on_university_id"
   end
 
-  create_table "education_programs", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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 "capacity"
@@ -705,7 +705,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["education_program_id", "user_id"], name: "index_education_programs_users_on_program_id_and_user_id"
   end
 
-  create_table "education_schools", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "education_schools", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "name"
     t.string "address"
@@ -736,7 +736,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_emergency_messages_on_university_id", where: "(university_id IS NOT NULL)"
   end
 
-  create_table "imports", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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"
@@ -749,7 +749,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["user_id"], name: "index_imports_on_user_id"
   end
 
-  create_table "languages", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "languages", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "name"
     t.string "iso_code"
     t.datetime "created_at", null: false
@@ -795,7 +795,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_research_journal_paper_kinds_on_university_id"
   end
 
-  create_table "research_journal_papers", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "research_journal_papers", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "title"
     t.datetime "published_at", precision: nil
     t.uuid "university_id", null: false
@@ -833,7 +833,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["researcher_id"], name: "index_research_journal_papers_researchers_on_researcher_id"
   end
 
-  create_table "research_journal_volumes", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "research_journal_volumes", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "research_journal_id", null: false
     t.string "title"
@@ -854,7 +854,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_research_journal_volumes_on_university_id"
   end
 
-  create_table "research_journals", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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 "meta_description"
@@ -865,7 +865,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_research_journals_on_university_id"
   end
 
-  create_table "research_laboratories", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "research_laboratories", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "name"
     t.string "address"
@@ -886,7 +886,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_person_id", "research_laboratory_id"], name: "person_laboratory"
   end
 
-  create_table "research_laboratory_axes", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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"
@@ -931,7 +931,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_person_id", "research_publication_id"], name: "index_person_publication"
   end
 
-  create_table "research_theses", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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
     t.uuid "author_id", null: false
@@ -949,7 +949,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_research_theses_on_university_id"
   end
 
-  create_table "universities", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "universities", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.string "name"
     t.string "identifier"
     t.string "address"
@@ -996,7 +996,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_university_organization_categories_on_university_id"
   end
 
-  create_table "university_organizations", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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"
@@ -1039,7 +1039,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["organization_id"], name: "index_university_organizations_categories_on_organization_id"
   end
 
-  create_table "university_people", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "university_people", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "user_id"
     t.string "last_name"
@@ -1097,7 +1097,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_university_person_categories_on_university_id"
   end
 
-  create_table "university_person_experiences", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  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
     t.uuid "organization_id", null: false
@@ -1111,7 +1111,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_university_person_experiences_on_university_id"
   end
 
-  create_table "university_person_involvements", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "university_person_involvements", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.uuid "person_id", null: false
     t.integer "kind"
@@ -1126,7 +1126,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["university_id"], name: "index_university_person_involvements_on_university_id"
   end
 
-  create_table "university_roles", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "university_roles", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "target_type"
     t.uuid "target_id"
@@ -1148,7 +1148,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_02_07_085338) do
     t.index ["user_id"], name: "index_user_favorites_on_user_id"
   end
 
-  create_table "users", id: :uuid, default: -> { "public.gen_random_uuid()" }, force: :cascade do |t|
+  create_table "users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
     t.uuid "university_id", null: false
     t.string "first_name"
     t.string "last_name"
-- 
GitLab