From cfa854f307edb356f8c79a67e84fa16f645a21da Mon Sep 17 00:00:00 2001 From: aynsix Date: Thu, 19 Dec 2019 16:09:35 +0400 Subject: [PATCH] start subdef creation after first write meta --- lib/Alchemy/Phrasea/Border/Manager.php | 19 +++++++------- .../Event/Record/MetadataChangedEvent.php | 25 +++++++++++++++++++ .../Metadata/PhraseanetMetadataSetter.php | 4 +-- .../TaskManager/Job/WriteMetadataJob.php | 16 +++++++++++- lib/classes/record/adapter.php | 14 +++++++++-- 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/lib/Alchemy/Phrasea/Border/Manager.php b/lib/Alchemy/Phrasea/Border/Manager.php index d017d206e6..543f97ebd6 100644 --- a/lib/Alchemy/Phrasea/Border/Manager.php +++ b/lib/Alchemy/Phrasea/Border/Manager.php @@ -14,8 +14,6 @@ namespace Alchemy\Phrasea\Border; use Alchemy\Phrasea\Application; use Alchemy\Phrasea\Border\Checker\CheckerInterface; use Alchemy\Phrasea\Border\Attribute\AttributeInterface; -use Alchemy\Phrasea\Core\Event\Record\RecordEvents; -use Alchemy\Phrasea\Core\Event\Record\SubdefinitionCreateEvent; use Alchemy\Phrasea\Exception\RuntimeException; use Alchemy\Phrasea\Metadata\Tag\TfArchivedate; use Alchemy\Phrasea\Metadata\Tag\TfQuarantine; @@ -112,6 +110,9 @@ class Manager if (($visa->isValid() || $forceBehavior === self::FORCE_RECORD) && $forceBehavior !== self::FORCE_LAZARET) { + // Write UUID + $file->getUUID(false, true); + $this->addMediaAttributes($file); $element = $this->createRecord($file, $nosubdef); @@ -119,14 +120,14 @@ class Manager $code = self::RECORD_CREATED; } else { + // Write UUID + $file->getUUID(false, true); + $element = $this->createLazaret($file, $visa, $session, $forceBehavior === self::FORCE_LAZARET); $code = self::LAZARET_CREATED; } - // Write UUID - $file->getUUID(false, true); - if (is_callable($callable)) { $callable($element, $visa, $code); } @@ -332,12 +333,12 @@ class Manager } } - $this->app['phraseanet.metadata-setter']->replaceMetadata($newMetadata, $element); - - if(!$nosubdef) { - $this->app['dispatcher']->dispatch(RecordEvents::SUBDEFINITION_CREATE, new SubdefinitionCreateEvent($element, true)); + if ($nosubdef) { + $element->setNoSubdef(); } + $this->app['phraseanet.metadata-setter']->replaceMetadata($newMetadata, $element, true, $nosubdef);// true for $isNewRecord + return $element; } diff --git a/lib/Alchemy/Phrasea/Core/Event/Record/MetadataChangedEvent.php b/lib/Alchemy/Phrasea/Core/Event/Record/MetadataChangedEvent.php index 65326b894b..5a3ed5c2ef 100644 --- a/lib/Alchemy/Phrasea/Core/Event/Record/MetadataChangedEvent.php +++ b/lib/Alchemy/Phrasea/Core/Event/Record/MetadataChangedEvent.php @@ -11,6 +11,31 @@ namespace Alchemy\Phrasea\Core\Event\Record; +use Alchemy\Phrasea\Model\RecordInterface; + class MetadataChangedEvent extends RecordEvent { + private $isNewRecord; + private $nosubdef; + + public function __construct(RecordInterface $record, $isNewRecord = false, $nosubdef = false) + { + parent::__construct($record); + + $this->isNewRecord = $isNewRecord; + $this->nosubdef = $nosubdef; + } + + /** + * @return bool + */ + public function isNewRecord() + { + return $this->isNewRecord; + } + + public function isNosubdef() + { + return $this->nosubdef; + } } diff --git a/lib/Alchemy/Phrasea/Metadata/PhraseanetMetadataSetter.php b/lib/Alchemy/Phrasea/Metadata/PhraseanetMetadataSetter.php index c72c884203..afa459f154 100644 --- a/lib/Alchemy/Phrasea/Metadata/PhraseanetMetadataSetter.php +++ b/lib/Alchemy/Phrasea/Metadata/PhraseanetMetadataSetter.php @@ -34,7 +34,7 @@ class PhraseanetMetadataSetter * @param \record_adapter $record * @throws \Exception_InvalidArgument */ - public function replaceMetadata($metadataCollection, \record_adapter $record) + public function replaceMetadata($metadataCollection, \record_adapter $record, $isNewRecord = false, $nosubdef = false) { $metaStructure = $this->repository->find($record->getDataboxId())->get_meta_structure()->get_elements(); @@ -82,7 +82,7 @@ class PhraseanetMetadataSetter } if (! empty($metadataInRecordFormat)) { - $record->set_metadatas($metadataInRecordFormat, true); + $record->set_metadatas($metadataInRecordFormat, true, $isNewRecord, $nosubdef); } } diff --git a/lib/Alchemy/Phrasea/TaskManager/Job/WriteMetadataJob.php b/lib/Alchemy/Phrasea/TaskManager/Job/WriteMetadataJob.php index 795b0b2a83..7631044cf2 100644 --- a/lib/Alchemy/Phrasea/TaskManager/Job/WriteMetadataJob.php +++ b/lib/Alchemy/Phrasea/TaskManager/Job/WriteMetadataJob.php @@ -12,6 +12,8 @@ namespace Alchemy\Phrasea\TaskManager\Job; use Alchemy\Phrasea\Application; +use Alchemy\Phrasea\Core\Event\Record\RecordEvents; +use Alchemy\Phrasea\Core\Event\Record\SubdefinitionCreateEvent; use Alchemy\Phrasea\Core\PhraseaTokens; use Alchemy\Phrasea\Metadata\TagFactory; use Alchemy\Phrasea\TaskManager\Editor\WriteMetadataEditor; @@ -69,7 +71,7 @@ class WriteMetadataJob extends AbstractJob foreach ($jobData->getApplication()->getDataboxes() as $databox) { $connection = $databox->get_connection(); - $statement = $connection->prepare('SELECT record_id, coll_id, jeton FROM record WHERE (jeton & :token > 0)'); + $statement = $connection->prepare('SELECT record_id, coll_id, work, jeton FROM record WHERE (jeton & :token > 0)'); $statement->execute(['token' => PhraseaTokens::WRITE_META]); $rs = $statement->fetchAll(\PDO::FETCH_ASSOC); $statement->closeCursor(); @@ -203,6 +205,13 @@ class WriteMetadataJob extends AbstractJob 'record_id' => $record_id, 'token' => PhraseaTokens::WRITE_META, ]); + + // write meta for the document is finished + // if it's a new record, order to create subdef + if (count($record->get_subdefs()) == 3 && count($subdefs) == 1 && isset($subdefs['document']) && $row['work'] != 1) { + $this->getDispatcher($jobData->getApplication())->dispatch(RecordEvents::SUBDEFINITION_CREATE, new SubdefinitionCreateEvent($record, true)); + } + $statement->closeCursor(); } } @@ -217,6 +226,11 @@ class WriteMetadataJob extends AbstractJob return $app['exiftool.writer']; } + private function getDispatcher(Application $app) + { + return $app['dispatcher']; + } + /** * @param \databox $databox * @param string $subdefType diff --git a/lib/classes/record/adapter.php b/lib/classes/record/adapter.php index 7c91e2e135..ebf9c0d4e8 100644 --- a/lib/classes/record/adapter.php +++ b/lib/classes/record/adapter.php @@ -1083,7 +1083,7 @@ class record_adapter implements RecordInterface, cache_cacheableInterface * * @return record_adapter */ - public function set_metadatas(array $metadatas, $force_readonly = false) + public function set_metadatas(array $metadatas, $force_readonly = false, $isNewRecord = false, $nosubdef = false) { $databox_descriptionStructure = $this->getDatabox()->get_meta_structure(); @@ -1108,7 +1108,7 @@ class record_adapter implements RecordInterface, cache_cacheableInterface unset($xml); $this->write_metas(); - $this->dispatch(RecordEvents::METADATA_CHANGED, new MetadataChangedEvent($this)); + $this->dispatch(RecordEvents::METADATA_CHANGED, new MetadataChangedEvent($this, $isNewRecord, $nosubdef)); return $this; } @@ -1175,6 +1175,16 @@ class record_adapter implements RecordInterface, cache_cacheableInterface return $this; } + public function setNoSubdef() + { + $this->getDataboxConnection()->executeUpdate( + 'UPDATE record SET work = 1 WHERE record_id= :record_id', + ['record_id' => $this->getRecordId()] + ); + + return $this; + } + private function dispatch($eventName, RecordEvent $event) { $this->app['dispatcher']->dispatch($eventName, $event);