hhba/mapa76-core

View on GitHub
lib/mapa76/core/model/person.rb

Summary

Maintainability
A
0 mins
Test Coverage
class Person
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name,            type: String
  field :surname_father,  type: String
  field :searchable_name, type: String
  field :jurisdiction,    type: String
  field :force,           type: String
  field :tags,            type: Array
  field :confidence,      type: Float, default: 0.0

  before_save :store_normalize_name
  before_save :unify_tags

  has_many :named_entities
  has_and_belongs_to_many :documents

  scope :searchable_with, lambda { |name| where(searchable_name: normalize_name(name)) }

  def self.normalize_name(name)
    ActiveSupport::Inflector.transliterate(name.to_s.downcase)
  end

  def self.add(name, opt={})
    person = searchable_with(name).first
    if person
      if opt.has_key? :tag
        person.tags << opt[:tag]
        person.save
      end
    else
      opt[:tags] = [opt.delete(:tag)]
      create opt.merge({name: name})
    end
  end

  def full_name
    if self.surname_father.blank?
      self.name
    else
      self.name + " " + self.surname_father
    end
  end

  def mentions_in(doc)
    self.named_entities.select { |ne| ne.document_id == doc.id }.count
  end

  def blacklist
    # TODO: here we will store who mark this person as blacklisted
    self.delete
    Blacklist.find_or_create_by text: self.full_name
  end

  def metainfo
    docs = self.documents.map { |doc| {id: doc._id, name: doc.title }}
    {"_id" => _id, "created_at" => created_at, :documents => docs, :full_name => full_name, :tags => tags}
  end

protected
  def store_normalize_name
    self.searchable_name = self.class.normalize_name(name)
  end

  def unify_tags
    tags.uniq! if tags.class == Array
  end
end