, * Andreas Oesterreicher and * Rudolf Hangl . */ /* * requires moodle_course.class.php * studiengang.class.php */ class moodle_user { var $conn; var $conn_moodle; var $errormsg; var $log=''; //log message fuer Syncro var $log_public=''; //log message fuer Syncro var $sync_create=0; //anzahl der durchgefuehrten zuteilungen beim syncro var $group_update=0; //anzahl der updates an gruppen var $mdl_user_id; var $mdl_user_username; var $mdl_user_firstname; var $mdl_user_lastname; // ********************************************** // * moodle_user // * @param $conn Connection zur Vilesci DB // * $conn_moodle Connection zur Moodle DB // ********************************************** function moodle_user($conn, $conn_moodle) { $this->conn = $conn; $this->conn_moodle = $conn_moodle; $qry = "SET CLIENT_ENCODING TO 'LATIN9';"; pg_query($this->conn_moodle, $qry); } function loaduser($uid) { $qry = "SELECT * FROM public.mdl_user WHERE username='".addslashes($uid)."'"; if($result = pg_query($this->conn_moodle, $qry)) { if($row = pg_fetch_object($result)) { $this->mdl_user_id = $row->id; $this->mdl_user_username = $row->username; $this->mdl_user_firstname = $row->firstname; $this->mdl_user_lastname = $row->lastname; return true; } else { $this->errormsg = 'User wurde nicht gefunden: '.$uid; return false; } } else { $this->errormsg = 'Fehler beim Laden des Users'; return false; } } // *********************************************** // * Liefert ein Array mit allen Lektoren die // * zu dem Moodle Kurs zugeteilt sind // *********************************************** function getMitarbeiter($mdl_course_id) { //Mitarbeiter laden die zu diesem Kurs zugeteilt sind $qry = "SELECT mitarbeiter_uid FROM lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_moodle USING(lehreinheit_id) WHERE mdl_course_id='".addslashes($mdl_course_id)."' UNION SELECT mitarbeiter_uid FROM lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) JOIN lehre.tbl_moodle USING(lehrveranstaltung_id) WHERE tbl_lehreinheit.studiensemester_kurzbz=tbl_moodle.studiensemester_kurzbz AND mdl_course_id='".addslashes($mdl_course_id)."'"; $mitarbeiter=array(); if($result_ma = pg_query($this->conn, $qry)) { while($row_ma = pg_fetch_object($result_ma)) { $mitarbeiter[] = $row_ma->mitarbeiter_uid; } return $mitarbeiter; } } // ************************************************ // * Synchronisiert die Lektoren der Lehreinheiten // * mit denen des Moodle Kurses // * @param $mdl_course_id ID des MoodleKurses // * lehrveranstaltung_id wird nur angegeben beim Syncro von Testkursen // * studiensemester_kurzbz wird nur angegeben beim Syncro von Testkursen // * @return true wenn ok, false wenn Fehler // ************************************************ function sync_lektoren($mdl_course_id, $lehrveranstaltung_id=null, $studiensemester_kurzbz=null) { //Mitarbeiter laden die zu diesem Kurs zugeteilt sind if(!is_null($lehrveranstaltung_id) && !is_null($studiensemester_kurzbz)) { //Bei Testkursen werden alle Lektoren einer Lehrveranstaltung zugeteilt //da hier kein Eintrag in der tbl_moodle vorhanden ist, werden die Lektoren direkt aus //der tbl_lehreinheitmitarbeiter geholt. $qry = "SELECT mitarbeiter_uid FROM lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) WHERE lehrveranstaltung_id='".addslashes($lehrveranstaltung_id)."' AND studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."'"; } else { $qry = "SELECT mitarbeiter_uid FROM lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_moodle USING(lehreinheit_id) WHERE mdl_course_id='".addslashes($mdl_course_id)."' UNION SELECT mitarbeiter_uid FROM lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) JOIN lehre.tbl_moodle USING(lehrveranstaltung_id) WHERE tbl_lehreinheit.studiensemester_kurzbz=tbl_moodle.studiensemester_kurzbz AND mdl_course_id='".addslashes($mdl_course_id)."'"; } $mitarbeiter=''; if($result_ma = pg_query($this->conn, $qry)) { //Context des Kurses holen $mdlcourse = new moodle_course($this->conn, $this->conn_moodle); if(!$mdlcourse->getContext(50, $mdl_course_id)) { $this->errormsg = 'Fehler beim Laden des Contexts'; return false; } while($row_ma = pg_fetch_object($result_ma)) { //MoodleID des Users holen bzw ggf neu anlegen if(!$this->loaduser($row_ma->mitarbeiter_uid)) { //User anlegen if(!$this->createUser($row_ma->mitarbeiter_uid)) { $this->errormsg = "Fehler beim Anlegen des Users $row_ma->mitarbeiter_uid: $this->errormsg"; return false; } else $this->errormsg = ''; } if($mitarbeiter!='') $mitarbeiter.=','; $mitarbeiter.=$this->mdl_user_id; //Nachschauen ob dieser Lektor bereits zugeteilt ist $qry = "SELECT 1 FROM public.mdl_role_assignments WHERE userid='".addslashes($this->mdl_user_id)."' AND contextid='".addslashes($mdlcourse->mdl_context_id)."'"; if($result = pg_query($this->conn_moodle, $qry)) { if(pg_num_rows($result)==0) { //Mitarbeiter ist noch nicht zugeteilt. if($this->createZuteilung($this->mdl_user_id, $mdlcourse->mdl_context_id, 3)) { $this->log.="\nder Lektor $this->mdl_user_firstname $this->mdl_user_lastname wurde zum Kurs hinzugefügt"; $this->log_public.="\nder Lektor $this->mdl_user_firstname $this->mdl_user_lastname wurde zum Kurs hinzugefügt"; $this->sync_create++; } else $this->log.="\nFehler beim Anlegen der Lektoren-Zuteilung: $this->errormsg"; } } else { $this->errormsg = 'Fehler beim Auslesen der Rollen'; return false; } } //Lektoren loeschen die nicht mehr zugeordnet sind /* Derzeit werden zugeteilte Personen nicht geloescht $qry = "SELECT * FROM mdl_role_assignments WHERE contextid='".addslashes($mdlcourse->mdl_context_id)."' AND userid NOT in ($mitarbeiter)"; if($result = pg_query($this->conn_moodle, $qry)) { while($row = pg_fetch_object($result)) { $this->deleteZuteilung($row->userid, $mdlcourse->mdl_context_id); } } else { $this->errormsg = 'Fehler beim Ermitteln der Lektoren die nicht mehr zugeteilt sind'; return false; } */ return true; } else { $this->errormsg = 'Fehler beim Ermitteln der Zugeteilten Lektoren'; return false; } } // ************************************************ // * Synchronisiert die Studenten der Lehreinheiten // * mit denen des Moodle Kurses // * @param $mdl_course_id ID des MoodleKurses // * @return true wenn ok, false wenn Fehler // ************************************************ function sync_studenten($mdl_course_id) { //Studentengruppen laden die zu diesem Kurs zugeteilt sind $qry = "SELECT studiengang_kz, semester, verband, gruppe, gruppe_kurzbz, tbl_moodle.studiensemester_kurzbz, tbl_moodle.gruppen FROM lehre.tbl_lehreinheitgruppe JOIN lehre.tbl_moodle USING(lehreinheit_id) WHERE mdl_course_id='".addslashes($mdl_course_id)."' UNION SELECT studiengang_kz, semester, verband, gruppe, gruppe_kurzbz, tbl_moodle.studiensemester_kurzbz, tbl_moodle.gruppen FROM lehre.tbl_lehreinheitgruppe JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) JOIN lehre.tbl_moodle USING(lehrveranstaltung_id) WHERE tbl_lehreinheit.studiensemester_kurzbz=tbl_moodle.studiensemester_kurzbz AND mdl_course_id='".addslashes($mdl_course_id)."'"; $studenten=''; if($result_std = pg_query($this->conn, $qry)) { //Context des Kurses holen $mdlcourse = new moodle_course($this->conn, $this->conn_moodle); if(!$mdlcourse->getContext(50, $mdl_course_id)) { $this->errormsg = 'Fehler beim Laden des Contexts'; return false; } while($row_std = pg_fetch_object($result_std)) { //Schauen ob fuer diesen Kurs die Gruppen mitgesynct werden sollen $gruppensync = $row_std->gruppen=='t'?true:false; //Studenten dieser Gruppe holen if($row_std->gruppe_kurzbz=='') //LVB Gruppe { $qry = "SELECT distinct student_uid FROM public.tbl_studentlehrverband WHERE studiensemester_kurzbz='$row_std->studiensemester_kurzbz' AND studiengang_kz = '$row_std->studiengang_kz' AND semester = '$row_std->semester'"; if(trim($row_std->verband)!='') { $qry.=" AND verband = '$row_std->verband'"; if(trim($row_std->gruppe)!='') { $qry.=" AND gruppe = '$row_std->gruppe'"; } } $studiengang_obj = new studiengang($this->conn); $studiengang_obj->load($row_std->studiengang_kz); $gruppenbezeichnung = $studiengang_obj->kuerzel.'-'.trim($row_std->semester).trim($row_std->verband).trim($row_std->gruppe); } else //Spezialgruppe { $qry = "SELECT distinct uid as student_uid FROM public.tbl_benutzergruppe WHERE gruppe_kurzbz='$row_std->gruppe_kurzbz' AND studiensemester_kurzbz='$row_std->studiensemester_kurzbz' "; $gruppenbezeichnung = $row_std->gruppe_kurzbz; } if($result_user = pg_query($this->conn, $qry)) { while($row_user = pg_fetch_object($result_user)) { //MoodleID des Users holen bzw ggf neu anlegen if(!$this->loaduser($row_user->student_uid)) { //User anlegen if(!$this->createUser($row_user->student_uid)) { $this->errormsg = "Fehler beim Anlegen des Users $row_user->student_uid: $this->errormsg"; return false; } else $this->errormsg = ''; } if($studenten!='') $studenten.=','; $studenten.=$this->mdl_user_id; //Nachschauen ob dieser Student bereits zugeteilt ist $qry = "SELECT 1 FROM public.mdl_role_assignments WHERE userid='".addslashes($this->mdl_user_id)."' AND contextid='".addslashes($mdlcourse->mdl_context_id)."'"; if($result = pg_query($this->conn_moodle, $qry)) { if(pg_num_rows($result)==0) { //Student ist noch nicht zugeteilt. if($this->createZuteilung($this->mdl_user_id, $mdlcourse->mdl_context_id, 5)) { $this->log.="\nder Student $this->mdl_user_firstname $this->mdl_user_lastname wurde zum Kurs hinzugefügt"; $this->log_public.="\nder Student $this->mdl_user_firstname $this->mdl_user_lastname wurde zum Kurs hinzugefügt"; $this->sync_create++; } else $this->log.="\nFehler beim Anlegen der Studenten-Zuteilung: $this->errormsg"; } } else { $this->errormsg = 'Fehler beim Auslesen der Rollen'; return false; } //Gruppenzuteilung if($gruppensync) { //Schauen ob die Gruppe vorhanden ist if(!$groupid = $this->getGroup($mdl_course_id, $gruppenbezeichnung)) { //wenn nicht dann anlegen if(!$groupid = $this->createGroup($mdl_course_id, $gruppenbezeichnung)) continue; $this->group_update++; $this->log.="\nes wurde eine neue Gruppe angelgt: $gruppenbezeichnung"; $this->log_public.="\nes wurde eine neue Gruppe angelgt: $gruppenbezeichnung"; } //Schauen ob eine Zuteilung zu dieser Gruppe vorhanden ist if(!$this->getGroupMember($groupid, $this->mdl_user_id)) { //wenn nicht dann zuteilen $this->createGroupMember($groupid, $this->mdl_user_id); $this->group_update++; $this->log.="\nder Student $this->mdl_user_firstname $this->mdl_user_lastname wurde der Gruppe $gruppenbezeichnung zugeordnet"; $this->log_public.="\nder Student $this->mdl_user_firstname $this->mdl_user_lastname wurde der Gruppe $gruppenbezeichnung zugeordnet"; } } } } } //Studenten loeschen die nicht mehr zugeordnet sind /* Derzeit werden zugeteilte Personen nicht geloescht $qry = "SELECT * FROM mdl_role_assignments WHERE contextid='".addslashes($mdlcourse->mdl_context_id)."' AND userid NOT in ($studenten)"; if($result = pg_query($this->conn_moodle, $qry)) { while($row = pg_fetch_object($result)) { $this->deleteZuteilung($row->userid, $mdlcourse->mdl_context_id); } } else { $this->errormsg = 'Fehler beim Ermitteln der Studenten die nicht mehr zugeteilt sind'; return false; } */ return true; } else { $this->errormsg = 'Fehler beim Ermitteln der Zugeteilten Studenten'; return false; } } // ************************************************ // * Schaut ob eine Zuteilung von Person zu Gruppe // * existiert // * @param grouid ID der Gruppe // * userid ID des Users // * @return ID der Zuteilung // ************************************************ function getGroupMember($groupid, $userid) { $qry = "SELECT id FROM public.mdl_groups_members WHERE groupid='".addslashes($groupid)."' AND userid='".addslashes($userid)."'"; if($result = pg_query($this->conn_moodle, $qry)) { if($row = pg_fetch_object($result)) { return $row->id; } else { return false; } } else { $this->errormsg = 'Fehler beim Ermitteln der Gruppe'; return false; } } // *************************************************** // * Legt eine Zuteilung eines Users zu // * einer Gruppe an // * @param groupid ID der Gruppe // * userid ID des Users // * @return ID der Zuteilung oder false im Fehlerfall // *************************************************** function createGroupMember($groupid, $userid) { $qry = 'BEGIN; INSERT INTO public.mdl_groups_members(groupid, userid) VALUES('. $this->addslashes($groupid).','.$this->addslashes($userid).');'; if(pg_query($this->conn_moodle, $qry)) { $qry = "SELECT currval('mdl_groups_members_id_seq') as id"; if($result = pg_query($this->conn_moodle, $qry)) { if($row = pg_fetch_object($result)) { pg_query($this->conn_moodle, 'COMMIT;'); return $row->id; } else { pg_query($this->conn_moodle, 'ROLLBACK;'); $this->errormsg = 'Fehler beim Auslesen der Sequence'; return false; } } else { pg_query($this->conn_moodle, 'ROLLBACK;'); $this->errormsg = 'Fehler beim Auslesen der Sequence'; return false; } } else { $this->errormsg = 'Fehler beim Anlegen der Zuteilung'; return false; } } // ************************************************ // * Holt die ID einer MoodleGruppe // * @param $mdl_course_id ID des Kurses // * $gruppenbezeichnung Name der Gruppe // * @return GruppenID wenn ok, false im Fehlerfall // ************************************************ function getGroup($mdl_course_id, $gruppenbezeichnung) { $qry = "SELECT id FROM public.mdl_groups WHERE courseid='".addslashes($mdl_course_id)."' AND name='".addslashes($gruppenbezeichnung)."'"; if($result = pg_query($this->conn_moodle, $qry)) { if($row = pg_fetch_object($result)) { return $row->id; } else { $this->errormsg = "Gruppe wurde nciht gefunden $gruppenbezeichnung"; return false; } } else { $this->errormsg = 'Fehler beim Laden einer Gruppe'; return false; } } // **************************************************** // * Legt eine MoodleGruppe zu einem Kurs an // * @param mdl_course_id ID des MoodleKuses // * gruppenbezeichnung Bezeichnung der Gruppe // * @return ID der Gruppe wenn ok, false im Fehlerfall // **************************************************** function createGroup($mdl_course_id, $gruppenbezeichnung) { $qry = 'BEGIN;INSERT INTO public.mdl_groups(courseid, name, description) VALUES('. $this->addslashes($mdl_course_id).','. $this->addslashes($gruppenbezeichnung).','. $this->addslashes($gruppenbezeichnung).');'; if(pg_query($this->conn_moodle, $qry)) { $qry = "SELECT currval('mdl_groups_id_seq') as id"; if($result = pg_query($this->conn_moodle, $qry)) { if($row = pg_fetch_object($result)) { pg_query($this->conn_moodle, 'COMMIT;'); return $row->id; } else { pg_query($this->conn_moodle, 'ROLLBACK;'); $this->errormsg = 'Fehler beim Auslesen der GruppenSequence'; return false; } } else { pg_query($this->conn_moodle, 'ROLLBACK;'); $this->errormsg = 'Fehler beim Auslesen der GruppenSequence'; return false; } } else { $this->errormsgr ='Fehler beim Anlegen der Gruppe'; return false; } } // ************************************************ // * wenn $var '' ist wird "null" zurueckgegeben // * wenn $var !='' ist werden datenbankkritische // * Zeichen mit backslash versehen und das Ergebnis // * unter Hochkomma gesetzt. // ************************************************ function addslashes($var) { return ($var!=''?"'".addslashes($var)."'":'null'); } // ******************************************** // * Legt einen User im Moodle an // * @param $uid UID der Person die angelegt werden soll // * @return true wenn ok, false wenn Fehler // ******************************************** function createUser($uid) { $qry = "SELECT uid, vorname, nachname FROM campus.vw_benutzer WHERE uid='".addslashes($uid)."'"; if($result = pg_query($this->conn, $qry)) { if($row = pg_fetch_object($result)) { $username = $row->uid; $vorname = $row->vorname; $nachname = $row->nachname; $qry = "BEGIN; INSERT INTO public.mdl_user(auth, username, idnumber, firstname, lastname, email, mnethostid, confirmed, lang) VALUES('ldap', ". $this->addslashes($username).", ". $this->addslashes($username).",". $this->addslashes($vorname).",". $this->addslashes($nachname).",". $this->addslashes($username.'@'.DOMAIN).", 1, 1, 'de_utf8');"; if(pg_query($this->conn_moodle, $qry)) { $qry ="SELECT currval('mdl_user_id_seq') as id;"; if($result = pg_query($this->conn_moodle, $qry)) { if($row = pg_fetch_object($result)) { pg_query($this->conn_moodle, 'COMMIT;'); $this->mdl_user_id = $row->id; return true; } else { pg_query($this->conn_moodle,'ROLLBACK'); $this->errormsg = 'Fehler beim Lesen der Sequence'; return false; } } else { pg_query($this->conn_moodle,'ROLLBACK'); $this->errormsg = 'Fehler beim Lesen der Sequence'; return false; } } else { pg_query($this->conn_moodle,'ROLLBACK'); $this->errormsg = 'Fehler beim Anlegen des Users'; return false; } } else { $this->errormsg = 'User wurde nicht gefunden: '.$uid; return false; } } else { $this->errormsg = 'Fehler beim Laden des Users'; return false; } } // ********************************************* // * Teilt den User mit der ID $mdl_user_id zum // * Kurs mit der ContextID $mdl_context_id zu. // * @param $mdl_user_id Moodle ID des Users // * $mdl_context_id ContextID des Kurses // * $role Rolle der Zuteilung (1=Admin/3=Lektor/5=Student) // * @return true wenn ok, false wenn Fehler // ********************************************* function createZuteilung($mdl_user_id, $mdl_context_id, $role) { $qry = "INSERT INTO public.mdl_role_assignments(roleid, contextid, userid) VALUES(". $this->addslashes($role).",". $this->addslashes($mdl_context_id).",". $this->addslashes($mdl_user_id).");"; if(pg_query($this->conn_moodle, $qry)) { return true; } else { $this->errormsg = 'Fehler beim Speichern der Zuteilung'; return false; } } // ********************************************* // * Fuegt dem User die globale Gastrolle hinzu // * @param $mdl_user_id Moodle ID des Users der // * die GastRolle bekommt // * @return true wenn ok, false wenn Fehler // ********************************************* function createGlobaleGastrolle($mdl_user_id) { //Nachschauen ob diese Person bereits eine globale Gastrolle hat $qry = "SELECT 1 FROM public.mdl_role_assignments WHERE userid='".addslashes($mdl_user_id)."' AND contextid='1' AND roleid='6'"; if($result = pg_query($this->conn_moodle, $qry)) { if(pg_num_rows($result)==0) { //noch nicht zugeteilt if($this->createZuteilung($mdl_user_id, 1, 6)) { $this->log.="\n$this->mdl_user_firstname $this->mdl_user_lastname wurde die globale Gastrolle zugeteilt"; $this->log_public.="\n$this->mdl_user_firstname $this->mdl_user_lastname wurde die globale Gastrolle zugeteilt"; } else $this->log.="\nFehler beim Anlegen der Gast-Zuteilung: $this->errormsg"; } } else { $this->errormsg = 'Fehler beim Auslesen der Rollen'; return false; } } // ************************************************* // * Loescht die Zuteilung eines Users zu einem Kurs // * @param $mdl_user_id MoodleID des Users // * $mdl_context_id ContextID des Users // * @return true wenn ok, false wenn Fehler // ************************************************* function deleteZuteilung($mdl_user_id, $mdl_context_id) { $qry = "DELETE FROM public.mdl_role_assignments WHERE userid='".addslashes($mdl_user_id)."' AND contextid='".addslashes($mdl_context_id)."'"; if(pg_query($this->conn_moodle, $qry)) return true; else { $this->errormsg = 'Fehler beim Loeschen der Zuteilung'; return false; } } // ******************************************************* // * Teilt die TestStudenten zu einem Testkurs zu // * @param mdl_course_id ID des Moodle Kurses // ******************************************************* function createTestStudentenZuordnung($mdl_course_id) { //Context des Kurses holen $mdlcourse = new moodle_course($this->conn, $this->conn_moodle); if(!$mdlcourse->getContext(50, $mdl_course_id)) { $this->errormsg = 'Fehler beim Laden des Contexts'; return false; } $users = array('student1', 'student2', 'student3'); foreach ($users as $row_user) { //MoodleID des Users holen if(!$this->loaduser($row_user)) { $this->errormsg = "Fehler beim Laden des Users $row_user: $this->errormsg"; return false; } //Nachschauen ob dieser Student bereits zugeteilt ist $qry = "SELECT 1 FROM public.mdl_role_assignments WHERE userid='".addslashes($this->mdl_user_id)."' AND contextid='".addslashes($mdlcourse->mdl_context_id)."'"; if($result = pg_query($this->conn_moodle, $qry)) { if(pg_num_rows($result)==0) { //Student ist noch nicht zugeteilt. if($this->createZuteilung($this->mdl_user_id, $mdlcourse->mdl_context_id, 5)) { $this->log.="\nder Student $this->mdl_user_firstname $this->mdl_user_lastname wurde zum Kurs hinzugefügt"; $this->log_public.="\nder Student $this->mdl_user_firstname $this->mdl_user_lastname wurde zum Kurs hinzugefügt"; $this->sync_create++; } else $this->log.="\nFehler beim Anlegen der Studenten-Zuteilung: $this->errormsg"; } } else { $this->errormsg = 'Fehler beim Auslesen der Rollen'; return false; } } return true; } }