227 lines
10 KiB
PHP
227 lines
10 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Copyright (c) 2018 Open Assessment Technologies, S.A.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
namespace oat\taoProctoring\scripts\tools;
|
||
|
|
||
|
use oat\dtms\DateTime;
|
||
|
use oat\oatbox\extension\script\ScriptAction;
|
||
|
use \common_report_Report as Report;
|
||
|
use oat\taoDelivery\model\execution\implementation\KeyValueService;
|
||
|
use oat\taoDelivery\model\execution\KVDeliveryExecution;
|
||
|
use oat\taoDelivery\model\execution\OntologyDeliveryExecution;
|
||
|
use oat\taoProctoring\model\execution\DeliveryExecution;
|
||
|
use oat\taoDelivery\model\execution\ServiceProxy;
|
||
|
use oat\taoProctoring\model\implementation\DeliveryExecutionStateService;
|
||
|
use oat\taoProctoring\model\monitorCache\DeliveryMonitoringService;
|
||
|
use oat\generis\model\OntologyRdfs;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Class FixMonitoringStates
|
||
|
*
|
||
|
* Fixing monitoring states if by some reason we have difference between storage and delivery executions storage
|
||
|
*
|
||
|
* Usage example:
|
||
|
* ```
|
||
|
* sudo -u www-data php index.php '\oat\taoProctoring\scripts\tools\FixMonitoringStates' --from 1537833600 --to 1537920000 --deliveryMonitoringStates http://www.tao.lu/Ontologies/TAODelivery.rdf#DeliveryExecutionStatusActive,http://www.tao.lu/Ontologies/TAODelivery.rdf#DeliveryExecutionStatusPaused --deliveryExecutionStates http://www.tao.lu/Ontologies/TAODelivery.rdf#DeliveryExecutionStatusAwaiting,http://www.tao.lu/Ontologies/TAODelivery.rdf#DeliveryExecutionStatusAuthorized
|
||
|
* ```
|
||
|
* @package oat\taoProctoring\scripts\tools
|
||
|
*/
|
||
|
class FixMonitoringStates extends ScriptAction
|
||
|
{
|
||
|
/** @var Report */
|
||
|
private $report;
|
||
|
|
||
|
private $from;
|
||
|
private $to;
|
||
|
private $deliveryMonitoringStates;
|
||
|
private $deliveryExecutionStates;
|
||
|
private $wetRun;
|
||
|
private $withProgress;
|
||
|
private $deliveryExecutionStatesForce;
|
||
|
|
||
|
/**
|
||
|
* @return string
|
||
|
*/
|
||
|
protected function provideDescription()
|
||
|
{
|
||
|
return 'Fixed bad Delivery Monitoring entries';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array
|
||
|
*/
|
||
|
protected function provideOptions()
|
||
|
{
|
||
|
return [
|
||
|
'from' => [
|
||
|
'longPrefix' => 'from',
|
||
|
'required' => false,
|
||
|
'description' => 'Date for searching from',
|
||
|
'defaultValue' => time()
|
||
|
],
|
||
|
'to' => [
|
||
|
'longPrefix' => 'to',
|
||
|
'required' => false,
|
||
|
'description' => 'Date for searching to',
|
||
|
'defaultValue' => time()
|
||
|
],
|
||
|
'deliveryMonitoringStates' => [
|
||
|
'longPrefix' => 'deliveryMonitoringStates',
|
||
|
'required' => true,
|
||
|
'description' => 'List of states for searching'
|
||
|
],
|
||
|
'deliveryExecutionStates' => [
|
||
|
'longPrefix' => 'deliveryExecutionStates',
|
||
|
'required' => true,
|
||
|
'description' => 'List of states for filtering.'
|
||
|
],
|
||
|
'deliveryExecutionStatesForce' => [
|
||
|
'longPrefix' => 'deliveryExecutionStatesForce',
|
||
|
'required' => false,
|
||
|
'description' => 'Force state for executions',
|
||
|
'defaultValue' => ''
|
||
|
],
|
||
|
'withProgress' => [
|
||
|
'longPrefix' => 'withProgress',
|
||
|
'required' => false,
|
||
|
'description' => 'Should be a result only with progress? True by default',
|
||
|
'defaultValue' => 1
|
||
|
],
|
||
|
'wetRun' => [
|
||
|
'longPrefix' => 'wetRun',
|
||
|
'required' => false,
|
||
|
'description' => 'Wet run',
|
||
|
'defaultValue' => 0
|
||
|
]
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return Report
|
||
|
*/
|
||
|
protected function run()
|
||
|
{
|
||
|
try {
|
||
|
$this->init();
|
||
|
} catch (\Exception $e) {
|
||
|
return new Report(Report::TYPE_ERROR, $e->getMessage());
|
||
|
}
|
||
|
/** @var DeliveryMonitoringService $deliveryMonitoringService */
|
||
|
$deliveryMonitoringService = $this->getServiceLocator()->get(DeliveryMonitoringService::SERVICE_ID);
|
||
|
|
||
|
$deliveryExecutionsData = $deliveryMonitoringService->find([
|
||
|
[
|
||
|
DeliveryMonitoringService::STATUS => $this->deliveryMonitoringStates
|
||
|
],
|
||
|
'AND',
|
||
|
[['start_time' => '<'.$this->to], 'AND', ['start_time' => '>'.$this->from]],
|
||
|
]);
|
||
|
$deliveryExecutionService = ServiceProxy::singleton();
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, "Found ".sizeof($deliveryExecutionsData). " items."));
|
||
|
$count = 0;
|
||
|
|
||
|
foreach ($deliveryExecutionsData as $deliveryExecutionData) {
|
||
|
|
||
|
$data = $deliveryExecutionData->get();
|
||
|
$deliveryExecution = $deliveryExecutionService->getDeliveryExecution(
|
||
|
$data[DeliveryMonitoringService::DELIVERY_EXECUTION_ID]
|
||
|
);
|
||
|
try {
|
||
|
$deliveryExecution->getDelivery();
|
||
|
try {
|
||
|
/** @var DeliveryExecutionStateService $deliveryExecutionStateService */
|
||
|
$deliveryExecutionStateService = $this->getServiceLocator()->get(DeliveryExecutionStateService::SERVICE_ID);
|
||
|
if ($this->withProgress && $deliveryExecutionStateService->isCancelable($deliveryExecution)) {
|
||
|
break;
|
||
|
}
|
||
|
$executionState = $deliveryExecution->getState()->getUri();
|
||
|
if (in_array($executionState, $this->deliveryExecutionStates) && $data['status'] != $executionState) {
|
||
|
$deliveryExecutionStatesForce = $this->deliveryExecutionStatesForce ?: $executionState;
|
||
|
if ($this->wetRun === true) {
|
||
|
if ($this->deliveryExecutionStatesForce) {
|
||
|
$deliveryExecution->setState($this->deliveryExecutionStatesForce);
|
||
|
$deliveryExecutionData->update(DeliveryMonitoringService::STATUS, $this->deliveryExecutionStatesForce);
|
||
|
$deliveryMonitoringService->save($deliveryExecutionData);
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, "{$deliveryExecution->getIdentifier()} was updated from {$data['status']} to {$deliveryExecutionStatesForce} ."));
|
||
|
} else {
|
||
|
$deliveryExecutionData->update(DeliveryMonitoringService::STATUS, $executionState);
|
||
|
$deliveryMonitoringService->save($deliveryExecutionData);
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, "{$deliveryExecution->getIdentifier()} was updated from {$data['status']} to {$executionState} ."));
|
||
|
}
|
||
|
$count++;
|
||
|
} else {
|
||
|
if ($this->deliveryExecutionStatesForce) {
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, "Will update state for {$deliveryExecution->getIdentifier()} from {$data['status']} to {$this->deliveryExecutionStatesForce} ."));
|
||
|
} else {
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, "Will update state for {$deliveryExecution->getIdentifier()} from {$data['status']} to {$executionState} ."));
|
||
|
}
|
||
|
|
||
|
$count++;
|
||
|
}
|
||
|
}
|
||
|
} catch (\Exception $e) {
|
||
|
$this->report->add(new Report(Report::TYPE_ERROR, $e->getMessage()));
|
||
|
}
|
||
|
} catch (\Exception $e) {
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, "Execution with ID {$data[DeliveryMonitoringService::DELIVERY_EXECUTION_ID]} doesn't exist."));
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, "Execution with ID {$data[DeliveryMonitoringService::DELIVERY_EXECUTION_ID]} will be created in storage."));
|
||
|
$this->initExecutionData($data);
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, "Was updated {$count} items."));
|
||
|
return $this->report;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Initialize parameters
|
||
|
*/
|
||
|
private function init()
|
||
|
{
|
||
|
|
||
|
$this->from = $this->getOption('from');
|
||
|
$this->to = $this->getOption('to');
|
||
|
$this->deliveryExecutionStatesForce = $this->getOption('deliveryExecutionStatesForce');
|
||
|
$this->deliveryMonitoringStates = explode(',', $this->getOption('deliveryMonitoringStates')?:'');
|
||
|
$this->deliveryExecutionStates = explode(',', $this->getOption('deliveryExecutionStates')?:'');
|
||
|
$this->wetRun = (boolean) $this->getOption('wetRun');
|
||
|
$this->withProgress = (boolean) $this->getOption('withProgress');
|
||
|
$this->report = new Report(
|
||
|
Report::TYPE_INFO,
|
||
|
'Starting checking delivery monitoring entries');
|
||
|
}
|
||
|
|
||
|
protected function initExecutionData($data)
|
||
|
{
|
||
|
$dateObj = DateTime::createFromFormat('U.u', $data['start_time']);
|
||
|
$startTime = $dateObj->format('0.u00 U');
|
||
|
$executionData = array(
|
||
|
OntologyRdfs::RDFS_LABEL => $data['delivery_name'],
|
||
|
OntologyDeliveryExecution::PROPERTY_DELIVERY => $data['delivery_id'],
|
||
|
OntologyDeliveryExecution::PROPERTY_SUBJECT => $data['test_taker'],
|
||
|
OntologyDeliveryExecution::PROPERTY_TIME_START => $startTime,
|
||
|
OntologyDeliveryExecution::PROPERTY_STATUS => DeliveryExecution::STATE_AWAITING
|
||
|
);
|
||
|
$executionDataJson = json_encode($executionData);
|
||
|
|
||
|
// deliveryExecutions
|
||
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoDelivery');
|
||
|
$deliveryService = $extension->getConfig('execution_service');
|
||
|
if ($deliveryService instanceof KeyValueService) {
|
||
|
if ($this->wetRun === true) {
|
||
|
$kvDe = new KVDeliveryExecution($deliveryService, $data['delivery_execution_id'], $executionData);
|
||
|
$deliveryService->update($kvDe);
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, "Was created execution with id state for {$data['delivery_execution_id']} and body {$executionDataJson}."));
|
||
|
} else {
|
||
|
$this->report->add(new Report(Report::TYPE_INFO, "Will create execution with id state for {$data['delivery_execution_id']} and body {$executionDataJson}."));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|