Files
nairobi/app/models/remote_translation.rb
Javi Martín 2b9f9ed557 Fix crash translating an already translated text
The page was crashing when at least part of the content of the page had
been translated between the request showing the remote translations
button and the moment people pressed the button.
2023-02-16 17:52:17 +01:00

53 lines
1.6 KiB
Ruby

class RemoteTranslation < ApplicationRecord
belongs_to :remote_translatable, polymorphic: true
validates :remote_translatable_id, presence: true
validates :remote_translatable_type, presence: true
validates :locale, presence: true
validates :locale, inclusion: { in: ->(_) { RemoteTranslations::Microsoft::AvailableLocales.available_locales }}
validate :already_translated_resource
after_create :enqueue_remote_translation
def enqueue_remote_translation
RemoteTranslations::Caller.new(self).delay.call
end
def self.for(*args)
resources_groups(*args).flatten.select { |resource| translation_empty?(resource) }.map do |resource|
new(remote_translatable: resource, locale: I18n.locale)
end
end
def self.resources_groups(*args)
feeds = args.find { |arg| arg&.first.class == Widget::Feed } || []
args.compact - [feeds] + feeds.map(&:items)
end
def self.translation_empty?(resource)
resource.class.translates? && resource.translations.where(locale: I18n.locale).empty?
end
def self.create_all(remote_translations_params)
remote_translations_params.map do |remote_translation_params|
new(remote_translation_params)
end.reject(&:already_translated?).reject(&:enqueued?).each(&:save!)
end
def already_translated_resource
if already_translated?
errors.add(:locale, :already_translated)
end
end
def enqueued?
self.class.where(remote_translatable: remote_translatable,
locale: locale,
error_message: nil).any?
end
def already_translated?
remote_translatable&.translations&.where(locale: locale).present?
end
end