Commit b3217a0c authored by Thomas Fradet's avatar Thomas Fradet

Merge branch 'release/v3.5.4plus'

perf
parents fa37238b 6ea64056
# 19/02/19
## Création du groupe
Le création d'un groupe Mahara n'envoie plus vers une page Mahara de type "groupe non trouvé".
Le bouton de création manuelle de tous les groupes qui y inscrit également l'enseignenant a maintenant une fenêtre de confirmation afin d'éviter des usages accidentels. Ce bouton était et reste réservé aux enseignants, et pas aux enseignants non éditeurs.
## 22/05/2019
A cause d'un problème de performances sur l'API de Mahara qui récupère la liste des users, lors de l'instanciation du bloc (activation par l'enseignant), seul lui-même est inscrit dans le groupe.
......@@ -12,7 +12,7 @@ This plugin is a block that provide a link between a Moodle course and a Mahara
## Compatibility
MOODLE 3.5
MOODLE 3.5.4+
Stabilité : expérimental.
......@@ -30,9 +30,14 @@ Other : <iena-contact@univ-lorraine.fr>.
## Activation et paramétrage
__Documentation à préciser :__
- création du user mahara avec les bons droits pour l'api
- paramétrage du plugin dans moodle
Application folder name have to be : `/blocks/mahara_iena`.
Le fonctionnement du plugin nécessite :
1. D'avoir liées les plateformes MOODLE et MAHARA pour la création de compte et l'autentification.
2. D'avoir un utilisateur MAHARA disposant d'un token d'API lié aux services exploités par ce plugin.
Le second point spécifique à ce plugin est documenté ici : [Documentation bloc Mahara iENA](iena-mahara-link-block-documentation.pdf).
## Fonctionnalités
......@@ -52,14 +57,6 @@ Alternatively, if they are user groups within the moodle cours, teacher can choo
Usecase : place 3 groups with 1 teacher and n students in a moodle course and create in one click 3 mahara groups where each teacher will be able to administrate his mahara group and each student will be able to access the right group in mahara, based on the moodle group.
## Problèmes connus
- Un groupe mahara existant ne peut être lié au cours.
- Si le bloc est activé pour lier un seul groupe Mahara pour ce cours, il n'est plus possible par la suite d'en lier un par groupe Moodle (et vice-versa).
- Créer tous les groupes de force inscrit l'enseignant qui active cette fonctionnalité dans tous les groupes.
- Lorsque le groupe n'existe pas encore, il est créé, mais la redirection finale à l'issue de la création mène vers une page d'erreur (même si la création et l'inscription fonctionnent. )
- Les groupements ne sont pas supportés, ne les utilisez pas avec ce plugin. Seuls les groupes sans groupement sont pris en compte.
## Amélioration à effectuer
- Liaison d'un groupe Mahara existant au cours
......@@ -67,3 +64,4 @@ Usecase : place 3 groups with 1 teacher and n students in a moodle course and cr
- Inscription de l'enseignant dans tous les groupes en un clic
- Management des groupes Mahara liés au cours (liaison d'un groupe Mahara existant à un groupe du cours ou au cours, suppression d'un groupe Mahara préalablement lié au cours)
- Passage possible du mode un groupe Mahara pour tout le cours Moodle à un groupe Mahara par groupe Moodle et vice-versa.
- Gestion des groupements : actuellement il est incompatible avec les groupements.
\ No newline at end of file
......@@ -60,11 +60,14 @@ class block_mahara_iena extends block_base
// for teachers
if (has_capability('moodle/course:update', $context = context_course::instance($COURSE->id), $USER->id)) {
// if block is not instanciated, propose du create mahara group(s) for this course
if (count($result) == 0 && $is_mahara_user) {
// create one mahara group for the course
$this->content->text .= '<a href="' . $CFG->wwwroot . '/blocks/mahara_iena/mahara_iena.php?courseid='
. $COURSE->id . '" class="btn btn-block btn-primary iena-btn-big">' . get_string('create_group', 'block_mahara_iena', $CFG->mahara_alias) . '</a><p class="text-muted">Créer un groupe dans '.$CFG->mahara_alias.'.</p>';
// create one mahara group for each moodle group (need groups)
$groups = groups_get_all_groups($COURSE->id);
if ( $groups == null) {
$this->content->text .= '<button type="button" class="btn btn-block btn-primary iena-btn-big" disabled >' . get_string('create_groups_groups', 'block_mahara_iena', $CFG->mahara_alias) . '</button><p class="text-muted text-warning">Créer un groupe dans '.$CFG->mahara_alias.' pour chaque groupe du cours. <strong>Les groupes doivent exister dans le cours.</strong></p>';
......@@ -171,7 +174,8 @@ class block_mahara_iena extends block_base
}
/* permet à l'enseignant de créer tous les groupes mahara en fonction des groupes moodle existant à un temps t. Ca n'inscrit pas les utilisateurs à part lui. */
if ( $has_groups && has_capability('moodle/course:update', $context = context_course::instance($COURSE->id), $USER->id) ) {
$this->content->text .= '<a href="'.$CFG->wwwroot . '/blocks/mahara_iena/mahara_iena_groups_all.php?courseid=' . $COURSE->id . '&create_all_groups=1" class="btn btn-block btn-warning iena-btn-big">Créer tous les groupes</a><p class="text-muted">Créer manuellement tous les groupes sur '.$CFG->mahara_alias.' liés à ce cours et s\'y inscrire en tant qu\'enseignant.</p>';
$this->content->text .= '<a id="create_all_groups" href="'.$CFG->wwwroot . '/blocks/mahara_iena/mahara_iena_groups_all.php?courseid=' . $COURSE->id . '&create_all_groups=1" class="btn btn-block btn-warning iena-btn-big">Créer tous les groupes</a><p class="text-muted">Créer manuellement tous les groupes sur '.$CFG->mahara_alias.' liés à ce cours et s\'y inscrire en tant qu\'enseignant.</p>';
$this->content->text .= "<script>document.getElementById('create_all_groups').onclick = function (e) {e.preventDefault(); var confirm_cr_gr = confirm('ATTENTION ! Voulez-vous vraiment créer manuellement tous les groupes liés à ce cours ET VOUS Y INSCRIRE ? Attention, vous serez inscrit dans tous les groupes. Si vous ne créez pas les groupes, ils seront créé automatiquement la première fois que un des membres de chaque groupe y accèdera. '); if (confirm_cr_gr) { window.location.href = e.target.href; } };</script>";
// $this->content->text .= '<a href="'.$CFG->wwwroot . '/blocks/mahara_iena/mahara_iena_groups_all.php?courseid=' . $COURSE->id . '" class="btn btn-block btn-warning iena-btn-big">S\'inscrire dans tous les groupes</a><p class="text-muted">S\'inscrire en tant qu\'enseignant dans tous les groupes '.$CFG->mahara_alias.' liés à ce cours.</p>';
/* POUR PLUS TARD : liste les groupes moodle liés à mahara qui n'existent plus dans moodle */
......
......@@ -56,10 +56,11 @@ class block_mahara_iena_connexion
return $this->base."?wstoken=".$this->wstoken."&wsfunction=".$function."&alt=json";
}
public function getMaharaGroups(){
$getMaharaGroupes = "mahara_group_get_groups_by_id";
$url = $this->create_url($getMaharaGroupes);
return json_decode($this->httpGet($url));
public function getMaharaGroups($params){
$params = http_build_query($params);
$mahara_group_get_groups_by_id = "mahara_group_get_groups_by_id";
$url = $this->create_url($mahara_group_get_groups_by_id);
return json_decode($this->httpPost($params, $url));
}
public function getMaharaUsers(){
......@@ -365,7 +366,7 @@ class block_mahara_iena_connexion
$record->mahara_group_id = $res[0]->id;
$record->moodle_group_id = $mo_user_group_id;
$DB->insert_records('block_mahara_iena', array( 0 => $record ), false);
return true;
return $res[0]->id;
}
} else {
......
......@@ -31,7 +31,7 @@ $course_ctx = context_course::instance($course->id);
$students = get_enrolled_users($course_ctx);
$usersTab = array();
$maharaUsers = $connexion->getMaharaUsers();
//Here we check by email, if the student have the same email into mahara and moodle he is add to group
if (count($students) == 0) {
......@@ -39,22 +39,41 @@ if (count($students) == 0) {
.get_string('err_no_stud', 'block_mahara_iena', $CFG->mahara_alias)
."</div>";
} else {
foreach ($maharaUsers->users as $muser) {
foreach ($students as $student) {
if ($student->email == $muser->email){
$role = "member";
//Each students is admin
if (has_capability('moodle/course:update', $context = context_course::instance($COURSE->id), $student->id)) {
$role = "admin";
}
array_push($usersTab,array(
'id' => $muser->id,
'username' => $muser->username,
'role' => $role,
));
break;
}
}
// Build user array to pass to mahara api for group inscription
// WARNING : not efficient with to much users in mahara databases
// $maharaUsers = $connexion->getMaharaUsers();
// foreach ($maharaUsers->users as $muser) {
// foreach ($students as $student) {
// if ($student->email == $muser->email){
// $role = "member";
// // Each teacher will be mahara group admin
// if (has_capability('moodle/course:update', $context = context_course::instance($COURSE->id), $student->id)) {
// $role = "admin";
// }
// array_push($usersTab,array(
// 'id' => $muser->id,
// 'username' => $muser->username,
// 'role' => $role,
// ));
// break;
// }
// }
// }
// WARNING : don't try to subscribe every course user to the group with >1000 users in mahara. Juste teacher. Minus 1 user is required to create a group.
// get mahara user by mail (teacher)
$mahara_user = $connexion->get_mahara_user_by_mail($USER->email);
// if user is not a mahara user, there will be an error : it's not supposed to be because mahara account is checked before to have a button to go in this page but... but.
if ( !$mahara_user->error ) {
array_push($usersTab,array(
'id' => $mahara_user[0]->id,
'username' => $mahara_user[0]->username,
'role' => "admin",
));
} else {
echo "<p style='color: red;'>You must have a Mahara account to do that.</p>";
die;
}
//All params used for mahara_group_create_groups her we can add/change some lines
......@@ -69,8 +88,7 @@ if (count($students) == 0) {
'request' => true,
'public' => false,
'institution' => $CFG->instution_mahara,
'members' =>
$usersTab
'members' => $usersTab
)
)
);
......
......@@ -37,41 +37,34 @@ if (count($students) == 0) {
} else {
$groups = groups_get_all_groups($COURSE->id);
$maharaUsers = $connexion->getMaharaUsers();
// $maharaUsers = $connexion->getMaharaUsers();
$mahara_groups = array();
$name_groups = array();
foreach ($groups as $group) {
$user_group_ids = groups_get_user_groups($COURSE->id, $USER->id)[0];
$usersTab = array();
$members = groups_get_members($group->id);
foreach ($groups as $group) {
if ( count($members) == 0 ) {
// if current group id is not in USER group ids : skip this group
if ( !in_array($group->id, $user_group_ids) ) {
continue;
}
foreach ($members as $member) {
$course_roles = get_user_roles($course_ctx, $member->id, false);
$role = "member";
foreach ($course_roles as $course_role) {
if ($course_role->shortname == "teacher" || $course_role->shortname == "editingteacher") {
$role = "admin";
break;
}
}
foreach ($maharaUsers->users as $muser) {
if ($member->email == $muser->email){
array_push($usersTab,array(
'id' => $muser->id,
'username' => $muser->username,
'role' => $role,
));
break;
}
}
$usersTab = array();
// Subscribe only the teacher to the mahara group because of lake of efficiency with too big mahara user database (>1000)
// get mahara user by mail (teacher)
$mahara_user = $connexion->get_mahara_user_by_mail($USER->email);
// if user is not a mahara user, there will be an error : it's not supposed to be because mahara account is checked before to have a button to go in this page but... but.
if ( !$mahara_user->error ) {
array_push($usersTab,array(
'id' => $mahara_user[0]->id,
'username' => $mahara_user[0]->username,
'role' => "admin",
));
} else {
echo "<p style='color: red;'>You must have a Mahara account to do that.</p>";
die;
}
if ( count($usersTab) == 0 ) {
......@@ -85,8 +78,7 @@ if (count($students) == 0) {
'request' => true,
'public' => false,
'institution' => $CFG->instution_mahara,
'members' =>
$usersTab
'members' => $usersTab
));
array_push($name_groups, array(
......@@ -95,10 +87,8 @@ if (count($students) == 0) {
));
}
// var_dump($name_groups);
// die;
if ( count($mahara_groups) == 0 ) {
echo "<div class=\"alert alert-warning\" role=\"alert\"><p><strong>Erreur : tous les groupes du cours sont vides. </strong></p><p>Pour utiliser cette fonctionnalité, il faut au préalable créer des groupes dans le cours et y ajouter des étudiants ou des enseignants.</p></div>";
echo "<div class=\"alert alert-warning\" role=\"alert\"><p><strong>Erreur : vous devez faire partie d'au moins un groupe de ce cours. Inscrivez-vous dans un groupe puis recommencez.</p></div>";
} else {
$params = array(
......
......@@ -31,15 +31,26 @@ if ( $_GET['connect_mahara'] == true ) {
//ensure user is member of it's mahara group : true if already or succeed
// $all_right = $connexion->ensure_user_is_mahara_group_member($USER, $_GET['mahara_group']);
$all_right = $connexion->ensure_user_is_mahara_group_member_new($USER, $_GET['mahara_group'], $_GET['moodle_group']);
if ( $_GET['connect_direct'] == true ) {
$all_right = true;
} else {
$all_right = $connexion->ensure_user_is_mahara_group_member_new($USER, $_GET['mahara_group'], $_GET['moodle_group']);
}
if ( ! $all_right ) {
if ( $all_right === false ) {
$content .= '<div class="alert alert-danger">Erreur d\'ajout au groupe sur <a href="'.$CFG->base_mahara.'" target="_blank">'.$CFG->base_mahara.'</a>. </div>';
} else {
/* connect to mahara and redirect to the mahara group */
$mnetauth = get_auth_plugin('mnet');
$group_url = "/group/view.php?id=".$_GET['mahara_group'];
$ma_group = $_GET['mahara_group'];
if ( $ma_group == "" || $ma_group == NULL ) {
if ( gettype($all_right) == "integer" ) {
$ma_group = $all_right;
} else {
$content .= '<div class="alert alert-warning">La redirection vers le groupe a échouée, veuillez réessayer. </div>';
}
}
$group_url = "/group/view.php?id=".$ma_group;
$url = $mnetauth->start_jump_session($CFG->iena_mahara, $group_url);
if (empty($url)) {
$content .= '<div class="alert alert-danger">La connexion a échouée.</div>';
......
<?php
require_once('../../config.php');
require_once ('entity/block_mahara_iena_connexion.php');
global $COURSE, $DB, $USER, $CFG;
$courseid = required_param('courseid', PARAM_INT);
$url = new moodle_url('/blocks/mahara_iena/mahara_iena_manage.php', array('courseid' => $courseid));
$PAGE->set_pagelayout('course');
$PAGE->set_url($url);
$course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
require_login($course, false, NULL);
$context = context_course::instance($courseid);
if (!has_capability('moodle/course:update', $context, $USER->id)) {
header("Location: {$_SERVER['HTTP_REFERER']}");
exit;
}
$page_title = "Gestion des groupes liés à ce cours sur " . $CFG->mahara_alias;
$PAGE->set_title($page_title);
$PAGE->set_heading($OUTPUT->heading($COURSE->fullname, 2, 'headingblock header outline'));
$connexion = new block_mahara_iena_connexion($CFG->wstoken, $CFG->base_mahara);
echo $OUTPUT->header();
echo "<h2>$page_title</h2>";
echo "<style>button {cursor: pointer;}
.table-iena td {padding-bottom: 0.4rem;}</style>";
echo "<p>Fonctionnalités (enseignants uniquement) : </p>
<ul>
<li>Réserver cette interface à la gestion de cours multigroupes ?</li>
<li>S'inscrire ou se désinscrire d'un groupe Mahara</li>
<li class='text-muted'>Eventuellement : idem pour plusieurs à la fois (coches)</li>
<li>Briser le lien entre un groupe Mahara existant et un groupe Moodle</li>
<li>Lier un groupe Mahara existant à un groupe de ce cours Moodle</li>
<li>Supprimer un groupe Mahara lié à ce cours Moodle</li>
</ul>";
echo "<div class='alert alert-success'><h3>Information</h3><p>Vous pouvez ici gérer les groupes de ce cours et les groupes qui y sont liés sur <em>$CFG->mahara_alias</em>. </p>
<ul><li>Normalement, les groupes de <em>$CFG->mahara_alias</em> ne sont créés que lorsque le premier utilisateur du groupe correspondant dans ce cours clic sur le lien pour y accéder : ici, vous pouvez les créer à l'avance.</li>
<li>Vous pouvez vous inscrire / désinscrire vous-même des groupes de ce cours et des groupes liés sur <em>$CFG->mahara_alias</em>. Si vous n'êtes pas inscrit dans un groupe du cours mais inscrit dans le groupe correspondant sur <em>$CFG->mahara_alias</em>, nous ne verrez pas apparaître ce groupe dans le bloc de liens du cours. </li></ul></p></div>";
/* Liste des liaisons moodle mahara en base. */
$mo_ma_groups = $DB->get_records_sql('SELECT * FROM {block_mahara_iena} WHERE course = ?', array($COURSE->id));
/* Tous les groupes moodle. */
$course_groups = groups_get_all_groups($COURSE->id);
/* Table d'affichage des informations. */
echo "<table class='table table-iena'>";
echo "<tr><th>Groupe du cours</th><th style='border-right: 2px solid #dee2e6;'>Inscription</th><th>Groupe sur " . $CFG->mahara_alias . "</th><th>Inscription</th></tr>";
foreach ($course_groups as $group) {
echo "<tr>";
/* Affichage des infos et lien vers les groupes moodle. */
echo "<td><strong>" . groups_get_group_name($group->id) . "</strong> ($group->id) — <a href='$CFG->wwwroot/group/group.php?courseid=$COURSE->id&id=$group->id'>Paramètres</a>, <a href='$CFG->wwwroot/group/members.php?group=$group->id'>Membres</a></td>";
echo "<td style='border-right: 2px solid #dee2e6;'><button class='btn-sm btn-warning'>Désinscription</button></td>";
/* Détermine si le groupe moodle est lié à un groupe mahara. */
$mahara_group_id = false;
foreach ($mo_ma_groups as $mo_ma_group) {
if ( $mo_ma_group->moodle_group_id == $group->id ) {
$mahara_group_id = $mo_ma_group->mahara_group_id;
break;
}
}
/* Si le groupe moodle est lié à un groupe mahara. */
if ( $mahara_group_id ) {
/* Récupération sur mahara des infos de groupe. */
$params = array (
'groups' =>
array (
0 =>
array (
'id' => $mahara_group_id
)
)
);
$mahara_group = $connexion->getMaharaGroups($params);
/* USER membre du groupe mahara ? */
$is_ma_group_member = false;
foreach ($mahara_group[0]->members as $ma_group_member) {
if ( $ma_group_member->username == $USER->username ) {
$is_ma_group_member = true;
}
}
/* Inscription ou désinscription du groupe mahara du USER. */
if ( $is_ma_group_member ) {
echo "<td><a target='_blank' href='".$CFG->wwwroot."/blocks/mahara_iena/mahara_iena_link.php?courseid=$COURSE->id&connect_direct=true&mahara_group=".$mahara_group[0]->id."'>".$mahara_group[0]->name."</a></td>";
echo "<td><button class='btn-sm btn-warning'>Désinscription</button><br><a href='#' class='small' data-toggle='modal' data-target='#exampleModal'>Changer</a></td>";
} else {
echo "<td>".$mahara_group[0]->name."</a></td>";
echo "<td><button class='btn-sm btn-success'>Inscription</button><br><a href='#' class='small'>Changer</a></td>";
}
} else {
/* Si groupe mahara n'existe pas : possibilité de le créer. */
echo "<td><p class='text-muted'>Créer et s'inscrire dans ce groupe sur <em>$CFG->mahara_alias</em> ?</p></td>";
echo "<td><button class='btn-sm btn-primary'>Créer et m'inscrire</button><br><a href='#' class='small'>Changer</a></td>";
}
echo "</tr>";
}
echo "</table>";
?>
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Changer le groupe associé</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p>Sélectionner un autre groupe <em><?php echo $CFG->mahara_alias; ?></em> à associer avec ce groupe du cours.</p>
<p>Vos groupes <em><?php echo $CFG->mahara_alias; ?></em> : </p>
<select name="" id="change-group-sel" style="width: 100%;">
<option value="test">test</option>
<option value="test">test test test test test test test test t test test test test tesst test test test test test dhjieopa jdiep jdiuepaz huipref nuipad uipeaz</option>
</select>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
<button type="button" class="btn btn-primary">Valider</button>
</div>
</div>
</div>
</div>
<?php
echo $OUTPUT->footer();
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Version details
*
* The block mahara iena use mahara api to create group into mahara
* You need to create token into mahara for use this
*
* @package block_mahara_iena
* @category block
* @copyright 2018 Softia/Université de Lorraine
* @author Vrignaud Camille/Thomas Fradet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2018092702;
$plugin->requires = 2014051200;
$plugin->component = 'block_mahara_iena';
$plugin->release = 'v1.0';
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Version details
*
* The block mahara iena use mahara api to create group into mahara
* You need to create token into mahara for use this
*
* @package block_mahara_iena
* @category block
* @copyright 2018 Softia/Université de Lorraine
* @author Vrignaud Camille/Thomas Fradet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2019052201;
$plugin->requires = 2014051200;
$plugin->component = 'block_mahara_iena';
$plugin->release = 'v1.0';
$plugin->maturity = MATURITY_STABLE;
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment