Newer
Older
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Teacher_Rating extends Controller_UserEnvi {
Антон Шалимов
committed
Cookie::set('fD', 'true'); // Ставим кук fD, чтоб иметь возможность скачать отчет TODO
$this->model_rating = new Model_Teacher_Rating;
$this->model_discipline = new Model_Teacher_Map;
Антон Шалимов
committed
// Получить из кука SGID выбранную ранее группу для данной дисциплины
Антон Шалимов
committed
$SG_array = json_decode(Cookie::get('SGID', null), true);
if ($SG_array !== null && array_key_exists($id, $SG_array)) {
Антон Шалимов
committed
return $SG_array[$id];
Антон Шалимов
committed
// Настройки дисциплины и выбранная группа(для фильтра)
private function getDisciplineInformation($id) {
Антон Шалимов
committed
$temp = $this->model_discipline->getDisciplineInfoByID($id);
Антон Шалимов
committed
$disciplineInfo['ID'] = $id;
$disciplineInfo['StudyGroupID_Filter'] = $this->getStudyGroupID_ForFilter($id);
Антон Шалимов
committed
return $disciplineInfo;
}
// Шапка таблицы: структура УКД (модули и мероприятия)
private function getStructure($id, $type)
$teacherID = $this->UserInfo['TeacherID'];
if ($type == "rating") {
$structure = $this->model_rating->getMapForDiscipline($teacherID, $id);
} else {
$structure = $this->model_rating->GetMapForDisciplineExam($teacherID, $id);
}
if($structure->count() == 0) {
throw HTTP_Exception::factory (404, "Страница не найдена");
}
$structureHandled = array();
$maxRate = $i = 0;
$temp_moduleID = -1;
$try = 0; // try = 1 - экзамен, = 2, 3 - пересдачи
Антон Шалимов
committed
if($row['ModuleID'] != $temp_moduleID)
Антон Шалимов
committed
$temp_moduleID = $row['ModuleID'];
$structureHandled[$i]['SubmodulesCount'] = 0;
$structureHandled[$i]['MaxRate'] = 0;
$structureHandled[$i]['ModuleTitle'] = $row['ModuleName'];
$structureHandled[$i]['ModuleType'] = $row['ModuleType'];
$j = $structureHandled[$i]['SubmodulesCount'] += 1;
$structureHandled[$i]['MaxRate'] += (int) $row['MaxRate'];
$cur_submodule = array();
$cur_submodule = $row;
$cur_submodule['MaxRate'] = (int)$cur_submodule['MaxRate'];
if ($type == "rating") {
$cur_submodule['Title'] = $row['SubModuleName'];
$maxRate += $row['MaxRate'];
} else { //$type == "exam"
if ($row['ModuleType'] == 'extra') {
$cur_submodule['Title'] = 'Добор баллов';
$maxRate += $row['MaxRate'];
}
else {
if ($try === 0) {
$cur_submodule['Title'] = 'Основная сдача';
} else {
$cur_submodule['Title'] = 'Пересдача ' . $try;
}
$try++;
}
$structureHandled['MaxRate'] = (int) $maxRate;
return $structureHandled;
}
private function processGroupInfo($groupInfo)
{
//GroupID, GroupNum, GradeNum, isAttached etc.
$out = $groupInfo;
//Формирование заголовка курса
$gradeNum = $groupInfo['GradeNum'];
if ($groupInfo['Degree'] == 'bachelor') {
$out['GradeTitle'] = $gradeNum.' курс';
} else if ($groupInfo['Degree'] == 'specialist') {
$out['GradeTitle'] = $gradeNum.' курс';
} if ($groupInfo['Degree'] == 'master') {
$out['GradeTitle'] = 'Магистратура, '.$gradeNum.' год';
}
//Формирование заголовка группы
$out['GroupTitle'] = $out['GradeTitle']." ".$groupInfo['GroupNum']." группа";
return $out;
}
private function getRatesForRatingPage($info)
{
$rates = array();
$i_r = 0;
$rateResult = 0;
foreach($info as $row) {
++$i_r;
$cur_rate = array();
$rateResult += $cur_rate['Rate'] = $row['Rate'];
$moduleType = $row['ModuleType'];
$cur_rate['Type'] = $moduleType;
if ($moduleType == 'exam') {
$cur_rate['SubmoduleID'] = -1;
} else if ($moduleType == 'extra') {
$cur_rate['SubmoduleID'] = -2;
} else {
$cur_rate['SubmoduleID'] = $row['SubmoduleID'];
Антон Шалимов
committed
$rates[$i_r] = $cur_rate;
}
$rates['RateResult'] = $rateResult;
return $rates;
}
private function correctExtra(&$curStudent, $examType, $lastExtraIndex, $firstEmptyExtraIndex, $totalExtraRate) {
$topLimit = ($examType == 'exam') ? 38 : 60;
if ($curStudent['RateSemesterResult'] >= $bottomLimit &&
$curStudent['RateSemesterResult'] < $topLimit) // студент задолженик
{
$maxExtraRate = $topLimit - $curStudent['RateSemesterResult'];
if ($lastExtraIndex >= 0) {
$curStudent['Rates'][$lastExtraIndex]['MaxRate'] = $maxExtraRate - $totalExtraRate
+ $curStudent['Rates'][$lastExtraIndex]['Rate'];
if ($firstEmptyExtraIndex >= 0) {
$curStudent['Rates'][$firstEmptyExtraIndex]['MaxRate'] = $maxExtraRate - $totalExtraRate;
}
}
private function getRatesForExamPage(&$curStudent, $rate, $examType, $disciplineID)
{
$rowIndex = 0;
$lastExam = $lastExtraIndex = $lastNilExam = $firstEmptyExtra = -1;
$rateExtra = 0;
Антон Шалимов
committed
foreach($rate as $curRate) {
Антон Шалимов
committed
if (($curRate['ModuleType'] == 'exam') or ($curRate['ModuleType'] == 'extra')) {
$curStudent['Rates'][$rowIndex] = array();
$curStudent['Rates'][$rowIndex]['SubmoduleID'] = $curRate['SubmoduleID'];
$curStudent['Rates'][$rowIndex]['Rate'] = $curRate['Rate'];
$curStudent['Rates'][$rowIndex]['ModuleType'] = $curRate['ModuleType'];
Антон Шалимов
committed
}
switch ($curRate['ModuleType'])
$curStudent['RateSemesterResult'] += $curRate['Rate'];
if (!is_null($curRate['Rate'])) {
if ($lastExam >= 0) {
$curStudent['Rates'][$lastExam]['Block'] = 'True';
}
$lastExam = $rowIndex;
$lastNilExam = $rowIndex;
$curStudent['Rates'][$rowIndex]['Block'] = 'True';
$curStudent['Bonus'] = $curRate['Rate'];
if ($curRate['Rate']) {
if ($lastExtraIndex >= 0) {
$curStudent['Rates'][$lastExtraIndex]['Block'] = 'True';
$lastExtraIndex = $rowIndex;
$curStudent['Rate'] += $curRate['Rate'];
$rateExtra += $curRate['Rate'];
} else {
if ($firstEmptyExtra < 0) {
$firstEmptyExtra = $rowIndex;
$curStudent['Rates'][$rowIndex]['Block'] = 'True';
default:
throw HTTP_Exception::factory (500, "Некорректный тип модуля!");
}
$total = $this->model_rating->GetStudentRate($curStudent['ID'], $disciplineID);
$total = ($total[0])?$total[0]['Num']:0;
if ($total)
$total = 0;
if ($lastExam >= 0) {
$curStudent['RateResult'] += $curStudent['Rates'][$lastExam]['Rate'];
}
$curStudent['RateResult'] = $total;
$this->correctExtra($curStudent, $examType, $lastExtraIndex, $firstEmptyExtra, $rateExtra);
protected function get_edit_rights_for_teacher($teacherID, $disciplineID) // $this->UserInfo['TeacherID']=id
{
$sql = "SELECT `GetEditRightsForTeacher`('$teacherID', '$disciplineID') AS `Num`;";//"CALL `GetEditRightsForTeacher`('$teacherID', '$disciplineID'); ";
$res = DB::query(Database::SELECT, $sql)->execute();
protected function stub_action($page_type) //$page_type: rating, exam
$twig = Twig::factory("teacher/".$page_type); //TODO: validate twig
$disciplineId = $this->request->param('id');
$disciplineInfo = $this->getDisciplineInformation($disciplineId);
$structureHandled = $this->getStructure($disciplineId, $page_type);
$students = $this->model_rating->GetStudentsForRating($this->UserInfo['TeacherID'], $disciplineId);
if ($curGroup !== $row['GroupID']) {
$curGroup = $row['GroupID'];
$rateHandled[$i_g] = $this->processGroupInfo($row);
$groupsHandled[$curGroup] = $rateHandled[$i_g]['GroupTitle'];
// Студенты
$curStudent = $row; //ID, Name, isAttached
$rates_raw = $this->model_rating->getMapForStudent($row['ID'], $disciplineId);
$rates = $this->getRatesForRatingPage($rates_raw);
$curStudent['RateResult'] = $rates['RateResult'];
unset($rates['RateResult']);
$curStudent['Rates'] = $rates;
$rateHandled[$i_g]['Students'][$i_s] = $curStudent;
$rate = $this->model_rating->getMapForStudentExam($row['ID'], $disciplineId);
$this->getRatesForExamPage($curStudent, $rate, $disciplineInfo['ExamType'], $disciplineId);
$editRights=$this->get_edit_rights_for_teacher($this->UserInfo['TeacherID']=id, $disciplineInfo['ID']);
if($editRights == 1)
$twig->editRights=$editRights;
else
$twig->editRights=0;
// На вывод
$twig->User = $this->UserInfo;
$twig->headerRate = $structureHandled; // Шапка таблицы: структура УКД (модули и мероприятия)
$twig->rateTable = $rateHandled;
$twig->groups = $groupsHandled;
Антон Шалимов
committed
$twig->disciplineInfo_JSON = json_encode($twig->disciplineInfo);
}
// Страница оценивания в течение семестра
public function action_edit() {
$this->stub_action("rating");
}
// Страница оценивания в сессию
public function action_exam() {
$this->stub_action("exam");