From 8f5e2f380ff7fa3fd29154bcd66e0934990062ab Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Mon, 28 Nov 2022 00:25:26 +0100 Subject: [PATCH] Make survey duplication synchronous (to avoid proposals randomization) --- ui/src/lib/components/SurveyAdmin.svelte | 15 ++++++-- ui/src/lib/surveys.js | 44 +++++++++++++----------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/ui/src/lib/components/SurveyAdmin.svelte b/ui/src/lib/components/SurveyAdmin.svelte index 784d033..b8418d6 100644 --- a/ui/src/lib/components/SurveyAdmin.svelte +++ b/ui/src/lib/components/SurveyAdmin.svelte @@ -34,10 +34,14 @@ }) } + let duplicateInProgress = false; function duplicateSurvey() { + duplicateInProgress = true; survey.duplicate().then((response) => { + duplicateInProgress = false; goto(`surveys/${response.id}`); }).catch((error) => { + duplicateInProgress = false; ToastsStore.addErrorToast({ msg: error, }); @@ -157,14 +161,19 @@
- {#if survey.id} - - + {/if}
diff --git a/ui/src/lib/surveys.js b/ui/src/lib/surveys.js index 4009bfa..6b01b2d 100644 --- a/ui/src/lib/surveys.js +++ b/ui/src/lib/surveys.js @@ -105,31 +105,35 @@ export class Survey { for (const q of questions) { const oldQuestionId = q.id; + // This will create a new question with the same parameters delete q.id; + + // Also alter id_survey q.id_survey = response.id; - q.save().then((question) => { - q.id = oldQuestionId; - // Now recopy proposals - if (q.kind == "mcq" || q.kind == "ucq") { - q.getProposals().then((proposals) => { - for (const p of proposals) { - delete p.id; - p.id_question = question.id; - p.save(); - } - }); + // This save will create + const question = await q.save(); + + // Revert to the old question ID to perform the next retrievals + q.id = oldQuestionId; + + // Now recopy proposals + if (q.kind == "mcq" || q.kind == "ucq") { + const proposals = await q.getProposals(); + for (const p of proposals) { + delete p.id; + p.id_question = question.id; + await p.save(); } + } - // Now recopy correction templates - getCorrectionTemplates(oldQuestionId).then((cts) => { - for (const ct of cts) { - delete ct.id; - ct.id_question = question.id; - ct.save(); - } - }); - }); + // Now recopy correction templates + const cts = await getCorrectionTemplates(oldQuestionId); + for (const ct of cts) { + delete ct.id; + ct.id_question = question.id; + ct.save(); + } } return response;