tao-test/app/taoProctoring/scripts/update/Updater.php

972 lines
44 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) 2014 (original work) Open Assessment Technologies SA;
*
*
*/
namespace oat\taoProctoring\scripts\update;
use common_ext_ExtensionUpdater;
use common_persistence_Manager;
use Doctrine\DBAL\Schema\SchemaException;
use oat\oatbox\event\EventManager;
use oat\oatbox\service\ConfigurableService;
use oat\oatbox\service\ServiceNotFoundException;
use oat\tao\model\accessControl\func\AccessRule;
use oat\tao\model\accessControl\func\AclProxy;
use oat\tao\model\event\MetadataModified;
use oat\tao\model\mvc\DefaultUrlService;
use oat\tao\model\taskQueue\TaskLogInterface;
use oat\tao\model\user\import\UserCsvImporterFactory;
use oat\tao\model\user\TaoRoles;
use oat\tao\model\webhooks\WebhookEventsServiceInterface;
use oat\tao\scripts\update\OntologyUpdater;
use oat\taoDelivery\model\AssignmentService;
use oat\taoDelivery\model\AttemptService;
use oat\taoDelivery\model\AttemptServiceInterface;
use oat\taoDelivery\model\execution\Counter\DeliveryExecutionCounterInterface;
use oat\taoDelivery\model\execution\Delete\DeliveryExecutionDeleteService;
use oat\taoDelivery\model\execution\StateServiceInterface;
use oat\taoDelivery\models\classes\execution\event\DeliveryExecutionCreated;
use oat\taoDelivery\models\classes\execution\event\DeliveryExecutionState;
use oat\taoDeliveryRdf\model\Delete\DeliveryDeleteService;
use oat\taoDeliveryRdf\model\event\DeliveryCreatedEvent;
use oat\taoDeliveryRdf\model\event\DeliveryUpdatedEvent;
use oat\taoDeliveryRdf\model\GroupAssignment;
use oat\taoEventLog\model\eventLog\LoggerService;
use oat\taoProctoring\controller\DeliverySelection;
use oat\taoProctoring\controller\ExecutionRestService;
use oat\taoProctoring\controller\Monitor;
use oat\taoProctoring\controller\MonitorProctorAdministrator;
use oat\taoProctoring\controller\Tools;
use oat\taoProctoring\model\ActivityMonitoringService;
use oat\taoProctoring\model\AssessmentResultsService;
use oat\taoProctoring\model\authorization\AuthorizationGranted;
use oat\taoProctoring\model\authorization\TestTakerAuthorizationDelegator;
use oat\taoProctoring\model\authorization\TestTakerAuthorizationInterface;
use oat\taoProctoring\model\authorization\TestTakerAuthorizationService;
use oat\taoProctoring\model\delivery\DeliverySyncService;
use oat\taoProctoring\model\deliveryLog\DeliveryLog;
use oat\taoProctoring\model\deliveryLog\implementation\RdsDeliveryLogService;
use oat\taoProctoring\model\deliveryLog\listener\DeliveryLogTimerAdjustedEventListener;
use oat\taoProctoring\model\event\DeliveryExecutionFinished;
use oat\taoProctoring\model\event\DeliveryExecutionTimerAdjusted;
use oat\taoProctoring\model\execution\Counter\DeliveryExecutionCounterService;
use oat\taoProctoring\model\execution\DeliveryExecution as ProctoredDeliveryExecution;
use oat\taoProctoring\model\execution\DeliveryExecutionManagerService;
use oat\taoProctoring\model\execution\ProctoredSectionPauseService;
use oat\taoProctoring\model\execution\ProctoringDeliveryDeleteService;
use oat\taoProctoring\model\FinishDeliveryExecutionsService;
use oat\taoProctoring\model\GuiSettingsService;
use oat\taoProctoring\model\implementation\DeliveryExecutionStateService;
use oat\taoProctoring\model\implementation\TestRunnerMessageService;
use oat\taoProctoring\model\import\ProctorCsvImporter;
use oat\taoProctoring\model\monitorCache\DeliveryMonitoringService;
use oat\taoProctoring\model\monitorCache\implementation\MonitoringStorage;
use oat\taoProctoring\model\monitorCache\update\TestUpdate;
use oat\taoProctoring\model\ProctorService;
use oat\taoProctoring\model\ProctorServiceDelegator;
use oat\taoProctoring\model\ProctorServiceInterface;
use oat\taoProctoring\model\ReasonCategoryService;
use oat\taoProctoring\model\runner\ProctoringRunnerService;
use oat\taoProctoring\model\service\AbstractIrregularityReport;
use oat\taoProctoring\model\service\IrregularityReport;
use oat\taoProctoring\model\ServiceDelegatorInterface;
use oat\taoProctoring\model\TerminateDeliveryExecutionsService;
use oat\taoProctoring\scripts\install\RegisterBreadcrumbsServices;
use oat\taoProctoring\scripts\install\RegisterGuiSettingsService;
use oat\taoProctoring\scripts\install\RegisterRunnerMessageService;
use oat\taoProctoring\scripts\install\SetUpProctoringUrlService;
use oat\taoQtiTest\models\event\QtiTestStateChangeEvent;
use oat\taoQtiTest\models\SectionPauseService;
use oat\taoTests\models\event\TestChangedEvent;
use oat\taoTests\models\event\TestExecutionPausedEvent;
/**
*
* @author Joel Bout <joel@taotesting.com>
* @deprecated use migrations instead. See https://github.com/oat-sa/generis/wiki/Tao-Update-Process
*/
class Updater extends common_ext_ExtensionUpdater
{
/**
* @param string $initialVersion
* @return string string
* @throws \common_Exception
*/
public function update($initialVersion)
{
if ($this->isBetween('0.0.0', '3.11.0')) {
throw new \common_ext_UpdateException('Please first update to 3.15.0 using taoProctoring 3.15.0');
}
$this->skip('3.12.0', '3.12.1');
if ($this->isVersion('3.12.1')) {
OntologyUpdater::syncModels();
$this->setVersion('3.13.0');
}
$this->skip('3.13.0', '3.13.7');
if ($this->isVersion('3.13.7')) {
try {
$this->getServiceManager()->get(ReasonCategoryService::SERVICE_ID);
} catch (ServiceNotFoundException $e) {
$service = new ReasonCategoryService();
$service->setServiceManager($this->getServiceManager());
$this->getServiceManager()->register(ReasonCategoryService::SERVICE_ID, $service);
}
$this->setVersion('3.14.0');
}
if ($this->isBetween('3.14.0', '3.16.1')) {
// ignore eligibility service
try {
// drop unused columns
$monitorService = $this->getServiceManager()->get(DeliveryMonitoringService::SERVICE_ID);
$persistenceManager = $this->getServiceManager()->get(\common_persistence_Manager::SERVICE_ID);
$persistence = $persistenceManager->getPersistenceById($monitorService->getOption(MonitoringStorage::OPTION_PERSISTENCE));
$schemaManager = $persistence->getDriver()->getSchemaManager();
$schema = $schemaManager->createSchema();
$fromSchema = clone $schema;
$tableData = $schema->getTable(MonitoringStorage::TABLE_NAME);
$tableData->dropColumn('remaining_time');
$tableData->dropColumn('extra_time');
$tableData->dropColumn('consumed_extra_time');
$queries = $persistence->getPlatform()->getMigrateSchemaSql($fromSchema, $schema);
foreach ($queries as $query) {
$persistence->exec($query);
}
} catch (SchemaException $e) {
\common_Logger::i('Database Schema already up to date.');
}
// update model
OntologyUpdater::syncModels();
// correct event listeners
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->detach(TestChangedEvent::EVENT_NAME,
array('oat\\taoProctoring\\model\\monitorCache\\update\\TestUpdate', 'testStateChange')
);
$eventManager->detach('oat\\taoDelivery\\models\\classes\\execution\\event\\DeliveryExecutionState',
['oat\\taoProctoring\\model\\monitorCache\\update\\DeliveryExecutionStateUpdate', 'stateChange']
);
$eventManager->detach('oat\\taoProctoring\\model\\event\\EligiblityChanged',
['oat\\taoProctoring\\model\\monitorCache\\update\\EligiblityUpdate', 'eligiblityChange']
);
$eventManager->detach(\oat\tao\model\event\MetadataModified::class,
['oat\\taoProctoring\\model\\monitorCache\\update\\DeliveryUpdate', 'labelChange']
);
$eventManager->attach(DeliveryExecutionState::class, [DeliveryMonitoringService::SERVICE_ID, 'executionStateChanged']);
$eventManager->attach(DeliveryExecutionCreated::class, [DeliveryMonitoringService::SERVICE_ID, 'executionCreated']);
$eventManager->attach(MetadataModified::class, [DeliveryMonitoringService::SERVICE_ID, 'deliveryLabelChanged']);
$eventManager->attach(TestChangedEvent::EVENT_NAME, [DeliveryMonitoringService::SERVICE_ID, 'testStateChanged']);
$eventManager->attach(QtiTestStateChangeEvent::EVENT_NAME, [DeliveryMonitoringService::SERVICE_ID, 'qtiTestStatusChanged']);
$eventManager->attach(AuthorizationGranted::EVENT_NAME, [DeliveryMonitoringService::SERVICE_ID, 'deliveryAuthorized']);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
// unregister testcenter services
$this->getServiceManager()->register(AssignmentService::SERVICE_ID, new GroupAssignment());
$this->getServiceManager()->register(ProctorService::SERVICE_ID, new ProctorService());
// access rights
AclProxy::applyRule(new AccessRule('grant', ProctorService::ROLE_PROCTOR, DeliverySelection::class));
AclProxy::applyRule(new AccessRule('grant', ProctorService::ROLE_PROCTOR, Monitor::class));
$old = array(
['http://www.tao.lu/Ontologies/TAOProctor.rdf#TestCenterManager',array('oat\\taoProctoring\\controller\\TestCenterManager')],
['http://www.tao.lu/Ontologies/TAOProctor.rdf#TestCenterAdministratorRole',array('oat\\taoProctoring\\controller\\ProctorManager')],
[ProctorService::ROLE_PROCTOR,'oat\\taoProctoring\\controller\\Delivery'],
[ProctorService::ROLE_PROCTOR,'oat\\taoProctoring\\controller\\Diagnostic'],
[ProctorService::ROLE_PROCTOR,'oat\\taoProctoring\\controller\\TestCenter'],
['http://www.tao.lu/Ontologies/generis.rdf#taoClientDiagnosticManager','oat\\taoProctoring\\controller\\DiagnosticChecker'],
[TaoRoles::ANONYMOUS, 'oat\\taoProctoring\\controller\\DiagnosticChecker']
);
foreach ($old as $row) {
[$role, $acl] = $row;
AclProxy::revokeRule(new AccessRule('grant', $role, $acl));
}
$this->setVersion('4.0.0');
}
$this->skip('4.0.0', '4.3.0');
// fix potentially missing roles, moved from 4.1.1
if ($this->isVersion('4.3.0')) {
AclProxy::applyRule(new AccessRule('grant',TaoRoles::SYSTEM_ADMINISTRATOR, Tools::class.'@pauseActiveExecutions'));
$this->setVersion('4.3.1');
}
if ($this->isVersion('4.3.1')) {
/** @var DeliveryMonitoringService $monitoring */
$action = new UpdateMonitoringTimeValues();
$action([]);
$this->setVersion('4.4.0');
}
$this->skip('4.4.0', '4.5.2');
if ($this->isVersion('4.5.2')) {
/** @var DeliveryMonitoringService $monitoring */
$action = new UpdateLastConnectivity();
$action([]);
$this->setVersion('4.5.3');
}
$this->skip('4.5.3', '4.6.2');
if ($this->isVersion('4.6.2')) {
$options = $this->getServiceManager()->get('taoProctoring/DeliveryExecutionState')->getOptions();
$this->getServiceManager()->unregister('taoProctoring/DeliveryExecutionState');
$service = new DeliveryExecutionStateService($options);
$this->getServiceManager()->register(StateServiceInterface::SERVICE_ID, $service);
OntologyUpdater::syncModels();
$this->setVersion('4.7.0');
}
if ($this->isVersion('4.7.0')) {
/** @var DeliveryExecutionStateService $service */
$service = $this->getServiceManager()->get(DeliveryExecutionStateService::SERVICE_ID);
$service->setOption(DeliveryExecutionStateService::OPTION_CANCELLATION_DELAY, 'PT30M');
$this->getServiceManager()->register(DeliveryExecutionStateService::SERVICE_ID, $service);
OntologyUpdater::syncModels();
$this->setVersion('4.8.0');
}
$this->skip('4.8.0', '4.8.1');
if ($this->isVersion('4.8.1')) {
AclProxy::applyRule(new AccessRule('grant', ProctorService::ROLE_PROCTOR, \tao_actions_Breadcrumbs::class));
$this->runExtensionScript(RegisterBreadcrumbsServices::class);
$this->setVersion('4.9.0');
}
if ($this->isVersion('4.9.0')) {
/** @var DeliveryMonitoringService $monitoring */
$action = new UpdateLastConnectivity();
$action([]);
$this->setVersion('4.9.1');
}
$this->skip('4.9.1', '4.10.9');
if ($this->isVersion('4.10.9')) {
$this->runExtensionScript(RegisterRunnerMessageService::class);
$this->setVersion('4.11.0');
}
if ($this->isVersion('4.11.0')) {
$action = new SetUpProctoringUrlService();
$action->setServiceLocator($this->getServiceManager());
$action([]);
$this->setVersion('4.12.0');
}
$this->skip('4.12.0', '4.12.2');
if ($this->isVersion('4.12.2')) {
$service = new ActivityMonitoringService([
ActivityMonitoringService::OPTION_ACTIVE_USER_THRESHOLD => 300,
]);
$this->getServiceManager()->register(ActivityMonitoringService::SERVICE_ID, $service);
AclProxy::applyRule(new AccessRule('grant', TaoRoles::OPERATIONAL_ADMINISTRATOR, \oat\taoProctoring\controller\Tools::class));
$this->setVersion('4.13.0');
}
$this->skip('4.13.0', '4.13.1');
if ($this->isVersion('4.13.1')) {
$action = new RegisterGuiSettingsService();
$action->setServiceLocator($this->getServiceManager());
$action->__invoke([]);
$this->setVersion('4.14.0');
}
if ($this->isVersion('4.14.0')) {
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->detach(TestExecutionPausedEvent::class,
[DeliveryExecutionStateService::class, 'catchSessionPause']
);
$eventManager->attach(TestExecutionPausedEvent::class,
[DeliveryExecutionStateService::SERVICE_ID, 'catchSessionPause']
);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$this->setVersion('4.15.0');
}
$this->skip('4.15.0', '4.16.0');
if ($this->isVersion('4.16.0')) {
$this->getServiceManager()->register(TestTakerAuthorizationService::SERVICE_ID, new TestTakerAuthorizationService());
$this->setVersion('4.17.0');
}
$this->skip('4.17.0', '4.19.1');
if ($this->isVersion('4.19.1')) {
/** @var GuiSettingsService $guiService */
$guiService = $this->getServiceManager()->get(GuiSettingsService::SERVICE_ID);
$guiService->setOption(GuiSettingsService::PROCTORING_ALLOW_PAUSE, true);
$this->getServiceManager()->register(GuiSettingsService::SERVICE_ID, $guiService);
$this->setVersion('4.20.0');
}
$this->skip('4.20.0', '5.1.0');
if ($this->isVersion('5.1.0')) {
$service = $this->getServiceManager()->get(ActivityMonitoringService::SERVICE_ID);
$service->setOption(ActivityMonitoringService::OPTION_COMPLETED_ASSESSMENTS_AUTO_REFRESH, 30);
$this->getServiceManager()->register(ActivityMonitoringService::SERVICE_ID, $service);
$this->setVersion('5.1.1');
}
$this->skip('5.1.1', '5.2.1');
if ($this->isVersion('5.2.1')) {
$service = $this->getServiceManager()->get(ActivityMonitoringService::SERVICE_ID);
$service->setOption(ActivityMonitoringService::OPTION_ASSESSMENT_ACTIVITY_AUTO_REFRESH, 60);
$this->getServiceManager()->register(ActivityMonitoringService::SERVICE_ID, $service);
$this->setVersion('5.3.0');
}
$this->skip('5.3.0', '5.9.0');
if ($this->isVersion('5.9.0') || $this->isVersion('5.9.1')) {
$urlService = $this->getServiceManager()->get(DefaultUrlService::SERVICE_ID);
$urlService->setRoute('ProctoringDeliveryServer', [
'ext' => 'taoProctoring',
'controller' => 'DeliveryServer',
'action' => 'index',
]
);
$this->getServiceManager()->register(DefaultUrlService::SERVICE_ID, $urlService);
$this->setVersion('5.10.0');
}
$this->skip('5.10.0', '5.10.3');
if ($this->isVersion('5.10.3')) {
OntologyUpdater::syncModels();
$this->setVersion('5.11.0');
}
if ($this->isVersion('5.11.0')) {
$persistence = $this->getServiceManager()
->get(common_persistence_Manager::SERVICE_ID)
->getPersistenceById('default');
$persistence->getPlatForm()->getQueryBuilder()
->update('kv_delivery_monitoring')
->set('monitoring_value', "REPLACE(monitoring_value, 's', '')")
->where('monitoring_key = ? and monitoring_value is not null')
->setParameters(['remaining_time'])
->execute();
$this->setVersion('5.12.0');
}
$this->skip('5.12.0', '5.12.2');
if ($this->isVersion('5.12.2')) {
$this->getServiceManager()->register(
DeliveryExecutionManagerService::SERVICE_ID,
new DeliveryExecutionManagerService()
);
$this->setVersion('5.13.0');
}
if ($this->isVersion('5.13.0')) {
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->detach('oat\\taoProctoring\\model\\event\\DeliveryExecutionFinished', [LoggerService::class, 'logEvent']);
$eventManager->attach('oat\\taoProctoring\\model\\event\\DeliveryExecutionFinished', [LoggerService::class, 'logEvent']);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$this->setVersion('5.13.1');
}
$this->skip('5.13.1', '5.15.1');
if ($this->isVersion('5.15.1')) {
$this->getServiceManager()->register(SectionPauseService::SERVICE_ID, new ProctoredSectionPauseService());
$this->setVersion('5.16.0');
}
$this->skip('5.16.0', '5.16.4');
if ($this->isVersion('5.16.4')) {
$proctorService = $this->getServiceManager()->get(ProctorService::SERVICE_ID);
$config = $proctorService->getOptions();
$config[ProctorService::PROCTORED_BY_DEFAULT] = true;
$service = new ProctorService($config);
$service->setServiceManager($this->getServiceManager());
$this->getServiceManager()->register(ProctorService::SERVICE_ID, $service);
/** @var EventManager $eventManager */
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->attach(DeliveryCreatedEvent::class, [ProctorService::SERVICE_ID, 'listenCreateDeliveryEvent']);
$eventManager->attach(DeliveryUpdatedEvent::class, [ProctorService::SERVICE_ID, 'listenUpdateDeliveryEvent']);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$this->setVersion('5.16.5');
}
if ($this->isVersion('5.16.5')) {
OntologyUpdater::syncModels();
$this->setVersion('5.16.6');
}
$this->skip('5.16.6', '5.16.9');
if ($this->isVersion('5.16.9')) {
$this->getServiceManager()->register(AbstractIrregularityReport::SERVICE_ID, new IrregularityReport());
$this->setVersion('5.17.0');
}
$this->skip('5.17.0', '5.18.1');
if ($this->isVersion('5.18.1')) {
$proctorService = $this->getServiceManager()->get(ProctorServiceInterface::SERVICE_ID);
$authService = $this->getServiceManager()->get(TestTakerAuthorizationService::SERVICE_ID);
if ($proctorService->hasOption(TestTakerAuthorizationService::PROCTORED_BY_DEFAULT)) {
$authService->setOption(
TestTakerAuthorizationService::PROCTORED_BY_DEFAULT,
$proctorService->getOption(TestTakerAuthorizationService::PROCTORED_BY_DEFAULT)
);
$this->getServiceManager()->register(TestTakerAuthorizationService::SERVICE_ID, $authService);
}
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->detach(DeliveryCreatedEvent::class, [ProctorService::SERVICE_ID, 'listenCreateDeliveryEvent']);
$eventManager->detach(DeliveryUpdatedEvent::class, [ProctorService::SERVICE_ID, 'listenUpdateDeliveryEvent']);
$eventManager->attach(DeliveryCreatedEvent::class, [TestTakerAuthorizationService::SERVICE_ID, 'onDeliveryCreated']);
$eventManager->attach(DeliveryUpdatedEvent::class, [TestTakerAuthorizationService::SERVICE_ID, 'onDeliveryUpdated']);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$service = $this->getServiceManager()->get(ProctorServiceInterface::SERVICE_ID);
if (!is_a($service, ProctorServiceDelegator::class)) {
$delegator = new ProctorServiceDelegator([ProctorServiceDelegator::PROCTOR_SERVICE_HANDLERS => [$service]]);
$this->getServiceManager()->register(ProctorServiceInterface::SERVICE_ID, $delegator);
}
$this->setVersion('6.0.0');
}
$this->skip('6.0.0', '6.1.2');
if ($this->isVersion('6.1.2')) {
$authService = $this->getServiceManager()->get(TestTakerAuthorizationInterface::SERVICE_ID);
// register DeliverySyncService
$oldDefault = $authService->hasOption(DeliverySyncService::PROCTORED_BY_DEFAULT)
? $authService->getOption(DeliverySyncService::PROCTORED_BY_DEFAULT)
: false;
$syncService = new DeliverySyncService();
$this->getServiceManager()->register(DeliverySyncService::SERVICE_ID, $syncService->setProctoredByDefault($oldDefault));
// wrap auth service
if (!is_a($authService, TestTakerAuthorizationDelegator::class)) {
$delegator = new TestTakerAuthorizationDelegator ([
ServiceDelegatorInterface::SERVICE_HANDLERS => [
new TestTakerAuthorizationService(),
],
]);
$this->getServiceManager()->register(TestTakerAuthorizationInterface::SERVICE_ID, $delegator);
}
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->detach(DeliveryCreatedEvent::class, [TestTakerAuthorizationService::SERVICE_ID, 'onDeliveryCreated']);
$eventManager->detach(DeliveryUpdatedEvent::class, [TestTakerAuthorizationService::SERVICE_ID, 'onDeliveryUpdated']);
$eventManager->attach(DeliveryCreatedEvent::class, [DeliverySyncService::SERVICE_ID, 'onDeliveryCreated']);
$eventManager->attach(DeliveryUpdatedEvent::class, [DeliverySyncService::SERVICE_ID, 'onDeliveryUpdated']);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$this->setVersion('7.0.0');
}
$this->skip('7.0.0', '7.2.1');
if ($this->isVersion('7.2.1')) {
$runnerService = new ProctoringRunnerService();
$runnerService->setServiceManager($this->getServiceManager());
$this->getServiceManager()->register(ProctoringRunnerService::SERVICE_ID, $runnerService);
$this->setVersion('7.3.0');
}
$this->skip('7.3.0', '7.3.4');
if ($this->isVersion('7.3.4')) {
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->attach(TestChangedEvent::EVENT_NAME, [TestUpdate::class, 'testStateChange']);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$this->setVersion('7.4.0');
}
$this->skip('7.4.0', '7.8.6');
if ($this->isVersion('7.8.6')) {
OntologyUpdater::syncModels();
AclProxy::applyRule(new AccessRule('grant', ProctorService::ROLE_PROCTOR_ADMINISTRATOR, MonitorProctorAdministrator::class));
$this->setVersion('7.9.0');
}
$this->skip('7.9.0', '7.11.0');
if ($this->isVersion('7.11.0')) {
/** @var TestRunnerMessageService $testRunnerMessageService */
$testRunnerMessageService = $this->getServiceManager()->get(TestRunnerMessageService::SERVICE_ID);
$testRunnerMessageService->setOption(
TestRunnerMessageService::PROCTOR_ROLES_OPTION,
[
ProctorService::ROLE_PROCTOR,
]
);
$this->getServiceManager()->register(TestRunnerMessageService::SERVICE_ID, $testRunnerMessageService);
$this->setVersion('7.11.1');
}
$this->skip('7.11.1', '7.11.6');
if ($this->isVersion('7.11.6')) {
/** @var ActivityMonitoringService $service */
$service = $this->getServiceManager()->get(ActivityMonitoringService::SERVICE_ID);
$options = array_merge($service->getOptions(), [ActivityMonitoringService::OPTION_USER_ACTIVITY_WIDGETS => [],]);
$service->setOptions($options);
$this->getServiceManager()->register(ActivityMonitoringService::SERVICE_ID, $service);
$this->setVersion('7.12.0');
}
$this->skip('7.12.0', '8.1.0');
if ($this->isVersion('8.1.0')) {
$monitorService = $this->getServiceManager()->get(MonitoringStorage::SERVICE_ID);
$monitorService->setOption(MonitoringStorage::OPTION_USE_UPDATE_MULTIPLE, false);
$this->getServiceManager()->register(MonitoringStorage::SERVICE_ID, $monitorService);
$this->setVersion('8.2.0');
}
$this->skip('8.2.0', '8.4.0');
if ($this->isVersion('8.4.0')) {
$proctoringExtension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoProctoring');
$proctoringExtension->setConfig('monitoringUserExtraFieldsSettings', []);
$this->setVersion('8.5.0');
}
if ($this->isVersion('8.5.0')) {
try {
// drop unused columns
$monitorService = $this->getServiceManager()->get(DeliveryMonitoringService::SERVICE_ID);
$persistenceManager = $this->getServiceManager()->get(\common_persistence_Manager::SERVICE_ID);
$persistence = $persistenceManager->getPersistenceById($monitorService->getOption(MonitoringStorage::OPTION_PERSISTENCE));
$schemaManager = $persistence->getDriver()->getSchemaManager();
$schema = $schemaManager->createSchema();
$fromSchema = clone $schema;
$tableData = $schema->getTable(MonitoringStorage::TABLE_NAME);
$tableData->dropColumn(MonitoringStorage::DELIVERY_NAME);
$queries = $persistence->getPlatform()->getMigrateSchemaSql($fromSchema, $schema);
foreach ($queries as $query) {
$persistence->exec($query);
}
} catch (SchemaException $e) {
\common_Logger::i('Database Schema already up to date.');
}
$monitorService = $this->getServiceManager()->get(MonitoringStorage::SERVICE_ID);
$monitorService->setOption(MonitoringStorage::OPTION_CACHE_SIZE, 2000);
$this->getServiceManager()->register(MonitoringStorage::SERVICE_ID, $monitorService);
$this->setVersion('8.5.1');
}
if ($this->isVersion('8.5.1')) {
try {
$monitorService = $this->getServiceManager()->get(DeliveryMonitoringService::SERVICE_ID);
$persistenceManager = $this->getServiceManager()->get(\common_persistence_Manager::SERVICE_ID);
$persistence = $persistenceManager->getPersistenceById($monitorService->getOption(MonitoringStorage::OPTION_PERSISTENCE));
$schemaManager = $persistence->getDriver()->getSchemaManager();
$schema = $schemaManager->createSchema();
$fromSchema = clone $schema;
$tableData = $schema->getTable(MonitoringStorage::TABLE_NAME);
$tableData->addColumn(MonitoringStorage::DELIVERY_ID, "text", array("notnull" => false));
$tableData->addColumn(MonitoringStorage::DELIVERY_NAME, "text", array("notnull" => false));
$queries = $persistence->getPlatform()->getMigrateSchemaSql($fromSchema, $schema);
foreach ($queries as $query) {
$persistence->exec($query);
}
} catch (SchemaException $e) {
\common_Logger::i('Database Schema already up to date.');
}
$this->setVersion('8.5.2');
}
$this->skip('8.5.2', '8.6.2');
if ($this->isVersion('8.6.2')) {
/** @var UserCsvImporterFactory $importerFactory */
$importerFactory = $this->getServiceManager()->get(UserCsvImporterFactory::SERVICE_ID);
$typeOptions = $importerFactory->getOption(UserCsvImporterFactory::OPTION_MAPPERS);
$typeOptions[ProctorCsvImporter::USER_IMPORTER_TYPE] = array(
UserCsvImporterFactory::OPTION_MAPPERS_IMPORTER => new ProctorCsvImporter()
);
$importerFactory->setOption(UserCsvImporterFactory::OPTION_MAPPERS, $typeOptions);
$this->getServiceManager()->register(UserCsvImporterFactory::SERVICE_ID, $importerFactory);
$this->setVersion('8.7.0');
}
$this->skip('8.7.0', '8.7.1');
if ($this->isVersion('8.7.1')) {
$assessmentResultsService = $this->getServiceManager()->get(AssessmentResultsService::SERVICE_ID);
$assessmentResultsService->setOption(
AssessmentResultsService::OPTION_SCORE_URL,
array(
'extension' => 'taoProctoring',
'controller' => 'Reporting',
'action' => 'printReport'
)
);
$this->getServiceManager()->register(AssessmentResultsService::SERVICE_ID, $assessmentResultsService);
$this->setVersion('8.8.0');
}
if ($this->isVersion('8.8.0')) {
$this->getServiceManager()->register(AttemptServiceInterface::SERVICE_ID, new AttemptService([]));
$this->setVersion('8.9.0');
}
$this->skip('8.9.0', '8.9.2');
if ($this->isVersion('8.9.2')) {
$attemptService = $this->safeLoadService(AttemptServiceInterface::SERVICE_ID);
if (!$attemptService instanceof AttemptServiceInterface) {
$attemptService = new AttemptService([]);
}
$statesToExclude = $attemptService->getStatesToExclude();
$statesToExclude[] = ProctoredDeliveryExecution::STATE_CANCELED;
$attemptService->setStatesToExclude($statesToExclude);
$this->getServiceManager()->register(AttemptServiceInterface::SERVICE_ID, $attemptService);
$this->setVersion('8.10.0');
}
$this->skip('8.10.0', '8.10.1');
if ($this->isVersion('8.10.1')) {
$terminateDEService = new TerminateDeliveryExecutionsService([
TerminateDeliveryExecutionsService::OPTION_TTL_AS_ACTIVE => 'PT6H',
TerminateDeliveryExecutionsService::OPTION_USE_DELIVERY_END_TIME => false,
]);
$this->getServiceManager()->register(TerminateDeliveryExecutionsService::SERVICE_ID, $terminateDEService);
$this->setVersion('8.10.2');
}
$this->skip('8.10.2', '8.11.0');
if ($this->isVersion('8.11.0')) {
$this->getServiceManager()->register(
DeliveryExecutionCounterInterface::SERVICE_ID,
new DeliveryExecutionCounterService()
);
$this->setVersion('8.12.0');
}
$this->skip('8.12.0', '8.13.0');
if ($this->isVersion('8.13.0')) {
$terminateDEService = new TerminateDeliveryExecutionsService([
TerminateDeliveryExecutionsService::OPTION_TTL_AS_ACTIVE => 'PT6H',
TerminateDeliveryExecutionsService::OPTION_USE_DELIVERY_END_TIME => false,
]);
$this->getServiceManager()->register(TerminateDeliveryExecutionsService::SERVICE_ID, $terminateDEService);
$this->setVersion('8.13.1');
}
$this->skip('8.13.1', '8.13.3');
if ($this->isVersion('8.13.3')){
/** @var DeliveryDeleteService $deleteDelivery */
$deleteDelivery = $this->getServiceManager()->get(DeliveryDeleteService::SERVICE_ID);
$proctorDeleteDelivery = new ProctoringDeliveryDeleteService($deleteDelivery->getOptions());
$this->getServiceManager()->register(DeliveryDeleteService::SERVICE_ID, $proctorDeleteDelivery);
$this->setVersion('8.14.0');
}
$this->skip('8.14.0', '9.2.2');
if ($this->isVersion('9.2.2')) {
/** @var RdsDeliveryLogService $deliveryLog */
$deliveryLog = $this->getServiceManager()->get(RdsDeliveryLogService::SERVICE_ID);
$deliveryLog->setOption(RdsDeliveryLogService::OPTION_FIELDS, [
RdsDeliveryLogService::EVENT_ID,
RdsDeliveryLogService::CREATED_BY,
RdsDeliveryLogService::DELIVERY_EXECUTION_ID,
]);
$this->getServiceManager()->register(RdsDeliveryLogService::SERVICE_ID, $deliveryLog);
$this->setVersion('9.3.0');
}
$this->skip('9.3.0', '10.1.0');
if ($this->isVersion('10.1.0')) {
$finishDEService = new FinishDeliveryExecutionsService([
FinishDeliveryExecutionsService::OPTION_TTL_AS_ACTIVE => 'PT6H',
FinishDeliveryExecutionsService::OPTION_USE_DELIVERY_END_TIME => false,
]);
$this->getServiceManager()->register(FinishDeliveryExecutionsService::SERVICE_ID, $finishDEService);
$this->setVersion('10.2.0');
}
$this->skip('10.2.0', '10.2.4');
if ($this->isVersion('10.2.4')){
AclProxy::applyRule(new AccessRule('grant', ProctorService::ROLE_PROCTOR, 'oat\\taoProctoring\\controller\\ExecutionRestService'));
$this->setVersion('10.3.0');
}
if ($this->isVersion('10.3.0')) {
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->detach(TestChangedEvent::EVENT_NAME, [TestUpdate::class, 'testStateChange']);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$this->setVersion('10.3.1');
}
$this->skip('10.3.1', '11.0.0');
if ($this->isVersion('11.0.0')) {
AclProxy::revokeRule(new AccessRule('grant', ProctorService::ROLE_PROCTOR, 'oat\\taoProctoring\\controller\\ExecutionRestService'));
$this->setVersion('12.0.0');
}
$this->skip('12.0.0', '12.3.0');
if ($this->isVersion('12.3.0')) {
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->detach(DeliveryExecutionFinished::class, ['oat\\taoEventLog\\model\\LoggerService', 'logEvent']);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$this->setVersion('12.3.1');
}
$this->skip('12.3.1', '12.3.2.3');
if ($this->isVersion('12.3.2.3')) {
$extensionManager = \common_ext_ExtensionsManager::singleton();
if (!$extensionManager->isInstalled('taoTestCenter') || !$extensionManager->isEnabled('taoTestCenter')) {
/** @var DefaultUrlService $urlService */
$urlService = $this->getServiceManager()->get(DefaultUrlService::SERVICE_ID);
$proctoringHomeRoute = $urlService->getRoute('ProctoringHome');
$dumbRoute = [
'ext' => 'taoProctoring',
'controller' => 'TestCenter',
'action' => 'index'
];
if ($proctoringHomeRoute == $dumbRoute) {
$urlService->setRoute('ProctoringHome', [
'ext' => 'tao',
'controller' => 'Main',
'action' => 'entry',
]
);
}
$this->getServiceManager()->register(DefaultUrlService::SERVICE_ID, $urlService);
}
$this->setVersion('12.3.3');
}
$this->skip('12.3.3', '12.3.4');
if ($this->isVersion('12.3.4')) {
/** @var TaskLogInterface|ConfigurableService $taskLogService */
$taskLogService = $this->getServiceManager()->get(TaskLogInterface::SERVICE_ID);
$taskLogService->linkTaskToCategory(AbstractIrregularityReport::class, TaskLogInterface::CATEGORY_EXPORT);
$this->getServiceManager()->register(TaskLogInterface::SERVICE_ID, $taskLogService);
$this->setVersion('12.4.0');
}
$this->skip('12.4.0', '12.5.2');
if ($this->isVersion('12.5.2')) {
/** @var EventManager $eventManager */
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->detach(DeliveryExecutionFinished::class, [LoggerService::class, 'logEvent']);
$eventManager->attach(DeliveryExecutionFinished::class, [LoggerService::class, 'logEvent']);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$this->setVersion('12.5.3');
}
$this->skip('12.5.3', '13.0.0');
if ($this->isVersion('13.0.0')) {
/** @var DeliveryExecutionDeleteService $executionDeleteService */
$executionDeleteService = $this->getServiceManager()->get(DeliveryExecutionDeleteService::SERVICE_ID);
$previousServices = $executionDeleteService->getOption(DeliveryExecutionDeleteService::OPTION_DELETE_DELIVERY_EXECUTION_DATA_SERVICES);
$executionDeleteService->setOption(DeliveryExecutionDeleteService::OPTION_DELETE_DELIVERY_EXECUTION_DATA_SERVICES,
array_merge($previousServices, [
'taoProctoring/DeliveryLog',
'taoProctoring/DeliveryMonitoring',
])
);
$this->getServiceManager()->register(DeliveryExecutionDeleteService::SERVICE_ID, $executionDeleteService);
$this->setVersion('13.1.0');
}
$this->skip('13.1.0', '15.1.2');
if ($this->isVersion('15.1.2')) {
OntologyUpdater::syncModels();
$this->setVersion('16.0.0');
}
$this->skip('16.0.0', '16.3.1');
if ($this->isVersion('16.3.1')) {
/** @var RdsDeliveryLogService $deliveryLog */
$deliveryLog = $this->getServiceManager()->get(DeliveryLog::SERVICE_ID);
$deliveryLog->setOption(DeliveryLog::OPTION_FIELDS, [
DeliveryLog::EVENT_ID,
DeliveryLog::CREATED_BY,
DeliveryLog::DELIVERY_EXECUTION_ID,
DeliveryLog::ID
]);
$this->getServiceManager()->register(DeliveryLog::SERVICE_ID, $deliveryLog);
$this->setVersion('16.4.0');
}
if ($this->isVersion('16.4.0')) {
/** @var EventManager $eventManager */
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
/** @var WebhookEventsServiceInterface $webhooksService */
$webhooksService = $this->getServiceManager()->get(WebhookEventsServiceInterface::SERVICE_ID);
$webhooksService->registerEvent(DeliveryExecutionFinished::EVENT_NAME);
/** @noinspection PhpParamsInspection */
$this->getServiceManager()->register(WebhookEventsServiceInterface::SERVICE_ID, $webhooksService);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$this->setVersion('17.0.0');
}
$this->skip('17.0.0', '17.2.3');
if ($this->isVersion('17.2.3')) {
/** @var GuiSettingsService $guiService */
$guiService = $this->getServiceManager()->get(GuiSettingsService::SERVICE_ID);
$guiService->setOption(GuiSettingsService::OPTION_SET_START_DATA_ONE_DAY, true);
$this->getServiceManager()->register(GuiSettingsService::SERVICE_ID, $guiService);
$this->setVersion('17.3.0');
}
$this->skip('17.3.0', '19.3.3');
if ($this->isVersion('19.3.3')) {
$script = 'sudo -u www-data php index.php \'oat\taoProctoring\scripts\tools\KvMonitoringMigration\' -f test_taker_first_name,test_taker_last_name,remaining_time,extended_time,extra_time,consumed_extra_time,last_test_taker_activity -d 1 -s 0 -pc -l 255';
$this->addReport(\common_report_Report::createInfo("Run script :'" . $script . "' to finish updating or for each field separately. May take few hours based on table size."));
$this->setVersion('19.4.0');
}
$this->skip('19.4.0', '19.4.1');
if ($this->isVersion('19.4.1')) {
/** @var DeliveryExecutionStateService $service */
$service = $this->getServiceManager()->get(DeliveryExecutionStateService::SERVICE_ID);
$currentOptionValue = $service->getOption(DeliveryExecutionStateService::OPTION_TIME_HANDLING);
if ($currentOptionValue === true) {
$service->setOption(
DeliveryExecutionStateService::OPTION_TIME_HANDLING,
DeliveryExecutionStateService::TIME_HANDLING_EXTRA_TIME
);
$this->getServiceManager()->register(DeliveryExecutionStateService::SERVICE_ID, $service);
}
$this->setVersion('19.5.0');
}
$this->skip('19.5.0', '19.9.0');
if ($this->isVersion('19.9.0')) {
$eventManager = $this->getServiceManager()->get(EventManager::SERVICE_ID);
$eventManager->attach(DeliveryExecutionTimerAdjusted::class, [
DeliveryLogTimerAdjustedEventListener::class,
'logTimeAdjustment'
]);
$this->getServiceManager()->register(EventManager::SERVICE_ID, $eventManager);
$this->setVersion('19.10.0');
}
$this->skip('19.10.0', '19.14.1');
if ($this->isVersion('19.14.1')) {
$script = 'sudo -u www-data php index.php \'oat\taoProctoring\scripts\tools\KvMonitoringMigration\' -f item_duration,stored_item_duration -d 1 -s 0 -pc -l 32';
$this->addReport(\common_report_Report::createInfo("Run script :'" . $script . "' to finish updating. Time to completion depends on table size."));
$this->setVersion('19.15.0');
}
$this->skip('19.15.0', '19.17.1');
//Updater files are deprecated. Please use migrations.
//See: https://github.com/oat-sa/generis/wiki/Tao-Update-Process
$this->setVersion($this->getExtension()->getManifest()->getVersion());
}
}