# == Schema Information # # Table name: research_hal_publications # # id :uuid not null, primary key # data :jsonb # docid :string indexed # doi :string # hal_url :string # publication_date :date # ref :string # slug :string # title :string # url :string # created_at :datetime not null # updated_at :datetime not null # # Indexes # # index_research_hal_publications_on_docid (docid) # class Research::Hal::Publication < ApplicationRecord include Sanitizable include WithGit include WithSlug DOI_PREFIX = 'http://dx.doi.org/'.freeze has_and_belongs_to_many :researchers, class_name: 'University::Person', foreign_key: 'university_person_id', association_foreign_key: 'research_hal_publication_id' has_and_belongs_to_many :authors, foreign_key: 'research_hal_author_id', association_foreign_key: 'research_hal_publication_id' validates_presence_of :docid scope :ordered, -> { order(publication_date: :desc)} def self.import_from_hal_for_author(author) fields = [ 'docid', 'title_s', 'citationRef_s', 'uri_s', 'doiId_s', 'publicationDate_tdate', 'linkExtUrl_s', # '*', ] publications = [] response = HalOpenscience::Document.search "authIdFormPerson_s:#{author.docid}", fields: fields, limit: 1000 response.results.each do |doc| publication = create_from doc publications << publication end publications end def self.create_from(doc) publication = where(docid: doc.docid).first_or_create puts "HAL sync publication #{doc.docid}" publication.title = Osuny::Sanitizer.sanitize doc.title_s.first, 'string' publication.ref = doc.attributes['citationRef_s'] publication.hal_url = doc.attributes['uri_s'] publication.doi = doc.attributes['doiId_s'] publication.publication_date = doc.attributes['publicationDate_tdate'] publication.url = doc.attributes['linkExtUrl_s'] publication.save publication end def template_static "admin/research/publications/static" end def doi_url return unless doi.present? "#{DOI_PREFIX}#{doi}" end def best_url url || doi_url || hal_url end def to_s "#{title}" end protected def slug_unavailable?(slug) self.class.unscoped .where(slug: slug) .where.not(id: self.id) .exists? end end