Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- define('CLI_SCRIPT', true);
- if (isset($_SERVER['REMOTE_ADDR'])) {
- exit(1);
- }
- require(dirname(__FILE__) . '/config.php');
- require_once($CFG->libdir . '/clilib.php');
- require_once($CFG->libdir . '/adminlib.php');
- require_once($CFG->dirroot . '/course/lib.php');
- require_once($CFG->libdir . '/testing/generator/lib.php');
- require_once($CFG->libdir . '/testing/generator/data_generator.php');
- require_once($CFG->libdir . '/testing/generator/module_generator.php');
- require_once($CFG->dirroot . '/calendar/tests/helpers.php');
- $PYEAR = '000117';
- $YEAR = '000118';
- $DOMAIN = "example.com.au";
- $users = [
- [
- 'firstname' => 'Adam',
- 'lastname' => 'Ant',
- ],
- [
- 'firstname' => 'Bert',
- 'lastname' => 'Bee',
- ],
- [
- 'firstname' => 'Colin',
- 'lastname' => 'Carter',
- ],
- [
- 'firstname' => 'Diane',
- 'lastname' => 'Denver',
- ],
- [
- 'firstname' => 'Emily',
- 'lastname' => 'Echo',
- ],
- [
- 'firstname' => 'Fred',
- 'lastname' => 'Ford',
- ],
- [
- 'firstname' => 'Gemma',
- 'lastname' => 'Gannoway',
- ],
- [
- 'firstname' => 'Hannah',
- 'lastname' => 'Henderson',
- ],
- [
- 'firstname' => 'Indianna',
- 'lastname' => 'Ibis',
- ],
- [
- 'firstname' => 'James',
- 'lastname' => 'Jackoughby',
- ],
- [
- 'firstname' => 'Kenneth',
- 'lastname' => 'Kamber',
- ],
- [
- 'firstname' => 'Lauren',
- 'lastname' => 'Little',
- ],
- [
- 'firstname' => 'Mary',
- 'lastname' => 'Maverley',
- ],
- [
- 'firstname' => 'Niamh',
- 'lastname' => 'Nimble',
- ],
- [
- 'firstname' => 'Oscar',
- 'lastname' => 'Ostlethwaite',
- ],
- [
- // Chemistry Undergraduate
- 'firstname' => 'Penny',
- 'lastname' => 'Pemberton',
- ],
- [
- 'firstname' => 'Queenie',
- 'lastname' => 'Quip',
- ],
- [
- 'firstname' => 'Rodney',
- 'lastname' => 'Rover',
- ],
- [
- 'firstname' => 'Sally',
- 'lastname' => 'Simpson',
- ],
- [
- // Chemistry Undergraduate
- 'firstname' => 'Trevor',
- 'lastname' => 'Turnbull',
- ],
- [
- // Chemistry Undergraduate
- 'firstname' => 'Una',
- 'lastname' => 'Umber',
- ],
- [
- 'firstname' => 'Victor',
- 'lastname' => 'Venenerton',
- ],
- [
- 'firstname' => 'William',
- 'lastname' => 'Wordsworth',
- ],
- [
- 'firstname' => 'Xanthia',
- 'lastname' => 'Xim',
- ],
- [
- 'firstname' => 'Yarloo',
- 'lastname' => 'Yawley',
- ],
- [
- 'firstname' => 'Zain',
- 'lastname' => 'Zacks',
- ],
- [
- // 1st year Chemistry + Maths
- // 2nd year Chemistry + Maths
- 'firstname' => 'James',
- 'lastname' => 'Boater',
- ],
- [
- // 1st year Chemistry + Physics
- // 2nd year Chemistry + Physics
- 'firstname' => 'Rachel',
- 'lastname' => 'Inman',
- ],
- [
- // 1st year Chemistry + Politics
- // 2nd year Chemistry
- 'firstname' => 'Jess',
- 'lastname' => 'Middleton',
- ],
- [
- // 1st year Physics + Maths
- // 2nd year Physics + Maths
- 'firstname' => 'John',
- 'lastname' => 'Handby',
- ],
- [
- // 1st year Chemistry + Maths
- // 2nd year Chemistry + Maths
- 'firstname' => 'Melissa',
- 'lastname' => 'Bragshaw',
- ],
- [
- // 1st year Maths + PPR
- // 2nd year Maths
- // 3rd year Maths
- 'firstname' => 'Bennie',
- 'lastname' => 'Hill',
- ],
- [
- // Maths tutor.
- 'firstname' => 'Todd',
- 'lastname' => 'Richunter',
- ],
- ];
- $categories = [
- [
- 'name' => '2018-2019',
- 'idnumber' => $YEAR,
- 'enrolments' => [
- 'manager' => [
- 'adam',
- ],
- ],
- 'children' => [
- [
- 'name' => 'Faculty of Science and Technology',
- 'idnumber' => "$YEAR-fst",
- 'enrolments' => [
- 'manager' => [
- 'bert',
- ],
- ],
- 'events' => [
- [
- 'name' => 'Faculty Induction',
- 'description' => '<p>A chance to meet the faculty staff</p>',
- 'timestartmodifier' => 'P1DT17H30M',
- ],
- ],
- 'children' => [
- [
- 'name' => 'Physics',
- 'idnumber' => "{$YEAR}-000035",
- 'enrolments' => [
- 'manager' => [
- 'fred',
- ],
- ],
- 'children' => [
- ],
- 'courses' => [
- [
- 'fullname' => 'PHYS101: The Physical Universe',
- 'shortname' => 'PHYS101',
- 'idnumber' => "{$YEAR}-001701",
- 'startdate' => '09/10/2018',
- 'enddate' => '10/5/2019',
- 'description' => '<p>The Physical Univerise</p>',
- 'enrolments' => [
- 'editingteacher' => [
- 'gemma',
- 'hannah',
- 'todd',
- ],
- 'student' => [
- 'rodney',
- 'trevor',
- 'victor',
- 'james',
- 'melissa',
- 'john',
- 'diane',
- 'hannah',
- 'niamh',
- 'penny',
- ],
- ],
- 'events' => [
- [
- 'name' => 'Science week volunteering',
- 'description' => '<p>We will have guests from local schools in to the observatory.</p>',
- 'timestartmodifier' => 'P1W1DT21H',
- ]
- ],
- 'activities' => [
- 'forum' => [
- [
- 'type' => 'news',
- 'name' => 'Announcements',
- 'intro' => '<p>Important announcements about the course.</p>',
- 'introformat' => FORMAT_HTML,
- 'discussions' => [
- [
- 'userid' => 'todd',
- 'createdmodifier' => 'P1W1DT21H',
- 'subject' => 'Venue change to Franklin Thursday',
- 'message' => '<p>We\'ve had to move the Thursday lecture this week to the Faraday lecture theatre due to ongoing works in Franklin.</p>',
- ],
- [
- 'userid' => 'todd',
- 'createdmodifier' => 'P2W2DT09H',
- 'subject' => 'Venue change to Franklin Thursday (again)',
- 'message' => '<p>The Faraday theatre is still unavailable. The lecture will be in Franklin again.</p>',
- ],
- [
- 'userid' => 'gemma',
- 'createdmodifier' => 'P5W3DT11H',
- 'subject' => 'Calculators',
- 'message' => '<p>Please note that calculators will not be permitted at the test next week. This is noted in the course handbook.</p>',
- ],
- ],
- ],
- [
- 'type' => 'eachuser',
- 'name' => 'Example of an "Each user posts once" forum',
- 'intro' => '<p>This is an example of an "Each user posts once" forum.</p>',
- 'discussions' => [
- [
- 'userid' => 'melissa',
- 'createdmodifier' => 'P3W3DT13H33M',
- 'name' => 'The subject of a post from Melissa',
- 'message' => '<p>This is the body of the post from Melissa.</p>',
- 'replies' => [
- [
- 'userid' => 'john',
- 'createdmodifier' => 'P3W3DT15H33M',
- 'message' => '<p>This is a reply to Melissa\'s post from John.</p><p>I think you\'ve make a really good point Melissa. Rock On!</p>',
- 'replies' => [
- [
- 'userid' => 'penny',
- 'createdmodifier' => 'P3W3DT16H35M',
- 'message' => '<p>Yup, I agree. Spot on.</p>',
- ],
- ],
- ],
- ],
- 'userid' => 'trevor',
- 'createdmodifier' => 'P3W4DT9H11M',
- 'name' => 'This is the subject of a post was written by trevor.',
- 'message' => '<p>This is the message of a post was written by trevor.</p>',
- 'replies' => [
- ],
- ],
- ],
- ],
- [
- 'type' => 'general',
- 'name' => 'Physics 101 Social space',
- 'intro' => '<p>A space for you to meet your peers.</p><p>Note: Whilst staff have access to this forum, they are not subscribed to it.</p>',
- 'discussions' => [
- [
- 'userid' => 'melissa',
- 'createdmodifier' => 'P1W1DT13H33M',
- 'name' => 'Burger night',
- 'message' => '<p>A group of us are planning to meet at the Wibbly Wobbly Burge bar at 5pm on Friday. Who\'s in?</p>',
- 'replies' => [
- [
- 'userid' => 'melissa',
- 'createdmodifier' => 'P1W1DT13H35M',
- 'message' => '<p>Sorry, forgot to say, if you haven\'t been there before and don\'t know where it is, I\'ll be heading down from my lab at 4:45.</p>',
- ],
- ],
- ],
- [
- 'userid' => 'rodney',
- 'createdmodifier' => 'P2W2DT15H17M',
- 'name' => 'Film',
- 'message' => '<p>Anyone want to go and see a film on Friday at the student cinema?</p>',
- 'replies' => [
- [
- 'userid' => 'melissa',
- 'createdmodifier' => 'P2W2DT15H33M',
- 'message' => '<p>I\'m in. Where do you want to meet?</p>',
- 'replies' => [
- [
- 'userid' => 'rodney',
- 'createdmodifier' => 'P2W2DT15H38M',
- 'message' => '<p>At the cinema at 6:45? Film starts at 7.</p>',
- 'replies' => [
- [
- 'userid' => 'melissa',
- 'createdmodifier' => 'P2W2DT16H20M',
- 'message' => '<p>Works for me.</p>',
- ],
- [
- 'userid' => 'hannah',
- 'createdmodifier' => 'P2W2DT16H22M',
- 'message' => '<p>Anyone want to catch dinner first? 5:30 at Luckys?</p>',
- 'replies' => [
- [
- 'userid' => 'melissa',
- 'createdmodifier' => 'P2W3DT03H22M',
- 'message' => '<p>Yup!</p>',
- ],
- ],
- ],
- ],
- ],
- ],
- ],
- ],
- ]
- ],
- ],
- ],
- ],
- ],
- ],
- ],
- ],
- ],
- ],
- ],
- ];
- $transaction = $DB->start_delegated_transaction();
- $generator = new test_data_generator();
- $generator->create_users($users);
- $generator->setup_courses($categories);
- error_log("Allowing commit");
- $transaction->allow_commit();
- class test_data_generator {
- public $users = [];
- public $courses = [];
- public $categories = [];
- public $roles = [];
- protected $adminuser = null;
- public function __construct() {
- global $DB;
- $this->roles = $DB->get_records('role', [], '', 'shortname, id');
- $this->adminuser = \core_user::get_user_by_username('admin');
- $users = $DB->get_recordset('user');
- foreach ($users as $user) {
- if (!empty($user->idnumber)) {
- $this->users[$user->username] = $user;
- }
- }
- $users->close();
- $courses = $DB->get_recordset('course');
- foreach ($courses as $course) {
- if (!empty($course->idnumber)) {
- $this->courses[$course->idnumber] = $course;
- }
- }
- $courses->close();
- $categories = $DB->get_recordset('course_categories');
- foreach ($categories as $coursecat) {
- if (!empty($coursecat->idnumber)) {
- $this->categories[$coursecat->idnumber] = $coursecat;
- }
- }
- $categories->close();
- }
- public function create_users($users) {
- foreach ($users as $user) {
- $this->create_user($user);
- }
- }
- public function setup_courses($data) {
- foreach ($data as $category) {
- $this->create_category($category);
- }
- }
- protected function create_category($category, $parent = null) {
- global $DB;
- // Process the current category.
- $record = (object) $category;
- if (!empty($parent)) {
- $record->parent = $parent->id;
- }
- if (!empty($this->categories[$record->idnumber])) {
- $thiscategory = $this->categories[$record->idnumber];
- error_log("==> Found existing category");
- $changed = false;
- foreach ((array) $record as $key => $value) {
- if (isset($thiscategory->$key) && $thiscategory->$key != $value) {
- $thiscategory->$key = $value;
- $changed = true;
- }
- }
- if ($changed) {
- $DB->update_record('course_categories', $thiscategory);
- }
- // TODO Update the parentage.
- } else {
- $generator = new testing_data_generator();
- $thiscategory = $generator->create_category($record);
- if ($parent) {
- error_log("==> Created category '{$thiscategory->name}' in '{$parent->name}'");
- } else {
- error_log("==> Created category '{$thiscategory->name}' in root");
- }
- }
- $this->categories[$thiscategory->idnumber] = $thiscategory;
- // Now add any child categories.
- foreach ($category['children'] as $child) {
- $this->create_category($child, $thiscategory);
- }
- // Now add any courses directly in this category.
- if (isset($category['courses'])) {
- foreach ($category['courses'] as $course) {
- $this->create_course($course, $thiscategory);
- }
- }
- // Now add any events directly in this category.
- if (isset($category['events'])) {
- foreach ($category['events'] as $event) {
- $event['category'] = $thiscategory;
- $this->create_event($event);
- }
- }
- // Enrol any users who should be there.
- if (isset($category['enrolments'])) {
- foreach ($category['enrolments'] as $rolename => $users) {
- foreach ($users as $username) {
- $this->assign_category_role($thiscategory, $username, $rolename);
- }
- }
- }
- return $thiscategory;
- }
- protected function create_course($course, $category) {
- global $DB;
- $record = (object) $course;
- $record->category = $category->id;
- if (!empty($record->startdate)) {
- $value = DateTime::createFromFormat('d/m/Y', $record->startdate);
- $record->startdate = $value->format('U');
- if (!empty($record->enddate)) {
- $value = DateTime::createFromFormat('d/m/Y', $record->enddate);
- $record->enddate = $value->format('U');
- }
- }
- if (empty($record->startdate)) {
- unset($record->enddate);
- }
- if (empty($record->description)) {
- $exp = explode(":", $record->fullname, 2);
- $record->description = "<p>" . trim($exp[1]) . "</p>";
- }
- if (empty($record->shortname)) {
- $name = explode(":", $record->fullname, 2);
- $record->shortname = trim($name[0]);
- }
- $year = explode('-', $record->idnumber);
- $record->shortname = "{$year[0]}-{$record->shortname}";
- if (!empty($this->courses[$record->idnumber])) {
- $thiscourse = $this->courses[$record->idnumber];
- error_log("==> Found existing course {$record->shortname}");
- $changed = false;
- foreach ((array) $record as $key => $value) {
- if (isset($thiscourse->$key) && $thiscourse->$key != $value) {
- $thiscourse->$key = $value;
- $changed = true;
- error_log("{$key} > {$thiscourse->$key} => {$value}");
- }
- }
- if ($changed) {
- $DB->update_record('course', $thiscourse);
- }
- // TODO Update the parentage.
- } else {
- error_log("==> Creating course '{$record->shortname}' in '{$category->name}'");
- $generator = new testing_data_generator();
- $thiscourse = $generator->create_course($record);
- $this->courses[$thiscourse->idnumber] = $thiscourse;
- error_log("==> Created course '{$thiscourse->shortname}' in '{$category->name}'");
- }
- // Finally enrol any users who should be there.
- if (isset($course['enrolments'])) {
- foreach ($course['enrolments'] as $rolename => $users) {
- foreach ($users as $username) {
- $this->assign_course_role($thiscourse, $username, $rolename);
- }
- }
- }
- // Now add any events directly in this category.
- if (isset($course['events'])) {
- foreach ($course['events'] as $event) {
- $event['course'] = $thiscourse;
- if (!empty($record->startdate) && empty($event['timestart']) && !empty($event['timestartmodifier'])) {
- $event['timestart'] = $record->startdate;
- }
- $this->create_event($event);
- }
- }
- // Activity creation.
- if (isset($course['activities'])) {
- foreach ($course['activities'] as $type => $instances) {
- $fn = "create_activity_{$type}";
- if (method_exists($this, $fn)) {
- foreach ($instances as $instance) {
- $this->$fn($thiscourse, $instance);
- }
- }
- }
- }
- return $thiscourse;
- }
- protected function create_user($user) {
- global $DOMAIN, $DB;
- $record = (object) $user;
- $username = strtolower($record->firstname);
- $record->username = $username;
- $record->idnumber = $record->username;
- $record->email = "{$username}@{$DOMAIN}";;
- $record->password = 'x';
- if (isset($this->users[$record->username])) {
- $thisuser = $this->users[$record->idnumber];
- error_log("==> Found existing user {$record->username}");
- $changed = false;
- foreach ((array) $record as $key => $value) {
- if ($key === 'password') {
- if (validate_internal_user_password($thisuser, $value)) {
- continue;
- }
- $value = hash_internal_user_password($value);
- }
- if (isset($thisuser->$key) && $thisuser->$key != $value) {
- error_log("{$key} > {$thisuser->$key} => {$value}");
- $thisuser->$key = $value;
- $changed = true;
- }
- }
- if ($changed) {
- error_log("Updating user {$thisuser->username}");
- $DB->update_record('user', $thisuser);
- }
- } else {
- $generator = new testing_data_generator();
- $thisuser = $generator->create_user($record);
- $this->users[$username] = $thisuser;
- $thisuser = $this->users[$username];
- }
- // Now add any events directly in this category.
- if (isset($user['events'])) {
- foreach ($user['events'] as $event) {
- $event['user'] = $thisuser;
- $this->create_event($event);
- }
- }
- }
- protected function assign_category_role($category, string $username, string $rolename) {
- $generator = new testing_data_generator();
- $roleid = $this->roles[$rolename]->id;
- $user = $this->users[$username];
- $userid = $user->id;
- $context = \context_coursecat::instance($category->id);
- $contextid = $context->id;
- $generator->role_assign($roleid, $userid, $contextid);
- error_log("==> Assigned role '{$rolename}' ({$roleid}) to '{$user->username}' in '{$category->name}'");
- }
- protected function assign_course_role($course, string $username, string $rolename) {
- $generator = new testing_data_generator();
- $roleid = $this->roles[$rolename]->id;
- $user = $this->users[$username];
- $userid = $user->id;
- $generator->enrol_user($userid, $course->id, $roleid);
- error_log("==> Enrolled user '{$user->username}' as a '{$rolename}' ({$roleid}) in '{$course->shortname}'");
- }
- protected function create_event($event) {
- global $DB;
- $properties = [
- 'name' => 'Event',
- 'description' => '',
- 'descriptionformat' => FORMAT_HTML,
- 'eventtype' => 'site',
- 'repeat' => 0,
- 'repeats' => 0,
- 'timestart' => null,
- 'timeduration' => 0,
- 'timesort' => null,
- 'type' => CALENDAR_EVENT_TYPE_STANDARD,
- 'uuid' => null,
- ];
- $event = (object) $event;
- $record = (object) [];
- foreach ($properties as $property => $default) {
- if (isset($event->$property)) {
- $record->$property = $event->$property;
- } else {
- $record->$property = $default;
- }
- }
- $params = [];
- if (!empty($record->timestart)) {
- $time = \DateTime::createFromFormat('U', $record->timestart);
- } else {
- $time = new \DateTime('Sunday');
- $time->sub(new \DateInterval('P3W'));
- }
- if (isset($event->timestartmodifier)) {
- $time->add(new \DateInterval($event->timestartmodifier));
- }
- $record->timestart = $time->format('U');
- if (isset($event->category)) {
- $record->eventtype = 'category';
- $params['categoryid'] = $record->categoryid = $event->category->id;
- }
- if (isset($event->course)) {
- $record->eventtype = 'course';
- $params['courseid'] = $record->courseid = $event->course->id;
- }
- if (isset($event->username)) {
- $record->eventtype = 'user';
- $user = $this->users[$username];
- $params['userid'] = $record->userid = $user->id;
- }
- if (empty($record->userid)) {
- $record->userid = $this->adminuser->id;;
- }
- if (!empty($record->repeats)) {
- $record->repeat = 1;
- }
- if (empty($record->uuid)) {
- $record->uuid = sha1($record->name);
- }
- $params['eventtype'] = $record->eventtype;
- $params['uuid'] = $record->uuid;
- $oldevents = $DB->get_records('event', $params);
- $oldevent = null;
- foreach ($oldevents as $e) {
- $oldevent = $e;
- if (!empty($e->repeatid) && $e->repeatid = $e->id) {
- break;
- }
- }
- if ($oldevent) {
- $e = new \calendar_event($oldevent);
- $e->update($record, false);
- error_log("Event: {$record->name} updated");
- } else {
- \calendar_event::create($record, false);
- error_log("Event: {$record->name} created");
- }
- }
- protected function create_activity_forum($course, $data) {
- global $DB;
- $generator = new testing_data_generator();
- $discussions = [];
- if (isset($data['discussions'])) {
- $discussions = $data['discussions'];
- unset($data['discussions']);
- }
- $forum = $generator->create_module('forum', array_merge($data, [
- 'course' => $course->id,
- ]));
- $forumgenerator = $generator->get_plugin_generator('mod_forum');
- error_log("Created forum in {$course->shortname}:\t{$forum->id}\n");
- error_log(" Creating discussions:");
- foreach ($discussions as $discussiondata) {
- $discussiondata = (object) $discussiondata;
- error_log(" Creating discussion");
- $postdata = isset($discussiondata->post) ? $discussiondata->post : [];
- unset($discussiondata->post);
- $discussiondata->course = $course->id;
- $discussiondata->forum = $forum->id;
- $discussiondata = $this->get_modified_course_time($course, $discussiondata, 'timemodified');
- $discussiondata = $this->get_modified_course_time($course, $discussiondata, 'timestart');
- $discussiondata = $this->get_modified_course_time($course, $discussiondata, 'timeend');
- $discussiondata = $this->fill_userid_field($discussiondata, 'userid');
- $discussion = $forumgenerator->create_discussion($discussiondata);
- $firstpost = $DB->get_record('forum_posts', ['discussion' => $discussion->id]);
- $replies = isset($discussiondata->replies) ? $discussiondata->replies : [];
- foreach ($replies as $replydata) {
- error_log(" Creating reply");
- $this->create_activity_forum_discussion_replies($forumgenerator, $course, $forum, $discussion, $firstpost, $replydata);
- }
- }
- }
- protected function create_activity_forum_discussion_replies($generator, $course, $forum, $discussion, $parent, $postdata) {
- $postdata = (object) $postdata;
- $replies = isset($postdata->replies) ? $postdata->replies : [];
- unset($postdata->replies);
- $postdata = $this->get_modified_course_time($course, $postdata, 'created');
- $postdata = $this->get_modified_course_time($course, $postdata, 'modified');
- $postdata = $this->fill_userid_field($postdata, 'userid');
- $postdata->discussion = $discussion->id;
- $postdata->parent = $parent->id;
- $post = $generator->create_post($postdata);
- error_log("Created post in {$forum->id}:\t{$forum->id}\n");
- foreach ($replies as $replydata) {
- $this->create_activity_forum_discussion_replies($generator, $course, $forum, $discussion, $post, $replydata);
- }
- }
- protected function get_modified_course_time($course, $record, $datefield, $addifabsent = true) {
- $found = false;
- if (isset($record->$datefield)) {
- $basedate = $record->$datefield;
- $found = true;
- } else if (!empty($course->startdate)) {
- $basedate = $course->startdate;
- } else {
- $basedate = time();
- }
- $time = \DateTime::createFromFormat('U', $basedate);
- $modifierfield = "{$datefield}modifier";
- if (isset($record->$modifierfield)) {
- $found = true;
- $modifier = $record->$modifierfield;
- if (substr($modifier, 0, 1) === '-') {
- $time->sub(new \DateInterval(substr($modifier, 1)));
- } else {
- $time->add(new \DateInterval($modifier));
- }
- }
- if ($addifabsent || $found) {
- $record->$datefield = $time->format('U');
- }
- return $record;
- }
- protected function fill_userid_field($record, $field) {
- if (isset($record->$field)) {
- if ($user = $this->users[$record->$field]) {
- $record->$field = $user->id;
- } else {
- throw new \moodle_exception("User '{$record->$field}' not found");
- }
- } else {
- throw new \moodle_exception("No field found in {$field}");
- }
- return $record;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement