From 17ca614a8383429543a152cb6b23116b26099081 Mon Sep 17 00:00:00 2001 From: Arnaud Levy <contact@arnaudlevy.com> Date: Wed, 16 Mar 2022 17:25:10 +0100 Subject: [PATCH] alumni wip --- app/assets/stylesheets/application.sass | 1 - .../university/person/alumni_controller.rb | 49 +++++++++++++++++++ .../person/alumnus/imports_controller.rb | 43 ++++++++++++++++ app/models/university/person.rb | 2 + app/models/university/person/administrator.rb | 1 + app/models/university/person/alumnus.rb | 1 + .../university/person/alumnus/import.rb | 28 +++++++++++ app/models/university/person/author.rb | 1 + app/models/university/person/researcher.rb | 1 + app/models/university/person/teacher.rb | 1 + .../with_people_and_organizations.rb | 3 ++ .../organization/imports/index.html.erb | 1 + .../university/person/alumni/_list.html.erb | 16 ++++++ .../university/person/alumni/index.html.erb | 14 ++++++ .../person/alumnus/imports/index.html.erb | 22 +++++++++ .../person/alumnus/imports/new.html.erb | 5 ++ .../person/alumnus/imports/show.html.erb | 14 ++++++ config/admin_navigation.rb | 2 +- config/locales/university/en.yml | 3 ++ config/locales/university/fr.yml | 3 ++ config/routes.rb | 7 +++ config/routes/admin/university.rb | 6 +++ ...reate_university_person_alumnus_imports.rb | 10 ++++ ...155340_add_alumnus_to_university_person.rb | 5 ++ db/schema.rb | 3 +- .../person/alumnus/imports_controller_test.rb | 48 ++++++++++++++++++ .../university/person/alumnus/imports.yml | 9 ++++ .../university/person/alumnus/import_test.rb | 7 +++ .../university/person/alumnus/imports_test.rb | 45 +++++++++++++++++ 29 files changed, 348 insertions(+), 3 deletions(-) create mode 100644 app/controllers/admin/university/person/alumni_controller.rb create mode 100644 app/controllers/admin/university/person/alumnus/imports_controller.rb create mode 100644 app/models/university/person/alumnus/import.rb create mode 100644 app/views/admin/university/person/alumni/_list.html.erb create mode 100644 app/views/admin/university/person/alumni/index.html.erb create mode 100644 app/views/admin/university/person/alumnus/imports/index.html.erb create mode 100644 app/views/admin/university/person/alumnus/imports/new.html.erb create mode 100644 app/views/admin/university/person/alumnus/imports/show.html.erb create mode 100644 db/migrate/20220316153148_create_university_person_alumnus_imports.rb create mode 100644 db/migrate/20220316155340_add_alumnus_to_university_person.rb create mode 100644 test/controllers/university/person/alumnus/imports_controller_test.rb create mode 100644 test/fixtures/university/person/alumnus/imports.yml create mode 100644 test/models/university/person/alumnus/import_test.rb create mode 100644 test/system/university/person/alumnus/imports_test.rb diff --git a/app/assets/stylesheets/application.sass b/app/assets/stylesheets/application.sass index 819e1e0d4..bef6a9cea 100644 --- a/app/assets/stylesheets/application.sass +++ b/app/assets/stylesheets/application.sass @@ -1,5 +1,4 @@ @import 'bootstrap' -@import 'appstack/light' @import 'simple_form_password_with_hints' @import 'simple_form_bs5_file_input' @import 'cropperjs/dist/cropper' diff --git a/app/controllers/admin/university/person/alumni_controller.rb b/app/controllers/admin/university/person/alumni_controller.rb new file mode 100644 index 000000000..5fd37feb5 --- /dev/null +++ b/app/controllers/admin/university/person/alumni_controller.rb @@ -0,0 +1,49 @@ +class Admin::University::Person::AlumniController < Admin::University::ApplicationController + before_action :load_alumnus, only: [:show, :edit, :update] + + def index + @alumni = current_university.people + .alumni + .accessible_by(current_ability) + .ordered + .page(params[:page]) + breadcrumb + end + + def show + breadcrumb + end + + def edit + breadcrumb + add_breadcrumb t('edit') + end + + def update + if @alumnus.update(alumnus_params) + redirect_to [:admin, @alumnus], + notice: t('admin.successfully_updated_html', model: @alumnus.to_s) + else + render :edit + breadcrumb + add_breadcrumb t('edit') + end + end + + protected + + def breadcrumb + super + add_breadcrumb University::Person::Alumnus.model_name.human(count: 2), + admin_university_person_alumni_index_path + breadcrumb_for @alumnus + end + + def load_alumnus + end + + def alumnus_params + params.require(:university_person_alumnus) + .permit() + end +end diff --git a/app/controllers/admin/university/person/alumnus/imports_controller.rb b/app/controllers/admin/university/person/alumnus/imports_controller.rb new file mode 100644 index 000000000..e642d250a --- /dev/null +++ b/app/controllers/admin/university/person/alumnus/imports_controller.rb @@ -0,0 +1,43 @@ +class Admin::University::Person::Alumnus::ImportsController < Admin::University::ApplicationController + load_and_authorize_resource class: University::Person::Alumnus::Import, + through: :current_university, + through_association: :person_alumnus_imports + + def index + breadcrumb + end + + def show + breadcrumb + end + + def new + breadcrumb + end + + def create + @import.university = current_university + @import.user = current_user + if @import.save + redirect_to [:admin, @import], notice: "Import was successfully created." + else + render :new, status: :unprocessable_entity + end + end + + protected + + def breadcrumb + super + add_breadcrumb University::Person::Alumnus.model_name.human(count: 2), + admin_university_person_alumni_index_path + add_breadcrumb University::Person::Alumnus::Import.model_name.human(count: 2), + admin_university_person_alumnus_imports_path + breadcrumb_for @import + end + + def import_params + params.require(:university_person_alumnus_import) + .permit(:file) + end +end diff --git a/app/models/university/person.rb b/app/models/university/person.rb index de5dd5cce..6c58a15b9 100644 --- a/app/models/university/person.rb +++ b/app/models/university/person.rb @@ -9,6 +9,7 @@ # first_name :string # habilitation :boolean default(FALSE) # is_administration :boolean +# is_alumnus :boolean default(FALSE) # is_researcher :boolean # is_teacher :boolean # last_name :string @@ -103,6 +104,7 @@ class University::Person < ApplicationRecord scope :administration, -> { where(is_administration: true) } scope :teachers, -> { where(is_teacher: true) } scope :researchers, -> { where(is_researcher: true) } + scope :alumni, -> { where(is_alumnus: true) } def to_s "#{first_name} #{last_name}" diff --git a/app/models/university/person/administrator.rb b/app/models/university/person/administrator.rb index 9399c21e3..178b11e82 100644 --- a/app/models/university/person/administrator.rb +++ b/app/models/university/person/administrator.rb @@ -9,6 +9,7 @@ # first_name :string # habilitation :boolean default(FALSE) # is_administration :boolean +# is_alumnus :boolean default(FALSE) # is_researcher :boolean # is_teacher :boolean # last_name :string diff --git a/app/models/university/person/alumnus.rb b/app/models/university/person/alumnus.rb index 242788896..477f0ef30 100644 --- a/app/models/university/person/alumnus.rb +++ b/app/models/university/person/alumnus.rb @@ -9,6 +9,7 @@ # first_name :string # habilitation :boolean default(FALSE) # is_administration :boolean +# is_alumnus :boolean default(FALSE) # is_researcher :boolean # is_teacher :boolean # last_name :string diff --git a/app/models/university/person/alumnus/import.rb b/app/models/university/person/alumnus/import.rb new file mode 100644 index 000000000..4a7a12f93 --- /dev/null +++ b/app/models/university/person/alumnus/import.rb @@ -0,0 +1,28 @@ +class University::Person::Alumnus::Import < ApplicationRecord + include WithUniversity + + belongs_to :user + + has_one_attached :file + + after_save :parse + + def self.polymorphic_name + 'University::Person::Alumnus::Import' + end + + def lines + csv.count + rescue + 'NA' + end + + def to_s + "#{user}, #{I18n.l created_at}" + end + + protected + + def parse + end +end diff --git a/app/models/university/person/author.rb b/app/models/university/person/author.rb index 60b4ff639..50c3f8280 100644 --- a/app/models/university/person/author.rb +++ b/app/models/university/person/author.rb @@ -9,6 +9,7 @@ # first_name :string # habilitation :boolean default(FALSE) # is_administration :boolean +# is_alumnus :boolean default(FALSE) # is_researcher :boolean # is_teacher :boolean # last_name :string diff --git a/app/models/university/person/researcher.rb b/app/models/university/person/researcher.rb index 396d77c3c..2e7428dda 100644 --- a/app/models/university/person/researcher.rb +++ b/app/models/university/person/researcher.rb @@ -9,6 +9,7 @@ # first_name :string # habilitation :boolean default(FALSE) # is_administration :boolean +# is_alumnus :boolean default(FALSE) # is_researcher :boolean # is_teacher :boolean # last_name :string diff --git a/app/models/university/person/teacher.rb b/app/models/university/person/teacher.rb index 69724392c..35e936ee7 100644 --- a/app/models/university/person/teacher.rb +++ b/app/models/university/person/teacher.rb @@ -9,6 +9,7 @@ # first_name :string # habilitation :boolean default(FALSE) # is_administration :boolean +# is_alumnus :boolean default(FALSE) # is_researcher :boolean # is_teacher :boolean # last_name :string diff --git a/app/models/university/with_people_and_organizations.rb b/app/models/university/with_people_and_organizations.rb index d943867e0..ad270f63a 100644 --- a/app/models/university/with_people_and_organizations.rb +++ b/app/models/university/with_people_and_organizations.rb @@ -11,5 +11,8 @@ module University::WithPeopleAndOrganizations has_many :organization_imports, class_name: 'University::Organization::Import', dependent: :destroy + has_many :person_alumnus_imports, + class_name: 'University::Person::Alumnus::Import', + dependent: :destroy end end diff --git a/app/views/admin/university/organization/imports/index.html.erb b/app/views/admin/university/organization/imports/index.html.erb index 7a1332c6f..f06991e44 100644 --- a/app/views/admin/university/organization/imports/index.html.erb +++ b/app/views/admin/university/organization/imports/index.html.erb @@ -16,6 +16,7 @@ <% end %> </tbody> </table> + <% content_for :action_bar_right do %> <%= create_link University::Organization::Import %> <% end %> diff --git a/app/views/admin/university/person/alumni/_list.html.erb b/app/views/admin/university/person/alumni/_list.html.erb new file mode 100644 index 000000000..8af5512e6 --- /dev/null +++ b/app/views/admin/university/person/alumni/_list.html.erb @@ -0,0 +1,16 @@ +<table class="<%= table_classes %>"> + <thead> + <tr> + <th><%= University::Person.human_attribute_name('last_name') %></th> + <th><%= University::Person.human_attribute_name('first_name') %></th> + </tr> + </thead> + <tbody> + <% alumni.each do |alumnus| %> + <tr> + <td><%= link_to alumnus.last_name, admin_university_alumnus_path(alumnus) %></td> + <td><%= link_to alumnus.first_name, admin_university_alumnus_path(alumnus) %></td> + </tr> + <% end %> + </tbody> +</table> diff --git a/app/views/admin/university/person/alumni/index.html.erb b/app/views/admin/university/person/alumni/index.html.erb new file mode 100644 index 000000000..ce860626c --- /dev/null +++ b/app/views/admin/university/person/alumni/index.html.erb @@ -0,0 +1,14 @@ +<% content_for :title, "#{University::Person::Alumnus.model_name.human(count: 2)} (#{@alumni.total_count})" %> + +<%= render 'admin/university/person/alumni/list', alumni: @alumni %> + +<%= paginate @alumni, theme: 'bootstrap-5' %> + +<% content_for :action_bar_left do %> + <%#= link_to t('import'), + admin_university_person_alumnus_imports_path, + class: button_classes if can? :manage, University::Person::Alumnus::Import %> +<% end %> + +<% content_for :action_bar_right do %> +<% end %> diff --git a/app/views/admin/university/person/alumnus/imports/index.html.erb b/app/views/admin/university/person/alumnus/imports/index.html.erb new file mode 100644 index 000000000..d5374b649 --- /dev/null +++ b/app/views/admin/university/person/alumnus/imports/index.html.erb @@ -0,0 +1,22 @@ +<% content_for :title, University::Person::Alumnus::Import.model_name.human(count: 2) %> + +<table class="<%= table_classes %>"> + <thead> + <tr> + <th><%= University::Person::Alumnus::Import.human_attribute_name('name') %></th> + <th><%= University::Person::Alumnus::Import.human_attribute_name('lines') %></th> + </tr> + </thead> + <tbody> + <% @imports.each do |import| %> + <tr> + <td><%= link_to import, [:admin, import] %></td> + <td><%= import.lines %></td> + </tr> + <% end %> + </tbody> +</table> + +<% content_for :action_bar_right do %> + <%= create_link University::Person::Alumnus::Import %> +<% end %> diff --git a/app/views/admin/university/person/alumnus/imports/new.html.erb b/app/views/admin/university/person/alumnus/imports/new.html.erb new file mode 100644 index 000000000..a514d9942 --- /dev/null +++ b/app/views/admin/university/person/alumnus/imports/new.html.erb @@ -0,0 +1,5 @@ +<h1>New University Person Alumnus Import</h1> + +<%= render 'form', university_person_alumnus_import: @university_person_alumnus_import %> + +<%= link_to 'Back', university_person_alumnus_imports_path %> diff --git a/app/views/admin/university/person/alumnus/imports/show.html.erb b/app/views/admin/university/person/alumnus/imports/show.html.erb new file mode 100644 index 000000000..a5c23fddc --- /dev/null +++ b/app/views/admin/university/person/alumnus/imports/show.html.erb @@ -0,0 +1,14 @@ +<p id="notice"><%= notice %></p> + +<p> + <strong>University:</strong> + <%= @university_person_alumnus_import.university_id %> +</p> + +<p> + <strong>User:</strong> + <%= @university_person_alumnus_import.user_id %> +</p> + +<%= link_to 'Edit', edit_university_person_alumnus_import_path(@university_person_alumnus_import) %> | +<%= link_to 'Back', university_person_alumnus_imports_path %> diff --git a/config/admin_navigation.rb b/config/admin_navigation.rb index 4ad235c33..acd7fbcfa 100644 --- a/config/admin_navigation.rb +++ b/config/admin_navigation.rb @@ -10,6 +10,7 @@ SimpleNavigation::Configuration.run do |navigation| primary.item :university, University.model_name.human, nil, { kind: :header } primary.item :university, University::Person.model_name.human(count: 2), admin_university_people_path, { icon: 'users-cog' } primary.item :university, University::Organization.model_name.human(count: 2), admin_university_organizations_path, { icon: 'building' } + primary.item :communication_alumni, University::Person::Alumnus.model_name.human(count: 2), admin_university_person_alumni_index_path, { icon: 'users' } end if can?(:read, Education::Program) @@ -35,7 +36,6 @@ SimpleNavigation::Configuration.run do |navigation| primary.item :communication_websites, Communication::Website.model_name.human(count: 2), admin_communication_websites_path, { icon: 'sitemap' } if can?(:read, Communication::Website) primary.item :communication_extranets, Communication::Extranet.model_name.human(count: 2), admin_communication_extranets_path, { icon: 'project-diagram' } primary.item :communication_newsletters, 'Lettres d\'information', nil, { icon: 'envelope' } - primary.item :communication_alumni, 'Alumni', nil, { icon: 'users' } end if can?(:read, Administration::Qualiopi::Criterion) diff --git a/config/locales/university/en.yml b/config/locales/university/en.yml index 9204e1417..10e334422 100644 --- a/config/locales/university/en.yml +++ b/config/locales/university/en.yml @@ -64,6 +64,9 @@ en: university/person/involvement: one: Involvement other: Involvements + university/person/alumnus: + one: Alumnus + other: Alumni university/organization: one: Third party other: Third parties diff --git a/config/locales/university/fr.yml b/config/locales/university/fr.yml index 418aefe39..aa0fb6657 100644 --- a/config/locales/university/fr.yml +++ b/config/locales/university/fr.yml @@ -64,6 +64,9 @@ fr: university/person/involvement: one: Implication other: Implications + university/person/alumnus: + one: Alumnus + other: Alumni university/organization: one: Tierce partie other: Tierces parties diff --git a/config/routes.rb b/config/routes.rb index 45bd12e82..03d12edd3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,11 @@ Rails.application.routes.draw do + namespace :university do + namespace :person do + namespace :alumnus do + resources :imports + end + end + end resources :university_person_alumnus_imports authenticated :user, -> user { user.server_admin? } do match "/delayed_job" => DelayedJobWeb, :anchor => false, :via => [:get, :post] diff --git a/config/routes/admin/university.rb b/config/routes/admin/university.rb index cb94a97ad..dedeb7272 100644 --- a/config/routes/admin/university.rb +++ b/config/routes/admin/university.rb @@ -3,4 +3,10 @@ namespace :university do namespace :organization do resources :imports, only: [:index, :show, :new, :create] end + namespace :person do + resources :alumni + namespace :alumnus do + resources :imports, only: [:index, :show, :new, :create] + end + end end diff --git a/db/migrate/20220316153148_create_university_person_alumnus_imports.rb b/db/migrate/20220316153148_create_university_person_alumnus_imports.rb new file mode 100644 index 000000000..635181158 --- /dev/null +++ b/db/migrate/20220316153148_create_university_person_alumnus_imports.rb @@ -0,0 +1,10 @@ +class CreateUniversityPersonAlumnusImports < ActiveRecord::Migration[6.1] + def change + create_table :university_person_alumnus_imports, id: :uuid do |t| + t.references :university, null: false, foreign_key: true, type: :uuid + t.references :user, null: false, foreign_key: true, type: :uuid + + t.timestamps + end + end +end diff --git a/db/migrate/20220316155340_add_alumnus_to_university_person.rb b/db/migrate/20220316155340_add_alumnus_to_university_person.rb new file mode 100644 index 000000000..901ee02fb --- /dev/null +++ b/db/migrate/20220316155340_add_alumnus_to_university_person.rb @@ -0,0 +1,5 @@ +class AddAlumnusToUniversityPerson < ActiveRecord::Migration[6.1] + def change + add_column :university_people, :is_alumnus, :bool, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 67016a4c7..4e642214a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_03_16_151533) do +ActiveRecord::Schema.define(version: 2022_03_16_155340) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" @@ -646,6 +646,7 @@ ActiveRecord::Schema.define(version: 2022_03_16_151533) do t.string "url" t.string "twitter" t.string "linkedin" + t.boolean "is_alumnus", default: false t.index ["university_id"], name: "index_university_people_on_university_id" t.index ["user_id"], name: "index_university_people_on_user_id" end diff --git a/test/controllers/university/person/alumnus/imports_controller_test.rb b/test/controllers/university/person/alumnus/imports_controller_test.rb new file mode 100644 index 000000000..8585a49c7 --- /dev/null +++ b/test/controllers/university/person/alumnus/imports_controller_test.rb @@ -0,0 +1,48 @@ +require "test_helper" + +class University::Person::Alumnus::ImportsControllerTest < ActionDispatch::IntegrationTest + setup do + @university_person_alumnus_import = university_person_alumnus_imports(:one) + end + + test "should get index" do + get university_person_alumnus_imports_url + assert_response :success + end + + test "should get new" do + get new_university_person_alumnus_import_url + assert_response :success + end + + test "should create university_person_alumnus_import" do + assert_difference('University::Person::Alumnus::Import.count') do + post university_person_alumnus_imports_url, params: { university_person_alumnus_import: { university_id: @university_person_alumnus_import.university_id, user_id: @university_person_alumnus_import.user_id } } + end + + assert_redirected_to university_person_alumnus_import_url(University::Person::Alumnus::Import.last) + end + + test "should show university_person_alumnus_import" do + get university_person_alumnus_import_url(@university_person_alumnus_import) + assert_response :success + end + + test "should get edit" do + get edit_university_person_alumnus_import_url(@university_person_alumnus_import) + assert_response :success + end + + test "should update university_person_alumnus_import" do + patch university_person_alumnus_import_url(@university_person_alumnus_import), params: { university_person_alumnus_import: { university_id: @university_person_alumnus_import.university_id, user_id: @university_person_alumnus_import.user_id } } + assert_redirected_to university_person_alumnus_import_url(@university_person_alumnus_import) + end + + test "should destroy university_person_alumnus_import" do + assert_difference('University::Person::Alumnus::Import.count', -1) do + delete university_person_alumnus_import_url(@university_person_alumnus_import) + end + + assert_redirected_to university_person_alumnus_imports_url + end +end diff --git a/test/fixtures/university/person/alumnus/imports.yml b/test/fixtures/university/person/alumnus/imports.yml new file mode 100644 index 000000000..b712a4f08 --- /dev/null +++ b/test/fixtures/university/person/alumnus/imports.yml @@ -0,0 +1,9 @@ +# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + university: one + user: one + +two: + university: two + user: two diff --git a/test/models/university/person/alumnus/import_test.rb b/test/models/university/person/alumnus/import_test.rb new file mode 100644 index 000000000..980cdf30a --- /dev/null +++ b/test/models/university/person/alumnus/import_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class University::Person::Alumnus::ImportTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/system/university/person/alumnus/imports_test.rb b/test/system/university/person/alumnus/imports_test.rb new file mode 100644 index 000000000..1f10cd1aa --- /dev/null +++ b/test/system/university/person/alumnus/imports_test.rb @@ -0,0 +1,45 @@ +require "application_system_test_case" + +class University::Person::Alumnus::ImportsTest < ApplicationSystemTestCase + setup do + @university_person_alumnus_import = university_person_alumnus_imports(:one) + end + + test "visiting the index" do + visit university_person_alumnus_imports_url + assert_selector "h1", text: "University/Person/Alumnus/Imports" + end + + test "creating a Import" do + visit university_person_alumnus_imports_url + click_on "New University/Person/Alumnus/Import" + + fill_in "University", with: @university_person_alumnus_import.university_id + fill_in "User", with: @university_person_alumnus_import.user_id + click_on "Create Import" + + assert_text "Import was successfully created" + click_on "Back" + end + + test "updating a Import" do + visit university_person_alumnus_imports_url + click_on "Edit", match: :first + + fill_in "University", with: @university_person_alumnus_import.university_id + fill_in "User", with: @university_person_alumnus_import.user_id + click_on "Update Import" + + assert_text "Import was successfully updated" + click_on "Back" + end + + test "destroying a Import" do + visit university_person_alumnus_imports_url + page.accept_confirm do + click_on "Destroy", match: :first + end + + assert_text "Import was successfully destroyed" + end +end -- GitLab