diff --git a/system/moodlePlugin/fhcompletews25/README b/system/moodlePlugin/fhcompletews25/README new file mode 100644 index 000000000..f2dde879c --- /dev/null +++ b/system/moodlePlugin/fhcompletews25/README @@ -0,0 +1,23 @@ +FHComplete Moodle 2.4 Webservice Plugin +======================================= + +Mit diesem Plugin wird Moodle 2.4 um zusätzliche Webservices erweitert +die für die Syncronisation mit FHComplete benötigt werden. + + +Installation +============ + +- ) Zur Installation des Plugins muss der gesamte Ordner fhcompletews in den + Ordner local der Moodleinstallation kopiert werden. + + zB: cp /var/www/fhcomplete/system/moodlePlugin/fhcompletews /var/www/moodle/local/ + +- ) Danach muss die Moodle Startseite aufgerufen werden. + Das neue Plugin wird automatisch erkannt uns installiert. + +Sonstiges +========= + +Falls Änderungen am Plugin durchgeführt werden, muss in version.php die Versionsnummer erhöht werden +damit Moodle die Änderung an dem Plugin erkennt und ein Update durchführt. diff --git a/system/moodlePlugin/fhcompletews25/db/services.php b/system/moodlePlugin/fhcompletews25/db/services.php new file mode 100644 index 000000000..f272cbb7a --- /dev/null +++ b/system/moodlePlugin/fhcompletews25/db/services.php @@ -0,0 +1,53 @@ +. + +/** + * Web service local plugin template external functions and service definitions. + * + * @package localwstemplate + * @copyright 2011 Jerome Mouneyrac + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +// We defined the web service functions to install. +$functions = array( + 'fhcomplete_get_course_grades' => array( + 'classname' => 'local_fhcompletews_external', + 'methodname' => 'get_course_grades', + 'classpath' => 'local/fhcompletews/externallib.php', + 'description' => 'Get Grades of a course', + 'type' => 'read', + 'capabilities'=> 'moodle/course:update,moodle/course:viewhiddencourses', + ), + + 'fhcomplete_courses_by_shortname' => array( + 'classname' => 'local_fhcompletews_external', + 'methodname' => 'get_courses_by_shortname', + 'classpath' => 'local/fhcompletews/externallib.php', + 'description' => 'Get course contents by Shortname', + 'type' => 'read', + 'capabilities'=> 'moodle/course:update,moodle/course:viewhiddencourses', + ), + + 'fhcomplete_user_get_users' => array( + 'classname' => 'core_user_external', + 'methodname' => 'get_users', + 'classpath' => 'user/externallib.php', + 'description' => 'get Users by Criteria', + 'type' => 'read', + 'capabilities'=> 'moodle/user:viewdetails, moodle/user:viewhiddendetails, moodle/course:useremail, moodle/user:update', + ), + +); diff --git a/system/moodlePlugin/fhcompletews25/externallib.php b/system/moodlePlugin/fhcompletews25/externallib.php new file mode 100644 index 000000000..e0f343870 --- /dev/null +++ b/system/moodlePlugin/fhcompletews25/externallib.php @@ -0,0 +1,334 @@ +. + +/** + * External Web Service Template + * + * @package localwstemplate + * @copyright 2011 Moodle Pty Ltd (http://moodle.com) + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +require_once($CFG->libdir . "/externallib.php"); + +class local_fhcompletews_external extends external_api +{ + +/************************************************** + * Webservice get_course_grades + * + * Laedt die Noten eines Kurses + **************************************************/ + public static function get_course_grades_parameters() + { + return new external_function_parameters( + array('courseid' => new external_value(PARAM_INT, 'CourseID')), 'ID of the Course' + ); + } + + /** + * Get course Grades + * @param int courseid + * @return array + */ + public static function get_course_grades($courseid) + { + global $CFG, $DB; + require_once($CFG->dirroot . "/course/lib.php"); + require_once($CFG->dirroot.'/grade/export/lib.php'); + + //validate parameter + $params = self::validate_parameters(self::get_course_grades_parameters(), + array('courseid' => $courseid)); + + $notenart=3; // 2=Prozent; 3=Endnote nach Skala + $gui=array(); + $final_id=''; + $data = array(); + + // Kursdaten Laden + if (!$course = $DB->get_record('course', array('id'=>$courseid))) + { + throw new moodle_exception('Course not found', '', '', null, 'The course ' . $courseid . ' is not found'); + return false; + } + + $id=$course->id; + $kursname=$course->fullname; + $shortname=$course->shortname; + + //ODS Notenexport starten + require_login($course); + $context = get_context_instance(CONTEXT_COURSE, $courseid); + require_once($CFG->dirroot.'/grade/export/ods/grade_export_ods.php'); + + if (!$export = new grade_export_ods($course, 0, 0, false, false, $notenart, 2)) + { + throw new moodle_exception('Fehler', '', '', null, "Moodle-Kurs ".$id." ".$shortname." - keine Export Information gefunden"); + return false; + } + + $grad =$export->columns; + + // Im Export sind die Noten fuer alle Abgaben, Quiz, etc enthalten + // Wir brauchen hier nur die Gesamtnote fuer die ganzen Kurs + foreach ($export->columns as $key=>$grade_item) + { + // Gesamtnote hat den itemtype "course" + if($grade_item->itemtype=='course') + { + $final_id=$key; + $finalitem = $grade_item; + break; + } + } + + if($final_id=='') + { + throw new moodle_exception('Fehler', '', '', null,"Moodle-Kurs ".$id." ".$shortname." - keine Endnote gefunden"); + return false; + } + + // Liste mit allen Studierenden des Kurses durchlaufen + $geub = new grade_export_update_buffer(); + $gui = new graded_users_iterator($export->course, array($final_id=>$finalitem), $export->groupid); //$export->columns + + $gui->init(); + $kursgrad =array(); + + while ($userdata = $gui->next_user()) + { + $user_item=array(); + $user = $userdata->user; + $user_item['vorname']=$user->firstname; + $user_item['nachname']=$user->lastname; + $user_item['idnummer']=$user->idnumber; + $user_item['username']=$user->username; + + // Aus den vorhanden Noten wird die Endnote fuer den Kurs herausgesucht + if(isset($userdata->grades[$final_id])) + { + $gradestr = $export->format_grade($userdata->grades[$final_id]); + $user_item['note']=$gradestr; + + // nur zurueckliefern wenn eine Note gefunden wurde und diese nicht '-' ist + if($user_item['note']!='-') + $data[]=$user_item; + } + } + + $gui->close(); + $geub->close(); + + if (count($data)==0) + { + throw new moodle_exception('Fehler', '', '', null,"Moodle-Kurs ".$id." ".$shortname." - keine Kurs-Noten Informationen gefunden "); + return false; + } + + return $data; + } + + /** + * Returns description of method result value + * @return external_description + */ + public static function get_course_grades_returns() + { + return new external_multiple_structure( + new external_single_structure( + array( + 'vorname' => new external_value(PARAM_TEXT, 'vorname'), + 'nachname' => new external_value(PARAM_TEXT, 'nachname'), + 'idnummer' => new external_value(PARAM_TEXT, 'idnummer'), + 'username' => new external_value(PARAM_TEXT, 'username'), + 'note' => new external_value(PARAM_TEXT, 'note'), + ), 'course' + ) + ); + } + +/************************************************** + * Webservice get_courses_by_shortname + * + * Laedt Kurse anhand der Kurzbezeichnung + **************************************************/ + public static function get_courses_by_shortname_parameters() + { + return new external_function_parameters( + array('options' => new external_single_structure( + array('shortnames' => new external_multiple_structure( + new external_value(PARAM_RAW, 'Short Name') + , 'List of short names. If empty return all courses + except front page course.', + VALUE_OPTIONAL) + ), 'options - operator OR is used', VALUE_DEFAULT, array()) + ) + ); + } + + /** + * Get courses + * @param array $options + * @return array + */ + public static function get_courses_by_shortname($options) + { + global $CFG, $DB; + require_once($CFG->dirroot . "/course/lib.php"); + + //validate parameter + $params = self::validate_parameters(self::get_courses_by_shortname_parameters(), + array('options' => $options)); + + //retrieve courses + if (!key_exists('shortnames', $params['options']) + or empty($params['options']['shortnames'])) { + $courses = $DB->get_records('course'); + } else { + $courses = $DB->get_records_list('course', 'shortname', $params['options']['shortnames']); + } + + //create return value + $coursesinfo = array(); + foreach ($courses as $course) + { + + // now security checks + $context = get_context_instance(CONTEXT_COURSE, $course->id); + try + { + self::validate_context($context); + } + catch (Exception $e) + { + $exceptionparam = new stdClass(); + $exceptionparam->message = $e->getMessage(); + $exceptionparam->shortname = $course->shortname; + throw new moodle_exception( + get_string('errorcoursecontextnotvalid', 'webservice', $exceptionparam)); + } + require_capability('moodle/course:view', $context); + + $courseinfo = array(); + $courseinfo['id'] = $course->id; + $courseinfo['fullname'] = $course->fullname; + $courseinfo['shortname'] = $course->shortname; + $courseinfo['categoryid'] = $course->category; + $courseinfo['summary'] = $course->summary; + $courseinfo['summaryformat'] = $course->summaryformat; + $courseinfo['format'] = $course->format; + $courseinfo['startdate'] = $course->startdate; + $courseinfo['numsections'] = $course->numsections; + + //some field should be returned only if the user has update permission + $courseadmin = has_capability('moodle/course:update', $context); + if ($courseadmin) + { + $courseinfo['categorysortorder'] = $course->sortorder; + $courseinfo['idnumber'] = $course->idnumber; + $courseinfo['showgrades'] = $course->showgrades; + $courseinfo['showreports'] = $course->showreports; + $courseinfo['newsitems'] = $course->newsitems; + $courseinfo['visible'] = $course->visible; + $courseinfo['maxbytes'] = $course->maxbytes; + $courseinfo['hiddensections'] = $course->hiddensections; + $courseinfo['groupmode'] = $course->groupmode; + $courseinfo['groupmodeforce'] = $course->groupmodeforce; + $courseinfo['defaultgroupingid'] = $course->defaultgroupingid; + $courseinfo['lang'] = $course->lang; + $courseinfo['timecreated'] = $course->timecreated; + $courseinfo['timemodified'] = $course->timemodified; + $courseinfo['forcetheme'] = $course->theme; + $courseinfo['enablecompletion'] = $course->enablecompletion; + $courseinfo['completionstartonenrol'] = $course->completionstartonenrol; + $courseinfo['completionnotify'] = $course->completionnotify; + } + + if ($courseadmin or $course->visible + or has_capability('moodle/course:viewhiddencourses', $context)) + { + $coursesinfo[] = $courseinfo; + } + } + + return $coursesinfo; + } + + /** + * Returns description of method result value + * @return external_description + */ + public static function get_courses_by_shortname_returns() + { + return new external_multiple_structure( + new external_single_structure( + array( + 'id' => new external_value(PARAM_INT, 'course id'), + 'shortname' => new external_value(PARAM_TEXT, 'course short name'), + 'categoryid' => new external_value(PARAM_INT, 'category id'), + 'categorysortorder' => new external_value(PARAM_INT, + 'sort order into the category', VALUE_OPTIONAL), + 'fullname' => new external_value(PARAM_TEXT, 'full name'), + 'idnumber' => new external_value(PARAM_RAW, 'id number', VALUE_OPTIONAL), + 'summary' => new external_value(PARAM_RAW, 'summary'), + 'summaryformat' => new external_value(PARAM_INT, + 'the summary text Moodle format'), + 'format' => new external_value(PARAM_ALPHANUMEXT, + 'course format: weeks, topics, social, site,..'), + 'showgrades' => new external_value(PARAM_INT, + '1 if grades are shown, otherwise 0', VALUE_OPTIONAL), + 'newsitems' => new external_value(PARAM_INT, + 'number of recent items appearing on the course page', VALUE_OPTIONAL), + 'startdate' => new external_value(PARAM_INT, + 'timestamp when the course start'), + 'numsections' => new external_value(PARAM_INT, 'number of weeks/topics'), + 'maxbytes' => new external_value(PARAM_INT, + 'largest size of file that can be uploaded into the course', + VALUE_OPTIONAL), + 'showreports' => new external_value(PARAM_INT, + 'are activity report shown (yes = 1, no =0)', VALUE_OPTIONAL), + 'visible' => new external_value(PARAM_INT, + '1: available to student, 0:not available', VALUE_OPTIONAL), + 'hiddensections' => new external_value(PARAM_INT, + 'How the hidden sections in the course are displayed to students', + VALUE_OPTIONAL), + 'groupmode' => new external_value(PARAM_INT, 'no group, separate, visible', + VALUE_OPTIONAL), + 'groupmodeforce' => new external_value(PARAM_INT, '1: yes, 0: no', + VALUE_OPTIONAL), + 'defaultgroupingid' => new external_value(PARAM_INT, 'default grouping id', + VALUE_OPTIONAL), + 'timecreated' => new external_value(PARAM_INT, + 'timestamp when the course have been created', VALUE_OPTIONAL), + 'timemodified' => new external_value(PARAM_INT, + 'timestamp when the course have been modified', VALUE_OPTIONAL), + 'enablecompletion' => new external_value(PARAM_INT, + 'Enabled, control via completion and activity settings. Disbaled, + not shown in activity settings.', + VALUE_OPTIONAL), + 'completionstartonenrol' => new external_value(PARAM_INT, + '1: begin tracking a student\'s progress in course completion + after course enrolment. 0: does not', + VALUE_OPTIONAL), + 'completionnotify' => new external_value(PARAM_INT, + '1: yes 0: no', VALUE_OPTIONAL), + 'lang' => new external_value(PARAM_ALPHANUMEXT, + 'forced course language', VALUE_OPTIONAL), + 'forcetheme' => new external_value(PARAM_ALPHANUMEXT, + 'name of the force theme', VALUE_OPTIONAL), + ), 'course' + ) + ); + } +} diff --git a/system/moodlePlugin/fhcompletews25/lang/en/local_wstemplate.php b/system/moodlePlugin/fhcompletews25/lang/en/local_wstemplate.php new file mode 100644 index 000000000..1d8ddd42e --- /dev/null +++ b/system/moodlePlugin/fhcompletews25/lang/en/local_wstemplate.php @@ -0,0 +1,25 @@ +. + +/** + * Web service template plugin related strings + * @package localwstemplate + * @copyright 2011 Moodle Pty Ltd (http://moodle.com) + * @author Jerome Mouneyrac + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$string['pluginname'] = 'FH Complete Web service Plugin'; diff --git a/system/moodlePlugin/fhcompletews25/version.php b/system/moodlePlugin/fhcompletews25/version.php new file mode 100644 index 000000000..2ad10a261 --- /dev/null +++ b/system/moodlePlugin/fhcompletews25/version.php @@ -0,0 +1,24 @@ +. + +$plugin->version = 2014061103; // The (date) version of this module + 2 extra digital for daily versions + // This version number is displayed into /admin/forms.php + // TODO: if ever this plugin get branched, the old branch number + // will not be updated to the current date but just incremented. We will + // need then a $plugin->release human friendly date. For the moment, we use + // display this version number with userdate (dev friendly) +$plugin->requires = 2013051400; // Requires this Moodle version - at least 2.5 +$plugin->cron = 0; +$plugin->release = '1.1 (Build: 2014061103)'; +$plugin->maturity = MATURITY_STABLE;