From 54ecf0eea9321367e8ce83470f073cb19ccaab71 Mon Sep 17 00:00:00 2001
From: Arnaud Levy <contact@arnaudlevy.com>
Date: Sun, 20 Mar 2022 18:31:45 +0100
Subject: [PATCH] working

---
 app/assets/images/extranet/avatar.png         | Bin 0 -> 13360 bytes
 .../stylesheets/application/layout.sass       |  11 ++++++
 app/controllers/application_controller.rb     |   1 +
 .../extranet/academic_years_controller.rb     |  12 +++++-
 .../extranet/application_controller.rb        |   6 +++
 .../extranet/cohorts_controller.rb            |  12 +++++-
 .../extranet/organizations_controller.rb      |  12 +++++-
 .../extranet/persons_controller.rb            |  12 +++++-
 app/models/university/person.rb               |   4 +-
 .../university/person/alumnus/import.rb       |  13 ++++++-
 .../extranet/academic_years/index.html.erb    |   2 +
 .../extranet/academic_years/show.html.erb     |   2 +
 app/views/extranet/cohorts/index.html.erb     |   4 +-
 app/views/extranet/cohorts/show.html.erb      |   2 +
 .../extranet/organizations/index.html.erb     |   2 +
 .../extranet/organizations/show.html.erb      |   2 +
 app/views/extranet/persons/_list.html.erb     |  36 ++++++------------
 app/views/extranet/persons/index.html.erb     |   2 +
 app/views/extranet/persons/show.html.erb      |  13 +++++++
 app/views/layouts/application.html.erb        |   1 -
 20 files changed, 115 insertions(+), 34 deletions(-)
 create mode 100644 app/assets/images/extranet/avatar.png
 create mode 100644 app/controllers/extranet/application_controller.rb

diff --git a/app/assets/images/extranet/avatar.png b/app/assets/images/extranet/avatar.png
new file mode 100644
index 0000000000000000000000000000000000000000..34b4e0cdea8b2ce18e1fb644989edb762cc0dd63
GIT binary patch
literal 13360
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
HKH&cVwQ*$3

literal 0
HcmV?d00001

diff --git a/app/assets/stylesheets/application/layout.sass b/app/assets/stylesheets/application/layout.sass
index a76eb635e..2431819fb 100644
--- a/app/assets/stylesheets/application/layout.sass
+++ b/app/assets/stylesheets/application/layout.sass
@@ -9,3 +9,14 @@ footer
     padding: .95rem
     &-danger
         color: #82322F
+
+h1
+    border-bottom: 1px solid
+    border-top: 1px solid
+    height: 100%
+    min-height: 160px
+    padding-top: 50px
+
+.breadcrumb
+    font-size: 14px
+    padding-bottom: 50px
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 325fa702c..d3b4ac764 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -2,6 +2,7 @@ class ApplicationController < ActionController::Base
   include WithErrors
   include WithLocale
   include WithDomain
+
   before_action :authenticate_user!
 
   def breadcrumb
diff --git a/app/controllers/extranet/academic_years_controller.rb b/app/controllers/extranet/academic_years_controller.rb
index c1d759ee0..a8439fd6e 100644
--- a/app/controllers/extranet/academic_years_controller.rb
+++ b/app/controllers/extranet/academic_years_controller.rb
@@ -1,12 +1,22 @@
-class Extranet::AcademicYearsController < ApplicationController
+class Extranet::AcademicYearsController < Extranet::ApplicationController
   load_and_authorize_resource class: Education::AcademicYear,
                               through: :current_university,
                               through_association: :academic_years
 
   def index
     @academic_years = @academic_years.ordered.page(params[:page])
+    breadcrumb
   end
 
   def show
+    breadcrumb
+  end
+
+  protected
+
+  def breadcrumb
+    super
+    add_breadcrumb Education::AcademicYear.model_name.human(count: 2), education_academic_years_path
+    add_breadcrumb @academic_year if @academic_year
   end
 end
diff --git a/app/controllers/extranet/application_controller.rb b/app/controllers/extranet/application_controller.rb
new file mode 100644
index 000000000..6ea0f75a9
--- /dev/null
+++ b/app/controllers/extranet/application_controller.rb
@@ -0,0 +1,6 @@
+class Extranet::ApplicationController < ApplicationController
+
+  def breadcrumb
+    add_breadcrumb t('home'), root_path
+  end
+end
diff --git a/app/controllers/extranet/cohorts_controller.rb b/app/controllers/extranet/cohorts_controller.rb
index e5eaf425d..d6935d45b 100644
--- a/app/controllers/extranet/cohorts_controller.rb
+++ b/app/controllers/extranet/cohorts_controller.rb
@@ -1,12 +1,22 @@
-class Extranet::CohortsController < ApplicationController
+class Extranet::CohortsController < Extranet::ApplicationController
   load_and_authorize_resource class: Education::Cohort,
                               through: :current_university,
                               through_association: :education_cohorts
 
   def index
     @cohorts = @cohorts.ordered.page(params[:page])
+    breadcrumb
   end
 
   def show
+    breadcrumb
+  end
+
+  protected
+
+  def breadcrumb
+    super
+    add_breadcrumb Education::Cohort.model_name.human(count: 2), education_cohorts_path
+    add_breadcrumb @cohort if @cohort
   end
 end
diff --git a/app/controllers/extranet/organizations_controller.rb b/app/controllers/extranet/organizations_controller.rb
index 33633e234..d91329fb8 100644
--- a/app/controllers/extranet/organizations_controller.rb
+++ b/app/controllers/extranet/organizations_controller.rb
@@ -1,12 +1,22 @@
-class Extranet::OrganizationsController < ApplicationController
+class Extranet::OrganizationsController < Extranet::ApplicationController
   load_and_authorize_resource class: University::Organization,
                               through: :current_university,
                               through_association: :organizations
 
   def index
     @organizations = @organizations.ordered.page(params[:page])
+    breadcrumb
   end
 
   def show
+    breadcrumb
+  end
+
+  protected
+
+  def breadcrumb
+    super
+    add_breadcrumb University::Organization.model_name.human(count: 2), university_organizations_path
+    add_breadcrumb @organization if @organization
   end
 end
diff --git a/app/controllers/extranet/persons_controller.rb b/app/controllers/extranet/persons_controller.rb
index 24b55e34c..04043a9c9 100644
--- a/app/controllers/extranet/persons_controller.rb
+++ b/app/controllers/extranet/persons_controller.rb
@@ -1,11 +1,21 @@
-class Extranet::PersonsController < ApplicationController
+class Extranet::PersonsController < Extranet::ApplicationController
   load_and_authorize_resource class: University::Person::Alumnus,
                               through: :current_university,
                               through_association: :people
 
   def index
+    breadcrumb
   end
 
   def show
+    breadcrumb
+  end
+
+  protected
+
+  def breadcrumb
+    super
+    add_breadcrumb University::Person::Alumnus.model_name.human(count: 2), university_persons_path
+    add_breadcrumb @person if @person
   end
 end
diff --git a/app/models/university/person.rb b/app/models/university/person.rb
index 6c58a15b9..457f07b48 100644
--- a/app/models/university/person.rb
+++ b/app/models/university/person.rb
@@ -101,10 +101,10 @@ class University::Person < ApplicationRecord
   before_validation :sanitize_email
 
   scope :ordered,         -> { order(:last_name, :first_name) }
-  scope :administration, -> { where(is_administration: true) }
+  scope :administration,  -> { where(is_administration: true) }
   scope :teachers,        -> { where(is_teacher: true) }
   scope :researchers,     -> { where(is_researcher: true) }
-  scope :alumni,     -> { where(is_alumnus: true) }
+  scope :alumni,          -> { where(is_alumnus: true) }
 
   def to_s
     "#{first_name} #{last_name}"
diff --git a/app/models/university/person/alumnus/import.rb b/app/models/university/person/alumnus/import.rb
index 2f8e7bd17..bf9b5c066 100644
--- a/app/models/university/person/alumnus/import.rb
+++ b/app/models/university/person/alumnus/import.rb
@@ -49,7 +49,7 @@ class University::Person::Alumnus::Import < ApplicationRecord
       # status
       # socialtwitter
       # sociallinkedin
-      row['program'] = '23279cab-8bc1-4c75-bcd8-1fccaa03ad55' #TMP local fix
+      # row['program'] = '23279cab-8bc1-4c75-bcd8-1fccaa03ad55' #TMP local fix
       program = university.education_programs
                           .find_by(id: row['program'])
       next if program.nil?
@@ -79,9 +79,20 @@ class University::Person::Alumnus::Import < ApplicationRecord
       person.is_alumnus = true
       person.url = url
       person.slug = person.to_s.parameterize.dasherize
+      person.twitter = row['socialtwitter']
+      person.linkedin = row['sociallinkedin']
       byebug unless person.valid?
       person.save
       cohort.people << person unless person.in?(cohort.people)
+      photo = row['photo'].to_s
+      if photo.end_with?('.jpg') || photo.end_with?('.png')
+        filename = File.basename photo
+        begin
+          file = URI.open photo
+          person.picture.attach(io: file, filename: 'some-image.jpg')
+        rescue
+        end
+      end
     end
   end
 
diff --git a/app/views/extranet/academic_years/index.html.erb b/app/views/extranet/academic_years/index.html.erb
index b8e0b2fef..88d5b1970 100644
--- a/app/views/extranet/academic_years/index.html.erb
+++ b/app/views/extranet/academic_years/index.html.erb
@@ -1,5 +1,7 @@
 <% content_for :title, Education::AcademicYear.model_name.human(count: 2) %>
 
+<h1><%= Education::AcademicYear.model_name.human(count: 2) %></h1>
+
 <table class="<%= table_classes %>">
   <thead>
     <tr>
diff --git a/app/views/extranet/academic_years/show.html.erb b/app/views/extranet/academic_years/show.html.erb
index 63eacbade..48f1cdc0e 100644
--- a/app/views/extranet/academic_years/show.html.erb
+++ b/app/views/extranet/academic_years/show.html.erb
@@ -1,5 +1,7 @@
 <% content_for :title, @academic_year %>
 
+<h1><%= @academic_year %></h1>
+
 <% @academic_year.cohorts.each do |cohort| %>
   <%= link_to cohort, cohort %>
 <% end %>
diff --git a/app/views/extranet/cohorts/index.html.erb b/app/views/extranet/cohorts/index.html.erb
index 5341018f4..ab5e66756 100644
--- a/app/views/extranet/cohorts/index.html.erb
+++ b/app/views/extranet/cohorts/index.html.erb
@@ -1,5 +1,7 @@
 <% content_for :title, Education::Cohort.model_name.human(count: 2) %>
 
+<h1><%= Education::Cohort.model_name.human(count: 2) %></h1>
+
 <table class="<%= table_classes %>">
   <thead>
     <tr>
@@ -12,7 +14,7 @@
     <% @cohorts.each do |cohort| %>
       <tr>
         <td><%= link_to cohort, cohort %></td>
-        <td></td>
+        <td><%= cohort.people.count %></td>
       </tr>
     <% end %>
   </tbody>
diff --git a/app/views/extranet/cohorts/show.html.erb b/app/views/extranet/cohorts/show.html.erb
index 153a03e9a..87e03ef91 100644
--- a/app/views/extranet/cohorts/show.html.erb
+++ b/app/views/extranet/cohorts/show.html.erb
@@ -1,3 +1,5 @@
 <% content_for :title, @cohort %>
 
+<h1><%= @cohort %></h1>
+
 <%= render 'extranet/persons/list', people: @cohort.people %>
diff --git a/app/views/extranet/organizations/index.html.erb b/app/views/extranet/organizations/index.html.erb
index e8810d4f6..8e991ba36 100644
--- a/app/views/extranet/organizations/index.html.erb
+++ b/app/views/extranet/organizations/index.html.erb
@@ -1,5 +1,7 @@
 <% content_for :title, University::Organization.model_name.human(count: 2) %>
 
+<h1><%= University::Organization.model_name.human(count: 2) %></h1>
+
 <table class="<%= table_classes %>">
   <thead>
     <tr>
diff --git a/app/views/extranet/organizations/show.html.erb b/app/views/extranet/organizations/show.html.erb
index 1a8858a81..39b24130f 100644
--- a/app/views/extranet/organizations/show.html.erb
+++ b/app/views/extranet/organizations/show.html.erb
@@ -1 +1,3 @@
 <% content_for :title, @organization %>
+
+<h1><%= @organization %></h1>
diff --git a/app/views/extranet/persons/_list.html.erb b/app/views/extranet/persons/_list.html.erb
index 8904fd0bf..d642ff08d 100644
--- a/app/views/extranet/persons/_list.html.erb
+++ b/app/views/extranet/persons/_list.html.erb
@@ -6,34 +6,20 @@ people_paged = people.ordered.page(params[:page]).per(60)
 <div class="row">
   <% people_paged.each do |person| %>
     <div class="col-xxl-2 col-md-3">
-      <article class="card mb-4">
-        <div class="card-body">
-          <%= link_to person, class: 'stretched-link' do %>
-            <span class="small"><%= person.first_name %></span><br>
+      <article class="mb-4 position-relative">
+        <% if person.picture.attached? %>
+          <%= kamifusen_tag person.picture, width: 400, class: 'img-fluid' %>
+        <% else %>
+          <%= image_tag 'extranet/avatar.png', width: 400, class: 'img-fluid' %>
+        <% end %>
+        <%= link_to person, class: 'stretched-link' do %>
+          <%= person.first_name %>
+          <b>
             <%= person.last_name %>
-          <% end %>
-        </div>
+          </b>
+        <% end %>
       </article>
     </div>
   <% end %>
 </div>
-
-<table class="<%= table_classes %>">
-  <thead>
-    <tr>
-      <th>Name</th>
-      <th></th>
-    </tr>
-  </thead>
-
-  <tbody>
-    <% people_paged.each do |person| %>
-      <tr>
-        <td><%= link_to person, person %></td>
-        <td></td>
-      </tr>
-    <% end %>
-  </tbody>
-</table>
-
 <%= paginate people_paged, theme: 'bootstrap-5' %>
diff --git a/app/views/extranet/persons/index.html.erb b/app/views/extranet/persons/index.html.erb
index dfd579b63..b854f15b7 100644
--- a/app/views/extranet/persons/index.html.erb
+++ b/app/views/extranet/persons/index.html.erb
@@ -1,3 +1,5 @@
 <% content_for :title, University::Person::Alumnus.model_name.human(count: 2) %>
 
+<h1><%= University::Person::Alumnus.model_name.human(count: 2) %></h1>
+
 <%= render 'extranet/persons/list', people: @people %>
diff --git a/app/views/extranet/persons/show.html.erb b/app/views/extranet/persons/show.html.erb
index c7de7737c..034873013 100644
--- a/app/views/extranet/persons/show.html.erb
+++ b/app/views/extranet/persons/show.html.erb
@@ -1 +1,14 @@
 <% content_for :title, @person %>
+
+<div class="row">
+  <div class="col-md-9">
+    <h1><%= @person %></h1>
+  </div>
+  <div class="col-md-3">
+    <% if @person.picture.attached? %>
+      <%= kamifusen_tag @person.picture, width: 400, class: 'img-fluid' %>
+    <% else %>
+      <%= image_tag 'extranet/avatar.png', width: 400, class: 'img-fluid' %>
+    <% end %>
+  </div>
+</div>
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 2fb378501..d650055e7 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -13,7 +13,6 @@
   <body class="<%= body_classes %>">
     <%= render 'nav' %>
     <main class="container">
-      <h1><%= yield :title %></h1>
       <%= render_breadcrumbs builder: Appstack::BreadcrumbsOnRailsBuilder %>
       <%= yield %>
     </main>
-- 
GitLab