Skip to content
Snippets Groups Projects
publication.rb 2.6 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
# == Schema Information
#
Arnaud Levy's avatar
Arnaud Levy committed
# Table name: research_hal_publications
Arnaud Levy's avatar
Arnaud Levy committed
#
#  id               :uuid             not null, primary key
#  data             :jsonb
Arnaud Levy's avatar
Arnaud Levy committed
#  docid            :string           indexed
Arnaud Levy's avatar
Arnaud Levy committed
#  doi              :string
#  hal_url          :string
#  publication_date :date
#  ref              :string
Arnaud Levy's avatar
Arnaud Levy committed
#  slug             :string
Arnaud Levy's avatar
Arnaud Levy committed
#  title            :string
#  url              :string
#  created_at       :datetime         not null
#  updated_at       :datetime         not null
#
Arnaud Levy's avatar
Arnaud Levy committed
# Indexes
#
Arnaud Levy's avatar
Arnaud Levy committed
#  index_research_hal_publications_on_docid  (docid)
Arnaud Levy's avatar
Arnaud Levy committed
#
Arnaud Levy's avatar
Arnaud Levy committed
class Research::Hal::Publication < ApplicationRecord
Arnaud Levy's avatar
Arnaud Levy committed
  include WithGit
  include WithSlug
Arnaud Levy's avatar
Arnaud Levy committed
  DOI_PREFIX = 'http://dx.doi.org/'.freeze
Arnaud Levy's avatar
Arnaud Levy committed

Arnaud Levy's avatar
Arnaud Levy committed
  has_and_belongs_to_many :researchers,
                          class_name: 'University::Person',
                          foreign_key: 'university_person_id',
                          association_foreign_key: 'research_hal_publication_id'
Arnaud Levy's avatar
Arnaud Levy committed

Arnaud Levy's avatar
Arnaud Levy committed
  has_and_belongs_to_many :authors,
                          foreign_key: 'research_hal_author_id',
                          association_foreign_key: 'research_hal_publication_id'
Arnaud Levy's avatar
Arnaud Levy committed

  validates_presence_of :docid

  scope :ordered, -> { order(publication_date: :desc)}

Arnaud Levy's avatar
Arnaud Levy committed
  def self.import_from_hal_for_author(author)
    fields = [
      'docid',
      'title_s',
      'citationRef_s',
      'uri_s',
      'doiId_s',
      'publicationDate_tdate',
      'linkExtUrl_s',
      # '*',
    ]
Arnaud Levy's avatar
Arnaud Levy committed
    publications = []
    response = HalOpenscience::Document.search "authIdFormPerson_s:#{author.docid}", fields: fields, limit: 1000
Arnaud Levy's avatar
Arnaud Levy committed
    response.results.each do |doc|
Arnaud Levy's avatar
Arnaud Levy committed
      publication = create_from doc
      publications << publication
Arnaud Levy's avatar
Arnaud Levy committed
    end
Arnaud Levy's avatar
Arnaud Levy committed
    publications
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def self.create_from(doc)
    publication = where(docid: doc.docid).first_or_create
Arnaud Levy's avatar
Arnaud Levy committed
    puts "HAL sync publication #{doc.docid}"
Arnaud Levy's avatar
Arnaud Levy committed
    publication.title = Osuny::Sanitizer.sanitize doc.title_s.first, 'string'
Arnaud Levy's avatar
Arnaud Levy committed
    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

Arnaud Levy's avatar
Arnaud Levy committed
  def template_static
    "admin/research/publications/static"
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def doi_url
    return unless doi.present?
Arnaud Levy's avatar
Arnaud Levy committed
    "#{DOI_PREFIX}#{doi}"
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def best_url
Arnaud Levy's avatar
Arnaud Levy committed
    url || doi_url || hal_url
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def to_s
    "#{title}"
  end
Arnaud Levy's avatar
Arnaud Levy committed

  protected

  def slug_unavailable?(slug)
    self.class.unscoped
              .where(slug: slug)
              .where.not(id: self.id)
              .exists?
  end
Arnaud Levy's avatar
Arnaud Levy committed
end