Skip to content

Commit

Permalink
♻️ Extrait la création du json des audios dans le modèle Question et …
Browse files Browse the repository at this point in the history
…fixe erreur 500 quand une question n'a pas de transcriptions
  • Loading branch information
cprodhomme authored and etienneCharignon committed Sep 18, 2024
1 parent 123cfdb commit addefe7
Show file tree
Hide file tree
Showing 11 changed files with 122 additions and 188 deletions.
19 changes: 19 additions & 0 deletions app/models/question.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,17 @@ def supprime_attachment
end
end

def json_audio_fields
return {} if sans_audios?
return { 'audio_url' => transcription_intitule.audio_url } if transcription_intitule&.complete?
if modalite_complete_sans_audio_intitule?
return { 'audio_url' => transcription_modalite_reponse.audio_url }
end

{ 'audio_url' => transcription_modalite_reponse&.audio_url,
'intitule_audio' => transcription_intitule&.audio_url }
end

private

def reject_transcriptions(attributes)
Expand All @@ -60,4 +71,12 @@ def supprime_transcription
def supprime_illustration?
illustration.attached? && supprimer_illustration == '1'
end

def sans_audios?
transcription_intitule&.audio_url.blank? && transcription_modalite_reponse&.audio_url.blank?
end

def modalite_complete_sans_audio_intitule?
transcription_intitule&.audio_url.blank? && transcription_modalite_reponse&.complete?
end
end
23 changes: 6 additions & 17 deletions app/models/question_clic_dans_image.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ class QuestionClicDansImage < Question
after_update :supprime_zone_cliquable

def as_json(_options = nil)
json = base_json_object
json.merge!(additional_json_fields(transcription_intitule, transcription_modalite_reponse))
json = base_json
json.merge!(json_audio_fields, additional_json_fields)
end

private

def base_json_object
def base_json
slice(:id, :nom_technique).tap do |json|
json['type'] = 'clic-dans-image'
json['illustration'] = cdn_for(illustration) if illustration.attached?
Expand All @@ -27,20 +27,9 @@ def base_json_object
end
end

def additional_json_fields(intitule, modalite)
fields = { 'intitule' => intitule&.ecrit,
'modalite_reponse' => modalite&.ecrit,
'audio_url' => question_audio_principal(intitule, modalite) }
fields['intitule_audio'] = intitule&.audio_url if intitule&.ecrit.blank? && intitule&.audio_url
fields
end

def question_audio_principal(intitule, modalite)
if intitule&.ecrit.present? && intitule.audio.attached?
intitule.audio_url
elsif modalite&.ecrit.present? && modalite.audio.attached?
modalite.audio_url
end
def additional_json_fields
{ 'intitule' => transcription_intitule&.ecrit,
'modalite_reponse' => transcription_modalite_reponse&.ecrit }
end

def supprime_zone_cliquable
Expand Down
13 changes: 1 addition & 12 deletions app/models/question_glisser_deposer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class QuestionGlisserDeposer < Question

def as_json(_options = nil)
json = base_json
json.merge!(audio_fields, reponses_fields)
json.merge!(json_audio_fields, reponses_fields)
end

private
Expand All @@ -23,17 +23,6 @@ def base_json
end
end

def audio_fields
return { 'audio_url' => transcription_intitule.audio_url } if transcription_intitule&.complete?

if transcription_modalite_reponse&.complete?
return { 'audio_url' => transcription_modalite_reponse.audio_url,
'intitule_url' => transcription_intitule&.audio_url }
end

{}
end

def reponses_fields
reponses_non_classees = reponses.map do |reponse|
illustration_url = cdn_for(reponse.illustration) if reponse.illustration.attached?
Expand Down
33 changes: 8 additions & 25 deletions app/models/question_qcm.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,35 +15,26 @@ def restitue_reponse(reponse)
end

def as_json(_options = nil)
illustration_url = cdn_for(illustration) if illustration.attached?
json_object(transcription_intitule, transcription_modalite_reponse, illustration_url)
json = base_json
json.merge!(json_audio_fields, additional_json_fields)
end

private

def json_object(intitule, modalite, illustration)
json = base_json_object(illustration)
json.merge!(additional_json_fields(intitule, modalite))
end

def base_json_object(illustration)
def base_json
slice(:id, :nom_technique, :metacompetence, :type_qcm, :description,
:illustration).tap do |json|
json['type'] = 'qcm'
json['illustration'] = illustration
json['illustration'] = cdn_for(illustration)
end
end

def additional_json_fields(intitule, modalite)
fields = {
'intitule' => intitule&.ecrit,
'modalite_reponse' => modalite&.ecrit,
'audio_url' => question_audio_principal(intitule, modalite),
def additional_json_fields
{
'intitule' => transcription_intitule&.ecrit,
'modalite_reponse' => transcription_modalite_reponse&.ecrit,
'choix' => question_choix
}
fields['intitule_audio'] = intitule&.audio_url if intitule&.ecrit.blank? && intitule&.audio_url

fields
end

def question_choix
Expand All @@ -54,12 +45,4 @@ def question_choix
)
end
end

def question_audio_principal(intitule, modalite)
if intitule&.ecrit.present? && intitule.audio.attached?
intitule.audio_url
elsif modalite&.ecrit.present? && modalite.audio.attached?
modalite.audio_url
end
end
end
27 changes: 8 additions & 19 deletions app/models/question_saisie.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ class QuestionSaisie < Question
accepts_nested_attributes_for :bonne_reponse, allow_destroy: true

def as_json(_options = nil)
json = base_json_object
json.merge!(additional_json_fields(transcription_intitule, transcription_modalite_reponse))
json = base_json
json.merge!(json_audio_fields, additional_json_fields)
end

private

def base_json_object
def base_json
slice(:id, :nom_technique, :suffix_reponse, :description,
:illustration).tap do |json|
json['type'] = 'saisie'
Expand All @@ -25,24 +25,13 @@ def base_json_object
end
end

def additional_json_fields(intitule, modalite)
if bonne_reponse.present?
def additional_json_fields
if bonne_reponse
reponse = { 'textes' => bonne_reponse.intitule,
'bonneReponse' => bonne_reponse.type_choix == 'bon' }
end
fields = { 'intitule' => intitule&.ecrit,
'modalite_reponse' => modalite&.ecrit,
'audio_url' => question_audio_principal(intitule, modalite),
'reponse' => reponse }
fields['intitule_audio'] = intitule&.audio_url if intitule&.audio_url && intitule&.ecrit.blank?
fields
end

def question_audio_principal(intitule, modalite)
if intitule&.ecrit.present? && intitule.audio.attached?
intitule.audio_url
elsif modalite&.ecrit.present? && modalite.audio.attached?
modalite.audio_url
end
{ 'intitule' => transcription_intitule&.ecrit,
'modalite_reponse' => transcription_modalite_reponse&.ecrit,
'reponse' => reponse }
end
end
2 changes: 2 additions & 0 deletions app/models/transcription.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ def audio_type
end

def audio_url
return unless audio.attached?

cdn_for(audio)
end

Expand Down
22 changes: 1 addition & 21 deletions spec/models/question_clic_dans_image_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

require 'rails_helper'

RSpec.describe QuestionClicDansImage, type: :model do
describe QuestionClicDansImage, type: :model do
it { is_expected.to have_one_attached(:zone_cliquable) }

describe '#as_json' do
Expand Down Expand Up @@ -40,26 +40,6 @@
expect(json['modalite_reponse']).to eql(modalite.ecrit)
expect(json['zone_cliquable']).to start_with('data:image/svg+xml;base64,')
end

context "quand il n'y a pas d'intitulé écrit" do
let!(:intitule) do
create(:transcription, :avec_audio, question_id: question_clic_dans_image.id, ecrit: '')
end

it "retourne l'audio de la modalité de réponse comme audio de la question" do
json = question_clic_dans_image.as_json
expect(json['audio_url']).to eql(Rails.application.routes.url_helpers.url_for(
modalite.audio
))
end

it "retourne l'audio de l'intitulé comme audio secondaire" do
json = question_clic_dans_image.as_json
expect(json['intitule_audio']).to eql(Rails.application.routes.url_helpers.url_for(
intitule.audio
))
end
end
end

describe 'validations' do
Expand Down
46 changes: 1 addition & 45 deletions spec/models/question_glisser_deposer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
it 'serialise les champs' do
expect(json.keys).to match_array(%w[id intitule audio_url nom_technique
description illustration modalite_reponse type
reponsesNonClassees intitule_url])
reponsesNonClassees])
expect(json['type']).to eql('glisser-deposer-billets')
expect(json['modalite_reponse']).to eql(modalite.ecrit)
expect(json['illustration']).to eql(Rails.application.routes.url_helpers.url_for(
Expand All @@ -42,48 +42,4 @@
end
end
end

describe 'les audios' do
context 'quand il y a une modalité de réponse compléte' do
context 'avec un intitulé complet' do
let!(:intitule) do
create(:transcription, :avec_audio, question_id: question.id,
ecrit: 'Mon Intitulé')
end
it do
expect(json['audio_url']).to eql(Rails.application.routes.url_helpers.url_for(
intitule.audio
))
expect(json['intitule']).to eql('Mon Intitulé')
expect(json['intitule_url']).to eql(nil)
end
end

context 'sans intitulé' do
it do
expect(json['audio_url']).to eql(Rails.application.routes.url_helpers.url_for(
modalite.audio
))
expect(json['intitule']).to eql(nil)
expect(json['intitule_url']).to eql(nil)
end
end

context 'avec un intitulé incomplet' do
let!(:intitule) do
create(:transcription, :avec_audio, question_id: question.id,
ecrit: nil)
end
it do
expect(json['audio_url']).to eql(Rails.application.routes.url_helpers.url_for(
modalite.audio
))
expect(json['intitule']).to eql(nil)
expect(json['intitule_url']).to eql(Rails.application.routes.url_helpers.url_for(
intitule.audio
))
end
end
end
end
end
20 changes: 0 additions & 20 deletions spec/models/question_qcm_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,5 @@
))
expect(json['modalite_reponse']).to eql(modalite.ecrit)
end

context "quand il n'y a pas d'intitulé écrit" do
let!(:intitule) do
create(:transcription, :avec_audio, question_id: question_qcm.id, ecrit: '')
end

it "retourne l'audio de la modalité de réponse comme audio de la question" do
json = question_qcm.as_json
expect(json['audio_url']).to eql(Rails.application.routes.url_helpers.url_for(
modalite.audio
))
end

it "retourne l'audio de l'intitulé comme audio secondaire" do
json = question_qcm.as_json
expect(json['intitule_audio']).to eql(Rails.application.routes.url_helpers.url_for(
intitule.audio
))
end
end
end
end
29 changes: 0 additions & 29 deletions spec/models/question_saisie_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,35 +47,6 @@
))
end

context "quand il n'y a pas d'intitulé écrit" do
before do
Transcription.find_by(categorie: :intitule,
question_id: question_saisie.id).update(ecrit: '')
json
end

it "retourne l'audio de la consigne en audio principal" do
expect(json['audio_url']).to eql(Rails.application.routes.url_helpers.url_for(
modalite.audio
))
end

it "retourne l'audio de l'intitulé en audio secondaire" do
expect(json['intitule_audio']).to eql(Rails.application.routes.url_helpers.url_for(
question_saisie.transcriptions.first.audio
))
end
end

context 'quand il y a un intitulé écrit' do
it "retourne l'audio de l'intitulé en audio principal" do
json
expect(json['audio_url']).to eql(Rails.application.routes.url_helpers.url_for(
question_saisie.transcriptions.first.audio
))
end
end

context "quand il n'y a pas de réponse" do
it 'ne retourne pas de reponse' do
reponse.destroy
Expand Down
Loading

0 comments on commit addefe7

Please sign in to comment.