141 lines
4.8 KiB
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);
|
||
|
}
|
||
|
}
|