Skip to content
Snippets Groups Projects
Forked from PortalMEC / portalmec
2551 commits behind the upstream repository.
learning_object.rb 2.36 KiB
class LearningObject
  include ActiveModel::Model
  include RepositoriesProxy
  include OrientDbSerializable

  attr_accessor :id, :id_dspace, :rid, :name, :author, :description,
                :published_at, :thumbnail, :created_at, :last_modified,
                :type, :grade_level, :bitstreams, :metadata, :likes, :views,
                :downloads, :subjects, :attributes, :score, :publisher,
                :school_level, :language, :source, :license, :copyright,
                :country, :keywords, :file,
                :grade_level, :attachment, :main_bitstream_id,
                # Relation attrs
                :likes, :views, :downloads, :subjects, :attributes, :publisher

  validates_presence_of :name, :created_at, :type

  delegate :get_retrievelink, to: :attachment
  delegate :get_filename, to: :attachment


  def initialize(params={})
    super(params.merge(defaults))
  end

  def collections
    collection_repository.find_by_learning_object self
  end

  def publisher
    @publisher ||= learning_object_repository.get_publisher(self)
  end

  def subjects
    @subjects ||= learning_object_repository.get_subjects(self)
  end

  def attributes
    @attributes ||= learning_object_repository.get_attributes(self)
  end

  def categories
    get_metadata_value_of 'dc.subject.category'
  end

  ## social actions
  def like(user)
    learning_object_repository.like user, self
  end

  def liked?(user)
    learning_object_repository.liked? user, self
  end

  def dislike(user)
    learning_object_repository.dislike user, self
  end

  def download(user)
    learning_object_repository.download user, self
  end

  ## end social actions

  ## metadata methods
  def get_metadata_value_of key
    get_metadata_values_of(key).first
  end

  def get_metadata_values_of key
    values = []
    @metadata.each do |m|
      m = m.with_indifferent_access
      values << m["value"] if m["key"] == key
    end
    values
  end

  ## end metadata methods

  def likes
    learning_object_repository.count_likes(self)
  end

  def views
    learning_object_repository.count_views(self)
  end

  def to_orientdb_hash
    super.merge({'bitstreams' => attachment.bitstreams})
  end

  def excluded_orientdb_properties
    ['likes', 'views', 'downloads', 'subjects', 'attributes', 'publisher', 'attachment']
  end

  private

  def defaults
    {
        downloads: 0,
        score: 0
    }
  end

end