From 6d242b28e67e12f42fbd38879b920f5da02bb090 Mon Sep 17 00:00:00 2001 From: John Ehringer Date: Mon, 9 Oct 2017 15:59:13 +0800 Subject: [PATCH] MDL-45730 core: Adding events to user profile field and categories CRUD. --- lang/en/moodle.php | 6 + .../event/user_info_category_created.php | 128 ++++++++++++++++ .../event/user_info_category_deleted.php | 115 ++++++++++++++ .../event/user_info_category_updated.php | 128 ++++++++++++++++ lib/classes/event/user_info_field_created.php | 141 ++++++++++++++++++ lib/classes/event/user_info_field_deleted.php | 127 ++++++++++++++++ lib/classes/event/user_info_field_updated.php | 141 ++++++++++++++++++ user/profile/definelib.php | 23 ++- 8 files changed, 808 insertions(+), 1 deletion(-) create mode 100644 lib/classes/event/user_info_category_created.php create mode 100644 lib/classes/event/user_info_category_deleted.php create mode 100644 lib/classes/event/user_info_category_updated.php create mode 100644 lib/classes/event/user_info_field_created.php create mode 100644 lib/classes/event/user_info_field_deleted.php create mode 100644 lib/classes/event/user_info_field_updated.php diff --git a/lang/en/moodle.php b/lang/en/moodle.php index 6844d5fd3a8..3cf6a99a0f4 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -771,6 +771,12 @@ $string['eventuserloggedout'] = 'User logged out'; $string['eventuserpasswordupdated'] = 'User password updated'; $string['eventuserprofileviewed'] = 'User profile viewed'; $string['eventuserupdated'] = 'User updated'; +$string['eventuserinfofieldcreated'] = 'User profile field created'; +$string['eventuserinfofieldupdated'] = 'User profile field updated'; +$string['eventuserinfofielddeleted'] = 'User profile field deleted'; +$string['eventuserinfocategorycreated'] = 'User profile field category created'; +$string['eventuserinfocategoryupdated'] = 'User profile field category updated'; +$string['eventuserinfocategorydeleted'] = 'User profile field category deleted'; $string['everybody'] = 'Everybody'; $string['executeat'] = 'Execute at'; $string['existing'] = 'Existing'; diff --git a/lib/classes/event/user_info_category_created.php b/lib/classes/event/user_info_category_created.php new file mode 100644 index 00000000000..e8d2692ee74 --- /dev/null +++ b/lib/classes/event/user_info_category_created.php @@ -0,0 +1,128 @@ +. + +/** + * User profile field created event. + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +defined('MOODLE_INTERNAL') || die(); + +/** + * User profile info category created event. + * + * @property-read array $other { + * Extra information about event. + * + * - string name: the name of the field. + * } + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @since Moodle 3.4 + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_info_category_created extends base { + + /** + * Initialise the event data. + */ + protected function init() { + $this->data['objecttable'] = 'user_info_category'; + $this->data['crud'] = 'c'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from a profile info category. + * + * @since Moodle 3.4 + * @param \stdClass $category A sna[pshot of the created category. + * @return \core\event\base + */ + public static function create_from_category($category) { + $event = self::create(array( + 'objectid' => $category->id, + 'context' => \context_system::instance(), + 'other' => array( + 'name' => $category->name, + ) + )); + + $event->add_record_snapshot('user_info_category', $category); + + return $event; + } + + /** + * Returns localised event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventuserinfocategorycreated'); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + $name = s($this->other['name']); + return "The user with id '$this->userid' created the user profile field category '$name' with id '$this->objectid'."; + } + + /** + * Returns relevant URL. + * + * @return \moodle_url + */ + public function get_url() { + return new \moodle_url('/user/profile/index.php', array( + 'action' => 'editcategory', + 'id' => $this->objectid + )); + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + } + + /** + * Get the backup/restore table mapping for this event. + * + * @return string + */ + public static function get_objectid_mapping() { + return base::NOT_MAPPED; + } +} diff --git a/lib/classes/event/user_info_category_deleted.php b/lib/classes/event/user_info_category_deleted.php new file mode 100644 index 00000000000..01db25bc94e --- /dev/null +++ b/lib/classes/event/user_info_category_deleted.php @@ -0,0 +1,115 @@ +. + +/** + * User profile field deleted event. + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace core\event; + +defined('MOODLE_INTERNAL') || die(); + +/** + * User deleted event class. + * + * @property-read array $other { + * Extra information about event. + * + * - string name: the name of the field. + * } + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @since Moodle 3.4 + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_info_category_deleted extends base { + + /** + * Initialise required event data properties. + */ + protected function init() { + $this->data['objecttable'] = 'user_info_category'; + $this->data['crud'] = 'd'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from a profile info category. + * + * @since Moodle 3.4 + * @param \stdClass $category A snapshot of the deleted category. + * @return \core\event\base + */ + public static function create_from_category($category) { + $event = self::create(array( + 'objectid' => $category->id, + 'context' => \context_system::instance(), + 'other' => array( + 'name' => $category->name, + ) + )); + + $event->add_record_snapshot('user_info_category', $category); + + return $event; + } + + /** + * Returns localised event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventuserinfocategorydeleted'); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + $name = s($this->other['name']); + return "The user with id '$this->userid' deleted the user profile field category '$name' with id '$this->objectid'."; + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + } + + /** + * Get the backup/restore table mapping for this event. + * + * @return string + */ + public static function get_objectid_mapping() { + return base::NOT_MAPPED; + } +} \ No newline at end of file diff --git a/lib/classes/event/user_info_category_updated.php b/lib/classes/event/user_info_category_updated.php new file mode 100644 index 00000000000..e2ebb5fca97 --- /dev/null +++ b/lib/classes/event/user_info_category_updated.php @@ -0,0 +1,128 @@ +. + +/** + * User profile field updated event. + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Event when user profile is updated. + * + * @property-read array $other { + * Extra information about event. + * + * - string name: the name of the field. + * } + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @since Moodle 3.4 + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_info_category_updated extends base { + + /** + * Initialise the event data. + */ + protected function init() { + $this->data['objecttable'] = 'user_info_category'; + $this->data['crud'] = 'u'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from a profile info category. + * + * @since Moodle 3.4 + * @param \stdClass $category A snapshot of the updated category. + * @return \core\event\base + */ + public static function create_from_category($category) { + $event = self::create(array( + 'objectid' => $category->id, + 'context' => \context_system::instance(), + 'other' => array( + 'name' => $category->name, + ) + )); + + $event->add_record_snapshot('user_info_category', $category); + + return $event; + } + + /** + * Returns localised event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventuserinfocategoryupdated'); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + $name = s($this->other['name']); + return "The user with id '$this->userid' updated the user profile field category '$name' with id '$this->objectid'."; + } + + /** + * Returns relevant URL. + * + * @return \moodle_url + */ + public function get_url() { + return new \moodle_url('/user/profile/index.php', array( + 'action' => 'editcategory', + 'id' => $this->objectid + )); + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + } + + /** + * Get the backup/restore table mapping for this event. + * + * @return string + */ + public static function get_objectid_mapping() { + return base::NOT_MAPPED; + } +} diff --git a/lib/classes/event/user_info_field_created.php b/lib/classes/event/user_info_field_created.php new file mode 100644 index 00000000000..8e1a4b6b8ce --- /dev/null +++ b/lib/classes/event/user_info_field_created.php @@ -0,0 +1,141 @@ +. + +/** + * User profile field created event. + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +defined('MOODLE_INTERNAL') || die(); + +/** + * User profile info field created event. + * + * @property-read array $other { + * Extra information about event. + * + * - string shortname: the shortname of the field. + * - string name: the name of the field. + * - string datatype: the data type of the field. + * } + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @since Moodle 3.4 + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_info_field_created extends base { + + /** + * Initialise the event data. + */ + protected function init() { + $this->data['objecttable'] = 'user_info_field'; + $this->data['crud'] = 'c'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from a profile field. + * + * @since Moodle 3.4 + * @param \stdClass $field A snapshot of the created field. + * @return \core\event\base + */ + public static function create_from_field($field) { + $event = self::create(array( + 'objectid' => $field->id, + 'context' => \context_system::instance(), + 'other' => array( + 'shortname' => $field->shortname, + 'name' => $field->name, + 'datatype' => $field->datatype, + ) + )); + + $event->add_record_snapshot('user_info_field', $field); + + return $event; + } + + /** + * Returns localised event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventuserinfofieldcreated'); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + $name = s($this->other['name']); + return "The user with id '$this->userid' created the user profile field '$name' with id '$this->objectid'."; + } + + /** + * Returns relevant URL. + * + * @return \moodle_url + */ + public function get_url() { + return new \moodle_url('/user/profile/index.php', array( + 'action' => 'editfield', + 'id' => $this->objectid, + 'datatype' => $this->other['datatype'] + )); + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['shortname'])) { + throw new \coding_exception('The \'shortname\' value must be set in other.'); + } + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + + if (!isset($this->other['datatype'])) { + throw new \coding_exception('The \'datatype\' value must be set in other.'); + } + } + + /** + * Get the backup/restore table mapping for this event. + * + * @return string + */ + public static function get_objectid_mapping() { + return base::NOT_MAPPED; + } +} diff --git a/lib/classes/event/user_info_field_deleted.php b/lib/classes/event/user_info_field_deleted.php new file mode 100644 index 00000000000..a3af8c757da --- /dev/null +++ b/lib/classes/event/user_info_field_deleted.php @@ -0,0 +1,127 @@ +. + +/** + * User profile info field deleted event. + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace core\event; + +defined('MOODLE_INTERNAL') || die(); + +/** + * User profile info field deleted event. + * + * @property-read array $other { + * Extra information about event. + * + * - string shortname: the shortname of the field. + * - string name: the name of the field. + * - string datatype: the data type of the field. + * } + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @since Moodle 3.4 + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_info_field_deleted extends base { + + /** + * Initialise required event data properties. + */ + protected function init() { + $this->data['objecttable'] = 'user_info_field'; + $this->data['crud'] = 'd'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from a profile field. + * + * @since Moodle 3.4 + * @param \stdClass $field A snapshot of the deleted field. + * @return \core\event\base + */ + public static function create_from_field($field) { + $event = self::create(array( + 'objectid' => $field->id, + 'context' => \context_system::instance(), + 'other' => array( + 'shortname' => $field->shortname, + 'name' => $field->name, + 'datatype' => $field->datatype, + ) + )); + + $event->add_record_snapshot('user_info_field', $field); + + return $event; + } + + /** + * Returns localised event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventuserinfofielddeleted'); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + $name = s($this->other['name']); + return "The user with id '$this->userid' deleted the user profile field '$name' with id '$this->objectid'."; + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['shortname'])) { + throw new \coding_exception('The \'shortname\' value must be set in other.'); + } + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + + if (!isset($this->other['datatype'])) { + throw new \coding_exception('The \'datatype\' value must be set in other.'); + } + } + + /** + * Get the backup/restore table mapping for this event. + * + * @return string + */ + public static function get_objectid_mapping() { + return base::NOT_MAPPED; + } +} \ No newline at end of file diff --git a/lib/classes/event/user_info_field_updated.php b/lib/classes/event/user_info_field_updated.php new file mode 100644 index 00000000000..270de986da1 --- /dev/null +++ b/lib/classes/event/user_info_field_updated.php @@ -0,0 +1,141 @@ +. + +/** + * User profile info field updated event. + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +defined('MOODLE_INTERNAL') || die(); + +/** + * User profile info field updated event. + * + * @property-read array $other { + * Extra information about event. + * + * - string shortname: the shortname of the field. + * - string name: the name of the field. + * - string datatype: the data type of the field. + * } + * + * @package core + * @copyright 2017 Web Courseworks, Ltd. {@link http://www.webcourseworks.com} + * @since Moodle 3.4 + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_info_field_updated extends base { + + /** + * Initialise the event data. + */ + protected function init() { + $this->data['objecttable'] = 'user_info_field'; + $this->data['crud'] = 'u'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from a profile field. + * + * @since Moodle 3.4 + * @param \stdClass $field A snapshot of the updated field. + * @return \core\event\base + */ + public static function create_from_field($field) { + $event = self::create(array( + 'objectid' => $field->id, + 'context' => \context_system::instance(), + 'other' => array( + 'shortname' => $field->shortname, + 'name' => $field->name, + 'datatype' => $field->datatype, + ) + )); + + $event->add_record_snapshot('user_info_field', $field); + + return $event; + } + + /** + * Returns localised event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventuserinfofieldupdated'); + } + + /** + * Returns non-localised event description with id's for admin use only. + * + * @return string + */ + public function get_description() { + $name = s($this->other['name']); + return "The user with id '$this->userid' updated the user profile field '$name' with id '$this->objectid'."; + } + + /** + * Returns relevant URL. + * + * @return \moodle_url + */ + public function get_url() { + return new \moodle_url('/user/profile/index.php', array( + 'action' => 'editfield', + 'id' => $this->objectid, + 'datatype' => $this->other['datatype'] + )); + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['shortname'])) { + throw new \coding_exception('The \'shortname\' value must be set in other.'); + } + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + + if (!isset($this->other['datatype'])) { + throw new \coding_exception('The \'datatype\' value must be set in other.'); + } + } + + /** + * Get the backup/restore table mapping for this event. + * + * @return string + */ + public static function get_objectid_mapping() { + return base::NOT_MAPPED; + } +} diff --git a/user/profile/definelib.php b/user/profile/definelib.php index a9a1a12c645..26198d9d8f8 100644 --- a/user/profile/definelib.php +++ b/user/profile/definelib.php @@ -187,6 +187,13 @@ class profile_define_base { } else { $DB->update_record('user_info_field', $data); } + + $field = $DB->get_record('user_info_field', array('id' => $data->id)); + if ($old) { + \core\event\user_info_field_updated::create_from_field($field)->trigger(); + } else { + \core\event\user_info_field_created::create_from_field($field)->trigger(); + } } /** @@ -303,6 +310,9 @@ function profile_delete_category($id) { // Finally we get to delete the category. $DB->delete_records('user_info_category', array('id' => $category->id)); profile_reorder_categories(); + + \core\event\user_info_category_deleted::create_from_category($category)->trigger(); + return true; } @@ -324,9 +334,14 @@ function profile_delete_field($id) { // Need to rebuild course cache to update the info. rebuild_course_cache(0, true); + // Prior to the delete, pull the record for the event. + $field = $DB->get_record('user_info_field', array('id' => $id)); + // Try to remove the record from the database. $DB->delete_records('user_info_field', array('id' => $id)); + \core\event\user_info_field_deleted::create_from_field($field)->trigger(); + // Reorder the remaining fields in the same category. profile_reorder_fields(); } @@ -465,9 +480,15 @@ function profile_edit_category($id, $redirect) { if (empty($data->id)) { unset($data->id); $data->sortorder = $DB->count_records('user_info_category') + 1; - $DB->insert_record('user_info_category', $data, false); + $data->id = $DB->insert_record('user_info_category', $data, true); + + $createdcategory = $DB->get_record('user_info_category', array('id' => $data->id)); + \core\event\user_info_category_created::create_from_category($createdcategory)->trigger(); } else { $DB->update_record('user_info_category', $data); + + $updatedcateogry = $DB->get_record('user_info_category', array('id' => $data->id)); + \core\event\user_info_category_updated::create_from_category($updatedcateogry)->trigger(); } profile_reorder_categories(); redirect($redirect);