Project | Release Version | Date |
---|---|---|
Sunbird Inquiry | R 6.0.0 | 7 July 2023 |
Important note to the adopters
This release includes upgrades to inQuiry building block to function with the QuML 1.1 format. The changes are detailed out in the link here. The V2 version of the components as it is known from release 6.0.0 will start working with QuML 1.1 format and hence the questions that previously exist in the system has to be migrated from QuML 1.0 to QuML 1.1 format. A one time migration activity needs to be done on the existing question / questionsets.
Following are the Planned Tickets of R 6.0.0
Sl.no | JIRA Id | Issue Type | Description |
---|---|---|---|
1 | IQ-480 | Minor-Enhancement | Integrate V2 player and Editor in the inQuiry Portal |
2 | IQ-469 | Bug | User is able to see all the fields editable in review mode |
3 | IQ-468 | Minor-Enhancement | Remove hard coding in the QuML Player |
4 | IQ-443 | Minor-Enhancement | inQuiry Documentation |
5 | IQ-442 | Minor-Enhancement | Integrate latest common form library in editor |
6 | IQ-421 | Minor-Enhancement | Remove hard coding of content organisation and target frameworks to point to a specific framework |
7 | IQ-414 | Minor-Enhancement | Editor/Player: Update the Node version from 14 to 16 |
8 | IQ-413 | Minor-Enhancement | Mark it video, PDF, and EPUB player as optional in the resource library |
9 | IQ-412 | Minor-Enhancement | Integration of Editor and Player web component into inQuiry portal |
10 | IQ-411 | Minor-Enhancement | Integration of QuML player web component into the sunbird resource library |
11 | IQ-410 | Minor-Enhancement | Integration of QuML player web component into the editor |
12 | IQ-393 | Minor-Enhancement | Error standardisation |
13 | IQ-385 | Minor-Enhancement | inQuiry V2 API Implementation |
14 | IQ-378 | Bug | Zoom icon and show answer button are overlapping for the subjective question with image |
15 | IQ-337 | Bug | User is not able to send for review when reset the set max and warning timer for question set |
16 | IQ-297 | Minor-Enhancement | Player changes to ensure QuML compliance |
17 | IQ-296 | Minor-Enhancement | Editor changes to ensure QuML compliance |
18 | IQ-272 | Minor-Enhancement | Inquiry - QuML Design Changes to ensure QuML complaince |
19 | IQ-148 | Bug | Footer is not aligned Properly when console is open. |
Tag: v6.0.0
Install: npm i @project-sunbird/sunbird-questionset-editor@6.0.0
URL: https://www.npmjs.com/package/@project-sunbird/sunbird-questionset-editor/v/6.0.0
Tag: v2.0.0
Install: npm i @project-sunbird/sunbird-questionset-editor-web-component@2.0.0
URL:https://www.npmjs.com/package/@project-sunbird/sunbird-questionset-editor-web-component/v/2.0.0
Form Field | Sample Config as per QuML 1.1 | Comments |
---|---|---|
showTimer | { "code": "showTimer", "name": "show Timer", "label": "show Timer", "placeholder": "show Timer", "description": "show Timer", "default": false, "dataType": "boolean", "inputType": "checkbox", "editable": true, "required": false, "visible": true, "renderingHints": { "class": "sb-g-col-lg-1" } } | Data type of showTimer is changes from string to boolean so form Config change is required for this field. |
showFeedback | { "code": "showFeedback", "name": "Show Feedback", "label": "Show Question Feedback", "placeholder": "Select Option", "description": "If feedback is selected, users are informed whether they have correctly answered question or not", "dataType": "boolean", "inputType": "checkbox", "editable": true, "required": false, "visible": true, "renderingHints": { "class": "sb-g-col-lg-1" } } | Data type of showFeedback is changes from string to boolean, so form Config change is required for this field. |
showSolutions | { "code": "showSolutions", "name": "Show Solution", "label": "Show Solution", "placeholder": "Select Option", "description": "If show solution is selected then solutions for each question will be shown to the user", "dataType": "boolean", "inputType": "checkbox", "editable": true, "required": false, "visible": true, "renderingHints": { "class": "sb-g-col-lg-1" } } | Data type of showSolutions is changed from string to boolean, so form Config change is required for this field. |
warningTime | No Config for warning time. | This field is not needed in QuML 1.1 .Warning time will be handled by playerConfig. |
bloomsLevel | { "code": "complexityLevel", "dataType": "list", "description": "Learning level", "editable": true, "inputType": "nestedselect", "label": "Learning level", "name": "Learning level", "placeholder": "Select Learning level", "renderingHints": { "class": "sb-g-col-lg-1" }, "required": false, "visible": true, "range": [ "remember", "understand", "apply", "analyse", "evaluate", "create" ], "validations": [] } | bloomsLevel property is changed to complexityLevel and it's datatype is also changed from string to array so the config change is required for this field |
Tag: v6.0.0
Install: npm i @project-sunbird/sunbird-quml-player@6.0.0
URL: https://www.npmjs.com/package/@project-sunbird/sunbird-quml-player/v/6.0.0
Tag: v2.0.0
Install: npm i @project-sunbird/sunbird-quml-player-web-component@2.0.0
URL: https://www.npmjs.com/package/@project-sunbird/sunbird-quml-player-web-component/v/2.0.0
Tag: v6.0.0
Install: npm i @project-sunbird/sunbird-resource-library@6.0.0
URL: https://www.npmjs.com/package/@project-sunbird/sunbird-resource-library/v/6.0.0
Component | Service To Build | Build Tag | Core Release Tag | Service To Deploy | Deploy Tag | Comment |
---|---|---|---|---|---|---|
Assessment | Build/job/Core/job/Assessment/ | release-6.0.0_RC2 | release-5.6.0_RC1 | Deploy/job/dev/job/Kubernetes/job/Assessment/ | release-6.0.0-inquiry_RC1 | New Configuration Added: Please Refer to Configuration Section Note: V2 API need to be onboarded. Ref: https://github.com/project-sunbird/sunbird-devops/compare/release-5.6.0-inquiry...release-6.0.0-inquiry |
InquiryUploadSchema | NA | NA | NA | Deploy/job/dev/job/Kubernetes/job/InquiryUploadSchema/ | NA | Schema Should be Uploaded For Question & QuestionSet using release-6.0.0-inquiry_RC1 |
InQuiryFlink Job | Build/job/KnowledgePlatform/job/InquiryFlinkJob | release-6.0.0_RC2 | Not Applicable | Deploy/job/dev/job/KnowledgePlatform/job/InquiryFlinkJob/ | release-6.0.0_RC2 | No Configuration Changes |
File Name: ansible/roles/stack-sunbird/templates/assessment-service_application.conf
actor {
deployment {
/healthActor
{
router = smallest-mailbox-pool
nr-of-instances = 5
dispatcher = actors-dispatcher
}
/itemSetActor
{
router = smallest-mailbox-pool
nr-of-instances = 2
dispatcher = actors-dispatcher
}
/questionActor
{
router = smallest-mailbox-pool
nr-of-instances = 5
dispatcher = actors-dispatcher
}
/questionSetActor
{
router = smallest-mailbox-pool
nr-of-instances = 5
dispatcher = actors-dispatcher
}
/questionV5Actor
{
router = smallest-mailbox-pool
nr-of-instances = 5
dispatcher = actors-dispatcher
}
/questionSetV5Actor
{
router = smallest-mailbox-pool
nr-of-instances = 5
dispatcher = actors-dispatcher
}
}
}
assessment.copy.props_to_remove=["downloadUrl", "artifactUrl", "variants",
"createdOn", "collections", "children", "lastUpdatedOn", "SYS_INTERNAL_LAST_UPDATED_ON",
"versionKey", "s3Key", "status", "pkgVersion", "toc_url", "mimeTypesCount",
"contentTypesCount", "leafNodesCount", "childNodes", "prevState", "lastPublishedOn",
"flagReasons", "compatibilityLevel", "size", "publishChecklist", "publishComment",
"LastPublishedBy", "rejectReasons", "rejectComment", "gradeLevel", "subject",
"medium", "board", "topic", "purpose", "subtopic", "contentCredits",
"owner", "collaborators", "creators", "contributors", "badgeAssertions", "dialcodes",
"concepts", "keywords", "reservedDialcodes", "dialcodeRequired", "leafNodes", "sYS_INTERNAL_LAST_UPDATED_ON", "prevStatus", "lastPublishedBy", "streamingUrl", "publish_type", "migrationVersion"]
# V5 API Configurations
v5_supported_qumlVersions=[1.1]
v5_default_qumlVersion=1.1
File Name: ansible/roles/kong-api/defaults/main.yml
- name: questionCreateV2
uris: "{{ question_prefix }}/v2/create"
upstream_url: "{{ assessment_service_url }}/question/v5/create"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentCreate
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionReadV2
uris: "{{ question_prefix }}/v2/read"
upstream_url: "{{ assessment_service_url }}/question/v5/read"
strip_uri: true
plugins:
- name: cors
- "{{ statsd_pulgin }}"
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: ip
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionPrivateReadV2
uris: "{{ question_prefix }}/v2/private/read"
upstream_url: "{{ assessment_service_url }}/question/v5/private/read"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentAccess
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionUpdateV2
uris: "{{ question_prefix }}/v2/update"
upstream_url: "{{ assessment_service_url }}/question/v5/update"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentUpdate
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionRetireV2
uris: "{{ question_prefix }}/v2/retire"
upstream_url: "{{ assessment_service_url }}/question/v5/retire"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentAdmin
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionReviewV2
uris: "{{ question_prefix }}/v2/review"
upstream_url: "{{ assessment_service_url }}/question/v5/review"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentAdmin
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionPublishV2
uris: "{{ question_prefix }}/v2/publish"
upstream_url: "{{ assessment_service_url }}/question/v5/publish"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentCreate
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionListV2
uris: "{{ question_prefix }}/v2/list"
upstream_url: "{{ assessment_service_url }}/question/v5/list"
strip_uri: true
plugins:
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: ip
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionRejectV2
uris: "{{ question_prefix }}/v2/reject"
upstream_url: "{{ assessment_service_url }}/question/v5/reject"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentAdmin
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: copyQuestionV2
uris: "{{ question_prefix }}/v2/copy"
upstream_url: "{{ assessment_service_url }}/question/v5/copy"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentCreate
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetCreateV2
uris: "{{ questionset_prefix }}/v2/create"
upstream_url: "{{ assessment_service_url }}/questionset/v5/create"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentCreate
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetReadV2
uris: "{{ questionset_prefix }}/v2/read"
upstream_url: "{{ assessment_service_url }}/questionset/v5/read"
strip_uri: true
plugins:
- name: cors
- "{{ statsd_pulgin }}"
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: ip
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetPrivateReadV2
uris: "{{ questionset_prefix }}/v2/private/read"
upstream_url: "{{ assessment_service_url }}/questionset/v5/private/read"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentAccess
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetUpdateV2
uris: "{{ questionset_prefix }}/v2/update"
upstream_url: "{{ assessment_service_url }}/questionset/v5/update"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentUpdate
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetAddQuestionV2
uris: "{{ questionset_prefix }}/v2/add"
upstream_url: "{{ assessment_service_url }}/questionset/v5/add"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- 'contentUpdate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetRemoveQuestionV2
uris: "{{ questionset_prefix }}/v2/remove"
upstream_url: "{{ assessment_service_url }}/questionset/v5/remove"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- 'contentUpdate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetRetireV2
uris: "{{ questionset_prefix }}/v2/retire"
upstream_url: "{{ assessment_service_url }}/questionset/v5/retire"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentAdmin
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetReviewV2
uris: "{{ questionset_prefix }}/v2/review"
upstream_url: "{{ assessment_service_url }}/questionset/v5/review"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentAdmin
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetPublishV2
uris: "{{ questionset_prefix }}/v2/publish"
upstream_url: "{{ assessment_service_url }}/questionset/v5/publish"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentAdmin
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetUpdateHierarchyV2
uris: "{{ questionset_prefix }}/v2/hierarchy/update"
upstream_url: "{{ assessment_service_url }}/questionset/v5/hierarchy/update"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentUpdate
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetReadHierarchyV2
uris: "{{ questionset_prefix }}/v2/hierarchy"
upstream_url: "{{ assessment_service_url }}/questionset/v5/hierarchy"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- anonymousContentAccess
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionSetRejectV2
uris: "{{ questionset_prefix }}/v2/reject"
upstream_url: "{{ assessment_service_url }}/questionset/v5/reject"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentAdmin
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionImportAPIV2
uris: "{{ question_prefix }}/v2/import"
upstream_url: "{{ assessment_service_url }}/question/v5/import"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentCreate
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: questionsetImportAPIV2
uris: "{{ questionset_prefix }}/v2/import"
upstream_url: "{{ assessment_service_url }}/questionset/v5/import"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentCreate
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
- name: copyQuestionSetV2
uris: "{{ questionset_prefix }}/v2/copy"
upstream_url: "{{ assessment_service_url }}/questionset/v5/copy"
strip_uri: true
plugins:
- name: jwt
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- contentCreate
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: opa-checks
config.required: false
config.enabled: false
ALTER TABLE {{ question_keyspace_name }}.question_data ADD (outcomeDeclaration text, feedback text);
A New Jenkins Job Created For Kafka Topic Management. The job can be imported using https://github.com/Sunbird-inQuiry/data-pipeline/blob/release-6.0.0_RC2/scripts/jenkins-jobs/Deploy/KnowledgePlatform/InquiryKafkaSetup/config.xml
For Build, Upload, and Deploy operation of data-pipeline jobs, jenkins jobs are available for import here
1. For V2 API's, compatibilityLevel increased by 1. So for Question object, value is 5 and for Questionset object, value is 6. If any application consume data based on compatibilityLevel, it should make the the changes accordingly.