Advertisement
Guest User

Untitled

a guest
Feb 25th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.32 KB | None | 0 0
  1. <?php
  2.  
  3. define('CLI_SCRIPT', true);
  4.  
  5. if (isset($_SERVER['REMOTE_ADDR'])) {
  6. exit(1);
  7. }
  8.  
  9. require(dirname(__FILE__) . '/config.php');
  10. require_once($CFG->libdir . '/clilib.php');
  11. require_once($CFG->libdir . '/adminlib.php');
  12. require_once($CFG->dirroot . '/course/lib.php');
  13. require_once($CFG->libdir . '/testing/generator/lib.php');
  14. require_once($CFG->libdir . '/testing/generator/data_generator.php');
  15. require_once($CFG->libdir . '/testing/generator/module_generator.php');
  16. require_once($CFG->dirroot . '/calendar/tests/helpers.php');
  17.  
  18. $PYEAR = '000117';
  19. $YEAR = '000118';
  20.  
  21. $DOMAIN = "example.com.au";
  22.  
  23. $users = [
  24. [
  25. 'firstname' => 'Adam',
  26. 'lastname' => 'Ant',
  27. ],
  28. [
  29. 'firstname' => 'Bert',
  30. 'lastname' => 'Bee',
  31. ],
  32. [
  33. 'firstname' => 'Colin',
  34. 'lastname' => 'Carter',
  35. ],
  36. [
  37. 'firstname' => 'Diane',
  38. 'lastname' => 'Denver',
  39. ],
  40. [
  41. 'firstname' => 'Emily',
  42. 'lastname' => 'Echo',
  43. ],
  44. [
  45. 'firstname' => 'Fred',
  46. 'lastname' => 'Ford',
  47. ],
  48. [
  49. 'firstname' => 'Gemma',
  50. 'lastname' => 'Gannoway',
  51. ],
  52. [
  53. 'firstname' => 'Hannah',
  54. 'lastname' => 'Henderson',
  55. ],
  56. [
  57. 'firstname' => 'Indianna',
  58. 'lastname' => 'Ibis',
  59. ],
  60. [
  61. 'firstname' => 'James',
  62. 'lastname' => 'Jackoughby',
  63. ],
  64. [
  65. 'firstname' => 'Kenneth',
  66. 'lastname' => 'Kamber',
  67. ],
  68. [
  69. 'firstname' => 'Lauren',
  70. 'lastname' => 'Little',
  71. ],
  72. [
  73. 'firstname' => 'Mary',
  74. 'lastname' => 'Maverley',
  75. ],
  76. [
  77. 'firstname' => 'Niamh',
  78. 'lastname' => 'Nimble',
  79. ],
  80. [
  81. 'firstname' => 'Oscar',
  82. 'lastname' => 'Ostlethwaite',
  83. ],
  84. [
  85. // Chemistry Undergraduate
  86. 'firstname' => 'Penny',
  87. 'lastname' => 'Pemberton',
  88. ],
  89. [
  90. 'firstname' => 'Queenie',
  91. 'lastname' => 'Quip',
  92. ],
  93. [
  94. 'firstname' => 'Rodney',
  95. 'lastname' => 'Rover',
  96. ],
  97. [
  98. 'firstname' => 'Sally',
  99. 'lastname' => 'Simpson',
  100. ],
  101. [
  102. // Chemistry Undergraduate
  103. 'firstname' => 'Trevor',
  104. 'lastname' => 'Turnbull',
  105. ],
  106. [
  107. // Chemistry Undergraduate
  108. 'firstname' => 'Una',
  109. 'lastname' => 'Umber',
  110. ],
  111. [
  112. 'firstname' => 'Victor',
  113. 'lastname' => 'Venenerton',
  114. ],
  115. [
  116. 'firstname' => 'William',
  117. 'lastname' => 'Wordsworth',
  118. ],
  119. [
  120. 'firstname' => 'Xanthia',
  121. 'lastname' => 'Xim',
  122. ],
  123. [
  124. 'firstname' => 'Yarloo',
  125. 'lastname' => 'Yawley',
  126. ],
  127. [
  128. 'firstname' => 'Zain',
  129. 'lastname' => 'Zacks',
  130. ],
  131. [
  132. // 1st year Chemistry + Maths
  133. // 2nd year Chemistry + Maths
  134. 'firstname' => 'James',
  135. 'lastname' => 'Boater',
  136. ],
  137. [
  138. // 1st year Chemistry + Physics
  139. // 2nd year Chemistry + Physics
  140. 'firstname' => 'Rachel',
  141. 'lastname' => 'Inman',
  142. ],
  143. [
  144. // 1st year Chemistry + Politics
  145. // 2nd year Chemistry
  146. 'firstname' => 'Jess',
  147. 'lastname' => 'Middleton',
  148. ],
  149. [
  150. // 1st year Physics + Maths
  151. // 2nd year Physics + Maths
  152. 'firstname' => 'John',
  153. 'lastname' => 'Handby',
  154. ],
  155. [
  156. // 1st year Chemistry + Maths
  157. // 2nd year Chemistry + Maths
  158. 'firstname' => 'Melissa',
  159. 'lastname' => 'Bragshaw',
  160. ],
  161. [
  162. // 1st year Maths + PPR
  163. // 2nd year Maths
  164. // 3rd year Maths
  165. 'firstname' => 'Bennie',
  166. 'lastname' => 'Hill',
  167. ],
  168. [
  169. // Maths tutor.
  170. 'firstname' => 'Todd',
  171. 'lastname' => 'Richunter',
  172. ],
  173. ];
  174.  
  175. $categories = [
  176. [
  177. 'name' => '2018-2019',
  178. 'idnumber' => $YEAR,
  179. 'enrolments' => [
  180. 'manager' => [
  181. 'adam',
  182. ],
  183. ],
  184. 'children' => [
  185. [
  186. 'name' => 'Faculty of Science and Technology',
  187. 'idnumber' => "$YEAR-fst",
  188. 'enrolments' => [
  189. 'manager' => [
  190. 'bert',
  191. ],
  192. ],
  193. 'events' => [
  194. [
  195. 'name' => 'Faculty Induction',
  196. 'description' => '<p>A chance to meet the faculty staff</p>',
  197. 'timestartmodifier' => 'P1DT17H30M',
  198. ],
  199. ],
  200. 'children' => [
  201. [
  202. 'name' => 'Physics',
  203. 'idnumber' => "{$YEAR}-000035",
  204. 'enrolments' => [
  205. 'manager' => [
  206. 'fred',
  207. ],
  208. ],
  209. 'children' => [
  210. ],
  211. 'courses' => [
  212. [
  213. 'fullname' => 'PHYS101: The Physical Universe',
  214. 'shortname' => 'PHYS101',
  215. 'idnumber' => "{$YEAR}-001701",
  216. 'startdate' => '09/10/2018',
  217. 'enddate' => '10/5/2019',
  218. 'description' => '<p>The Physical Univerise</p>',
  219. 'enrolments' => [
  220. 'editingteacher' => [
  221. 'gemma',
  222. 'hannah',
  223. 'todd',
  224. ],
  225. 'student' => [
  226. 'rodney',
  227. 'trevor',
  228. 'victor',
  229. 'james',
  230. 'melissa',
  231. 'john',
  232. 'diane',
  233. 'hannah',
  234. 'niamh',
  235. 'penny',
  236. ],
  237. ],
  238. 'events' => [
  239. [
  240. 'name' => 'Science week volunteering',
  241. 'description' => '<p>We will have guests from local schools in to the observatory.</p>',
  242. 'timestartmodifier' => 'P1W1DT21H',
  243. ]
  244. ],
  245. 'activities' => [
  246. 'forum' => [
  247. [
  248. 'type' => 'news',
  249. 'name' => 'Announcements',
  250. 'intro' => '<p>Important announcements about the course.</p>',
  251. 'introformat' => FORMAT_HTML,
  252. 'discussions' => [
  253. [
  254. 'userid' => 'todd',
  255. 'createdmodifier' => 'P1W1DT21H',
  256. 'subject' => 'Venue change to Franklin Thursday',
  257. 'message' => '<p>We\'ve had to move the Thursday lecture this week to the Faraday lecture theatre due to ongoing works in Franklin.</p>',
  258. ],
  259. [
  260. 'userid' => 'todd',
  261. 'createdmodifier' => 'P2W2DT09H',
  262. 'subject' => 'Venue change to Franklin Thursday (again)',
  263. 'message' => '<p>The Faraday theatre is still unavailable. The lecture will be in Franklin again.</p>',
  264. ],
  265. [
  266. 'userid' => 'gemma',
  267. 'createdmodifier' => 'P5W3DT11H',
  268. 'subject' => 'Calculators',
  269. 'message' => '<p>Please note that calculators will not be permitted at the test next week. This is noted in the course handbook.</p>',
  270. ],
  271. ],
  272. ],
  273. [
  274. 'type' => 'eachuser',
  275. 'name' => 'Example of an "Each user posts once" forum',
  276. 'intro' => '<p>This is an example of an "Each user posts once" forum.</p>',
  277. 'discussions' => [
  278. [
  279. 'userid' => 'melissa',
  280. 'createdmodifier' => 'P3W3DT13H33M',
  281. 'name' => 'The subject of a post from Melissa',
  282. 'message' => '<p>This is the body of the post from Melissa.</p>',
  283. 'replies' => [
  284. [
  285. 'userid' => 'john',
  286. 'createdmodifier' => 'P3W3DT15H33M',
  287. '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>',
  288. 'replies' => [
  289. [
  290. 'userid' => 'penny',
  291. 'createdmodifier' => 'P3W3DT16H35M',
  292. 'message' => '<p>Yup, I agree. Spot on.</p>',
  293. ],
  294. ],
  295. ],
  296. ],
  297. 'userid' => 'trevor',
  298. 'createdmodifier' => 'P3W4DT9H11M',
  299. 'name' => 'This is the subject of a post was written by trevor.',
  300. 'message' => '<p>This is the message of a post was written by trevor.</p>',
  301. 'replies' => [
  302. ],
  303. ],
  304. ],
  305. ],
  306. [
  307. 'type' => 'general',
  308. 'name' => 'Physics 101 Social space',
  309. '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>',
  310. 'discussions' => [
  311. [
  312. 'userid' => 'melissa',
  313. 'createdmodifier' => 'P1W1DT13H33M',
  314. 'name' => 'Burger night',
  315. 'message' => '<p>A group of us are planning to meet at the Wibbly Wobbly Burge bar at 5pm on Friday. Who\'s in?</p>',
  316. 'replies' => [
  317. [
  318. 'userid' => 'melissa',
  319. 'createdmodifier' => 'P1W1DT13H35M',
  320. '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>',
  321. ],
  322. ],
  323. ],
  324. [
  325. 'userid' => 'rodney',
  326. 'createdmodifier' => 'P2W2DT15H17M',
  327. 'name' => 'Film',
  328. 'message' => '<p>Anyone want to go and see a film on Friday at the student cinema?</p>',
  329. 'replies' => [
  330. [
  331. 'userid' => 'melissa',
  332. 'createdmodifier' => 'P2W2DT15H33M',
  333. 'message' => '<p>I\'m in. Where do you want to meet?</p>',
  334. 'replies' => [
  335. [
  336. 'userid' => 'rodney',
  337. 'createdmodifier' => 'P2W2DT15H38M',
  338. 'message' => '<p>At the cinema at 6:45? Film starts at 7.</p>',
  339. 'replies' => [
  340. [
  341. 'userid' => 'melissa',
  342. 'createdmodifier' => 'P2W2DT16H20M',
  343. 'message' => '<p>Works for me.</p>',
  344. ],
  345. [
  346. 'userid' => 'hannah',
  347. 'createdmodifier' => 'P2W2DT16H22M',
  348. 'message' => '<p>Anyone want to catch dinner first? 5:30 at Luckys?</p>',
  349. 'replies' => [
  350. [
  351. 'userid' => 'melissa',
  352. 'createdmodifier' => 'P2W3DT03H22M',
  353. 'message' => '<p>Yup!</p>',
  354. ],
  355. ],
  356. ],
  357. ],
  358.  
  359. ],
  360. ],
  361. ],
  362. ],
  363. ]
  364. ],
  365. ],
  366. ],
  367. ],
  368. ],
  369. ],
  370. ],
  371. ],
  372. ],
  373. ],
  374. ],
  375. ];
  376.  
  377. $transaction = $DB->start_delegated_transaction();
  378.  
  379. $generator = new test_data_generator();
  380.  
  381. $generator->create_users($users);
  382. $generator->setup_courses($categories);
  383.  
  384. error_log("Allowing commit");
  385. $transaction->allow_commit();
  386.  
  387. class test_data_generator {
  388.  
  389. public $users = [];
  390. public $courses = [];
  391. public $categories = [];
  392. public $roles = [];
  393. protected $adminuser = null;
  394.  
  395. public function __construct() {
  396. global $DB;
  397.  
  398. $this->roles = $DB->get_records('role', [], '', 'shortname, id');
  399. $this->adminuser = \core_user::get_user_by_username('admin');
  400.  
  401. $users = $DB->get_recordset('user');
  402. foreach ($users as $user) {
  403. if (!empty($user->idnumber)) {
  404. $this->users[$user->username] = $user;
  405. }
  406. }
  407. $users->close();
  408.  
  409. $courses = $DB->get_recordset('course');
  410. foreach ($courses as $course) {
  411. if (!empty($course->idnumber)) {
  412. $this->courses[$course->idnumber] = $course;
  413. }
  414. }
  415. $courses->close();
  416.  
  417. $categories = $DB->get_recordset('course_categories');
  418. foreach ($categories as $coursecat) {
  419. if (!empty($coursecat->idnumber)) {
  420. $this->categories[$coursecat->idnumber] = $coursecat;
  421. }
  422. }
  423. $categories->close();
  424. }
  425.  
  426. public function create_users($users) {
  427. foreach ($users as $user) {
  428. $this->create_user($user);
  429. }
  430. }
  431.  
  432. public function setup_courses($data) {
  433. foreach ($data as $category) {
  434. $this->create_category($category);
  435. }
  436. }
  437.  
  438. protected function create_category($category, $parent = null) {
  439. global $DB;
  440. // Process the current category.
  441. $record = (object) $category;
  442.  
  443. if (!empty($parent)) {
  444. $record->parent = $parent->id;
  445. }
  446.  
  447. if (!empty($this->categories[$record->idnumber])) {
  448. $thiscategory = $this->categories[$record->idnumber];
  449. error_log("==> Found existing category");
  450. $changed = false;
  451. foreach ((array) $record as $key => $value) {
  452. if (isset($thiscategory->$key) && $thiscategory->$key != $value) {
  453. $thiscategory->$key = $value;
  454. $changed = true;
  455. }
  456. }
  457. if ($changed) {
  458. $DB->update_record('course_categories', $thiscategory);
  459. }
  460.  
  461. // TODO Update the parentage.
  462. } else {
  463. $generator = new testing_data_generator();
  464. $thiscategory = $generator->create_category($record);
  465. if ($parent) {
  466. error_log("==> Created category '{$thiscategory->name}' in '{$parent->name}'");
  467. } else {
  468. error_log("==> Created category '{$thiscategory->name}' in root");
  469. }
  470. }
  471.  
  472. $this->categories[$thiscategory->idnumber] = $thiscategory;
  473.  
  474. // Now add any child categories.
  475. foreach ($category['children'] as $child) {
  476. $this->create_category($child, $thiscategory);
  477. }
  478.  
  479. // Now add any courses directly in this category.
  480. if (isset($category['courses'])) {
  481. foreach ($category['courses'] as $course) {
  482. $this->create_course($course, $thiscategory);
  483. }
  484. }
  485.  
  486. // Now add any events directly in this category.
  487. if (isset($category['events'])) {
  488. foreach ($category['events'] as $event) {
  489. $event['category'] = $thiscategory;
  490. $this->create_event($event);
  491. }
  492. }
  493.  
  494. // Enrol any users who should be there.
  495. if (isset($category['enrolments'])) {
  496. foreach ($category['enrolments'] as $rolename => $users) {
  497. foreach ($users as $username) {
  498. $this->assign_category_role($thiscategory, $username, $rolename);
  499. }
  500. }
  501. }
  502.  
  503. return $thiscategory;
  504. }
  505.  
  506. protected function create_course($course, $category) {
  507. global $DB;
  508. $record = (object) $course;
  509.  
  510. $record->category = $category->id;
  511.  
  512. if (!empty($record->startdate)) {
  513. $value = DateTime::createFromFormat('d/m/Y', $record->startdate);
  514. $record->startdate = $value->format('U');
  515.  
  516. if (!empty($record->enddate)) {
  517. $value = DateTime::createFromFormat('d/m/Y', $record->enddate);
  518. $record->enddate = $value->format('U');
  519. }
  520. }
  521.  
  522. if (empty($record->startdate)) {
  523. unset($record->enddate);
  524. }
  525.  
  526. if (empty($record->description)) {
  527. $exp = explode(":", $record->fullname, 2);
  528. $record->description = "<p>" . trim($exp[1]) . "</p>";
  529. }
  530.  
  531. if (empty($record->shortname)) {
  532. $name = explode(":", $record->fullname, 2);
  533. $record->shortname = trim($name[0]);
  534. }
  535.  
  536. $year = explode('-', $record->idnumber);
  537. $record->shortname = "{$year[0]}-{$record->shortname}";
  538.  
  539. if (!empty($this->courses[$record->idnumber])) {
  540. $thiscourse = $this->courses[$record->idnumber];
  541. error_log("==> Found existing course {$record->shortname}");
  542. $changed = false;
  543. foreach ((array) $record as $key => $value) {
  544. if (isset($thiscourse->$key) && $thiscourse->$key != $value) {
  545. $thiscourse->$key = $value;
  546. $changed = true;
  547. error_log("{$key} > {$thiscourse->$key} => {$value}");
  548. }
  549. }
  550. if ($changed) {
  551. $DB->update_record('course', $thiscourse);
  552. }
  553.  
  554. // TODO Update the parentage.
  555. } else {
  556. error_log("==> Creating course '{$record->shortname}' in '{$category->name}'");
  557. $generator = new testing_data_generator();
  558. $thiscourse = $generator->create_course($record);
  559. $this->courses[$thiscourse->idnumber] = $thiscourse;
  560. error_log("==> Created course '{$thiscourse->shortname}' in '{$category->name}'");
  561. }
  562.  
  563. // Finally enrol any users who should be there.
  564. if (isset($course['enrolments'])) {
  565. foreach ($course['enrolments'] as $rolename => $users) {
  566. foreach ($users as $username) {
  567. $this->assign_course_role($thiscourse, $username, $rolename);
  568. }
  569. }
  570. }
  571.  
  572. // Now add any events directly in this category.
  573. if (isset($course['events'])) {
  574. foreach ($course['events'] as $event) {
  575. $event['course'] = $thiscourse;
  576. if (!empty($record->startdate) && empty($event['timestart']) && !empty($event['timestartmodifier'])) {
  577. $event['timestart'] = $record->startdate;
  578. }
  579. $this->create_event($event);
  580. }
  581. }
  582.  
  583. // Activity creation.
  584. if (isset($course['activities'])) {
  585. foreach ($course['activities'] as $type => $instances) {
  586. $fn = "create_activity_{$type}";
  587. if (method_exists($this, $fn)) {
  588. foreach ($instances as $instance) {
  589. $this->$fn($thiscourse, $instance);
  590. }
  591. }
  592. }
  593. }
  594.  
  595. return $thiscourse;
  596. }
  597.  
  598. protected function create_user($user) {
  599. global $DOMAIN, $DB;
  600.  
  601. $record = (object) $user;
  602. $username = strtolower($record->firstname);
  603. $record->username = $username;
  604. $record->idnumber = $record->username;
  605. $record->email = "{$username}@{$DOMAIN}";;
  606. $record->password = 'x';
  607.  
  608. if (isset($this->users[$record->username])) {
  609. $thisuser = $this->users[$record->idnumber];
  610. error_log("==> Found existing user {$record->username}");
  611. $changed = false;
  612. foreach ((array) $record as $key => $value) {
  613. if ($key === 'password') {
  614. if (validate_internal_user_password($thisuser, $value)) {
  615. continue;
  616. }
  617. $value = hash_internal_user_password($value);
  618. }
  619.  
  620. if (isset($thisuser->$key) && $thisuser->$key != $value) {
  621. error_log("{$key} > {$thisuser->$key} => {$value}");
  622. $thisuser->$key = $value;
  623. $changed = true;
  624. }
  625. }
  626. if ($changed) {
  627. error_log("Updating user {$thisuser->username}");
  628. $DB->update_record('user', $thisuser);
  629. }
  630. } else {
  631. $generator = new testing_data_generator();
  632.  
  633. $thisuser = $generator->create_user($record);
  634. $this->users[$username] = $thisuser;
  635.  
  636. $thisuser = $this->users[$username];
  637. }
  638.  
  639. // Now add any events directly in this category.
  640. if (isset($user['events'])) {
  641. foreach ($user['events'] as $event) {
  642. $event['user'] = $thisuser;
  643. $this->create_event($event);
  644. }
  645. }
  646. }
  647.  
  648. protected function assign_category_role($category, string $username, string $rolename) {
  649. $generator = new testing_data_generator();
  650.  
  651. $roleid = $this->roles[$rolename]->id;
  652. $user = $this->users[$username];
  653. $userid = $user->id;
  654. $context = \context_coursecat::instance($category->id);
  655. $contextid = $context->id;
  656.  
  657. $generator->role_assign($roleid, $userid, $contextid);
  658. error_log("==> Assigned role '{$rolename}' ({$roleid}) to '{$user->username}' in '{$category->name}'");
  659. }
  660.  
  661. protected function assign_course_role($course, string $username, string $rolename) {
  662. $generator = new testing_data_generator();
  663.  
  664. $roleid = $this->roles[$rolename]->id;
  665. $user = $this->users[$username];
  666. $userid = $user->id;
  667.  
  668. $generator->enrol_user($userid, $course->id, $roleid);
  669. error_log("==> Enrolled user '{$user->username}' as a '{$rolename}' ({$roleid}) in '{$course->shortname}'");
  670.  
  671. }
  672.  
  673. protected function create_event($event) {
  674. global $DB;
  675.  
  676. $properties = [
  677. 'name' => 'Event',
  678. 'description' => '',
  679. 'descriptionformat' => FORMAT_HTML,
  680. 'eventtype' => 'site',
  681. 'repeat' => 0,
  682. 'repeats' => 0,
  683. 'timestart' => null,
  684. 'timeduration' => 0,
  685. 'timesort' => null,
  686. 'type' => CALENDAR_EVENT_TYPE_STANDARD,
  687. 'uuid' => null,
  688. ];
  689.  
  690. $event = (object) $event;
  691.  
  692. $record = (object) [];
  693. foreach ($properties as $property => $default) {
  694. if (isset($event->$property)) {
  695. $record->$property = $event->$property;
  696. } else {
  697. $record->$property = $default;
  698. }
  699. }
  700. $params = [];
  701.  
  702. if (!empty($record->timestart)) {
  703. $time = \DateTime::createFromFormat('U', $record->timestart);
  704. } else {
  705. $time = new \DateTime('Sunday');
  706. $time->sub(new \DateInterval('P3W'));
  707. }
  708.  
  709. if (isset($event->timestartmodifier)) {
  710. $time->add(new \DateInterval($event->timestartmodifier));
  711. }
  712. $record->timestart = $time->format('U');
  713.  
  714. if (isset($event->category)) {
  715. $record->eventtype = 'category';
  716. $params['categoryid'] = $record->categoryid = $event->category->id;
  717. }
  718.  
  719. if (isset($event->course)) {
  720. $record->eventtype = 'course';
  721. $params['courseid'] = $record->courseid = $event->course->id;
  722. }
  723.  
  724. if (isset($event->username)) {
  725. $record->eventtype = 'user';
  726. $user = $this->users[$username];
  727. $params['userid'] = $record->userid = $user->id;
  728. }
  729.  
  730. if (empty($record->userid)) {
  731. $record->userid = $this->adminuser->id;;
  732. }
  733.  
  734. if (!empty($record->repeats)) {
  735. $record->repeat = 1;
  736. }
  737.  
  738. if (empty($record->uuid)) {
  739. $record->uuid = sha1($record->name);
  740. }
  741.  
  742. $params['eventtype'] = $record->eventtype;
  743. $params['uuid'] = $record->uuid;
  744.  
  745. $oldevents = $DB->get_records('event', $params);
  746. $oldevent = null;
  747. foreach ($oldevents as $e) {
  748. $oldevent = $e;
  749. if (!empty($e->repeatid) && $e->repeatid = $e->id) {
  750. break;
  751. }
  752. }
  753.  
  754.  
  755. if ($oldevent) {
  756. $e = new \calendar_event($oldevent);
  757. $e->update($record, false);
  758. error_log("Event: {$record->name} updated");
  759. } else {
  760. \calendar_event::create($record, false);
  761. error_log("Event: {$record->name} created");
  762. }
  763. }
  764.  
  765. protected function create_activity_forum($course, $data) {
  766. global $DB;
  767.  
  768. $generator = new testing_data_generator();
  769. $discussions = [];
  770. if (isset($data['discussions'])) {
  771. $discussions = $data['discussions'];
  772. unset($data['discussions']);
  773. }
  774. $forum = $generator->create_module('forum', array_merge($data, [
  775. 'course' => $course->id,
  776. ]));
  777. $forumgenerator = $generator->get_plugin_generator('mod_forum');
  778. error_log("Created forum in {$course->shortname}:\t{$forum->id}\n");
  779. error_log(" Creating discussions:");
  780. foreach ($discussions as $discussiondata) {
  781. $discussiondata = (object) $discussiondata;
  782. error_log(" Creating discussion");
  783. $postdata = isset($discussiondata->post) ? $discussiondata->post : [];
  784. unset($discussiondata->post);
  785. $discussiondata->course = $course->id;
  786. $discussiondata->forum = $forum->id;
  787. $discussiondata = $this->get_modified_course_time($course, $discussiondata, 'timemodified');
  788. $discussiondata = $this->get_modified_course_time($course, $discussiondata, 'timestart');
  789. $discussiondata = $this->get_modified_course_time($course, $discussiondata, 'timeend');
  790. $discussiondata = $this->fill_userid_field($discussiondata, 'userid');
  791.  
  792. $discussion = $forumgenerator->create_discussion($discussiondata);
  793. $firstpost = $DB->get_record('forum_posts', ['discussion' => $discussion->id]);
  794.  
  795. $replies = isset($discussiondata->replies) ? $discussiondata->replies : [];
  796. foreach ($replies as $replydata) {
  797. error_log(" Creating reply");
  798. $this->create_activity_forum_discussion_replies($forumgenerator, $course, $forum, $discussion, $firstpost, $replydata);
  799. }
  800. }
  801. }
  802.  
  803. protected function create_activity_forum_discussion_replies($generator, $course, $forum, $discussion, $parent, $postdata) {
  804. $postdata = (object) $postdata;
  805.  
  806. $replies = isset($postdata->replies) ? $postdata->replies : [];
  807. unset($postdata->replies);
  808.  
  809. $postdata = $this->get_modified_course_time($course, $postdata, 'created');
  810. $postdata = $this->get_modified_course_time($course, $postdata, 'modified');
  811. $postdata = $this->fill_userid_field($postdata, 'userid');
  812. $postdata->discussion = $discussion->id;
  813. $postdata->parent = $parent->id;
  814.  
  815. $post = $generator->create_post($postdata);
  816. error_log("Created post in {$forum->id}:\t{$forum->id}\n");
  817.  
  818. foreach ($replies as $replydata) {
  819. $this->create_activity_forum_discussion_replies($generator, $course, $forum, $discussion, $post, $replydata);
  820. }
  821. }
  822.  
  823. protected function get_modified_course_time($course, $record, $datefield, $addifabsent = true) {
  824. $found = false;
  825. if (isset($record->$datefield)) {
  826. $basedate = $record->$datefield;
  827. $found = true;
  828. } else if (!empty($course->startdate)) {
  829. $basedate = $course->startdate;
  830. } else {
  831. $basedate = time();
  832. }
  833. $time = \DateTime::createFromFormat('U', $basedate);
  834.  
  835. $modifierfield = "{$datefield}modifier";
  836. if (isset($record->$modifierfield)) {
  837. $found = true;
  838. $modifier = $record->$modifierfield;
  839. if (substr($modifier, 0, 1) === '-') {
  840. $time->sub(new \DateInterval(substr($modifier, 1)));
  841. } else {
  842. $time->add(new \DateInterval($modifier));
  843. }
  844. }
  845.  
  846. if ($addifabsent || $found) {
  847. $record->$datefield = $time->format('U');
  848. }
  849.  
  850. return $record;
  851. }
  852.  
  853. protected function fill_userid_field($record, $field) {
  854. if (isset($record->$field)) {
  855. if ($user = $this->users[$record->$field]) {
  856. $record->$field = $user->id;
  857. } else {
  858. throw new \moodle_exception("User '{$record->$field}' not found");
  859. }
  860. } else {
  861. throw new \moodle_exception("No field found in {$field}");
  862. }
  863. return $record;
  864. }
  865. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement