public static function install($data, &$fail, &$errno, &$error)
 {
     $res = array();
     if (!$fail) {
         // die /course Befehle der LCourse auslösen
         // alle Veranstaltungen abrufen
         $multiRequestHandle = new Request_MultiRequest();
         $handler = Request_CreateRequest::createGet($data['PL']['url'] . '/DB/DBCourse/course', array(), '');
         $multiRequestHandle->addRequest($handler);
         $result = $multiRequestHandle->run();
         if (isset($result[0]['content']) && isset($result[0]['status']) && $result[0]['status'] === 200) {
             // /course ausloesen
             $courses = Course::decodeCourse($result[0]['content']);
             if (!is_array($courses)) {
                 $courses = array($courses);
             }
             $multiRequestHandle = new Request_MultiRequest();
             foreach ($courses as $course) {
                 $handler = Request_CreateRequest::createPost($data['PL']['url'] . '/logic/LCourse/course', array(), Course::encodeCourse($course));
                 $multiRequestHandle->addRequest($handler);
             }
             $answer = $multiRequestHandle->run();
             if (count($courses) != count($answer)) {
                 $fail = true;
                 $error = Language::Get('courses', 'differentAnswers') . "\n" . Language::Get('main', 'line') . ':' . __LINE__;
             }
             $i = 0;
             foreach ($courses as $course) {
                 $result = $answer[$i];
                 $res[$course->getId()] = array();
                 $res[$course->getId()]['course'] = $course;
                 if (isset($result['content']) && isset($result['status']) && $result['status'] === 201) {
                     $res[$course->getId()]['status'] = 201;
                 } else {
                     $res[$course->getId()]['status'] = 409;
                     $fail = true;
                     if (isset($result['status'])) {
                         $errno = $result['status'];
                         $res[$course->getId()]['status'] = $result['status'];
                     }
                 }
                 $i++;
                 if ($i >= count($answer)) {
                     break;
                 }
             }
         } else {
             $fail = true;
             $error = "GET /DB/DBCourse/course " . Language::Get('courses', 'operationFailed');
             if (isset($result[0]['status'])) {
                 $errno = $result[0]['status'];
             }
         }
     }
     return $res;
 }
 public static function cleanCourses($data, &$fail, &$errno, &$error)
 {
     $res = array();
     if (!$fail) {
         $cleanLinks = Einstellungen::getLinks('deleteClean');
         // alle Veranstaltungen abrufen
         $multiRequestHandle = new Request_MultiRequest();
         $handler = Request_CreateRequest::createGet($data['PL']['url'] . '/DB/DBCourse/course', array(), '');
         $multiRequestHandle->addRequest($handler);
         $result = $multiRequestHandle->run();
         if (isset($result[0]['content']) && isset($result[0]['status']) && $result[0]['status'] === 200) {
             // /course ausloesen
             $courses = Course::decodeCourse($result[0]['content']);
             if (!is_array($courses)) {
                 $courses = array($courses);
             }
             $offset = count($courses) - 50;
             // nur die letzten 50 Veranstaltungen werden bereinigt
             $offset = $offset < 0 ? 0 : $offset;
             $courses = array_slice($courses, $offset);
             foreach ($courses as $course) {
                 $multiRequestHandle = new Request_MultiRequest();
                 $answer = array();
                 for ($i = 0; $i < count($cleanLinks); $i++) {
                     // inits all components
                     $handler = Request_CreateRequest::createDelete($cleanLinks[$i]->getAddress() . '/clean/clean/course/' . $course->getId(), array(), '');
                     $multiRequestHandle->addRequest($handler);
                 }
                 $answer = $multiRequestHandle->run();
             }
             $res['status'] = 201;
         } else {
             $fail = true;
             $error = "GET /DB/DBCourse/course " . Language::Get('courses', 'operationFailed');
             if (isset($result[0]['status'])) {
                 $errno = $result[0]['status'];
             }
         }
     }
     return $res;
 }
Пример #3
0
 public static function install($data, &$fail, &$errno, &$error)
 {
     $fail = false;
     $url = $data['PL']['init'];
     $components = array();
     // inits all components
     $result = Request::get($data['PL']['url'] . '/' . $url . '/definition/send', array(), '');
     //echo $result['content'];
     if (isset($result['content']) && isset($result['status'])) {
         // component routers
         $router = array();
         $results = Component::decodeComponent($result['content']);
         $results = Installation::orderBy(json_decode(Component::encodeComponent($results), true), 'name', SORT_ASC);
         $results = Component::decodeComponent(json_encode($results));
         if (!is_array($results)) {
             $results = array($results);
         }
         if (count($results) == 0) {
             $fail = true;
             $error = Language::Get('components', 'noComponents');
         }
         foreach ($results as $res) {
             $components[$res->getName()] = array();
             $components[$res->getName()]['init'] = $res;
         }
         // get component definitions from database
         $result4 = Request::get($data['PL']['url'] . '/' . $url . '/definition', array(), '');
         if (isset($result4['content']) && isset($result4['status']) && $result4['status'] === 200) {
             $definitions = Component::decodeComponent($result4['content']);
             if (!is_array($definitions)) {
                 $definitions = array($definitions);
             }
             if (count($definitions) == 0) {
                 $fail = true;
                 $error = Language::Get('components', 'noDefinitions');
             }
             $result2 = new Request_MultiRequest();
             $result3 = new Request_MultiRequest();
             $tempDef = array();
             foreach ($definitions as $definition) {
                 if (strpos($definition->getAddress() . '/', $data['PL']['urlExtern'] . '/') === false) {
                     continue;
                 }
                 $components[$definition->getName()]['definition'] = $definition;
                 $tempDef[] = $definition;
                 $request = Request_CreateRequest::createGet($definition->getAddress() . '/info/commands', array(), '');
                 $result2->addRequest($request);
                 $request = Request_CreateRequest::createGet($definition->getAddress() . '/info/links', array(), '');
                 $result3->addRequest($request);
             }
             $definitions = $tempDef;
             $result2 = $result2->run();
             $result3 = $result3->run();
             foreach ($results as $res) {
                 if ($res === null) {
                     $fail = true;
                     continue;
                 }
                 $countLinks = 0;
                 $resultCounter = -1;
                 foreach ($definitions as $definition) {
                     //if (strpos($definition->getAddress().'/', $data['PL']['urlExtern'].'/')===false) continue;
                     $resultCounter++;
                     if ($definition->getId() === $res->getId()) {
                         $links = $definition->getLinks();
                         $links = Installation::orderBy(json_decode(Link::encodeLink($links), true), 'name', SORT_ASC);
                         $links = Link::decodeLink(json_encode($links));
                         if (!is_array($links)) {
                             $links = array($links);
                         }
                         $components[$definition->getName()]['links'] = $links;
                         if (isset($result2[$resultCounter]['content']) && isset($result2[$resultCounter]['status']) && $result2[$resultCounter]['status'] === 200) {
                             $commands = json_decode($result2[$resultCounter]['content'], true);
                             if ($commands !== null) {
                                 $components[$definition->getName()]['commands'] = $commands;
                             }
                         }
                         if (isset($result3[$resultCounter]['content']) && isset($result3[$resultCounter]['status']) && $result3[$resultCounter]['status'] === 200) {
                             $calls = json_decode($result3[$resultCounter]['content'], true);
                             $components[$definition->getName()]['call'] = $calls;
                         }
                         break;
                     }
                 }
                 if ($res->getStatus() !== 201) {
                     $fail = true;
                 }
             }
         } else {
             $fail = true;
             $error = Language::Get('components', 'noDefinitions');
         }
     } else {
         $fail = true;
         $error = Language::Get('components', 'operationFailed');
     }
     if (isset($result['status']) && $result['status'] !== 200) {
         $fail = true;
         $error = Language::Get('components', 'operationFailed');
         $errno = $result['status'];
     }
     return $components;
 }
Пример #4
0
 /**
  * Compiles data for the Condition site.
  *
  * @warning If there is more than one condition assigned to the same
  * exercise type it is undefined which condition will be evaluated. This
  * might even change per user!.
  *
  * @author Florian Lücke
  */
 public function checkCondition($userid, $courseid)
 {
     // load all the data
     $multiRequestHandle = new Request_MultiRequest();
     $URL = $this->_getExerciseType->getAddress() . '/exercisetype';
     $handler = Request_CreateRequest::createCustom('GET', $URL, array(), '');
     $multiRequestHandle->addRequest($handler);
     $URL = $this->_getExercise->getAddress() . '/exercise/course/' . $courseid . '/nosubmission';
     $handler = Request_CreateRequest::createCustom('GET', $URL, array(), '');
     $multiRequestHandle->addRequest($handler);
     $URL = $this->_getApprovalCondition->getAddress() . '/approvalcondition/course/' . $courseid;
     $handler = Request_CreateRequest::createCustom('GET', $URL, array(), '');
     $multiRequestHandle->addRequest($handler);
     $URL = $this->_getUser->getAddress() . '/user/course/' . $courseid . '/status/0';
     $handler = Request_CreateRequest::createCustom('GET', $URL, array(), '');
     $multiRequestHandle->addRequest($handler);
     $URL = $this->_getGroup->getAddress() . '/group/course/' . $courseid;
     $handler = Request_CreateRequest::createGet($URL, array(), '');
     $multiRequestHandle->addRequest($handler);
     $answer = $multiRequestHandle->run();
     $possibleExerciseTypes = json_decode($answer[0]['content'], true);
     $exercises = json_decode($answer[1]['content'], true);
     $approvalconditions = json_decode($answer[2]['content'], true);
     $students = json_decode($answer[3]['content'], true);
     $groups = json_decode($answer[4]['content'], true);
     // preprocess the data to make it quicker to get specific values
     $exerciseTypes = array();
     foreach ($possibleExerciseTypes as $exerciseType) {
         $exerciseTypes[$exerciseType['id']] = $exerciseType;
     }
     $exercisesById = array();
     foreach ($exercises as $exercise) {
         $exercisesById[$exercise['id']] = $exercise;
     }
     $exercisesByType = array();
     foreach ($exercises as $exercise) {
         if (!isset($exercisesByType[$exercise['type']])) {
             $exercisesByType[$exercise['type']] = array();
         }
         unset($exercise['submissions']);
         $exercisesByType[$exercise['type']][] = $exercise;
     }
     // calculate the maximum number of points that a user could get
     // for each exercise type
     $maxPointsByType = array();
     foreach ($exercisesByType as $type => $exercises) {
         $maxPointsByType[$type] = array_reduce($exercises, function ($value, $exercise) {
             if ($exercise['bonus'] == null || $exercise['bonus'] == '0') {
                 // only count the
                 $value += $exercise['maxPoints'];
             }
             return $value;
         }, 0);
     }
     $approvalconditionsByType = array();
     foreach ($approvalconditions as &$condition) {
         // add the name of the exercise type to the approvalcondition
         $typeID = $condition['exerciseTypeId'];
         $condition['exerciseType'] = $exerciseTypes[$typeID]['name'];
         // prepare percenteages for the UI
         $condition['minimumPercentage'] = $condition['percentage'] * 100;
         $condition['approvalConditionId'] = $condition['id'];
         unset($condition['id']);
         // sort approvalconditions by exercise type
         /**
          * @warning this implies that there is *only one* approval
          * condition per exercise type!
          */
         $exerciseTypeID = $condition['exerciseTypeId'];
         if (isset($maxPointsByType[$exerciseTypeID])) {
             $condition['maxPoints'] = $maxPointsByType[$exerciseTypeID];
         } else {
             $condition['maxPoints'] = 0;
         }
         $approvalconditionsByType[$exerciseTypeID] = $condition;
     }
     // get all markings
     $allMarkings = array();
     $URL = $this->_getMarking->getAddress() . '/marking/course/' . $courseid;
     $answer = Request::custom('GET', $URL, array(), '');
     $markings = json_decode($answer['content'], true);
     foreach ($markings as $marking) {
         if (isset($marking['submission']['selectedForGroup']) && $marking['submission']['selectedForGroup'] == 1) {
             $allMarkings[] = $marking;
         }
     }
     unset($markings);
     $allGroups = array();
     foreach ($groups as $group) {
         if (!isset($allGroups[$group['sheetId']])) {
             $allGroups[$group['sheetId']] = array();
         }
         $allGroups[$group['sheetId']][$group['leader']['id']] = $group;
     }
     unset($groups);
     // done preprocessing
     // actual computation starts here
     // add up points that each student reached in a specific exercise type
     $studentMarkings = array();
     foreach ($allMarkings as $marking) {
         $studentID = $marking['submission']['studentId'];
         $leaderID = $marking['submission']['leaderId'];
         if (!isset($studentMarkings[$studentID])) {
             $studentMarkings[$studentID] = array();
         }
         if (!isset($marking['submission']['accepted']) || $marking['submission']['accepted'] == 0) {
             continue;
         }
         $exerciseID = $marking['submission']['exerciseId'];
         $sheetID = $marking['submission']['exerciseSheetId'];
         $exerciseType = $exercisesById[$exerciseID]['type'];
         if (!isset($studentMarkings[$studentID][$exerciseType])) {
             $studentMarkings[$studentID][$exerciseType] = 0;
         }
         $studentMarkings[$leaderID][$exerciseType] += isset($marking['points']) ? $marking['points'] : 0;
         if (isset($allGroups[$sheetID][$leaderID])) {
             $group = $allGroups[$sheetID][$leaderID];
             if (isset($group['members'])) {
                 foreach ($group['members'] as $member) {
                     if (!isset($studentMarkings[$member['id']])) {
                         $studentMarkings[$member['id']] = array();
                     }
                     if (!isset($studentMarkings[$member['id']][$exerciseType])) {
                         $studentMarkings[$member['id']][$exerciseType] = 0;
                     }
                     $studentMarkings[$member['id']][$exerciseType] += isset($marking['points']) ? $marking['points'] : 0;
                 }
             }
         }
     }
     $resultStudents = array();
     foreach ($students as $student) {
         if (!isset($student['id'])) {
             continue;
         }
         if (isset($student['courses'])) {
             unset($student['courses']);
         }
         if (isset($student['attachments'])) {
             unset($student['attachments']);
         }
         $student['percentages'] = array();
         $allApproved = true;
         // iteraterate over all conditions, this will also filter out the
         // exercisetypes that are not needed for this course
         foreach ($approvalconditionsByType as $typeID => $condition) {
             $thisPercentage = array();
             $thisPercentage['exerciseTypeID'] = $typeID;
             $thisPercentage['exerciseType'] = $exerciseTypes[$typeID]['name'];
             // check if it was possible to get points for this exercisetype
             if (!isset($maxPointsByType[$typeID])) {
                 Logger::Log("Unmatchable condition: " . $condition['approvalConditionId'] . "in course: " . $courseid, LogLevel::WARNING);
                 $maxPointsByType[$typeID] = 0;
             }
             if ($maxPointsByType[$typeID] == 0) {
                 $thisPercentage['percentage'] = '100';
                 $thisPercentage['isApproved'] = true;
                 $thisPercentage['maxPoints'] = 0;
                 if (isset($student['id']) && isset($studentMarkings[$student['id']]) && isset($studentMarkings[$student['id']][$typeID])) {
                     $points = $studentMarkings[$student['id']][$typeID];
                     $thisPercentage['points'] = $points;
                 } elseif (isset($student['id'])) {
                     $thisPercentage['points'] = 0;
                 }
             } else {
                 // check if there are points for this
                 // student-exerciseType combination
                 if (isset($student['id']) && isset($studentMarkings[$student['id']]) && isset($studentMarkings[$student['id']][$typeID])) {
                     // the user has points for this exercise type
                     $points = $studentMarkings[$student['id']][$typeID];
                     $maxPoints = $maxPointsByType[$typeID];
                     $percentage = $points / $maxPoints;
                     $percentageNeeded = $condition['percentage'];
                     $thisPercentage['points'] = $points;
                     $thisPercentage['maxPoints'] = $maxPoints;
                     $typeApproved = $percentage >= $percentageNeeded;
                     $allApproved = $allApproved && $typeApproved;
                     $thisPercentage['isApproved'] = $typeApproved;
                     $thisPercentage['percentage'] = round($percentage * 100, 2);
                 } elseif (isset($student['id'])) {
                     // there are no points for the user for this
                     // exercise type
                     $thisPercentage['percentage'] = 0;
                     $thisPercentage['points'] = 0;
                     $maxPoints = $maxPointsByType[$typeID];
                     $thisPercentage['maxPoints'] = $maxPoints;
                     $typeApproved = $maxPoints == 0;
                     $thisPercentage['isApproved'] = $typeApproved;
                     $allApproved = $allApproved && $typeApproved;
                 }
             }
             $student['percentages'][] = $thisPercentage;
         }
         $student['isApproved'] = $allApproved;
         $resultStudents[] = $student;
     }
     $students = $resultStudents;
     $this->flag = 1;
     $response['user'] = $this->userWithCourse($userid, $courseid);
     if (isset($students)) {
         $response['users'] = $students;
     }
     $response['minimumPercentages'] = array_values($approvalconditionsByType);
     $this->app->response->setBody(json_encode($response));
 }