diff --git a/app/models/choix.rb b/app/models/choix.rb index 224dd7163..266306f6c 100644 --- a/app/models/choix.rb +++ b/app/models/choix.rb @@ -12,6 +12,8 @@ class Choix < ApplicationRecord validate :audio_type + AUDIOS_CONTENT_TYPES = ['audio/mpeg', 'audio/mp4'].freeze + acts_as_list scope: :question_id def as_json(_options = nil) @@ -19,7 +21,7 @@ def as_json(_options = nil) end def audio_type - return unless audio.attached? && !audio.content_type.in?(%w[audio/mpeg audio/mp4]) + return unless audio.attached? && !audio.content_type.in?(AUDIOS_CONTENT_TYPES) errors.add(:audio, 'doit être un fichier MP3 ou MP4') audio.purge diff --git a/app/models/question_clic_dans_image.rb b/app/models/question_clic_dans_image.rb index 6af97a5a2..60e0da22d 100644 --- a/app/models/question_clic_dans_image.rb +++ b/app/models/question_clic_dans_image.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class QuestionClicDansImage < Question + CLASS_BONNE_REPONSE = 'bonne-reponse' + has_one_attached :zone_cliquable has_one_attached :image_au_clic @@ -24,11 +26,7 @@ def clic_multiple? return false unless zone_cliquable.attached? svg_content = zone_cliquable.download - - doc = Nokogiri::XML(svg_content, nil, 'UTF-8') - elements_cliquables = doc.css('.bonne-reponse') - - elements_cliquables.size > 1 + svg_contient_class_bonne_reponse?(svg_content, 2) end private @@ -60,12 +58,19 @@ def valide_zone_cliquable_avec_reponse return if attachment_changes['zone_cliquable'].nil? file = attachment_changes['zone_cliquable'].attachable - doc = Nokogiri::XML(file, nil, 'UTF-8') - elements_cliquables = doc.css('.bonne-reponse') - - return unless elements_cliquables.empty? + return if svg_contient_class_bonne_reponse?(file, 1) - errors.add(:zone_cliquable, "doit contenir la classe 'bonne_reponse'") + errors.add(:zone_cliquable, :class_bonne_reponse_not_found) throw(:abort) end + + def fichier_encode_base64(attachment) + file_content = attachment.download + ApplicationController.helpers.fichier_encode_en_base64(file_content) + end + + def svg_contient_class_bonne_reponse?(svg_content, minimum) + doc = Nokogiri::XML(svg_content, nil, 'UTF-8') + doc.css(".#{CLASS_BONNE_REPONSE}").size >= minimum + end end diff --git a/app/models/transcription.rb b/app/models/transcription.rb index ea13d3967..d307476a6 100644 --- a/app/models/transcription.rb +++ b/app/models/transcription.rb @@ -10,7 +10,7 @@ class Transcription < ApplicationRecord enum :categorie, { intitule: 0, modalite_reponse: 1 } def audio_type - return unless audio.attached? && !audio.content_type.in?(%w[audio/mpeg audio/mp4]) + return unless audio.attached? && !audio.content_type.in?(AUDIOS_CONTENT_TYPES) errors.add(:audio, 'doit être un fichier MP3 ou MP4') audio.purge diff --git a/config/locales/models/question.yml b/config/locales/models/question.yml index e820ea9a0..ccec251c8 100644 --- a/config/locales/models/question.yml +++ b/config/locales/models/question.yml @@ -34,6 +34,12 @@ fr: bonne_reponse: Bonne réponse question_glisser_deposer: reponses: Réponses + errors: + models: + question_clic_dans_image: + attributes: + zone_cliquable: + class_bonne_reponse_not_found: "doit contenir la classe 'bonne-reponse'" formtastic: actions: question: &question_actions diff --git a/spec/features/admin/question_clic_dans_image_spec.rb b/spec/features/admin/question_clic_dans_image_spec.rb index 6aa3c8235..fdbbefd81 100644 --- a/spec/features/admin/question_clic_dans_image_spec.rb +++ b/spec/features/admin/question_clic_dans_image_spec.rb @@ -125,7 +125,9 @@ end it do - expect(page).to have_content("doit contenir la classe 'bonne_reponse'") + expect(page).to have_content( + "doit contenir la classe '#{QuestionClicDansImage::CLASS_BONNE_REPONSE}'" + ) expect(Question.count).to eq(0) end end