diff --git a/app/controllers/admin/university/organization/imports_controller.rb b/app/controllers/admin/university/organization/imports_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..493f55a4459758e7c27afce60d0892f6c1268cd2 --- /dev/null +++ b/app/controllers/admin/university/organization/imports_controller.rb @@ -0,0 +1,43 @@ +class Admin::University::Organization::ImportsController < Admin::University::ApplicationController + load_and_authorize_resource class: University::Organization::Import, + through: :current_university, + through_association: :organization_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::Organization.model_name.human(count: 2), + admin_university_organizations_path + add_breadcrumb University::Organization::Import.model_name.human(count: 2), + admin_university_organization_imports_path + breadcrumb_for @import + end + + def import_params + params.require(:university_organization_import) + .permit(:file) + end +end diff --git a/app/controllers/university/organizations_controller.rb b/app/controllers/university/organizations_controller.rb index 145babc5c5e8fad9fa248ca8e4ffe68206bac7a0..f3340418978c0486416128b57e3e6faf0dcdd96e 100644 --- a/app/controllers/university/organizations_controller.rb +++ b/app/controllers/university/organizations_controller.rb @@ -4,6 +4,7 @@ class University::OrganizationsController < ApplicationController through_association: :organizations def index + @organizations = @organizations.ordered.page(params[:page]) end def show diff --git a/app/models/university/organization/import.rb b/app/models/university/organization/import.rb new file mode 100644 index 0000000000000000000000000000000000000000..b4e5f7e06eebc5949d5dc4cb3597037b3f213950 --- /dev/null +++ b/app/models/university/organization/import.rb @@ -0,0 +1,51 @@ +# == Schema Information +# +# Table name: university_organization_imports +# +# id :uuid not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# university_id :uuid not null, indexed +# user_id :uuid not null, indexed +# +# Indexes +# +# index_university_organization_imports_on_university_id (university_id) +# index_university_organization_imports_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_31152af0cd (university_id => universities.id) +# fk_rails_da057ff44d (user_id => users.id) +# +class University::Organization::Import < ApplicationRecord + belongs_to :university + belongs_to :user + + has_one_attached :file + + after_save :parse + + def lines + @lines ||= csv.rows + rescue + [] + end + + def to_s + "#{user}, #{I18n.l created_at}" + end + + protected + + def parse + byebug + lines.each do |line| + + end + end + + def csv + @csv ||= CSV.parse file.blob.download, headers: true + end +end diff --git a/app/models/university/with_people_and_organizations.rb b/app/models/university/with_people_and_organizations.rb index e9f4c637eb9b7eaaf006831569c8ffb3b0d23ec2..d943867e07b1dd6384584dccba13588c4267886f 100644 --- a/app/models/university/with_people_and_organizations.rb +++ b/app/models/university/with_people_and_organizations.rb @@ -2,7 +2,14 @@ module University::WithPeopleAndOrganizations extend ActiveSupport::Concern included do - has_many :people, class_name: 'University::Person', dependent: :destroy - has_many :organizations, class_name: 'University::Organization', dependent: :destroy + has_many :people, + class_name: 'University::Person', + dependent: :destroy + has_many :organizations, + class_name: 'University::Organization', + dependent: :destroy + has_many :organization_imports, + class_name: 'University::Organization::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 new file mode 100644 index 0000000000000000000000000000000000000000..df3fc7199a93eb3b97d43069abdeefab28e92f59 --- /dev/null +++ b/app/views/admin/university/organization/imports/index.html.erb @@ -0,0 +1,21 @@ +<% content_for :title, University::Organization::Import.model_name.human(count: 2) %> + +<table class="<%= table_classes %>"> + <thead> + <tr> + <th><%= University::Organization::Import.human_attribute_name('name') %></th> + <th><%= University::Organization::Import.human_attribute_name('lines') %></th> + </tr> + </thead> + <tbody> + <% @imports.each do |import| %> + <tr> + <td><%= link_to import, [:admin, import] %></td> + <td><%= import.lines.count %></td> + </tr> + <% end %> + </tbody> +</table> +<% content_for :action_bar_right do %> + <%= create_link University::Organization::Import %> +<% end %> diff --git a/app/views/admin/university/organization/imports/new.html.erb b/app/views/admin/university/organization/imports/new.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..460abdd7911a18cd4de582123aa57c1d77c1fdef --- /dev/null +++ b/app/views/admin/university/organization/imports/new.html.erb @@ -0,0 +1,75 @@ +<% content_for :title, University::Organization::Import.model_name.human %> + +<div class="row"> + <div class="col-md-6"> + <p> + Les données doivent être au format csv, comme l'exemple suivant.<br> + La première ligne doit être dédiée aux entêtes.<br> + Le champ name est obligatoire.<br> + Les noms des entêtes sont indicatifs, l'import est basé sur la position des champs.<br> + Les caractères doivent être encodés en UTF-8.<br> + Les valeurs possibles pour kind sont : company, non_profit, government. + </p> + <%= simple_form_for [:admin, @import] do |f| %> + <%= f.input :file %> + <% content_for :action_bar_right do %> + <%= submit f %> + <% end %> + <% end %> + + </div> + <div class="col-md-6"> + <table class="table table-small"> + <tbody> + <tr> + <th>name*</th> + <td>Le Monde</td> + </tr> + <tr> + <th>long_name</th> + <td>Société Editrice du Monde</td> + </tr> + <tr> + <th>kind</th> + <td>company</td> + </tr> + <tr> + <th>sirene</th> + <td>00000000</td> + </tr> + <tr> + <th>description</th> + <td>Le quotidien de référence</td> + </tr> + <tr> + <th>address</th> + <td>13 rue Auguste Blanqui</td> + </tr> + <tr> + <th>zipcode</th> + <td>75013</td> + </tr> + <tr> + <th>city</th> + <td>Paris</td> + </tr> + <tr> + <th>country</th> + <td>FR</td> + </tr> + <tr> + <th>mail</th> + <td>contact@lemonde.fr</td> + </tr> + <tr> + <th>phone</th> + <td>+33 1 01 01 01 01</td> + </tr> + <tr> + <th>website</th> + <td>https://www.lemonde.fr</td> + </tr> + </tbody> + </table> + </div> +</div> diff --git a/app/views/admin/university/organization/imports/show.html.erb b/app/views/admin/university/organization/imports/show.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..179493a2233564a8c972a5bcd7e47d352fa85b33 --- /dev/null +++ b/app/views/admin/university/organization/imports/show.html.erb @@ -0,0 +1,5 @@ +<% content_for :title, @import %> + +<%= link_to "#{@import.file.filename} (#{number_to_human_size @import.file.byte_size})", + url_for(@import.file), + class: button_classes %> diff --git a/app/views/admin/university/organizations/_form.html.erb b/app/views/admin/university/organizations/_form.html.erb index 3f4d31f61178e23ce384e07a6a1e94adda56e23c..c70eee1d050feb799f5822efe29c7bfa46942c34 100644 --- a/app/views/admin/university/organizations/_form.html.erb +++ b/app/views/admin/university/organizations/_form.html.erb @@ -1,46 +1,46 @@ <%= simple_form_for [:admin, organization] do |f| %> -<div class="row"> - <div class="col-md-6"> - <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"> - <%= f.input :name %> - <%= f.input :long_name %> - <%= f.input :kind, include_blank: false %> - <%= f.input :active %> - <%= f.input :sirene %> - <%= f.input :description %> - <%= f.input :logo, - as: :single_deletable_file, - input_html: { accept: '.jpg,.jpeg,.png,.svg' }, - preview: 200, - resize: 1, - direct_upload: true %> + <div class="row"> + <div class="col-md-6"> + <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"> + <%= f.input :name %> + <%= f.input :long_name %> + <%= f.input :kind, include_blank: false %> + <%= f.input :active %> + <%= f.input :sirene %> + <%= f.input :description %> + <%= f.input :logo, + as: :single_deletable_file, + input_html: { accept: '.jpg,.jpeg,.png,.svg' }, + preview: 200, + resize: 1, + direct_upload: true %> + </div> </div> </div> - </div> - <div class="col-md-6"> - <div class="card flex-fill w-100"> - <div class="card-header"> - <h5 class="card-title mb-0"> - <%= University::Organization.human_attribute_name('contact_informations') %> - </h5> - </div> - <div class="card-body"> - <%= f.input :address %> - <%= f.input :zipcode %> - <%= f.input :city %> - <%= f.input :country %> - <%= f.input :website %> - <%= f.input :phone %> - <%= f.input :mail %> + <div class="col-md-6"> + <div class="card flex-fill w-100"> + <div class="card-header"> + <h5 class="card-title mb-0"> + <%= University::Organization.human_attribute_name('contact_informations') %> + </h5> + </div> + <div class="card-body"> + <%= f.input :address %> + <%= f.input :zipcode %> + <%= f.input :city %> + <%= f.input :country %> + <%= f.input :website %> + <%= f.input :phone %> + <%= f.input :mail %> + </div> </div> </div> </div> -</div> - <% content_for :action_bar_right do %> - <%= submit f %> - <% end %> + <% content_for :action_bar_right do %> + <%= submit f %> + <% end %> <% end %> diff --git a/app/views/admin/university/organizations/_list.html.erb b/app/views/admin/university/organizations/_list.html.erb index 6eb06b201203d9039e58356fd683a766985a77fc..83fe501791124f9c673566e0fcacc25f5089a791 100644 --- a/app/views/admin/university/organizations/_list.html.erb +++ b/app/views/admin/university/organizations/_list.html.erb @@ -13,8 +13,8 @@ <td><%= organization.kind %></td> <td class="text-end"> <div class="btn-group" role="group"> - <%= edit_button organization %> - <%= delete_button organization %> + <%= edit_link organization %> + <%= destroy_link organization %> </div> </td> </tr> diff --git a/app/views/admin/university/organizations/index.html.erb b/app/views/admin/university/organizations/index.html.erb index 3911980fb6cdd63fa8486c3fc8eed3cea667f72d..1fd6f4dbfeb176f96400859c77d82cdef55581ad 100644 --- a/app/views/admin/university/organizations/index.html.erb +++ b/app/views/admin/university/organizations/index.html.erb @@ -3,6 +3,12 @@ <%= render 'admin/university/organizations/list', organizations: @organizations %> <%= paginate @organizations, theme: 'bootstrap-5' %> +<% content_for :action_bar_left do %> + <%= link_to t('import'), + admin_university_organization_imports_path, + class: button_classes if can? :manage, University::Organization::Import %> +<% end %> + <% content_for :action_bar_right do %> <%= create_link University::Organization %> <% end %> diff --git a/app/views/university/organizations/index.html.erb b/app/views/university/organizations/index.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..e8810d4f6a92b7c3bdb775d7b904d2644736a2b3 --- /dev/null +++ b/app/views/university/organizations/index.html.erb @@ -0,0 +1,18 @@ +<% content_for :title, University::Organization.model_name.human(count: 2) %> + +<table class="<%= table_classes %>"> + <thead> + <tr> + <th><%= University::Organization.human_attribute_name('name') %></th> + <th><%= University::Organization.human_attribute_name('kind') %></th> + </tr> + </thead> + <tbody> + <% @organizations.each do |organization| %> + <tr> + <td><%= link_to organization, organization %></td> + <td><%= organization.kind %></td> + </tr> + <% end %> + </tbody> +</table> diff --git a/app/views/university/organizations/show.html.erb b/app/views/university/organizations/show.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..1a8858a8183c77fbb221e456277a8e24e78b282f --- /dev/null +++ b/app/views/university/organizations/show.html.erb @@ -0,0 +1 @@ +<% content_for :title, @organization %> diff --git a/config/environments/development.rb b/config/environments/development.rb index bea91d402e99d93c8001665b20b9d155c3d18a43..6968ff7e0de7aa397e1078f5c994a6148700f424 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -34,6 +34,7 @@ Rails.application.configure do # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :scaleway + # config.active_storage.service = :local # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false diff --git a/config/locales/en.yml b/config/locales/en.yml index 6234469eb7ede1299f0c38c743937ab6b855f258..e15d7f9749754ae6b6bfd1677d1e1ae7d0134525 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -104,6 +104,7 @@ en: privacy_policy: https://osuny.org/politique-de-confidentialite hello: "Hello %{name}!" home: Home + import: Import languages: en: English fr: French diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 5d3348026e9b0d18552f458dae4867bff8d04ee7..cfa6f2e2aadc50100f91efc79474bdccc2ab05b1 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -104,6 +104,7 @@ fr: privacy_policy: https://osuny.org/politique-de-confidentialite hello: "Bonjour %{name} !" home: Accueil + import: Importer languages: en: Anglais fr: Français diff --git a/config/locales/university/en.yml b/config/locales/university/en.yml index de33740634b5a7ecd12a45d737c087c9ee0e6285..b346f35e0f7955aafb3aee6dbe909ccb2389e042 100644 --- a/config/locales/university/en.yml +++ b/config/locales/university/en.yml @@ -44,6 +44,9 @@ en: university/organization: name: Name long_name: Long name + description: Description (SEO) + university/organization/import: + file: File (.csv) university/role: description: Description (SEO) people: People @@ -60,6 +63,9 @@ en: university/organization: one: Third party other: Third parties + university/organization/import: + one: Import + other: Imports university/role: one: Role other: Roles diff --git a/config/locales/university/fr.yml b/config/locales/university/fr.yml index 6be4c7d73e2d45ce0809744df58db791a0a2ba1f..34e714b191d8d043cecaeb555508c2648b0f6de9 100644 --- a/config/locales/university/fr.yml +++ b/config/locales/university/fr.yml @@ -44,6 +44,9 @@ fr: university/organization: name: Nom long_name: Nom complet + description: Description (SEO) + university/organization/import: + file: Fichier (.csv) university/role: description: Description (SEO) people: Personnes @@ -60,6 +63,9 @@ fr: university/organization: one: Tierce partie other: Tierces parties + university/organization/import: + one: Import + other: Imports university/role: one: Rôle other: Rôles diff --git a/config/routes/admin/university.rb b/config/routes/admin/university.rb index 25328e0bc04d22c54272ccc5bca9318d811c8840..cb94a97adfd364b3f68d1b59329de85b32ba0106 100644 --- a/config/routes/admin/university.rb +++ b/config/routes/admin/university.rb @@ -1,3 +1,6 @@ namespace :university do resources :people, :organizations + namespace :organization do + resources :imports, only: [:index, :show, :new, :create] + end end diff --git a/config/routes/extranet.rb b/config/routes/extranet.rb index 2741f6f22345f343c18789c061acd395dac8d379..186b49d3851de3c596de301297fb06865336f7a7 100644 --- a/config/routes/extranet.rb +++ b/config/routes/extranet.rb @@ -1,3 +1,6 @@ namespace :university do resources :organizations, only: [:index, :show] end + +get 'organizations' => 'university/organizations#index', as: :organizations +get 'organization/:id' => 'university/organizations#show', as: :organization diff --git a/db/migrate/20220307070155_create_university_organization_imports.rb b/db/migrate/20220307070155_create_university_organization_imports.rb new file mode 100644 index 0000000000000000000000000000000000000000..4b613152b45b58c78329cc5abdbb0de438ed2ad9 --- /dev/null +++ b/db/migrate/20220307070155_create_university_organization_imports.rb @@ -0,0 +1,10 @@ +class CreateUniversityOrganizationImports < ActiveRecord::Migration[6.1] + def change + create_table :university_organization_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/schema.rb b/db/schema.rb index 26287d96df54c851d4e4dba41efa30de68889376..ed57cfb447a69f6e98f775ff82ba2fcaf488c391 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_07_053000) do +ActiveRecord::Schema.define(version: 2022_03_07_070155) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" @@ -589,6 +589,15 @@ ActiveRecord::Schema.define(version: 2022_03_07_053000) do t.string "invoice_amount" end + create_table "university_organization_imports", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + t.uuid "university_id", null: false + t.uuid "user_id", null: false + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["university_id"], name: "index_university_organization_imports_on_university_id" + t.index ["user_id"], name: "index_university_organization_imports_on_user_id" + end + create_table "university_organizations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.uuid "university_id", null: false t.string "name" @@ -763,6 +772,8 @@ ActiveRecord::Schema.define(version: 2022_03_07_053000) do add_foreign_key "research_theses", "universities" add_foreign_key "research_theses", "university_people", column: "author_id" add_foreign_key "research_theses", "university_people", column: "director_id" + add_foreign_key "university_organization_imports", "universities" + add_foreign_key "university_organization_imports", "users" add_foreign_key "university_organizations", "universities" add_foreign_key "university_people", "universities" add_foreign_key "university_people", "users" diff --git a/test/controllers/university/organization/imports_controller_test.rb b/test/controllers/university/organization/imports_controller_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..34bbfd4821f696c34af98187bc289b3b816eb969 --- /dev/null +++ b/test/controllers/university/organization/imports_controller_test.rb @@ -0,0 +1,48 @@ +require "test_helper" + +class University::Organization::ImportsControllerTest < ActionDispatch::IntegrationTest + setup do + @university_organization_import = university_organization_imports(:one) + end + + test "should get index" do + get university_organization_imports_url + assert_response :success + end + + test "should get new" do + get new_university_organization_import_url + assert_response :success + end + + test "should create university_organization_import" do + assert_difference('University::Organization::Import.count') do + post university_organization_imports_url, params: { university_organization_import: { university_id: @university_organization_import.university_id, user_id: @university_organization_import.user_id } } + end + + assert_redirected_to university_organization_import_url(University::Organization::Import.last) + end + + test "should show university_organization_import" do + get university_organization_import_url(@university_organization_import) + assert_response :success + end + + test "should get edit" do + get edit_university_organization_import_url(@university_organization_import) + assert_response :success + end + + test "should update university_organization_import" do + patch university_organization_import_url(@university_organization_import), params: { university_organization_import: { university_id: @university_organization_import.university_id, user_id: @university_organization_import.user_id } } + assert_redirected_to university_organization_import_url(@university_organization_import) + end + + test "should destroy university_organization_import" do + assert_difference('University::Organization::Import.count', -1) do + delete university_organization_import_url(@university_organization_import) + end + + assert_redirected_to university_organization_imports_url + end +end diff --git a/test/fixtures/university/organization/imports.yml b/test/fixtures/university/organization/imports.yml new file mode 100644 index 0000000000000000000000000000000000000000..0f69593175b99cd8a41608ae5733cfebe5626e40 --- /dev/null +++ b/test/fixtures/university/organization/imports.yml @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: university_organization_imports +# +# id :uuid not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# university_id :uuid not null, indexed +# user_id :uuid not null, indexed +# +# Indexes +# +# index_university_organization_imports_on_university_id (university_id) +# index_university_organization_imports_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_31152af0cd (university_id => universities.id) +# fk_rails_da057ff44d (user_id => users.id) +# +# 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/organization/import_test.rb b/test/models/university/organization/import_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..e5fc2e5002b23d0137b4da75b9e1817725562eb0 --- /dev/null +++ b/test/models/university/organization/import_test.rb @@ -0,0 +1,27 @@ +# == Schema Information +# +# Table name: university_organization_imports +# +# id :uuid not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# university_id :uuid not null, indexed +# user_id :uuid not null, indexed +# +# Indexes +# +# index_university_organization_imports_on_university_id (university_id) +# index_university_organization_imports_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_31152af0cd (university_id => universities.id) +# fk_rails_da057ff44d (user_id => users.id) +# +require "test_helper" + +class University::Organization::ImportTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/system/university/organization/imports_test.rb b/test/system/university/organization/imports_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..050b8720ce0921f44ce2dc8fda891b971ed66948 --- /dev/null +++ b/test/system/university/organization/imports_test.rb @@ -0,0 +1,45 @@ +require "application_system_test_case" + +class University::Organization::ImportsTest < ApplicationSystemTestCase + setup do + @university_organization_import = university_organization_imports(:one) + end + + test "visiting the index" do + visit university_organization_imports_url + assert_selector "h1", text: "University/Organization/Imports" + end + + test "creating a Import" do + visit university_organization_imports_url + click_on "New University/Organization/Import" + + fill_in "University", with: @university_organization_import.university_id + fill_in "User", with: @university_organization_import.user_id + click_on "Create Import" + + assert_text "Import was successfully created" + click_on "Back" + end + + test "updating a Import" do + visit university_organization_imports_url + click_on "Edit", match: :first + + fill_in "University", with: @university_organization_import.university_id + fill_in "User", with: @university_organization_import.user_id + click_on "Update Import" + + assert_text "Import was successfully updated" + click_on "Back" + end + + test "destroying a Import" do + visit university_organization_imports_url + page.accept_confirm do + click_on "Destroy", match: :first + end + + assert_text "Import was successfully destroyed" + end +end