tao-test/app/taoOutcomeUi/model/export/ColumnsProvider.php

264 lines
8.7 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) 2017 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
*
*/
namespace oat\taoOutcomeUi\model\export;
use oat\generis\model\GenerisRdf;
use oat\generis\model\OntologyAwareTrait;
use oat\generis\model\OntologyRdf;
use oat\generis\model\OntologyRdfs;
use oat\taoDelivery\model\fields\DeliveryFieldsService;
use oat\taoDeliveryRdf\model\DeliveryAssemblyService;
use oat\taoDeliveryRdf\model\DeliveryContainerService;
use oat\taoOutcomeUi\model\ResultsService;
use oat\taoOutcomeUi\model\table\ContextTypePropertyColumn;
use oat\taoOutcomeUi\model\table\DeliveryExecutionColumn;
use oat\taoOutcomeUi\model\table\DeliveryExecutionDataProvider;
use oat\taoOutcomeUi\model\table\TraceVariableColumn;
use oat\taoOutcomeUi\model\table\TraceVariableDataProvider;
use oat\taoTestTaker\models\TestTakerService;
use oat\taoOutcomeUi\model\table\TestCenterColumn;
/**
* ColumnsProvider
*
* @author Gyula Szucs <gyula@taotesting.com>
*/
class ColumnsProvider
{
use OntologyAwareTrait;
private $delivery;
private $resultsService;
private const TEST_CENTER_PROPERTY_RDF = 'http://www.tao.lu/Ontologies/TAOTestCenter.rdf#member';
private const TEST_CENTER_ASSIGNMENT_PROPERTY_RDF = 'http://www.tao.lu/Ontologies/TAOTestCenter#UserAssignment';
public const LABEL_START_DELIVERY_EXECUTION = 'Start Delivery Execution';
private const LABEL_ID_DELIVERY_EXECUTION = 'Delivery Execution Id';
private const LABEL_TRACE_VARIABLES = 'Trace variables';
/**
* Test Taker properties to be exported.
*
* @var array
*/
private $testTakerProperties = [
OntologyRdfs::RDFS_LABEL,
GenerisRdf::PROPERTY_USER_LOGIN,
GenerisRdf::PROPERTY_USER_FIRSTNAME,
GenerisRdf::PROPERTY_USER_LASTNAME,
GenerisRdf::PROPERTY_USER_MAIL,
GenerisRdf::PROPERTY_USER_UILG
];
/**
* Delivery properties to be exported.
*
* @var array
*/
private $deliveryProperties = [
OntologyRdfs::RDFS_LABEL,
DeliveryFieldsService::PROPERTY_CUSTOM_LABEL,
DeliveryContainerService::PROPERTY_MAX_EXEC,
DeliveryAssemblyService::PROPERTY_START,
DeliveryAssemblyService::PROPERTY_END,
DeliveryAssemblyService::PROPERTY_DELIVERY_DISPLAY_ORDER_PROP,
DeliveryContainerService::PROPERTY_ACCESS_SETTINGS
];
/**
* @param string|\core_kernel_classes_Resource $delivery
* @param ResultsService $resultsService
* @throws \common_exception_NotFound
*/
public function __construct($delivery, ResultsService $resultsService)
{
$this->delivery = $this->getResource($delivery);
if (!$this->delivery->exists()) {
throw new \common_exception_NotFound('Results Exporter: delivery "' . $this->delivery->getUri() . '" does not exist.');
}
$this->resultsService = $resultsService;
}
/**
* Get test taker columns to be exported.
*
* @return array
*/
public function getTestTakerColumns()
{
$columns = [];
// add tt ID
$columns[] = [
'type' => DeliveryExecutionColumn::class,
'label' => __('Test Taker ID'),
// for the BE to select test taker from the DeliveryExecution
'contextId' => ContextTypePropertyColumn::CONTEXT_TYPE_TEST_TAKER,
'variableIdentifier' => DeliveryExecutionDataProvider::PROP_USER_ID,
// for the FE to show DE property within Test Takers data
'prop' => 'delivery_execution',
'contextType' => DeliveryExecutionDataProvider::PROP_USER_ID,
];
// add custom properties, it contains the GROUP property as well
$customProps = $this->getClass(TestTakerService::CLASS_URI_SUBJECT)->getProperties();
$testTakerProps = array_merge($this->testTakerProperties, $customProps);
foreach ($testTakerProps as $property) {
$property = $this->getProperty($property);
if ($property->getUri() === self::TEST_CENTER_PROPERTY_RDF) {
continue;
} elseif ($property->getUri() === self::TEST_CENTER_ASSIGNMENT_PROPERTY_RDF) {
$col = new TestCenterColumn($property);
} else {
$col = new ContextTypePropertyColumn(ContextTypePropertyColumn::CONTEXT_TYPE_TEST_TAKER, $property);
if ($property->getUri() === OntologyRdfs::RDFS_LABEL) {
$col->label = __('Test Taker');
}
}
$columns[] = $col->toArray();
}
return $columns;
}
/**
* Get delivery columns to be exported.
*
* @return array
* @throws \RuntimeException
* @throws \core_kernel_persistence_Exception
*/
public function getDeliveryColumns()
{
$columns = [];
// add custom properties, it contains the group property as well
$customProps = $this->getClass($this->delivery->getOnePropertyValue($this->getProperty(OntologyRdf::RDF_TYPE)))->getProperties();
$deliveryProps = array_merge($this->deliveryProperties, $customProps);
foreach ($deliveryProps as $property) {
$property = $this->getProperty($property);
$loginCol = new ContextTypePropertyColumn(ContextTypePropertyColumn::CONTEXT_TYPE_DELIVERY, $property);
if ($property->getUri() == OntologyRdfs::RDFS_LABEL) {
$loginCol->label = __('Delivery');
}
$columns[] = $loginCol->toArray();
}
return $columns;
}
/**
* Get delivery execution columns to be exported
*/
public function getDeliveryExecutionColumns()
{
return [
[
'type' => DeliveryExecutionColumn::class,
'label' => self::LABEL_ID_DELIVERY_EXECUTION,
'contextId' => 'delivery_execution',
'variableIdentifier' => DeliveryExecutionDataProvider::PROP_DELIVERY_EXECUTION_ID
],
[
'type' => DeliveryExecutionColumn::class,
'label' => self::LABEL_START_DELIVERY_EXECUTION,
'contextId' => 'delivery_execution',
'variableIdentifier' => DeliveryExecutionDataProvider::PROP_STARTED_AT
],
[
'type' => DeliveryExecutionColumn::class,
'label' => 'End Delivery Execution',
'contextId' => 'delivery_execution',
'variableIdentifier' => DeliveryExecutionDataProvider::PROP_FINISHED_AT,
],
];
}
/**
* Returns all grade columns to be exported.
*
* @return array
* @throws \RuntimeException
*/
public function getGradeColumns()
{
return $this->resultsService->getVariableColumns($this->delivery, \taoResultServer_models_classes_OutcomeVariable::class);
}
/**
* Returns all response columns to be exported.
*
* @return array
* @throws \RuntimeException
*/
public function getResponseColumns()
{
return $this->resultsService->getVariableColumns($this->delivery, \taoResultServer_models_classes_ResponseVariable::class);
}
/**
* Returns all trace variables columns to be exported.
*
* @return array
* @throws \RuntimeException
*/
public function getTraceVariablesColumns()
{
return [
[
'type' => TraceVariableColumn::class,
'label' => self::LABEL_TRACE_VARIABLES,
'contextId' => TraceVariableColumn::CONTEXT_IDENTIFIER,
'prop' => TraceVariableColumn::CONTEXT_IDENTIFIER,
'contextType' => TraceVariableDataProvider::PROP_TRACE_VARIABLE,
]
];
}
/**
* @return array
* @throws \core_kernel_persistence_Exception
*/
public function getAll()
{
return array_merge(
$this->getTestTakerColumns(),
$this->getDeliveryColumns(),
$this->getGradeColumns(),
$this->getResponseColumns(),
$this->getDeliveryExecutionColumns()
);
}
}