otwarchive-symphonyarchive/app/models/related_work.rb

62 lines
1.7 KiB
Ruby
Raw Permalink Normal View History

2026-03-11 22:22:11 +00:00
class RelatedWork < ActiveRecord::Base
belongs_to :work
belongs_to :parent, polymorphic: true, autosave: true
attribute :url, :string
attribute :title, :string
attribute :author, :string
attribute :language_id, :integer
scope :posted, -> {
joins("INNER JOIN `works` `child_works` ON `child_works`.`id` = `related_works`.`work_id`").
where("child_works.posted = 1")
}
before_validation :set_parent, if: :new_record?
def set_parent
return if parent
if url.include?(ArchiveConfig.APP_HOST)
if url.match(%r{/works/(\d+)})
self.parent = Work.find_by(id: Regexp.last_match(1))
else
errors.add(:parent, :not_work)
throw :abort # don't generate any further errors
end
else
self.parent = ExternalWork.find_or_initialize_by(
url: url,
title: title,
author: author,
language_id: language_id
)
end
end
validates :parent, presence: true, on: :create
validate :check_parent_protected, on: :create
def check_parent_protected
return unless parent.respond_to?(:users)
return if parent.anonymous? || parent.unrevealed?
parent.users.each do |user|
errors.add(:parent, :protected, login: user.login) if user.protected_user
end
end
def notify_parent_owners
if parent.respond_to?(:pseuds)
users = parent.pseuds.collect(&:user).uniq
orphan_account = User.orphan_account
users.each do |user|
unless user == orphan_account
I18n.with_locale(user.preference.locale_for_mails) do
UserMailer.related_work_notification(user.id, self.id).deliver_after_commit
end
end
end
end
end
end