Newer
Older
<?php
/**
* This file is part of ILIAS, a powerful learning management system
* published by ILIAS open source e-Learning e.V.
*
* ILIAS is licensed with the GPL-3.0,
* see https://www.gnu.org/licenses/gpl-3.0.en.html
* You should have received a copy of said license along with the
* source code, too.
*
* If this is not the case or you just want to try ILIAS, you'll find
* us at:
* https://www.ilias.de
* https://github.com/ILIAS-eLearning
*
*********************************************************************/
declare(strict_types=1);
namespace ILIAS\Plugin\PlagScanExercise\PlagScan;
use ilDBConstants;
use ilDBStatement;
use ilExAssignment;
use ilExSubmission;
use ilObject;
use ilSetting;
class DocumentManagement
{
public static function getDocumentStatus(int $user_id, int $assignment_id): string
{
global $DIC;
$result = $DIC->database()->queryF(
'SELECT * FROM psx_submissions WHERE assignment_id = %s AND user_id = %s',
[ilDBConstants::T_INTEGER, ilDBConstants::T_INTEGER],
[$assignment_id, $user_id]
);
if ($DIC->database()->numRows($result) === 0) {
return 'no_submission';
}
$row = $DIC->database()->fetchAssoc($result);
return $row['plagscan_status'] ?: 'not_checked';
}
public static function handInDocumentAsText(int $user_id, int $assignment_id, string $text): void
{
global $DIC;
$document = new Document();
$document->getByUserAssignment($user_id, $assignment_id);
$settings = new ilSetting('psx');
$documents = new Documents($settings->get('psx_server', 'https://api.plagscan.com/'));
if ($document->getPlagscanStatus() === '') {
$response = $documents->add($text, true);
$document->setPlagscanId((int) $response['docID']);
$document->setPlagscanStatus('not_checked');
$document->setAssignmentExcObj(ilObject::_lookupObjectId((int) $DIC->http()->request()->getQueryParams()['ref_id']));
$document->setUserNonConsent(false);
$document->setSubmissionIliasId(0);
$document->store();
}
}
public static function handInDocumentAsFile(int $user_id, int $assignment_id): void
{
global $DIC;
$document = new Document();
$document->getByUserAssignment($user_id, $assignment_id);
$settings = new ilSetting('psx');
$documents = new Documents($settings->get('psx_server', 'https://api.plagscan.com/'));
if ($document->getPlagscanStatus() === '') {
$ex_submission = new ilExSubmission(new ilExAssignment($assignment_id), $user_id);
$files = $ex_submission->getFiles();
$file_info = end($files);
$response = $documents->add($file_info['filename'], false);
$document->setPlagscanId((int) $response['docID']);
$document->setPlagscanStatus('not_checked');
$document->setAssignmentExcObj(ilObject::_lookupObjectId((int) $DIC->http()->request()->getQueryParams()['ref_id']));
$document->setUserNonConsent(false);
$document->setSubmissionIliasId(0);
$document->store();
}
}
public static function handInAllDocumentAsFile($assignment_id): void
{
$ex_assignment = new ilExAssignment($assignment_id);
$participants = ilExSubmission::getAssignmentParticipants($ex_assignment->getExerciseId(), $ex_assignment->getId());
foreach($participants as $participant) {
self::handInDocumentAsFile((int) $participant, $assignment_id);
}
}
public static function checkAllDocuments(): void
{
global $DIC;
$result = $DIC->database()->queryF(
'SELECT * FROM psx_submissions WHERE plagscan_status = %s',
}
public static function checkAllDocumentsForAssignment($assignment_id)
{
global $DIC;
$result = $DIC->database()->queryF(
'SELECT * FROM psx_submissions WHERE plagscan_status = %s AND assignment_id = %s',
[ilDBConstants::T_TEXT, ilDBConstants::T_INTEGER],
['not_checked', $assignment_id]
);
self::checkDocuments($result);
}
private static function checkDocuments(ilDBStatement $result): void
{
global $DIC;
$psx_assignment_persistence = new AssignmentConfigPersistence($DIC->database());
while ($row = $DIC->database()->fetchAssoc($result)) {
$id = (int) $row['plagscan_id'];
$psx_assignment = $psx_assignment_persistence->getByAssignmentId((int) $row['assignment_id']);
$assignment = new ilExAssignment((int) $row['assignment_id']);
if ($id !== 0) {
if (
($assignment->afterDeadline() && $psx_assignment->getStartCheck() === 'automatic') ||
$psx_assignment->getStartCheck() === 'immediate'
) {
self::checkDocument($id);
}
}
}
}
public static function updateAllDocuments(): void
{
global $DIC;
$result = $DIC->database()->queryF(
'SELECT * FROM psx_submissions WHERE plagscan_status = %s',
['in_progress']
);
while ($row = $DIC->database()->fetchAssoc($result)) {
self::updateDocumentStatus((int) $row['plagscan_id']);
}
}
public static function checkDocument(int $document_id): void
{
global $DIC;
$logger = $DIC->logger()->root();
$logger->info('PSX: Manual checking requested for docID ' . $document_id);
$document = new Document();
$document->getByPlagScanId($document_id);
if ($document->getPlagscanStatus() === 'not_checked') {
$settings = new ilSetting('psx');
$documents = new Documents($settings->get('psx_server', 'https://api.plagscan.com/'));
$documents->check($document_id);
$logger->info('PSX: Manual check-call complete, storing document status');
$document->setPlagscanStatus('in_progress');
$document->store();
$logger->info('PSX: Document ' . $document_id . ' stored as in_progress');
} else {
$logger->info('PSX: Document not uploaded, already in_progress or finished');
}
}
public static function updateDocumentStatus(int $document_id): void
{
global $DIC;
$logger = $DIC->logger()->root();
$document = new Document();
$document->getByPlagScanId($document_id);
if ($document->getPlagscanStatus() === 'in_progress') {
$settings = new ilSetting('psx');
$documents = new Documents($settings->get('psx_server', 'https://api.plagscan.com/'));
$document_status = $documents->getStatus($document_id);
if (isset($document_status['state']) && $document_status['state'] === '3') {
$documents->share($document_id);
$document_link = $documents->getShareLink($document_id);
$document_report = $documents->retrieveReport($document_id, 4);
$document->setPlagscanStatus('plagLevel_' . $document_report['plagLevel']);
$document->setShareLink($document_link['shareLink']);
$document->store();
$logger->info('PSX: updateDocumentStatus - stored document ' . $document_id);
}
}
}
}