246 lines
9.2 KiB
PHP
246 lines
9.2 KiB
PHP
|
<?php
|
||
|
/*
|
||
|
* This program is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU General Public License
|
||
|
* as published by the Free Software Foundation; under version 2
|
||
|
* of the License (non-upgradable).
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program; if not, write to the Free Software
|
||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
*
|
||
|
* Copyright (c) 2015 (original work) Open Assessment Technologies SA ;
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
namespace oat\taoProctoring\controller;
|
||
|
|
||
|
use oat\generis\model\OntologyAwareTrait;
|
||
|
use oat\oatbox\service\ServiceManager;
|
||
|
use oat\oatbox\service\ServiceNotFoundException;
|
||
|
use oat\taoDelivery\model\execution\ServiceProxy;
|
||
|
use oat\taoProctoring\helpers\DataTableHelper;
|
||
|
use oat\taoProctoring\model\AssessmentResultsService;
|
||
|
use oat\taoProctoring\model\deliveryLog\DeliveryLog;
|
||
|
use oat\taoProctoring\model\ProctorService;
|
||
|
use oat\taoProctoring\model\TestSessionHistoryService;
|
||
|
|
||
|
/**
|
||
|
* Proctoring Reporting controllers for the assessment activity reporting screen.
|
||
|
*
|
||
|
* @author Open Assessment Technologies SA
|
||
|
* @package taoProctoring
|
||
|
* @license GPL-2.0
|
||
|
*
|
||
|
*/
|
||
|
class Reporting extends SimplePageModule
|
||
|
{
|
||
|
use OntologyAwareTrait;
|
||
|
|
||
|
/**
|
||
|
* Gets the view parameters and data to display
|
||
|
* @return array
|
||
|
*/
|
||
|
protected function getViewData()
|
||
|
{
|
||
|
$delivery = $this->hasRequestParameter('delivery')
|
||
|
? $this->getResource($this->getRequestParameter('delivery'))
|
||
|
: null;
|
||
|
$testCenter = $this->hasRequestParameter('context')
|
||
|
? $this->getResource($this->getRequestParameter('context'))
|
||
|
: null;
|
||
|
$sessions = $this->getRequestParameter('session');
|
||
|
$requestOptions = $this->getRequestOptions([
|
||
|
'sortby' => 'timestamp',
|
||
|
'sortorder' => 'desc',
|
||
|
'periodStart' => '',
|
||
|
'periodEnd' => '',
|
||
|
'detailed' => false
|
||
|
]);
|
||
|
|
||
|
if (!is_array($sessions)) {
|
||
|
$sessions = $sessions ? explode(',', $sessions) : [];
|
||
|
}
|
||
|
|
||
|
// log access to history
|
||
|
$deliveryLog = $this->getServiceManager()->get(DeliveryLog::SERVICE_ID);
|
||
|
foreach ($sessions as $sessionUri) {
|
||
|
$deliveryLog->log($sessionUri, 'HISTORY', []);
|
||
|
}
|
||
|
|
||
|
// retrieve history
|
||
|
$historyService = $this->getServiceManager()->get(TestSessionHistoryService::SERVICE_ID);
|
||
|
$history = DataTableHelper::paginate($historyService->getSessionsHistory($sessions, $requestOptions), $requestOptions);
|
||
|
|
||
|
$viewData = [
|
||
|
'set' => $history,
|
||
|
'sessions' => $sessions,
|
||
|
'sortBy' => $requestOptions['sortBy'],
|
||
|
'sortOrder' => $requestOptions['sortOrder'],
|
||
|
'periodStart' => $requestOptions['periodStart'],
|
||
|
'periodEnd' => $requestOptions['periodEnd'],
|
||
|
'monitoringUrl' => $historyService->getBackUrl($delivery),
|
||
|
];
|
||
|
|
||
|
if ($testCenter) {
|
||
|
$viewData['monitoringUrl'] .= (strpos($viewData['monitoringUrl'], '?') === false) ? '?' : '&';
|
||
|
$viewData['monitoringUrl'] .= 'context=' . urlencode($testCenter->getUri());
|
||
|
$viewData['context'] = $testCenter->getUri();
|
||
|
}
|
||
|
|
||
|
if ($delivery) {
|
||
|
$viewData['delivery'] = $delivery->getUri();
|
||
|
}
|
||
|
|
||
|
if (count($sessions) > 1) {
|
||
|
$viewData['title'] = __('Detailed Session History of a selection');
|
||
|
} else {
|
||
|
$deliveryExecution = ServiceProxy::singleton()->getDeliveryExecution($sessions[0]);
|
||
|
$viewData['title'] = __('Detailed Session History of %s', $deliveryExecution->getLabel());
|
||
|
}
|
||
|
|
||
|
return $viewData;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Display the session history of the current test center
|
||
|
*/
|
||
|
public function index()
|
||
|
{
|
||
|
$this->composeView('session-history', null, 'pages/index.tpl', 'tao');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Display the session history of the current test center
|
||
|
*/
|
||
|
public function sessionHistory()
|
||
|
{
|
||
|
$this->returnJson([
|
||
|
'success' => true,
|
||
|
'data' => $this->getViewData(),
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Display the activity reporting of the current test center
|
||
|
*/
|
||
|
public function history()
|
||
|
{
|
||
|
try {
|
||
|
$sessions = $this->getRequestParameter('session');
|
||
|
$requestOptions = $this->getRequestOptions([
|
||
|
'sortby' => 'timestamp',
|
||
|
'sortorder' => 'desc',
|
||
|
'periodStart' => '',
|
||
|
'periodEnd' => '',
|
||
|
]);
|
||
|
|
||
|
if (!is_array($sessions)) {
|
||
|
$sessions = $sessions ? explode(',', $sessions) : [];
|
||
|
}
|
||
|
$historyService = $this->getServiceManager()->get(TestSessionHistoryService::SERVICE_ID);
|
||
|
$this->returnJson(DataTableHelper::paginate($historyService->getSessionsHistory($sessions, $requestOptions), $requestOptions));
|
||
|
|
||
|
} catch (ServiceNotFoundException $e) {
|
||
|
\common_Logger::w('No history service defined for proctoring');
|
||
|
$this->returnError('Proctoring interface not available');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Render page with assessment(s) result.
|
||
|
* @throws \common_exception_Error
|
||
|
* @throws \common_exception_MissingParameter
|
||
|
* @throws \oat\oatbox\service\ServiceNotFoundException
|
||
|
*/
|
||
|
public function printReport()
|
||
|
{
|
||
|
if (!$this->hasRequestParameter('id')) {
|
||
|
throw new \common_exception_MissingParameter('id');
|
||
|
}
|
||
|
$idList = $this->getRequestParameter('id');
|
||
|
$context = $this->getRequestParameter('context');
|
||
|
if (!is_array($idList)) {
|
||
|
$idList = [$idList];
|
||
|
}
|
||
|
$result = [];
|
||
|
|
||
|
/** @var ProctorService $deliveryService */
|
||
|
$deliveryService = ServiceManager::getServiceManager()->get(ProctorService::SERVICE_ID);
|
||
|
$currentUser = \common_session_SessionManager::getSession()->getUser();
|
||
|
$deliveries = $deliveryService->getProctorableDeliveries($currentUser, $context);
|
||
|
|
||
|
/** @var $assessmentResultsService AssessmentResultsService */
|
||
|
$assessmentResultsService = $this->getServiceManager()->get(AssessmentResultsService::SERVICE_ID);
|
||
|
|
||
|
foreach ($idList as $deliveryExecutionId) {
|
||
|
$deliveryExecution = ServiceProxy::singleton()->getDeliveryExecution($deliveryExecutionId);
|
||
|
$delivery = $deliveryExecution->getDelivery();
|
||
|
if (!isset($deliveries[$delivery->getUri()])) {
|
||
|
\common_Logger::i('Attempt to print assessment results for which the proctor ' . $currentUser->getIdentifier() . ' has no access.');
|
||
|
continue;
|
||
|
}
|
||
|
$deliveryData = $assessmentResultsService->getDeliveryData($deliveryExecution);
|
||
|
if (!$deliveryData['end']) {
|
||
|
continue;
|
||
|
}
|
||
|
$result[] = [
|
||
|
'testTakerData' => $assessmentResultsService->getTestTakerData($deliveryExecution),
|
||
|
'testData' => $assessmentResultsService->getTestData($deliveryExecution),
|
||
|
'resultsData' => $assessmentResultsService->getResultsData($deliveryExecution),
|
||
|
'deliveryData' => $deliveryData,
|
||
|
];
|
||
|
}
|
||
|
|
||
|
$this->setData('reports', $result);
|
||
|
$this->setData('content-template', 'Reporting/print_report.tpl');
|
||
|
$this->setView('Reporting/layout.tpl');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Render printable rubrics
|
||
|
*
|
||
|
* @throws \common_exception_Error
|
||
|
* @throws \common_exception_MissingParameter
|
||
|
* @throws \oat\oatbox\service\ServiceNotFoundException
|
||
|
*/
|
||
|
public function printRubric()
|
||
|
{
|
||
|
if (!$this->hasRequestParameter('id')) {
|
||
|
throw new \common_exception_MissingParameter('id');
|
||
|
}
|
||
|
$idList = $this->getRequestParameter('id');
|
||
|
if (!is_array($idList)) {
|
||
|
$idList = [$idList];
|
||
|
}
|
||
|
$result = [];
|
||
|
|
||
|
/** @var $assessmentResultsService AssessmentResultsService */
|
||
|
$assessmentResultsService = $this->getServiceManager()->get(AssessmentResultsService::SERVICE_ID);
|
||
|
|
||
|
foreach ($idList as $deliveryExecutionId) {
|
||
|
$deliveryExecution = ServiceProxy::singleton()->getDeliveryExecution($deliveryExecutionId);
|
||
|
$deliveryData = $assessmentResultsService->getDeliveryData($deliveryExecution);
|
||
|
|
||
|
if (!$deliveryData['end']) {
|
||
|
continue;
|
||
|
}
|
||
|
$result[] = [
|
||
|
'testData' => $assessmentResultsService->getTestData($deliveryExecution),
|
||
|
'rubricContent' => $assessmentResultsService->getPrintableRubric($deliveryExecution),
|
||
|
'testTakerData' => $assessmentResultsService->getTestTakerData($deliveryExecution),
|
||
|
'deliveryData' => $deliveryData,
|
||
|
];
|
||
|
}
|
||
|
|
||
|
$this->setData('rubrics', $result);
|
||
|
$this->setData('content-template', 'Reporting/print_rubric.tpl');
|
||
|
$this->setView('Reporting/layout.tpl');
|
||
|
}
|
||
|
}
|