* @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()); } }