From 44cc2c11dd517f64cab342896cd19cdc8bf5e1f4 Mon Sep 17 00:00:00 2001 From: Milton Reder Date: Wed, 20 Nov 2024 15:15:00 -0500 Subject: [PATCH] Mod Survey (#58) * make survey intro into description * fix tests for desc * report viewed * response submitted --- .../events/mod_survey/report_viewed.php | 79 +++++++++++++++++ .../events/mod_survey/response_submitted.php | 67 +++++++++++++++ src/transformer/get_event_function_map.php | 2 + .../utils/get_activity/course_module.php | 13 +++ .../existing_module/data.json | 3 +- .../existing_module/statements.json | 3 + tests/mod_survey/report_viewed/data.json | 15 ++++ tests/mod_survey/report_viewed/event.json | 12 +++ .../report_viewed/report_viewed_test.php | 70 ++++++++++++++++ .../mod_survey/report_viewed/statements.json | 84 +++++++++++++++++++ tests/mod_survey/response_submitted/data.json | 15 ++++ .../mod_survey/response_submitted/event.json | 12 +++ .../response_submitted_test.php | 70 ++++++++++++++++ .../response_submitted/statements.json | 74 ++++++++++++++++ 14 files changed, 518 insertions(+), 1 deletion(-) create mode 100644 src/transformer/events/mod_survey/report_viewed.php create mode 100644 src/transformer/events/mod_survey/response_submitted.php create mode 100644 tests/mod_survey/report_viewed/data.json create mode 100644 tests/mod_survey/report_viewed/event.json create mode 100644 tests/mod_survey/report_viewed/report_viewed_test.php create mode 100644 tests/mod_survey/report_viewed/statements.json create mode 100644 tests/mod_survey/response_submitted/data.json create mode 100644 tests/mod_survey/response_submitted/event.json create mode 100644 tests/mod_survey/response_submitted/response_submitted_test.php create mode 100644 tests/mod_survey/response_submitted/statements.json diff --git a/src/transformer/events/mod_survey/report_viewed.php b/src/transformer/events/mod_survey/report_viewed.php new file mode 100644 index 000000000..d70f99758 --- /dev/null +++ b/src/transformer/events/mod_survey/report_viewed.php @@ -0,0 +1,79 @@ +. + +/** + * Transformer for survey report viewed event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\mod_survey; + +use src\transformer\utils as utils; + +/** + * Transformer for survey report viewed event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ +function report_viewed(array $config, \stdClass $event) { + $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); + $course = $repo->read_record_by_id('course', $event->courseid); + $survey = $repo->read_record_by_id('survey', $event->objectid); + $lang = utils\get_course_lang($course); + $action = unserialize($event->other)['action']; + + return[[ + 'actor' => utils\get_user($config, $user), + 'verb' => [ + 'id' => 'http://id.tincanapi.com/verb/viewed', + 'display' => [ + 'en' => 'Viewed' + ], + ], + 'object' => [ + 'id' => $config['app_url'] + . '/mod/survey/report.php?id=' . $event->contextinstanceid + . '&action=' . $action, + 'objectType' => 'Activity', + 'definition' => [ + 'type' => 'https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/report', + 'name' => [ + $lang => $survey->name . ' Report: ' . ucfirst($action), + ] + ] + ], + 'context' => [ + 'language' => $lang, + 'extensions' => utils\extensions\base($config, $event, $course), + 'contextActivities' => [ + 'parent' => utils\context_activities\get_parent( + $config, + $event->contextinstanceid, + true + ), + 'category' => [ + utils\get_activity\site($config), + ], + ], + ] + ]]; +} diff --git a/src/transformer/events/mod_survey/response_submitted.php b/src/transformer/events/mod_survey/response_submitted.php new file mode 100644 index 000000000..d162f4709 --- /dev/null +++ b/src/transformer/events/mod_survey/response_submitted.php @@ -0,0 +1,67 @@ +. + +/** + * Transformer for survey response submitted event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\mod_survey; + +use src\transformer\utils as utils; + +/** + * Transformer for survey response submitted event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ +function response_submitted(array $config, \stdClass $event) { + $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); + $course = $repo->read_record_by_id('course', $event->courseid); + $lang = utils\get_course_lang($course); + + return[[ + 'actor' => utils\get_user($config, $user), + 'verb' => [ + 'id' => 'http://adlnet.gov/expapi/verbs/completed', + 'display' => [ + 'en' => 'Completed' + ], + ], + 'object' => utils\get_activity\course_module( + $config, $course, $event->contextinstanceid + ), + 'context' => [ + 'language' => $lang, + 'extensions' => utils\extensions\base($config, $event, $course), + 'contextActivities' => [ + 'parent' => utils\context_activities\get_parent( + $config, + $event->contextinstanceid + ), + 'category' => [ + utils\get_activity\site($config), + ], + ], + ] + ]]; +} diff --git a/src/transformer/get_event_function_map.php b/src/transformer/get_event_function_map.php index 2fa067f48..255ab310b 100644 --- a/src/transformer/get_event_function_map.php +++ b/src/transformer/get_event_function_map.php @@ -135,6 +135,8 @@ function get_event_function_map() { '\mod_scorm\event\scoreraw_submitted' => 'mod_scorm\scoreraw_submitted', '\mod_scorm\event\status_submitted' => 'mod_scorm\status_submitted', '\mod_survey\event\course_module_viewed' => 'all\course_module_viewed', + '\mod_survey\event\report_viewed' => 'mod_survey\report_viewed', + '\mod_survey\event\response_submitted' => 'mod_survey\response_submitted', '\mod_url\event\course_module_viewed' => 'all\course_module_viewed', '\mod_wiki\event\course_module_viewed' => 'all\course_module_viewed', '\mod_workshop\event\course_module_viewed' => 'all\course_module_viewed', diff --git a/src/transformer/utils/get_activity/course_module.php b/src/transformer/utils/get_activity/course_module.php index b832ef388..0fb077079 100644 --- a/src/transformer/utils/get_activity/course_module.php +++ b/src/transformer/utils/get_activity/course_module.php @@ -69,6 +69,19 @@ function course_module(array $config, \stdClass $course, int $cmid) { ); } + // Survey + if ($module->name === 'survey') { + $def = [ + 'type' => $activitytype, + 'name' => [ + $courselang => $instancename, + ], + 'description' => [ + $courselang => utils\get_string_html_removed($instance->intro), + ], + ]; + } + $object = [ 'id' => $coursemoduleurl, 'definition' => $def, diff --git a/tests/mod_survey/course_module_viewed/existing_module/data.json b/tests/mod_survey/course_module_viewed/existing_module/data.json index 2d35daa31..b48c217eb 100644 --- a/tests/mod_survey/course_module_viewed/existing_module/data.json +++ b/tests/mod_survey/course_module_viewed/existing_module/data.json @@ -8,7 +8,8 @@ "survey": [ { "id": 1, - "name": "test_name" + "name": "test_name", + "intro": "

test_intro

" } ] } diff --git a/tests/mod_survey/course_module_viewed/existing_module/statements.json b/tests/mod_survey/course_module_viewed/existing_module/statements.json index 8eb288b4f..6abcc4688 100644 --- a/tests/mod_survey/course_module_viewed/existing_module/statements.json +++ b/tests/mod_survey/course_module_viewed/existing_module/statements.json @@ -19,6 +19,9 @@ "type": "http://id.tincanapi.com/activitytype/survey", "name": { "en": "test_name" + }, + "description": { + "en": "test_intro" } } }, diff --git a/tests/mod_survey/report_viewed/data.json b/tests/mod_survey/report_viewed/data.json new file mode 100644 index 000000000..b48c217eb --- /dev/null +++ b/tests/mod_survey/report_viewed/data.json @@ -0,0 +1,15 @@ +{ + "modules": [ + { + "id": 1, + "name": "survey" + } + ], + "survey": [ + { + "id": 1, + "name": "test_name", + "intro": "

test_intro

" + } + ] +} diff --git a/tests/mod_survey/report_viewed/event.json b/tests/mod_survey/report_viewed/event.json new file mode 100644 index 000000000..83b6f7e6b --- /dev/null +++ b/tests/mod_survey/report_viewed/event.json @@ -0,0 +1,12 @@ +{ + "id": 1, + "userid": 1, + "courseid": 1, + "timecreated": 1433946701, + "contextinstanceid": 1, + "eventname": "\\mod_survey\\event\\report_viewed", + "objectid": 1, + "contextinstanceid": 1, + "objecttable": "survey", + "other": "a:2:{s:6:\"action\";s:7:\"summary\";s:7:\"groupid\";i:0;}" +} diff --git a/tests/mod_survey/report_viewed/report_viewed_test.php b/tests/mod_survey/report_viewed/report_viewed_test.php new file mode 100644 index 000000000..a4c79c59f --- /dev/null +++ b/tests/mod_survey/report_viewed/report_viewed_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\mod_survey; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for report viewed event + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class report_viewed_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "mod_survey"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::report_viewed + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/mod_survey/report_viewed/statements.json b/tests/mod_survey/report_viewed/statements.json new file mode 100644 index 000000000..d50999d85 --- /dev/null +++ b/tests/mod_survey/report_viewed/statements.json @@ -0,0 +1,84 @@ +[ + { + "actor": { + "name": "test_fullname", + "account": { + "homePage": "http://www.example.org", + "name": "1" + } + }, + "verb": { + "id": "http://id.tincanapi.com/verb/viewed", + "display": { + "en": "Viewed" + } + }, + "object": { + "id": "http://www.example.org/mod/survey/report.php?id=1&action=summary", + "objectType": "Activity", + "definition": { + "type": "https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/report", + "name": { + "en": "test_name Report: Summary" + } + } + }, + "context": { + "language": "en", + "extensions": { + "http://lrs.learninglocker.net/define/extensions/info": { + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development", + "event_name": "\\mod_survey\\event\\report_viewed", + "event_function": "\\src\\transformer\\events\\mod_survey\\report_viewed" + } + }, + "contextActivities": { + "parent": [ + { + "id": "http://www.example.org/mod/survey/view.php?id=1", + "definition": { + "type": "http://id.tincanapi.com/activitytype/survey", + "name": { + "en": "test_name" + }, + "description": { + "en": "test_intro" + } + } + }, + { + "id": "http://www.example.org/course/section.php?id=1", + "objectType": "Activity", + "definition": { + "name": { + "en": "test_name Section 0" + }, + "type": "http://id.tincanapi.com/activitytype/section" + } + }, + { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + } + ], + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + } + } + } +] diff --git a/tests/mod_survey/response_submitted/data.json b/tests/mod_survey/response_submitted/data.json new file mode 100644 index 000000000..b48c217eb --- /dev/null +++ b/tests/mod_survey/response_submitted/data.json @@ -0,0 +1,15 @@ +{ + "modules": [ + { + "id": 1, + "name": "survey" + } + ], + "survey": [ + { + "id": 1, + "name": "test_name", + "intro": "

test_intro

" + } + ] +} diff --git a/tests/mod_survey/response_submitted/event.json b/tests/mod_survey/response_submitted/event.json new file mode 100644 index 000000000..846da2424 --- /dev/null +++ b/tests/mod_survey/response_submitted/event.json @@ -0,0 +1,12 @@ +{ + "id": 1, + "userid": 1, + "courseid": 1, + "timecreated": 1433946701, + "contextinstanceid": 1, + "eventname": "\\mod_survey\\event\\response_submitted", + "objectid": null, + "contextinstanceid": 1, + "objecttable": null, + "other": "a:1:{s:8:\"surveyid\";s:1:\"1\";}" +} diff --git a/tests/mod_survey/response_submitted/response_submitted_test.php b/tests/mod_survey/response_submitted/response_submitted_test.php new file mode 100644 index 000000000..be0f1a9e3 --- /dev/null +++ b/tests/mod_survey/response_submitted/response_submitted_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\mod_survey; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for response submitted event + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class response_submitted_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "mod_survey"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::response_submitted + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/mod_survey/response_submitted/statements.json b/tests/mod_survey/response_submitted/statements.json new file mode 100644 index 000000000..018b9b368 --- /dev/null +++ b/tests/mod_survey/response_submitted/statements.json @@ -0,0 +1,74 @@ +[ + { + "actor": { + "name": "test_fullname", + "account": { + "homePage": "http://www.example.org", + "name": "1" + } + }, + "verb": { + "id": "http://adlnet.gov/expapi/verbs/completed", + "display": { + "en": "Completed" + } + }, + "object": { + "id": "http://www.example.org/mod/survey/view.php?id=1", + "definition": { + "type": "http://id.tincanapi.com/activitytype/survey", + "name": { + "en": "test_name" + }, + "description": { + "en": "test_intro" + } + } + }, + "context": { + "language": "en", + "extensions": { + "http://lrs.learninglocker.net/define/extensions/info": { + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development", + "event_name": "\\mod_survey\\event\\response_submitted", + "event_function": "\\src\\transformer\\events\\mod_survey\\response_submitted" + } + }, + "contextActivities": { + "parent": [ + { + "id": "http://www.example.org/course/section.php?id=1", + "objectType": "Activity", + "definition": { + "name": { + "en": "test_name Section 0" + }, + "type": "http://id.tincanapi.com/activitytype/section" + } + }, + { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + } + ], + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + } + } + } +]