diff --git a/lib/Alchemy/Phrasea/Core/Version.php b/lib/Alchemy/Phrasea/Core/Version.php index c199cd8a41..49aae22fdb 100644 --- a/lib/Alchemy/Phrasea/Core/Version.php +++ b/lib/Alchemy/Phrasea/Core/Version.php @@ -18,7 +18,7 @@ namespace Alchemy\Phrasea\Core; */ class Version { - protected static $number = '3.9.0.a5'; + protected static $number = '3.9.0.a6'; protected static $name = 'Diplodocus'; public static function getNumber() diff --git a/lib/Doctrine/Entities/FtpExport.php b/lib/Doctrine/Entities/FtpExport.php new file mode 100644 index 0000000000..63cc9dbd53 --- /dev/null +++ b/lib/Doctrine/Entities/FtpExport.php @@ -0,0 +1,625 @@ +elements = new ArrayCollection(); + } + + /** + * Get id + * + * @return integer + */ + public function getId() + { + return $this->id; + } + + /** + * Set crash + * + * @param integer $crash + * + * @return FtpExport + */ + public function setCrash($crash) + { + $this->crash = $crash; + + return $this; + } + + /** + * Get crash + * + * @return integer + */ + public function getCrash() + { + return $this->crash; + } + + /** + * Increment crashes + * + * @return FtpExport + */ + public function incrementCrash() + { + $this->crash++; + + return $this; + } + + /** + * Set nbretry + * + * @param integer $nbretry + * + * @return FtpExport + */ + public function setNbretry($nbretry) + { + $this->nbretry = $nbretry; + + return $this; + } + + /** + * Get nbretry + * + * @return integer + */ + public function getNbretry() + { + return $this->nbretry; + } + + /** + * Set mail + * + * @param string $mail + * + * @return FtpExport + */ + public function setMail($mail) + { + $this->mail = $mail; + + return $this; + } + + /** + * Get mail + * + * @return string + */ + public function getMail() + { + return $this->mail; + } + + /** + * Set addr + * + * @param string $addr + * + * @return FtpExport + */ + public function setAddr($addr) + { + $this->addr = $addr; + + return $this; + } + + /** + * Get addr + * + * @return string + */ + public function getAddr() + { + return $this->addr; + } + + /** + * Set ssl + * + * @param boolean $ssl + * + * @return FtpExport + */ + public function setSsl($ssl) + { + $this->ssl = (Boolean) $ssl; + + return $this; + } + + /** + * Get ssl + * + * @return boolean + */ + public function isSsl() + { + return $this->ssl; + } + + /** + * Set login + * + * @param string $login + * + * @return FtpExport + */ + public function setLogin($login) + { + $this->login = $login; + + return $this; + } + + /** + * Get login + * + * @return string + */ + public function getLogin() + { + return $this->login; + } + + /** + * Set pwd + * + * @param string $pwd + * + * @return FtpExport + */ + public function setPwd($pwd) + { + $this->pwd = $pwd; + + return $this; + } + + /** + * Get pwd + * + * @return string + */ + public function getPwd() + { + return $this->pwd; + } + + /** + * Set passif + * + * @param boolean $passif + * + * @return FtpExport + */ + public function setPassif($passif) + { + $this->passif = (Boolean) $passif; + + return $this; + } + + /** + * Get passif + * + * @return boolean + */ + public function isPassif() + { + return $this->passif; + } + + /** + * Set destfolder + * + * @param string $destfolder + * + * @return FtpExport + */ + public function setDestfolder($destfolder) + { + $this->destfolder = $destfolder; + + return $this; + } + + /** + * Get destfolder + * + * @return string + */ + public function getDestfolder() + { + return $this->destfolder; + } + + /** + * Set sendermail + * + * @param string $sendermail + * + * @return FtpExport + */ + public function setSendermail($sendermail) + { + $this->sendermail = $sendermail; + + return $this; + } + + /** + * Get sendermail + * + * @return string + */ + public function getSendermail() + { + return $this->sendermail; + } + + /** + * Set textMailSender + * + * @param string $textMailSender + * + * @return FtpExport + */ + public function setTextMailSender($textMailSender) + { + $this->textMailSender = $textMailSender; + + return $this; + } + + /** + * Get textMailSender + * + * @return string + */ + public function getTextMailSender() + { + return $this->textMailSender; + } + + /** + * Set textMailReceiver + * + * @param string $textMailReceiver + * + * @return FtpExport + */ + public function setTextMailReceiver($textMailReceiver) + { + $this->textMailReceiver = $textMailReceiver; + + return $this; + } + + /** + * Get textMailReceiver + * + * @return string + */ + public function getTextMailReceiver() + { + return $this->textMailReceiver; + } + + /** + * Set usrId + * + * @param integer $usrId + * + * @return FtpExport + */ + public function setUsrId($usrId) + { + $this->usrId = $usrId; + + return $this; + } + + /** + * Get usrId + * + * @return integer + */ + public function getUsrId() + { + return $this->usrId; + } + + /** + * Get user + * + * @return \User_Adapter + */ + public function getUser(Application $app) + { + return \User_Adapter::getInstance($this->getUsr_id(), $app); + } + + /** + * Set user + * + * @param \User_Adapter $user + * + * @return FtpExport + */ + public function setUser(\User_Adapter $user) + { + $this->setUsrId($user->get_id()); + + return $this; + } + + /** + * Set foldertocreate + * + * @param string $foldertocreate + * + * @return FtpExport + */ + public function setFoldertocreate($foldertocreate) + { + $this->foldertocreate = $foldertocreate; + + return $this; + } + + /** + * Get foldertocreate + * + * @return string + */ + public function getFoldertocreate() + { + return $this->foldertocreate; + } + + /** + * Set logfile + * + * @param boolean $logfile + * + * @return FtpExport + */ + public function setLogfile($logfile) + { + $this->logfile = (Boolean) $logfile; + + return $this; + } + + /** + * Get logfile + * + * @return boolean + */ + public function isLogfile() + { + return $this->logfile; + } + + /** + * Set created + * + * @param \DateTime $created + * + * @return FtpExport + */ + public function setCreated(\DateTime $created) + { + $this->created = $created; + + return $this; + } + + /** + * Get created + * + * @return \DateTime + */ + public function getCreated() + { + return $this->created; + } + + /** + * Set updated + * + * @param \DateTime $updated + * + * @return FtpExport + */ + public function setUpdated(\DateTime $updated) + { + $this->updated = $updated; + + return $this; + } + + /** + * Get updated + * + * @return \DateTime + */ + public function getUpdated() + { + return $this->updated; + } + + /** + * Add elements + * + * @param FtpExportElement $elements + * + * @return FtpExport + */ + public function addElement(FtpExportElement $elements) + { + $this->elements[] = $elements; + + return $this; + } + + /** + * Remove elements + * + * @param FtpExportElement $elements + * + * @return FtpExport + */ + public function removeElement(FtpExportElement $elements) + { + $this->elements->removeElement($elements); + + return $this; + } + + /** + * Get elements + * + * @return FtpExportElement[] + */ + public function getElements() + { + return $this->elements; + } +} diff --git a/lib/Doctrine/Entities/FtpExportElement.php b/lib/Doctrine/Entities/FtpExportElement.php new file mode 100644 index 0000000000..92e947a6a6 --- /dev/null +++ b/lib/Doctrine/Entities/FtpExportElement.php @@ -0,0 +1,371 @@ +id; + } + + /** + * Set recordId + * + * @param integer $recordId + * + * @return FtpExportElement + */ + public function setRecordId($recordId) + { + $this->recordId = $recordId; + + return $this; + } + + /** + * Get recordId + * + * @return integer + */ + public function getRecordId() + { + return $this->recordId; + } + + /** + * Set baseId + * + * @param integer $baseId + * + * @return FtpExportElement + */ + public function setBaseId($baseId) + { + $this->baseId = $baseId; + + return $this; + } + + /** + * Get baseId + * + * @return integer + */ + public function getBaseId() + { + return $this->baseId; + } + + /** + * Set subdef + * + * @param string $subdef + * + * @return FtpExportElement + */ + public function setSubdef($subdef) + { + $this->subdef = $subdef; + + return $this; + } + + /** + * Get subdef + * + * @return string + */ + public function getSubdef() + { + return $this->subdef; + } + + /** + * Set filename + * + * @param string $filename + * + * @return FtpExportElement + */ + public function setFilename($filename) + { + $this->filename = $filename; + + return $this; + } + + /** + * Get filename + * + * @return string + */ + public function getFilename() + { + return $this->filename; + } + + /** + * Set folder + * + * @param string $folder + * + * @return FtpExportElement + */ + public function setFolder($folder) + { + $this->folder = $folder; + + return $this; + } + + /** + * Get folder + * + * @return string + */ + public function getFolder() + { + return $this->folder; + } + + /** + * Set error + * + * @param boolean $error + * + * @return FtpExportElement + */ + public function setError($error) + { + $this->error = (Boolean) $error; + + return $this; + } + + /** + * Get error + * + * @return boolean + */ + public function isError() + { + return $this->error; + } + + /** + * Set done + * + * @param boolean $done + * + * @return FtpExportElement + */ + public function setDone($done) + { + $this->done = (Boolean) $done; + + return $this; + } + + /** + * Get done + * + * @return boolean + */ + public function isDone() + { + return $this->done; + } + + /** + * Set businessfields + * + * @param boolean $businessfields + * + * @return FtpExportElement + */ + public function setBusinessfields($businessfields) + { + $this->businessfields = (Boolean) $businessfields; + + return $this; + } + + /** + * Get businessfields + * + * @return boolean + */ + public function isBusinessfields() + { + return $this->businessfields; + } + + /** + * Set created + * + * @param \DateTime $created + * + * @return FtpExportElement + */ + public function setCreated(\DateTime $created) + { + $this->created = $created; + + return $this; + } + + /** + * Get created + * + * @return \DateTime + */ + public function getCreated() + { + return $this->created; + } + + /** + * Set updated + * + * @param \DateTime $updated + * + * @return FtpExportElement + */ + public function setUpdated(\DateTime $updated) + { + $this->updated = $updated; + + return $this; + } + + /** + * Get updated + * + * @return \DateTime + */ + public function getUpdated() + { + return $this->updated; + } + + /** + * Set export + * + * @param FtpExport $export + * + * @return FtpExportElement + */ + public function setExport(FtpExport $export = null) + { + $this->export = $export; + + return $this; + } + + /** + * Get export + * + * @return FtpExport + */ + public function getExport() + { + return $this->export; + } +} diff --git a/lib/Doctrine/Proxies/__CG__EntitiesFtpExport.php b/lib/Doctrine/Proxies/__CG__EntitiesFtpExport.php new file mode 100644 index 0000000000..4bbb57bfac --- /dev/null +++ b/lib/Doctrine/Proxies/__CG__EntitiesFtpExport.php @@ -0,0 +1,316 @@ +_entityPersister = $entityPersister; + $this->_identifier = $identifier; + } + /** @private */ + public function __load() + { + if (!$this->__isInitialized__ && $this->_entityPersister) { + $this->__isInitialized__ = true; + + if (method_exists($this, "__wakeup")) { + // call this after __isInitialized__to avoid infinite recursion + // but before loading to emulate what ClassMetadata::newInstance() + // provides. + $this->__wakeup(); + } + + if ($this->_entityPersister->load($this->_identifier, $this) === null) { + throw new \Doctrine\ORM\EntityNotFoundException(); + } + unset($this->_entityPersister, $this->_identifier); + } + } + + /** @private */ + public function __isInitialized() + { + return $this->__isInitialized__; + } + + + public function getId() + { + if ($this->__isInitialized__ === false) { + return (int) $this->_identifier["id"]; + } + $this->__load(); + return parent::getId(); + } + + public function setCrash($crash) + { + $this->__load(); + return parent::setCrash($crash); + } + + public function getCrash() + { + $this->__load(); + return parent::getCrash(); + } + + public function incrementCrash() + { + $this->__load(); + return parent::incrementCrash(); + } + + public function setNbretry($nbretry) + { + $this->__load(); + return parent::setNbretry($nbretry); + } + + public function getNbretry() + { + $this->__load(); + return parent::getNbretry(); + } + + public function setMail($mail) + { + $this->__load(); + return parent::setMail($mail); + } + + public function getMail() + { + $this->__load(); + return parent::getMail(); + } + + public function setAddr($addr) + { + $this->__load(); + return parent::setAddr($addr); + } + + public function getAddr() + { + $this->__load(); + return parent::getAddr(); + } + + public function setSsl($ssl) + { + $this->__load(); + return parent::setSsl($ssl); + } + + public function isSsl() + { + $this->__load(); + return parent::isSsl(); + } + + public function setLogin($login) + { + $this->__load(); + return parent::setLogin($login); + } + + public function getLogin() + { + $this->__load(); + return parent::getLogin(); + } + + public function setPwd($pwd) + { + $this->__load(); + return parent::setPwd($pwd); + } + + public function getPwd() + { + $this->__load(); + return parent::getPwd(); + } + + public function setPassif($passif) + { + $this->__load(); + return parent::setPassif($passif); + } + + public function isPassif() + { + $this->__load(); + return parent::isPassif(); + } + + public function setDestfolder($destfolder) + { + $this->__load(); + return parent::setDestfolder($destfolder); + } + + public function getDestfolder() + { + $this->__load(); + return parent::getDestfolder(); + } + + public function setSendermail($sendermail) + { + $this->__load(); + return parent::setSendermail($sendermail); + } + + public function getSendermail() + { + $this->__load(); + return parent::getSendermail(); + } + + public function setTextMailSender($textMailSender) + { + $this->__load(); + return parent::setTextMailSender($textMailSender); + } + + public function getTextMailSender() + { + $this->__load(); + return parent::getTextMailSender(); + } + + public function setTextMailReceiver($textMailReceiver) + { + $this->__load(); + return parent::setTextMailReceiver($textMailReceiver); + } + + public function getTextMailReceiver() + { + $this->__load(); + return parent::getTextMailReceiver(); + } + + public function setUsrId($usrId) + { + $this->__load(); + return parent::setUsrId($usrId); + } + + public function getUsrId() + { + $this->__load(); + return parent::getUsrId(); + } + + public function getUser(\Alchemy\Phrasea\Application $app) + { + $this->__load(); + return parent::getUser($app); + } + + public function setUser(\User_Adapter $user) + { + $this->__load(); + return parent::setUser($user); + } + + public function setFoldertocreate($foldertocreate) + { + $this->__load(); + return parent::setFoldertocreate($foldertocreate); + } + + public function getFoldertocreate() + { + $this->__load(); + return parent::getFoldertocreate(); + } + + public function setLogfile($logfile) + { + $this->__load(); + return parent::setLogfile($logfile); + } + + public function isLogfile() + { + $this->__load(); + return parent::isLogfile(); + } + + public function setCreated($created) + { + $this->__load(); + return parent::setCreated($created); + } + + public function getCreated() + { + $this->__load(); + return parent::getCreated(); + } + + public function setUpdated($updated) + { + $this->__load(); + return parent::setUpdated($updated); + } + + public function getUpdated() + { + $this->__load(); + return parent::getUpdated(); + } + + public function addElement(\Entities\FtpExportElement $elements) + { + $this->__load(); + return parent::addElement($elements); + } + + public function removeElement(\Entities\FtpExportElement $elements) + { + $this->__load(); + return parent::removeElement($elements); + } + + public function getElements() + { + $this->__load(); + return parent::getElements(); + } + + + public function __sleep() + { + return array('__isInitialized__', 'id', 'crash', 'nbretry', 'mail', 'addr', 'ssl', 'login', 'pwd', 'passif', 'destfolder', 'sendermail', 'textMailSender', 'textMailReceiver', 'usrId', 'foldertocreate', 'logfile', 'created', 'updated', 'elements'); + } + + public function __clone() + { + if (!$this->__isInitialized__ && $this->_entityPersister) { + $this->__isInitialized__ = true; + $class = $this->_entityPersister->getClassMetadata(); + $original = $this->_entityPersister->load($this->_identifier); + if ($original === null) { + throw new \Doctrine\ORM\EntityNotFoundException(); + } + foreach ($class->reflFields as $field => $reflProperty) { + $reflProperty->setValue($this, $reflProperty->getValue($original)); + } + unset($this->_entityPersister, $this->_identifier); + } + + } +} \ No newline at end of file diff --git a/lib/Doctrine/Proxies/__CG__EntitiesFtpExportElement.php b/lib/Doctrine/Proxies/__CG__EntitiesFtpExportElement.php new file mode 100644 index 0000000000..0eb21ba367 --- /dev/null +++ b/lib/Doctrine/Proxies/__CG__EntitiesFtpExportElement.php @@ -0,0 +1,208 @@ +_entityPersister = $entityPersister; + $this->_identifier = $identifier; + } + /** @private */ + public function __load() + { + if (!$this->__isInitialized__ && $this->_entityPersister) { + $this->__isInitialized__ = true; + + if (method_exists($this, "__wakeup")) { + // call this after __isInitialized__to avoid infinite recursion + // but before loading to emulate what ClassMetadata::newInstance() + // provides. + $this->__wakeup(); + } + + if ($this->_entityPersister->load($this->_identifier, $this) === null) { + throw new \Doctrine\ORM\EntityNotFoundException(); + } + unset($this->_entityPersister, $this->_identifier); + } + } + + /** @private */ + public function __isInitialized() + { + return $this->__isInitialized__; + } + + + public function getId() + { + if ($this->__isInitialized__ === false) { + return (int) $this->_identifier["id"]; + } + $this->__load(); + return parent::getId(); + } + + public function setRecordId($recordId) + { + $this->__load(); + return parent::setRecordId($recordId); + } + + public function getRecordId() + { + $this->__load(); + return parent::getRecordId(); + } + + public function setBaseId($baseId) + { + $this->__load(); + return parent::setBaseId($baseId); + } + + public function getBaseId() + { + $this->__load(); + return parent::getBaseId(); + } + + public function setSubdef($subdef) + { + $this->__load(); + return parent::setSubdef($subdef); + } + + public function getSubdef() + { + $this->__load(); + return parent::getSubdef(); + } + + public function setFilename($filename) + { + $this->__load(); + return parent::setFilename($filename); + } + + public function getFilename() + { + $this->__load(); + return parent::getFilename(); + } + + public function setFolder($folder) + { + $this->__load(); + return parent::setFolder($folder); + } + + public function getFolder() + { + $this->__load(); + return parent::getFolder(); + } + + public function setError($error) + { + $this->__load(); + return parent::setError($error); + } + + public function isError() + { + $this->__load(); + return parent::isError(); + } + + public function setDone($done) + { + $this->__load(); + return parent::setDone($done); + } + + public function isDone() + { + $this->__load(); + return parent::isDone(); + } + + public function setBusinessfields($businessfields) + { + $this->__load(); + return parent::setBusinessfields($businessfields); + } + + public function isBusinessfields() + { + $this->__load(); + return parent::isBusinessfields(); + } + + public function setCreated($created) + { + $this->__load(); + return parent::setCreated($created); + } + + public function getCreated() + { + $this->__load(); + return parent::getCreated(); + } + + public function setUpdated($updated) + { + $this->__load(); + return parent::setUpdated($updated); + } + + public function getUpdated() + { + $this->__load(); + return parent::getUpdated(); + } + + public function setExport(\Entities\FtpExport $export = NULL) + { + $this->__load(); + return parent::setExport($export); + } + + public function getExport() + { + $this->__load(); + return parent::getExport(); + } + + + public function __sleep() + { + return array('__isInitialized__', 'id', 'recordId', 'baseId', 'subdef', 'filename', 'folder', 'error', 'done', 'businessfields', 'created', 'updated', 'export'); + } + + public function __clone() + { + if (!$this->__isInitialized__ && $this->_entityPersister) { + $this->__isInitialized__ = true; + $class = $this->_entityPersister->getClassMetadata(); + $original = $this->_entityPersister->load($this->_identifier); + if ($original === null) { + throw new \Doctrine\ORM\EntityNotFoundException(); + } + foreach ($class->reflFields as $field => $reflProperty) { + $reflProperty->setValue($this, $reflProperty->getValue($original)); + } + unset($this->_entityPersister, $this->_identifier); + } + + } +} \ No newline at end of file diff --git a/lib/Doctrine/Repositories/FtpExportElementRepository.php b/lib/Doctrine/Repositories/FtpExportElementRepository.php new file mode 100644 index 0000000000..ec7057dd74 --- /dev/null +++ b/lib/Doctrine/Repositories/FtpExportElementRepository.php @@ -0,0 +1,15 @@ +createQueryBuilder('e'); + $qb->where($qb->expr()->gte('e.crash', 'e.nbretry')); + + if (null !== $before) { + $qb->andWhere($qb->expr()->lte('e.created', ':created')); + $qb->setParameter(':created', $before); + } + + return $qb->getQuery()->getResult(); + } + + /** + * Returns a list of exports that can be achieved. + * + * @return array + */ + public function findDoableExports() + { + $dql = 'SELECT f + FROM Entities\FtpExport f + INNER JOIN f.elements e + WHERE e.done = false'; + + $query = $this->_em->createQuery($dql); + + return $query->getResult(); + } + + /** + * Returns the exports initiated by a given user. + * + * @param \User_Adapter $user + * + * @return array + */ + public function findByUser(\User_Adapter $user) + { + return $this->findBy(array('usrId' => $user->get_id())); + } +} diff --git a/lib/classes/User/Adapter.php b/lib/classes/User/Adapter.php index 8ed00e2579..8532fb039b 100644 --- a/lib/classes/User/Adapter.php +++ b/lib/classes/User/Adapter.php @@ -759,10 +759,14 @@ class User_Adapter implements User_Interface, cache_cacheableInterface public function delete() { $repo = $this->app['EM']->getRepository('Entities\UsrAuthProvider'); - foreach ($repo->findByUser($this) as $provider) { $this->app['EM']->remove($provider); } + + $repo = $this->app['EM']->getRepository('Entities\FtpExport'); + foreach ($repo->findByUser($this) as $export) { + $this->app['EM']->remove($export); + } $this->app['EM']->flush(); @@ -792,11 +796,6 @@ class User_Adapter implements User_Interface, cache_cacheableInterface $stmt->execute(array(':usr_id' => $this->get_id())); $stmt->closeCursor(); - $sql = 'DELETE FROM ftp_export WHERE usr_id = :usr_id'; - $stmt = $this->app['phraseanet.appbox']->get_connection()->prepare($sql); - $stmt->execute(array(':usr_id' => $this->get_id())); - $stmt->closeCursor(); - $sql = 'DELETE FROM `order` WHERE usr_id = :usr_id'; $stmt = $this->app['phraseanet.appbox']->get_connection()->prepare($sql); $stmt->execute(array(':usr_id' => $this->get_id())); diff --git a/lib/classes/patch/3906.php b/lib/classes/patch/3906.php new file mode 100644 index 0000000000..51e348737e --- /dev/null +++ b/lib/classes/patch/3906.php @@ -0,0 +1,143 @@ +release; + } + + /** + * {@inheritdoc} + */ + public function require_all_upgrades() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function concern() + { + return $this->concern; + } + + /** + * {@inheritdoc} + */ + public function apply(base $appbox, Application $app) + { + $conn = $app['phraseanet.appbox']->get_connection(); + + $em = $app['EM']; + $em->getEventManager()->removeEventSubscriber(new TimestampableListener()); + + $sql = 'SELECT `id`, `crash`, `nbretry`, `mail`, `addr`, `ssl`, + `login`, `pwd`, `passif`, + `destfolder`, `sendermail`, `text_mail_sender`, + `text_mail_receiver`, `usr_id`, `date`, `foldertocreate`, + `logfile` + FROM ftp_export'; + $stmt = $conn->prepare($sql); + $stmt->execute(); + $rs = $stmt->fetchAll(\PDO::FETCH_ASSOC); + $stmt->closeCursor(); + + $sql = 'SELECT base_id, record_id, subdef, filename, folder, error, + done, businessfields + FROM ftp_export_elements + WHERE ftp_export_id = :export_id'; + $stmt = $conn->prepare($sql); + + $n = 0; + + foreach ($rs as $row) { + try { + $user = \User_Adapter::getInstance($row['usr_id'], $app); + } catch (\Exception $e) { + continue; + } + + $export = new FtpExport(); + $export + ->setAddr($row['addr']) + ->setCrash($row['crash']) + ->setNbretry($row['nbretry']) + ->setMail($row['mail']) + ->setSsl($row['ssl']) + ->setLogin($row['login']) + ->setPwd($row['pwd']) + ->setPassif($row['passif']) + ->setDestfolder($row['destfolder']) + ->setSendermail($row['sendermail']) + ->setTextMailReceiver($row['text_mail_sender']) + ->setTextMailSender($row['text_mail_reveiver']) + ->setUser($user) + ->setCreated(new \DateTime($row['date'])) + ->setUpdated(new \DateTime($row['date'])) + ->setFoldertocreate($row['foldertocreate']) + ->setLogfile($row['logfile']); + + $em->persist($export); + + $stmt->execute(array('export_id' => $row['id'])); + $rs = $stmt->fetchAll(\PDO::FETCH_ASSOC); + + foreach ($rs as $element) { + $element = new FtpExportElement(); + $element->setBaseId($row['base_id']) + ->setRecordId($row['record_id']) + ->setBusinessfields($row['businessfields']) + ->setCreated(new \DateTime($row['date'])) + ->setUpdated(new \DateTime($row['date'])) + ->setDone(!!$row['done']) + ->setError(!!$row['error']) + ->setFilename($row['filename']) + ->setFolder($row['folder']) + ->setSubdef($row['subdef']) + ->setExport($export); + + $export->addElement($element); + + $em->persist($element); + } + + $n++; + + if ($n % 200 === 0) { + $em->flush(); + $em->clear(); + } + } + $stmt->closeCursor(); + + $em->flush(); + $em->clear(); + + $em->getEventManager()->addEventSubscriber(new TimestampableListener()); + } +} diff --git a/lib/classes/set/exportftp.php b/lib/classes/set/exportftp.php index 8d0728feaf..5cacf88257 100644 --- a/lib/classes/set/exportftp.php +++ b/lib/classes/set/exportftp.php @@ -9,15 +9,11 @@ * file that was distributed with this source code. */ -/** - * - * - * @license http://opensource.org/licenses/gpl-3.0 GPLv3 - * @link www.phraseanet.com - */ +use Entities\FtpExport; +use Entities\FtpExportElement; + class set_exportftp extends set_export { - /** * * @param integer $usr_to @@ -59,95 +55,44 @@ class set_exportftp extends set_export . "- repertoire de destination \"" . $destfolder . "\"\n" . "\n"; - $fn = "id"; - $fv = "null"; - $fn .= ",crash"; - $fv .= ",0"; - $fn .= ",nbretry"; - $fv .= ",:nbretry"; - $fn .= ",mail"; - $fv .= ",:mail"; - $fn .= ",addr"; - $fv .= ",:addr"; - $fn .= ",login"; - $fv .= ",:login"; - $fn .= ",`ssl`"; - $fv .= ",:ssl"; - $fn .= ",pwd"; - $fv .= ",:pwd"; - $fn .= ",passif"; - $fv .= ",:passif"; - $fn .= ",destfolder"; - $fv .= ",:destfolder"; - $fn .= ",sendermail"; - $fv .= ",:sendermail"; - $fn .= ",text_mail_receiver"; - $fv .= ",:text_mail_receiver"; - $fn .= ",text_mail_sender"; - $fv .= ",:text_mail_sender"; - $fn .= ",usr_id"; - $fv .= ",:usr_id"; - $fn .= ",date"; - $fv .= ", NOW()"; - $fn .= ",foldertocreate"; - $fv .= ",:foldertocreate"; - $fn .= ",logfile"; - $fv .= ",:logfile"; + $export = new FtpExport(); + $export->setNbretry(((int) $retry * 1) > 0 ? (int) $retry : 5) + ->setMail($email_dest) + ->setLogfile($logfile) + ->setFoldertocreate($makedirectory) + ->setUser($this->app['authentication']->getUser()) + ->setTextMailSender($text_mail_sender) + ->setTextMailReceiver($text_mail_receiver) + ->setSendermail($this->app['authentication']->getUser()->get_email()) + ->setDestfolder($destfolder) + ->setPassif($passif == '1') + ->setPwd($password) + ->setSsl($ssl == '1') + ->setLogin($login) + ->setAddr($host); - $params = array( - ':nbretry' => (((int) $retry * 1) > 0 ? (int) $retry : 5) - , ':mail' => $email_dest - , ':addr' => $host - , ':login' => $login - , ':ssl' => ($ssl == '1' ? '1' : '0') - , ':pwd' => $password - , ':passif' => ($passif == "1" ? "1" : "0") - , ':destfolder' => $destfolder - , ':sendermail' => $this->app['authentication']->getUser()->get_email() - , ':text_mail_receiver' => $text_mail_receiver - , ':text_mail_sender' => $text_mail_sender - , ':usr_id' => $this->app['authentication']->getUser()->get_id() - , ':foldertocreate' => $makedirectory - , ':logfile' => ( ! ! $logfile ? '1' : '0') - ); - - $sql = "INSERT INTO ftp_export ($fn) VALUES ($fv)"; - $stmt = $conn->prepare($sql); - $stmt->execute($params); - $stmt->closeCursor(); - - $ftp_export_id = $conn->lastInsertId(); - - $sql = 'INSERT INTO ftp_export_elements - (id, ftp_export_id, base_id, record_id, subdef, filename, folder, businessfields) - VALUES - (null, :ftp_export_id, :base_id, :record_id, :subdef, - :filename, :folder, :businessfields)'; - - $stmt = $conn->prepare($sql); + $this->app['EM']->persist($export); foreach ($this->list['files'] as $file) { foreach ($file['subdefs'] as $subdef => $properties) { - $filename = $file['export_name'] - . $properties["ajout"] . '.' - . $properties['exportExt']; - + $filename = $file['export_name'] . $properties["ajout"] . '.' . $properties['exportExt']; $bfields = isset($properties['businessfields']) ? $properties['businessfields'] : null; - $params = array( - ':ftp_export_id' => $ftp_export_id - , ':base_id' => $file['base_id'] - , ':record_id' => $file['record_id'] - , ':subdef' => $subdef - , ':filename' => $filename - , ':folder' => $properties['folder'] - , ':businessfields' => $bfields - ); - $stmt->execute($params); + $element = new FtpExportElement(); + $element->setBaseId($file['base_id']) + ->setBusinessfields($bfields) + ->setExport($export) + ->setFilename($filename) + ->setFolder($properties['folder']) + ->setRecordId($file['record_id']) + ->setSubdef($subdef); + $export->addElement($element); + + $this->app['EM']->persist($element); } } - $stmt->closeCursor(); + $this->app['EM']->flush(); return true; } diff --git a/lib/classes/task/period/ftp.php b/lib/classes/task/period/ftp.php index 6565581323..5cb3e86492 100644 --- a/lib/classes/task/period/ftp.php +++ b/lib/classes/task/period/ftp.php @@ -12,6 +12,8 @@ use Alchemy\Phrasea\Core\Configuration\Configuration; use Alchemy\Phrasea\Exception\InvalidArgumentException; use Alchemy\Phrasea\Notification\Mail\MailSuccessFTPSender; use Alchemy\Phrasea\Notification\Receiver; +use Entities\FtpExport; +use Entities\FtpExportElement; class task_period_ftp extends task_appboxAbstract { @@ -258,88 +260,39 @@ class task_period_ftp extends task_appboxAbstract protected function retrieveContent(appbox $appbox) { - $conn = $appbox->get_connection(); - - $time2sleep = null; - $ftp_exports = array(); - - $period = $this->period; - $time2sleep = (int) ($period); - - $sql = "SELECT id FROM ftp_export WHERE crash>=nbretry - AND date < :date"; - - $params = array(':date' => $this->dependencyContainer['date-formatter']->format_mysql(new DateTime('-30 days'))); - - $stmt = $conn->prepare($sql); - $stmt->execute($params); - $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); - $stmt->closeCursor(); - - foreach ($rs as $rowtask) { - $sql = "DELETE FROM ftp_export WHERE id = :export_id"; - $stmt = $conn->prepare($sql); - $stmt->execute(array(':export_id' => $rowtask['id'])); - $stmt->closeCursor(); - - $sql = "DELETE FROM ftp_export_elements WHERE ftp_export_id = :export_id"; - $stmt = $conn->prepare($sql); - $stmt->execute(array(':export_id' => $rowtask['id'])); - $stmt->closeCursor(); + foreach ($this->dependencyContainer['EM'] + ->getRepository('Entities\FtpExport') + ->findCrashedExports(new \DateTime('-1 month')) as $export) { + $this->dependencyContainer['EM']->remove($export); } - - $sql = "SELECT * FROM ftp_export WHERE crashprepare($sql); - $stmt->execute(); - $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); - $stmt->closeCursor(); - - foreach ($rs as $row) { - $ftp_exports[$row["id"]] = array_merge(array('files' => array()), $row); - } - - $sql = "SELECT e.* from ftp_export f - INNER JOIN ftp_export_elements e - ON (f.id=e.ftp_export_id AND f.crashprepare($sql); - $stmt->execute(); - $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); - $stmt->closeCursor(); - - foreach ($rs as $rowtask) { - if (isset($ftp_exports[$rowtask["ftp_export_id"]])) { - $ftp_exports[$rowtask["ftp_export_id"]]["files"][] = $rowtask; - } - } - - return $ftp_exports; + $this->dependencyContainer['EM']->flush(); + + return $this->dependencyContainer['EM'] + ->getRepository('Entities\FtpExport') + ->findDoableExports(); } - protected function processOneContent(appbox $appbox, $ftp_export) + protected function processOneContent(appbox $appbox, $export) { $conn = $appbox->get_connection(); - $id = $ftp_export['id']; - $ftp_export[$id]["crash"] = $ftp_export["crash"]; - $ftp_export[$id]["nbretry"] = $ftp_export["nbretry"] < 1 ? 3 : (int) $ftp_export["nbretry"]; + $id = $export->getId(); $state = ""; - $ftp_server = $ftp_export["addr"]; - $ftp_user_name = $ftp_export["login"]; - $ftp_user_pass = $ftp_export["pwd"]; - $usr_id = (int) $ftp_export["usr_id"]; + $ftp_server = $export->getAddr(); + $ftp_user_name = $export->getLogin(); + $ftp_user_pass = $export->getPwd(); + $usr_id = $export->getUsrId(); - $ftpLog = $ftp_user_name . "@" . p4string::addEndSlash($ftp_server) . $ftp_export["destfolder"]; + $ftpLog = $ftp_user_name . "@" . p4string::addEndSlash($ftp_server) . $export->getDestfolder(); - if ($ftp_export["crash"] == 0) { + if ($export->getCrash() == 0) { $line = sprintf( _('task::ftp:Etat d\'envoi FTP vers le serveur' . ' "%1$s" avec le compte "%2$s" et pour destination le dossier : "%3$s"') . PHP_EOL , $ftp_server , $ftp_user_name - , $ftp_export["destfolder"] + , $export->getDestfolder() ); $state .= $line; $this->logger->addDebug($line); @@ -347,18 +300,18 @@ class task_period_ftp extends task_appboxAbstract $state .= $line = sprintf( _("task::ftp:TENTATIVE no %s, %s") - , $ftp_export["crash"] + 1 + , $export->getCrash() + 1 , " (" . date('r') . ")" ) . PHP_EOL; $this->logger->addDebug($line); try { - $ssl = ($ftp_export['ssl'] == '1'); + $ssl = $export->isSsl(); $ftp_client = $this->dependencyContainer['phraseanet.ftp.client']($ftp_server, 21, 300, $ssl, $this->proxy, $this->proxyport); $ftp_client->login($ftp_user_name, $ftp_user_pass); - if ($ftp_export["passif"] == "1") { + if ($export->isPassif()) { try { $ftp_client->passive(true); } catch (Exception $e) { @@ -366,26 +319,26 @@ class task_period_ftp extends task_appboxAbstract } } - if (trim($ftp_export["destfolder"]) != '') { + if (trim($export->getDestfolder()) != '') { try { - $ftp_client->chdir($ftp_export["destfolder"]); - $ftp_export["destfolder"] = '/' . $ftp_export["destfolder"]; + $ftp_client->chdir($export->getDestFolder()); + $export->setDestfolder('/' . $export->getDestfolder()); } catch (Exception $e) { $this->logger->addDebug($e->getMessage()); } } else { - $ftp_export["destfolder"] = '/'; + $export->setDestfolder('/'); } - if (trim($ftp_export["foldertocreate"]) != '') { + if (trim($export->getFoldertocreate()) != '') { try { - $ftp_client->mkdir($ftp_export["foldertocreate"]); + $ftp_client->mkdir($export->getFoldertocreate()); } catch (Exception $e) { $this->logger->addDebug($e->getMessage()); } try { - $new_dir = $ftp_client->add_end_slash($ftp_export["destfolder"]) - . $ftp_export["foldertocreate"]; + $new_dir = $ftp_client->add_end_slash($export->getDestfolder()) + . $export->getFoldertocreate(); $ftp_client->chdir($new_dir); } catch (Exception $e) { $this->logger->addDebug($e->getMessage()); @@ -395,38 +348,43 @@ class task_period_ftp extends task_appboxAbstract $obj = array(); $basefolder = ''; - if (!in_array(trim($ftp_export["destfolder"]), array('.', './', ''))) { - $basefolder = p4string::addEndSlash($ftp_export["destfolder"]); + if (!in_array(trim($export->getDestfolder()), array('.', './', ''))) { + $basefolder = p4string::addEndSlash($export->getDestfolder()); } - $basefolder .= $ftp_export["foldertocreate"]; + $basefolder .= $export->getFoldertocreate(); if (in_array(trim($basefolder), array('.', './', ''))) { $basefolder = '/'; } - foreach ($ftp_export['files'] as $fileid => $file) { - $base_id = $file["base_id"]; - $record_id = $file["record_id"]; - $subdef = $file['subdef']; - + foreach ($export->getElements() as $exportElement) { + if ($exportElement->isDone()) { + continue; + } + + $base_id = $exportElement->getBaseId(); + $record_id = $exportElement->getRecordId(); + $subdef = $exportElement->getSubdef(); + $localfile = null; + try { $sbas_id = phrasea::sbasFromBas($this->dependencyContainer, $base_id); $record = new record_adapter($this->dependencyContainer, $sbas_id, $record_id); - $sdcaption = $record->get_caption()->serialize(caption_record::SERIALIZE_XML, $ftp_export["businessfields"]); + $sdcaption = $record->get_caption()->serialize(caption_record::SERIALIZE_XML, $exportElement->isBusinessfields()); - $remotefile = $file["filename"]; + $remotefile = $exportElement->getFilename(); if ($subdef == 'caption') { - $desc = $record->get_caption()->serialize(\caption_record::SERIALIZE_XML, $ftp_export["businessfields"]); + $desc = $record->get_caption()->serialize(\caption_record::SERIALIZE_XML, $exportElement->isBusinessfields()); $localfile = $this->dependencyContainer['root.path'] . '/tmp/' . md5($desc . time() . mt_rand()); if (file_put_contents($localfile, $desc) === false) { throw new Exception('Impossible de creer un fichier temporaire'); } } elseif ($subdef == 'caption-yaml') { - $desc = $record->get_caption()->serialize(\caption_record::SERIALIZE_YAML, $ftp_export["businessfields"]); + $desc = $record->get_caption()->serialize(\caption_record::SERIALIZE_YAML, $exportElement->isBusinessfields()); $localfile = $this->dependencyContainer['root.path'] . '/tmp/' . md5($desc . time() . mt_rand()); if (file_put_contents($localfile, $desc) === false) { @@ -445,7 +403,7 @@ class task_period_ftp extends task_appboxAbstract } } - $current_folder = p4string::delEndSlash(str_replace('//', '/', $basefolder . $file['folder'])); + $current_folder = p4string::delEndSlash(str_replace('//', '/', $basefolder . $exportElement->getFolder())); if ($ftp_client->pwd() != $current_folder) { try { @@ -466,11 +424,11 @@ class task_period_ftp extends task_appboxAbstract unlink($localfile); } - $sql = "UPDATE ftp_export_elements" - . " SET done='1', error='0' WHERE id = :file_id"; - $stmt = $conn->prepare($sql); - $stmt->execute(array(':file_id' => $file['id'])); - $stmt->closeCursor(); + $exportElement + ->setDone(true) + ->setError(false); + $this->dependencyContainer['EM']->persist($exportElement); + $this->dependencyContainer['EM']->flush(); $this->logexport($record, $obj, $ftpLog); } catch (Exception $e) { $state .= $line = sprintf(_('task::ftp:File "%1$s" (record %2$s) de la base "%3$s"' . @@ -480,39 +438,28 @@ class task_period_ftp extends task_appboxAbstract $this->logger->addDebug($line); - $done = $file['error']; - - $sql = "UPDATE ftp_export_elements" - . " SET done = :done, error='1' WHERE id = :file_id"; - $stmt = $conn->prepare($sql); - $stmt->execute(array(':done' => $done, ':file_id' => $file['id'])); - $stmt->closeCursor(); + // One failure max + $exportElement + ->setDone($exportElement->isError()) + ->setError(true); + $this->dependencyContainer['EM']->persist($exportElement); + $this->dependencyContainer['EM']->flush(); } } - if ($ftp_export['logfile']) { + if ($export->isLogfile()) { $this->logger->addDebug("logfile "); $date = new DateTime(); - $remote_file = $date->format('U'); - - $sql = 'SELECT filename, folder' - . ' FROM ftp_export_elements' - . ' WHERE ftp_export_id = :ftp_export_id' - . ' AND error = "0" AND done="1"'; - - $stmt = $conn->prepare($sql); - $stmt->execute(array(':ftp_export_id' => $id)); - $rs = $stmt->fetchAll(\PDO::FETCH_ASSOC); - $stmt->closeCursor(); - $buffer = '#transfert finished ' . $date->format(DATE_ATOM) . "\n\n"; - foreach ($rs as $row) { - $filename = $row['filename']; - $folder = $row['folder']; - - $root = $ftp_export['foldertocreate']; + foreach ($export->getElements() as $exportElement) { + if (!$exportElement->isDone() || $exportElement->isError()) { + continue; + } + $filename = $exportElement->getFilename(); + $folder = $exportElement->getFilename(); + $root = $export->getFoldertocreate(); $buffer .= $root . '/' . $folder . $filename . "\n"; } @@ -522,11 +469,8 @@ class task_period_ftp extends task_appboxAbstract file_put_contents($tmpfile, $buffer); $remotefile = $date->format('U') . '-transfert.log'; - - $ftp_client->chdir($ftp_export["destfolder"]); - + $ftp_client->chdir($export->getDestFolder()); $ftp_client->put($remotefile, $tmpfile); - unlink($tmpfile); } @@ -537,15 +481,14 @@ class task_period_ftp extends task_appboxAbstract $this->logger->addDebug($line); - $sql = "UPDATE ftp_export SET crash=crash+1,date=now()" - . " WHERE id = :export_id"; - $stmt = $conn->prepare($sql); - $stmt->execute(array(':export_id' => $ftp_export['id'])); - $stmt->closeCursor(); + $export->incrementCrash(); + $this->dependencyContainer['EM']->persist($export); + $this->dependencyContainer['EM']->flush(); unset($ftp_client); } - $this->finalize($appbox, $id); + + $this->finalize($appbox, $export); } protected function postProcessOneContent(appbox $appbox, $row) @@ -553,112 +496,78 @@ class task_period_ftp extends task_appboxAbstract return $this; } - public function finalize(appbox $appbox, $id) + public function finalize(appbox $appbox, FtpExport $export) { $conn = $appbox->get_connection(); - $sql = 'SELECT crash, nbretry FROM ftp_export WHERE id = :export_id'; - - $stmt = $conn->prepare($sql); - $stmt->execute(array(':export_id' => $id)); - $row = $stmt->fetch(PDO::FETCH_ASSOC); - $stmt->closeCursor(); - - if ($row && $row['crash'] >= $row['nbretry']) { - $this->send_mails($appbox, $id); + if ($export->getCrash() >= $export->getNbretry()) { + $this->send_mails($appbox, $export); return $this; } + + $total = count($export->getElements()); + $done = count($export->getElements()->filter(function (FtpExportElement $element) { + return $element->isDone(); + })); + $error = count($export->getElements()->filter(function (FtpExportElement $element) { + return $element->isError(); + })); - $sql = 'SELECT count(id) as total, sum(error) as errors, sum(done) as done' - . ' FROM ftp_export_elements WHERE ftp_export_id = :export_id'; - $stmt = $conn->prepare($sql); - $stmt->execute(array(':export_id' => $id)); - $row = $stmt->fetch(PDO::FETCH_ASSOC); - $stmt->closeCursor(); + if ($done === $total) { + $this->send_mails($appbox, $export); - if ($row && $row['done'] == (int) $row['total']) { - $this->send_mails($appbox, $id); - - if ((int) $row['errors'] === 0) { - $sql = 'DELETE FROM ftp_export WHERE id = :export_id'; - $stmt = $conn->prepare($sql); - $stmt->execute(array(':export_id' => $id)); - $stmt->closeCursor(); - $sql = 'DELETE FROM ftp_export_elements WHERE ftp_export_id = :export_id'; - $stmt = $conn->prepare($sql); - $stmt->execute(array(':export_id' => $id)); - $stmt->closeCursor(); + if ((int) $error === 0) { + $this->dependencyContainer['EM']->remove($export); + $this->dependencyContainer['EM']->flush(); } else { - $sql = 'UPDATE ftp_export SET crash = nbretry'; - $stmt = $conn->prepare($sql); - $stmt->execute(); - $stmt->closeCursor(); - $sql = 'DELETE FROM ftp_export_elements WHERE ftp_export_id = :export_id AND error="0"'; - $stmt = $conn->prepare($sql); - $stmt->execute(array(':export_id' => $id)); - $stmt->closeCursor(); + $export->setCrash($export->getNbretry()); + foreach ($export->getElements() as $element) { + if (!$element->isError()) { + $this->dependencyContainer['EM']->remove($export); + } + } + $this->dependencyContainer['EM']->flush(); } return $this; } } - public function send_mails(appbox $appbox, $id) + public function send_mails(appbox $appbox, FtpExport $export) { - $conn = $appbox->get_connection(); - - $sql = 'SELECT filename, base_id, record_id, subdef, error, done' - . ' FROM ftp_export_elements WHERE ftp_export_id = :export_id'; - $transferts = array(); - $transfert_status = _('task::ftp:Tous les documents ont ete transferes avec succes'); - $stmt = $conn->prepare($sql); - $stmt->execute(array(':export_id' => $id)); - $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); - $stmt->closeCursor(); - - foreach ($rs as $row) { - if ($row['error'] == '0' && $row['done'] == '1') { + foreach ($export->getElements() as $element) { + if (!$element->isError() && $element->isDone()) { $transferts[] = '
  • ' . sprintf(_('task::ftp:Record %1$s - %2$s de la base (%3$s - %4$s) - %5$s') - , $row["record_id"], $row["filename"] - , phrasea::sbas_labels(phrasea::sbasFromBas($this->dependencyContainer, $row["base_id"]), $this->dependencyContainer) - , phrasea::bas_labels($row['base_id'], $this->dependencyContainer), $row['subdef']) . ' : ' . _('Transfert OK') . '
  • '; + , $element->getRecordId(), $element->getFilename() + , phrasea::sbas_labels(phrasea::sbasFromBas($this->dependencyContainer, $element->getBaseId()), $this->dependencyContainer) + , phrasea::bas_labels($element->getBaseId(), $this->dependencyContainer), $element->getSubdef()) . ' : ' . _('Transfert OK') . ''; } else { $transferts[] = '
  • ' . sprintf(_('task::ftp:Record %1$s - %2$s de la base (%3$s - %4$s) - %5$s') - , $row["record_id"], $row["filename"] - , phrasea::sbas_labels(phrasea::sbasFromBas($this->dependencyContainer, $row["base_id"]), $this->dependencyContainer), phrasea::bas_labels($row['base_id'], $this->dependencyContainer) - , $row['subdef']) . ' : ' . _('Transfert Annule') . '
  • '; + , $element->getRecordId(), $element->getFilename() + , phrasea::sbas_labels(phrasea::sbasFromBas($this->dependencyContainer, $element->getBaseId()), $this->dependencyContainer), phrasea::bas_labels($element->getBaseId(), $this->dependencyContainer) + , $element->getSubdef()) . ' : ' . _('Transfert Annule') . ''; $transfert_status = _('task::ftp:Certains documents n\'ont pas pu etre tranferes'); } } - $sql = 'SELECT addr, crash, nbretry, sendermail, mail, text_mail_sender, text_mail_receiver' - . ' FROM ftp_export WHERE id = :export_id'; - - $stmt = $conn->prepare($sql); - $stmt->execute(array(':export_id' => $id)); - $row = $stmt->fetch(PDO::FETCH_ASSOC); - $stmt->closeCursor(); - - if ($row) { - if ($row['crash'] >= $row['nbretry']) { - $connection_status = _('Des difficultes ont ete rencontres a la connection au serveur distant'); - } else { - $connection_status = _('La connection vers le serveur distant est OK'); - } - - $text_mail_sender = $row['text_mail_sender']; - $text_mail_receiver = $row['text_mail_receiver']; - $mail = $row['mail']; - $sendermail = $row['sendermail']; - $ftp_server = $row['addr']; + if ($export->getCrash() >= $export->getNbretry()) { + $connection_status = _('Des difficultes ont ete rencontres a la connection au serveur distant'); + } else { + $connection_status = _('La connection vers le serveur distant est OK'); } + $text_mail_sender = $export->getTextMailSender(); + $text_mail_receiver = $export->getTextMailReceiver(); + $mail = $export->getMail(); + $sendermail = $export->getSendermail(); + $ftp_server = $export->getAddr(); + $message = "\n\n----------------------------------------\n\n"; $message = $connection_status . "\n"; $message .= $transfert_status . "\n"; @@ -669,11 +578,10 @@ class task_period_ftp extends task_appboxAbstract $sender_message = $text_mail_sender . $message; $receiver_message = $text_mail_receiver . $message; - $receiver = null; try { $receiver = new Receiver(null, $sendermail); } catch (InvalidArgumentException $e) { - + $receiver = null; } if ($receiver) { @@ -682,24 +590,20 @@ class task_period_ftp extends task_appboxAbstract $this->dependencyContainer['notification.deliverer']->deliver($mail); } - $receiver = null; try { $receiver = new Receiver(null, $mail); - } catch (InvalidArgumentException $e) { - - } - - if ($receiver) { - $mail = MailSuccessFTP::create($this->dependencyContainer, $receiver, null, $receiver_message); + $mail = MailSuccessFTPSender::create($this->dependencyContainer, $receiver, null, $receiver_message); $mail->setServer($ftp_server); $this->dependencyContainer['notification.deliverer']->deliver($mail); + } catch (\Exception $e) { + $this->log('Unable to deliver success message'); } } public function logexport(record_adapter $record, $obj, $ftpLog) { foreach ($obj as $oneObj) { - $this->app['phraseanet.logger']($record->get_databox()) + $this->dependencyContainer['phraseanet.logger']($record->get_databox()) ->log($record, Session_Logger::EVENT_EXPORTFTP, $ftpLog, ''); } diff --git a/lib/conf.d/bases_structure.xml b/lib/conf.d/bases_structure.xml index 5c49ad3a1b..187bdb4f7c 100644 --- a/lib/conf.d/bases_structure.xml +++ b/lib/conf.d/bases_structure.xml @@ -1892,325 +1892,6 @@ InnoDB - - - - id - - int(11) unsigned - - auto_increment - - - - - - - crash - tinyint(3) unsigned - - - - 0 - - - - - nbretry - tinyint(3) unsigned - - - - - 5 - - - - mail - char(255) - - - - - - - - - addr - char(255) - - - - - - - - - ssl - tinyint(1) unsigned - - - - - 0 - - - - login - - char(255) - - - - - - - - - pwd - char(255) - - - - - - - - - passif - tinyint(1) unsigned - - - - 0 - - - - - destfolder - char(255) - YES - - - - - - - - sendermail - char(255) - - YES - - - - - - - text_mail_sender - - longtext - - - - - - - - - text_mail_receiver - longtext - - - - - - - - - usr_id - int(11) unsigned - - - - - 0 - - - - date - datetime - - - 0000-00-00 00:00:00 - - - - foldertocreate - char(255) - YES - - - - - - logfile - tinyint(1) unsigned - - - 0 - - - - - - PRIMARY - PRIMARY - - id - - - - usr_id - INDEX - - usr_id - - - - crash - INDEX - - crash - - - - nbretry - INDEX - - nbretry - - - - InnoDB -
    - - - - - id - int(11) unsigned - - auto_increment - - - - - ftp_export_id - int(11) unsigned - - - 0 - - - - base_id - int(11) unsigned - - - 0 - - - - record_id - int(11) unsigned - - - 0 - - - - subdef - char(255) - - - 0 - - - - filename - char(255) - - - - - - - folder - char(255) - - - - - - - businessfields - tinyint(1) unsigned - YES - - - - - - error - tinyint(1) unsigned - - - 0 - - - - done - tinyint(1) unsigned - - - 0 - - - - - - PRIMARY - PRIMARY - - id - - - - ftp_export_id - INDEX - - ftp_export_id - - - - done - INDEX - - done - - - - error - INDEX - - error - - - - InnoDB -
    - diff --git a/tests/Doctrine/Tests/Repositories/FtpExportRepositoryTest.php b/tests/Doctrine/Tests/Repositories/FtpExportRepositoryTest.php new file mode 100644 index 0000000000..5544aaf2b5 --- /dev/null +++ b/tests/Doctrine/Tests/Repositories/FtpExportRepositoryTest.php @@ -0,0 +1,229 @@ +setAddr('') + ->setUser(self::$DI['user']) + ->setCrash(2) + ->setNbretry(2); + + $failure2 = new FtpExport(); + $failure2 + ->setAddr('') + ->setUser(self::$DI['user']) + ->setCrash(7) + ->setNbretry(5); + + $good1 = new FtpExport(); + $good1 + ->setAddr('') + ->setUser(self::$DI['user']) + ->setCrash(2) + ->setNbretry(3); + + $good2 = new FtpExport(); + $good2 + ->setAddr('') + ->setUser(self::$DI['user']) + ->setCrash(12) + ->setNbretry(23); + + self::$DI['app']['EM']->persist($failure1); + self::$DI['app']['EM']->persist($failure2); + self::$DI['app']['EM']->persist($good1); + self::$DI['app']['EM']->persist($good2); + self::$DI['app']['EM']->flush(); + + $crashed = self::$DI['app']['EM'] + ->getRepository('Entities\FtpExport') + ->findCrashedExports(); + + $this->assertCount(2, $crashed); + $this->assertContains($failure1, $crashed); + $this->assertContains($failure2, $crashed); + } + + public function testFindCrashedExportsWithDate() + { + self::$DI['app']['EM']->getEventManager()->removeEventSubscriber(new TimestampableListener()); + + $failure1 = new FtpExport(); + $failure1 + ->setAddr('Failure 1') + ->setUser(self::$DI['user']) + ->setCrash(2) + ->setNbretry(2) + ->setCreated(new \DateTime('-6 days')); + + $failure2 = new FtpExport(); + $failure2 + ->setAddr('Failure 2') + ->setUser(self::$DI['user']) + ->setCrash(2) + ->setNbretry(2) + ->setCreated(new \DateTime('-7 days')); + + $good1 = new FtpExport(); + $good1 + ->setAddr('Good 1') + ->setUser(self::$DI['user']) + ->setCrash(7) + ->setNbretry(5) + ->setCreated(new \DateTime('-5 days')); + + $good2 = new FtpExport(); + $good2 + ->setAddr('Good 2') + ->setUser(self::$DI['user']) + ->setCrash(2) + ->setNbretry(3) + ->setCreated(new \DateTime('-9 days')); + + $good3 = new FtpExport(); + $good3 + ->setAddr('Good 3') + ->setUser(self::$DI['user']) + ->setCrash(12) + ->setNbretry(23) + ->setCreated(new \DateTime('-6 days')); + + self::$DI['app']['EM']->persist($failure1); + self::$DI['app']['EM']->persist($failure2); + self::$DI['app']['EM']->persist($good1); + self::$DI['app']['EM']->persist($good2); + self::$DI['app']['EM']->persist($good3); + self::$DI['app']['EM']->flush(); + + $crashed = self::$DI['app']['EM'] + ->getRepository('Entities\FtpExport') + ->findCrashedExports(new \DateTime('-6 days')); + + $this->assertCount(2, $crashed); + $this->assertContains($failure1, $crashed); + $this->assertContains($failure2, $crashed); + } + + public function testFindDoableExports() + { + $notDoable1 = new FtpExport(); + $notDoable1 + ->setAddr('Not Doable 1') + ->setUser(self::$DI['user']); + + $elem1 = new FtpExportElement(); + $elem1 + ->setSubdef('subdef') + ->setFilename('name') + ->setBaseId(self::$DI['record_1']->get_base_id()) + ->setRecordId(self::$DI['record_1']->get_record_id()) + ->setDone(true); + + $elem1->setExport($notDoable1); + $notDoable1->addElement($elem1); + + $notDoable2 = new FtpExport(); + $notDoable2 + ->setAddr('Not Doable 2') + ->setUser(self::$DI['user']); + + $doable1 = new FtpExport(); + $doable1 + ->setAddr('Doable 1') + ->setUser(self::$DI['user']); + + $elem2 = new FtpExportElement(); + $elem2 + ->setSubdef('subdef') + ->setFilename('name') + ->setBaseId(self::$DI['record_1']->get_base_id()) + ->setRecordId(self::$DI['record_1']->get_record_id()) + ->setDone(true); + + $elem2->setExport($doable1); + $doable1->addElement($elem2); + + $elem3 = new FtpExportElement(); + $elem3 + ->setSubdef('subdef') + ->setFilename('name') + ->setBaseId(self::$DI['record_2']->get_base_id()) + ->setRecordId(self::$DI['record_2']->get_record_id()) + ->setDone(false); + + $elem3->setExport($doable1); + $doable1->addElement($elem3); + + $doable2 = new FtpExport(); + $doable2 + ->setAddr('Doable 2') + ->setUser(self::$DI['user']); + + $elem4 = new FtpExportElement(); + $elem4 + ->setSubdef('subdef') + ->setFilename('name') + ->setBaseId(self::$DI['record_1']->get_base_id()) + ->setRecordId(self::$DI['record_1']->get_record_id()) + ->setDone(false); + + $elem4->setExport($doable2); + $doable2->addElement($elem4); + + self::$DI['app']['EM']->persist($notDoable1); + self::$DI['app']['EM']->persist($notDoable2); + self::$DI['app']['EM']->persist($doable1); + self::$DI['app']['EM']->persist($doable2); + + self::$DI['app']['EM']->flush(); + + $doables = self::$DI['app']['EM'] + ->getRepository('Entities\FtpExport') + ->findDoableExports(); + + $this->assertCount(2, $doables); + $this->assertContains($doable1, $doables); + $this->assertContains($doable2, $doables); + } + + public function testFindByUser() + { + $match1 = new FtpExport(); + $match1 + ->setAddr('Match 1') + ->setUser(self::$DI['user']); + + $match2 = new FtpExport(); + $match2 + ->setAddr('Match 2') + ->setUser(self::$DI['user']); + + $noMatch1 = new FtpExport(); + $noMatch1 + ->setAddr('No match 1') + ->setUser(self::$DI['user_alt1']); + + self::$DI['app']['EM']->persist($match1); + self::$DI['app']['EM']->persist($match2); + self::$DI['app']['EM']->persist($noMatch1); + + self::$DI['app']['EM']->flush(); + + $exports = self::$DI['app']['EM'] + ->getRepository('Entities\FtpExport') + ->findByUser(self::$DI['user']); + + $this->assertCount(2, $exports); + $this->assertContains($match1, $exports); + $this->assertContains($match2, $exports); + } +} diff --git a/tests/db-ref.sqlite b/tests/db-ref.sqlite index 3e9f06cbbd..81e9c1a149 100644 Binary files a/tests/db-ref.sqlite and b/tests/db-ref.sqlite differ