From 003da8b0c93601fc1cfb0d40dc71ed3e8e189238 Mon Sep 17 00:00:00 2001 From: ozer550 Date: Fri, 14 Mar 2025 15:51:05 +0530 Subject: [PATCH 1/7] add an option for survey in completion --- .../contentcuration/frontend/shared/constants.js | 7 ++++++- contentcuration/contentcuration/frontend/shared/mixins.js | 4 ++++ .../views/contentNodeFields/CompletionOptions/index.vue | 3 +++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/contentcuration/contentcuration/frontend/shared/constants.js b/contentcuration/contentcuration/frontend/shared/constants.js index aa4db2e478..848fcbf3fb 100644 --- a/contentcuration/contentcuration/frontend/shared/constants.js +++ b/contentcuration/contentcuration/frontend/shared/constants.js @@ -223,6 +223,7 @@ export const CompletionDropdownMap = { goal: 'goal', practiceQuiz: 'practiceQuiz', reference: 'reference', + survey: 'survey', }; export const DurationDropdownMap = { @@ -284,7 +285,11 @@ export const CompletionOptionsDropdownMap = { CompletionDropdownMap.completeDuration, CompletionDropdownMap.reference, ], - [ContentKindsNames.EXERCISE]: [CompletionDropdownMap.goal, CompletionDropdownMap.practiceQuiz], + [ContentKindsNames.EXERCISE]: [ + CompletionDropdownMap.goal, + CompletionDropdownMap.practiceQuiz, + CompletionDropdownMap.survey + ], [ContentKindsNames.HTML5]: [ CompletionDropdownMap.completeDuration, CompletionDropdownMap.determinedByResource, diff --git a/contentcuration/contentcuration/frontend/shared/mixins.js b/contentcuration/contentcuration/frontend/shared/mixins.js index 58cc27b727..23c2d28d49 100644 --- a/contentcuration/contentcuration/frontend/shared/mixins.js +++ b/contentcuration/contentcuration/frontend/shared/mixins.js @@ -261,6 +261,10 @@ export const metadataStrings = createTranslator('CommonMetadataStrings', { context: 'One of the completion criteria types specific to exercises. An exercise with this criteria represents a quiz.', }, + survey: { + message: 'Survey', + context: 'One of the completion criteria types specific to exercises. An exercise with this criteria represents a survey.', + }, // Learning Activities all: { diff --git a/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue b/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue index d28070b10f..51d0673af7 100644 --- a/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue +++ b/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue @@ -256,6 +256,9 @@ } else if (value === CompletionDropdownMap.goal) { update.modality = null; update.model = CompletionCriteriaModels.MASTERY; + } else if (value === CompletionDropdownMap.survey){ + update.modality = ContentModalities.QUIZ; + update.threshold = { mastery_model: MasteryModelsNames.DO_ALL }; } this.handleInput(update); }, From 43dd56d1e83b4a0e88a344fecd740ab0255e70c2 Mon Sep 17 00:00:00 2001 From: ozer550 Date: Mon, 17 Mar 2025 16:48:32 +0530 Subject: [PATCH 2/7] add feture flag for the survey --- .../CompletionOptions/index.vue | 16 +++++++++++----- .../contentcuration/static/feature_flags.json | 5 +++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue b/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue index 51d0673af7..7315f72ac4 100644 --- a/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue +++ b/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue @@ -119,6 +119,7 @@ completionCriteriaToDropdownMap, defaultCompletionCriteriaModels, defaultCompletionCriteriaThresholds, + FeatureFlagKeys, } from 'shared/constants'; import { MasteryModelsNames } from 'shared/leUtils/MasteryModels'; import { ContentKindsNames } from 'shared/leUtils/ContentKinds'; @@ -191,6 +192,9 @@ } return false; }, + allowSurvey() { + return this.$store.getters.hasFeatureEnabled(FeatureFlagKeys.survey); + }, audioVideoResource() { return this.kind === ContentKindsNames.AUDIO || this.kind === ContentKindsNames.VIDEO; }, @@ -256,7 +260,7 @@ } else if (value === CompletionDropdownMap.goal) { update.modality = null; update.model = CompletionCriteriaModels.MASTERY; - } else if (value === CompletionDropdownMap.survey){ + } else if (value === CompletionDropdownMap.survey) { update.modality = ContentModalities.QUIZ; update.threshold = { mastery_model: MasteryModelsNames.DO_ALL }; } @@ -361,10 +365,12 @@ }, showCorrectCompletionOptions() { if (this.kind) { - return CompletionOptionsDropdownMap[this.kind].map(model => ({ - text: this.translateMetadataString(model), - value: CompletionDropdownMap[model], - })); + return CompletionOptionsDropdownMap[this.kind] + .map(model => ({ + text: this.translateMetadataString(model), + value: CompletionDropdownMap[model], + })) + .filter(option => !(option.value === 'survey' && !this.allowSurvey)); } return []; }, diff --git a/contentcuration/contentcuration/static/feature_flags.json b/contentcuration/contentcuration/static/feature_flags.json index c5567d2451..93653fae13 100644 --- a/contentcuration/contentcuration/static/feature_flags.json +++ b/contentcuration/contentcuration/static/feature_flags.json @@ -13,6 +13,11 @@ "type": "boolean", "title":"Test AI feature", "description": "Allow user access to AI features" + }, + "survey":{ + "type": "boolean", + "title":"Test Survey feature", + "description": "Allow user access to Survey" } }, "examples": [ From 6274fef88b5528e743a5b5063f3fff429f984d49 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:45:34 +0000 Subject: [PATCH 3/7] [pre-commit.ci lite] apply automatic fixes --- contentcuration/contentcuration/frontend/shared/constants.js | 2 +- contentcuration/contentcuration/frontend/shared/mixins.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/contentcuration/contentcuration/frontend/shared/constants.js b/contentcuration/contentcuration/frontend/shared/constants.js index 848fcbf3fb..5a4f83c04b 100644 --- a/contentcuration/contentcuration/frontend/shared/constants.js +++ b/contentcuration/contentcuration/frontend/shared/constants.js @@ -288,7 +288,7 @@ export const CompletionOptionsDropdownMap = { [ContentKindsNames.EXERCISE]: [ CompletionDropdownMap.goal, CompletionDropdownMap.practiceQuiz, - CompletionDropdownMap.survey + CompletionDropdownMap.survey, ], [ContentKindsNames.HTML5]: [ CompletionDropdownMap.completeDuration, diff --git a/contentcuration/contentcuration/frontend/shared/mixins.js b/contentcuration/contentcuration/frontend/shared/mixins.js index 23c2d28d49..5b7a5d66fa 100644 --- a/contentcuration/contentcuration/frontend/shared/mixins.js +++ b/contentcuration/contentcuration/frontend/shared/mixins.js @@ -263,7 +263,8 @@ export const metadataStrings = createTranslator('CommonMetadataStrings', { }, survey: { message: 'Survey', - context: 'One of the completion criteria types specific to exercises. An exercise with this criteria represents a survey.', + context: + 'One of the completion criteria types specific to exercises. An exercise with this criteria represents a survey.', }, // Learning Activities From 26a08ed521f7fdbafef687b06513853ad0ab18f3 Mon Sep 17 00:00:00 2001 From: ozer550 Date: Mon, 24 Mar 2025 16:39:57 +0530 Subject: [PATCH 4/7] create a seperate model for survey --- .../frontend/shared/constants.js | 1 + .../CompletionOptions/index.vue | 22 ++++++++++++++++--- .../contentcuration/viewsets/contentnode.py | 2 +- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/contentcuration/contentcuration/frontend/shared/constants.js b/contentcuration/contentcuration/frontend/shared/constants.js index 5a4f83c04b..3e496937a2 100644 --- a/contentcuration/contentcuration/frontend/shared/constants.js +++ b/contentcuration/contentcuration/frontend/shared/constants.js @@ -202,6 +202,7 @@ export const FeatureFlagKeys = Object.keys(FeatureFlagsSchema.properties).reduce export const ContentModalities = { QUIZ: 'QUIZ', + SURVEY: 'SURVEY', }; export const AccessibilityCategoriesMap = { diff --git a/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue b/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue index 7315f72ac4..81ea3dcdde 100644 --- a/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue +++ b/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue @@ -187,8 +187,14 @@ }, showMasteryCriteriaGoalDropdown() { if (this.kind === ContentKindsNames.EXERCISE) { - //this ensures that anytime the completion dropdown is practice quiz - return this.value.modality !== ContentModalities.QUIZ; + //this ensures that anytime the completion dropdown is practice quiz or + // survey we dont show the mastery criteria goal dropdown + let showDropDown = true; + if (this.value.modality === ContentModalities.QUIZ || + this.value.modality === ContentModalities.SURVEY) { + showDropDown = false; + } + return showDropDown; } return false; }, @@ -224,6 +230,13 @@ ) { return CompletionDropdownMap.practiceQuiz; } + if ( + this.value.modality === ContentModalities.SURVEY && + this.model === CompletionCriteriaModels.MASTERY + ) + { + return CompletionDropdownMap.survey; + } return completionCriteriaToDropdownMap[this.model]; }, set(value) { @@ -261,7 +274,7 @@ update.modality = null; update.model = CompletionCriteriaModels.MASTERY; } else if (value === CompletionDropdownMap.survey) { - update.modality = ContentModalities.QUIZ; + update.modality = ContentModalities.survey; update.threshold = { mastery_model: MasteryModelsNames.DO_ALL }; } this.handleInput(update); @@ -287,6 +300,9 @@ if (this.value.modality === ContentModalities.QUIZ) { return false; } + if (this.value.modality === ContentModalities.SURVEY) { + return false; + } return get(this, 'threshold.mastery_model') === MasteryModelsNames.M_OF_N; }, mOfN: { diff --git a/contentcuration/contentcuration/viewsets/contentnode.py b/contentcuration/contentcuration/viewsets/contentnode.py index 612e38807c..772790e5f2 100644 --- a/contentcuration/contentcuration/viewsets/contentnode.py +++ b/contentcuration/contentcuration/viewsets/contentnode.py @@ -288,7 +288,7 @@ def update(self, instance, validated_data): class ExtraFieldsOptionsSerializer(JSONFieldDictSerializer): - modality = ChoiceField(choices=(("QUIZ", "Quiz"),), allow_null=True, required=False) + modality = ChoiceField(choices=(("QUIZ", "Quiz"),("SURVEY","Survey")), allow_null=True, required=False) completion_criteria = CompletionCriteriaSerializer(required=False) From da888d7e8b448c246cdfdf642a39e79f25f4102c Mon Sep 17 00:00:00 2001 From: ozer550 Date: Mon, 24 Mar 2025 20:39:18 +0530 Subject: [PATCH 5/7] linting --- .../views/contentNodeFields/CompletionOptions/index.vue | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue b/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue index 81ea3dcdde..5b4873f008 100644 --- a/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue +++ b/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue @@ -190,8 +190,10 @@ //this ensures that anytime the completion dropdown is practice quiz or // survey we dont show the mastery criteria goal dropdown let showDropDown = true; - if (this.value.modality === ContentModalities.QUIZ || - this.value.modality === ContentModalities.SURVEY) { + if ( + this.value.modality === ContentModalities.QUIZ || + this.value.modality === ContentModalities.SURVEY + ) { showDropDown = false; } return showDropDown; @@ -233,8 +235,7 @@ if ( this.value.modality === ContentModalities.SURVEY && this.model === CompletionCriteriaModels.MASTERY - ) - { + ) { return CompletionDropdownMap.survey; } return completionCriteriaToDropdownMap[this.model]; From 89ab2f95ac95c150a6ef8ad44ec325f4051f8281 Mon Sep 17 00:00:00 2001 From: ozer550 Date: Wed, 26 Mar 2025 16:51:50 +0530 Subject: [PATCH 6/7] fix failing tests --- .../CompletionOptions/index.vue | 11 +++++----- .../__tests__/completionOptions.spec.js | 21 +++++++++++++++++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue b/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue index 5b4873f008..d9c9697e05 100644 --- a/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue +++ b/contentcuration/contentcuration/frontend/shared/views/contentNodeFields/CompletionOptions/index.vue @@ -105,6 +105,7 @@