tao-test/app/taoProctoring/controller/Reporting.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');
}
}