diff --git a/app/assets/stylesheets/application.sass b/app/assets/stylesheets/application.sass index 819e1e0d4ec1e07d84d8299ae5dd4435054b3481..bef6a9cead9235805b894cce93ab033396d3d277 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 0000000000000000000000000000000000000000..5fd37feb5fe71ec1dcfa38d79399392d8605877d --- /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 0000000000000000000000000000000000000000..e642d250a3dc139d200894d22cd92fa00642826c --- /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 de5dd5cceeccccc96dc41f5e3e25555d762a2afb..6c58a15b9ba793989e9a11a6f6fab3e25c76a46b 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 9399c21e3598e8d82ece6e5b747392203ef24646..178b11e82f030c82f67bc24b07dc34df48280077 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 242788896e2aa638bb149c5f111697c9dce165c4..477f0ef3006f781d0b03afeca3c420ae499844e1 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 0000000000000000000000000000000000000000..4a7a12f939b31d9bb3a17750b64fb9e5481bdf88 --- /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 60b4ff63931f09a75103d8d843c181572bbacc0e..50c3f82805545c64c9858d944b036ba101589a5c 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 396d77c3cfec3df45e51de28f523d2ac0bdd4e04..2e7428dda6480b9a4f2837689c1732fcc90b9aa4 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 69724392c474760be6e1dc99e2556c0cad1a667d..35e936ee7c9c1722c1d26db0fb044ed1c2cb2fdb 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 d943867e07b1dd6384584dccba13588c4267886f..ad270f63a8638aaef1549a029877ca523464715c 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 7a1332c6f3bd64a31f9c676bc5fcf1dd878484b3..f06991e44d360ce2c18927d7cb4c75eda6ded0a5 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 0000000000000000000000000000000000000000..8af5512e6a9143ebe7963c73ebd7c99e2909949b --- /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 0000000000000000000000000000000000000000..ce860626c5d2b4bcd035c4972cece95bdf59cb31 --- /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 0000000000000000000000000000000000000000..d5374b64929038ce56c32fa4c9d5c002d7e2bb20 --- /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 0000000000000000000000000000000000000000..a514d9942781af359288e71a342212ec835b5b9c --- /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 0000000000000000000000000000000000000000..a5c23fddcaf793d868a1135b6dbfa9bb8bada017 --- /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 4ad235c332b336ebd1ebf98761c62ef0d092d408..acd7fbcfa19f513f953b419c35dd03782581e644 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 9204e1417459ddd7190ad073d768e78e082c7dcc..10e33442220e2e96674b50d4367dcfe8790d9177 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 418aefe390cd75ee2c928a8b9ea93c7d24487e0f..aa0fb66570808190c1001b8287bb66fbe8767d61 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 45bd12e82b6fe14b93709110a5231924c2b8f66c..03d12edd360278aaaf6706abfd504cc82a4e482c 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 cb94a97adfd364b3f68d1b59329de85b32ba0106..dedeb7272fe48278cfa7c9b4faae1b2eca7576af 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 0000000000000000000000000000000000000000..63518115812fad1cd450f76500aa786d0c9f50b2 --- /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 0000000000000000000000000000000000000000..901ee02fbf82695f8fa3cc97c98aacf8665807d1 --- /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 67016a4c70bbe516bc96db755e68b019cb504445..4e642214aa015b7ce23a3e962fd677783c71bb2c 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 0000000000000000000000000000000000000000..8585a49c7011147fefa9cbd786ca351bb596c732 --- /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 0000000000000000000000000000000000000000..b712a4f085ce90979c3d55bd7882a7444d713141 --- /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 0000000000000000000000000000000000000000..980cdf30ab5264c860fa05921360e8c4506217fc --- /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 0000000000000000000000000000000000000000..1f10cd1aaaa7814bb3fa822293d0faf11efa69ae --- /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