/** * Adds a user's submission to the database and filesystem * * Called then this component receives an HTTP POST request to * /submission(/) * The request body should contain a JSON object representing a submission. * * @author Till Uhlig * @date 2014 */ public function addSubmission() { $body = $this->app->request->getBody(); $submission = Submission::decodeSubmission($body); $file = $submission->getFile(); if (!isset($file) || $file == array()) { $file = new File(); } if ($file->getTimeStamp() === null) { $file->setTimeStamp(time()); } ///echo File::encodeFile($file);return; // upload file to filesystem $result = Request::routeRequest('POST', '/file', array(), File::encodeFile($file), $this->_file, 'file'); ///var_dump($result); ///echo $result['content'];return; if ($result['status'] >= 200 && $result['status'] <= 299) { // file is uploaded $newFile = File::decodeFile($result['content']); $file->setAddress($newFile->getAddress()); $file->setHash($newFile->getHash()); $file->setFileId($newFile->getFileId()); $file->setBody(null); $submission->setFile($file); // upload submission to database if ($submission->getId() === null) { //echo Submission::encodeSubmission($submission);return; $result = Request::routeRequest('POST', '/submission', array(), Submission::encodeSubmission($submission), $this->_submission, 'submission'); } else { $result['status'] = 201; $result['content'] = Submission::encodeSubmission($submission); } //var_dump($result); if ($result['status'] >= 200 && $result['status'] <= 299) { // submission is uploaded $newsubmission = Submission::decodeSubmission($result['content']); $submission->setId($newsubmission->getId()); // select new submission if ($submission->getSelectedForGroup() == '1') { $selectedSubmission = SelectedSubmission::createSelectedSubmission($submission->getLeaderId(), $submission->getId(), $submission->getExerciseId()); $result = Request::routeRequest('POST', '/selectedsubmission', array(), SelectedSubmission::encodeSelectedSubmission($selectedSubmission), $this->_selectedSubmission, 'selectedsubmission'); if ($result['status'] >= 200 && $result['status'] <= 299) { $this->app->response->setBody(Submission::encodeSubmission($submission)); $this->app->response->setStatus(201); $this->app->stop(); } else { $result = Request::routeRequest('PUT', '/selectedsubmission/leader/' . $submission->getLeaderId() . '/exercise/' . $submission->getExerciseId(), $this->app->request->headers->all(), SelectedSubmission::encodeSelectedSubmission($selectedSubmission), $this->_selectedSubmission, 'selectedsubmission'); if ($result['status'] >= 200 && $result['status'] <= 299) { $this->app->response->setBody(Submission::encodeSubmission($submission)); $this->app->response->setStatus(201); $this->app->stop(); } } } else { $this->app->response->setBody(Submission::encodeSubmission($submission)); $this->app->response->setStatus(201); $this->app->stop(); } } } Logger::Log('POST AddSubmission failed', LogLevel::ERROR); $this->app->response->setBody(Submission::encodeSubmission(new Submission())); $this->app->response->setStatus(409); $this->app->stop(); }
/** * Processes a submissions * * Called when this component receives an HTTP POST request to * /submission(/). */ public function postSubmission() { $this->app->response->setStatus(201); $body = $this->app->request->getBody(); $submissions = Submission::decodeSubmission($body); // always been an array $arr = true; if (!is_array($submissions)) { $submissions = array($submissions); $arr = false; } $res = array(); foreach ($submissions as $submission) { $fail = false; $process = new Process(); $process->setRawSubmission($submission); $eid = $submission->getExerciseId(); // load processor data from database $result = Request::routeRequest('GET', '/process/exercise/' . $eid, array(), '', $this->_processorDb, 'process'); $processors = null; if ($result['status'] >= 200 && $result['status'] <= 299) { $processors = Process::decodeProcess($result['content']); } else { if ($result['status'] != 404) { $submission->addMessage("Interner Fehler"); $res[] = $submission; $this->app->response->setStatus(409); continue; } } $result2 = Request::routeRequest('GET', '/exercisefiletype/exercise/' . $eid, array(), '', $this->_getExerciseExerciseFileType, 'exercisefiletype'); $exerciseFileTypes = null; if ($result2['status'] >= 200 && $result2['status'] <= 299) { $exerciseFileTypes = ExerciseFileType::decodeExerciseFileType($result2['content']); if (!is_array($exerciseFileTypes)) { $exerciseFileTypes = array($exerciseFileTypes); } $filePath = null; if ($submission->getFile() != null) { $file = $submission->getFile()->getBody(true); if ($file !== null) { $fileHash = sha1($file); $filePath = '/tmp/' . $fileHash; if ($submission->getFile()->getDisplayName() != null) { LProcessor::generatepath($filePath); file_put_contents($filePath . '/' . $submission->getFile()->getDisplayName(), $file); $filePath .= '/' . $submission->getFile()->getDisplayName(); } else { LProcessor::generatepath($filePath); file_put_contents($filePath . '/tmp', $file); $filePath .= '/tmp'; } } } // check file type if ($filePath != null) { $found = false; $types = array(); $mimeType = MimeReader::get_mime($filePath); $foundExtension = isset(pathinfo($filePath)['extension']) ? pathinfo($filePath)['extension'] : '-'; foreach ($exerciseFileTypes as $type) { $types[] = $type->getText(); $type = explode(' ', str_replace('*', '', $type->getText())); //echo MimeReader::get_mime($filePath); if (strpos($mimeType, $type[0]) !== false && (!isset($type[1]) || '.' . $foundExtension == $type[1])) { $found = true; break; } } if (!$found && count($exerciseFileTypes) > 0) { $submission->addMessage("falscher Dateityp \nGefunden: " . $mimeType . " ." . $foundExtension . "\nErlaubt: " . implode(',', $types)); $res[] = $submission; $this->app->response->setStatus(409); unlink($filePath); continue; } unlink($filePath); } } else { if ($result2['status'] != 404) { $submission->addMessage("Interner Fehler"); $res[] = $submission; $this->app->response->setStatus(409); continue; } } // process submission if ($processors !== null) { if (!is_array($processors)) { $processors = array($processors); } foreach ($processors as $pro) { $component = $pro->getTarget(); if ($process->getExercise() === null) { $process->setExercise($pro->getExercise()); } $process->setParameter($pro->getParameter()); $process->setAttachment($pro->getAttachment()); $process->setTarget($pro->getTarget()); $process->setWorkFiles($pro->getWorkFiles()); //echo Process::encodeProcess($process)."_______";// return; $result = Request::post($component->getAddress() . '/process', array(), Process::encodeProcess($process)); //echo $result['content'].'_______'; if ($result['status'] >= 200 && $result['status'] <= 299) { $process = Process::decodeProcess($result['content']); } else { $fail = true; $submission->addMessage("Beim Verarbeiten der Einsendung ist ein Fehler aufgetreten"); if (isset($result['content'])) { $content = Process::decodeProcess($result['content']); $submission->setStatus($content->getStatus()); $submission->addMessages($content->getMessages()); } break; } } } if ($fail) { if (isset($submission)) { $submission->setFile(null); } $res[] = $submission; $this->app->response->setStatus(409); continue; } // upload submission $uploadSubmission = $process->getSubmission(); if ($uploadSubmission === null) { $uploadSubmission = $process->getRawSubmission(); if ($uploadSubmission->getFile() != null) { $file = $uploadSubmission->getFile(); if ($file->getDisplayName() == null) { $file->setDisplayName($submission->getExerciseName()); } } } if ($uploadSubmission !== null) { ///echo Submission::encodeSubmission($uploadSubmission);return; $result = Request::routeRequest('POST', '/submission', array(), Submission::encodeSubmission($uploadSubmission), $this->_submission, 'submission'); //var_dump($result);return; // checks the correctness of the query if ($result['status'] >= 200 && $result['status'] <= 299) { $queryResult = Submission::decodeSubmission($result['content']); $uploadSubmission->setId($queryResult->getId()); $uploadSubmission->setFile($queryResult->getFile()); if ($process->getMarking() !== null) { $process->getMarking()->setSubmission($queryResult); } } else { $uploadSubmission->addMessage("Beim Speichern der Einsendung ist ein Fehler aufgetreten."); //var_dump($uploadSubmission); return; if (isset($result['content'])) { $content = Submission::decodeSubmission($result['content']); $uploadSubmission->setStatus($content->getStatus()); $uploadSubmission->addMessages($content->getMessages()); } $uploadSubmission->setStatus(409); $res[] = $uploadSubmission; $this->app->response->setStatus(409); continue; } } // upload marking if ($process->getMarking() !== null) { //echo Marking::encodeMarking($process->getMarking()); $result = Request::routeRequest('POST', '/marking', array(), Marking::encodeMarking($process->getMarking()), $this->_marking, 'marking'); // checks the correctness of the query if ($result['status'] >= 200 && $result['status'] <= 299) { $queryResult = Marking::decodeMarking($result['content']); } else { $uploadSubmission->addMessage("Beim Speichern der Korrektur ist ein Fehler aufgetreten"); if (isset($result['content'])) { $content = Marking::decodeMarking($result['content']); $uploadSubmission->addMessages($content->getMessages()); } $res[] = $uploadSubmission; $this->app->response->setStatus(409); continue; } } $rr = $process->getSubmission(); if ($rr === null) { $rr = $process->getRawSubmission(); } $res[] = $rr; } if (!$arr && count($res) == 1) { $this->app->response->setBody(Submission::encodeSubmission($res[0])); } else { $this->app->response->setBody(Submission::encodeSubmission($res)); } }
if (isset($_POST['deleteSubmissionWarning'])) { $notifications[] = MakeNotification("warning", Language::Get('main', 'askDeleteSubmission', $langTemplate)); } elseif (isset($_POST['deleteSubmission'])) { $suid = cleanInput($_POST['deleteSubmission']); // extractes the studentId of the submission $URI = $databaseURI . "/submission/" . $suid; $submission = http_get($URI, true); $submission = json_decode($submission, true); // only deletes the submission if it belongs to the user if ($submission['studentId'] == $uid) { $URI = $databaseURI . "/selectedsubmission/submission/" . $suid; http_delete($URI, true, $message); // todo: treat the case if the previous operation failed $submissionUpdate = Submission::createSubmission($suid, null, null, null, null, null, null, 0); $URI = $databaseURI . "/submission/submission/" . $suid; http_put_data($URI, Submission::encodeSubmission($submissionUpdate), true, $message2); if ($message == "201" && $message2 == 201) { $notifications[] = MakeNotification("success", Language::Get('main', 'successDeleteSubmission', $langTemplate)); } else { $notifications[] = MakeNotification("error", Language::Get('main', 'errorDeleteSubmission', $langTemplate)); } } } elseif (isset($_POST['downloadMarkings'])) { downloadMarkingsForSheet($uid, $_POST['downloadMarkings']); } // load tutor data from GetSite $URI = $getSiteURI . "/student/user/{$uid}/course/{$cid}"; $student_data = http_get($URI, true); $student_data = json_decode($student_data, true); $student_data['filesystemURI'] = $filesystemURI; $student_data['cid'] = $cid;
$uploadFile = File::createFile(null, $file['name'], null, $timestamp, null, null); $uploadFile->setBody(Reference::createReference($file['tmp_name'])); } else { $uploadFile = File::createFile(null, null, null, $timestamp, null, null); $uploadFile->setBody(Form::encodeForm($formdata), true); } $uploadSubmission = Submission::createSubmission(null, $uid, null, $exerciseId, $exercise['comment'], 1, $timestamp, null, $leaderId); $uploadSubmission->setFile($uploadFile); $uploadSubmission->setExerciseName(isset($exercise['name']) ? $exercise['name'] : null); $uploadSubmission->setSelectedForGroup('1'); if ($isExpired) { $uploadSubmission->setAccepted(0); } $URL = $serverURI . '/logic/LProcessor/submission'; ///echo Submission::encodeSubmission($uploadSubmission);return; $result = http_post_data($URL, Submission::encodeSubmission($uploadSubmission), true, $message); //echo $result; if ($message != "201") { $result = Submission::decodeSubmission($result); $exercise = $key + 1; $errormsg = Language::Get('main', 'errorUploadSubmission', $langTemplate, array('status' => $message, 'exerciseName' => $exercise['name'])); if ($result !== null && !empty($result)) { $errormsg .= "<br><br>"; $messages = $result->getMessages(); foreach ($messages as $message) { $errormsg .= str_replace("\n", '<br>', $message) . '<br>'; } } $notifications[] = MakeNotification('error', $errormsg); continue; } else {
function updateSubmission($submissionId, $accepted) { global $databaseURI; $newSubmission = Submission::createSubmission(null, null, null, null, null, $accepted, null, null); $newSubmission = Submission::encodeSubmission($newSubmission); $URI = $databaseURI . "/submission/{$submissionId}"; http_put_data($URI, $newSubmission, true, $message); if ($message != 201) { return false; } else { return true; } }