diff --git a/lib/db/install.xml b/lib/db/install.xml index b77a4d65c8..2add7cd3d6 100644 --- a/lib/db/install.xml +++ b/lib/db/install.xml @@ -727,7 +727,7 @@ - + diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index e83ae7a03d..ad2de478b2 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -4687,6 +4687,28 @@ function xmldb_main_upgrade($oldversion) { upgrade_main_savepoint(true, 2010070604); } + if ($oldversion < 2010070701) { + /// Before changing the field, drop dependent indexes + /// Define index shortname (not unique) to be dropped form course_request + $table = new xmldb_table('user'); + $index = new xmldb_index('city', XMLDB_INDEX_NOTUNIQUE, array('city')); + /// Conditionally launch drop index shortname + if ($dbman->index_exists($table, $index)) { + $dbman->drop_index($table, $index); + } + /// Changing precision of field city on table user to (100) + $field = new xmldb_field('city', XMLDB_TYPE_CHAR, '100', null, XMLDB_NOTNULL, null, null, 'address'); + + /// Launch change of precision for field city + $dbman->change_field_precision($table, $field); + + /// Conditionally launch add index typeitem_ix + if (!$dbman->index_exists($table, $index)) { + $dbman->add_index($table, $index); + } + /// Main savepoint reached + upgrade_main_savepoint(true, 2010070701); + } return true; } diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 62bc6a7036..64124b0f0a 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -3391,7 +3391,7 @@ function truncate_userinfo($info) { 'institution' => 40, 'department' => 30, 'address' => 70, - 'city' => 20, + 'city' => 100, 'country' => 2, 'url' => 255, ); diff --git a/login/signup_form.php b/login/signup_form.php index 8fbf23ae2a..7975933cb5 100644 --- a/login/signup_form.php +++ b/login/signup_form.php @@ -54,7 +54,7 @@ function definition() { $mform->setType('lastname', PARAM_TEXT); $mform->addRule('lastname', get_string('missinglastname'), 'required', null, 'server'); - $mform->addElement('text', 'city', get_string('city'), 'maxlength="20" size="20"'); + $mform->addElement('text', 'city', get_string('city'), 'maxlength="100" size="20"'); $mform->setType('city', PARAM_TEXT); $mform->addRule('city', get_string('missingcity'), 'required', null, 'server'); diff --git a/repository/mahara/db/access.php b/repository/mahara/db/access.php new file mode 100644 index 0000000000..33d30430ff --- /dev/null +++ b/repository/mahara/db/access.php @@ -0,0 +1,16 @@ + array( + 'captype' => 'read', + 'contextlevel' => CONTEXT_SYSTEM, + 'archetypes' => array( + 'user' => CAP_ALLOW, + 'student' => CAP_ALLOW, + 'teacher' => CAP_ALLOW, + 'editingteacher' => CAP_ALLOW, + 'manager' => CAP_ALLOW + ) + ) +); diff --git a/repository/mahara/db/upgrade.php b/repository/mahara/db/upgrade.php new file mode 100644 index 0000000000..b85cd22653 --- /dev/null +++ b/repository/mahara/db/upgrade.php @@ -0,0 +1,20 @@ +get_manager(); + $result = true; + +/// And upgrade begins here. For each one, you'll need one +/// block of code similar to the next one. Please, delete +/// this comment lines once this file start handling proper +/// upgrade code. + +/// if ($result && $oldversion < YYYYMMDD00) { //New version in version.php +/// $result = result of database_manager methods +/// } + + return $result; +} diff --git a/repository/mahara/lib.php b/repository/mahara/lib.php new file mode 100755 index 0000000000..2849663883 --- /dev/null +++ b/repository/mahara/lib.php @@ -0,0 +1,314 @@ +. + +/** + * repository_mahara class + * This plugin allowed to connect a retrieve a file from Mahara site + * This is a subclass of repository class + * + * @since 2.0 + * @package moodlecore + * @subpackage repository + * @copyright 2009 Jerome Mouneyrac + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +require_once($CFG->dirroot.'/repository/lib.php'); + +class repository_mahara extends repository { + + /** + * Constructor + * @global object $CFG + * @param int $repositoryid + * @param int $context + * @param array $options + */ + public function __construct($repositoryid, $context = SYSCONTEXTID, $options = array()) { + global $CFG; + parent::__construct($repositoryid, $context, $options); + $this->mnet = get_mnet_environment(); + } + + /** + * Check if user logged in to mahara + * @global object $SESSION + * @return boolean + */ + public function check_login() { + //check session + global $SESSION; + return !empty($SESSION->loginmahara); + } + + + /** + * Display the file listing - no login required + * @global object $SESSION + * @return array + */ + public function print_login() { + global $SESSION, $CFG, $DB; + //jump to the peer to create a session + + $mnetauth = get_auth_plugin('mnet'); + $host = $DB->get_record('mnet_host',array('id' => $this->options['peer'])); //need to retrieve the host url + $url = $mnetauth->start_jump_session($host->id, '/repository/repository_callback.php?repo_id='.$this->id, true); + + //set session + $SESSION->loginmahara = true; + + $ret = array(); + $popup_btn = new stdclass; + $popup_btn->type = 'popup'; + $popup_btn->url = $url; + $ret['login'] = array($popup_btn); + return $ret; + } + + /** + * Display the file listing for the search term + * @param string $search_text + * @return array + */ + public function search($search_text) { + return $this->get_listing('', '', $search_text); + } + + /** + * Retrieve the file listing - file picker function + * @global object $CFG + * @global object $DB + * @global object $USER + * @param string $path + * @param string $page + * @param string $search + * @return array + */ + public function get_listing($path = null, $page = 1, $search = '') { + global $CFG, $DB, $USER, $OUTPUT; + + ///check that Mahara has a good version + ///We also check that the "get file list" method has been activated (if it is not + ///the method will not be returned by the system method system/listMethods) + require_once($CFG->dirroot . '/mnet/xmlrpc/client.php'); + + ///check that the peer has been setup + if (!array_key_exists('peer',$this->options)) { + echo json_encode(array('e'=>get_string('error').' 9010: '.get_string('hostnotfound','repository_mahara'))); + return false; + } + + $host = $DB->get_record('mnet_host',array('id' => $this->options['peer'])); //need to retrieve the host url + + ///check that the peer host exists into the database + if (empty($host)) { + echo json_encode(array('e'=>get_string('error').' 9011: '.get_string('hostnotfound','repository_mahara'))); + return false; + } + + $mnet_peer = new mnet_peer(); + $mnet_peer->set_wwwroot($host->wwwroot); + $client = new mnet_xmlrpc_client(); + $client->set_method('system/listMethods'); + $client->send($mnet_peer); + $services = $client->response; + + if (empty($search)) { + $methodname = 'get_folder_files'; + } else { + $methodname = 'search_folders_and_files'; + } + + if (array_key_exists('repository/mahara/lib.php/'.$methodname, $services) === false) { + echo json_encode(array('e'=>get_string('connectionfailure','repository_mahara'))); + return false; + } + ///connect to the remote moodle and retrieve the list of files + $client->set_method('repository/mahara/lib.php/'.$methodname); + $client->add_param($USER->username); + if (empty($search)) { + $client->add_param($path); + } else { + $client->add_param($search); + } + ///call the method and manage host error + if (!$client->send($mnet_peer)) { + $message =" "; + foreach ($client->error as $errormessage) { + $message .= "ERROR: $errormessage . "; + } + echo json_encode(array('e'=>$message)); //display all error messages + return false; + } + $services = $client->response; + if (empty($search)) { + $newpath = $services[0]; + $filesandfolders = $services[1]; + } else { + $newpath = ''; + $filesandfolders = $services; + } + ///display error message if we could retrieve the list or if nothing were returned + if (empty($filesandfolders)) { + echo json_encode(array('e'=>get_string('failtoretrievelist','repository_mahara'))); + return false; + } + + + $list = array(); + if (!empty($filesandfolders['folders'])) { + foreach ($filesandfolders['folders'] as $folder) { + $list[] = array('path'=>$folder['id'], 'title'=>$folder['title'], 'date'=>$folder['mtime'], 'size'=>'0', 'children'=>array(), 'thumbnail' => $OUTPUT->pix_url('f/folder')); + } + } + if (!empty($filesandfolders['files'])) { + foreach ($filesandfolders['files'] as $file) { + if ($file['artefacttype'] == 'image') { + $thumbnail = $host->wwwroot."/artefact/file/download.php?file=".$file['id']."&size=70x55"; + } else { + $thumbnail = $OUTPUT->pix_url(file_extension_icon( $file['title'], 32)); + } + $list[] = array( 'title'=>$file['title'], 'date'=>$file['mtime'], 'source'=>$file['id'], 'thumbnail' => $thumbnail); + } + } + + + $filepickerlisting = array( + 'path' => $newpath, + 'dynload' => 1, + 'nosearch' => 0, + 'list'=> $list, + 'manage'=> $host->wwwroot.'/artefact/file/' + ); + + return $filepickerlisting; + } + + + + /** + * Download a file + * @global object $CFG + * @param string $url the url of file + * @param string $file save location + * @return string the location of the file + * @see curl package + */ + public function get_file($id, $file = '') { + global $CFG, $DB, $USER; + + require_once($CFG->dirroot . '/mnet/xmlrpc/client.php'); + ///set mnet environment and set the mnet host + $host = $DB->get_record('mnet_host',array('id' => $this->options['peer'])); //retrieve the host url + $mnet_peer = new mnet_peer(); + $mnet_peer->set_wwwroot($host->wwwroot); + + ///create the client and set the method to call + $client = new mnet_xmlrpc_client(); + $client->set_method('repository/mahara/lib.php/get_file'); + $client->add_param($USER->username); + $client->add_param($id); + + ///call the method and manage host error + if (!$client->send($mnet_peer)) { + $message =" "; + foreach ($client->error as $errormessage) { + $message .= "ERROR: $errormessage . "; + } + echo json_encode(array('e'=>$message)); + exit; + } + + $services = $client->response; //service contains the file content in the first case of the array, + //and the filename in the second + + + //the content has been encoded in base64, need to decode it + $content = base64_decode($services[0]); + $file = $services[1]; //filename + + ///create a temporary folder with a file + $path = $this->prepare_file($file); + ///fill the file with the content + $fp = fopen($path, 'w'); + fwrite($fp,$content); + fclose($fp); + + return array('path'=>$path); + + } + + /** + * Add Instance settings input to Moodle form + * @global object $CFG + * @global object $DB + * @param object $mform + */ + public function instance_config_form($mform) { + global $CFG, $DB; + + //retrieve only Moodle peers + $hosts = $DB->get_records_sql(' SELECT + h.id, + h.wwwroot, + h.ip_address, + h.name, + h.public_key, + h.public_key_expires, + h.transport, + h.portno, + h.last_connect_time, + h.last_log_id, + h.applicationid, + a.name as app_name, + a.display_name as app_display_name, + a.xmlrpc_server_url + FROM {mnet_host} h + JOIN {mnet_application} a ON h.applicationid=a.id + WHERE + h.id <> ? AND + h.deleted = 0 AND + a.name = ? AND + h.name <> ?', + array($CFG->mnet_localhost_id, 'mahara', 'All Hosts')); + $peers = array(); + foreach($hosts as $host) { + $peers[$host->id] = $host->name; + } + + + $mform->addElement('select', 'peer', get_string('peer', 'repository_mahara'),$peers); + $mform->addRule('peer', get_string('required'), 'required', null, 'client'); + + if (empty($peers)) { + $mform->addElement('static', null, '', get_string('nopeer','repository_mahara')); + } + } + + /** + * Names of the instance settings + * @return int + */ + public static function get_instance_option_names() { + ///the administrator just need to set a peer + return array('peer'); + } + public function supported_returntypes() { + return FILE_INTERNAL; + } +} + diff --git a/repository/mahara/pix/icon.png b/repository/mahara/pix/icon.png new file mode 100755 index 0000000000..53763ff131 Binary files /dev/null and b/repository/mahara/pix/icon.png differ diff --git a/repository/mahara/version.php b/repository/mahara/version.php new file mode 100644 index 0000000000..364c3b4143 --- /dev/null +++ b/repository/mahara/version.php @@ -0,0 +1,18 @@ +. + +$plugin->version = 2010021804; diff --git a/user/editlib.php b/user/editlib.php index 126094ba52..3ab62370b5 100644 --- a/user/editlib.php +++ b/user/editlib.php @@ -187,7 +187,7 @@ function useredit_shared_definition(&$mform, $editoroptions = null) { $mform->setDefault('screenreader', 0); $mform->addHelpButton('screenreader', 'screenreaderuse'); - $mform->addElement('text', 'city', get_string('city'), 'maxlength="20" size="21"'); + $mform->addElement('text', 'city', get_string('city'), 'maxlength="100" size="21"'); $mform->setType('city', PARAM_MULTILANG); $mform->addRule('city', $strrequired, 'required', null, 'client'); diff --git a/version.php b/version.php index 38778f9be3..c70bdd79ae 100644 --- a/version.php +++ b/version.php @@ -6,7 +6,7 @@ // This is compared against the values stored in the database to determine // whether upgrades should be performed (see lib/db/*.php) - $version = 2010070700; // YYYYMMDD = date of the last version bump + $version = 2010070701; // YYYYMMDD = date of the last version bump // XX = daily increments $release = '2.0 Preview 4+ (Build: 20100708)'; // Human-friendly version name