MDL-28705 enrol_imsenterprise Refining provided patch
authorDavid Monllao <davidm@moodle.com>
Wed, 22 Aug 2012 09:40:31 +0000 (17:40 +0800)
committerDavid Monllao <davidm@moodle.com>
Thu, 15 Nov 2012 01:50:00 +0000 (09:50 +0800)
enrol/imsenterprise/lang/en/enrol_imsenterprise.php
enrol/imsenterprise/lib.php
enrol/imsenterprise/locallib.php
enrol/imsenterprise/settings.php

index 8b91682..511ac82 100644 (file)
@@ -42,9 +42,8 @@ Users are searched for first by their "idnumber", and second by their Moodle use
 $string['cronfrequency'] = 'Frequency of processing';
 $string['deleteusers'] = 'Delete user accounts when specified in IMS data';
 $string['deleteusers_desc'] = 'If enabled, IMS Enterprise enrolment data can specify the deletion of user accounts (if the "recstatus" flag is set to 3, which represents deletion of an account). As is standard in Moodle, the user record isn\'t actually deleted from Moodle\'s database, but a flag is set to mark the account as deleted.';
-$string['pluginname_desc'] = 'This method will repeatedly check for and process a specially-formatted text file in the location that you specify.  The file must follow the IMS Enterprise specifications containing person, group, and membership XML elements.';
 $string['doitnow'] = 'perform an IMS Enterprise import right now';
-$string['pluginname'] = 'IMS Enterprise file';
+$string['emptyattribute'] = 'Leave it empty';
 $string['filelockedmail'] = 'The text file you are using for IMS-file-based enrolments ({$a}) can not be deleted by the cron process.  This usually means the permissions are wrong on it.  Please fix the permissions so that Moodle can delete the file, otherwise it might be processed repeatedly.';
 $string['filelockedmailsubject'] = 'Important error: Enrolment file';
 $string['fixcasepersonalnames'] = 'Change personal names to Title Case';
@@ -56,12 +55,20 @@ $string['mailadmins'] = 'Notify admin by email';
 $string['mailusers'] = 'Notify users by email';
 $string['messageprovider:imsenterprise_enrolment'] = 'IMS Enterprise enrolment messages';
 $string['miscsettings'] = 'Miscellaneous';
+$string['pluginname'] = 'IMS Enterprise file';
+$string['pluginname_desc'] = 'This method will repeatedly check for and process a specially-formatted text file in the location that you specify.  The file must follow the IMS Enterprise specifications containing person, group, and membership XML elements.';
 $string['processphoto'] = 'Add user photo data to profile';
 $string['processphotowarning'] = 'Warning: Image processing is likely to add a significant burden to the server. You are recommended not to activate this option if large numbers of students are expected to be processed.';
 $string['restricttarget'] = 'Only process data if the following target is specified';
 $string['restricttarget_desc'] = 'An IMS Enterprise data file could be intended for multiple "targets" - different LMSes, or different systems within a school/university. It\'s possible to specify in the Enterprise file that the data is intended for one or more named target systems, by naming them in <target> tags contained within the <properties> tag.
 
 In general you don\'t need to worry about this. Leave the setting blank and Moodle will always process the data file, no matter whether a target is specified or not. Otherwise, fill in the exact name that will be output inside the <target> tag.';
+$string['settingfullname'] = 'IMS description tag for the course full name';
+$string['settingfullnamedescription'] = 'The full name is a required course field so you have to define the selected description tag in your IMS Enterprise file';
+$string['settingshortname'] = 'IMS description tag for the course short name';
+$string['settingshortnamedescription'] = 'The short name is a required course field so you have to define the selected description tag in your IMS Enterprise file';
+$string['settingsummary'] = 'IMS description tag for the course summary';
+$string['settingsummarydescription'] = 'Is an optional field, select \'Leave it empty\' if you dont\'t want to specify a course summary';
 $string['sourcedidfallback'] = 'Use the &quot;sourcedid&quot; for a person\'s userid if the &quot;userid&quot; field is not found';
 $string['sourcedidfallback_desc'] = 'In IMS data, the <sourcedid> field represents the persistent ID code for a person as used in the source system. The <userid> field is a separate field which should contain the ID code used by the user when logging in. In many cases these two codes may be the same - but not always.
 
index eef9380..8cfa607 100644 (file)
@@ -97,7 +97,7 @@ function cron() {
 
         // Make sure we understand how to map the IMS-E roles to Moodle roles
         $this->load_role_mappings();
-        // Make sure we understand how to map the IMS-E course names to Moodle course names
+        // Make sure we understand how to map the IMS-E course names to Moodle course names.
         $this->load_course_mappings();
 
         $md5 = md5_file($filename); // NB We'll write this value back to the database at the end of the cron
@@ -319,10 +319,10 @@ function process_group_tag($tagcontents) {
     }
 
     if (preg_match('{<description>.*?<long>(.*?)</long>.*?</description>}is', $tagcontents, $matches)) {
-        $group->longname = trim($matches[1]);
+        $group->long = trim($matches[1]);
     }
     if (preg_match('{<description>.*?<short>(.*?)</short>.*?</description>}is', $tagcontents, $matches)) {
-        $group->shortname = trim($matches[1]);
+        $group->short = trim($matches[1]);
     }
     if (preg_match('{<description>.*?<full>(.*?)</full>.*?</description>}is', $tagcontents, $matches)) {
         $group->full = trim($matches[1]);
@@ -365,28 +365,36 @@ function process_group_tag($tagcontents) {
                 if (!$createnewcourses) {
                     $this->log_line("Course $coursecode not found in Moodle's course idnumbers.");
                 } else {
-                    // Set shortname to description or description to shortname if one is set but not the other.
-                    $nodescription = !isset($group->longname);
-                    $noshortname = !isset($group->shortname);
-                    if ( $nodescription && $noshortname) {
-                        // If neither short nor long description are set let if fail
-                        $this->log_line("Neither long nor short name are set for $coursecode");
-                    } else if ($nodescription) {
-                        // If short and ID exist, then give the long short's value, then give short the ID's value
-                        $group->longname = $group->shortname;
-                        $group->shortname = $coursecode;
-                    } else if ($noshortname) {
-                        // If long and ID exist, then map long to long, then give short the ID's value.
-                        $group->shortname = $coursecode;
-                    }
-                    $group->full = format_text($group->full, FORMAT_HTML);
 
                     // Create the (hidden) course(s) if not found
                     $courseconfig = get_config('moodlecourse'); // Load Moodle Course shell defaults
+
+                    // New course.
                     $course = new stdClass();
-                    foreach ($this->coursemappings as $coursename => $imsname) {
-                        $course->$coursename = $group->$imsname;
+                    foreach ($this->coursemappings as $courseattr => $imsname) {
+
+                        if ($imsname == 'ignore') {
+                            continue;
+                        }
+
+                        // Check if the IMS file contains the mapped tag, otherwise fallback on coursecode.
+                        if ($imsname == 'coursecode') {
+                            $course->{$courseattr} = $coursecode;
+                        } else if (!empty($group->{$imsname})) {
+                            $course->{$courseattr} = $group->{$imsname};
+                        } else {
+                            $this->log_line('No ' . $imsname . ' description tag found for ' . $coursecode . ' coursecode, using ' . $coursecode . ' instead');
+                            $course->{$courseattr} = $coursecode;
+                        }
+
+                        if ($courseattr == 'summary') {
+                            $format = FORMAT_HTML;
+                        } else {
+                            $format = FORMAT_PLAIN;
+                        }
+                        $course->{$courseattr} = format_text($course->$courseattr, $format);
                     }
+
                     $course->idnumber = $coursecode;
                     $course->format = $courseconfig->format;
                     $course->visible = $courseconfig->visible;
@@ -425,7 +433,6 @@ function process_group_tag($tagcontents) {
                     $course->startdate = time();
                     // Choose a sort order that puts us at the start of the list!
                     $course->sortorder = 0;
-
                     $courseid = $DB->insert_record('course', $course);
 
                     // Setup default enrolment plugins
@@ -795,18 +802,17 @@ function load_role_mappings() {
 
     /**
      * Load the name mappings (from the config), so we can easily refer to
-     * how an IMS-E course properties corresponds to a Moodle course properties 
+     * how an IMS-E course properties corresponds to a Moodle course properties
      */
     function load_course_mappings() {
         require_once('locallib.php');
 
-        $imsnames = new imsenterprise_names();
-        $coursenames = $imsnames->get_coursenames();
-        $imsnames = $imsnames->get_imsnames();
+        $imsnames = new imsenterprise_courses();
+        $courseattrs = $imsnames->get_courseattrs();
 
         $this->coursemappings = array();
-        foreach($coursenames as $coursename) {
-            $this->coursemappings[$coursename] = $this->get_config('imsrolemap' . $coursename);
+        foreach($courseattrs as $courseattr) {
+            $this->coursemappings[$courseattr] = $this->get_config('imscoursemap' . $courseattr);
         }
     }
 
index 8b21ec1..13c6114 100644 (file)
@@ -83,34 +83,62 @@ class imsenterprise_roles {
 
 }  // class
 
-class imsenterprise_names {
+
+/**
+ * Mapping between Moodle course attributes and IMS enterprise group description tags
+ *
+ * @package   enrol_imsenterprise
+ * @copyright 2011 Aaron C Spike
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class imsenterprise_courses {
+
     private $imsnames;
-    private $coursenames;
+    private $courseattrs;
 
+    /**
+     * Loads default
+     */
     function __construct() {
         $this->imsnames = array(
-        'long'=>'long', 
-        'short'=>'short', 
-        'full'=>'full', 
-        'coursecode'=>'coursecode',
-       );
-        $this->coursenames = array('fullname', 'shortname', 'summary');
+            'short' => 'short',
+            'long' => 'long',
+            'full' => 'full',
+            'coursecode' => 'coursecode');
+        $this->courseattrs = array('shortname', 'fullname', 'summary');
     }
 
-    function get_imsnames() {
-        return $this->imsnames;
+    /**
+     * Returns the assignable values for the course attribute
+     * @param string $courseattr The course attribute (shortname, fullname...)
+     * @return array Array of assignable values
+     */
+    function get_imsnames($courseattr) {
+\r
+        $values = $this->imsnames;\r
+        if ($courseattr == 'summary') {\r
+            $values = array_merge(array('ignore' => get_string('emptyattribute', 'enrol_imsenterprise')), $values);
+        }
+        return $values;
     }
 
-    function get_coursenames() {
-        return $this->coursenames;
+    /**
+     * courseattrs getter
+     * @return array
+     */
+    function get_courseattrs() {
+        return $this->courseattrs;
     }
 
     /**
-    * This function is only used when first setting up the plugin, to
-    * decide which name assignments to recommend by default.
-    */
-    function determine_default_namemapping($coursename) {
-        switch($coursename) {
+     * This function is only used when first setting up the plugin, to
+     * decide which name assignments to recommend by default.
+     *
+     * @param string $coursename
+     * @return string
+     */
+    function determine_default_coursemapping($courseattr) {
+        switch($courseattr) {
             case 'fullname':
                 $imsname = 'short';
                 break;
@@ -118,10 +146,10 @@ class imsenterprise_names {
                 $imsname = 'coursecode';
                 break;
             default:
-                return 'ignore'; // Zero for no match
+                $imsname = 'ignore';
         }
+
         return $imsname;
     }
 
-
 }  // class
index 4262b1a..b644f49 100644 (file)
@@ -75,14 +75,17 @@ if ($ADMIN->fulltree) {
     $settings->add(new admin_setting_configcheckbox('enrol_imsenterprise/createnewcategories', get_string('createnewcategories', 'enrol_imsenterprise'), get_string('createnewcategories_desc', 'enrol_imsenterprise'), 0));
 
     $settings->add(new admin_setting_configcheckbox('enrol_imsenterprise/imsunenrol', get_string('allowunenrol', 'enrol_imsenterprise'), get_string('allowunenrol_desc', 'enrol_imsenterprise'), 0));
-    
-    $settings->add(new admin_setting_heading('enrol_imsenterprise_coursesettings_names', get_string('names', 'enrol_imsenterprise'), get_string('imsnamesdescription', 'enrol_imsenterprise')));
 
     if (!during_initial_install()) {
-        $imsnames = new imsenterprise_names();
-        $assignablenames = array('ignore' => get_string('ignore', 'enrol_imsenterprise')) + $imsnames->get_imsnames();
-        foreach ($imsnames->get_coursenames() as $coursename) {
-            $settings->add(new admin_setting_configselect('enrol_imsenterprise/imsnamemap'.$coursename, get_string($coursename, 'enrol_imsenterprise'), '', (string)$imsnames->determine_default_namemapping($coursename), $assignablenames));
+        $imscourses = new imsenterprise_courses();
+        foreach ($imscourses->get_courseattrs() as $courseattr) {
+
+            // The assignable values of this course attribute
+            $assignablevalues = $imscourses->get_imsnames($courseattr);
+            $name = get_string('setting' . $courseattr, 'enrol_imsenterprise');
+            $description = get_string('setting' . $courseattr . 'description', 'enrol_imsenterprise');
+            $defaultvalue = (string) $imscourses->determine_default_coursemapping($courseattr);
+            $settings->add(new admin_setting_configselect('enrol_imsenterprise/imscoursemap' . $courseattr, $name, $description, $defaultvalue, $assignablevalues));
         }
     }