diff --git a/classes/import.php b/classes/import.php new file mode 100755 index 0000000..e460432 --- /dev/null +++ b/classes/import.php @@ -0,0 +1,340 @@ +start_delegated_transaction(); + $result .= "before delete\n"; + $DB->delete_records_select("timetable_lesson", "id>0"); + $result .= "after delete\n"; + foreach (preg_split('/$\R?^/m',$content) as $buffer) { + //echo $buffer; + $result .= "+"; + $buffer = utf8_encode(rtrim($buffer)); + $data = explode("\t", $buffer); + if (count($data) != 10) throw new \Exception('Wrong size of elements '); + $dataobject = (object)array('teacher' => $data[0], + 'day' => $data[1], + 'period' => $data[2], + 'subject' => $data[3], + 'room' => $data[4], + 'lessonid'=> $data[5], + 'flag' => $data[6], + 'class' => $data[7], + 'week' => $data[8], + 'unknown' => $data[9]); + + $DB->insert_record("timetable_lesson", $dataobject); + } + $transaction->allow_commit(); + set_config('filehash_lesson', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } + return ($result); + } + + + private function update_substitution($content) { + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_substitution'); + $hash = md5($content); + if ($hash == $filehash) return('Data not changed'); + $result =""; + try { + $transaction = $DB->start_delegated_transaction(); + $result .= "before delete\n"; + $DB->delete_records_select("timetable_substitution", "id>0"); + $result .= "after delete\n"; + foreach (preg_split('/$\R?^/m',$content) as $buffer) { + $data = str_getcsv($buffer, ','); + $dataobject = (object)array( + 'id' => $data[0], + 'date' => $data[1], + 'period' => $data[2], + 'absence' => $data[3], + 'lesson' => $data[4], + 'teachera' => $data[5], + 'teacherb' => $data[6], + 'subjecta' => utf8_encode($data[7]), + 'statistica' => $data[8], + 'subjectb' => utf8_encode($data[9]), + 'statisticb' => $data[10], + 'rooma' => $data[11], + 'roomb' => $data[12], + 'statisticflag' => $data[13], + 'classa' => utf8_encode($data[14]), + 'reason' => utf8_encode($data[15]), + 'text' => utf8_encode($data[16]), + 'type' => $data[17], + 'classb' => utf8_encode($data[18]), + 'substitutiontype' => $data[19], + 'changetime' => $data[20], + 'unknown' => $data[21]); + //echo var_dump($dataobject); + foreach (get_object_vars($dataobject) as $key => $value) { + if ($value=='') unset($dataobject->{$key}); + } + $DB->insert_record_raw("timetable_substitution", $dataobject,false, false, true); + } + $transaction->allow_commit(); + set_config('filehash_substitution', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } + return $result; + } + + private function update_teacher($content) { + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_teacher'); + $hash = md5($content); + if ($hash == $filehash) return('Data not changed'); + $result = ""; + try { + $transaction = $DB->start_delegated_transaction(); + $result .= "before delete\n"; + $DB->delete_records_select("timetable_teacher", "id>0"); + $result .= "after delete\n"; + foreach (preg_split('/$\R?^/m',$content) as $buffer) { + $buffer = utf8_encode(rtrim($buffer)); + $data = explode("\t", $buffer); + if (!(array_key_exists(3,$data))) { + $data[3] = ''; + } else { + $result .= "firstname exists: $data[3]\n"; + } + //if (count($data) < 3) throw new Exception('Wrong size of elements'); + $dataobject = (object)array('teacher' => $data[0], + 'surname' => $data[1], + 'firstname' => $data[3]); + + $DB->insert_record("timetable_teacher", $dataobject); + } + $transaction->allow_commit(); + set_config('filehash_teacher', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } + return $result; + } + + private function update_room($content) { + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_room'); + $hash = md5($content); + if ($hash == $filehash) return('Data not changed'); + $result = ""; + try { + $transaction = $DB->start_delegated_transaction(); + $result .= "before delete\n"; + $DB->delete_records_select("timetable_room", "id>0"); + $result .= "after delete\n"; + foreach (preg_split('/$\R?^/m',$content) as $buffer) { + $buffer = utf8_encode(rtrim($buffer)); + $data = explode("\t", $buffer); + if (count($data) < 2) throw new \Exception('Wrong size of elements'); + $dataobject = (object)array('room' => $data[0], + 'description' => $data[1]); + + $DB->insert_record("timetable_room", $dataobject); + } + $transaction->allow_commit(); + set_config('filehash_room', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } + return $result; + } + + private function update_class($content) { + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_class'); + $hash = md5($content); + if ($hash == $filehash) return('Data not changed'); + $result = ""; + try { + $transaction = $DB->start_delegated_transaction(); + $result .= "before delete\n"; + $DB->delete_records_select("timetable_class", "id>0"); + $result .= "after delete\n"; + foreach (preg_split('/$\R?^/m',$content) as $buffer) { + $buffer = utf8_encode(rtrim($buffer)); + $data = explode("\t", $buffer); + if (!(array_key_exists(1,$data))) $data[1] = $data[0]; + if (count($data) < 2) throw new \Exception('Wrong size of elements'); + $dataobject = (object)array('class' => $data[0], + 'description' => $data[1]); + + $DB->insert_record("timetable_class", $dataobject); + } + $transaction->allow_commit(); + set_config('filehash_class', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } + return $result; + } + + private function update_absence($content) { + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_abs'); + $hash = md5($content); + if ($hash == $filehash) return('Data not changed'); + $result = ""; + try { + $transaction = $DB->start_delegated_transaction(); + $result .= "before delete\n"; + $DB->delete_records_select("timetable_absence", "id>0"); + $result .= "after delete\n"; + foreach (preg_split('/$\R?^/m',$content) as $buffer) { + $data = str_getcsv($buffer, ','); + $dataobject = (object)array('id' => $data[0], + 'type' => $data[1], + 'name' => utf8_encode($data[2]), + 'startdate' => $data[3], + 'enddate' => $data[4], + 'startperiod' => $data[5], + 'endperiod' => $data[6], + 'reason' => utf8_encode($data[7]), + 'text' => utf8_encode($data[8])); + foreach (get_object_vars($dataobject) as $key => $value) { + if ($value=='') unset($dataobject->{$key}); + } + $DB->insert_record("timetable_absence", $dataobject); + } + $transaction->allow_commit(); + set_config('filehash_abs', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } + return $result; + } + + private function update_absence_reason($content) { + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_absreas'); + $hash = md5($content); + if ($hash == $filehash) return('Data not changed'); + $result = ""; + try { + $transaction = $DB->start_delegated_transaction(); + $result .= "before delete\n"; + $DB->delete_records_select("timetable_absence_reason", "id>0"); + $result .= "after delete\n"; + foreach (preg_split('/$\R?^/m',$content) as $buffer) { + $data = str_getcsv($buffer, ','); + $dataobject = (object)array('reason' => utf8_encode($data[0]), + 'description' => utf8_encode($data[1]), + 'flag' => $data[2], + 'statistic' => $data[3]); + foreach (get_object_vars($dataobject) as $key => $value) { + if ($value=='') unset($dataobject->{$key}); + } + $DB->insert_record("timetable_absence_reason", $dataobject); + } + $transaction->allow_commit(); + set_config('filehash_absreas', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } + return $result; + } + + private function update_time($content) { + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_times'); + $hash = md5($content); + if ($hash == $filehash) return('Data not changed'); + $result = ""; + try { + $transaction = $DB->start_delegated_transaction(); + $result .= "before delete\n"; + $DB->delete_records_select("timetable_time", "id>0"); + $result .= "after delete\n"; + foreach (preg_split('/$\R?^/m',$content) as $buffer) { + $buffer = utf8_encode(rtrim($buffer)); + $data = explode("\t", $buffer); + $dataobject = (object)array('day' => $data[0], + 'period' => $data[1], + 'maxperiod' => $data[2], + 'starttime' => $data[3], + 'endtime' => $data[4]); + $DB->insert_record("timetable_time", $dataobject); + } + $transaction->allow_commit(); + set_config('filehash_times', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } + return $result; + } + + /** + * Execute the task. + */ + public function update($files) { + global $DB,$CFG; + $results = array(); + foreach ($files as $file) { + $content = base64_decode($file['content']); + $result = array(); + $result['name'] = $file['name']; + switch ($file['name']) { + case 'lesson': + $result['result'] = $this->update_lesson($content); + break; + case 'substitution': + $result['result'] = $this->update_substitution($content); + break; + case 'teacher': + $result['result'] = $this->update_teacher($content); + break; + case 'class': + $result['result'] = $this->update_class($content); + break; + case 'room': + $result['result'] = $this->update_room($content); + break; + case 'time': + $result['result'] = $this->update_time($content); + break; + case 'absence': + $result['result'] = $this->update_absence($content); + break; + case 'absence_reason': + $result['result'] = $this->update_absence_reason($content); + break; + default: + $result['result'] = "no handler"; + } + $results[] = $result; + } + return $results; + } + +} diff --git a/classes/lesson.php b/classes/lesson.php index 90ccf99..a9cd869 100755 --- a/classes/lesson.php +++ b/classes/lesson.php @@ -37,6 +37,7 @@ class lesson { $this->room = $lesson->room; $this->period = $lesson->period; $this->day = $lesson->day; + $this->type = $lesson->type; $this->text = ""; $this->substitution = ""; $this->teachera = ""; @@ -51,8 +52,8 @@ class lesson { $this->subjectchanged = false; $this->classchanged = false; $this->roomchanged = false; - $this->reason = ""; - $this->type = 0; + $this->reason = ""; + $this->subtype = 0; } /** @@ -70,12 +71,12 @@ class lesson { $this->subjecta = $substitution->subjecta; $this->classa = $substitution->classa; $this->rooma = $substitution->rooma; - $this->teacherchanged = ($this->teacher != $this->teachera) ? true : false; - $this->subjectchanged = ($this->subject != $this->subjecta) ? true : false; - $this->classchanged = (!preg_match("/(^|~)".preg_quote($this->class,"/")."($|~)/" , $this->classa )) ? true : false; - $this->roomchanged = (!preg_match("/(^|~)".preg_quote($this->room,"/")."($|~)/" , $this->rooma )) ? true : false; + $this->teacherchanged = ($this->teacher != $this->teachera && $this->teachera) ? true : false; + $this->subjectchanged = ($this->subject != $this->subjecta && $this->subjecta) ? true : false; + $this->classchanged = (!preg_match("/(^|~)".preg_quote($this->class,"/")."($|~)/" , $this->classa ) && $this->classa) ? true : false; + $this->roomchanged = (!preg_match("/(^|~)".preg_quote($this->room,"/")."($|~)/" , $this->rooma ) && $this->rooma) ? true : false; if ($substitution->text) $this->text .= $substitution->text; - $this->type = $substitution->type; + $this->subtype = $substitution->type; $this->substitution = "1"; return 1; } elseif (//$this->lessonid == $substitution->lesson && @@ -94,7 +95,7 @@ class lesson { $this->roomchanged = (!preg_match("/(^|~)".preg_quote($this->room,"/")."($|~)/" , $this->roomb )) ? true : false; if ($substitution->text) $this->text .= $substitution->text; // TODO Entfall, falls teacherb!=teacher bzw. class not in classb bzw. roomb!=room TODO - $this->type = $substitution->type; + $this->subtype = $substitution->type; $this->substitution = "1"; return 1; } else { @@ -128,6 +129,9 @@ class lesson { //$this->teacher == $lesson->teacher && $this->subject == $lesson->subject && $this->room == $lesson->room && + $this->type == $lesson->type && + $this->subtype == $lesson->subtype && + //$this->teacherchanged == $lesson->teacherchanged && $this->text == $lesson->text) { if ($this->class != $lesson->class) { $class1parts = explode("/", $this->class); diff --git a/classes/task/import_data.php b/classes/task/import_data.php index b3bc48a..dd95d46 100755 --- a/classes/task/import_data.php +++ b/classes/task/import_data.php @@ -1,374 +1,374 @@ start_delegated_transaction(); - echo "before delete\n"; - $DB->delete_records_select("timetable_lesson", "id>0"); - echo "after delete\n"; - $handle = @fopen($filenamel, "r"); - echo "after handle\n"; - while (($buffer = fgets($handle, 4096)) !== false) { + private function read_lesson() { + global $DB,$CFG; + $lastmtime = get_config('timetable', 'lastmtime'); + $filenamel = get_config('timetable', 'fname_lesson'); + + echo "Lastmtime = $lastmtime\n"; + if ($filenamel && (file_exists ($filenamel))) { + $mtime = filemtime ( $filenamel ); + echo "mtime = $mtime\n"; + if ($mtime<=$lastmtime) return; + echo "after return\n"; + try { + $transaction = $DB->start_delegated_transaction(); + echo "before delete\n"; + $DB->delete_records_select("timetable_lesson", "id>0"); + echo "after delete\n"; + $handle = @fopen($filenamel, "r"); + echo "after handle\n"; + while (($buffer = fgets($handle, 4096)) !== false) { // echo $buffer; - $buffer = utf8_encode(rtrim($buffer)); - $data = explode("\t", $buffer); - if (count($data) != 10) throw new Exception('Wrong size of elements'); - $dataobject = (object)array('teacher' => $data[0], - 'day' => $data[1], - 'period' => $data[2], - 'subject' => $data[3], - 'room' => $data[4], - 'lessonid'=> $data[5], - 'flag' => $data[6], - 'class' => $data[7], - 'week' => $data[8], - 'unknown' => $data[9]); - - $DB->insert_record("timetable_lesson", $dataobject); - } - $transaction->allow_commit(); - fclose($handle); - $lastmtime = $mtime; - set_config('lastmtime', $lastmtime, 'timetable'); - } catch(Exception $e) { - $transaction->rollback($e); - } - } + $buffer = utf8_encode(rtrim($buffer)); + $data = explode("\t", $buffer); + if (count($data) != 10) throw new Exception('Wrong size of elements'); + $dataobject = (object)array('teacher' => $data[0], + 'day' => $data[1], + 'period' => $data[2], + 'subject' => $data[3], + 'room' => $data[4], + 'lessonid'=> $data[5], + 'flag' => $data[6], + 'class' => $data[7], + 'week' => $data[8], + 'unknown' => $data[9]); + + $DB->insert_record("timetable_lesson", $dataobject); + } + $transaction->allow_commit(); + fclose($handle); + $lastmtime = $mtime; + set_config('lastmtime', $lastmtime, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } + } } private function read_substitution() { - global $DB,$CFG; - $filehash = get_config('timetable', 'filehash_substitution'); - $filename = get_config('timetable', 'fname_substitution'); - - if (!$filename || !file_exists($filename)) return; - if (($handle = fopen($filename, 'r')) == FALSE) return; - $hash = hash_file('md5', $filename); - if ($hash == $filehash) return; - /* - $max_id = 0; - $max_changetime = 0; - if ($result = $DB->get_record_sql("select max(id), max(changetime) from {$CFG->prefix}timetable_substitution")) { - $max_id = $result->{'max(id)'}; - $max_changetime = $result->{'max(changetime)'}; - } - echo "Max id = $max_id\n"; - echo "Max changetime = $max_changetime\n"; - */ - try { - $transaction = $DB->start_delegated_transaction(); - echo "before delete\n"; - $DB->delete_records_select("timetable_substitution", "id>0"); - echo "after delete\n"; - while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) { - $dataobject = (object)array('id' => $data[0], - 'date' => $data[1], - 'period' => $data[2], - 'absence' => $data[3], - 'lesson' => $data[4], - 'teachera' => $data[5], - 'teacherb' => $data[6], - 'subjecta' => utf8_encode($data[7]), - 'statistica' => $data[8], - 'subjectb' => utf8_encode($data[9]), - 'statisticb' => $data[10], - 'rooma' => $data[11], - 'roomb' => $data[12], - 'statisticflag' => $data[13], - 'classa' => utf8_encode($data[14]), - 'reason' => utf8_encode($data[15]), - 'text' => utf8_encode($data[16]), - 'type' => $data[17], - 'classb' => utf8_encode($data[18]), - 'substitutiontype' => $data[19], - 'changetime' => $data[20], - 'unknown' => $data[21]); - //echo var_dump($dataobject); - foreach (get_object_vars($dataobject) as $key => $value) { - if ($value=='') unset($dataobject->{$key}); - } - /* - if ($dataobject->id > $max_id) { - $DB->insert_record_raw("timetable_substitution", $dataobject,false, false, true); - echo "Object (id={$data[0]}) inserted\n"; - } elseif ($dataobject->changetime >= $max_changetime) { - $DB->update_record("timetable_substitution", $dataobject); - echo "Object (id={$data[0]}) updated\n"; - } - */ - $DB->insert_record_raw("timetable_substitution", $dataobject,false, false, true); - } - $transaction->allow_commit(); - fclose($handle); - set_config('filehash_substitution', $hash, 'timetable'); - } catch(Exception $e) { - $transaction->rollback($e); - } + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_substitution'); + $filename = get_config('timetable', 'fname_substitution'); + + if (!$filename || !file_exists($filename)) return; + if (($handle = fopen($filename, 'r')) == FALSE) return; + $hash = hash_file('md5', $filename); + if ($hash == $filehash) return; + /* + $max_id = 0; + $max_changetime = 0; + if ($result = $DB->get_record_sql("select max(id), max(changetime) from {$CFG->prefix}timetable_substitution")) { + $max_id = $result->{'max(id)'}; + $max_changetime = $result->{'max(changetime)'}; + } + echo "Max id = $max_id\n"; + echo "Max changetime = $max_changetime\n"; + */ + try { + $transaction = $DB->start_delegated_transaction(); + echo "before delete\n"; + $DB->delete_records_select("timetable_substitution", "id>0"); + echo "after delete\n"; + while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) { + $dataobject = (object)array('id' => $data[0], + 'date' => $data[1], + 'period' => $data[2], + 'absence' => $data[3], + 'lesson' => $data[4], + 'teachera' => $data[5], + 'teacherb' => $data[6], + 'subjecta' => utf8_encode($data[7]), + 'statistica' => $data[8], + 'subjectb' => utf8_encode($data[9]), + 'statisticb' => $data[10], + 'rooma' => $data[11], + 'roomb' => $data[12], + 'statisticflag' => $data[13], + 'classa' => utf8_encode($data[14]), + 'reason' => utf8_encode($data[15]), + 'text' => utf8_encode($data[16]), + 'type' => $data[17], + 'classb' => utf8_encode($data[18]), + 'substitutiontype' => $data[19], + 'changetime' => $data[20], + 'unknown' => $data[21]); + //echo var_dump($dataobject); + foreach (get_object_vars($dataobject) as $key => $value) { + if ($value=='') unset($dataobject->{$key}); + } + /* + if ($dataobject->id > $max_id) { + $DB->insert_record_raw("timetable_substitution", $dataobject,false, false, true); + echo "Object (id={$data[0]}) inserted\n"; + } elseif ($dataobject->changetime >= $max_changetime) { + $DB->update_record("timetable_substitution", $dataobject); + echo "Object (id={$data[0]}) updated\n"; + } + */ + $DB->insert_record_raw("timetable_substitution", $dataobject,false, false, true); + } + $transaction->allow_commit(); + fclose($handle); + set_config('filehash_substitution', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } } private function read_teacher() { - global $DB,$CFG; - $filehash = get_config('timetable', 'filehash_teacher'); - $filename = get_config('timetable', 'fname_teacher'); - echo "Filename: $filename\n"; - if (!$filename || !file_exists($filename)) return; + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_teacher'); + $filename = get_config('timetable', 'fname_teacher'); + echo "Filename: $filename\n"; + if (!$filename || !file_exists($filename)) return; if (($handle = fopen($filename, 'r')) == FALSE) return; - $hash = hash_file('md5', $filename); - if ($hash == $filehash) return; - try { - $transaction = $DB->start_delegated_transaction(); - echo "before delete\n"; - $DB->delete_records_select("timetable_teacher", "id>0"); - echo "after delete\n"; - $handle = @fopen($filename, "r"); - echo "after handle\n"; - while (($buffer = fgets($handle, 4096)) !== false) { - echo $buffer; - $buffer = utf8_encode(rtrim($buffer)); - $data = explode("\t", $buffer); - if (!(array_key_exists(3,$data))) { - $data[3] = ''; - } else { - echo "firstname exists: $data[3]\n"; - } - //if (count($data) < 3) throw new Exception('Wrong size of elements'); - $dataobject = (object)array('teacher' => $data[0], - 'surname' => $data[1], - 'firstname' => $data[3]); - - $DB->insert_record("timetable_teacher", $dataobject); - } - $transaction->allow_commit(); - fclose($handle); - set_config('filehash_teacher', $hash, 'timetable'); - } catch(Exception $e) { - $transaction->rollback($e); + $hash = hash_file('md5', $filename); + if ($hash == $filehash) return; + try { + $transaction = $DB->start_delegated_transaction(); + echo "before delete\n"; + $DB->delete_records_select("timetable_teacher", "id>0"); + echo "after delete\n"; + $handle = @fopen($filename, "r"); + echo "after handle\n"; + while (($buffer = fgets($handle, 4096)) !== false) { + echo $buffer; + $buffer = utf8_encode(rtrim($buffer)); + $data = explode("\t", $buffer); + if (!(array_key_exists(3,$data))) { + $data[3] = ''; + } else { + echo "firstname exists: $data[3]\n"; + } + //if (count($data) < 3) throw new Exception('Wrong size of elements'); + $dataobject = (object)array('teacher' => $data[0], + 'surname' => $data[1], + 'firstname' => $data[3]); + + $DB->insert_record("timetable_teacher", $dataobject); + } + $transaction->allow_commit(); + fclose($handle); + set_config('filehash_teacher', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); } } private function read_room() { - global $DB,$CFG; - $filehash = get_config('timetable', 'filehash_room'); - $filename = get_config('timetable', 'fname_room'); - - if (!$filename || !file_exists($filename)) return; + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_room'); + $filename = get_config('timetable', 'fname_room'); + + if (!$filename || !file_exists($filename)) return; if (($handle = fopen($filename, 'r')) == FALSE) return; - $hash = hash_file('md5', $filename); - if ($hash == $filehash) return; - try { - $transaction = $DB->start_delegated_transaction(); - echo "before delete\n"; - $DB->delete_records_select("timetable_room", "id>0"); - echo "after delete\n"; - $handle = @fopen($filename, "r"); - echo "after handle\n"; - while (($buffer = fgets($handle, 4096)) !== false) { - // echo $buffer; - $buffer = utf8_encode(rtrim($buffer)); - $data = explode("\t", $buffer); - if (count($data) < 2) throw new Exception('Wrong size of elements'); - $dataobject = (object)array('room' => $data[0], - 'description' => $data[1]); - - $DB->insert_record("timetable_room", $dataobject); - } - $transaction->allow_commit(); - fclose($handle); - set_config('filehash_room', $hash, 'timetable'); - } catch(Exception $e) { - $transaction->rollback($e); - } + $hash = hash_file('md5', $filename); + if ($hash == $filehash) return; + try { + $transaction = $DB->start_delegated_transaction(); + echo "before delete\n"; + $DB->delete_records_select("timetable_room", "id>0"); + echo "after delete\n"; + $handle = @fopen($filename, "r"); + echo "after handle\n"; + while (($buffer = fgets($handle, 4096)) !== false) { + // echo $buffer; + $buffer = utf8_encode(rtrim($buffer)); + $data = explode("\t", $buffer); + if (count($data) < 2) throw new Exception('Wrong size of elements'); + $dataobject = (object)array('room' => $data[0], + 'description' => $data[1]); + + $DB->insert_record("timetable_room", $dataobject); + } + $transaction->allow_commit(); + fclose($handle); + set_config('filehash_room', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } } private function read_class() { - global $DB,$CFG; - $filehash = get_config('timetable', 'filehash_class'); - $filename = get_config('timetable', 'fname_class'); - - if (!$filename || !file_exists($filename)) return; + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_class'); + $filename = get_config('timetable', 'fname_class'); + + if (!$filename || !file_exists($filename)) return; if (($handle = fopen($filename, 'r')) == FALSE) return; - $hash = hash_file('md5', $filename); - if ($hash == $filehash) return; - try { - $transaction = $DB->start_delegated_transaction(); - echo "before delete\n"; - $DB->delete_records_select("timetable_class", "id>0"); - echo "after delete\n"; - $handle = @fopen($filename, "r"); - echo "after handle\n"; - while (($buffer = fgets($handle, 4096)) !== false) { - // echo $buffer; - $buffer = utf8_encode(rtrim($buffer)); - $data = explode("\t", $buffer); - if (!(array_key_exists(1,$data))) $data[1] = $data[0]; - - if (count($data) < 2) throw new Exception('Wrong size of elements'); - $dataobject = (object)array('class' => $data[0], - 'description' => $data[1]); - - $DB->insert_record("timetable_class", $dataobject); - } - $transaction->allow_commit(); - fclose($handle); - set_config('filehash_class', $hash, 'timetable'); - } catch(Exception $e) { - $transaction->rollback($e); - } + $hash = hash_file('md5', $filename); + if ($hash == $filehash) return; + try { + $transaction = $DB->start_delegated_transaction(); + echo "before delete\n"; + $DB->delete_records_select("timetable_class", "id>0"); + echo "after delete\n"; + $handle = @fopen($filename, "r"); + echo "after handle\n"; + while (($buffer = fgets($handle, 4096)) !== false) { + // echo $buffer; + $buffer = utf8_encode(rtrim($buffer)); + $data = explode("\t", $buffer); + if (!(array_key_exists(1,$data))) $data[1] = $data[0]; + + if (count($data) < 2) throw new Exception('Wrong size of elements'); + $dataobject = (object)array('class' => $data[0], + 'description' => $data[1]); + + $DB->insert_record("timetable_class", $dataobject); + } + $transaction->allow_commit(); + fclose($handle); + set_config('filehash_class', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } } private function read_absence() { - global $DB,$CFG; - $filehash = get_config('timetable', 'filehash_abs'); - $filename = get_config('timetable', 'fname_absence'); - - if (!$filename || !file_exists($filename)) return; - if (($handle = fopen($filename, 'r')) == FALSE) return; - $hash = hash_file('md5', $filename); - if ($hash == $filehash) return; - try { - $transaction = $DB->start_delegated_transaction(); - echo "before delete\n"; - $DB->delete_records_select("timetable_absence", "id>0"); - echo "after delete\n"; - $handle = @fopen($filename, "r"); - echo "after handle\n"; - while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) { - $dataobject = (object)array('id' => $data[0], - 'type' => $data[1], - 'name' => utf8_encode($data[2]), - 'startdate' => $data[3], - 'enddate' => $data[4], - 'startperiod' => $data[5], - 'endperiod' => $data[6], - 'reason' => utf8_encode($data[7]), - 'text' => utf8_encode($data[8])); - //echo var_dump($dataobject); - foreach (get_object_vars($dataobject) as $key => $value) { - if ($value=='') unset($dataobject->{$key}); - } - $DB->insert_record("timetable_absence", $dataobject); - } - $transaction->allow_commit(); - fclose($handle); - set_config('filehash_abs', $hash, 'timetable'); - } catch(Exception $e) { - $transaction->rollback($e); - } + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_abs'); + $filename = get_config('timetable', 'fname_absence'); + + if (!$filename || !file_exists($filename)) return; + if (($handle = fopen($filename, 'r')) == FALSE) return; + $hash = hash_file('md5', $filename); + if ($hash == $filehash) return; + try { + $transaction = $DB->start_delegated_transaction(); + echo "before delete\n"; + $DB->delete_records_select("timetable_absence", "id>0"); + echo "after delete\n"; + $handle = @fopen($filename, "r"); + echo "after handle\n"; + while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) { + $dataobject = (object)array('id' => $data[0], + 'type' => $data[1], + 'name' => utf8_encode($data[2]), + 'startdate' => $data[3], + 'enddate' => $data[4], + 'startperiod' => $data[5], + 'endperiod' => $data[6], + 'reason' => utf8_encode($data[7]), + 'text' => utf8_encode($data[8])); + //echo var_dump($dataobject); + foreach (get_object_vars($dataobject) as $key => $value) { + if ($value=='') unset($dataobject->{$key}); + } + $DB->insert_record("timetable_absence", $dataobject); + } + $transaction->allow_commit(); + fclose($handle); + set_config('filehash_abs', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } } private function read_absence_reason() { - global $DB,$CFG; - $filehash = get_config('timetable', 'filehash_absreas'); - $filename = get_config('timetable', 'fname_absence_reason'); - - if (!$filename || !file_exists($filename)) return; - if (($handle = fopen($filename, 'r')) == FALSE) return; - $hash = hash_file('md5', $filename); - if ($hash == $filehash) return; - try { - $transaction = $DB->start_delegated_transaction(); - echo "before delete\n"; - $DB->delete_records_select("timetable_absence_reason", "id>0"); - echo "after delete\n"; - $handle = @fopen($filename, "r"); - echo "after handle\n"; - while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) { - $dataobject = (object)array('reason' => utf8_encode($data[0]), - 'description' => utf8_encode($data[1]), - 'flag' => $data[2], - 'statistic' => $data[3]); - //echo var_dump($dataobject); - foreach (get_object_vars($dataobject) as $key => $value) { - if ($value=='') unset($dataobject->{$key}); - } - $DB->insert_record("timetable_absence_reason", $dataobject); - } - $transaction->allow_commit(); - fclose($handle); - set_config('filehash_absreas', $hash, 'timetable'); - } catch(Exception $e) { - $transaction->rollback($e); - } + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_absreas'); + $filename = get_config('timetable', 'fname_absence_reason'); + + if (!$filename || !file_exists($filename)) return; + if (($handle = fopen($filename, 'r')) == FALSE) return; + $hash = hash_file('md5', $filename); + if ($hash == $filehash) return; + try { + $transaction = $DB->start_delegated_transaction(); + echo "before delete\n"; + $DB->delete_records_select("timetable_absence_reason", "id>0"); + echo "after delete\n"; + $handle = @fopen($filename, "r"); + echo "after handle\n"; + while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) { + $dataobject = (object)array('reason' => utf8_encode($data[0]), + 'description' => utf8_encode($data[1]), + 'flag' => $data[2], + 'statistic' => $data[3]); + //echo var_dump($dataobject); + foreach (get_object_vars($dataobject) as $key => $value) { + if ($value=='') unset($dataobject->{$key}); + } + $DB->insert_record("timetable_absence_reason", $dataobject); + } + $transaction->allow_commit(); + fclose($handle); + set_config('filehash_absreas', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } } private function read_times() { - global $DB,$CFG; - $filehash = get_config('timetable', 'filehash_times'); - $filename = get_config('timetable', 'fname_times'); - - if (!$filename || !file_exists($filename)) return; - if (($handle = fopen($filename, 'r')) == FALSE) return; - $hash = hash_file('md5', $filename); - if ($hash == $filehash) return; - try { - $transaction = $DB->start_delegated_transaction(); - echo "before delete\n"; - $DB->delete_records_select("timetable_time", "id>0"); - echo "after delete\n"; - $handle = @fopen($filename, "r"); - echo "after handle\n"; - while (($buffer = fgets($handle, 4096)) !== false) { - // echo $buffer; - $buffer = utf8_encode(rtrim($buffer)); - $data = explode("\t", $buffer); - - $dataobject = (object)array('day' => $data[0], - 'period' => $data[1], - 'maxperiod' => $data[2], - 'starttime' => $data[3], - 'endtime' => $data[4]); - - $DB->insert_record("timetable_time", $dataobject); - } - $transaction->allow_commit(); - fclose($handle); - set_config('filehash_times', $hash, 'timetable'); - } catch(Exception $e) { - $transaction->rollback($e); - } + global $DB,$CFG; + $filehash = get_config('timetable', 'filehash_times'); + $filename = get_config('timetable', 'fname_times'); + + if (!$filename || !file_exists($filename)) return; + if (($handle = fopen($filename, 'r')) == FALSE) return; + $hash = hash_file('md5', $filename); + if ($hash == $filehash) return; + try { + $transaction = $DB->start_delegated_transaction(); + echo "before delete\n"; + $DB->delete_records_select("timetable_time", "id>0"); + echo "after delete\n"; + $handle = @fopen($filename, "r"); + echo "after handle\n"; + while (($buffer = fgets($handle, 4096)) !== false) { + // echo $buffer; + $buffer = utf8_encode(rtrim($buffer)); + $data = explode("\t", $buffer); + + $dataobject = (object)array('day' => $data[0], + 'period' => $data[1], + 'maxperiod' => $data[2], + 'starttime' => $data[3], + 'endtime' => $data[4]); + + $DB->insert_record("timetable_time", $dataobject); + } + $transaction->allow_commit(); + fclose($handle); + set_config('filehash_times', $hash, 'timetable'); + } catch(Exception $e) { + $transaction->rollback($e); + } } /** * Execute the task. */ public function execute() { - global $DB,$CFG; + global $DB,$CFG; - $this->read_lesson(); - $this->read_substitution(); - $this->read_teacher(); - $this->read_room(); - $this->read_class(); - $this->read_absence(); - $this->read_absence_reason(); - $this->read_times(); + $this->read_lesson(); + $this->read_substitution(); + $this->read_teacher(); + $this->read_room(); + $this->read_class(); + $this->read_absence(); + $this->read_absence_reason(); + $this->read_times(); } } diff --git a/classes/timetable.php b/classes/timetable.php index ac37543..5573ddd 100755 --- a/classes/timetable.php +++ b/classes/timetable.php @@ -29,7 +29,8 @@ function lesson_in_lessons($obj, $array) { $obj->teacher == $array[$n]->teacher && $obj->subject == $array[$n]->subject && $obj->class == $array[$n]->class && - $obj->room == $array[$n]->room) return true; + $obj->room == $array[$n]->room && + $obj->type == $array[$n]->type) return true; } return false; } @@ -120,20 +121,23 @@ class timetable { $sql = "$this->type = '$this->name' AND NOT lessonid=0 AND (mid(week, $this->week, 1) = '1')"; $result = $DB->get_records_select('timetable_lesson',$sql); foreach ($result as $lesson) { + $lesson->type = "normal"; if (!lesson_in_lessons($lesson, $this->lessons[$lesson->day][$lesson->period])) $this->lessons[$lesson->day][$lesson->period][] = new lesson($lesson); } $sql = "$this->type = '$this->name' AND lessonid=0 AND (mid(week, $this->week, 1) = '1')"; $result = $DB->get_records_select('timetable_lesson',$sql); foreach ($result as $lesson) { - if (!lesson_in_lessons($lesson, $this->lessons_event[$lesson->day][$lesson->period])) - $this->lessons_event[$lesson->day][$lesson->period][] = new lesson($lesson); + $lesson->type = "event"; + if (!lesson_in_lessons($lesson, $this->lessons[$lesson->day][$lesson->period])) + $this->lessons[$lesson->day][$lesson->period][] = new lesson($lesson); } $sql = "$this->type = '$this->name' and (mid(week, $this->week, 1) = 'x')"; $result = $DB->get_records_select('timetable_lesson',$sql); foreach ($result as $lesson) { - if (!lesson_in_lessons($lesson, $this->lessons_canceled[$lesson->day][$lesson->period])) - $this->lessons_canceled[$lesson->day][$lesson->period][] = new lesson($lesson); + $lesson->type = "canceled"; + if (!lesson_in_lessons($lesson, $this->lessons[$lesson->day][$lesson->period])) + $this->lessons[$lesson->day][$lesson->period][] = new lesson($lesson); } $day = new \DateTime($this->monday->format('Y-m-d\TH:i:sP')); @@ -144,12 +148,6 @@ class timetable { foreach ($this->lessons[$i+1][$substitution->period] as $lesson) { $lesson->process_substitution($substitution); } - foreach ($this->lessons_canceled[$i+1][$substitution->period] as $lesson) { - $lesson->process_substitution($substitution); - } - foreach ($this->lessons_event[$i+1][$substitution->period] as $lesson) { - $lesson->process_substitution($substitution); - } } $types = array('teacher'=>'L', 'class'=>'K', 'room'=>'R'); @@ -157,8 +155,8 @@ class timetable { $result = $DB->get_records_select('timetable_absence',$sql); foreach ($result as $absence) { for ($j=$absence->startperiod; $j<=$absence->endperiod; $j++) { - foreach ($this->lessons_event[$i+1][$j] as $lesson) { - $lesson->process_absence($absence); + foreach ($this->lessons[$i+1][$j] as $lesson) { + if ($lesson->type == 'event') $lesson->process_absence($absence); } } } @@ -168,7 +166,7 @@ class timetable { for ($i=0; $i<$this->numdayweek; $i++) { foreach($this->lessons[$i+1] as &$lessons) $lessons = collapse_lessons($lessons); - foreach($this->lessons_canceled[$i+1] as &$lessons) $lessons = collapse_lessons($lessons); + // not to be done for events??? } if ($this->type == 'teacher') { @@ -191,10 +189,6 @@ class timetable { for ($i=0; $i<$this->numdayweek; $i++) { foreach($this->lessons[$i+1] as $period => $lessons) if ($period > $maxperiod && count($lessons)) $maxperiod = $period; - foreach($this->lessons_canceled[$i+1] as $period => $lessons) - if ($period > $maxperiod && count($lessons)) $maxperiod = $period; - foreach($this->lessons_event[$i+1] as $period => $lessons) - if ($period > $maxperiod && count($lessons)) $maxperiod = $period; } return $maxperiod; } @@ -226,40 +220,6 @@ class timetable { $days[$day] = array(); $days[$day]['substitutionold'] = ""; $days[$day]['lessons'] = array(); - foreach ($this->lessons_event[$day+1][$period+1] as $lesson) { - $mylesson = array(); - $mylesson['class'] = $lesson->class; - $mylesson['teacher'] = $lesson->teacher; - $mylesson['room'] = $lesson->room; - $mylesson['subject'] = $lesson->subject; - $mylesson['classa'] = $lesson->classa; - $mylesson['teachera'] = $lesson->teachera; - $mylesson['rooma'] = $lesson->rooma; - $mylesson['subjecta'] = $lesson->subjecta; - $mylesson['classb'] = property_exists($lesson,'classb') ? $lesson->classb : null; - $mylesson['teacherb'] = property_exists($lesson,'teacherb') ? $lesson->teacherb : null; - $mylesson['roomb'] = property_exists($lesson,'roomb') ? $lesson->roomb : null; - $mylesson['subjectb'] = property_exists($lesson,'subjectb') ? $lesson->subjectb : null; - $mylesson['subjectchanged'] = $lesson->subjectchanged; - $mylesson['teacherchanged'] = $lesson->teacherchanged; - $mylesson['classchanged'] = $lesson->classchanged; - $mylesson['roomchanged'] = $lesson->roomchanged; - $mylesson['substitution'] = $lesson->substitution; - $mylesson['cancel'] = ""; - $mylesson['cancel4me'] = ""; - $mylesson['event'] = $lesson->reason ? $lesson->reason : "Event"; - $mylesson['status'] = "1"; - $mylesson['flag'] = "1"; - $mylesson['text'] = $lesson->text; - $mylesson['subtype'] = Array(); - if ($lesson->type) { - for ($i=0; $i<32; $i++) { - if ($lesson->type & (1<<$i)) $mylesson['subtype'][] = $i+1; - } - } - $days[$day]['substitutionold'] .= $lesson->text; - $days[$day]['lessons'][] = $mylesson; - } foreach ($this->lessons[$day+1][$period+1] as $lesson) { $mylesson = array(); $mylesson['class'] = $lesson->class; @@ -286,52 +246,25 @@ class timetable { $mylesson['flag'] = ""; $mylesson['text'] = $lesson->text; $mylesson['subtype'] = Array(); - if ($lesson->type) { + if ($lesson->subtype) { for ($i=0; $i<32; $i++) { - if ($lesson->type & (1<<$i)) $mylesson['subtype'][] = $i+1; + if ($lesson->subtype & (1<<$i)) $mylesson['subtype'][] = $i+1; } } $days[$day]['substitutionold'] .= $lesson->text; - $days[$day]['lessons'][] = $mylesson; - } - foreach ($this->lessons_canceled[$day+1][$period+1] as $lesson) { - $mylesson = array(); - $mylesson['class'] = $lesson->class; - $mylesson['teacher'] = $lesson->teacher; - $mylesson['room'] = $lesson->room; - $mylesson['subject'] = $lesson->subject; - $mylesson['classa'] = $lesson->classa; - $mylesson['teachera'] = $lesson->teachera; - $mylesson['rooma'] = $lesson->rooma; - $mylesson['subjecta'] = $lesson->subjecta; - $mylesson['classb'] = property_exists($lesson,'classb') ? $lesson->classb : null; - $mylesson['teacherb'] = property_exists($lesson,'teacherb') ? $lesson->teacherb : null; - $mylesson['roomb'] = property_exists($lesson,'roomb') ? $lesson->roomb : null; - $mylesson['subjectb'] = property_exists($lesson,'subjectb') ? $lesson->subjectb : null; - $mylesson['substitution'] = $lesson->substitution; - $mylesson['cancel'] = "1"; - $mylesson['cancel4me'] = ""; - if (($lesson->teacherchanged && $this->type == 'teacher') || - ($lesson->classchanged && $this->type == 'class') || - ($lesson->roomchanged && $this->type == 'room')) $mylesson['cancel4me'] = "cancel4me"; - $mylesson['subjectchanged'] = $lesson->subjectchanged; - $mylesson['teacherchanged'] = $lesson->teacherchanged; - $mylesson['classchanged'] = $lesson->classchanged; - $mylesson['roomchanged'] = $lesson->roomchanged; - #if ((property_exists($lesson,'teacherb') && $this->type == 'teacher') || - # (property_exists($lesson,'classb') && $this->type == 'class') || - # (property_exists($lesson,'roomb') && $this->type == 'room')) $mylesson['cancel4me'] = "cancel4me"; - $mylesson['event'] = ""; - $mylesson['status'] = "1"; - $mylesson['flag'] = "1"; // status und flag werden vertauscht (im Template bzw. extern-lib.php - $mylesson['text'] = $lesson->text; - $mylesson['subtype'] = Array(); - if ($lesson->type) { - for ($i=0; $i<32; $i++) { - if ($lesson->type & (1<<$i)) $mylesson['subtype'][] = $i+1; - } + if ($lesson->type == 'event') { + $mylesson['event'] = $lesson->reason ? $lesson->reason : "Event"; + $mylesson['status'] = "1"; + $mylesson['flag'] = "1"; + } elseif ($lesson->type == 'canceled') { + $mylesson['cancel'] = "1"; + $mylesson['cancel4me'] = ""; + if (($lesson->teacherchanged && $this->type == 'teacher') || + ($lesson->classchanged && $this->type == 'class') || + ($lesson->roomchanged && $this->type == 'room')) $mylesson['cancel4me'] = "cancel4me"; + $mylesson['status'] = "1"; + $mylesson['flag'] = "1"; // status und flag werden vertauscht (im Template bzw. extern-lib.php } - $days[$day]['substitutionold'] .= $lesson->text; $days[$day]['lessons'][] = $mylesson; } } diff --git a/db/access.php b/db/access.php index 2bd3f2e..692003a 100755 --- a/db/access.php +++ b/db/access.php @@ -28,6 +28,16 @@ defined('MOODLE_INTERNAL') || die(); $capabilities = array( + 'mod/timetable:update' => array( + 'riskbitmask' => RISK_XSS, + + 'captype' => 'write', + 'contextlevel' => CONTEXT_USER, + 'archetypes' => array( + 'manager' => CAP_ALLOW + ), + ), + 'mod/timetable:addinstance' => array( 'riskbitmask' => RISK_XSS, diff --git a/db/services.php b/db/services.php index c7d0a24..7b5d7b3 100755 --- a/db/services.php +++ b/db/services.php @@ -40,6 +40,15 @@ $functions = array( 'type' => 'read', 'ajax' => true, 'capabilities' => array(), // capabilities required by the function. + ), + 'mod_timetable_update' => array( + 'classname' => 'mod_timetable_external', + 'methodname' => 'update', + 'classpath' => 'mod/timetable/externallib.php', + 'description' => 'update timetable data', + 'type' => 'write', + 'ajax' => false, + 'capabilities' => array(), // capabilities required by the function. ) ); diff --git a/externallib.php b/externallib.php index 25e84b7..afa38ab 100755 --- a/externallib.php +++ b/externallib.php @@ -21,138 +21,201 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once($CFG->libdir . "/externallib.php"); +require_once("classes/import.php"); class mod_timetable_external extends external_api { - /** - * Returns description of method parameters - * @return external_function_parameters - */ - public static function search_parameters() { - return new external_function_parameters( - array('searchstring' => new external_value(PARAM_TEXT, 'The searchstring.', VALUE_DEFAULT, '')) - ); - } + /** + * Returns description of method parameters + * @return external_function_parameters + */ + public static function search_parameters() { + return new external_function_parameters( + array('searchstring' => new external_value(PARAM_TEXT, 'The searchstring.', VALUE_DEFAULT, '')) + ); + } - /** - * Returns welcome message - * @return search result message - */ - public static function search($searchstring = 'Hello world, ') { - global $USER,$DB; + /** + * Returns welcome message + * @return search result message + */ + public static function search($searchstring = 'Hello world, ') { + global $USER,$DB; - //Parameter validation - //REQUIRED - $params = self::validate_parameters(self::search_parameters(), - array('searchstring' => $searchstring)); + //Parameter validation + //REQUIRED + $params = self::validate_parameters(self::search_parameters(), + array('searchstring' => $searchstring)); - //Context validation - //OPTIONAL but in most web service it should present - $context = get_context_instance(CONTEXT_USER, $USER->id); - self::validate_context($context); + //Context validation + //OPTIONAL but in most web service it should present + //$context = get_context_instance(CONTEXT_USER, $USER->id); + $context = context_user::instance($USER->id); + self::validate_context($context); - //Capability checking - //OPTIONAL but in most web service it should present - if (!has_capability('mod/timetable:search', $context)) { - throw new moodle_exception('cannotperformsearch'); - } - - - $results = array(); - //return $params['searchstring'] . $USER->firstname ; - $classes = $DB->get_records_select('timetable_class', 'class like ? OR description like ? LIMIT 10', array ('%'.$params['searchstring'].'%', '%'.$params['searchstring'].'%')); - foreach($classes as $class) { - $result = array( - 'type' => 'class', - 'name' => $class->class, - 'description' => "Klassenplan: $class->description ($class->class)" - ); - $results[] = $result; - } - $teachers = $DB->get_records_select('timetable_teacher', 'teacher like ? OR surname like ? LIMIT 10', array ('%'.$params['searchstring'].'%', '%'.$params['searchstring'].'%')); - foreach($teachers as $teacher) { - $result = array( - 'type' => 'teacher', - 'name' => $teacher->teacher, - 'description' => "Lehrerplan: $teacher->surname, $teacher->firstname ($teacher->teacher)" - ); - $results[] = $result; - } - $rooms = $DB->get_records_select('timetable_room', 'description like ? limit 10', array ('%'.$params['searchstring'].'%')); - foreach($rooms as $room) { - $result = array( - 'type' => 'room', - 'name' => $room->room, - 'description' => "Raumplan: ".$room->description - ); - $results[] = $result; - } - //echo var_dump($results); - return $results; - } - - /** - * Returns description of method result value - * @return external_description - */ - public static function search_returns() { - //return new external_value(PARAM_TEXT, 'The search result'); - return new external_multiple_structure( - new external_single_structure( - array( - 'type' => new external_value(PARAM_TEXT, 'type of timetable: class, teacher, room'), - 'name' => new external_value(PARAM_TEXT, 'value of type'), - 'description' => new external_value(PARAM_TEXT, 'description') - ) - ) - ); + //Capability checking + //OPTIONAL but in most web service it should present + if (!has_capability('mod/timetable:search', $context)) { + throw new moodle_exception('cannotperformsearch'); } + $results = array(); + $classes = $DB->get_records_select('timetable_class', 'class like ? OR description like ? LIMIT 10', array ('%'.$params['searchstring'].'%', '%'.$params['searchstring'].'%')); + foreach($classes as $class) { + $result = array( + 'type' => 'class', + 'name' => $class->class, + 'description' => "Klassenplan: $class->description ($class->class)" + ); + $results[] = $result; + } + $teachers = $DB->get_records_select('timetable_teacher', 'teacher like ? OR surname like ? LIMIT 10', array ('%'.$params['searchstring'].'%', '%'.$params['searchstring'].'%')); + foreach($teachers as $teacher) { + $result = array( + 'type' => 'teacher', + 'name' => $teacher->teacher, + 'description' => "Lehrerplan: $teacher->surname, $teacher->firstname ($teacher->teacher)" + ); + $results[] = $result; + } + $rooms = $DB->get_records_select('timetable_room', 'description like ? limit 10', array ('%'.$params['searchstring'].'%')); + foreach($rooms as $room) { + $result = array( + 'type' => 'room', + 'name' => $room->room, + 'description' => "Raumplan: ".$room->description + ); + $results[] = $result; + } + return $results; + } - /** - * Returns description of method parameters - * @return external_function_parameters - */ - public static function get_parameters() { - return new external_function_parameters( + /** + * Returns description of method result value + * @return external_description + */ + public static function search_returns() { + //return new external_value(PARAM_TEXT, 'The search result'); + return new external_multiple_structure( + new external_single_structure( + array( + 'type' => new external_value(PARAM_TEXT, 'type of timetable: class, teacher, room'), + 'name' => new external_value(PARAM_TEXT, 'value of type'), + 'description' => new external_value(PARAM_TEXT, 'description') + ) + ) + ); + } + + + + /** + * Returns description of method parameters + * @return external_function_parameters + */ + public static function update_parameters() { + return new external_function_parameters( + array( + 'files' => new external_multiple_structure( + new external_single_structure( array( - 'type' => new external_value(PARAM_TEXT, 'The type of timetable: class, teacher, room'), - 'name' => new external_value(PARAM_TEXT, 'value of type'), - 'week' => new external_value(PARAM_INT, 'The week of timetable') + 'name' => new external_value(PARAM_TEXT, 'name of file'), + 'content' => new external_value(PARAM_RAW, 'content of file') ) - ); + ) + ) + ) + ); + } + + + + /** + * Returns description of method result value + * @return external_description + */ + public static function update_returns() { + return new external_multiple_structure( + new external_single_structure( + array( + 'name' => new external_value(PARAM_TEXT, 'name of file'), + 'result' => new external_value(PARAM_RAW, 'result message') + ) + ) + ); + } + + + + /** + * Returns description of method result value + * @return external_description + */ + public static function update($files) { + global $USER; + //Context validation + //OPTIONAL but in most web service it should present + $context = context_user::instance($USER->id); + self::validate_context($context); + + //$contextmodule = context_module::instance($cm->id); + $usercontext = context_user::instance($USER->id); + + //Capability checking + //OPTIONAL but in most web service it should present + if (!has_capability('mod/timetable:update', $usercontext)) { + throw new \moodle_exception('cannotupdatetimetable'); } - /** - * Returns welcome message - * @return get result message - */ - public static function get($type,$name,$week) { - global $USER,$DB; + $import_data = new \mod_timetable\import_data(); + return $import_data->update($files); + } - //Parameter validation - //REQUIRED - //echo "Hallo\n"; - $params = self::validate_parameters(self::get_parameters(), - array('type' => $type, 'name'=> $name, 'week' => $week)); - //Context validation - //OPTIONAL but in most web service it should present - $context = get_context_instance(CONTEXT_USER, $USER->id); - self::validate_context($context); + /** + * Returns description of method parameters + * @return external_function_parameters + */ + public static function get_parameters() { + return new external_function_parameters( + array( + 'type' => new external_value(PARAM_TEXT, 'The type of timetable: class, teacher, room'), + 'name' => new external_value(PARAM_TEXT, 'value of type'), + 'week' => new external_value(PARAM_INT, 'The week of timetable') + ) + ); + } - //$contextmodule = context_module::instance($cm->id); - $usercontext = context_user::instance($USER->id); + /** + * Returns welcome message + * @return get result message + */ + public static function get($type,$name,$week) { + global $USER,$DB; - //Capability checking - //OPTIONAL but in most web service it should present - if (!has_capability('mod/timetable:view'.$params['type'], $usercontext)) { - //if (!(($params['type'] == 'class') && has_capability('mod/timetable:viewownclass', $usercontext) && ($params['name'] == str_replace('_','/',$USER->department)))) - if (!(($params['type'] == 'class') && ($params['name'] == str_replace('_','/',$USER->department)))) - throw new \moodle_exception('cannotviewtimetable'.$params['type']); - } + //Parameter validation + //REQUIRED + $params = self::validate_parameters(self::get_parameters(), + array('type' => $type, 'name'=> $name, 'week' => $week)); + + //Context validation + //OPTIONAL but in most web service it should present + //$context = get_context_instance(CONTEXT_USER, $USER->id); + $context = context_user::instance($USER->id); + self::validate_context($context); + + //$contextmodule = context_module::instance($cm->id); + $usercontext = context_user::instance($USER->id); + + //Capability checking + //OPTIONAL but in most web service it should present + if (!has_capability('mod/timetable:view'.$params['type'], $usercontext)) { + //if (!(($params['type'] == 'class') && has_capability('mod/timetable:viewownclass', $usercontext) && ($params['name'] == str_replace('_','/',$USER->department)))) + if (!(($params['type'] == 'class') && ($params['name'] == str_replace('_','/',$USER->department)))) + throw new \moodle_exception('cannotviewtimetable'.$params['type']); + } /* if ($USER->department == "Lehrer" || $USER->department == "Lehrer_fvs") { @@ -162,99 +225,99 @@ class mod_timetable_external extends external_api { } else { throw new \moodle_exeption('Forbidden'); } - */ + */ - //echo "Type: ".$params['type']."\n"; - //echo "Name: ".$params['name']."\n"; - //echo "Week: ".$params['week']."\n"; - if(!($params['week'])) { - $today = new \DateTime(); - $params['week'] = $today->format("W"); - $dayofweek = $today->format('w'); - if (($dayofweek > 5 + get_config('timetable', 'saturday')) || ($dayofweek == 0)) { - $params['week']++; - } - } - - $ttable = new \mod_timetable\timetable($params['type'],$params['name']); - $ttable->read_db($params['week']); - //echo var_dump($ttable->prepare_output()); - return $ttable->prepare_output(); - //$renderable = new \mod_timetable\output\timetable($ttable); - //return $renderable->export_for_template(new \mod_timetable\output\renderer($USER,array())); + //echo "Type: ".$params['type']."\n"; + //echo "Name: ".$params['name']."\n"; + //echo "Week: ".$params['week']."\n"; + if(!($params['week'])) { + $today = new \DateTime(); + $params['week'] = $today->format("W"); + $dayofweek = $today->format('w'); + if (($dayofweek > 5 + get_config('timetable', 'saturday')) || ($dayofweek == 0)) { + $params['week']++; + } } - /** - * Returns description of method result value - * @return external_description - */ - public static function get_returns() { + $ttable = new \mod_timetable\timetable($params['type'],$params['name']); + $ttable->read_db($params['week']); + //echo var_dump($ttable->prepare_output()); + return $ttable->prepare_output(); + //$renderable = new \mod_timetable\output\timetable($ttable); + //return $renderable->export_for_template(new \mod_timetable\output\renderer($USER,array())); + } + + /** + * Returns description of method result value + * @return external_description + */ + public static function get_returns() { - return new external_single_structure( + return new external_single_structure( + array( + 'periods' => new external_multiple_structure( + new external_single_structure( array( - 'periods' => new external_multiple_structure( - new external_single_structure( + 'number' => new external_value(PARAM_INT, 'number of period'), + 'starttime' => new external_value(PARAM_TEXT, 'starttime of period'), + 'endtime' => new external_value(PARAM_TEXT, 'endtime of period'), + 'days' => new external_multiple_structure( + new external_single_structure( + array( + 'substitutionold' => new external_value(PARAM_TEXT, 'substitution'), + 'lessons' => new external_multiple_structure( + new external_single_structure( array( - 'number' => new external_value(PARAM_INT, 'number of period'), - 'starttime' => new external_value(PARAM_TEXT, 'starttime of period'), - 'endtime' => new external_value(PARAM_TEXT, 'endtime of period'), - 'days' => new external_multiple_structure( - new external_single_structure( - array( - 'substitutionold' => new external_value(PARAM_TEXT, 'substitution'), - 'lessons' => new external_multiple_structure( - new external_single_structure( - array( - 'class' => new external_value(PARAM_TEXT, 'name of class'), - 'teacher' => new external_value(PARAM_TEXT, 'name of teacher'), - 'room' => new external_value(PARAM_TEXT, 'name of room'), - 'subject' => new external_value(PARAM_TEXT, 'name of subject'), - 'classa' => new external_value(PARAM_TEXT, 'name of class'), - 'teachera'=> new external_value(PARAM_TEXT, 'name of teacher'), - 'rooma' => new external_value(PARAM_TEXT, 'name of room'), - 'subjecta' => new external_value(PARAM_TEXT, 'name of subject'), - 'classb' => new external_value(PARAM_TEXT, 'name of class'), - 'teacherb'=> new external_value(PARAM_TEXT, 'name of teacher'), - 'roomb' => new external_value(PARAM_TEXT, 'name of room'), - 'subjectb' => new external_value(PARAM_TEXT, 'name of subject'), - 'classchanged' => new external_value(PARAM_BOOL, 'name of class'), - 'teacherchanged' => new external_value(PARAM_BOOL, 'name of teacher'), - 'roomchanged' => new external_value(PARAM_BOOL, 'name of room'), - 'subjectchanged' => new external_value(PARAM_BOOL, 'name of subject'), - 'substitution'=> new external_value(PARAM_TEXT, 'lesson is substitution'), - 'cancel' => new external_value(PARAM_TEXT, 'lesson is canceled'), - 'cancel4me' => new external_value(PARAM_TEXT, 'lesson is canceled 4 me'), - 'event' => new external_value(PARAM_TEXT, 'lesson is event'), - 'status' => new external_value(PARAM_TEXT, 'status of lesson'), - 'flag' => new external_value(PARAM_TEXT, 'flag of lesson'), - 'text' => new external_value(PARAM_TEXT, 'description text'), - 'subtype' => new external_multiple_structure( new external_value(PARAM_INT, 'bitnumber')) - //'subtype' => new external_multiple_structure( new external_value('number', PARAM_INT, 'bitnumber')) - ) - ) - ) - ) - ) - ) + 'class' => new external_value(PARAM_TEXT, 'name of class'), + 'teacher' => new external_value(PARAM_TEXT, 'name of teacher'), + 'room' => new external_value(PARAM_TEXT, 'name of room'), + 'subject' => new external_value(PARAM_TEXT, 'name of subject'), + 'classa' => new external_value(PARAM_TEXT, 'name of class'), + 'teachera'=> new external_value(PARAM_TEXT, 'name of teacher'), + 'rooma' => new external_value(PARAM_TEXT, 'name of room'), + 'subjecta' => new external_value(PARAM_TEXT, 'name of subject'), + 'classb' => new external_value(PARAM_TEXT, 'name of class'), + 'teacherb'=> new external_value(PARAM_TEXT, 'name of teacher'), + 'roomb' => new external_value(PARAM_TEXT, 'name of room'), + 'subjectb' => new external_value(PARAM_TEXT, 'name of subject'), + 'classchanged' => new external_value(PARAM_BOOL, 'name of class'), + 'teacherchanged' => new external_value(PARAM_BOOL, 'name of teacher'), + 'roomchanged' => new external_value(PARAM_BOOL, 'name of room'), + 'subjectchanged' => new external_value(PARAM_BOOL, 'name of subject'), + 'substitution'=> new external_value(PARAM_TEXT, 'lesson is substitution'), + 'cancel' => new external_value(PARAM_TEXT, 'lesson is canceled'), + 'cancel4me' => new external_value(PARAM_TEXT, 'lesson is canceled 4 me'), + 'event' => new external_value(PARAM_TEXT, 'lesson is event'), + 'status' => new external_value(PARAM_TEXT, 'status of lesson'), + 'flag' => new external_value(PARAM_TEXT, 'flag of lesson'), + 'text' => new external_value(PARAM_TEXT, 'description text'), + 'subtype' => new external_multiple_structure( new external_value(PARAM_INT, 'bitnumber')) + //'subtype' => new external_multiple_structure( new external_value('number', PARAM_INT, 'bitnumber')) ) + ) ) - ), - 'type' => new external_value(PARAM_TEXT, 'The type of timetable: class, teacher, room'), - 'viewteacher' => new external_value(PARAM_TEXT, '1 if type of timetable teacher'), - 'viewclass' => new external_value(PARAM_TEXT, '1 if type of timetable class'), - 'viewroom' => new external_value(PARAM_TEXT, '1 if type of timetable room'), - 'name' => new external_value(PARAM_TEXT, 'value of type'), - 'date' => new external_value(PARAM_TEXT, 'date'), - 'description' => new external_value(PARAM_TEXT, 'description'), - 'saturday' => new external_value(PARAM_INT, 'if timetable includes saturday'), - 'week' => new external_value(PARAM_INT, 'The week of timetable'), - 'prevweek' => new external_value(PARAM_INT, 'The next week of timetable'), - 'nextweek' => new external_value(PARAM_INT, 'The prev week of timetable'), - 'id' => new external_value(PARAM_TEXT, 'The id of timetable') + ) + ) + ) ) - ); - } + ) + ), + 'type' => new external_value(PARAM_TEXT, 'The type of timetable: class, teacher, room'), + 'viewteacher' => new external_value(PARAM_TEXT, '1 if type of timetable teacher'), + 'viewclass' => new external_value(PARAM_TEXT, '1 if type of timetable class'), + 'viewroom' => new external_value(PARAM_TEXT, '1 if type of timetable room'), + 'name' => new external_value(PARAM_TEXT, 'value of type'), + 'date' => new external_value(PARAM_TEXT, 'date'), + 'description' => new external_value(PARAM_TEXT, 'description'), + 'saturday' => new external_value(PARAM_INT, 'if timetable includes saturday'), + 'week' => new external_value(PARAM_INT, 'The week of timetable'), + 'prevweek' => new external_value(PARAM_INT, 'The next week of timetable'), + 'nextweek' => new external_value(PARAM_INT, 'The prev week of timetable'), + 'id' => new external_value(PARAM_TEXT, 'The id of timetable') + ) + ); + } } diff --git a/lang/en/timetable.php b/lang/en/timetable.php index f8aab88..c86b44f 100755 --- a/lang/en/timetable.php +++ b/lang/en/timetable.php @@ -28,6 +28,13 @@ defined('MOODLE_INTERNAL') || die(); $string['pluginname'] = 'Timetable'; $string['modulename'] = 'Timetable'; $string['modulenameplural'] = 'Timetables'; +$string['timetable:addinstance'] = 'add timetable'; +$string['timetable:search'] = 'perform timetable search'; +$string['timetable:viewclass'] = 'view class timetable'; +$string['timetable:viewownclass'] = 'view own class timetable'; +$string['timetable:viewroom'] = 'view room timetable'; +$string['timetable:viewteacher'] = 'view teacher timetable'; +$string['timetable:update'] = 'update timetable data'; $string['timetablename'] = 'Timetable'; $string['timetablename_help'] = 'Timetable help'; $string['timetablefieldset'] = 'Settings'; diff --git a/version.php b/version.php index 1681e74..97c2b0e 100755 --- a/version.php +++ b/version.php @@ -25,7 +25,7 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'mod_timetable'; -$plugin->release = '0.1.0'; -$plugin->version = 2020112102; +$plugin->release = '0.2.0'; +$plugin->version = 2020120401; $plugin->requires = 2020061500; $plugin->maturity = MATURITY_ALPHA;