tao-test/app/taoProctoring/model/datatable/DeliveriesMonitorDatatable.php

141 lines
4.8 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 ;
*
*/
namespace oat\taoProctoring\model\datatable;
use oat\tao\model\datatable\implementation\DatatableRequest;
use oat\tao\model\datatable\DatatablePayload;
use oat\taoProctoring\model\execution\DeliveryExecutionList;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;
use oat\taoProctoring\model\ProctorService;
use oat\taoProctoring\helpers\DeliveryHelper;
/**
* Class DeliveriesMonitorDatatable
* @package oat\taoProctoring\model\datatable
* @author Aleh Hutnikau, <hutnikau@1pt.com>
*/
class DeliveriesMonitorDatatable implements DatatablePayload, ServiceLocatorAwareInterface
{
use ServiceLocatorAwareTrait;
/**
* @var DatatableRequest
*/
protected $request;
/**
* @var DatatableRequest
*/
protected $datatableRequest;
/**
* @var \core_kernel_classes_Resource
*/
protected $delivery;
/**
* DeliveriesMonitorDatatable constructor.
* @param \core_kernel_classes_Resource $delivery
* @param \Request $request
*/
public function __construct(\core_kernel_classes_Resource $delivery = null, $request)
{
$this->datatableRequest = DatatableRequest::fromGlobals();
$this->request = $request;
$this->delivery = $delivery;
}
public function getPayload()
{
$context = $this->request->hasParameter('context') ? $this->request->getParameter('context') : null;
$filters = [];
foreach ($this->datatableRequest->getFilters() as $filterKey => $filterValue) {
if ($filterKey === 'start_time') {
$times = explode(' - ', $filterValue);
$filters[] = ['start_time' => '>' . $times[0]];
if (isset($times[1])) {
$filters[] = ['start_time' => '<' . $times[1]];
}
} elseif ($filterKey === 'tag') {
$filters[] = [$filterKey => $filterValue];
} else {
$filters[] = [$filterKey => 'LIKE %'.$filterValue.'%'];
}
}
$options = [];
$options['filters'] = $filters;
$orderCol = DeliveryHelper::adjustColumnName($this->datatableRequest->getSortBy());
if ($orderCol) {
$options['order'] = join(' ', [
$orderCol,
$this->datatableRequest->getSortOrder(),
$this->datatableRequest->getSortType()
]);
}
$options['limit'] = $this->datatableRequest->getRows();
$options['offset'] = ($this->datatableRequest->getPage() - 1) * $this->datatableRequest->getRows();
$service = $this->getServiceLocator()->get(ProctorService::SERVICE_ID);
$proctor = \common_session_SessionManager::getSession()->getUser();
$executions = $service->getProctorableDeliveryExecutions($proctor, $this->delivery, $context, $options);
$total = $service->countProctorableDeliveryExecutions($proctor, $this->delivery, $context, $options);
$totalPages = ceil($total / $this->datatableRequest->getRows());
return $this->doPostProcessing($executions, $total, $totalPages);
}
/**
* @param array $executionsData
* @param integer $amount
* @param integer $pages
* @return array
* @throws \common_ext_ExtensionException
*/
protected function doPostProcessing(array $executionsData, $amount, $pages)
{
return [
'success' => true,
'amount' => $amount,
'total' => $pages,
'page' => $this->datatableRequest->getPage(),
'rows' => $this->datatableRequest->getRows(),
'data' => $this->getDeliveryHelperService()->adjustDeliveryExecutions($executionsData),
];
}
/**
* @return array
*/
public function jsonSerialize()
{
return $this->getPayload();
}
/**
* @return DeliveryExecutionList
*/
private function getDeliveryHelperService()
{
return $this->getServiceLocator()->get(DeliveryExecutionList::class);
}
}