From 291339bf221014b3ee759d74cb768f3f20549686 Mon Sep 17 00:00:00 2001 From: pabois <pierreandre.boissinot@noesya.coop> Date: Tue, 14 Dec 2021 12:18:18 +0100 Subject: [PATCH] wip members --- .../administration/members_controller.rb | 63 +++++++++++++++++++ app/models/administration/member.rb | 42 +++++++++++++ app/models/university.rb | 1 + app/models/university/with_administration.rb | 7 +++ .../administration/members/_form.html.erb | 54 ++++++++++++++++ .../administration/members/_list.html.erb | 27 ++++++++ .../administration/members/edit.html.erb | 3 + .../administration/members/index.html.erb | 9 +++ .../administration/members/jekyll.html.erb | 15 +++++ .../admin/administration/members/new.html.erb | 3 + .../administration/members/show.html.erb | 28 +++++++++ config/admin_navigation.rb | 2 +- config/locales/administration/en.yml | 15 +++++ config/locales/administration/fr.yml | 15 +++++ config/routes/admin/administration.rb | 2 + ...1214101323_create_administration_member.rb | 16 +++++ db/schema.rb | 20 +++++- 17 files changed, 320 insertions(+), 2 deletions(-) create mode 100644 app/controllers/admin/administration/members_controller.rb create mode 100644 app/models/administration/member.rb create mode 100644 app/models/university/with_administration.rb create mode 100644 app/views/admin/administration/members/_form.html.erb create mode 100644 app/views/admin/administration/members/_list.html.erb create mode 100644 app/views/admin/administration/members/edit.html.erb create mode 100644 app/views/admin/administration/members/index.html.erb create mode 100644 app/views/admin/administration/members/jekyll.html.erb create mode 100644 app/views/admin/administration/members/new.html.erb create mode 100644 app/views/admin/administration/members/show.html.erb create mode 100644 db/migrate/20211214101323_create_administration_member.rb diff --git a/app/controllers/admin/administration/members_controller.rb b/app/controllers/admin/administration/members_controller.rb new file mode 100644 index 000000000..fb2384cad --- /dev/null +++ b/app/controllers/admin/administration/members_controller.rb @@ -0,0 +1,63 @@ +class Admin::Administration::MembersController < Admin::Administration::ApplicationController + load_and_authorize_resource class: Administration::Member, + through: :current_university, + through_association: :members + + def index + @members = @members.ordered.page(params[:page]) + breadcrumb + end + + def show + breadcrumb + end + + def new + breadcrumb + end + + def edit + breadcrumb + add_breadcrumb t('edit') + end + + def create + if @member.save + redirect_to admin_administration_member_path(@member), notice: t('admin.successfully_created_html', model: @member.to_s) + else + breadcrumb + render :new, status: :unprocessable_entity + end + end + + def update + if @member.update(member_params) + redirect_to admin_administration_member_path(@member), notice: t('admin.successfully_updated_html', model: @member.to_s) + else + breadcrumb + add_breadcrumb t('edit') + render :edit, status: :unprocessable_entity + end + end + + def destroy + @member.destroy + redirect_to admin_administration_members_url, notice: t('admin.successfully_destroyed_html', model: @member.to_s) + end + + protected + + def breadcrumb + super + add_breadcrumb Administration::Member.model_name.human(count: 2), + admin_administration_members_path + breadcrumb_for @member + end + + def member_params + params.require(:administration_member) + .permit(:first_name, :last_name, :biography, :slug, :user_id, + :is_author, :is_researcher, :is_teacher, :is_administrative) + .merge(university_id: current_university.id) + end +end diff --git a/app/models/administration/member.rb b/app/models/administration/member.rb new file mode 100644 index 000000000..aec03d418 --- /dev/null +++ b/app/models/administration/member.rb @@ -0,0 +1,42 @@ +# == Schema Information +# +# Table name: administration_members +# +# id :uuid not null, primary key +# first_name :string +# is_administrative :boolean +# is_author :boolean +# is_researcher :boolean +# is_teacher :boolean +# last_name :string +# slug :string +# created_at :datetime not null +# updated_at :datetime not null +# university_id :uuid not null +# user_id :uuid +# +# Indexes +# +# index_administration_members_on_university_id (university_id) +# index_administration_members_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (university_id => universities.id) +# fk_rails_... (user_id => users.id) +# +class Administration::Member < ApplicationRecord + include WithSlug + + has_rich_text :biography + + belongs_to :university + belongs_to :user, optional: true + + scope :ordered, -> { order(:last_name, :first_name) } + + def to_s + "#{last_name} #{first_name}" + end + +end diff --git a/app/models/university.rb b/app/models/university.rb index 2b3ff4bce..6d027182e 100644 --- a/app/models/university.rb +++ b/app/models/university.rb @@ -17,6 +17,7 @@ # updated_at :datetime not null # class University < ApplicationRecord + include WithAdministration include WithCommunication include WithEducation include WithIdentifier diff --git a/app/models/university/with_administration.rb b/app/models/university/with_administration.rb new file mode 100644 index 000000000..2db83f980 --- /dev/null +++ b/app/models/university/with_administration.rb @@ -0,0 +1,7 @@ +module University::WithAdministration + extend ActiveSupport::Concern + + included do + has_many :members, class_name: 'Administration::Member', dependent: :destroy + end +end diff --git a/app/views/admin/administration/members/_form.html.erb b/app/views/admin/administration/members/_form.html.erb new file mode 100644 index 000000000..39f5ea34f --- /dev/null +++ b/app/views/admin/administration/members/_form.html.erb @@ -0,0 +1,54 @@ +<%= simple_form_for [:admin, member] do |f| %> + <div class="row"> + <div class="col-md-4"> + <div class="card flex-fill w-100"> + <div class="card-header"> + <h5 class="card-title mb-0"><%= t('content') %></h5> + </div> + <div class="card-body"> + <div class="row"> + <div class="col-md-6"> + <%= f.input :first_name %> + </div> + <div class="col-md-6"> + <%= f.input :last_name %> + </div> + </div> + <%= f.input :biography, as: :rich_text_area %> + </div> + </div> + </div> + <div class="col-md-4"> + <div class="card flex-fill w-100"> + <div class="card-header"> + <h5 class="card-title mb-0"><%= Administration::Member.human_attribute_name('abilities') %></h5> + </div> + <div class="card-body"> + <%= f.input :is_author %> + <%= f.input :is_teacher %> + <%= f.input :is_researcher %> + <%= f.input :is_administrative %> + </div> + </div> + </div> + <div class="col-md-4"> + <div class="card flex-fill w-100"> + <div class="card-header"> + <h5 class="card-title mb-0"><%= t('metadata') %></h5> + </div> + <div class="card-body"> + <%= f.input :slug, + as: :string, + input_html: member.persisted? ? {} : { + class: 'js-slug-input', + data: { source: '#administration_member_first_name, #administration_member_last_name' } + } %> + <%= f.association :user, collection: current_university.users.ordered %> + </div> + </div> + </div> + </div> + <% content_for :action_bar_right do %> + <%= submit f %> + <% end %> +<% end %> diff --git a/app/views/admin/administration/members/_list.html.erb b/app/views/admin/administration/members/_list.html.erb new file mode 100644 index 000000000..f1cdd3ffb --- /dev/null +++ b/app/views/admin/administration/members/_list.html.erb @@ -0,0 +1,27 @@ +<table class="<%= table_classes %>"> + <thead> + <tr> + <th><%= Administration::Member.human_attribute_name('name') %></th> + <th></th> + </tr> + </thead> + <tbody> + <% members.each do |member| %> + <tr> + <td><%= link_to member, admin_administration_member_path(member) %></td> + <td class="text-end"> + <div class="btn-group" role="group"> + <%= link_to t('edit'), + edit_admin_administration_member_path(member), + class: button_classes %> + <%= link_to t('delete'), + admin_administration_member_path(member), + method: :delete, + data: { confirm: t('please-confirm') }, + class: button_classes_danger %> + </div> + </td> + </tr> + <% end %> + </tbody> +</table> diff --git a/app/views/admin/administration/members/edit.html.erb b/app/views/admin/administration/members/edit.html.erb new file mode 100644 index 000000000..8a3aebfee --- /dev/null +++ b/app/views/admin/administration/members/edit.html.erb @@ -0,0 +1,3 @@ +<% content_for :title, @member %> + +<%= render 'form', member: @member %> diff --git a/app/views/admin/administration/members/index.html.erb b/app/views/admin/administration/members/index.html.erb new file mode 100644 index 000000000..039234504 --- /dev/null +++ b/app/views/admin/administration/members/index.html.erb @@ -0,0 +1,9 @@ +<% content_for :title, "#{Administration::Member.model_name.human(count: 2)} (#{@members.total_count})" %> + +<%= render 'admin/administration/members/list', members: @members %> +<%= paginate @members, theme: 'bootstrap-5' %> + + +<% content_for :action_bar_right do %> + <%= create_link Administration::Member %> +<% end %> diff --git a/app/views/admin/administration/members/jekyll.html.erb b/app/views/admin/administration/members/jekyll.html.erb new file mode 100644 index 000000000..2f03ceced --- /dev/null +++ b/app/views/admin/administration/members/jekyll.html.erb @@ -0,0 +1,15 @@ +--- +title: "<%= @teacher.to_s %>" +identifier: "<%= @teacher.id %>" +first_name: "<%= @teacher.first_name %>" +last_name: "<%= @teacher.last_name %>" +slug: "<%= @teacher.slug %>" +<% if @teacher.programs.any? %> +programs: + <% @teacher.programs.each do |program| %> + - "<%= program.id %>" + <% end %> +<% end %> +biography: > + <%= prepare_for_github @teacher.biography, @teacher.university %> +--- diff --git a/app/views/admin/administration/members/new.html.erb b/app/views/admin/administration/members/new.html.erb new file mode 100644 index 000000000..47b25fa3e --- /dev/null +++ b/app/views/admin/administration/members/new.html.erb @@ -0,0 +1,3 @@ +<% content_for :title, Administration::Member.model_name.human %> + +<%= render 'form', member: @member %> diff --git a/app/views/admin/administration/members/show.html.erb b/app/views/admin/administration/members/show.html.erb new file mode 100644 index 000000000..85793fc7f --- /dev/null +++ b/app/views/admin/administration/members/show.html.erb @@ -0,0 +1,28 @@ +<% content_for :title, @member %> + +<div class="row"> + + <div class="col-md-8"> + <div class="card flex-fill w-100"> + <div class="card-header"> + <h2 class="card-title mb-0 h5"><%= t('metadata') %></h2> + </div> + <div class="card-body"> + <h3 class="h5"><%= Administration::Member.human_attribute_name('biography') %></h3> + <p><%= @member.biography %></p> + <h3 class="h5"><%= Administration::Member.human_attribute_name('slug') %></h3> + <p><%= @member.slug %></p> + <% if @member.user %> + <h3 class="h5"><%= Administration::Member.human_attribute_name('user') %></h3> + <p><%= link_to_if can?(:read, @member.user), @member.user, admin_user_path(@member.user) %></p> + <% end %> + </div> + </div> + </div> + +</div> + + +<% content_for :action_bar_right do %> + <%= edit_link @member %> +<% end %> diff --git a/config/admin_navigation.rb b/config/admin_navigation.rb index aee969e3a..4ff4e4eb8 100644 --- a/config/admin_navigation.rb +++ b/config/admin_navigation.rb @@ -32,7 +32,7 @@ SimpleNavigation::Configuration.run do |navigation| if can?(:read, User) || can?(:read, Administration::Qualiopi::Criterion) primary.item :administration, 'Administration', nil, { kind: :header } - primary.item :administration, 'Équipe administrative', nil, { icon: 'users-cog' } + primary.item :administration, Administration::Member.model_name.human(count: 2), admin_administration_members_path, { icon: 'users-cog' } primary.item :administration, 'Campus', nil, { icon: 'map-marker-alt' } primary.item :administration, 'Admissions', nil, { icon: 'door-open' } primary.item :administration, 'Statistiques', nil, { icon: 'cog' } diff --git a/config/locales/administration/en.yml b/config/locales/administration/en.yml index ee9d57f1e..05c6ad9c7 100644 --- a/config/locales/administration/en.yml +++ b/config/locales/administration/en.yml @@ -10,7 +10,22 @@ en: administration/qualiopi/indicator: one: Indicator other: Indicators + administration/member: + one: Staff + other: Staff attributes: + administration/member: + abilities: Abilities + biography: Biography + first_name: First name + is_administrative: Administrative staff + is_author: Author + is_researcher: Researcher + is_teacher: Teacher + last_name: Last name + name: Name + slug: Slug + user: User administration/qualiopi/criterion: number: Number name: Name diff --git a/config/locales/administration/fr.yml b/config/locales/administration/fr.yml index e9d4fa0f9..e02744d33 100644 --- a/config/locales/administration/fr.yml +++ b/config/locales/administration/fr.yml @@ -10,7 +10,22 @@ fr: administration/qualiopi/indicator: one: Indicateur other: Indicateurs + administration/member: + one: Personnel + other: Personnel attributes: + administration/member: + abilities: Responsabilités + biography: Biographie + first_name: Prénom + is_administrative: Personnel administratif + is_author: Auteur·rice + is_researcher: Chercheur·se + is_teacher: Enseignant·e + last_name: Nom de famille + name: Nom + slug: Slug + user: Utilisateur administration/qualiopi/criterion: number: Numéro name: Nom diff --git a/config/routes/admin/administration.rb b/config/routes/admin/administration.rb index f5b69fe50..50ef7b6cc 100644 --- a/config/routes/admin/administration.rb +++ b/config/routes/admin/administration.rb @@ -3,4 +3,6 @@ namespace :administration do resources :criterions, only: [:index, :show] resources :indicators, only: [:index, :show] end + + resources :members end diff --git a/db/migrate/20211214101323_create_administration_member.rb b/db/migrate/20211214101323_create_administration_member.rb new file mode 100644 index 000000000..568369e6c --- /dev/null +++ b/db/migrate/20211214101323_create_administration_member.rb @@ -0,0 +1,16 @@ +class CreateAdministrationMember < ActiveRecord::Migration[6.1] + def change + create_table :administration_members, id: :uuid do |t| + t.references :university, null: false, foreign_key: true, type: :uuid + t.references :user, foreign_key: true, type: :uuid + t.string :last_name + t.string :first_name + t.string :slug + t.boolean :is_author + t.boolean :is_researcher + t.boolean :is_teacher + t.boolean :is_administrative + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 5dd2fbb70..73cdaade8 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: 2021_12_13_140240) do +ActiveRecord::Schema.define(version: 2021_12_14_101323) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" @@ -56,6 +56,22 @@ ActiveRecord::Schema.define(version: 2021_12_13_140240) do t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true end + create_table "administration_members", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + t.uuid "university_id", null: false + t.uuid "user_id" + t.string "last_name" + t.string "first_name" + t.string "slug" + t.boolean "is_author" + t.boolean "is_researcher" + t.boolean "is_teacher" + t.boolean "is_administrative" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["university_id"], name: "index_administration_members_on_university_id" + t.index ["user_id"], name: "index_administration_members_on_user_id" + end + create_table "administration_qualiopi_criterions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.integer "number" t.text "name" @@ -547,6 +563,8 @@ ActiveRecord::Schema.define(version: 2021_12_13_140240) do add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" + add_foreign_key "administration_members", "universities" + add_foreign_key "administration_members", "users" add_foreign_key "administration_qualiopi_indicators", "administration_qualiopi_criterions", column: "criterion_id" add_foreign_key "communication_website_authors", "communication_websites" add_foreign_key "communication_website_authors", "universities" -- GitLab