From 23908b5f1e2222db3e4ec11b9d0aa9341e343dca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com>
Date: Thu, 27 Jan 2022 15:16:00 +0100
Subject: [PATCH] static views + associations

---
 app/models/communication/website/with_abouts.rb | 12 ++++++------
 app/models/education/program.rb                 | 17 ++++++++++++-----
 app/models/education/school.rb                  | 14 ++++++++------
 app/models/research/journal.rb                  |  2 +-
 app/models/research/journal/article.rb          |  1 +
 app/models/research/journal/volume.rb           |  2 +-
 app/models/university/person.rb                 |  2 +-
 app/models/university/person/involvement.rb     |  2 +-
 app/models/university/role.rb                   |  3 ++-
 .../admin/education/programs/static.html.erb    | 16 ++++++++--------
 .../admin/education/schools/static.html.erb     | 10 +++++-----
 11 files changed, 46 insertions(+), 35 deletions(-)

diff --git a/app/models/communication/website/with_abouts.rb b/app/models/communication/website/with_abouts.rb
index 570c59f6f..90a8cc6e0 100644
--- a/app/models/communication/website/with_abouts.rb
+++ b/app/models/communication/website/with_abouts.rb
@@ -66,8 +66,8 @@ module Communication::Website::WithAbouts
     @people ||= begin
       people = authors
       if about_school?
-        people += about.university_people_through_teachers
-        people += about.university_people_through_administrators
+        people += about.university_people_through_involvements
+        people += about.university_people_through_roles
       elsif about_journal?
         people += about.people
       end
@@ -79,10 +79,10 @@ module Communication::Website::WithAbouts
     @people_with_facets ||= begin
       people = authors + authors.compact.map(&:author)
       if about_school?
-        people += about.university_people_through_teachers
-        people += about.university_people_through_teachers.map(&:teacher)
-        people += about.university_people_through_administrators
-        people += about.university_people_through_administrators.map(&:administrator)
+        people += about.university_people_through_involvements
+        people += about.university_people_through_involvements.map(&:teacher)
+        people += about.university_people_through_roles
+        people += about.university_people_through_roles.map(&:administrator)
       elsif about_journal?
         people += about.people
         people += about.people.map(&:researcher)
diff --git a/app/models/education/program.rb b/app/models/education/program.rb
index 735de5888..fcebaba4a 100644
--- a/app/models/education/program.rb
+++ b/app/models/education/program.rb
@@ -83,13 +83,18 @@ class Education::Program < ApplicationRecord
              as: :target,
              dependent: :destroy
   has_many   :involvements_through_roles,
-             class_name: 'University::Person::Involvement',
              through: :university_roles,
              source: :involvements
+  has_many   :university_people_through_role_involvements,
+             through: :involvements_through_roles,
+             source: :person
   has_many   :university_person_involvements,
              class_name: 'University::Person::Involvement',
              as: :target,
              dependent: :destroy
+  has_many   :university_people_through_involvements,
+             through: :university_person_involvements,
+             source: :person
   has_many   :website_categories,
              class_name: 'Communication::Website::Category',
              dependent: :destroy
@@ -134,10 +139,12 @@ class Education::Program < ApplicationRecord
   def git_dependencies(website)
     [self] +
     active_storage_blobs +
-    university_people_through_teachers +
-    university_people_through_teachers.map(&:teacher) +
-    university_people_through_roles
-    # TODO: les administrative via roles
+    university_people_through_involvements +
+    university_people_through_involvements.map(&:active_storage_blobs) +
+    university_people_through_involvements.map(&:teacher) +
+    university_people_through_role_involvements +
+    university_people_through_role_involvements.map(&:active_storage_blobs) +
+    university_people_through_role_involvements.map(&:administrator)
   end
 
   def git_destroy_dependencies(website)
diff --git a/app/models/education/school.rb b/app/models/education/school.rb
index 03f46b569..4859bc521 100644
--- a/app/models/education/school.rb
+++ b/app/models/education/school.rb
@@ -33,10 +33,6 @@ class Education::School < ApplicationRecord
             -> { distinct },
             through: :administrators,
             source: :person
-  has_many  :university_roles, class_name: 'University::Role', as: :target, dependent: :destroy
-  has_many  :university_people_through_roles,
-            through: :university_roles,
-            source: :person
   has_and_belongs_to_many :programs,
                           class_name: 'Education::Program',
                           join_table: 'education_programs_schools',
@@ -48,6 +44,12 @@ class Education::School < ApplicationRecord
             through: :teachers,
             source: :person
 
+  has_many  :university_roles, class_name: 'University::Role', as: :target, dependent: :destroy
+  has_many  :involvements_through_roles, through: :university_roles, source: :involvements
+  has_many  :university_people_through_involvements,
+            through: :involvements_through_roles,
+            source: :person
+
   validates :name, :address, :city, :zipcode, :country, presence: true
 
   scope :ordered, -> { order(:name) }
@@ -62,7 +64,7 @@ class Education::School < ApplicationRecord
 
   def git_dependencies(website)
     [self] +
-    university_people_through_administrators +
-    university_people_through_administrators.map(&:administrator)
+    university_people_through_involvements +
+    university_people_through_involvements.map(&:administrator)
   end
 end
diff --git a/app/models/research/journal.rb b/app/models/research/journal.rb
index b7badad3e..f4f6fc15f 100644
--- a/app/models/research/journal.rb
+++ b/app/models/research/journal.rb
@@ -40,7 +40,7 @@ class Research::Journal < ApplicationRecord
   end
 
   def git_dependencies(website)
-    [self] + articles + volumes + people + people.map(&:researcher)
+    [self] + articles + volumes + people + people.map(&:active_storage_blobs).flatten + people.map(&:researcher)
   end
 
   def git_destroy_dependencies(website)
diff --git a/app/models/research/journal/article.rb b/app/models/research/journal/article.rb
index 561720247..1d899b51a 100644
--- a/app/models/research/journal/article.rb
+++ b/app/models/research/journal/article.rb
@@ -66,6 +66,7 @@ class Research::Journal::Article < ApplicationRecord
     active_storage_blobs +
     other_articles_in_the_volume +
     people +
+    people.map(&:active_storage_blobs).flatten +
     people.map(&:researcher)
   end
 
diff --git a/app/models/research/journal/volume.rb b/app/models/research/journal/volume.rb
index 80c1fb01f..2fd9f3340 100644
--- a/app/models/research/journal/volume.rb
+++ b/app/models/research/journal/volume.rb
@@ -51,7 +51,7 @@ class Research::Journal::Volume < ApplicationRecord
   end
 
   def git_dependencies(website)
-    [self] + articles + people + people.map(&:researcher) + active_storage_blobs
+    [self] + articles + people + people.map(&:active_storage_blobs).flatten + people.map(&:researcher) + active_storage_blobs
   end
 
   def git_destroy_dependencies(website)
diff --git a/app/models/university/person.rb b/app/models/university/person.rb
index 69f326d06..3b36941df 100644
--- a/app/models/university/person.rb
+++ b/app/models/university/person.rb
@@ -120,7 +120,7 @@ class University::Person < ApplicationRecord
     dependencies = []
     if for_website?(website)
       dependencies << self
-      dependencies << best_picture.blob
+      dependencies.concat active_storage_blobs
     end
     dependencies << administrator if administrator.for_website?(website)
     dependencies << author if author.for_website?(website)
diff --git a/app/models/university/person/involvement.rb b/app/models/university/person/involvement.rb
index f2c8f6c28..9da1b3c05 100644
--- a/app/models/university/person/involvement.rb
+++ b/app/models/university/person/involvement.rb
@@ -30,7 +30,7 @@ class University::Person::Involvement < ApplicationRecord
   enum kind: { administrator: 10, researcher: 20, teacher: 30 }
 
   belongs_to :university
-  belongs_to :person
+  belongs_to :person, class_name: 'University::Person'
   belongs_to :target, polymorphic: true
 
   after_commit :sync_with_git
diff --git a/app/models/university/role.rb b/app/models/university/role.rb
index a128dbb4f..befa1d6c7 100644
--- a/app/models/university/role.rb
+++ b/app/models/university/role.rb
@@ -25,7 +25,8 @@ class University::Role < ApplicationRecord
 
   belongs_to :university
   belongs_to :target, polymorphic: true, optional: true
-  has_many :involvements, class_name: 'University::Person::Involvement', as: :target
+  has_many :involvements, class_name: 'University::Person::Involvement', as: :target, dependent: :destroy
+  has_many :people, through: :involvements
 
   def to_s
     "#{description}"
diff --git a/app/views/admin/education/programs/static.html.erb b/app/views/admin/education/programs/static.html.erb
index 505c7a206..326cede3d 100644
--- a/app/views/admin/education/programs/static.html.erb
+++ b/app/views/admin/education/programs/static.html.erb
@@ -11,21 +11,21 @@ image_alt: "<%= @program.featured_image_alt %>"
 <% end %>
 category: "<%= @website.categories.find_by(program_id: @program.id)&.path %>/"
 teachers:
-<% @program.teachers.includes(:person).ordered.each do |teacher| %>
-  - "<%= teacher.person.slug %>"
+<% @program.university_person_involvements.includes(:person).ordered.each do |involvement| %>
+  - "<%= involvement.person.slug %>"
 <% end %>
 teachers_description:
-<% @program.teachers.includes(:person).ordered.each do |teacher| %>
-  "<%= teacher.person.slug %>": >
-    <%= teacher.best_description %>
+<% @program.university_person_involvements.includes(:person).ordered.each do |involvement| %>
+  "<%= involvement.person.slug %>": >
+    <%= involvement.description %>
 <% end %>
 roles:
-<% @program.roles.ordered.each do |role| %>
+<% @program.university_roles.ordered.each do |role| %>
   - title: >
       <%= role.to_s %>
     persons:
-    <% role.people.includes(:person).ordered.each do |role_person| %>
-      - "<%= role_person.person.slug %>"
+    <% role.involvements.includes(:person).ordered.each do |involvement| %>
+      - "<%= involvement.person.slug %>"
     <% end %>
 <% end %>
 continuing: <%= @program.continuing %>
diff --git a/app/views/admin/education/schools/static.html.erb b/app/views/admin/education/schools/static.html.erb
index 800d8c5b1..f750e28fa 100644
--- a/app/views/admin/education/schools/static.html.erb
+++ b/app/views/admin/education/schools/static.html.erb
@@ -12,12 +12,12 @@ country: >
 phone: >
   <%= @school.phone %>
 administrators:
-<% @school.administrators.includes(:person).ordered.each do |administrator| %>
-  - "<%= administrator.person.slug %>"
+<% @school.involvements_through_roles.includes(:person).ordered.each do |involvement| %>
+  - "<%= involvement.person.slug %>"
 <% end %>
 administrators_description:
-<% @school.administrators.includes(:person).ordered.each do |administrator| %>
-  "<%= administrator.person.slug %>": >
-    <%= administrator.best_description %>
+<% @school.involvements_through_roles.includes(:person).ordered.each do |involvement| %>
+  "<%= involvement.person.slug %>": >
+    <%= involvement.best_description %>
 <% end %>
 ---
-- 
GitLab