From 406be358e90cc545d4e74952010bf7254502b2b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Fri, 8 Mar 2013 09:46:39 +0000 Subject: [PATCH] Erstversion Moodle2.4 Syncronisation --- cis/private/lehre/moodle2_4_wartung.php | 383 ++++ include/lehreinheitmitarbeiter.class.php | 41 +- include/moodle2_4_course.class.php | 1763 +++++++++++++++++ include/moodle2_4_user.class.php | 563 ++++++ include/variable.class.php | 2 +- system/moodlePlugin/fhcompletews/README | 23 + .../moodlePlugin/fhcompletews/db/services.php | 44 + .../moodlePlugin/fhcompletews/externallib.php | 484 +++++ .../fhcompletews/lang/en/local_wstemplate.php | 25 + system/moodlePlugin/fhcompletews/version.php | 24 + 10 files changed, 3350 insertions(+), 2 deletions(-) create mode 100644 cis/private/lehre/moodle2_4_wartung.php create mode 100644 include/moodle2_4_course.class.php create mode 100644 include/moodle2_4_user.class.php create mode 100644 system/moodlePlugin/fhcompletews/README create mode 100644 system/moodlePlugin/fhcompletews/db/services.php create mode 100644 system/moodlePlugin/fhcompletews/externallib.php create mode 100644 system/moodlePlugin/fhcompletews/lang/en/local_wstemplate.php create mode 100644 system/moodlePlugin/fhcompletews/version.php diff --git a/cis/private/lehre/moodle2_4_wartung.php b/cis/private/lehre/moodle2_4_wartung.php new file mode 100644 index 000000000..67bbbc706 --- /dev/null +++ b/cis/private/lehre/moodle2_4_wartung.php @@ -0,0 +1,383 @@ + + */ +/* + * Verwaltung der Moodlekurse zu einer LV + * Moodle 2.4 + */ +require_once('../../../config/cis.config.inc.php'); +require_once('../../../include/basis_db.class.php'); +require_once('../../../include/functions.inc.php'); +require_once('../../../include/benutzerberechtigung.class.php'); +require_once('../../../include/moodle2_4_course.class.php'); +require_once('../../../include/moodle2_4_user.class.php'); +require_once('../../../include/lehrveranstaltung.class.php'); +require_once('../../../include/lehreinheit.class.php'); +require_once('../../../include/lehreinheitgruppe.class.php'); +require_once('../../../include/lehreinheitmitarbeiter.class.php'); +require_once('../../../include/studiengang.class.php'); +require_once('../../../include/phrasen.class.php'); + +$sprache = getSprache(); +$p = new phrasen($sprache); + +if (!$db = new basis_db()) + die($p->t('global/fehlerBeimOeffnenDerDatenbankverbindung')); + +if (!$user=get_uid()) + die($p->t('moodle/sieSindNichtAngemeldet').' !'); + +if(isset($_GET['lvid']) && is_numeric($_GET['lvid'])) + $lvid=$_GET['lvid']; +else + die($p->t('moodle/lvidMussUebergebenWerden')); + +if(isset($_GET['stsem']) && check_stsem($_GET['stsem'])) + $stsem = $_GET['stsem']; +else + die($p->t('moodle/esWurdeKeinStudiensemesterUebergeben')); + +$art = (isset($_POST['art'])?$_POST['art']:'lv'); + +$berechtigt = false; + +//Pruefen ob Rechte fuer diese LV vorhanden sind +$lem = new lehreinheitmitarbeiter(); +if($lem->existsLV($lvid, $stsem, $user)) + $berechtigt=true; + +$rechte = new benutzerberechtigung(); +$rechte->getBerechtigungen($user); + +if($rechte->isBerechtigt('admin')) + $berechtigt=true; + +$lv = new lehrveranstaltung(); +$lv->load($lvid); + +echo ' + + + + + + + +

'.$db->convert_html_chars($lv->bezeichnung).' ('.$db->convert_html_chars($stsem).')

+
+ + +'; + +echo '
'; + +if(isset($_POST['neu'])) +{ + if($_POST['bezeichnung']=='') + { + echo ''.$p->t('benotungstool/bezeichnungMussEingegebenWerden').'
'; + } + else + { + $lehrveranstaltung = new lehrveranstaltung(); + $lehrveranstaltung->load($lvid); + $studiengang = new studiengang(); + $studiengang->load($lehrveranstaltung->studiengang_kz); + + $orgform = ($lehrveranstaltung->orgform_kurzbz!=''?$lehrveranstaltung->orgform_kurzbz:$studiengang->orgform_kurzbz); + + //Kurzbezeichnung generieren Format: STSEM-STG-SEM-LV/LEID/LEID/LEID... + //$shortname = $stsem.'-'.$studiengang->kuerzel.'-'.$lehrveranstaltung->semester.'-'.$lehrveranstaltung->kurzbz; + $shortname = $studiengang->kuerzel.'-'.$orgform.'-'.$lehrveranstaltung->semester.'-'.$stsem.'-'.$lehrveranstaltung->kurzbz; + + //Gesamte LV zu einem Moodle Kurs zusammenlegen + if($art=='lv') + { + $mdl_course = new moodle_course(); + + $mdl_course->lehrveranstaltung_id = $lvid; + $mdl_course->studiensemester_kurzbz = $stsem; + $mdl_course->mdl_fullname = $_POST['bezeichnung']; + $mdl_course->mdl_shortname = $shortname; + $mdl_course->insertamum = date('Y-m-d H:i:s'); + $mdl_course->insertvon = $user; + $mdl_course->gruppen = isset($_POST['gruppen']); + + //Moodlekurs anlegen + if($mdl_course->create_moodle()) + { + //Eintrag in der Vilesci DB + $mdl_course->create_vilesci(); + + $mdl_user = new moodle_user(); + //Lektoren Synchronisieren + if(!$mdl_user->sync_lektoren($mdl_course->mdl_course_id)) + echo $mdl_user->errormsg; + + $mdl_user = new moodle_user(); + //Studenten Synchronisieren + if(!$mdl_user->sync_studenten($mdl_course->mdl_course_id)) + echo $mdl_user->errormsg; + } + else + { + echo $mdl_course->errormsg; + } + } + elseif($art=='le') //Getrennte Kurse fuer die Lehreinheiten + { + $lehreinheiten=array(); + + foreach ($_POST as $key=>$value) + { + if(mb_strstr($key, 'lehreinheit_')) + { + $shortname.='/'.$value; + $lehreinheiten[]=$value; + } + } + + if(count($lehreinheiten)>0) + { + $mdl_course = new moodle_course(); + + $mdl_course->mdl_fullname = $_POST['bezeichnung']; + $mdl_course->mdl_shortname = $shortname; + $mdl_course->studiensemester_kurzbz = $stsem; + $mdl_course->insertamum = date('Y-m-d H:i:s'); + $mdl_course->insertvon = $user; + $mdl_course->lehreinheit_id=$lehreinheiten[0]; + $mdl_course->gruppen = isset($_POST['gruppen']); + + //Kurs im Moodle anlegen + if($mdl_course->create_moodle()) + { + //fuer jede Lehreinheit einen Eintrag in VilesciDB anlegen + foreach ($lehreinheiten as $value) + { + $mdl_course->lehreinheit_id = $value; + if(!$mdl_course->create_vilesci()) + echo '
'.$p->t('moodle/fehlerBeimAnlegenAufgetreten').':'.$mdl_course->errormsg; + } + + $mdl_user = new moodle_user(); + //Lektoren Synchronisieren + if(!$mdl_user->sync_lektoren($mdl_course->mdl_course_id)) + echo $mdl_user->errormsg; + + $mdl_user = new moodle_user(); + //Studenten Synchronisieren + if(!$mdl_user->sync_studenten($mdl_course->mdl_course_id)) + echo $mdl_user->errormsg; + } + } + else + { + echo ''.$p->t('moodle/esMussMindestensEineLehreinheitMarkiertSein').'
'; + } + } + else + die($p->t('moodle/artIstUnbekannt')); + } +} +//Gruppen Syncro ein/aus schalten +if(isset($_POST['changegruppe'])) +{ + if(isset($_POST['moodle_id']) && is_numeric($_POST['moodle_id'])) + { + $mcourse = new moodle_course(); + if($mcourse->updateGruppenSync($_POST['moodle_id'], isset($_POST['gruppen']))) + echo ''.$p->t('moodle/datenWurdenAktualisiert').'
'; + else + echo ''.$p->t('global/fehlerBeimAktualisierenDerDaten').''; + } + else + { + echo ''.$p->t('moodle/esWurdeKeineGueltigeIdUebergeben').''; + } +} + +//Anlegen eines Testkurses +if(isset($_GET['action']) && $_GET['action']=='createtestkurs') +{ + $mdl_course = new moodle_course(); + if(!$mdl_course->loadTestkurs($lvid, $stsem)) + { + $lehrveranstaltung = new lehrveranstaltung(); + $lehrveranstaltung->load($lvid); + $studiengang = new studiengang(); + $studiengang->load($lehrveranstaltung->studiengang_kz); + + //$orgform = ($lehrveranstaltung->orgform_kurzbz!=''?$lehrveranstaltung->orgform_kurzbz:$studiengang->orgform_kurzbz); + + //Kurzbezeichnung generieren Format: STSEM-STG-SEM-LV/LEID/LEID/LEID... + $shortname = 'TK-'.$stsem.'-'.$studiengang->kuerzel.'-'.$lehrveranstaltung->semester.'-'.$lehrveranstaltung->kurzbz; + + $mdl_course->lehrveranstaltung_id = $lvid; + $mdl_course->studiensemester_kurzbz = $stsem; + $mdl_course->mdl_fullname = 'Testkurs - '.$lehrveranstaltung->bezeichnung; + $mdl_course->mdl_shortname = $shortname; + + //TestKurs erstellen + if($mdl_course->createTestkurs($lvid, $stsem)) + { + $id=$mdl_course->mdl_course_id; + $errormsg=''; + + $mdl_user = new moodle_user(); + //Lektoren zuweisen + if(!$mdl_user->sync_lektoren($id, $lvid, $stsem)) + $errormsg.=$p->t('moodle/fehlerBeiDerLektorenZuordnung').':'.$mdl_user->errormsg.'
'; + //Teststudenten zuweisen + if(!$mdl_user->createTestStudentenZuordnung($id)) + $errormsg.=$p->t('moodle/fehlerBeiDerStudentenZuordnung').':'.$mdl_user->errormsg.'
'; + + if($errormsg!='') + echo $errormsg; + else + echo ''.$p->t('moodle/testkursWurdeErfolgreichAngelegt').'
'; + } + } + else + { + echo ''.$p->t('moodle/esExistiertBereitsEinTestkurs').'
'; + } +} + +$mdl_course = new moodle_course(); +if($mdl_course->course_exists_for_lv($lvid, $stsem) || $mdl_course->course_exists_for_allLE($lvid, $stsem)) +{ + echo $p->t('moodle/esIstBereitsEinMoodleKursVorhanden'); +} +else +{ + //wenn bereits ein Moodle Kurs fuer eine Lehreinheit angelegt wurde, dann dass + //anlegen fuer die Lehrveranstaltung verhindern + $qry = "SELECT 1 FROM lehre.tbl_moodle + WHERE lehreinheit_id in(SELECT lehreinheit_id FROM lehre.tbl_lehreinheit + WHERE lehrveranstaltung_id=".$db->db_add_param($lvid, FHC_INTEGER)." + AND studiensemester_kurzbz=".$db->db_add_param($stsem).")"; + $disable_lv=''; + if($result = $db->db_query($qry)) + if($db->db_num_rows($result)>0) + { + $disable_lv='disabled="true"'; + //wenn schon ein Moodle Kurs zu einer Lehreinheit angelegt wurde, + //dann ist standardmaessig die Lehreinheit markiert + if($art=='lv') + $art='le'; + } + + echo ''.$p->t('moodle/moodleKursAnlegen').':

+
+ einen Moodle Kurs für die gesamte LV anlegen
+ einen Moodle Kurs für einzelne Lehreinheiten anlegen + '; + + $le = new lehreinheit(); + $le->load_lehreinheiten($lv->lehrveranstaltung_id, $stsem); + echo ''; + + $studiengang = new studiengang(); + $studiengang->load($lv->studiengang_kz); + $orgform = ($lv->orgform_kurzbz!=''?$lv->orgform_kurzbz:$studiengang->orgform_kurzbz); + $longbezeichnung = $studiengang->kuerzel.'-'.$orgform.'-'.$lv->semester.'-'.$stsem.' - '.$lv->bezeichnung; + + echo '
'.$p->t('moodle/kursbezeichnung').': '; + echo '
'.$p->t('moodle/gruppenUebernehmen').': '; + echo '

+
'; +} +echo '
'; +echo ''.$p->t('moodle/vorhandeneMoodleKurse').''; +if(!$mdl_course->getAll($lvid, $stsem)) + echo $mdl_course->errormsg; +echo ''; +foreach ($mdl_course->result as $course) +{ + echo ''; + echo ''; + echo ""; +} +echo '
'.$course->mdl_fullname.'
gruppen?'checked':'').">Gruppen übernehmen
'; +echo '
'; + +echo '


'; +echo ''.$p->t('moodle/testkurse').'

'; +$mdlcourse = new moodle_course(); +if($mdlcourse->loadTestkurs($lvid, $stsem)) +{ + echo ''.$db->convert_html_chars($mdlcourse->mdl_fullname).''; +} +else +{ + echo "".$p->t('moodle/klickenSieHierUmTestkursErstellen').""; +} +echo ' + +'; +?> diff --git a/include/lehreinheitmitarbeiter.class.php b/include/lehreinheitmitarbeiter.class.php index eb15c54d8..79e06bd33 100644 --- a/include/lehreinheitmitarbeiter.class.php +++ b/include/lehreinheitmitarbeiter.class.php @@ -314,6 +314,45 @@ class lehreinheitmitarbeiter extends basis_db } } + /** + * Prueft ob ein Mitarbeiter einer LV zugeordnet ist + * @param $lehrveranstaltung_id + * @param $studiensemester_kurzbz + * @param $uid + * @return true wenn die Zuteilung existiert sonst false + */ + public function existsLV($lehrveranstaltung_id, $studiensemester_kurzbz, $uid) + { + if(!is_numeric($lehrveranstaltung_id)) + { + $this->errormsg = 'lehrveranstaltung_id muss eine gueltige Zahl sein'; + return false; + } + + $qry = "SELECT + 1 + FROM + lehre.tbl_lehreinheitmitarbeiter + JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + WHERE + lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER)." + AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)." + AND mitarbeiter_uid=".$this->db_add_param($uid).';'; + + if($this->db_query($qry)) + { + if($this->db_num_rows()>0) + return true; + else + return false; + } + else + { + $this->errormsg = 'Fehler beim Lesen der Lehreinheitmitarbeiterzuteilung'; + return false; + } + } + /** * Loescht die Zuteilung eines Mitarbeiters * zu einer Lehreinheit @@ -391,4 +430,4 @@ class lehreinheitmitarbeiter extends basis_db } } } -?> \ No newline at end of file +?> diff --git a/include/moodle2_4_course.class.php b/include/moodle2_4_course.class.php new file mode 100644 index 000000000..44f6b7c87 --- /dev/null +++ b/include/moodle2_4_course.class.php @@ -0,0 +1,1763 @@ + and + */ +/* + * Moodle 2.4 Connector Klasse + * + * FHComplete Moodle Plugin muss installiert sein fuer + * Webservice Funktion 'fhcomplete_courses_by_shortname' + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); + +class moodle_course extends basis_db +{ + public $result = array(); + public $serverurl; + + //Vilesci Attribute + public $moodle_id; + public $mdl_course_id; + public $lehreinheit_id; + public $lehrveranstaltung_id; + public $studiensemester_kurzbz; + public $insertamum; + public $insertvon; + public $gruppen; + + //Moodle Attribute + public $mdl_fullname; + public $mdl_shortname; + + + //DEPRECATED ? + /* + public $mdl_context_id; + public $mdl_context_level; + public $mdl_context_instanceid; + public $mdl_context_path; + public $mdl_context_depth; + */ + + public $lehrveranstaltung_bezeichnung; + public $lehrveranstaltung_semester; + public $lehrveranstaltung_studiengang_kz; + + // Kurs Resourcen - Anzahl + public $mdl_benotungen; + public $mdl_resource; + public $mdl_quiz; + public $mdl_chat; + public $mdl_forum; + public $mdl_choice; + + public $note; + + /** + * Konstruktor + * + */ + public function __construct() + { + $this->serverurl=MOODLE_PATH24.'/webservice/soap/server.php?wsdl=1&wstoken='.MOODLE_TOKEN24.'&'.microtime(true); + return true; + } + + /** + * Laedt einen MoodleKurs + * @param mdl_course_id ID des Moodle Kurses + * @return true wenn ok, false im Fehlerfall + */ + public function load($mdl_course_id=null) + { + $this->mdl_fullname = ''; + $this->mdl_shortname = ''; + + $this->errormsg=''; + $this->result=array(); + + if (!is_null($mdl_course_id)) + $this->mdl_course_id=$mdl_course_id; + if (is_null($this->mdl_course_id) + || empty($this->mdl_course_id) + || !is_numeric($this->mdl_course_id)) + { + $this->errormsg='Moodle Kurs ID fehlt'; + return false; + } + + $client = new SoapClient($this->serverurl); + $response = $client->core_course_get_courses(array($this->mdl_course_id)); + + if($response) + { + if(isset($response[0])) + { + $this->mdl_fullname = $response[0]['fullname']; + $this->mdl_shortname = $response[0]['shortname']; + $this->mdl_course_id = $response[0]['id']; + return true; + } + else + { + $this->errormsg = 'Kurs wurde nicht gefunden'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Laden des Kurses'; + return false; + } + } + + /** + * Laedt einen MoodleKurs + * @param mdl_course_id ID des Moodle Kurses + * @return true wenn ok, false im Fehlerfall + */ + public function loadMoodle($mdl_course_id=null) + { + return $this->load($mdl_course_id); + } + + /** + * Laedt alle MoodleKurse die zu einer LV/Stsem + * plus die MoodleKurse die auf dessen LE haengen + * @param lehrveranstaltung_id + * studiensemester_kurzbz + * @return true wenn ok, false im Fehlerfall + */ + public function getAll($lehrveranstaltung_id, $studiensemester_kurzbz) + { + $qry = "SELECT + distinct on(mdl_course_id) * + FROM + lehre.tbl_lehrveranstaltung, lehre.tbl_lehreinheit, lehre.tbl_moodle + WHERE + tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id AND + tbl_lehrveranstaltung.lehrveranstaltung_id = ".$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER)." AND + tbl_lehreinheit.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)." AND + ((tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_moodle.lehrveranstaltung_id AND tbl_moodle.studiensemester_kurzbz=tbl_lehreinheit.studiensemester_kurzbz) + OR + (tbl_lehreinheit.lehreinheit_id=tbl_moodle.lehreinheit_id) + )"; + + if($result=$this->db_query($qry)) + { + while($row = $this->db_fetch_object($result)) + { + $obj = new moodle_course(); + + $obj->moodle_id = $row->moodle_id; + $obj->mdl_course_id = $row->mdl_course_id; + $obj->lehreinheit_id = $row->lehreinheit_id; + $obj->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->gruppen = $this->db_parse_bool($row->gruppen); + + $client = new SoapClient($this->serverurl); + $response = $client->core_course_get_courses(array('ids'=>array($row->mdl_course_id))); + + if($response) + { + if(isset($response[0])) + { + $obj->mdl_fullname = $response[0]['fullname']; + $obj->mdl_shortname = $response[0]['shortname']; + $obj->mdl_course_id = $response[0]['id']; + } + } + + $this->result[] = $obj; + } + return true; + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } + + + /** + * Laedt alle MoodleKurse die zu einer LV/Stsem + * plus die MoodleKurse die auf dessen LE haengen + * @param lehrveranstaltung_id + * studiensemester_kurzbz + * @return true wenn ok, false im Fehlerfall + */ + public function getAllVariant($lehrveranstaltung_id='',$studiensemester_kurzbz='',$studiengang='',$semester='',$detail=false) + { + // Initialisierung + $this->errormsg = ''; + $this->result=array(); + + $qry = "SELECT distinct tbl_lehreinheit.studiensemester_kurzbz,tbl_lehrveranstaltung.semester + ,tbl_lehrveranstaltung.bezeichnung,tbl_lehrveranstaltung.kurzbz,tbl_lehrveranstaltung.lehrveranstaltung_id,tbl_lehrveranstaltung.studiengang_kz,tbl_lehrveranstaltung.semester + ,tbl_moodle.mdl_course_id + FROM lehre.tbl_lehrveranstaltung, lehre.tbl_lehreinheit,lehre.tbl_moodle + where tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id + and ((tbl_moodle.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id + and tbl_moodle.studiensemester_kurzbz=lehre.tbl_lehreinheit.studiensemester_kurzbz) + OR + (tbl_moodle.lehreinheit_id=tbl_lehreinheit.lehreinheit_id))"; + + if ($lehrveranstaltung_id!='') + $qry.=" and tbl_lehrveranstaltung.lehrveranstaltung_id='".addslashes($lehrveranstaltung_id)."' "; + + if ($studiensemester_kurzbz!='') + $qry.=" and tbl_lehreinheit.studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."' "; + + if ($studiengang!='') + $qry.=" and tbl_lehrveranstaltung.studiengang_kz='".addslashes($studiengang)."' "; + + if ($semester!='') + $qry.=" and tbl_lehrveranstaltung.semester='".addslashes($semester)."' "; + + $qry.=";"; + + if(!$result = $this->db_query($qry)) + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + + while($row = $this->db_fetch_object($result)) + { + $obj = new moodle_course($this->conn_moodle); + + $obj->mdl_course_id = $row->mdl_course_id; + $obj->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $obj->lehrveranstaltung_kurzbz=$row->kurzbz; + + $obj->lehrveranstaltung_bezeichnung=$row->bezeichnung; + $obj->lehrveranstaltung_semester=$row->semester; + $obj->lehrveranstaltung_studiengang_kz=$row->studiengang_kz; + + $obj->mdl_fullname = 'DB fehler ID '.$obj->mdl_course_id; + $obj->mdl_shortname =$obj->mdl_fullname; + + // Anzahl Benotungen + $obj->mdl_benotungen = 0; + // Anzahl Aktivitaeten und Lehrmaterial + $obj->mdl_resource = 0; + $obj->mdl_quiz = 0; + $obj->mdl_chat = 0; + $obj->mdl_forum = 0; + $obj->mdl_choice= 0; + + $moddle= new moodle_course(); + if ($moddle->load($obj->mdl_course_id)) + { + $obj->mdl_fullname = $moddle->mdl_fullname; + $obj->mdl_shortname = $moddle->mdl_shortname; + } + else + { + $obj->mdl_fullname =$moddle->errormsg; + $obj->mdl_course_id = 0; + $this->result[] = $obj; + continue; + } + + if(!$detail) + { + $this->result[] = $obj; + continue; + } + + // Anzahl Noten je Kurs und User + $qry_mdl = "SELECT count(*) as anz + FROM mdl_grade_grades , mdl_grade_items + WHERE mdl_grade_items.itemtype='course' + AND mdl_grade_grades.finalgrade IS NOT NULL + AND mdl_grade_grades.itemid=mdl_grade_items.id + AND mdl_grade_items.courseid ='".addslashes($row->mdl_course_id)."'; "; + + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_benotungen = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + + $qry_mdl = "SELECT count(course) as anz FROM public.mdl_chat WHERE mdl_chat.course='".addslashes($row->mdl_course_id)."'; "; + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_chat = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + $qry_mdl = "SELECT count(course) as anz FROM public.mdl_resource WHERE mdl_resource.course='".addslashes($row->mdl_course_id)."'; "; + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_resource = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + + $qry_mdl = "SELECT count(course) as anz FROM public.mdl_quiz WHERE mdl_quiz.course='".addslashes($row->mdl_course_id)."'; "; + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_quiz = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + $qry_mdl = "SELECT count(course) as anz FROM public.mdl_forum WHERE mdl_forum.course='".addslashes($row->mdl_course_id)."'; "; + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_forum = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + $qry_mdl = "SELECT count(course) as anz FROM public.mdl_choice WHERE mdl_choice.course='".addslashes($row->mdl_course_id)."'; "; + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_choice = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + + $this->result[] = $obj; + } + return true; + } + + /** + * Laedt alle MoodleKurse die zu einer LV/Stsem + * plus die MoodleKurse die auf dessen LE haengen + * @param lehrveranstaltung_id + * studiensemester_kurzbz + * @return true wenn ok, false im Fehlerfall + */ + public function getAllMoodleVariant($mdl_course_id='',$lehrveranstaltung_id='',$studiensemester_kurzbz='',$lehreinheit_id='',$studiengang='',$semester='',$detail=false,$lehre=true,$aktiv=true) + { + // Initialisierung + $this->errormsg = ''; + $this->result=array(); + +/* $qry = "SELECT distinct tbl_moodle.lehrveranstaltung_id as moodle_lehrveranstaltung_id,tbl_moodle.lehreinheit_id as moodle_lehreinheit_id, tbl_moodle.studiensemester_kurzbz,tbl_lehrveranstaltung.semester + ,tbl_lehrveranstaltung.bezeichnung,tbl_lehrveranstaltung.kurzbz,tbl_lehrveranstaltung.lehrveranstaltung_id,tbl_lehrveranstaltung.studiengang_kz,tbl_lehrveranstaltung.semester + ,tbl_moodle.mdl_course_id,tbl_moodle.lehreinheit_id,tbl_moodle.gruppen + FROM lehre.tbl_lehrveranstaltung, lehre.tbl_lehreinheit,lehre.tbl_moodle + where tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id + and ((tbl_moodle.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id + and tbl_moodle.studiensemester_kurzbz=lehre.tbl_lehreinheit.studiensemester_kurzbz) + OR + (tbl_moodle.lehreinheit_id=tbl_lehreinheit.lehreinheit_id))"; +*/ + $where=''; + if ($mdl_course_id!='') + $where.=" and tbl_moodle.mdl_course_id='".addslashes($mdl_course_id)."' "; + + if ($lehreinheit_id!='') + $where.=" and tbl_lehreinheit.lehreinheit_id='".addslashes($lehreinheit_id)."' "; + + if ($lehrveranstaltung_id!='') + $where.=" and tbl_lehrveranstaltung.lehrveranstaltung_id='".addslashes($lehrveranstaltung_id)."' "; + + if ($studiensemester_kurzbz!='') + $where.=" and tbl_lehreinheit.studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."' "; + + if ($studiengang!='') + $where.=" and tbl_lehrveranstaltung.studiengang_kz='".addslashes($studiengang)."' "; + + if ($semester!='') + $where.=" and tbl_lehrveranstaltung.semester='".addslashes($semester)."' "; + + if ($lehre) + $where.=" and tbl_lehrveranstaltung.lehre "; + + if ($aktiv) + $where.=" and tbl_lehrveranstaltung.aktiv "; + + $qry =''; + $qry.=' SELECT distinct tbl_moodle.studiensemester_kurzbz + ,tbl_lehrveranstaltung.studiengang_kz + ,tbl_lehrveranstaltung.semester + ,tbl_moodle.mdl_course_id + ,tbl_lehrveranstaltung.lehrveranstaltung_id + ,tbl_moodle.lehreinheit_id as moodle_lehreinheit_id + ,tbl_moodle.lehrveranstaltung_id as moodle_lehrveranstaltung_id + ,tbl_moodle.lehreinheit_id as lehreinheit_id,tbl_lehrveranstaltung.bezeichnung,tbl_lehrveranstaltung.kurzbz,tbl_moodle.gruppen + ,tbl_lehrveranstaltung.lehrform_kurzbz,tbl_lehrveranstaltung.orgform_kurzbz + ,tbl_moodle.moodle_id + FROM lehre.tbl_lehrveranstaltung, lehre.tbl_lehreinheit,lehre.tbl_moodle + + where tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_moodle.lehrveranstaltung_id + and tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_moodle.lehrveranstaltung_id + and tbl_moodle.studiensemester_kurzbz=tbl_lehreinheit.studiensemester_kurzbz + and tbl_moodle.lehreinheit_id is null + '; + $qry.=$where; + + $qry.=' UNION '; + $qry.=' SELECT distinct tbl_moodle.studiensemester_kurzbz + ,tbl_lehrveranstaltung.studiengang_kz + ,tbl_lehrveranstaltung.semester + ,tbl_moodle.mdl_course_id + ,tbl_lehrveranstaltung.lehrveranstaltung_id + ,tbl_moodle.lehreinheit_id as moodle_lehreinheit_id + ,tbl_moodle.lehrveranstaltung_id as moodle_lehrveranstaltung_id + ,tbl_moodle.lehreinheit_id as lehreinheit_id,tbl_lehrveranstaltung.bezeichnung,tbl_lehrveranstaltung.kurzbz,tbl_moodle.gruppen + ,tbl_lehrveranstaltung.lehrform_kurzbz,tbl_lehrveranstaltung.orgform_kurzbz + ,tbl_moodle.moodle_id + FROM lehre.tbl_lehrveranstaltung, lehre.tbl_lehreinheit,lehre.tbl_moodle + + where tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id + and tbl_moodle.lehreinheit_id=tbl_lehreinheit.lehreinheit_id + and tbl_moodle.lehrveranstaltung_id is null + '; + $qry.=$where; + + $qry.=' order by 1,2,3,4,5,6,7; '; + + if(!$result = $this->db_query($qry)) + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + + while($row = $this->db_fetch_object($result)) + { + + $obj = new moodle_course($this->conn_moodle); + + $obj->mdl_course_id = $row->mdl_course_id; + $obj->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $obj->lehreinheit_id = $row->lehreinheit_id; + $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $obj->lehrveranstaltung_kurzbz=$row->kurzbz; + $obj->lehrveranstaltung_bezeichnung=$row->bezeichnung; + $obj->lehrveranstaltung_semester=$row->semester; + $obj->lehrveranstaltung_studiengang_kz=$row->studiengang_kz; + $obj->lehrveranstaltung_lehrform_kurzbz=$row->lehrform_kurzbz; + + $obj->lehrveranstaltung_orgform_kurzbz=$row->orgform_kurzbz; + + $obj->moodle_lehrveranstaltung_id=$row->moodle_lehrveranstaltung_id; + $obj->moodle_lehreinheit_id=$row->moodle_lehreinheit_id; + $obj->moodle_mdl_course_id = $row->mdl_course_id; + $obj->mdl_fullname = 'Moodle Kurs nicht vorhanden ID '.$obj->mdl_course_id; + $obj->mdl_shortname =$obj->mdl_fullname; + $obj->gruppen=($row->gruppen=='t'?true:false);; + + // Anzahl Benotungen + $obj->mdl_benotungen = 0; + // Anzahl Aktivitaeten und Lehrmaterial + $obj->mdl_resource = 0; + $obj->mdl_quiz = 0; + $obj->mdl_chat = 0; + $obj->mdl_forum = 0; + $obj->mdl_choice= 0; + + $moddle= new moodle_course(); + if ($moddle->load($obj->mdl_course_id)) + { + $obj->mdl_fullname = $moddle->mdl_fullname; + $obj->mdl_shortname = $moddle->mdl_shortname; + } + else + { + $obj->mdl_course_id = 0; + $obj->mdl_fullname =$moddle->errormsg; + $this->result[] = $obj; + continue; + } + + if(!$detail) + { + $this->result[] = $obj; + continue; + } + + + // Anzahl Noten je Kurs und User + $qry_mdl = "SELECT count(*) as anz + FROM mdl_grade_grades , mdl_grade_items + WHERE mdl_grade_items.itemtype='course' + AND mdl_grade_grades.finalgrade IS NOT NULL + AND mdl_grade_grades.itemid=mdl_grade_items.id + AND mdl_grade_items.courseid ='".addslashes($row->mdl_course_id)."'; "; + + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_benotungen = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + $qry_mdl = "SELECT count(course) as anz FROM public.mdl_chat WHERE mdl_chat.course='".addslashes($row->mdl_course_id)."'; "; + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_chat = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + $qry_mdl = "SELECT count(course) as anz FROM public.mdl_resource WHERE mdl_resource.course='".addslashes($row->mdl_course_id)."'; "; + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_resource = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + + $qry_mdl = "SELECT count(course) as anz FROM public.mdl_quiz WHERE mdl_quiz.course='".addslashes($row->mdl_course_id)."'; "; + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_quiz = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + $qry_mdl = "SELECT count(course) as anz FROM public.mdl_forum WHERE mdl_forum.course='".addslashes($row->mdl_course_id)."'; "; + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_forum = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + + $qry_mdl = "SELECT count(course) as anz FROM public.mdl_choice WHERE mdl_choice.course='".addslashes($row->mdl_course_id)."'; "; + if($detail && $result_mdl = pg_query($this->conn_moodle, $qry_mdl)) + { + if($row_mdl = pg_fetch_object($result_mdl)) + { + $obj->mdl_choice = (empty($row_mdl->anz)?0:$row_mdl->anz); + } + } + $this->result[] = $obj; + } + return true; + + } + + /** + * Schaut ob fuer diese LV/StSem schon ein + * Moodle Kurs existiert + * @param lehrveranstaltung_id + * studiensemester_kurzbz + * @return true wenn vorhanden, false wenn nicht + */ + public function course_exists_for_lv($lehrveranstaltung_id, $studiensemester_kurzbz) + { + $qry = "SELECT + 1 + FROM + lehre.tbl_moodle + WHERE + lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER)." + AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz); + if($this->db_query($qry)) + { + if($this->db_num_rows()>0) + return true; + else + return false; + } + else + { + $this->errormsg = 'Fehler bei Datenbankabfrage'; + return false; + } + } + + /** + * Schaut ob fuer diese LE schon ein Moodle + * Kurs existiert + * @param lehreinheit_id + * @return true wenn vorhanden, false wenn nicht + */ + public function course_exists_for_le($lehreinheit_id) + { + $qry = "SELECT 1 FROM lehre.tbl_moodle WHERE lehreinheit_id=".$this->db_add_param($lehreinheit_id, FHC_INTEGER); + if($this->db_query($qry)) + { + if($this->db_num_rows()>0) + return true; + else + return false; + } + else + { + $this->errormsg = 'Fehler bei Datenbankabfrage'; + return false; + } + } + + /** + * Schaut ob fuer diese LV/StSem schon ein + * Moodle Kurs existiert + * @param lehrveranstaltung_id + * studiensemester_kurzbz + * @return true wenn vorhanden, false wenn nicht + */ + public function course_exists_for_allLE($lehrveranstaltung_id, $studiensemester_kurzbz) + { + $qry = "SELECT 1 FROM lehre.tbl_lehreinheit + WHERE lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER)." + AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)." + AND lehreinheit_id NOT IN (SELECT lehreinheit_id FROM lehre.tbl_moodle WHERE lehreinheit_id=tbl_lehreinheit.lehreinheit_id)"; + if($this->db_query($qry)) + { + if($this->db_num_rows()>0) + return false; + else + return true; + } + else + { + $this->errormsg = 'Fehler bei Datenbankabfrage'; + return false; + } + } + + /** + * Legt einen Eintrag in der tbl_moodle an + * @return true wenn ok, false im Fehlerfall + */ + public function create_vilesci() + { + if($this->mdl_course_id=='') + { + $this->errormsg='mdl_course_id muss angegeben sein'; + return false; + } + + $qry = 'BEGIN; INSERT INTO lehre.tbl_moodle(mdl_course_id, lehreinheit_id, lehrveranstaltung_id, + studiensemester_kurzbz, insertamum, insertvon, gruppen) + VALUES('. + $this->db_add_param($this->mdl_course_id, FHC_INTEGER).','. + $this->db_add_param($this->lehreinheit_id, FHC_INTEGER).','. + $this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER).','. + $this->db_add_param($this->studiensemester_kurzbz).','. + $this->db_add_param($this->insertamum).','. + $this->db_add_param($this->insertvon).','. + $this->db_add_param($this->gruppen, FHC_BOOLEAN).');'; + + if($this->db_query($qry)) + { + $qry = "SELECT currval('lehre.tbl_moodle_moodle_id_seq') as id;"; + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $this->moodle_id = $row->id; + $this->db_query('COMMIT;'); + return true; + } + else + { + $this->db_query('ROLLBACK'); + $this->errormsg = 'Fehler beim Lesen der Sequence'; + return false; + } + } + else + { + $this->db_query('ROLLBACK'); + $this->errormsg = 'Fehler beim Lesen der Sequence'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Einfuegen des Datensatzes'; + return false; + } + } + + /** + * Entfernt einen Eintrag in der tbl_moodle an + * @return true wenn ok, false im Fehlerfall + */ + public function delete_vilesci($mdl_course_id=null,$lehrveranstaltung_id=null,$lehreinheit_id=null) + { + $this->errormsg = ''; + if (!is_null($mdl_course_id) && !empty($mdl_course_id)) + $this->mdl_course_id=$mdl_course_id; + if (!is_null($lehrveranstaltung_id) && !empty($lehrveranstaltung_id)) + $this->lehrveranstaltung_id=$lehrveranstaltung_id; + if (!is_null($lehreinheit_id) && !empty($lehreinheit_id)) + $this->lehreinheit_id=$lehreinheit_id; + $where=''; + if (!is_null($this->mdl_course_id) && !empty($this->mdl_course_id)) + $where.=($where?' and ':' where '). ' mdl_course_id='.$this->db_add_param($this->mdl_course_id, FHC_INTEGER); + else + $where.=($where?' and ':' where '). ' mdl_course_id=0'; + if (!is_null($this->lehrveranstaltung_id) && !empty($this->lehrveranstaltung_id)) + $where.=($where?' and ':' where '). ' lehrveranstaltung_id='.$this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER); + if (!is_null($this->lehreinheit_id) && !empty($this->lehreinheit_id)) + $where.=($where?' and ':' where '). ' lehreinheit_id='.$this->db_add_param($this->lehreinheit_id, FHC_INTEGER); + if (empty($where)) + { + $this->errormsg='mdl_course_id oder LV oder LE muss angegeben sein'; + return false; + } + + $qry='DELETE FROM lehre.tbl_moodle '.$where; + if(!$this->db_query($qry)) + { + $this->errormsg = 'Fehler beim Loeschen der Zuteilung'; + return false; + } + + return true; + } + + /** + * Aendert einen Eintrag in der tbl_moodle an + * @return true wenn ok, false im Fehlerfall + */ + public function update_vilesci() + { + if($this->mdl_course_id=='') + { + $this->errormsg='mdl_course_id muss angegeben sein'; + return false; + } + if (is_null($this->new) || empty($this->new)) + $this->new=false; + + $this->db_query('BEGIN;'); + $qry = ''; + $res=0; + + if (!$this->new) + { + $qrySel = 'SELECT 1 FROM lehre.tbl_moodle WHERE mdl_course_id='.$this->db_add_param($this->mdl_course_id, FHC_INTEGER); + if(!$res=$this->db_query($qrySel)) + { + $this->errormsg = 'Fehler beim Datenbankzugriff'; + return false; + } + if($this->db_num_rows($res)>0) + { + if ($this->lehrveranstaltung_id!='' && !is_null($this->lehrveranstaltung_id)) + { + $qry.= 'DELETE FROM lehre.tbl_moodle WHERE mdl_course_id='.$this->db_add_param($this->mdl_course_id, FHC_INTEGER).' and not lehreinheit_id = '.$this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER) .';'; + } + else + { + $qry.= 'DELETE FROM lehre.tbl_moodle WHERE mdl_course_id='.$this->db_add_param($this->mdl_course_id, FHC_INTEGER).' and not lehreinheit_id in ('. (is_array($this->lehreinheit_id)? implode(',',$this->lehreinheit_id) :$this->lehreinheit_id) .');'; + } + } + } + + if ( ($this->lehrveranstaltung_id!='' && !is_null($this->lehrveranstaltung_id)) + || !is_array($this->lehreinheit_id) ) + { + $qrySel = 'SELECT 1 FROM lehre.tbl_moodle WHERE mdl_course_id='.$this->db_add_param($this->mdl_course_id, FHC_INTEGER); + if ($this->new) + { + if ( $this->lehrveranstaltung_id!='' && !is_null($this->lehrveranstaltung_id) ) + $qrySel.= ' and lehrveranstaltung_id='.$this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER); + else + $qrySel.= ' and lehreinheit_id='.$this->db_add_param($this->lehreinheit_id, FHC_INTEGER); + } + + if(!$res=$this->db_query($qrySel)) + { + $this->errormsg = 'Fehler beim Datenbankzugriff'; + $this->db_query('ROLLBACK'); + return false; + + } + if($this->db_num_rows($res)>0) + { + $qry.= 'UPDATE lehre.tbl_moodle SET + lehreinheit_id='.$this->db_add_param($this->lehreinheit_id, FHC_INTEGER).', + lehrveranstaltung_id='.$this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER).', + studiensemester_kurzbz='.$this->db_add_param($this->studiensemester_kurzbz).' + '; + if (!is_null($this->gruppen)) + $qry.= ',gruppen='.$this->db_add_param($this->gruppen, FHC_BOOLEAN); + $qry.= ' WHERE mdl_course_id='.$this->db_add_param($this->mdl_course_id, FHC_INTEGER, false).'; '; + } + else + { + $qry.= 'INSERT INTO lehre.tbl_moodle(mdl_course_id, lehreinheit_id, lehrveranstaltung_id, + studiensemester_kurzbz, insertamum, insertvon, gruppen) + VALUES('. + $this->db_add_param($this->mdl_course_id, FHC_INTEGER).','. + $this->db_add_param($this->lehreinheit_id, FHC_INTEGER).','. + $this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER).','. + $this->db_add_param($this->studiensemester_kurzbz).','. + $this->db_add_param($this->insertamum).','. + $this->db_add_param($this->insertvon).','. + $this->db_add_param($this->gruppen, FHC_BOOLEAN).'); '; + } + } + // Lehreinheiten anlegen - Array + else + { + foreach ($this->lehreinheit_id as $key=>$value) + { + $qrySel = 'SELECT 1 FROM lehre.tbl_moodle WHERE mdl_course_id='.$this->db_add_param($this->mdl_course_id). ' AND lehreinheit_id='.$this->db_add_param($value, FHC_INTEGER); + if(!$res=$this->db_query($qrySel)) + { + $this->errormsg = 'Fehler beiDatenbank abfrage'; + $this->db_query('ROLLBACK'); + return false; + } + if($this->db_num_rows($res)>0) + { + $qry.= 'UPDATE lehre.tbl_moodle SET + lehrveranstaltung_id='.$this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER).', + studiensemester_kurzbz='.$this->db_add_param($this->studiensemester_kurzbz).' + '; + if (!is_null($this->gruppen)) + $qry.= ',gruppen='.$this->db_add_param($this->gruppen, FHC_BOOLEAN); + $qry.= ' WHERE mdl_course_id='.$this->db_add_param($this->mdl_course_id, FHC_INTEGER); + $qry.= ' AND lehreinheit_id='.$this->db_add_param($value, FHC_INTEGER).'; '; + + } + else + { + $qry.= 'INSERT INTO lehre.tbl_moodle(mdl_course_id, lehreinheit_id, lehrveranstaltung_id, + studiensemester_kurzbz, insertamum, insertvon, gruppen) + VALUES('. + $this->db_add_param($this->mdl_course_id, FHC_INTEGER).','. + $this->db_add_param($value, FHC_INTEGER).','. + $this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER).','. + $this->db_add_param($this->studiensemester_kurzbz).','. + $this->db_add_param($this->insertamum).','. + $this->db_add_param($this->insertvon).','. + $this->db_add_param($this->gruppen, FHC_BOOLEAN).'); '; + } + } + } + + if(!$this->db_query($qry)) + { + $this->db_query('ROLLBACK'); + $this->errormsg = 'Fehler beim Aendern des Datensatzes! '; + return false; + } + + $this->db_query('COMMIT;'); + return true; + + } + + /** + * Aendert einen Kurs im Moodle an + * @return true wenn ok, false im Fehlerfall + */ + public function update_moodle($oldPath = null) + { + if($this->mdl_course_id=='') + { + $this->errormsg='mdl_course_id muss angegeben sein'; + return false; + } + + if( (is_null($this->lehrveranstaltung_id) || $this->lehrveranstaltung_id=='') + && (is_null($this->lehreinheit_id) && $this->lehreinheit_id=='')) + { + $this->errormsg='LvID oder LeID muss uebergeben werden'; + return false; + } + + pg_query($this->conn_moodle, 'BEGIN;'); + + //CourseCategorie ermitteln + + //lehrveranstalung ID holen falls die nur die lehreinheit_id angegeben wurde + if($this->lehrveranstaltung_id=='' || is_null($this->lehrveranstaltung_id)) + { + $qry = "SELECT lehrveranstaltung_id FROM lehre.tbl_lehreinheit + WHERE lehreinheit_id='".addslashes($this->lehreinheit_id)."'"; + if($res=$this->db_query($qry)) + { + if($row = $this->db_fetch_object($res)) + { + $lvid = $row->lehrveranstaltung_id; + } + else + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim Ermitteln der LehrveranstaltungID'; + return false; + } + } + else + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim Ermitteln der LehrveranstaltungID'; + return false; + } + } + else + $lvid = $this->lehrveranstaltung_id; + + //Studiengang und Semester holen + $qry = "SELECT tbl_lehrveranstaltung.semester, UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as stg + FROM lehre.tbl_lehrveranstaltung JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE lehrveranstaltung_id='$lvid'"; + + if($res=$this->db_query($qry)) + { + if($row = $this->db_fetch_object($res)) + { + $semester = $row->semester; + $stg = $row->stg; + } + else + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim Ermitteln von Studiengang und Semester'; + return false; + } + } + else + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim Ermitteln von Studiengang und Semester'; + return false; + } + + //Studiensemester Categorie holen + if(!$id_stsem = $this->getCategorie($this->studiensemester_kurzbz, '0')) + { + if(!$id_stsem = $this->createCategorie($this->studiensemester_kurzbz, '0')) + echo "
Fehler beim Anlegen des Studiensemesters"; + } + + //Studiengang Categorie holen + if(!$id_stg = $this->getCategorie($stg, $id_stsem)) + { + if(!$id_stg = $this->createCategorie($stg, $id_stsem)) + echo "
$this->errormsg"; + } + + //Semester Categorie holen + if(!$id_sem = $this->getCategorie($semester, $id_stg)) + { + if(!$id_sem = $this->createCategorie($semester, $id_stg)) + echo "
$this->errormsg"; + } + + //CourseCategorie Context holen + $this->getContext(40, $id_sem); + + + $qry = 'UPDATE public.mdl_course set + category='.$this->addslashes($id_sem).', + fullname='. $this->addslashes($this->mdl_fullname) .', + shortname='.$this->addslashes($this->mdl_shortname).' + '; + $qry.= " WHERE id='".addslashes($this->mdl_course_id)."'; "; + +#echo $qry; +#return true; + + if(!$result = pg_query($this->conn_moodle, $qry)) + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim Update'; + return false; + } + + /* + $qry = "DELETE FROM public.mdl_context where contextlevel='50' and instanceid=".$this->addslashes($this->mdl_course_id)." ;"; + if(!pg_query($this->conn_moodle, $qry)) + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim Entfernen des Context eintrages. '. pg_last_error(); + return false; + } + */ + + $update=false; + $qry = "SELECT id FROM public.mdl_context WHERE contextlevel='50' and instanceid=".$this->addslashes($this->mdl_course_id)." ;"; + if($result = pg_query($this->conn_moodle, $qry)) + { + if($row = pg_fetch_object($result)) + { + $this->mdl_context_id = $row->id; + $update=true; + } + } + + if($update) + { + //zum vorherigen Pfad die aktuelle id hinzufuegen + $path = $this->mdl_context_path.'/'.$this->mdl_context_id; + //vorherige tiefe um 1 erhoehen + $depth = $this->mdl_context_depth+1; + + $qry = "UPDATE public.mdl_context SET + contextlevel=50, + instanceid=".$this->addslashes($this->mdl_course_id).", + path=".$this->addslashes($path).", + depth=".$this->addslashes($depth)." + WHERE id='".addslashes($this->mdl_context_id)."';"; + if(!pg_query($this->conn_moodle, $qry)) + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim Update des Contexts'; + return false; + } + + $qry = "UPDATE public.mdl_context SET + path=".$this->addslashes($path)."|| '/' || mdl_context.id + WHERE path LIKE '".$oldPath."%';"; + if(!pg_query($this->conn_moodle, $qry)) + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim Update des Contexts'; + return false; + } + } + else + { + $qry ="SELECT nextval('mdl_context_id_seq') as nextId"; + if($result = pg_query($this->conn_moodle, $qry)) + { + if($row=pg_fetch_object($result)) + { + // nächste id herausfinden -> wegen insert + $path = $this->mdl_context_path.'/'.$row->nextId; + // tiefe um 1 erhoehen + $depth = $this->mdl_context_depth+1; + } + else + { + $this->errormsg = 'Fehler beim Select der Sequence :'. pg_last_error(); + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Select der Sequence :'. pg_last_error(); + return false; + } + + //Context eintragen + $qry = "INSERT INTO public.mdl_context(contextlevel, instanceid, path, depth) VALUES('50', ". + $this->addslashes($this->mdl_course_id).",'".$this->addslashes($path)."',".$this->addslashes($depth).");"; + if(pg_query($this->conn_moodle, $qry)) + { + $qry = "SELECT currval('mdl_context_id_seq') as id"; + if($result = pg_query($this->conn_moodle, $qry)) + { + if($row = pg_fetch_object($result)) + { + $this->mdl_context_id = $row->id; + } + else + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim Auslesen der Sequence ::'. pg_last_error($result).' '. pg_last_error(); + return false; + } + } + else + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim Select der Sequence :'. pg_last_error(); + return false; + } + } + else + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim INSERT'; + return false; + } + } + + + pg_query($this->conn_moodle, 'COMMIT;'); + return true; + } + + + + /** + * Legt einen Kurs im Moodle an + * @return true wenn ok, false im Fehlerfall + */ + public function create_moodle() + { + //CourseCategorie ermitteln + + //lehrveranstalung ID holen falls die nur die lehreinheit_id angegeben wurde + if($this->lehrveranstaltung_id=='') + { + $qry = "SELECT lehrveranstaltung_id FROM lehre.tbl_lehreinheit + WHERE lehreinheit_id=".$this->db_add_param($this->lehreinheit_id, FHC_INTEGER); + if($res=$this->db_query($qry)) + { + if($row = $this->db_fetch_object($res)) + { + $lvid = $row->lehrveranstaltung_id; + } + else + { + $this->errormsg = 'Fehler beim Ermitteln der LehrveranstaltungID'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Ermitteln der LehrveranstaltungID'; + return false; + } + } + else + $lvid = $this->lehrveranstaltung_id; + + //Studiengang und Semester holen + $qry = "SELECT tbl_lehrveranstaltung.semester, UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as stg + FROM lehre.tbl_lehrveranstaltung JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE lehrveranstaltung_id=".$this->db_add_param($lvid, FHC_INTEGER); + + if($res=$this->db_query($qry)) + { + if($row = $this->db_fetch_object($res)) + { + $semester = $row->semester; + $stg = $row->stg; + } + else + { + $this->errormsg = 'Fehler beim Ermitteln von Studiengang und Semester'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Ermitteln von Studiengang und Semester'; + return false; + } + + //Studiensemester Categorie holen + if(!$id_stsem = $this->getCategorie($this->studiensemester_kurzbz, '0')) + { + if(!$id_stsem = $this->createCategorie($this->studiensemester_kurzbz, '0')) + echo "
Fehler beim Anlegen des Studiensemesters"; + } + //Studiengang Categorie holen + if(!$id_stg = $this->getCategorie($stg, $id_stsem)) + { + if(!$id_stg = $this->createCategorie($stg, $id_stsem)) + echo "
$this->errormsg"; + } + //Semester Categorie holen + if(!$id_sem = $this->getCategorie($semester, $id_stg)) + { + if(!$id_sem = $this->createCategorie($semester, $id_stg)) + echo "
$this->errormsg"; + } + + + $client = new SoapClient($this->serverurl); + + $data = new stdClass(); + $data->fullname=$this->mdl_fullname; + $data->shortname=$this->mdl_shortname; + $data->categoryid=$id_sem; + $data->format='topics'; + + $response = $client->core_course_create_courses(array($data)); + if(isset($response[0])) + { + $this->mdl_course_id=$response[0]['id']; + return true; + } + else + { + $this->errormsg = 'Fehler beim Anlegen des Kurses'; + return false; + } + + //Bloecke hinzufuegen + /* TODO + + $qry = + "INSERT INTO public.mdl_block_instance(blockid, pageid, pagetype, position, weight, visible) VALUES(20, $this->mdl_course_id, 'course-view', 'l', 0, 1);". //Teilnehmer + "INSERT INTO public.mdl_block_instance(blockid, pageid, pagetype, position, weight, visible) VALUES(1, $this->mdl_course_id, 'course-view', 'l', 1, 1);". //Aktivit�ten + "INSERT INTO public.mdl_block_instance(blockid, pageid, pagetype, position, weight, visible) VALUES(25, $this->mdl_course_id, 'course-view', 'l', 2, 1);". //Forumssuche + "INSERT INTO public.mdl_block_instance(blockid, pageid, pagetype, position, weight, visible) VALUES(2, $this->mdl_course_id, 'course-view', 'l', 3, 1);". //Admin + "INSERT INTO public.mdl_block_instance(blockid, pageid, pagetype, position, weight, visible) VALUES(9, $this->mdl_course_id, 'course-view', 'l', 4, 1);". //Kursliste + "INSERT INTO public.mdl_block_instance(blockid, pageid, pagetype, position, weight, visible) VALUES(18, $this->mdl_course_id, 'course-view', 'r', 0, 1);". //Neueste Nachrichten + "INSERT INTO public.mdl_block_instance(blockid, pageid, pagetype, position, weight, visible) VALUES(8, $this->mdl_course_id, 'course-view', 'r', 1, 1);". //Kalender / Bald aktuell... + "INSERT INTO public.mdl_block_instance(blockid, pageid, pagetype, position, weight, visible) VALUES(22, $this->mdl_course_id, 'course-view', 'r', 2, 1);"; //Neueste Aktivit�ten + if(!pg_query($this->conn_moodle, $qry)) + { + pg_query($this->conn_moodle, 'ROLLBACK'); + $this->errormsg = 'Fehler beim INSERT der bloecke'; + return false; + } + else + { + pg_query($this->conn_moodle, 'COMMIT'); + return true; + }*/ + + return true; + } + + /** + * Laedt eine CourseCategorie anhand der Bezeichnung und der + * ParentID + */ + public function getCategorie($bezeichnung, $parent) + { + if($bezeichnung=='') + { + $this->errormsg = 'Bezeichnung muss angegeben werden'; + return false; + } + if($parent=='') + { + $this->errormsg = 'getCategorie: parent wurde nicht uebergeben'; + return false; + } + + $client = new SoapClient($this->serverurl); + $response = $client->core_course_get_categories(array(array('key'=>'name','value'=>$bezeichnung),array('key'=>'parent','value'=>$parent))); + + if(isset($response[0])) + { + return $response[0]['id']; + } + else + { + $this->errormsg = 'Fehler beim Laden der KursKategorie'; + return false; + } + } + + /** + * Erzeugt eine CourseCategorie anhand der Bezeichnung und der + * ParentID + */ + public function createCategorie($bezeichnung, $parent) + { + if($bezeichnung=='') + { + $this->errormsg = 'Bezeichnung muss angegeben werden'; + return false; + } + if($parent=='') + { + $this->errormsg = 'createCategorie: parent wurde nicht uebergeben'; + return false; + } + + $client = new SoapClient($this->serverurl); + $response = $client->core_course_create_categories(array(array('name'=>$bezeichnung,'parent'=>$parent))); + + if(isset($response[0])) + { + return $response[0]['id']; + } + else + { + $this->errormsg = 'Fehler beim Anlegen der Kategorie'; + return false; + } + } + + /** + * Liefert alle Kurse dieser LV in denen der Student + * zugeteilt ist + */ + public function getCourse($lehrveranstaltung_id, $studiensemester_kurzbz, $student_uid) + { + //alle betreffenden Kurse holen + $qry = "SELECT tbl_lehreinheit.lehreinheit_id, mdl_course_id FROM lehre.tbl_moodle JOIN lehre.tbl_lehreinheit USING(lehrveranstaltung_id, studiensemester_kurzbz) + WHERE tbl_moodle.lehrveranstaltung_id='".addslashes($lehrveranstaltung_id)."' + AND tbl_moodle.studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."' + UNION + SELECT tbl_lehreinheit.lehreinheit_id, mdl_course_id FROM lehre.tbl_moodle JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + WHERE tbl_lehreinheit.lehrveranstaltung_id='".addslashes($lehrveranstaltung_id)."' AND + tbl_lehreinheit.studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."'"; + + $courses = array(); + if($result = $this->db_query($qry)) + { + while($row = $this->db_fetch_object($result)) + { + //schauen in welchen der Student ist + $qry = "SELECT 1 FROM campus.vw_student_lehrveranstaltung + WHERE uid='".addslashes($student_uid)."' AND lehreinheit_id='".addslashes($row->lehreinheit_id)."'"; + + if($result_vw = $this->db_query($qry)) + { + if($this->db_num_rows($result_vw)>0) + { + if(!array_key_exists($row->mdl_course_id, $courses)) + $courses[]=$row->mdl_course_id; + } + } + } + } + + return $courses; + } + + /** + * Aktualisiert die Spalte gruppen in der tbl_moodle + * @param moodle_id ID der MoodleZuteilung + * gruppen boolean true wenn syncronisiert + * werden soll, false wenn nicht + * @return true wenn ok, false im Fehlerfall + */ + public function updateGruppenSync($moodle_id, $gruppen) + { + if(!is_numeric($moodle_id)) + { + $this->errormsg = 'Moodle_id muss eine gueltige Zahl sein'; + return false; + } + + $qry = "UPDATE lehre.tbl_moodle SET gruppen=".$this->db_add_param($gruppen, FHC_BOOLEAN)." + WHERE moodle_id=".$this->db_add_param($moodle_id, FHC_INTEGER); + + if($this->db_query($qry)) + { + return true; + } + else + { + $this->errormsg = 'Fehler beim Update'; + return false; + } + } + + /** + * Legt einen Testkurs an + */ + public function createTestkurs($lehrveranstaltung_id, $studiensemester_kurzbz) + { + //CourseCategorie ermitteln + + //Studiengang und Semester holen + + $qry = "SELECT + tbl_lehrveranstaltung.semester, + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as stg + FROM + lehre.tbl_lehrveranstaltung + JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE + lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER); + + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $semester = $row->semester; + $stg = $row->stg; + } + else + { + $this->errormsg = 'Fehler beim Ermitteln von Studiengang und Semester'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Ermitteln von Studiengang und Semester'; + return false; + } + + //Testkurs Categorie holen + if(!$id_testkurs = $this->getCategorie('Testkurse', '0')) + { + if(!$id_testkurs = $this->createCategorie('Testkurse', '0')) + echo "
Fehler beim Anlegen der Testkurskategorie"; + } + //StSem Categorie holen + if(!$id_stsem = $this->getCategorie($studiensemester_kurzbz, $id_testkurs)) + { + if(!$id_stsem = $this->createCategorie($studiensemester_kurzbz, $id_testkurs)) + echo "
$this->errormsg"; + } + + $client = new SoapClient($this->serverurl); + + $data = new stdClass(); + $data->fullname=$this->mdl_fullname; + $data->shortname=$this->mdl_shortname; + $data->categoryid=$id_stsem; + $data->format='topics'; + + $response = $client->core_course_create_courses(array($data)); + if(isset($response[0])) + { + $this->mdl_course_id=$response[0]['id']; + return true; + } + else + { + $this->errormsg = 'Fehler beim Anlegen des Testkurses'; + return false; + } + } + + /** + * Laedt den Testkurs zu dieser Lehrveranstaltung + * @param lehrveranstaltung_id + * studiensemester_kurzbz + * @return ID wenn gefunden, false wenn nicht vorhanden + */ + public function loadTestkurs($lehrveranstaltung_id, $studiensemester_kurzbz) + { + $qry = "SELECT + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, + tbl_lehrveranstaltung.semester, tbl_lehrveranstaltung.kurzbz + FROM + lehre.tbl_lehrveranstaltung JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE + lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER, false); + + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $shortname = mb_strtoupper('TK-'.$studiensemester_kurzbz.'-'.$row->kuerzel.'-'.$row->semester.'-'.$row->kurzbz); + } + else + { + $this->errormsg = 'Fehler beim Laden des Testkurses'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Laden des Testkurses'; + return false; + } + + //Testkurs Categorie holen + if(!$id_testkurs = $this->getCategorie('Testkurse', '0')) + { + $this->errormsg = 'Categorie nicht gefunden'; + return false; + } + + //StSem Categorie holen + if(!$id_stsem = $this->getCategorie($studiensemester_kurzbz, $id_testkurs)) + { + $this->errormsg = 'Categorie nicht gefunden'; + return false; + } + + $client = new SoapClient($this->serverurl); + $response = $client->fhcomplete_courses_by_shortname(array('shortnames'=>array($shortname))); + + if(isset($response[0])) + { + $this->mdl_fullname = $response[0]['fullname']; + $this->mdl_shortname = $response[0]['shortname']; + $this->mdl_course_id = $response[0]['id']; + return true; + } + else + { + $this->errormsg='Es wurde kein Testkurs gefunden'; + return false; + } + } + + + /** + * Laedt die Noten zu einem Moodle Course ID + * @param mdl_course_id + * + * @return objekt mit den Noten der Teilnehmer dieses Kurses + */ + public function loadNoten($lehrveranstaltung_id=null, $studiensemester_kurzbz=null,$student_uid='',$bDetailinfo=false,$bServerinfo=false) + { + + + $this->errormsg=''; + $this->result=null; + + // Init + if (!is_null($lehrveranstaltung_id)) + $this->lehrveranstaltung_id=trim($lehrveranstaltung_id); + if (!is_null($studiensemester_kurzbz)) + $this->studiensemester_kurzbz=trim($studiensemester_kurzbz); + $student_uid=trim($student_uid); + + + + // plausib + if (empty($this->lehrveranstaltung_id) + || empty($this->studiensemester_kurzbz) ) + { + $this->errormsg = 'Es fehlt die Eingabe von '; + $this->errormsg.=(empty($this->lehrveranstaltung_id)?' Lehrveranstaltung ':$this->lehrveranstaltung_id); + $this->errormsg.=(empty($this->studiensemester_kurzbz)?' Semester (Kurzbz.) ':$this->studiensemester_kurzbz); + return false; + } + + // -------------------------------------------------------------------- + // Ermitteln die Lehreinheiten und Moodle ID + // mit dem studiensemester_kurzbz ( bsp WS2008 ) + // und der lehrveranstaltung_id aus FAS ( bsp 23802 ) + // -------------------------------------------------------------------- + + $qry = " + SELECT tbl_lehreinheit.lehreinheit_id, mdl_course_id,tbl_lehreinheit.studiensemester_kurzbz,tbl_lehreinheit.lehrveranstaltung_id + FROM lehre.tbl_moodle + JOIN lehre.tbl_lehreinheit USING(lehrveranstaltung_id, studiensemester_kurzbz) + WHERE tbl_moodle.lehrveranstaltung_id > 0 "; + if ($this->lehrveranstaltung_id) + $qry.= " and tbl_moodle.lehrveranstaltung_id ='".addslashes($this->lehrveranstaltung_id)."' "; + if ($this->studiensemester_kurzbz) + $qry.= " and tbl_moodle.studiensemester_kurzbz ='".addslashes($this->studiensemester_kurzbz)."' "; + $qry.= " + UNION + SELECT tbl_lehreinheit.lehreinheit_id, mdl_course_id,tbl_lehreinheit.studiensemester_kurzbz,tbl_lehreinheit.lehrveranstaltung_id + FROM lehre.tbl_moodle + JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + WHERE tbl_lehreinheit.lehrveranstaltung_id > 0 "; + if ($this->lehrveranstaltung_id) + $qry.= " and tbl_lehreinheit.lehrveranstaltung_id ='".addslashes($this->lehrveranstaltung_id)."' "; + if ($this->studiensemester_kurzbz) + $qry.= " and tbl_moodle.studiensemester_kurzbz ='".addslashes($this->studiensemester_kurzbz)."' "; + + if(!$result_moodle=$this->db_query($qry)) + { + $this->errormsg = 'Fehler beim Lesen der Moodle Kurse , '.$this->errormsg; + return false; + } + + + // init + $_lehreinheit=array(); // Lehreinheiten zum lesen Studenten im Campus (Student und LE im FAS) + $_lehrveranstaltung = array(); // Gesamte Information der Lehreinheit und Moodle IDs + $_studiensemester_kurzbz=array(); + $_lehreinheit_kpl=array(); + while($row = $this->db_fetch_object($result_moodle)) + { + + $row->lehreinheit_id=trim($row->lehreinheit_id); + $_lehreinheit_kpl[$row->lehreinheit_id]=$row; + + $_lehreinheit[$row->lehreinheit_id]=$row->lehreinheit_id; // Fuer Select Campus + + $row->lehrveranstaltung_id=trim($row->lehrveranstaltung_id); + $_lehrveranstaltung[$row->lehrveranstaltung_id]=$row->lehrveranstaltung_id; // Fuer Select Campus + + $row->studiensemester_kurzbz=trim($row->studiensemester_kurzbz); + $_studiensemester_kurzbz[$row->studiensemester_kurzbz]=$row->studiensemester_kurzbz; // Fuer Select Campus + + } + if (count($_lehreinheit)<1) // Es gibt keine Lehreinheiten + { + $this->errormsg='Es wurde kein passender Moodle-Kurs gefunden'; + return false; + } + + // -------------------------------------------------------------------- + // + // Suchen Studenten Lehreinheiten zu Moodle - LE + // Fuer die Notenermittlung sind nur Studenten wichtig + // die einen Moodlekurs besuchen der auch eine Lehrveranstaltung ist + // Als Ergebnis sind alle Studenten mit gemeinsame Moodle und FAS LV + // -------------------------------------------------------------------- + $qry = "SELECT distinct vw_student_lehrveranstaltung.lehreinheit_id,lehrveranstaltung_id,studiensemester_kurzbz,kurzbz,bezeichnung,semester,studiengang_kz + FROM campus.vw_student_lehrveranstaltung + "; + $qry.= " WHERE vw_student_lehrveranstaltung.lehreinheit_id in (".implode(",",$_lehreinheit).") "; + $qry.= " AND lehrveranstaltung_id in (".implode(",",$_lehrveranstaltung).") "; + $qry.= " AND vw_student_lehrveranstaltung.studiensemester_kurzbz in ('".implode("','",$_studiensemester_kurzbz)."') "; + if (!empty($student_uid)) + $qry.= " AND uid ='".addslashes($student_uid)."' "; + + if(!$result_moodle=$this->db_query($qry)) + { + $this->errormsg = 'Fehler beim Lesen der Studenten mit Lehreinheit(en) '; + return false; + } + + if (!$anz=$this->db_num_rows($result_moodle)) + { + $this->errormsg ="keine Lehrveranstaltung (Lehreinheit) fuer Moodle Kursdaten gefunden!"; + return false; + } + + $last_moodle_id=false; + while($row = $this->db_fetch_object($result_moodle)) + { + + // Von der Lehreinheit kann der Moodle-Kurs ermittelt werden + $this->mdl_course_id=trim($_lehreinheit_kpl[$row->lehreinheit_id]->mdl_course_id); + if ($last_moodle_id==$this->mdl_course_id) + continue; + $last_moodle_id=$this->mdl_course_id; + + // XML RPC - Call + $method = "NotenCourseByID"; + + $m_user=array(); + $m_user['CourseID']=$this->mdl_course_id; + $mdl_username=trim($student_uid); + $m_user['UserId']=$mdl_username; + + if (!$result=$this->callMoodleXMLRPC($method,$m_user,$bServerinfo)) + return false; + + if ($result[0]==1) + { + + $error=(isset($result[1])?$result[1]:"Kurs Info "); + $kursArr=(isset($result[2])?$result[2]:array()); + $kursasObj=(isset($result[3])?$result[3]:array()); + $userArr=(isset($result[4])?$result[4]:array()); + $userasObj=(isset($result[5])?$result[5]:array()); + $id=(isset($result[6])?$result[6]:''); + $kursname=(isset($result[7])?$result[7]:''); + $shortname=(isset($result[8])?$result[8]:''); + $courseArr=(isset($result[9])?$result[9]:array()); + + if (!empty($student_uid)) + $note=(isset($userArr) && isset($userArr[6])?$userArr[6]:'?'); + else + $note=0; + + $obj = new moodle_course($this->conn_moodle); + + $obj->mdl_course_id = $this->mdl_course_id; + $obj->lehreinheit_id=$row->lehreinheit_id; + + $obj->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz; + + $obj->lehrveranstaltung_kurzbz=$row->kurzbz; + $obj->lehrveranstaltung_bezeichnung=$row->bezeichnung; + $obj->lehrveranstaltung_semester=$row->semester; + $obj->lehrveranstaltung_studiengang_kz=$row->studiengang_kz; + + $obj->mdl_fullname=$kursname; + $obj->mdl_shortname=$shortname; + $obj->note=$note; + + $obj->errormsg=(isset($result[1])?$result[1]:""); + $obj->note=$note; + + if ($bDetailinfo || empty($student_uid)) + $obj->result=$result; + else + $obj->result=$userArr; + + $this->errormsg.=(!empty($this->errormsg)?", \n":"").$obj->errormsg; + $this->result[]=$obj; + + } + else + { + $this->errormsg.=(!empty($this->errormsg)?", \n":"").(isset($result[1])?$result[1]:"Fehler Kurs Info ".$this->moodle_id); + } + + } + return $this->result; + } // Ende moodle Noten + + + /** + * Loescht einen Moodle Course im Moodel und in der DB + * @param mdl_course_id + * @param bServerinfo Detail xmlrpc Debug informationen + * + * @return objekt mit den Noten der Teilnehmer dieses Kurses + */ + public function deleteKurs($mdl_course_id=null,$moodle_id=null,$bServerinfo=false) + { + $this->errormsg=''; + $this->result=array(); + + if (!is_null($mdl_course_id)) + $this->mdl_course_id=$mdl_course_id; + + + if (!is_null($moodle_id)) + $this->moodle_id=$moodle_id; + + if (is_null($this->mdl_course_id) || empty($this->mdl_course_id) || !is_numeric($this->mdl_course_id)) + { + $this->errormsg='Moodle Kurs ID fehlt'; + return false; + } + + // Variable Daten Initialisieren + $args=array(); + $args['CourseID']=$this->mdl_course_id; + $method = "DeleteCourseByID"; + + if (!$result=$this->callMoodleXMLRPC($method,$args,$bServerinfo)) + return false; + + if (isset($result[1])) + $this->errormsg=$result[1]; + + if ($result[0]==1 || !$this->load($this->mdl_course_id)) // Methodenaufruf erfolgreich + { + $qry = "DELETE FROM lehre.tbl_moodle WHERE mdl_course_id='". addslashes($this->mdl_course_id) ."' "; + if (!is_null($this->moodle_id) && $this->moodle_id!='') + $qry.= " and moodle_id='".addslashes($this->moodle_id)."'"; + if(!$this->db_query($qry)) + { + $this->errormsg=$this->errormsg." Moodlekurs $mdl_course_id wurde NICHT gelöscht in Lehre. "; + return false; + } + } + else // Result = 0 ein Fehler im RFC wurde festgestellt + { + $this->errormsg=(isset($result[1])?$result[1]:" - Fehler beim Kurs ".$this->mdl_course_id." löschen "); + return false; + } + + if (empty($this->errormsg)) + $this->errormsg.="Moodlekurs ".$this->mdl_course_id." wurde gelöscht."; + return true; + + } +} diff --git a/include/moodle2_4_user.class.php b/include/moodle2_4_user.class.php new file mode 100644 index 000000000..4d118f106 --- /dev/null +++ b/include/moodle2_4_user.class.php @@ -0,0 +1,563 @@ + and + */ +/* + * Connector fuer Moodle 2.4 User + * + * FHComplete Moodle Plugin muss installiert sein fuer + * Webservice Funktion 'fhcomplete_user_get_users' + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); + +class moodle_user extends basis_db +{ + public $log=''; //log message fuer Syncro + public $log_public=''; //log message fuer Syncro + public $sync_create=0; //anzahl der durchgefuehrten zuteilungen beim syncro + public $group_update=0; //anzahl der updates an gruppen + private $serverurl; + + public $mdl_user_id; + public $mdl_user_username; + public $mdl_user_firstname; + public $mdl_user_lastname; + + /** + * Konstruktor + */ + public function __construct() + { + $this->serverurl=MOODLE_PATH24.'/webservice/soap/server.php?wsdl=1&wstoken='.MOODLE_TOKEN24.'&'.microtime(true); + return true; + } + + /** + * Laedt einen Moodle User + * + * @param $uid + * @return boolean + */ + public function loaduser($uid) + { + $client = new SoapClient($this->serverurl); + $response = $client->fhcomplete_user_get_users(array(array('key'=>'username', 'value'=>$uid))); + + if(isset($response['users'][0])) + { + $this->mdl_user_id = $response['users'][0]['id']; + $this->mdl_user_username = $response['users'][0]['username']; + $this->mdl_user_firstname = $response['users'][0]['firstname']; + $this->mdl_user_lastname = $response['users'][0]['lastname']; + return true; + } + else + { + $this->errormsg = 'Fehler beim Laden des Users'; + return false; + } + } + + /** + * Liefert ein Array mit allen Lektoren die + * zu dem Moodle Kurs zugeteilt sind + */ + public 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=".$this->db_add_param($mdl_course_id, FHC_INTEGER)." + 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=".$this->db_add_param($mdl_course_id, FHC_INTEGER); + $mitarbeiter=array(); + if($this->db_query($qry)) + { + while($row_ma = $this->db_fetch_object()) + { + $mitarbeiter[] = $row_ma->mitarbeiter_uid; + } + return $mitarbeiter; + } + else + { + $this->errormsg='Fehler beim Laden der Mitarbeiter'; + return false; + } + } + + /** + * 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 + */ + public 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=".$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER)." + AND studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz); + } + else + { + $qry = "SELECT + mitarbeiter_uid + FROM + lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_moodle USING(lehreinheit_id) + WHERE + mdl_course_id=".$this->db_add_param($mdl_course_id, FHC_INTEGER)." + 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=".$this->db_add_param($mdl_course_id, FHC_INTEGER); + } + $mitarbeiter=''; + + $client = new SoapClient($this->serverurl); + $enrolled_users = $client->core_enrol_get_enrolled_users($mdl_course_id,array()); + + if($result_ma = $this->db_query($qry)) + { + while($row_ma = $this->db_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; + + $user_zugeteilt=false; + foreach($enrolled_users as $user) + { + if($user->id==$this->mdl_user_id) + { + $user_zugeteilt=true; + break; + } + } + + if(!$user_zugeteilt) + { + //Mitarbeiter ist noch nicht zugeteilt. + $data = new stdClass(); + $data->roleid=3; // 3=Lektor + $data->userid=$this->mdl_user_id; + $data->courseid=$mdl_course_id; + + if($client->enrol_manual_enrol_users(array($data))) + { + $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"; + } + } + + 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 + */ + public 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=".$this->db_add_param($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=".$this->db_add_param($mdl_course_id); + $studenten=''; + + $client = new SoapClient($this->serverurl); + $enrolled_users = $client->core_enrol_get_enrolled_users($mdl_course_id, array()); + + if($result_std = $this->db_query($qry)) + { + while($row_std = $this->db_fetch_object($result_std)) + { + //Schauen ob fuer diesen Kurs die Gruppen mitgesynct werden sollen + $gruppensync = $this->db_parse_bool($row_std->gruppen); + + //Studenten dieser Gruppe holen + + if($row_std->gruppe_kurzbz=='') //LVB Gruppe + { + $qry = "SELECT + distinct student_uid + FROM + public.tbl_studentlehrverband + WHERE + studiensemester_kurzbz=".$this->db_add_param($row_std->studiensemester_kurzbz)." AND + studiengang_kz = ".$this->db_add_param($row_std->studiengang_kz)." AND + semester = ".$this->db_add_param($row_std->semester); + + if(trim($row_std->verband)!='') + { + $qry.=" AND verband = ".$this->db_add_param($row_std->verband); + if(trim($row_std->gruppe)!='') + { + $qry.=" AND gruppe = ".$this->db_add_param($row_std->gruppe); + } + } + $studiengang_obj = new studiengang(); + $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=".$this->db_add_param($row_std->gruppe_kurzbz)." AND + studiensemester_kurzbz=".$this->db_add_param($row_std->studiensemester_kurzbz); + $gruppenbezeichnung = $row_std->gruppe_kurzbz; + } + + if($result_user = $this->db_query($qry)) + { + while($row_user = $this->db_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 + + $user_zugeteilt=false; + foreach($enrolled_users as $user) + { + if(isset($user->id) && $user->id==$this->mdl_user_id) + { + $user_zugeteilt=true; + break; + } + } + + if(!$user_zugeteilt) + { + //Student ist noch nicht zugeteilt. + + $data = new stdClass(); + $data->roleid=5; // 5=Teilnehmer/Student + $data->userid=$this->mdl_user_id; + $data->courseid=$mdl_course_id; + + if($client->enrol_manual_enrol_users(array($data))) + { + $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"; + } + //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"; + } + } + } + } + } + + 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 true wenn zugeteilt sonst false + */ + public function getGroupMember($groupid, $userid) + { + $client = new SoapClient($this->serverurl); + $response = $client->core_group_get_group_members(array($groupid)); + + foreach($response as $row) + { + if(isset($row->id) && $row->id==$userid) + return true; + } + + return false; + } + + /** + * Legt eine Zuteilung eines Users zu + * einer Gruppe an + * @param groupid ID der Gruppe + * userid ID des Users + * @return boolean + */ + public function createGroupMember($groupid, $userid) + { + $client = new SoapClient($this->serverurl); + $response = $client->core_group_add_group_members(array(array('groupid'=>$groupid, 'userid'=>$userid))); + if(isset($response[0])) + return true; + else + 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 + */ + public function getGroup($mdl_course_id, $gruppenbezeichnung) + { + $client = new SoapClient($this->serverurl); + $response = $client->core_group_get_course_groups($mdl_course_id); + + foreach($response as $row) + { + if($row['name']==$gruppenbezeichnung) + return $row['id']; + } + + $this->errormsg = "Gruppe wurde nicht gefunden $gruppenbezeichnung"; + 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 + */ + public function createGroup($mdl_course_id, $gruppenbezeichnung) + { + $client = new SoapClient($this->serverurl); + $data = new stdClass(); + $data->courseid=$mdl_course_id; + $data->name = $gruppenbezeichnung; + $data->description = $gruppenbezeichnung; + + $response = $client->core_group_create_groups(array($data)); + + if(isset($response[0])) + { + return $response[0]['id']; + } + else + { + $this->errormsg = 'Fehler beim Anlegen der Gruppe'; + return false; + } + } + + /** + * Legt einen User im Moodle an + * @param $uid UID der Person die angelegt werden soll + * @return true wenn ok, false wenn Fehler + */ + public function createUser($uid) + { + $qry = "SELECT uid, vorname, nachname FROM campus.vw_benutzer WHERE uid=".$this->db_add_param($uid); + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $username = $row->uid; + $vorname = $row->vorname; + $nachname = $row->nachname; + + $user = new stdClass(); + $user->username = $username; + /* + Passwort muss gesetzt werden damit das Anlegen funktioniert. + Es wird ein random Passwort gesetzt + Dieses wird beim Login nicht verwendet da ueber ldap authentifiziert wird. + Prefix ist noetig damit es nicht zu Problemen kommt wenn + im Moodle die Passwort Policy aktiviert ist + */ + $user->password = "FHCv!A2".hash('sha512', rand()); + $user->firstname = $vorname; + $user->lastname = $nachname; + $user->email = $username.'@'.DOMAIN; + $user->auth = 'ldap'; + $user->idnumber = $username; + $user->lang = 'de'; + + $client = new SoapClient($this->serverurl); + $response = $client->core_user_create_users(array($user)); + + if(isset($response[0])) + { + $this->mdl_user_id = $response[0]['id']; + return true; + } + else + { + $this->errormsg = 'Fehler beim Laden des Users'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Laden des Users'; + return false; + } + } + else + { + $this->errormsg='Fehler beim Laden des Users'; + return false; + } + } + + /** + * Teilt die TestStudenten zu einem Testkurs zu + * @param mdl_course_id ID des Moodle Kurses + */ + public function createTestStudentenZuordnung($mdl_course_id) + { + //Context des Kurses holen + $mdlcourse = new moodle_course(); + + $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; + } + + $data = new stdClass(); + $data->roleid=5; + $data->userid=$this->mdl_user_id; + $data->courseid=$mdl_course_id; + + $client = new SoapClient($this->serverurl); + $client->enrol_manual_enrol_users(array($data)); + // WS-Funktion enrol_manual_enrol_users liefert immer null zurück + // Fehler bei der Zuordnung koennen daher nicht abgefangen werden. + // Eventuell sollten hier nochmals die Teilnehmer des Kurses geladen werden + // um zu pruefen ob die Zuordnung erfolgreich war. + } + + return true; + } +} diff --git a/include/variable.class.php b/include/variable.class.php index 1e8234439..9430e248b 100644 --- a/include/variable.class.php +++ b/include/variable.class.php @@ -42,7 +42,7 @@ class variable extends basis_db public function __construct($uid=null, $name=null) { parent::__construct(); - + $this->variable= new stdClass(); if($uid!=null && $name!=null) $this->load($uid, $name); } diff --git a/system/moodlePlugin/fhcompletews/README b/system/moodlePlugin/fhcompletews/README new file mode 100644 index 000000000..f2dde879c --- /dev/null +++ b/system/moodlePlugin/fhcompletews/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/fhcompletews/db/services.php b/system/moodlePlugin/fhcompletews/db/services.php new file mode 100644 index 000000000..87aadd1f2 --- /dev/null +++ b/system/moodlePlugin/fhcompletews/db/services.php @@ -0,0 +1,44 @@ +. + +/** + * 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_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' => 'local_fhcompletews_external', + 'methodname' => 'get_users', + 'classpath' => 'local/fhcompletews/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/fhcompletews/externallib.php b/system/moodlePlugin/fhcompletews/externallib.php new file mode 100644 index 000000000..b1d523aaa --- /dev/null +++ b/system/moodlePlugin/fhcompletews/externallib.php @@ -0,0 +1,484 @@ +. + +/** + * 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 { + + + + + 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' + ) + ); + } +/** +* Returns description of get_users() parameters. +* +* @return external_function_parameters +* @since Moodle 2.5 +*/ + public static function get_users_parameters() { + return new external_function_parameters( + array( + 'criteria' => new external_multiple_structure( + new external_single_structure( + array( + 'key' => new external_value(PARAM_ALPHA, 'the user column to search, expected keys (value format) are: +"id" (int) matching user id, +"lastname" (string) user last name (Note: you can use % for searching but it may be considerably slower!), +"firstname" (string) user first name (Note: you can use % for searching but it may be considerably slower!), +"idnumber" (string) matching user idnumber, +"username" (string) matching user username, +"email" (string) user email (Note: you can use % for searching but it may be considerably slower!), +"auth" (string) matching user auth plugin'), + 'value' => new external_value(PARAM_RAW, 'the value to search') + ) + ), 'the key/value pairs to be considered in user search. Values can not be empty. +Specify different keys only once (fullname => \'user1\', auth => \'manual\', ...) - +key occurences are forbidden. +The search is executed with AND operator on the criterias. Invalid criterias (keys) are ignored, +the search is still executed on the valid criterias. +You can search without criteria, but the function is not designed for it. +It could very slow or timeout. The function is designed to search some specific users.' + ) + ) + ); + } + + /** +* Retrieve matching user. +* +* @param array $criteria the allowed array keys are id/lastname/firstname/idnumber/username/email/auth. +* @return array An array of arrays containing user profiles. +* @since Moodle 2.5 +*/ + public static function get_users($criteria = array()) { + global $CFG, $USER, $DB; + + require_once($CFG->dirroot . "/user/lib.php"); + + $params = self::validate_parameters(self::get_users_parameters(), + array('criteria' => $criteria)); + + // Validate the criteria and retrieve the users. + $users = array(); + $warnings = array(); + $sqlparams = array(); + $usedkeys = array(); + + // Do not retrieve deleted users. + $sql = ' deleted = 0'; + + foreach ($params['criteria'] as $criteriaindex => $criteria) { + + // Check that the criteria has never been used. + if (array_key_exists($criteria['key'], $usedkeys)) { + throw new moodle_exception('keyalreadyset', '', '', null, 'The key ' . $criteria['key'] . ' can only be sent once'); + } else { + $usedkeys[$criteria['key']] = true; + } + + $invalidcriteria = false; + // Clean the parameters. + $paramtype = PARAM_RAW; + switch ($criteria['key']) { + case 'id': + $paramtype = PARAM_INT; + break; + case 'idnumber': + $paramtype = PARAM_RAW; + break; + case 'username': + $paramtype = PARAM_RAW; + break; + case 'email': + // We use PARAM_RAW to allow searches with %. + $paramtype = PARAM_RAW; + break; + case 'auth': + $paramtype = PARAM_AUTH; + break; + case 'lastname': + case 'firstname': + $paramtype = PARAM_TEXT; + break; + default: + // Send back a warning that this search key is not supported in this version. + // This warning will make the function extandable without breaking clients. + $warnings[] = array( + 'item' => $criteria['key'], + 'warningcode' => 'invalidfieldparameter', + 'message' => 'The search key \'' . $criteria['key'] . '\' is not supported, look at the web service documentation' + ); + // Do not add this invalid criteria to the created SQL request. + $invalidcriteria = true; + unset($params['criteria'][$criteriaindex]); + break; + } + + if (!$invalidcriteria) { + $cleanedvalue = clean_param($criteria['value'], $paramtype); + + $sql .= ' AND '; + + // Create the SQL. + switch ($criteria['key']) { + case 'id': + case 'idnumber': + case 'username': + case 'auth': + $sql .= $criteria['key'] . ' = :' . $criteria['key']; + $sqlparams[$criteria['key']] = $cleanedvalue; + break; + case 'email': + case 'lastname': + case 'firstname': + $sql .= $DB->sql_like($criteria['key'], ':' . $criteria['key'], false); + $sqlparams[$criteria['key']] = $cleanedvalue; + break; + default: + break; + } + } + } + + $users = $DB->get_records_select('user', $sql, $sqlparams, 'id ASC'); + + // Finally retrieve each users information. + $returnedusers = array(); + foreach ($users as $user) { + $userdetails = user_get_user_details_courses($user); + + // Return the user only if all the searched fields are returned. + // Otherwise it means that the $USER was not allowed to search the returned user. + if (!empty($userdetails)) { + $validuser = true; + + foreach($params['criteria'] as $criteria) { + if (empty($userdetails[$criteria['key']])) { + $validuser = false; + } + } + + if ($validuser) { + $returnedusers[] = $userdetails; + } + } + } + + return array('users' => $returnedusers, 'warnings' => $warnings); + } + + /** +* Returns description of get_users result value. +* +* @return external_description +* @since Moodle 2.5 +*/ + public static function get_users_returns() { + return new external_single_structure( + array('users' => new external_multiple_structure( + self::user_description() + ), + 'warnings' => new external_warnings('always set to \'key\'', 'faulty key name') + ) + ); + } + +/** +* Create user return value description. +* +* @param array $additionalfields some additional field +* @return single_structure_description +*/ + public static function user_description($additionalfields = array()) { + $userfields = array( + 'id' => new external_value(PARAM_INT, 'ID of the user'), + 'username' => new external_value(PARAM_RAW, 'The username', VALUE_OPTIONAL), + 'firstname' => new external_value(PARAM_NOTAGS, 'The first name(s) of the user', VALUE_OPTIONAL), + 'lastname' => new external_value(PARAM_NOTAGS, 'The family name of the user', VALUE_OPTIONAL), + 'fullname' => new external_value(PARAM_NOTAGS, 'The fullname of the user'), + 'email' => new external_value(PARAM_TEXT, 'An email address - allow email as root@localhost', VALUE_OPTIONAL), + 'address' => new external_value(PARAM_TEXT, 'Postal address', VALUE_OPTIONAL), + 'phone1' => new external_value(PARAM_NOTAGS, 'Phone 1', VALUE_OPTIONAL), + 'phone2' => new external_value(PARAM_NOTAGS, 'Phone 2', VALUE_OPTIONAL), + 'icq' => new external_value(PARAM_NOTAGS, 'icq number', VALUE_OPTIONAL), + 'skype' => new external_value(PARAM_NOTAGS, 'skype id', VALUE_OPTIONAL), + 'yahoo' => new external_value(PARAM_NOTAGS, 'yahoo id', VALUE_OPTIONAL), + 'aim' => new external_value(PARAM_NOTAGS, 'aim id', VALUE_OPTIONAL), + 'msn' => new external_value(PARAM_NOTAGS, 'msn number', VALUE_OPTIONAL), + 'department' => new external_value(PARAM_TEXT, 'department', VALUE_OPTIONAL), + 'institution' => new external_value(PARAM_TEXT, 'institution', VALUE_OPTIONAL), + 'idnumber' => new external_value(PARAM_RAW, 'An arbitrary ID code number perhaps from the institution', VALUE_OPTIONAL), + 'interests' => new external_value(PARAM_TEXT, 'user interests (separated by commas)', VALUE_OPTIONAL), + 'firstaccess' => new external_value(PARAM_INT, 'first access to the site (0 if never)', VALUE_OPTIONAL), + 'lastaccess' => new external_value(PARAM_INT, 'last access to the site (0 if never)', VALUE_OPTIONAL), + 'auth' => new external_value(PARAM_PLUGIN, 'Auth plugins include manual, ldap, imap, etc', VALUE_OPTIONAL), + 'confirmed' => new external_value(PARAM_INT, 'Active user: 1 if confirmed, 0 otherwise', VALUE_OPTIONAL), + 'lang' => new external_value(PARAM_SAFEDIR, 'Language code such as "en", must exist on server', VALUE_OPTIONAL), + 'theme' => new external_value(PARAM_PLUGIN, 'Theme name such as "standard", must exist on server', VALUE_OPTIONAL), + 'timezone' => new external_value(PARAM_TIMEZONE, 'Timezone code such as Australia/Perth, or 99 for default', VALUE_OPTIONAL), + 'mailformat' => new external_value(PARAM_INT, 'Mail format code is 0 for plain text, 1 for HTML etc', VALUE_OPTIONAL), + 'description' => new external_value(PARAM_RAW, 'User profile description', VALUE_OPTIONAL), + 'descriptionformat' => new external_format_value('description', VALUE_OPTIONAL), + 'city' => new external_value(PARAM_NOTAGS, 'Home city of the user', VALUE_OPTIONAL), + 'url' => new external_value(PARAM_URL, 'URL of the user', VALUE_OPTIONAL), + 'country' => new external_value(PARAM_ALPHA, 'Home country code of the user, such as AU or CZ', VALUE_OPTIONAL), + 'profileimageurlsmall' => new external_value(PARAM_URL, 'User image profile URL - small version'), + 'profileimageurl' => new external_value(PARAM_URL, 'User image profile URL - big version'), + 'customfields' => new external_multiple_structure( + new external_single_structure( + array( + 'type' => new external_value(PARAM_ALPHANUMEXT, 'The type of the custom field - text field, checkbox...'), + 'value' => new external_value(PARAM_RAW, 'The value of the custom field'), + 'name' => new external_value(PARAM_RAW, 'The name of the custom field'), + 'shortname' => new external_value(PARAM_RAW, 'The shortname of the custom field - to be able to build the field class in the code'), + ) + ), 'User custom fields (also known as user profile fields)', VALUE_OPTIONAL), + 'preferences' => new external_multiple_structure( + new external_single_structure( + array( + 'name' => new external_value(PARAM_ALPHANUMEXT, 'The name of the preferences'), + 'value' => new external_value(PARAM_RAW, 'The value of the custom field'), + ) + ), 'Users preferences', VALUE_OPTIONAL) + ); + if (!empty($additionalfields)) { + $userfields = array_merge($userfields, $additionalfields); + } + return new external_single_structure($userfields); + } + + +} + +/** + * Tries to obtain user details, either recurring directly to the user's system profile + * or through one of the user's course enrollments (course profile). + * + * @param object $user The user. + * @return array if unsuccessful or the allowed user details. + */ +function user_get_user_details_courses($user) { + global $USER; + $userdetails = null; + + // Get the courses that the user is enrolled in (only active). + $courses = enrol_get_users_courses($user->id, true); + + $systemprofile = false; + if (can_view_user_details_cap($user) || ($user->id == $USER->id) || has_coursecontact_role($user->id)) { + $systemprofile = true; + } + + // Try using system profile. + if ($systemprofile) { + $userdetails = user_get_user_details($user, null); + } else { + // Try through course profile. + foreach ($courses as $course) { + if ($can_view_user_details_cap($user, $course) || ($user->id == $USER->id) || has_coursecontact_role($user->id)) { + $userdetails = user_get_user_details($user, $course); + } + } + } + + return $userdetails; +} + + +/** + * Check if $USER have the necessary capabilities to obtain user details. + * + * @param object $user + * @param object $course if null then only consider system profile otherwise also consider the course's profile. + * @return bool true if $USER can view user details. + */ +function can_view_user_details_cap($user, $course = null) { + // Check $USER has the capability to view the user details at user context. + $usercontext = get_context_instance(CONTEXT_USER, $user->id); + $result = has_capability('moodle/user:viewdetails', $usercontext); + // Otherwise can $USER see them at course context. + if (!$result && !empty($course)) { + $context = get_context_instance(CONTEXT_COURSE, $course->id); + $result = has_capability('moodle/user:viewdetails', $context); + } + return $result; +} + + diff --git a/system/moodlePlugin/fhcompletews/lang/en/local_wstemplate.php b/system/moodlePlugin/fhcompletews/lang/en/local_wstemplate.php new file mode 100644 index 000000000..1d8ddd42e --- /dev/null +++ b/system/moodlePlugin/fhcompletews/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/fhcompletews/version.php b/system/moodlePlugin/fhcompletews/version.php new file mode 100644 index 000000000..ba81bf08f --- /dev/null +++ b/system/moodlePlugin/fhcompletews/version.php @@ -0,0 +1,24 @@ +. + +$plugin->version = 2013022105; // 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 = 2010112400; // Requires this Moodle version - at least 2.0 +$plugin->cron = 0; +$plugin->release = '1.0 (Build: 2013022105)'; +$plugin->maturity = MATURITY_STABLE;