diff --git a/src/transformer/events/mod_assign/feedback_viewed.php b/src/transformer/events/mod_assign/feedback_viewed.php new file mode 100644 index 000000000..f10450189 --- /dev/null +++ b/src/transformer/events/mod_assign/feedback_viewed.php @@ -0,0 +1,89 @@ +. + +/** + * Transformer fn for assignment feedback 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_assign; + +use src\transformer\utils as utils; + +/** + * Transformer fn for assignment feedback viewed event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ + +function feedback_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); + $lang = utils\get_course_lang($course); + + $coursemodule = $repo->read_record_by_id('course_modules', $event->contextinstanceid); + $module = $repo->read_record_by_id('modules', $coursemodule->module); + $instance = $repo->read_record_by_id($module->name, $coursemodule->instance); + $instancename = property_exists($instance, 'name') ? $instance->name : $module->name; + + $grade = $repo->read_record_by_id('assign_grades', $event->objectid); + $grader = $repo->read_record_by_id('user', $grade->grader); + + return [[ + 'actor' => utils\get_user($config, $user), + 'verb' => [ + 'id' => 'http://id.tincanapi.com/verb/viewed', + 'display' => [ + $lang => 'Viewed' + ], + ], + 'object' => [ + 'id' => $config['app_url'] + . '/mod/assign/view.php?id=' + . $event->contextinstanceid + . '#feedback', + 'objectType' => 'Activity', + 'definition' => [ + 'type' => 'https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/feedback', + 'name' => [ + $lang => $instancename . ' Feedback' + ] + ] + ], + 'context' => [ + 'language' => $lang, + 'instructor' => utils\get_user($config, $grader), + '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/get_event_function_map.php b/src/transformer/get_event_function_map.php index bfa7f619c..6bbc06282 100644 --- a/src/transformer/get_event_function_map.php +++ b/src/transformer/get_event_function_map.php @@ -65,6 +65,7 @@ function get_event_function_map() { '\core\event\question_created' => 'core\question_created', '\mod_assign\event\assessable_submitted' => 'mod_assign\assignment_submitted', '\mod_assign\event\submission_graded' => 'mod_assign\assignment_graded', + '\mod_assign\event\feedback_viewed' => 'mod_assign\feedback_viewed', '\mod_assign\event\course_module_viewed' => 'all\course_module_viewed', '\mod_bigbluebuttonbn\event\activity_viewed' => 'mod_bigbluebuttonbn\activity_viewed', '\mod_bigbluebuttonbn\event\activity_management_viewed' => 'mod_bigbluebuttonbn\activity_management_viewed', diff --git a/tests/mod_assign/feedback_viewed/user_viewed_feedback/data.json b/tests/mod_assign/feedback_viewed/user_viewed_feedback/data.json new file mode 100644 index 000000000..41a8a5985 --- /dev/null +++ b/tests/mod_assign/feedback_viewed/user_viewed_feedback/data.json @@ -0,0 +1,32 @@ +{ + "assign_grades": [ + { + "id": 1, + "grader": 2 + } + ], + "user": [ + { + "id": 1, + "firstname": "test_fullname1", + "email": "test1@test.com" + }, + { + "id": 2, + "firstname": "test_fullname2", + "email": "test2@test.com" + } + ], + "modules": [ + { + "id": 1, + "name": "assign" + } + ], + "assign": [ + { + "id": 1, + "name": "test_name" + } + ] +} diff --git a/tests/mod_assign/feedback_viewed/user_viewed_feedback/event.json b/tests/mod_assign/feedback_viewed/user_viewed_feedback/event.json new file mode 100644 index 000000000..24905420d --- /dev/null +++ b/tests/mod_assign/feedback_viewed/user_viewed_feedback/event.json @@ -0,0 +1,10 @@ +{ + "courseid": 1, + "eventname": "\\mod_assign\\event\\feedback_viewed", + "id": 1, + "objectid": 1, + "objecttable": "assign_grades", + "timecreated": 1433946701, + "userid": 1, + "contextinstanceid": 1 +} diff --git a/tests/mod_assign/feedback_viewed/user_viewed_feedback/statements.json b/tests/mod_assign/feedback_viewed/user_viewed_feedback/statements.json new file mode 100644 index 000000000..705524a36 --- /dev/null +++ b/tests/mod_assign/feedback_viewed/user_viewed_feedback/statements.json @@ -0,0 +1,88 @@ +[ + { + "actor": { + "name": "test_fullname1", + "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/assign/view.php?id=1#feedback", + "objectType": "Activity", + "definition": { + "type": "https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/feedback", + "name": { + "en": "test_name Feedback" + } + } + }, + "context": { + "instructor": { + "name": "test_fullname2", + "account": { + "homePage": "http://www.example.org", + "name": "2" + } + }, + "contextActivities": { + "parent": [ + { + "id": "http://www.example.org/mod/assign/view.php?id=1", + "definition": { + "type": "https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/assignment", + "name": { + "en": "test_name" + } + } + }, + { + "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" + } + } + } + ] + }, + "extensions": { + "http://lrs.learninglocker.net/define/extensions/info": { + "event_function": "\\src\\transformer\\events\\mod_assign\\feedback_viewed", + "event_name": "\\mod_assign\\event\\feedback_viewed", + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development" + } + }, + "language": "en" + } + } +] diff --git a/tests/mod_assign/feedback_viewed/user_viewed_feedback/user_viewed_feedback_test.php b/tests/mod_assign/feedback_viewed/user_viewed_feedback/user_viewed_feedback_test.php new file mode 100644 index 000000000..c46107814 --- /dev/null +++ b/tests/mod_assign/feedback_viewed/user_viewed_feedback/user_viewed_feedback_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\mod_assign\feedback_viewed\user_viewed_feedback; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for feedback_viewed event + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_viewed_feedback_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_assign"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::attempt_submitted + * @return void + */ + public function test_init() { + + } +}