From 878f7e559abe15d751ad78d7db901116e2062446 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Fri, 13 Oct 2023 16:39:14 +0200 Subject: [PATCH] add task to import files from dropfolder --- inc/inc.Tasks.php | 170 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) diff --git a/inc/inc.Tasks.php b/inc/inc.Tasks.php index d03e234af..604bc17d6 100644 --- a/inc/inc.Tasks.php +++ b/inc/inc.Tasks.php @@ -838,10 +838,180 @@ class SeedDMS_RecentChangesTask extends SeedDMS_SchedulerTaskBase { /* {{{ */ } /* }}} */ } /* }}} */ +/** + * Class containing methods for running a scheduled task + * + * @author Uwe Steinmann + * @package SeedDMS + * @subpackage core + */ +class SeedDMS_ImportDropFolderTask extends SeedDMS_SchedulerTaskBase { /* {{{ */ + + private static function getFiles($path, $recursive=false) { + if($recursive) + $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); + else + $rii = new DirectoryIterator($path); + + $files = array(); + try { + foreach ($rii as $file) + if (!$file->isDir()) + $files[] = [substr($file->getPath(), strlen($path)+1), $file->getFilename()]; + } catch(Exception $e) { + } + + return $files; + } + + /** + * Run the task + * + * @param SeedDMS_SchedulerTask $task task to be executed + * @return boolean true if task was executed succesfully, otherwise false + */ + public function execute(SeedDMS_SchedulerTask $task) { /* {{{ */ + $dms = $this->dms; + $user = $this->user; + $logger = $this->logger; + $settings = $this->settings; + $fulltextservice = $this->fulltextservice; + $notifier = $this->notifier; + $taskparams = $task->getParameter(); + + $dropfolderdir = addDirSep($settings->_dropFolderDir); + + if(!empty($taskparams['targetfolder'])) { + if(!($folder = $dms->getFolder($taskparams['targetfolder']))) { + $logger->log('Task \'import_dropfolder\': target folder with id '.$taskparams['targetfolder'].' does not exist', PEAR_LOG_ERR); + return false; + } + } else { + $logger->log('Task \'import_dropfolder\': target folder not set', PEAR_LOG_ERR); + return false; + } + + if(!empty($taskparams['users'])) { + $userids = $taskparams['users']; + $users = []; + foreach($userids as $userid) + if($u = $dms->getUser($userid)) + $users[] = $u; + } else { + $users = $dms->getAllUsers(); + } + + foreach($users as $user) { + $dir = $dropfolderdir.$user->getLogin(); + $logger->log('Task \'import_dropfolder\': import from \''.$dir.'\' for user \''.$user->getLogin().'\' into \''.$folder->getName().'\'', PEAR_LOG_INFO); + + /* Check if we are still looking in the configured directory and + * not somewhere else, e.g. if the login was '../test' + */ + if(dirname($dir).DIRECTORY_SEPARATOR == $dropfolderdir) { + if(is_dir($dir)) { + $files = self::getFiles($dir, !empty($taskparams['recursive'])); + foreach($files as $file) { + $logger->log('Task \'import_dropfolder\': import \''.($file[0] ? $file[0].DIRECTORY_SEPARATOR : '').$file[1].'\' for user \''.$user->getLogin().'\'', PEAR_LOG_INFO); + + $mimetype = SeedDMS_Core_File::mimetype($dir.DIRECTORY_SEPARATOR.$file[0].$file[1]); + $lastDotIndex = strrpos($file[1], "."); + if (is_bool($lastDotIndex) && !$lastDotIndex) $filetype = "."; + else $filetype = substr($file[1], $lastDotIndex); + + $expires = false; + if($settings->_presetExpirationDate) { + $expires = strtotime($settings->_presetExpirationDate); + } + + $controller = Controller::factory('AddDocument', array('dms'=>$dms, 'user'=>$user)); + $controller->setParam('documentsource', 'importdropfolder'); + $controller->setParam('folder', $folder); + $controller->setParam('fulltextservice', $fulltextservice); + $controller->setParam('name', $file[1]); + $controller->setParam('comment', ''); + $controller->setParam('expires', $expires); + $controller->setParam('keywords', ''); + $controller->setParam('categories', []); + $controller->setParam('owner', $user); + $controller->setParam('userfiletmp', $dir.DIRECTORY_SEPARATOR.$file[0].$file[1]); + $controller->setParam('userfilename', $file[1]); + $controller->setParam('filetype', $filetype); + $controller->setParam('userfiletype', $mimetype); + $minmax = $folder->getDocumentsMinMax(); + $deviation = rand(10, 1000)/10; + if($settings->_defaultDocPosition == 'start') + $controller->setParam('sequence', $minmax['min'] - $deviation); + else + $controller->setParam('sequence', $minmax['max'] + $deviation); + $controller->setParam('reviewers', []); + $controller->setParam('approvers', []); + $controller->setParam('reqversion', 1); + $controller->setParam('versioncomment', ''); + $controller->setParam('attributes', []); + $controller->setParam('attributesversion', array()); + $controller->setParam('workflow', null); + $controller->setParam('notificationgroups', array()); + $controller->setParam('notificationusers', array()); + $controller->setParam('initialdocumentstatus', $settings->_initialDocumentStatus); + $controller->setParam('maxsizeforfulltext', $settings->_maxSizeForFullText); + $controller->setParam('defaultaccessdocs', $settings->_defaultAccessDocs); + + if(!$document = $controller()) { + $err = $controller->getErrorMsg(); + if(is_string($err)) + $errmsg = getMLText($err); + elseif(is_array($err)) { + $errmsg = getMLText($err[0], $err[1]); + } else { + $errmsg = $err; + } + $logger->log('Task \'import_dropfolder\': import of \''.($file[0] ? $file[0].DIRECTORY_SEPARATOR : '').$file[1].'\' for user \''.$user->getLogin().'\' failed', PEAR_LOG_ERR); + } else { + // Send notification to subscribers of folder. + if($notifier) { + $notifier->sendNewDocumentMail($document, $user); + } + } + } + } + } + } + + return true; + } /* }}} */ + + public function getDescription() { /* {{{ */ + return 'Import all files from drop folder'; + } /* }}} */ + + public function getAdditionalParams() { /* {{{ */ + return array( + array( + 'name'=>'users', + 'type'=>'users', + 'multiple'=>true, + 'description'=> 'Use this user for the import', + ), + array( + 'name'=>'recursive', + 'type'=>'boolean', + 'description'=> 'If set, import documents from sub foldrers in drop folder directory.', + ), + array( + 'name'=>'targetfolder', + 'type'=>'folder', + 'description'=> getMLText('task_import_drop_folder_targetfolder_desc'), + ), + ); + } /* }}} */ +} /* }}} */ + $GLOBALS['SEEDDMS_SCHEDULER']['tasks']['core']['expireddocs'] = 'SeedDMS_ExpiredDocumentsTask'; $GLOBALS['SEEDDMS_SCHEDULER']['tasks']['core']['indexingdocs'] = 'SeedDMS_IndexingDocumentsTask'; $GLOBALS['SEEDDMS_SCHEDULER']['tasks']['core']['checksum'] = 'SeedDMS_CheckSumTask'; $GLOBALS['SEEDDMS_SCHEDULER']['tasks']['core']['preview'] = 'SeedDMS_PreviewTask'; $GLOBALS['SEEDDMS_SCHEDULER']['tasks']['core']['calendar'] = 'SeedDMS_CalendarTask'; $GLOBALS['SEEDDMS_SCHEDULER']['tasks']['core']['statistic'] = 'SeedDMS_StatisticTask'; +$GLOBALS['SEEDDMS_SCHEDULER']['tasks']['core']['importdropfolder'] = 'SeedDMS_ImportDropFolderTask'; $GLOBALS['SEEDDMS_SCHEDULER']['tasks']['core']['recentchanges'] = 'SeedDMS_RecentChangesTask';