From 334bbf5d1532f5d7142e5491e815d7bb17dfcf12 Mon Sep 17 00:00:00 2001 From: Alan Carter Date: Mon, 28 Apr 2014 10:53:33 +0100 Subject: [PATCH] OUWiki: Copy pages - support copy across courses #9247 --- entirewiki.php | 2 +- history.php | 9 +- import.php | 241 ++++++++++-------- internaldoc/testcase.importbetweencourses.txt | 109 ++++++++ lang/en/ouwiki.php | 1 + lib.php | 2 +- locallib.php | 7 +- renderer.php | 15 +- version.php | 2 +- wikihistory.php | 8 +- 10 files changed, 284 insertions(+), 112 deletions(-) create mode 100644 internaldoc/testcase.importbetweencourses.txt diff --git a/entirewiki.php b/entirewiki.php index 85bbe13..3dc63f9 100644 --- a/entirewiki.php +++ b/entirewiki.php @@ -1,4 +1,4 @@ -$wordcountchanges"; } + if ($overwritten) { if (!empty($change->importversionid)) { $selectedouwiki = ouwiki_get_wiki_details($change->importversionid); - print ''.$selectedouwiki->name; + print ''; + if ($selectedouwiki->courseshortname) { + print $selectedouwiki->courseshortname. '
'; + } + print $selectedouwiki->name; if ($selectedouwiki->group) { + print '
'; print '[[' .$selectedouwiki->group. ']]'; } else if ($selectedouwiki->user) { + print '
'; print '[[' .$selectedouwiki->user. ']]'; } print ''; diff --git a/import.php b/import.php index 116e6d1..4a8eb8c 100644 --- a/import.php +++ b/import.php @@ -57,126 +57,153 @@ print_error('You are not able to add content to this wiki.'); } +// Get course id of wiki that is being imported from. Only used in steps 2,3 and 4. +$importedfromcourse = $course; +$courseid = optional_param('courseid', 0, PARAM_INT); +if ($courseid) { + $importedfromcourse = get_course($courseid); +} + echo '
'; if ($curstep == 1) { - // Select wiki from course step, first get wikis. - $modinfo = get_fast_modinfo($course); - $allwikis = $modinfo->get_instances_of('ouwiki'); - unset($allwikis[$ouwiki->id]);// Don't include current activity. - $availablewikis = array(); - foreach ($allwikis as $wikiact) { - $wikicontext = context_module::instance($wikiact->id); - // Check wiki is available. - if (!$wikiact->uservisible || - !has_capability('mod/ouwiki:view', $wikicontext)) { - continue; - } - // Create object for this wiki that we will use if it is shown. - $wikiob = new stdClass(); - $wikiob->cm = $wikiact; - $wikiob->selector = array(); - $wikiob->selectordefault = 0; - $wikiob->nocontent = false; - - // For each wiki type do further access checks and get more info. - $wikiinst = $DB->get_record('ouwiki', array('id' => $wikiact->instance)); - if (!$wikiinst) { - continue; - } - if ($wikiinst->subwikis == OUWIKI_SUBWIKIS_SINGLE) { - // Course wiki, check subwiki and start page exists. - if (!$wikisubwiki = $DB->get_record_select('ouwiki_subwikis', 'wikiid = ? AND - groupid IS NULL AND userid IS NULL', array($wikiinst->id), 'id')) { - $wikiob->nocontent = true; - } else if (!ouwiki_subwiki_content_exists($wikisubwiki->id)) { - $wikiob->nocontent = true; - } else { - $wikiob->selectordefault = $wikisubwiki->id; + $courses = enrol_get_users_courses($USER->id, true); + $pageparams['step']++; + $wikisfound = false; + foreach ($courses as $listcourse) { + // Select wiki from course step, first get wikis. + $modinfo = get_fast_modinfo($listcourse); + $allwikis = $modinfo->get_instances_of('ouwiki'); + unset($allwikis[$ouwiki->id]);// Don't include current activity. + $availablewikis = array(); + foreach ($allwikis as $wikiact) { + $wikicontext = context_module::instance($wikiact->id); + // Check wiki is available. + if (!$wikiact->uservisible || + !has_capability('mod/ouwiki:view', $wikicontext)) { + continue; } - } else if ($wikiinst->subwikis == OUWIKI_SUBWIKIS_GROUPS) { - // Group wiki. Get all groups user can see (checking they have content to import). - if (!$groups = groups_get_activity_allowed_groups($wikiact)) { + // Create object for this wiki that we will use if it is shown. + $wikiob = new stdClass(); + $wikiob->cm = $wikiact; + $wikiob->selector = array(); + $wikiob->selectordefault = 0; + $wikiob->nocontent = false; + + // For each wiki type do further access checks and get more info. + $wikiinst = $DB->get_record('ouwiki', array('id' => $wikiact->instance)); + if (!$wikiinst) { continue; } - $default = groups_get_activity_group($wikiact); - foreach ($groups as $group) { - // Check group subwiki has content before adding it. - if ($wikisubwiki = $DB->get_record_select('ouwiki_subwikis', 'wikiid = ? - AND groupid = ? AND userid IS NULL', array($wikiinst->id, $group->id), 'id')) { - if (ouwiki_subwiki_content_exists($wikisubwiki->id)) { - $wikiob->selector[$wikisubwiki->id] = format_string($group->name); - if ($group->id == $default) { - $wikiob->selectordefault = $wikisubwiki->id; + if ($wikiinst->subwikis == OUWIKI_SUBWIKIS_SINGLE) { + // Course wiki, check subwiki and start page exists. + if (!$wikisubwiki = $DB->get_record_select('ouwiki_subwikis', 'wikiid = ? AND + groupid IS NULL AND userid IS NULL', array($wikiinst->id), 'id')) { + $wikiob->nocontent = true; + } else if (!ouwiki_subwiki_content_exists($wikisubwiki->id)) { + $wikiob->nocontent = true; + } else { + $wikiob->selectordefault = $wikisubwiki->id; + } + } else if ($wikiinst->subwikis == OUWIKI_SUBWIKIS_GROUPS) { + // Group wiki. Get all groups user can see (checking they have content to import). + if (!$groups = groups_get_activity_allowed_groups($wikiact)) { + continue; + } + $default = groups_get_activity_group($wikiact); + foreach ($groups as $group) { + // Check group subwiki has content before adding it. + if ($wikisubwiki = $DB->get_record_select('ouwiki_subwikis', 'wikiid = ? + AND groupid = ? AND userid IS NULL', array($wikiinst->id, $group->id), 'id')) { + if (ouwiki_subwiki_content_exists($wikisubwiki->id)) { + $wikiob->selector[$wikisubwiki->id] = format_string($group->name); + if ($group->id == $default) { + $wikiob->selectordefault = $wikisubwiki->id; + } } } } - } - // If no groups have content disable wiki selector. - if (empty($wikiob->selector)) { - $wikiob->nocontent = true; - } - } else if ($wikiinst->subwikis == OUWIKI_SUBWIKIS_INDIVIDUAL) { - // Individual wiki. Get all users user can view (checking subwiki for content). - $userfields = user_picture::fields('u', null, 'uid'); - $sql = "SELECT sw.id, $userfields - FROM {ouwiki_subwikis} sw - INNER JOIN {user} u ON sw.userid = u.id - INNER JOIN (SELECT subwikiid - FROM {ouwiki_pages} - WHERE currentversionid IS NOT NULL - GROUP BY subwikiid) as wp on wp.subwikiid = sw.id - WHERE sw.wikiid = ?"; - $params = array($wikiinst->id); - if (!has_capability('mod/ouwiki:viewallindividuals', $wikicontext)) { - if (!has_capability('mod/ouwiki:viewgroupindividuals', $wikicontext)) { - // Can only see own wiki (if exists). - $sql .= ' AND sw.userid = ?'; - $params[] = $USER->id; - } else { - // Can see any users that are in the same group(s). - if ($theirgroups = groups_get_all_groups($wikiact->course, $USER->id, - $wikiact->groupingid, 'g.id')) { - $groupmembers = array(); - foreach ($theirgroups as $group) { - if ($members = groups_get_members($group->id, 'u.id')) { - $groupmembers = array_merge($groupmembers, array_keys($members)); + // If no groups have content disable wiki selector. + if (empty($wikiob->selector)) { + $wikiob->nocontent = true; + } + } else if ($wikiinst->subwikis == OUWIKI_SUBWIKIS_INDIVIDUAL) { + // Individual wiki. Get all users user can view (checking subwiki for content). + $userfields = user_picture::fields('u', null, 'uid'); + $sql = "SELECT sw.id, $userfields + FROM {ouwiki_subwikis} sw + INNER JOIN {user} u ON sw.userid = u.id + INNER JOIN (SELECT subwikiid + FROM {ouwiki_pages} + WHERE currentversionid IS NOT NULL + GROUP BY subwikiid) as wp on wp.subwikiid = sw.id + WHERE sw.wikiid = ?"; + $params = array($wikiinst->id); + if (!has_capability('mod/ouwiki:viewallindividuals', $wikicontext)) { + if (!has_capability('mod/ouwiki:viewgroupindividuals', $wikicontext)) { + // Can only see own wiki (if exists). + $sql .= ' AND sw.userid = ?'; + $params[] = $USER->id; + } else { + // Can see any users that are in the same group(s). + if ($theirgroups = groups_get_all_groups($wikiact->course, $USER->id, + $wikiact->groupingid, 'g.id')) { + $groupmembers = array(); + foreach ($theirgroups as $group) { + if ($members = groups_get_members($group->id, 'u.id')) { + $groupmembers = array_merge($groupmembers, array_keys($members)); + } + } + if (!empty($groupmembers)) { + list($insql, $inparams) = $DB->get_in_or_equal($groupmembers); + $sql .= 'AND sw.userid ' . $insql; + $params = array_merge($params, $inparams); } - } - if (!empty($groupmembers)) { - list($insql, $inparams) = $DB->get_in_or_equal($groupmembers); - $sql .= 'AND sw.userid ' . $insql; - $params = array_merge($params, $inparams); } } } - } - $sql .= ' ORDER BY u.lastname, u.firstname'; + $sql .= ' ORDER BY u.lastname, u.firstname'; - if (!$choices = $DB->get_records_sql($sql, $params)) { - $wikiob->nocontent = true; - } + if (!$choices = $DB->get_records_sql($sql, $params)) { + $wikiob->nocontent = true; + } - foreach ($choices as $wikisubwiki) { - $wikiob->selector[$wikisubwiki->id] = fullname($wikisubwiki); - if ($wikisubwiki->uid == $USER->id) { - $wikiob->selectordefault = $wikisubwiki->id; + foreach ($choices as $wikisubwiki) { + $wikiob->selector[$wikisubwiki->id] = fullname($wikisubwiki); + if ($wikisubwiki->uid == $USER->id) { + $wikiob->selectordefault = $wikisubwiki->id; + } } } + // Add wiki info to list of available wiki activities. + $availablewikis[] = $wikiob; + } + $courserenderer = $PAGE->get_renderer('course'); + // Create selection forms for available wikis. + $pageparams['courseid'] = $listcourse->id; + $i = 0; + foreach ($availablewikis as $showwiki) { + if ($i == 0) { + $coursename = $listcourse->shortname . ' ' . $listcourse->fullname; + echo html_writer::div($coursename); + } + $i++; + + echo html_writer::start_div('ouwiki_import_act'); + $customdata = array('wikiinfo' => $showwiki, 'params' => $pageparams, + 'actlink' => $courserenderer->course_section_cm_name($showwiki->cm)); + $form = new mod_ouwiki_import_wikiselect_form(null, $customdata); + $form->display(); + echo html_writer::end_div(); + $wikisfound = true; } - // Add wiki info to list of available wiki activities. - $availablewikis[] = $wikiob; } - $courserenderer = $PAGE->get_renderer('course'); - // Create selection forms for available wikis. - $pageparams['step']++; - foreach ($availablewikis as $showwiki) { - echo html_writer::start_div('ouwiki_import_act'); - $customdata = array('wikiinfo' => $showwiki, 'params' => $pageparams, - 'actlink' => $courserenderer->course_section_cm_name($showwiki->cm)); - $form = new mod_ouwiki_import_wikiselect_form(null, $customdata); - $form->display(); - echo html_writer::end_div(); + + if (!$wikisfound) { + // If courses are empty print a warning message. + echo $OUTPUT->notification(get_string('unabletoimport', 'ouwiki')); + unset($pageparams['step']); + echo $OUTPUT->continue_button(new moodle_url('/mod/ouwiki/view.php', $pageparams)); } } else if ($curstep == 2) { // Select pages, first ensure step 1 data correct. @@ -185,10 +212,12 @@ // Full page list available e.g. from cancel. $pagelist = explode(',', $pagelist); } + $selectedact = required_param('importid', PARAM_INT); $selectedsubwiki = required_param('subwikiid' . $selectedact, PARAM_INT); $selectedouwiki = ''; - ouwiki_get_wikiinfo($selectedact, $selectedsubwiki, $selectedouwiki, $course); + + ouwiki_get_wikiinfo($selectedact, $selectedsubwiki, $selectedouwiki, $importedfromcourse); echo html_writer::tag('p', get_string('import_selectwiki', 'ouwiki', $selectedact->get_formatted_name())); @@ -220,6 +249,7 @@ // Prepare form parameters. $wikiinfo = array('importid' => $selectedact->id , 'subwikiid' => $selectedsubwiki->id); $pageparams['step']++; + $pageparams['courseid'] = $importedfromcourse->id; $form = new mod_ouwiki_import_pageselect_form(null, array('params' => array_merge($pageparams, $wikiinfo), 'pages' => $pages)); $form->display(); @@ -229,7 +259,8 @@ $selectedact = required_param('importid', PARAM_INT); $selectedsubwiki = required_param('subwikiid', PARAM_INT); $selectedouwiki = ''; - ouwiki_get_wikiinfo($selectedact, $selectedsubwiki, $selectedouwiki, $course); + + ouwiki_get_wikiinfo($selectedact, $selectedsubwiki, $selectedouwiki, $importedfromcourse); // Build up index, get selected pages - making sure sub pages are included. $index = ouwiki_get_subwiki_index($selectedsubwiki->id); @@ -308,6 +339,7 @@ $wikiinfo = array('importid' => $selectedact->id , 'subwikiid' => $selectedsubwiki->id, 'subwikiid' . $selectedact->id => $selectedsubwiki->id, 'pages' => implode(',', $pagelist)); $pageparams['step']++; + $pageparams['courseid'] = $importedfromcourse->id; $form = new mod_ouwiki_import_confirm_form(null, array('params' => array_merge($pageparams, $wikiinfo), 'confirmdata' => $confirmdata)); $form->display(); @@ -317,7 +349,8 @@ $selectedact = required_param('importid', PARAM_INT); $selectedsubwiki = required_param('subwikiid', PARAM_INT); $selectedouwiki = ''; - ouwiki_get_wikiinfo($selectedact, $selectedsubwiki, $selectedouwiki, $course); + + ouwiki_get_wikiinfo($selectedact, $selectedsubwiki, $selectedouwiki, $importedfromcourse); $pagelist = explode(',', required_param('pages', PARAM_SEQUENCE));// Page ids to import. $conflictmerge = optional_param('conflictmerge', 0, PARAM_INT);// Page conflict setting. diff --git a/internaldoc/testcase.importbetweencourses.txt b/internaldoc/testcase.importbetweencourses.txt new file mode 100644 index 0000000..4d486a6 --- /dev/null +++ b/internaldoc/testcase.importbetweencourses.txt @@ -0,0 +1,109 @@ +This script describes steps to test the use of the import pages facility to add pages from one wiki to another across courses. + +NOTE: In this test case, the word 'wiki' always refers to the OU wiki. + +The test steps in this script follow on from each other and aren't independent, except as noted. + +Test requirements +================= + +Two Test courses – referred to as WIP1 and WIP2 in this test case +At least two test groups setup in courses WIP1 and WIP2 +User with permission to add and edit activities and with access all groups – Admin +Test user with student permissions – S1. S1 must be enrolled on both courses and be a member of at least one group in WIP1 (TG) and WIP2 (TG2) + + +WIPCW Creating wikis and data +============================= + +Create a test course – WIP1 (Wiki Import Pages Test), enrol user S1 as student and create at least 1 group (TG) with user S1 as member. +Create a test course – WIP2 (Wiki Import Pages Test), enrol user S1 as student and create at least 1 group (TG2) with user S1 as member. + +WIPCW01 / Admin + Add a new wiki activity to any section of course WIP1, setting name to 'WIP.coursewiki' and Annotation system to 'Yes' + Select 'Save and return to website' + Enter WIP.coursewiki + Select 'Create page' when prompted to create the wiki start page + Enter text 'WIP.coursewiki start page' new paragraph'[[WIPcoursewiki1]]' into content field + Select 'Save changes' + Select link 'WIPcoursewiki1' + Select 'Create page' when prompted to create the new page + Enter text 'WIPcoursewiki1 page' new paragraph'[[WIPcoursewiki2]]' into content field. Add a file into the attachments area + Select Annotate tab, select annotate marker after 'page' and enter 'Annotation' into the text area, then select 'Add'. Select 'Save changes' + Select link 'WIPcoursewiki2' + Select 'Create page' when prompted to create the new page + Enter text 'WIPcoursewiki2 page' new paragraph and add an image into content field. + +WIPCW02 / Admin + Add a new wiki activity to any section of course WIP2, setting name to 'WIP2.coursewiki' and Annotation system to 'Yes' and tick 'link to import pages' + Select 'Save and return to website' + Enter WIP2.coursewiki + Select 'Create page' when prompted to create the wiki start page + Enter text 'WIP2.coursewiki start page' new paragraph'[[WIP2coursewiki1]]' into content field + Select 'Save changes' + Select link 'WIP2coursewiki1' + Select 'Create page' when prompted to create the new page + Enter text 'WIP2coursewiki1 page' new paragraph'[[WIP2coursewiki2]]' into content field. Add a file into the attachments area + Select Annotate tab, select annotate marker after 'page' and enter 'Annotation' into the text area, then select 'Add'. Select 'Save changes' + Select link 'WIP2coursewiki2' + Select 'Create page' when prompted to create the new page + Enter text 'WIP2coursewiki2 page' new paragraph and add an image into content field. + +WINP Import new pages +===================== + +WINP01 / Admin + + Select course WIP2 + Enter WIP2.coursewiki + Select 'Import pages' link (beside Wiki changes link) +- Verify that you can not import pages. + 'No wiki's available to import from.' is displayed (Note: this may not be the case if user has access to other course wikis) + Select 'Continue' +- Verify that this takes you back to the wiki start page + +NOTE : Import can only be tested as S1 + +WIN02 / S1 (change) + + Select course WIP2 + Enter WIP2.coursewiki + Select 'Import pages' link (beside Wiki changes link). + The wikis should be shown under each course WIP1 and WIP2 + Under course WIP1 +- Verify WIP.coursewiki is listed and has import buttons shown + Under course WIP2 +- Verify WIP2.coursewiki is listed and has import buttons shown + +WIMP Import existing pages +========================== + +WIMP01 / S1 (change) + + Select course WIP2 + Enter WIP2.coursewiki + Select 'Import pages' link + Select 'Import from WIP.coursewiki' button + Select checkbox against WIPcoursewiki2 page, select 'Import pages' button + Select 'New page' in 'Add links to new pages to' drop-down + Select 'Import pages' +- Verify 'Pages imported' is 'Imported pages' and 'WIPcoursewiki2' and 'Pages updated' list is 'Start page' + Select 'Continue' button +- Verify 'Imported pages' page shown with content 'WIPcoursewiki2' (page link) + +WIPHIS Import history recorded +============================== + +WIPHIS01 / Admin (change) + + Enter course WIP2 + Enter WIP2.coursewiki + Select 'Imported pages' link, + Select 'WIPcoursewiki2' link, select 'History' tab on the 'WIPcoursewiki2' +- Verify 'Imported from' column shows 'WIP1 WIP.coursewiki' against initial version + Select 'Wiki changes' link +- Verify 'Imported from' column shows 'WIP1 WIP.coursewiki' against page versions for 'Imported start page', 'WIPcoursewiki1' and 'WIPcoursewiki2' pages + Select 'Participation by user' link +- Verify user S1 has 'Pages imported' value of 1 + Select 'Detail' link against user S1 +- Verify 'Imported from' column shows 'WIP1 WIP.coursewiki' against page versions for 'WIPcoursewiki2'. diff --git a/lang/en/ouwiki.php b/lang/en/ouwiki.php index 110c5ad..5ca946e 100644 --- a/lang/en/ouwiki.php +++ b/lang/en/ouwiki.php @@ -574,3 +574,4 @@ $string['importedpages'] = 'Imported pages'; $string['importedfrom'] = 'Imported from:'; $string['pagesimported'] = 'Pages imported'; +$string['unabletoimport'] = 'No wiki\'s available to import from.'; diff --git a/lib.php b/lib.php index 86e0278..878f156 100644 --- a/lib.php +++ b/lib.php @@ -716,7 +716,7 @@ function ouwiki_grade_item_delete($ouwiki) { function ouwiki_cm_info_dynamic(cm_info $cm) { if (!has_capability('mod/ouwiki:view', context_module::instance($cm->id))) { - $cm->uservisible = false; + $cm->set_user_visible(false); $cm->set_available(false); } } diff --git a/locallib.php b/locallib.php index 4eb03b1..11d8264 100644 --- a/locallib.php +++ b/locallib.php @@ -3433,7 +3433,7 @@ function ouwiki_subwiki_content_exists($subwikiid) { } function ouwiki_get_wiki_details($version) { - global $DB; + global $DB, $COURSE; $sql = 'SELECT * from {ouwiki} w, {ouwiki_subwikis} s, {ouwiki_pages} p, {ouwiki_versions} v WHERE @@ -3445,13 +3445,16 @@ function ouwiki_get_wiki_details($version) { $selectedouwiki = $DB->get_record_sql($sql, array($version), MUST_EXIST); $selectedouwiki->group = null; $selectedouwiki->user = null; - + $selectedouwiki->courseshortname = null; if ($selectedouwiki->groupid) { $selectedouwiki->group = groups_get_group_name($selectedouwiki->groupid); } else if ($selectedouwiki->subwikis == OUWIKI_SUBWIKIS_INDIVIDUAL && $selectedouwiki->userid) { $user = $DB->get_record('user', array('id' => $selectedouwiki->userid)); $selectedouwiki->user = fullname($user); } + if ($COURSE->id != $selectedouwiki->course) { + $selectedouwiki->courseshortname = $DB->get_field('course', 'shortname', array('id' => $selectedouwiki->course)); + } return $selectedouwiki; } diff --git a/renderer.php b/renderer.php index a167cfe..60ba459 100644 --- a/renderer.php +++ b/renderer.php @@ -983,7 +983,20 @@ public function ouwiki_render_user_participation($user, $changes, $cm, $course, $imported = ''; if ($change->importversionid) { $wikidetails = ouwiki_get_wiki_details($change->importversionid); - $imported = $wikidetails->name; + $wikiname = $wikidetails->name; + if ($wikidetails->courseshortname) { + $coursename = $wikidetails->courseshortname. '
'; + $imported = $coursename . $wikiname; + } else { + $imported = $wikiname; + } + if ($wikidetails->group) { + $users = '
[[' .$wikidetails->group. ']]'; + $imported = $imported . $users; + } else if ($wikidetails->user) { + $users = '
[[' .$wikidetails->user. ']]'; + $imported = $imported . $users; + } } $row[] = $imported; } diff --git a/version.php b/version.php index 9c891a0..775a655 100644 --- a/version.php +++ b/version.php @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -$module->version = 2014031100; +$module->version = 2014042800; $module->requires = 2013040500; $module->cron = 60*60*24; // Once per day. diff --git a/wikihistory.php b/wikihistory.php index 7096108..6b3f19b 100644 --- a/wikihistory.php +++ b/wikihistory.php @@ -219,10 +219,16 @@ if ($overwritten) { if (!empty($change->importversionid)) { $selectedouwiki = ouwiki_get_wiki_details($change->importversionid); - print ''.$selectedouwiki->name; + print ''; + if ($selectedouwiki->courseshortname) { + print $selectedouwiki->courseshortname. '
'; + } + print $selectedouwiki->name; if ($selectedouwiki->group) { + print '
'; print '[[' .$selectedouwiki->group. ']]'; } else if ($selectedouwiki->user) { + print '
'; print '[[' .$selectedouwiki->user. ']]'; } print '';