diff --git a/app/controllers/admin/research/researchers_controller.rb b/app/controllers/admin/research/researchers_controller.rb index 9a2bb07e4fc6c7906a51e15251a0ef37581bfc18..4ccb65cd1157c54bb4ec737b284512b5d2ac12a0 100644 --- a/app/controllers/admin/research/researchers_controller.rb +++ b/app/controllers/admin/research/researchers_controller.rb @@ -15,7 +15,7 @@ class Admin::Research::ResearchersController < Admin::Research::ApplicationContr def show @papers = @researcher.research_journal_papers.ordered.page(params[:page]) - @possible_hal_authors = @researcher.possible_hal_authors unless @researcher.hal_identity? + @possible_hal_authors = @researcher.possible_hal_authors @papers = @researcher.research_journal_papers.ordered.page(params[:page]) breadcrumb add_breadcrumb @researcher diff --git a/app/models/research/hal/author.rb b/app/models/research/hal/author.rb new file mode 100644 index 0000000000000000000000000000000000000000..094f188d22b70d5e188ebfe573c08416979cb1cc --- /dev/null +++ b/app/models/research/hal/author.rb @@ -0,0 +1,17 @@ +# == Schema Information +# +# Table name: research_hal_authors +# +# id :uuid not null, primary key +# doc_identifier :string +# first_name :string +# form_identifier :string +# full_name :string +# last_name :string +# person_identifier :string +# created_at :datetime not null +# updated_at :datetime not null +# +class Research::Hal::Author < ApplicationRecord + has_and_belongs_to_many :publications +end diff --git a/app/models/research/hal/publication.rb b/app/models/research/hal/publication.rb index 302b618727fe42053a0a7192238d0465797691c1..2e82ebae65429b1dced648188395effe0323e472 100644 --- a/app/models/research/hal/publication.rb +++ b/app/models/research/hal/publication.rb @@ -25,11 +25,7 @@ class Research::Hal::Publication < ApplicationRecord DOI_PREFIX = 'http://dx.doi.org/'.freeze - has_and_belongs_to_many :research_people, - class_name: 'University::Person', - foreign_key: 'university_person_id', - association_foreign_key: 'research_publication_id' - alias :researchers :research_people + has_and_belongs_to_many :publications before_destroy { research_people.clear } diff --git a/app/models/university/person/with_research.rb b/app/models/university/person/with_research.rb index febdd4246c0ba69f9c06394381c15cd331d32e07..ade03dda8fce8c4248df198f7305e75e1854f5b6 100644 --- a/app/models/university/person/with_research.rb +++ b/app/models/university/person/with_research.rb @@ -12,12 +12,7 @@ module University::Person::WithResearch scope :with_hal_identifier, -> { where.not(hal_form_identifier: [nil,'']) } end - def hal_identity? - hal_form_identifier.present? - end - def import_research_hal_publications! - return unless hal_identity? response = HalOpenscience::Document.search "authIdForm_i:#{hal_form_identifier}", fields: ["*"], limit: 1000 diff --git a/app/views/admin/research/researchers/show.html.erb b/app/views/admin/research/researchers/show.html.erb index dcbd2f426be3a3b8fc32d197d5cbbd5a609ffe00..c6deccf681aee60e0b2bc1ac69e780eeda8ee26c 100644 --- a/app/views/admin/research/researchers/show.html.erb +++ b/app/views/admin/research/researchers/show.html.erb @@ -9,43 +9,44 @@ <% end %> <% end %> -<%= osuny_panel Research::Hal::Publication.model_name.human(count: 2), action: @researcher.hal_publications.count do %> - <% if @researcher.hal_identity? %> - <div class="table-responsive"> - <%= render 'admin/research/hal/publications/list', publications: @researcher.hal_publications.ordered %> - </div> - <% else %> - <p><%= t 'research.hal.select_identifier' %><p> - <div class="table-responsive"> - <table class="table"> - <tbody> - <% @possible_hal_authors.each do |author| %> - <% - path = admin_research_researcher_path @researcher, - hal_doc_identifier: author.docid, - hal_form_identifier: author.attributes['form_i'], - hal_person_identifier: author.attributes['person_i'] - %> - <tr> - <td width="300"> - Identifiant HAL : <%= author.docid %><br> - <small><%= author.fullName_s %></small> - </td> - <td class="ps-3" width="200"><%= link_to 'Choisir cet identifiant', path, method: :put, class: 'btn btn-primary btn-sm' %><td> - <td class="ps-3"> - <% docs = HalOpenscience::Document.search "authIdFormPerson_s:#{author.docid}", fields: ["*"], limit: 5 %> - <ul class="list-unstyled small"> - <% docs.results.each do |doc| %> - <li class="mb-2"><%= sanitize doc.citationFull_s %></li> - <% end unless docs.nil? %> - </ul> - </td> - </tr> - <% end %> - </tbody> - </table> - </div> - <% end %> +<%= osuny_panel Research::Hal::Author.model_name.human(count: 2), action: @researcher.hal_publications.count do %> + <p><%= t 'research.hal.select_identifier' %><p> + <div class="table-responsive"> + <table class="table"> + <tbody> + <% @possible_hal_authors.each do |author| %> + <% + path = admin_research_researcher_path @researcher, + hal_doc_identifier: author.docid, + hal_form_identifier: author.attributes['form_i'], + hal_person_identifier: author.attributes['person_i'] + %> + <tr> + <td width="300"> + Identifiant HAL : <%= author.docid %><br> + <small><%= author.fullName_s %></small> + </td> + <td class="ps-3" width="200"><%= link_to 'Choisir cet identifiant', path, method: :put, class: 'btn btn-primary btn-sm' %><td> + <td class="ps-3"> + <% docs = HalOpenscience::Document.search "authIdFormPerson_s:#{author.docid}", fields: ["*"], limit: 5 %> + <ul class="list-unstyled small"> + <% docs.results.each do |doc| %> + <li class="mb-2"><%= sanitize doc.citationFull_s %></li> + <% end unless docs.nil? %> + </ul> + </td> + </tr> + <% end %> + </tbody> + </table> + </div> +<% end %> + +<%= osuny_panel Research::Hal::Publication.model_name.human do %> + <p><%= "#{@researcher.hal_publications.count} #{Research::Hal::Publication.model_name.human(count: @researcher.hal_publications.count).downcase}" %> + <div class="table-responsive"> + <%= render 'admin/research/hal/publications/list', publications: @researcher.hal_publications.ordered %> + </div> <% end %> <% content_for :action_bar_right do %> diff --git a/config/locales/research/en.yml b/config/locales/research/en.yml index a6805e9c0a7009d4c4e2d1cccfac2d6fc1fc4ec6..0aac0744d187e6e775ef8850116cc216221408d2 100644 --- a/config/locales/research/en.yml +++ b/config/locales/research/en.yml @@ -2,11 +2,15 @@ en: activemodel: models: research: Research + research/hal: HAL activerecord: models: university/person/researcher: one: Researcher other: Researchers + research/hal/author: + one: Author + other: Authors research/hal/publication: one: Publication other: Publications @@ -32,6 +36,10 @@ en: one: Thesis other: Theses attributes: + research/hal/author: + first_name: First name + last_name: Last name + full_name: Full name research/hal/publication: description: Publications scientifiques importées automatiquement de HAL docid: Identifier @@ -93,8 +101,8 @@ en: source: Serge Haroche, Prix Nobel de physique 2012 hal: title: HAL - select_identifier: You have no HAL identifier yet. Is it one of these possibilities? If there are several, please choose the most complete one (without -0 at the end). - manage_researchers: Managege researchers + select_identifier: Select all the HAL authors that correspond to this researcher. Use the publications to be sure it's the same person. + manage_researchers: Manage researchers researchers: one: Researcher other: Researchers diff --git a/config/locales/research/fr.yml b/config/locales/research/fr.yml index f2eb4e9f3310c2e659f225348980bfe7b67def1b..0cde7ec468e216adadf65a3a4caca8243b6a748e 100644 --- a/config/locales/research/fr.yml +++ b/config/locales/research/fr.yml @@ -2,11 +2,15 @@ fr: activemodel: models: research: Recherche + research/hal: HAL activerecord: models: university/person/researcher: one: Chercheur·e other: Chercheur·e·s + research/hal/author: + one: Auteur·e + other: Auteur·e·s research/hal/publication: one: Publication other: Publications @@ -32,6 +36,10 @@ fr: one: Thèse other: Thèses attributes: + research/hal/author: + first_name: Prénom + last_name: Nom + full_name: Nom complet research/hal/publication: description: Publications scientifiques importées automatiquement de HAL docid: Identifiant @@ -92,8 +100,7 @@ fr: text: La recherche scientifique est, à la fois, une démarche créatrice de connaissances motivée par la curiosité pure et une activité génératrice d’innovations qui augmentent les moyens d’action et de diagnostic sur la nature, l’homme et la société. Ces deux aspects de la recherche, le fondamental et l’appliqué, loin de s’opposer, sont complémentaires l’un de l’autre. La recherche fondamentale crée le socle de connaissances à partir duquel naissent les applications et, inversement, les avancées technologiques procurent les outils d’investigation de plus en plus perfectionnés qui conduisent à approfondir nos connaissances fondamentales. source: Serge Haroche, Prix Nobel de physique 2012 hal: - title: HAL - select_identifier: Vous n'avez pas d'identifiant HAL. Est-ce l'une des possibilités suivantes ? S'il y a plusieurs possibilités, choisissez l'identifiant le plus complet (sans 0 à la fin). + select_identifier: Choisissez tou·te·s les auteur·e·s HAL correspondant à cette personne. Appuyez-vous sur les publications pour vérifier qu'il s'agit de la bonne personne. manage_researchers: Gérer les chercheur·e·s researchers: one: Chercheur·e diff --git a/config/routes/admin/research.rb b/config/routes/admin/research.rb index 9bf9266f4f66665be07e0f79534799258fb00ecc..7792d706ece59750dcceba1f5cfcfc9658887153 100644 --- a/config/routes/admin/research.rb +++ b/config/routes/admin/research.rb @@ -1,6 +1,11 @@ namespace :research do resources :researchers, only: [:index, :show, :update] namespace :hal do + resources :authors, only: [:index, :show, :destroy] do + member do + get :static + end + end resources :publications, only: [:index, :show, :destroy] do member do get :static diff --git a/db/migrate/20230217205953_create_research_hal_authors.rb b/db/migrate/20230217205953_create_research_hal_authors.rb new file mode 100644 index 0000000000000000000000000000000000000000..c182ed2167d81c78fd9bd4a5302f4cb7c68d4259 --- /dev/null +++ b/db/migrate/20230217205953_create_research_hal_authors.rb @@ -0,0 +1,24 @@ +class CreateResearchHalAuthors < ActiveRecord::Migration[7.0] + def change + create_table :research_hal_authors, id: :uuid do |t| + t.string :doc_identifier + t.string :form_identifier + t.string :person_identifier + t.string :first_name + t.string :last_name + t.string :full_name + + t.timestamps + end + + create_join_table :research_hal_authors, :research_hal_publications, column_options: {type: :uuid} do |t| + t.index [:research_hal_author_id, :research_hal_publication_id], name: 'hal_author_publication' + t.index [:research_hal_publication_id, :research_hal_author_id], name: 'hal_publication_author' + end + + create_join_table :research_hal_authors, :university_persons, column_options: {type: :uuid} do |t| + t.index [:research_hal_author_id, :university_person_id], name: 'hal_author_person' + t.index [:university_person_id, :research_hal_author_id], name: 'hal_person_author' + end + end +end diff --git a/db/schema.rb b/db/schema.rb index be3d3b1ef409edd38552e6864fa51fdab64fbcb9..018e3421e53c264aac19e28c8758f6377576e9fa 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[7.0].define(version: 2023_02_17_202815) do +ActiveRecord::Schema[7.0].define(version: 2023_02_17_205953) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -592,6 +592,31 @@ ActiveRecord::Schema[7.0].define(version: 2023_02_17_202815) do t.string "summernote_locale" end + create_table "research_hal_authors", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| + t.string "doc_identifier" + t.string "form_identifier" + t.string "person_identifier" + t.string "first_name" + t.string "last_name" + t.string "full_name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "research_hal_authors_publications", id: false, force: :cascade do |t| + t.uuid "research_hal_author_id", null: false + t.uuid "research_hal_publication_id", null: false + t.index ["research_hal_author_id", "research_hal_publication_id"], name: "hal_author_publication" + t.index ["research_hal_publication_id", "research_hal_author_id"], name: "hal_publication_author" + end + + create_table "research_hal_authors_university_persons", id: false, force: :cascade do |t| + t.uuid "research_hal_author_id", null: false + t.uuid "university_person_id", null: false + t.index ["research_hal_author_id", "university_person_id"], name: "hal_author_person" + t.index ["university_person_id", "research_hal_author_id"], name: "hal_person_author" + end + create_table "research_hal_publications", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| t.string "docid" t.jsonb "data" diff --git a/test/fixtures/research/hal/authors.yml b/test/fixtures/research/hal/authors.yml new file mode 100644 index 0000000000000000000000000000000000000000..29f9027fd28e33384b1cb07b8fadaab6e377ae9c --- /dev/null +++ b/test/fixtures/research/hal/authors.yml @@ -0,0 +1,30 @@ +# == Schema Information +# +# Table name: research_hal_authors +# +# id :uuid not null, primary key +# doc_identifier :string +# first_name :string +# form_identifier :string +# full_name :string +# last_name :string +# person_identifier :string +# created_at :datetime not null +# updated_at :datetime not null +# + +one: + doc_identifier: MyString + form_identifier: MyString + person_identifier: MyString + first_name: MyString + last_name: MyString + full_name: MyString + +two: + doc_identifier: MyString + form_identifier: MyString + person_identifier: MyString + first_name: MyString + last_name: MyString + full_name: MyString diff --git a/test/models/research/hal/author_test.rb b/test/models/research/hal/author_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..bda90df48fe6211be70220edcc05ff3ee1916821 --- /dev/null +++ b/test/models/research/hal/author_test.rb @@ -0,0 +1,21 @@ +# == Schema Information +# +# Table name: research_hal_authors +# +# id :uuid not null, primary key +# doc_identifier :string +# first_name :string +# form_identifier :string +# full_name :string +# last_name :string +# person_identifier :string +# created_at :datetime not null +# updated_at :datetime not null +# +require "test_helper" + +class Research::Hal::AuthorTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end