Merge pull request #593 from romainneutron/ftp-exports

[3.9] Add FtpExport entity
This commit is contained in:
Romain Neutron
2013-09-02 08:16:57 -07:00
14 changed files with 2130 additions and 630 deletions

View File

@@ -18,7 +18,7 @@ namespace Alchemy\Phrasea\Core;
*/ */
class Version class Version
{ {
protected static $number = '3.9.0.a5'; protected static $number = '3.9.0.a6';
protected static $name = 'Diplodocus'; protected static $name = 'Diplodocus';
public static function getNumber() public static function getNumber()

View File

@@ -0,0 +1,625 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2013 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Entities;
use Alchemy\Phrasea\Application;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Table(name="FtpExports")
* @ORM\Entity(repositoryClass="Repositories\FtpExportRepository")
*/
class FtpExport
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
* @ORM\Column(type="integer")
*/
private $crash = 0;
/**
* @ORM\Column(type="integer")
*/
private $nbretry = 3;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $mail;
/**
* @ORM\Column(type="text")
*/
private $addr;
/**
* @ORM\Column(type="boolean", name="use_ssl")
*/
private $ssl = false;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $login;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $pwd;
/**
* @ORM\Column(type="boolean")
*/
private $passif = false;
/**
* @ORM\Column(type="text")
*/
private $destfolder = '/';
/**
* @ORM\Column(type="text", nullable=true)
*/
private $sendermail;
/**
* @ORM\Column(type="text", name="text_mail_sender", nullable=true)
*/
private $textMailSender;
/**
* @ORM\Column(type="text", name="text_mail_receiver", nullable=true)
*/
private $textMailReceiver;
/**
* @ORM\Column(type="integer", name="usr_id")
*/
private $usrId;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $foldertocreate;
/**
* @ORM\Column(type="boolean")
*/
private $logfile = false;
/**
* @ORM\OneToMany(targetEntity="FtpExportElement", mappedBy="export", cascade={"ALL"})
*/
private $elements;
/**
* @var \DateTime
* @Gedmo\Timestampable(on="create")
* @ORM\Column(type="datetime")
*/
private $created;
/**
* @var \DateTime
* @Gedmo\Timestampable(on="update")
* @ORM\Column(type="datetime")
*/
private $updated;
/**
* Constructor
*/
public function __construct()
{
$this->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;
}
}

View File

@@ -0,0 +1,371 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2013 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Entities;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Table(
* name="FtpExportElements",
* uniqueConstraints={
* @ORM\UniqueConstraint(name="unique_ftp_export", columns={"export_id","base_id","record_id"})
* },
* indexes={
* @ORM\index(name="done", columns={"done"}),
* @ORM\index(name="error", columns={"error"})
* }
* )
* @ORM\Entity(repositoryClass="Repositories\FtpExportElementRepository")
*/
class FtpExportElement
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
* @ORM\Column(type="integer", name="record_id")
*/
private $recordId;
/**
* @ORM\Column(type="integer", name="base_id")
*/
private $baseId;
/**
* @ORM\Column(type="string")
*/
private $subdef;
/**
* @ORM\Column(type="string")
*/
private $filename;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $folder;
/**
* @var Boolean
* @ORM\Column(type="boolean")
*/
private $error = false;
/**
* @ORM\Column(type="boolean")
*/
private $done = false;
/**
* @ORM\ManyToOne(targetEntity="FtpExport", inversedBy="elements", cascade={"persist"})
* @ORM\JoinColumn(name="export_id", referencedColumnName="id")
*/
private $export;
/**
* @ORM\Column(type="boolean")
*/
private $businessfields = false;
/**
* @Gedmo\Timestampable(on="create")
* @ORM\Column(type="datetime")
*/
private $created;
/**
* @Gedmo\Timestampable(on="update")
* @ORM\Column(type="datetime")
*/
private $updated;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->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;
}
}

View File

@@ -0,0 +1,316 @@
<?php
namespace Proxies\__CG__\Entities;
/**
* THIS CLASS WAS GENERATED BY THE DOCTRINE ORM. DO NOT EDIT THIS FILE.
*/
class FtpExport extends \Entities\FtpExport implements \Doctrine\ORM\Proxy\Proxy
{
private $_entityPersister;
private $_identifier;
public $__isInitialized__ = false;
public function __construct($entityPersister, $identifier)
{
$this->_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);
}
}
}

View File

@@ -0,0 +1,208 @@
<?php
namespace Proxies\__CG__\Entities;
/**
* THIS CLASS WAS GENERATED BY THE DOCTRINE ORM. DO NOT EDIT THIS FILE.
*/
class FtpExportElement extends \Entities\FtpExportElement implements \Doctrine\ORM\Proxy\Proxy
{
private $_entityPersister;
private $_identifier;
public $__isInitialized__ = false;
public function __construct($entityPersister, $identifier)
{
$this->_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);
}
}
}

View File

@@ -0,0 +1,15 @@
<?php
namespace Repositories;
use Doctrine\ORM\EntityRepository;
/**
* FtpExportElementRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class FtpExportElementRepository extends EntityRepository
{
}

View File

@@ -0,0 +1,64 @@
<?php
namespace Repositories;
use Doctrine\ORM\EntityRepository;
/**
* FtpExportRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class FtpExportRepository extends EntityRepository
{
/**
* Returns exports that crashed. If a date is provided, only exports created
* before this date are returned.
*
* @param \DateTime $before An optional date to search
*
* @return array
*/
public function findCrashedExports(\DateTime $before = null)
{
$qb = $this->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()));
}
}

View File

@@ -759,11 +759,15 @@ class User_Adapter implements User_Interface, cache_cacheableInterface
public function delete() public function delete()
{ {
$repo = $this->app['EM']->getRepository('Entities\UsrAuthProvider'); $repo = $this->app['EM']->getRepository('Entities\UsrAuthProvider');
foreach ($repo->findByUser($this) as $provider) { foreach ($repo->findByUser($this) as $provider) {
$this->app['EM']->remove($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(); $this->app['EM']->flush();
$sql = 'UPDATE usr SET usr_login = :usr_login , usr_mail = null $sql = 'UPDATE usr SET usr_login = :usr_login , usr_mail = null
@@ -792,11 +796,6 @@ class User_Adapter implements User_Interface, cache_cacheableInterface
$stmt->execute(array(':usr_id' => $this->get_id())); $stmt->execute(array(':usr_id' => $this->get_id()));
$stmt->closeCursor(); $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'; $sql = 'DELETE FROM `order` WHERE usr_id = :usr_id';
$stmt = $this->app['phraseanet.appbox']->get_connection()->prepare($sql); $stmt = $this->app['phraseanet.appbox']->get_connection()->prepare($sql);
$stmt->execute(array(':usr_id' => $this->get_id())); $stmt->execute(array(':usr_id' => $this->get_id()));

143
lib/classes/patch/3906.php Normal file
View File

@@ -0,0 +1,143 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2012 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Alchemy\Phrasea\Application;
use Entities\FtpExport;
use Entities\FtpExportElement;
use Gedmo\Timestampable\TimestampableListener;
class patch_3906 implements patchInterface
{
/** @var string */
private $release = '3.9.0.a6';
/** @var array */
private $concern = array(base::APPLICATION_BOX);
/**
* {@inheritdoc}
*/
public function get_release()
{
return $this->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());
}
}

View File

@@ -9,15 +9,11 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
/** use Entities\FtpExport;
* use Entities\FtpExportElement;
*
* @license http://opensource.org/licenses/gpl-3.0 GPLv3
* @link www.phraseanet.com
*/
class set_exportftp extends set_export class set_exportftp extends set_export
{ {
/** /**
* *
* @param integer $usr_to * @param integer $usr_to
@@ -59,95 +55,44 @@ class set_exportftp extends set_export
. "- repertoire de destination \"" . $destfolder . "\"\n" . "- repertoire de destination \"" . $destfolder . "\"\n"
. "\n"; . "\n";
$fn = "id"; $export = new FtpExport();
$fv = "null"; $export->setNbretry(((int) $retry * 1) > 0 ? (int) $retry : 5)
$fn .= ",crash"; ->setMail($email_dest)
$fv .= ",0"; ->setLogfile($logfile)
$fn .= ",nbretry"; ->setFoldertocreate($makedirectory)
$fv .= ",:nbretry"; ->setUser($this->app['authentication']->getUser())
$fn .= ",mail"; ->setTextMailSender($text_mail_sender)
$fv .= ",:mail"; ->setTextMailReceiver($text_mail_receiver)
$fn .= ",addr"; ->setSendermail($this->app['authentication']->getUser()->get_email())
$fv .= ",:addr"; ->setDestfolder($destfolder)
$fn .= ",login"; ->setPassif($passif == '1')
$fv .= ",:login"; ->setPwd($password)
$fn .= ",`ssl`"; ->setSsl($ssl == '1')
$fv .= ",:ssl"; ->setLogin($login)
$fn .= ",pwd"; ->setAddr($host);
$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";
$params = array( $this->app['EM']->persist($export);
':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);
foreach ($this->list['files'] as $file) { foreach ($this->list['files'] as $file) {
foreach ($file['subdefs'] as $subdef => $properties) { foreach ($file['subdefs'] as $subdef => $properties) {
$filename = $file['export_name'] $filename = $file['export_name'] . $properties["ajout"] . '.' . $properties['exportExt'];
. $properties["ajout"] . '.'
. $properties['exportExt'];
$bfields = isset($properties['businessfields']) ? $properties['businessfields'] : null; $bfields = isset($properties['businessfields']) ? $properties['businessfields'] : null;
$params = array( $element = new FtpExportElement();
':ftp_export_id' => $ftp_export_id $element->setBaseId($file['base_id'])
, ':base_id' => $file['base_id'] ->setBusinessfields($bfields)
, ':record_id' => $file['record_id'] ->setExport($export)
, ':subdef' => $subdef ->setFilename($filename)
, ':filename' => $filename ->setFolder($properties['folder'])
, ':folder' => $properties['folder'] ->setRecordId($file['record_id'])
, ':businessfields' => $bfields ->setSubdef($subdef);
); $export->addElement($element);
$stmt->execute($params);
$this->app['EM']->persist($element);
} }
} }
$stmt->closeCursor(); $this->app['EM']->flush();
return true; return true;
} }

View File

@@ -12,6 +12,8 @@ use Alchemy\Phrasea\Core\Configuration\Configuration;
use Alchemy\Phrasea\Exception\InvalidArgumentException; use Alchemy\Phrasea\Exception\InvalidArgumentException;
use Alchemy\Phrasea\Notification\Mail\MailSuccessFTPSender; use Alchemy\Phrasea\Notification\Mail\MailSuccessFTPSender;
use Alchemy\Phrasea\Notification\Receiver; use Alchemy\Phrasea\Notification\Receiver;
use Entities\FtpExport;
use Entities\FtpExportElement;
class task_period_ftp extends task_appboxAbstract class task_period_ftp extends task_appboxAbstract
{ {
@@ -258,88 +260,39 @@ class task_period_ftp extends task_appboxAbstract
protected function retrieveContent(appbox $appbox) protected function retrieveContent(appbox $appbox)
{ {
$conn = $appbox->get_connection(); foreach ($this->dependencyContainer['EM']
->getRepository('Entities\FtpExport')
->findCrashedExports(new \DateTime('-1 month')) as $export) {
$this->dependencyContainer['EM']->remove($export);
}
$this->dependencyContainer['EM']->flush();
$time2sleep = null; return $this->dependencyContainer['EM']
$ftp_exports = array(); ->getRepository('Entities\FtpExport')
->findDoableExports();
$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();
} }
$sql = "SELECT * FROM ftp_export WHERE crash<nbretry ORDER BY id"; protected function processOneContent(appbox $appbox, $export)
$stmt = $conn->prepare($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.crash<f.nbretry
AND (e.done = 0 or error=1))
ORDER BY f.id";
$stmt = $conn->prepare($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;
}
protected function processOneContent(appbox $appbox, $ftp_export)
{ {
$conn = $appbox->get_connection(); $conn = $appbox->get_connection();
$id = $ftp_export['id']; $id = $export->getId();
$ftp_export[$id]["crash"] = $ftp_export["crash"];
$ftp_export[$id]["nbretry"] = $ftp_export["nbretry"] < 1 ? 3 : (int) $ftp_export["nbretry"];
$state = ""; $state = "";
$ftp_server = $ftp_export["addr"]; $ftp_server = $export->getAddr();
$ftp_user_name = $ftp_export["login"]; $ftp_user_name = $export->getLogin();
$ftp_user_pass = $ftp_export["pwd"]; $ftp_user_pass = $export->getPwd();
$usr_id = (int) $ftp_export["usr_id"]; $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( $line = sprintf(
_('task::ftp:Etat d\'envoi FTP vers le serveur' . _('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 ' "%1$s" avec le compte "%2$s" et pour destination le dossier : "%3$s"') . PHP_EOL
, $ftp_server , $ftp_server
, $ftp_user_name , $ftp_user_name
, $ftp_export["destfolder"] , $export->getDestfolder()
); );
$state .= $line; $state .= $line;
$this->logger->addDebug($line); $this->logger->addDebug($line);
@@ -347,18 +300,18 @@ class task_period_ftp extends task_appboxAbstract
$state .= $line = sprintf( $state .= $line = sprintf(
_("task::ftp:TENTATIVE no %s, %s") _("task::ftp:TENTATIVE no %s, %s")
, $ftp_export["crash"] + 1 , $export->getCrash() + 1
, " (" . date('r') . ")" , " (" . date('r') . ")"
) . PHP_EOL; ) . PHP_EOL;
$this->logger->addDebug($line); $this->logger->addDebug($line);
try { 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 = $this->dependencyContainer['phraseanet.ftp.client']($ftp_server, 21, 300, $ssl, $this->proxy, $this->proxyport);
$ftp_client->login($ftp_user_name, $ftp_user_pass); $ftp_client->login($ftp_user_name, $ftp_user_pass);
if ($ftp_export["passif"] == "1") { if ($export->isPassif()) {
try { try {
$ftp_client->passive(true); $ftp_client->passive(true);
} catch (Exception $e) { } catch (Exception $e) {
@@ -366,26 +319,26 @@ class task_period_ftp extends task_appboxAbstract
} }
} }
if (trim($ftp_export["destfolder"]) != '') { if (trim($export->getDestfolder()) != '') {
try { try {
$ftp_client->chdir($ftp_export["destfolder"]); $ftp_client->chdir($export->getDestFolder());
$ftp_export["destfolder"] = '/' . $ftp_export["destfolder"]; $export->setDestfolder('/' . $export->getDestfolder());
} catch (Exception $e) { } catch (Exception $e) {
$this->logger->addDebug($e->getMessage()); $this->logger->addDebug($e->getMessage());
} }
} else { } else {
$ftp_export["destfolder"] = '/'; $export->setDestfolder('/');
} }
if (trim($ftp_export["foldertocreate"]) != '') { if (trim($export->getFoldertocreate()) != '') {
try { try {
$ftp_client->mkdir($ftp_export["foldertocreate"]); $ftp_client->mkdir($export->getFoldertocreate());
} catch (Exception $e) { } catch (Exception $e) {
$this->logger->addDebug($e->getMessage()); $this->logger->addDebug($e->getMessage());
} }
try { try {
$new_dir = $ftp_client->add_end_slash($ftp_export["destfolder"]) $new_dir = $ftp_client->add_end_slash($export->getDestfolder())
. $ftp_export["foldertocreate"]; . $export->getFoldertocreate();
$ftp_client->chdir($new_dir); $ftp_client->chdir($new_dir);
} catch (Exception $e) { } catch (Exception $e) {
$this->logger->addDebug($e->getMessage()); $this->logger->addDebug($e->getMessage());
@@ -395,38 +348,43 @@ class task_period_ftp extends task_appboxAbstract
$obj = array(); $obj = array();
$basefolder = ''; $basefolder = '';
if (!in_array(trim($ftp_export["destfolder"]), array('.', './', ''))) { if (!in_array(trim($export->getDestfolder()), array('.', './', ''))) {
$basefolder = p4string::addEndSlash($ftp_export["destfolder"]); $basefolder = p4string::addEndSlash($export->getDestfolder());
} }
$basefolder .= $ftp_export["foldertocreate"]; $basefolder .= $export->getFoldertocreate();
if (in_array(trim($basefolder), array('.', './', ''))) { if (in_array(trim($basefolder), array('.', './', ''))) {
$basefolder = '/'; $basefolder = '/';
} }
foreach ($ftp_export['files'] as $fileid => $file) { foreach ($export->getElements() as $exportElement) {
$base_id = $file["base_id"]; if ($exportElement->isDone()) {
$record_id = $file["record_id"]; continue;
$subdef = $file['subdef']; }
$base_id = $exportElement->getBaseId();
$record_id = $exportElement->getRecordId();
$subdef = $exportElement->getSubdef();
$localfile = null;
try { try {
$sbas_id = phrasea::sbasFromBas($this->dependencyContainer, $base_id); $sbas_id = phrasea::sbasFromBas($this->dependencyContainer, $base_id);
$record = new record_adapter($this->dependencyContainer, $sbas_id, $record_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') { 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()); $localfile = $this->dependencyContainer['root.path'] . '/tmp/' . md5($desc . time() . mt_rand());
if (file_put_contents($localfile, $desc) === false) { if (file_put_contents($localfile, $desc) === false) {
throw new Exception('Impossible de creer un fichier temporaire'); throw new Exception('Impossible de creer un fichier temporaire');
} }
} elseif ($subdef == 'caption-yaml') { } 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()); $localfile = $this->dependencyContainer['root.path'] . '/tmp/' . md5($desc . time() . mt_rand());
if (file_put_contents($localfile, $desc) === false) { 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) { if ($ftp_client->pwd() != $current_folder) {
try { try {
@@ -466,11 +424,11 @@ class task_period_ftp extends task_appboxAbstract
unlink($localfile); unlink($localfile);
} }
$sql = "UPDATE ftp_export_elements" $exportElement
. " SET done='1', error='0' WHERE id = :file_id"; ->setDone(true)
$stmt = $conn->prepare($sql); ->setError(false);
$stmt->execute(array(':file_id' => $file['id'])); $this->dependencyContainer['EM']->persist($exportElement);
$stmt->closeCursor(); $this->dependencyContainer['EM']->flush();
$this->logexport($record, $obj, $ftpLog); $this->logexport($record, $obj, $ftpLog);
} catch (Exception $e) { } catch (Exception $e) {
$state .= $line = sprintf(_('task::ftp:File "%1$s" (record %2$s) de la base "%3$s"' . $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); $this->logger->addDebug($line);
$done = $file['error']; // One failure max
$exportElement
$sql = "UPDATE ftp_export_elements" ->setDone($exportElement->isError())
. " SET done = :done, error='1' WHERE id = :file_id"; ->setError(true);
$stmt = $conn->prepare($sql); $this->dependencyContainer['EM']->persist($exportElement);
$stmt->execute(array(':done' => $done, ':file_id' => $file['id'])); $this->dependencyContainer['EM']->flush();
$stmt->closeCursor();
} }
} }
if ($ftp_export['logfile']) { if ($export->isLogfile()) {
$this->logger->addDebug("logfile "); $this->logger->addDebug("logfile ");
$date = new DateTime(); $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"; $buffer = '#transfert finished ' . $date->format(DATE_ATOM) . "\n\n";
foreach ($rs as $row) { foreach ($export->getElements() as $exportElement) {
$filename = $row['filename']; if (!$exportElement->isDone() || $exportElement->isError()) {
$folder = $row['folder']; continue;
}
$root = $ftp_export['foldertocreate']; $filename = $exportElement->getFilename();
$folder = $exportElement->getFilename();
$root = $export->getFoldertocreate();
$buffer .= $root . '/' . $folder . $filename . "\n"; $buffer .= $root . '/' . $folder . $filename . "\n";
} }
@@ -522,11 +469,8 @@ class task_period_ftp extends task_appboxAbstract
file_put_contents($tmpfile, $buffer); file_put_contents($tmpfile, $buffer);
$remotefile = $date->format('U') . '-transfert.log'; $remotefile = $date->format('U') . '-transfert.log';
$ftp_client->chdir($export->getDestFolder());
$ftp_client->chdir($ftp_export["destfolder"]);
$ftp_client->put($remotefile, $tmpfile); $ftp_client->put($remotefile, $tmpfile);
unlink($tmpfile); unlink($tmpfile);
} }
@@ -537,15 +481,14 @@ class task_period_ftp extends task_appboxAbstract
$this->logger->addDebug($line); $this->logger->addDebug($line);
$sql = "UPDATE ftp_export SET crash=crash+1,date=now()" $export->incrementCrash();
. " WHERE id = :export_id"; $this->dependencyContainer['EM']->persist($export);
$stmt = $conn->prepare($sql); $this->dependencyContainer['EM']->flush();
$stmt->execute(array(':export_id' => $ftp_export['id']));
$stmt->closeCursor();
unset($ftp_client); unset($ftp_client);
} }
$this->finalize($appbox, $id);
$this->finalize($appbox, $export);
} }
protected function postProcessOneContent(appbox $appbox, $row) protected function postProcessOneContent(appbox $appbox, $row)
@@ -553,111 +496,77 @@ class task_period_ftp extends task_appboxAbstract
return $this; return $this;
} }
public function finalize(appbox $appbox, $id) public function finalize(appbox $appbox, FtpExport $export)
{ {
$conn = $appbox->get_connection(); $conn = $appbox->get_connection();
$sql = 'SELECT crash, nbretry FROM ftp_export WHERE id = :export_id'; if ($export->getCrash() >= $export->getNbretry()) {
$this->send_mails($appbox, $export);
$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);
return $this; return $this;
} }
$sql = 'SELECT count(id) as total, sum(error) as errors, sum(done) as done' $total = count($export->getElements());
. ' FROM ftp_export_elements WHERE ftp_export_id = :export_id'; $done = count($export->getElements()->filter(function (FtpExportElement $element) {
$stmt = $conn->prepare($sql); return $element->isDone();
$stmt->execute(array(':export_id' => $id)); }));
$row = $stmt->fetch(PDO::FETCH_ASSOC); $error = count($export->getElements()->filter(function (FtpExportElement $element) {
$stmt->closeCursor(); return $element->isError();
}));
if ($row && $row['done'] == (int) $row['total']) { if ($done === $total) {
$this->send_mails($appbox, $id); $this->send_mails($appbox, $export);
if ((int) $row['errors'] === 0) { if ((int) $error === 0) {
$sql = 'DELETE FROM ftp_export WHERE id = :export_id'; $this->dependencyContainer['EM']->remove($export);
$stmt = $conn->prepare($sql); $this->dependencyContainer['EM']->flush();
$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();
} else { } else {
$sql = 'UPDATE ftp_export SET crash = nbretry'; $export->setCrash($export->getNbretry());
$stmt = $conn->prepare($sql); foreach ($export->getElements() as $element) {
$stmt->execute(); if (!$element->isError()) {
$stmt->closeCursor(); $this->dependencyContainer['EM']->remove($export);
$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)); $this->dependencyContainer['EM']->flush();
$stmt->closeCursor();
} }
return $this; 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(); $transferts = array();
$transfert_status = _('task::ftp:Tous les documents ont ete transferes avec succes'); $transfert_status = _('task::ftp:Tous les documents ont ete transferes avec succes');
$stmt = $conn->prepare($sql); foreach ($export->getElements() as $element) {
$stmt->execute(array(':export_id' => $id)); if (!$element->isError() && $element->isDone()) {
$rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
foreach ($rs as $row) {
if ($row['error'] == '0' && $row['done'] == '1') {
$transferts[] = $transferts[] =
'<li>' . sprintf(_('task::ftp:Record %1$s - %2$s de la base (%3$s - %4$s) - %5$s') '<li>' . sprintf(_('task::ftp:Record %1$s - %2$s de la base (%3$s - %4$s) - %5$s')
, $row["record_id"], $row["filename"] , $element->getRecordId(), $element->getFilename()
, phrasea::sbas_labels(phrasea::sbasFromBas($this->dependencyContainer, $row["base_id"]), $this->dependencyContainer) , phrasea::sbas_labels(phrasea::sbasFromBas($this->dependencyContainer, $element->getBaseId()), $this->dependencyContainer)
, phrasea::bas_labels($row['base_id'], $this->dependencyContainer), $row['subdef']) . ' : ' . _('Transfert OK') . '</li>'; , phrasea::bas_labels($element->getBaseId(), $this->dependencyContainer), $element->getSubdef()) . ' : ' . _('Transfert OK') . '</li>';
} else { } else {
$transferts[] = $transferts[] =
'<li>' . sprintf(_('task::ftp:Record %1$s - %2$s de la base (%3$s - %4$s) - %5$s') '<li>' . sprintf(_('task::ftp:Record %1$s - %2$s de la base (%3$s - %4$s) - %5$s')
, $row["record_id"], $row["filename"] , $element->getRecordId(), $element->getFilename()
, phrasea::sbas_labels(phrasea::sbasFromBas($this->dependencyContainer, $row["base_id"]), $this->dependencyContainer), phrasea::bas_labels($row['base_id'], $this->dependencyContainer) , phrasea::sbas_labels(phrasea::sbasFromBas($this->dependencyContainer, $element->getBaseId()), $this->dependencyContainer), phrasea::bas_labels($element->getBaseId(), $this->dependencyContainer)
, $row['subdef']) . ' : ' . _('Transfert Annule') . '</li>'; , $element->getSubdef()) . ' : ' . _('Transfert Annule') . '</li>';
$transfert_status = _('task::ftp:Certains documents n\'ont pas pu etre tranferes'); $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' if ($export->getCrash() >= $export->getNbretry()) {
. ' 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'); $connection_status = _('Des difficultes ont ete rencontres a la connection au serveur distant');
} else { } else {
$connection_status = _('La connection vers le serveur distant est OK'); $connection_status = _('La connection vers le serveur distant est OK');
} }
$text_mail_sender = $row['text_mail_sender']; $text_mail_sender = $export->getTextMailSender();
$text_mail_receiver = $row['text_mail_receiver']; $text_mail_receiver = $export->getTextMailReceiver();
$mail = $row['mail']; $mail = $export->getMail();
$sendermail = $row['sendermail']; $sendermail = $export->getSendermail();
$ftp_server = $row['addr']; $ftp_server = $export->getAddr();
}
$message = "\n\n----------------------------------------\n\n"; $message = "\n\n----------------------------------------\n\n";
$message = $connection_status . "\n"; $message = $connection_status . "\n";
@@ -669,11 +578,10 @@ class task_period_ftp extends task_appboxAbstract
$sender_message = $text_mail_sender . $message; $sender_message = $text_mail_sender . $message;
$receiver_message = $text_mail_receiver . $message; $receiver_message = $text_mail_receiver . $message;
$receiver = null;
try { try {
$receiver = new Receiver(null, $sendermail); $receiver = new Receiver(null, $sendermail);
} catch (InvalidArgumentException $e) { } catch (InvalidArgumentException $e) {
$receiver = null;
} }
if ($receiver) { if ($receiver) {
@@ -682,24 +590,20 @@ class task_period_ftp extends task_appboxAbstract
$this->dependencyContainer['notification.deliverer']->deliver($mail); $this->dependencyContainer['notification.deliverer']->deliver($mail);
} }
$receiver = null;
try { try {
$receiver = new Receiver(null, $mail); $receiver = new Receiver(null, $mail);
} catch (InvalidArgumentException $e) { $mail = MailSuccessFTPSender::create($this->dependencyContainer, $receiver, null, $receiver_message);
}
if ($receiver) {
$mail = MailSuccessFTP::create($this->dependencyContainer, $receiver, null, $receiver_message);
$mail->setServer($ftp_server); $mail->setServer($ftp_server);
$this->dependencyContainer['notification.deliverer']->deliver($mail); $this->dependencyContainer['notification.deliverer']->deliver($mail);
} catch (\Exception $e) {
$this->log('Unable to deliver success message');
} }
} }
public function logexport(record_adapter $record, $obj, $ftpLog) public function logexport(record_adapter $record, $obj, $ftpLog)
{ {
foreach ($obj as $oneObj) { 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, ''); ->log($record, Session_Logger::EVENT_EXPORTFTP, $ftpLog, '');
} }

View File

@@ -1892,325 +1892,6 @@
<engine>InnoDB</engine> <engine>InnoDB</engine>
</table> </table>
<table name="ftp_export">
<fields>
<field>
<name>id</name>
<type>int(11) unsigned</type>
<null></null>
<extra>auto_increment</extra>
<default></default>
<comment></comment>
</field>
<field>
<name>crash</name>
<type>tinyint(3) unsigned</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
<field>
<name>nbretry</name>
<type>tinyint(3) unsigned</type>
<null></null>
<extra></extra>
<default>5</default>
<comment></comment>
</field>
<field>
<name>mail</name>
<type>char(255)</type>
<null></null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>addr</name>
<type>char(255)</type>
<null></null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>ssl</name>
<type>tinyint(1) unsigned</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
<field>
<name>login</name>
<type>char(255)</type>
<null></null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>pwd</name>
<type>char(255)</type>
<null></null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>passif</name>
<type>tinyint(1) unsigned</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
<field>
<name>destfolder</name>
<type>char(255)</type>
<null>YES</null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>sendermail</name>
<type>char(255)</type>
<null>YES</null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>text_mail_sender</name>
<type>longtext</type>
<null></null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>text_mail_receiver</name>
<type>longtext</type>
<null></null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>usr_id</name>
<type>int(11) unsigned</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
<field>
<name>date</name>
<type>datetime</type>
<null></null>
<extra></extra>
<default>0000-00-00 00:00:00</default>
<comment></comment>
</field>
<field>
<name>foldertocreate</name>
<type>char(255)</type>
<null>YES</null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>logfile</name>
<type>tinyint(1) unsigned</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
</fields>
<indexes>
<index>
<name>PRIMARY</name>
<type>PRIMARY</type>
<fields>
<field>id</field>
</fields>
</index>
<index>
<name>usr_id</name>
<type>INDEX</type>
<fields>
<field>usr_id</field>
</fields>
</index>
<index>
<name>crash</name>
<type>INDEX</type>
<fields>
<field>crash</field>
</fields>
</index>
<index>
<name>nbretry</name>
<type>INDEX</type>
<fields>
<field>nbretry</field>
</fields>
</index>
</indexes>
<engine>InnoDB</engine>
</table>
<table name="ftp_export_elements">
<fields>
<field>
<name>id</name>
<type>int(11) unsigned</type>
<null></null>
<extra>auto_increment</extra>
<default></default>
<comment></comment>
</field>
<field>
<name>ftp_export_id</name>
<type>int(11) unsigned</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
<field>
<name>base_id</name>
<type>int(11) unsigned</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
<field>
<name>record_id</name>
<type>int(11) unsigned</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
<field>
<name>subdef</name>
<type>char(255)</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
<field>
<name>filename</name>
<type>char(255)</type>
<null></null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>folder</name>
<type>char(255)</type>
<null></null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>businessfields</name>
<type>tinyint(1) unsigned</type>
<null>YES</null>
<extra></extra>
<default></default>
<comment></comment>
</field>
<field>
<name>error</name>
<type>tinyint(1) unsigned</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
<field>
<name>done</name>
<type>tinyint(1) unsigned</type>
<null></null>
<extra></extra>
<default>0</default>
<comment></comment>
</field>
</fields>
<indexes>
<index>
<name>PRIMARY</name>
<type>PRIMARY</type>
<fields>
<field>id</field>
</fields>
</index>
<index>
<name>ftp_export_id</name>
<type>INDEX</type>
<fields>
<field>ftp_export_id</field>
</fields>
</index>
<index>
<name>done</name>
<type>INDEX</type>
<fields>
<field>done</field>
</fields>
</index>
<index>
<name>error</name>
<type>INDEX</type>
<fields>
<field>error</field>
</fields>
</index>
</indexes>
<engine>InnoDB</engine>
</table>
<table name="notifications"> <table name="notifications">
<fields> <fields>
<field> <field>

View File

@@ -0,0 +1,229 @@
<?php
namespace Doctrine\Tests\Repositories;
use Entities\FtpExport;
use Entities\FtpExportElement;
use Gedmo\Timestampable\TimestampableListener;
class FtpExportRepositoryTest extends \PhraseanetPHPUnitAbstract
{
public function testFindCrashedExportsWithoutDate()
{
$failure1 = new FtpExport();
$failure1
->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);
}
}

Binary file not shown.