Open Journal Systems  3.3.0
PKPSubmissionDAO.inc.php
1 <?php
2 
17 import('lib.pkp.classes.submission.PKPSubmission');
18 import('lib.pkp.classes.db.SchemaDAO');
19 import('lib.pkp.classes.services.PKPSchemaService'); // SCHEMA_ constants
20 
21 define('ORDERBY_DATE_PUBLISHED', 'datePublished');
22 define('ORDERBY_TITLE', 'title');
23 
24 abstract class PKPSubmissionDAO extends SchemaDAO {
25  var $cache;
27 
29  public $schemaName = SCHEMA_SUBMISSION;
30 
32  public $tableName = 'submissions';
33 
35  public $settingsTableName = 'submission_settings';
36 
38  public $primaryKeyColumn = 'submission_id';
39 
42  'id' => 'submission_id',
43  'contextId' => 'context_id',
44  'currentPublicationId' => 'current_publication_id',
45  'dateLastActivity' => 'date_last_activity',
46  'dateSubmitted' => 'date_submitted',
47  'lastModified' => 'last_modified',
48  'stageId' => 'stage_id',
49  'status' => 'status',
50  'submissionProgress' => 'submission_progress',
51  ];
52 
56  function __construct() {
57  parent::__construct();
58  $this->authorDao = DAORegistry::getDAO('AuthorDAO');
59  }
60 
67  function _cacheMiss($cache, $id) {
68  $submission = $this->getById($id, null, false);
69  $cache->setCache($id, $submission);
70  return $submission;
71  }
72 
77  function _getCache() {
78  if (!isset($this->cache)) {
79  $cacheManager = CacheManager::getManager();
80  $this->cache = $cacheManager->getObjectCache('submissions', 0, array(&$this, '_cacheMiss'));
81  }
82  return $this->cache;
83  }
84 
88  function _fromRow($row) {
89  $submission = parent::_fromRow($row);
90  $submission->setData('publications', iterator_to_array(
91  Services::get('publication')->getMany(['submissionIds' => $submission->getId()])
92  ));
93 
94  return $submission;
95  }
96 
101  function deleteObject($submission) {
102  return $this->deleteById($submission->getId());
103  }
104 
109  function deleteById($submissionId) {
110  $submission = $this->getById($submissionId);
111  if (!is_a($submission, 'Submission')) {
112  throw new Exception('Could not delete submission. No submission with the id ' . (int) $submissionId . ' was found.');
113  }
114 
115  parent::deleteById($submissionId);
116 
117  // Delete publications
118  $publicationsIterator = Services::get('publication')->getMany(['submissionIds' => $submissionId]);
119  $publicationDao = DAORegistry::getDAO('PublicationDAO'); /* @var $publicationDao PublicationDAO */
120  foreach ($publicationsIterator as $publication) {
121  $publicationDao->deleteObject($publication);
122  }
123 
124  // Delete submission files.
125  // 'deleteAllRevisionsBySubmissionId' has to be called before 'rmtree'
126  // because SubmissionFileDaoDelegate::deleteObjects checks the file
127  // and returns false if the file is not there, which makes the foreach loop in
128  // SubmissionFileDAO::_deleteInternally not run till the end.
129  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
130  $submissionFileDao->deleteAllRevisionsBySubmissionId($submissionId);
131  import('lib.pkp.classes.file.SubmissionFileManager');
132  $submissionFileManager = new SubmissionFileManager($submission->getContextId(), $submission->getId());
133  $submissionFileManager->rmtree($submissionFileManager->getBasePath());
134 
135  $reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /* @var $reviewRoundDao ReviewRoundDAO */
136  $reviewRoundDao->deleteBySubmissionId($submissionId);
137 
138  $editDecisionDao = DAORegistry::getDAO('EditDecisionDAO'); /* @var $editDecisionDao EditDecisionDAO */
139  $editDecisionDao->deleteDecisionsBySubmissionId($submissionId);
140 
141  $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */
142  $reviewAssignmentDao->deleteBySubmissionId($submissionId);
143 
144  // Delete the queries associated with a submission
145  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
146  $queryDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId);
147 
148  // Delete the stage assignments.
149  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
150  $stageAssignments = $stageAssignmentDao->getBySubmissionAndStageId($submissionId);
151  while ($stageAssignment = $stageAssignments->next()) {
152  $stageAssignmentDao->deleteObject($stageAssignment);
153  }
154 
155  $noteDao = DAORegistry::getDAO('NoteDAO'); /* @var $noteDao NoteDAO */
156  $noteDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId);
157 
158  $submissionCommentDao = DAORegistry::getDAO('SubmissionCommentDAO'); /* @var $submissionCommentDao SubmissionCommentDAO */
159  $submissionCommentDao->deleteBySubmissionId($submissionId);
160 
161  // Delete any outstanding notifications for this submission
162  $notificationDao = DAORegistry::getDAO('NotificationDAO'); /* @var $notificationDao NotificationDAO */
163  $notificationDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId);
164 
165  $submissionEventLogDao = DAORegistry::getDAO('SubmissionEventLogDAO'); /* @var $submissionEventLogDao SubmissionEventLogDAO */
166  $submissionEventLogDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId);
167 
168  $submissionEmailLogDao = DAORegistry::getDAO('SubmissionEmailLogDAO'); /* @var $submissionEmailLogDao SubmissionEmailLogDAO */
169  $submissionEmailLogDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId);
170  }
171 
181  function getByPubId($pubIdType, $pubId, $contextId = null) {
182 
183  $params = [
184  'pub-id::' . $pubIdType,
185  $pubId,
186  ];
187  if ($contextId) {
188  $params[] = $contextId;
189  }
190 
191  $result = $this->retrieve(
192  'SELECT s.submission_id
193  FROM publication_settings ps
194  INNER JOIN publications p ON p.publication_id = ps.publication_id
195  INNER JOIN submissions s ON p.publication_id = s.current_publication_id
196  WHERE ps.setting_name = ? AND ps.setting_value = ?'
197  . ($contextId ? ' AND s.context_id = ?' : ''),
198  $params
199  );
200 
201  $submissionId = $result->fields[0];
202 
203  if (!$submissionId) {
204  return null;
205  }
206 
207  return $this->getById($submissionId);
208  }
209 
210 
215  function getInsertId() {
216  return $this->_getInsertId('submissions', 'submission_id');
217  }
218 
222  function flushCache() {
223  $cache = $this->_getCache();
224  $cache->flush();
225  }
226 
232  function getByContextId($contextId) {
233  $result = $this->retrieve(
234  'SELECT * FROM ' . $this->tableName . ' WHERE context_id = ?',
235  [(int) $contextId]
236  );
237 
238  return new DAOResultFactory($result, $this, '_fromRow');
239  }
240 
241  /*
242  * Delete all submissions by context ID.
243  * @param $contextId int
244  */
245  function deleteByContextId($contextId) {
246  $submissions = $this->getByContextId($contextId);
247  while ($submission = $submissions->next()) {
248  $this->deleteById($submission->getId());
249  }
250  }
251 
256  function resetPermissions($contextId) {
257  $submissions = $this->getByContextId($contextId);
258  while ($submission = $submissions->next()) {
259  $publications = (array) $submission->getData('publications');
260  if (empty($publications)) {
261  continue;
262  }
263  $params = [
264  'copyrightYear' => $submission->_getContextLicenseFieldValue(null, PERMISSIONS_FIELD_COPYRIGHT_YEAR),
265  'copyrightHolder' => $submission->_getContextLicenseFieldValue(null, PERMISSIONS_FIELD_COPYRIGHT_HOLDER),
266  'licenseUrl' => $submission->_getContextLicenseFieldValue(null, PERMISSIONS_FIELD_LICENSE_URL),
267  ];
268  foreach ($publications as $publication) {
269  $publication = Services::get('publication')->edit($publication, $params, Application::get()->getRequest());
270  }
271  }
272  $this->flushCache();
273  }
274 
279  function getDefaultSortOption() {
280  return $this->getSortOption(ORDERBY_DATE_PUBLISHED, SORT_DIRECTION_DESC);
281  }
282 
287  function getSortSelectOptions() {
288  return array(
289  $this->getSortOption(ORDERBY_TITLE, SORT_DIRECTION_ASC) => __('catalog.sortBy.titleAsc'),
290  $this->getSortOption(ORDERBY_TITLE, SORT_DIRECTION_DESC) => __('catalog.sortBy.titleDesc'),
291  $this->getSortOption(ORDERBY_DATE_PUBLISHED, SORT_DIRECTION_ASC) => __('catalog.sortBy.datePublishedAsc'),
292  $this->getSortOption(ORDERBY_DATE_PUBLISHED, SORT_DIRECTION_DESC) => __('catalog.sortBy.datePublishedDesc'),
293  );
294  }
295 
302  function getSortOption($sortBy, $sortDir) {
303  return $sortBy .'-' . $sortDir;
304  }
305 
311  function getSortBy($sortOption) {
312  list($sortBy, $sortDir) = explode("-", $sortOption);
313  return $sortBy;
314  }
315 
321  function getSortDirection($sortOption) {
322  list($sortBy, $sortDir) = explode("-", $sortOption);
323  return $sortDir;
324  }
325 
339  function getExportable($contextId, $pubIdType = null, $title = null, $author = null, $issueId = null, $pubIdSettingName = null, $pubIdSettingValue = null, $rangeInfo = null) {
340  if ($pubIdSettingName) {
341  $params[] = $pubIdSettingName;
342  }
343  $params[] = STATUS_PUBLISHED;
344  $params[] = $contextId;
345  if ($pubIdType) {
346  $params[] = 'pub-id::'.$pubIdType;
347  }
348  if ($title) {
349  $params[] = 'title';
350  $params[] = '%' . $title . '%';
351  }
352  if ($author) {
353  $params[] = $author;
354  $params[] = $author;
355  }
356  if ($issueId) {
357  $params[] = $issueId;
358  }
359  if ($pubIdSettingName && $pubIdSettingValue && $pubIdSettingValue != EXPORT_STATUS_NOT_DEPOSITED) {
360  $params[] = $pubIdSettingValue;
361  }
362 
363  $result = $this->retrieveRange(
364  'SELECT s.*
365  FROM submissions s
366  LEFT JOIN publications p ON s.current_publication_id = p.publication_id
367  LEFT JOIN publication_settings ps ON p.publication_id = ps.publication_id'
368  . ($issueId ? ' LEFT JOIN publication_settings psi ON p.publication_id = psi.publication_id AND psi.setting_name = \'issueId\'' : '')
369  . ($pubIdType != null?' LEFT JOIN publication_settings pspidt ON (p.publication_id = pspidt.publication_id)':'')
370  . ($title != null?' LEFT JOIN publication_settings pst ON (p.publication_id = pst.publication_id)':'')
371  . ($author != null?' LEFT JOIN authors au ON (p.publication_id = au.publication_id)
372  LEFT JOIN author_settings asgs ON (asgs.author_id = au.author_id AND asgs.setting_name = \''.IDENTITY_SETTING_GIVENNAME.'\')
373  LEFT JOIN author_settings asfs ON (asfs.author_id = au.author_id AND asfs.setting_name = \''.IDENTITY_SETTING_FAMILYNAME.'\')
374  ':'')
375  . ($pubIdSettingName != null?' LEFT JOIN submission_settings pss ON (s.submission_id = pss.submission_id AND pss.setting_name = ?)':'')
376  . ' WHERE s.status = ?
377  AND s.context_id = ?'
378  . ($pubIdType != null?' AND pspidt.setting_name = ? AND pspidt.setting_value IS NOT NULL':'')
379  . ($title != null?' AND (pst.setting_name = ? AND pst.setting_value LIKE ?)':'')
380  . ($author != null?' AND (asgs.setting_value LIKE ? OR asfs.setting_value LIKE ?)':'')
381  . ($issueId != null?' AND psi.setting_value = ?':'')
382  . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue == EXPORT_STATUS_NOT_DEPOSITED)?' AND pss.setting_value IS NULL':'')
383  . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue != EXPORT_STATUS_NOT_DEPOSITED)?' AND pss.setting_value = ?':'')
384  . (($pubIdSettingName != null && is_null($pubIdSettingValue))?' AND (pss.setting_value IS NULL OR pss.setting_value = \'\')':'')
385  . ' GROUP BY s.submission_id
386  ORDER BY MAX(p.date_published) DESC, s.submission_id DESC',
387  $params,
388  $rangeInfo
389  );
390 
391  return new DAOResultFactory($result, $this, '_fromRow');
392  }
393 }
SubmissionFileManager
Helper class for database-backed submission file management tasks.
Definition: SubmissionFileManager.inc.php:30
DAOResultFactory
Wrapper around ADORecordSet providing "factory" features for generating objects from DAOs.
Definition: DAOResultFactory.inc.php:21
PKPSubmissionDAO\deleteObject
deleteObject($submission)
Definition: PKPSubmissionDAO.inc.php:101
PKPSubmissionDAO\_cacheMiss
_cacheMiss($cache, $id)
Definition: PKPSubmissionDAO.inc.php:67
PKPSubmissionDAO\__construct
__construct()
Definition: PKPSubmissionDAO.inc.php:56
PKPSubmissionDAO\getByPubId
getByPubId($pubIdType, $pubId, $contextId=null)
Definition: PKPSubmissionDAO.inc.php:181
PKPSubmissionDAO\$tableName
$tableName
Definition: PKPSubmissionDAO.inc.php:32
PKPSubmissionDAO\getSortOption
getSortOption($sortBy, $sortDir)
Definition: PKPSubmissionDAO.inc.php:302
DAO\retrieveRange
& retrieveRange($sql, $params=false, $dbResultRange=null, $callHooks=true)
Definition: DAO.inc.php:176
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PKPSubmissionDAO\getDefaultSortOption
getDefaultSortOption()
Definition: PKPSubmissionDAO.inc.php:279
PKPSubmissionDAO\getExportable
getExportable($contextId, $pubIdType=null, $title=null, $author=null, $issueId=null, $pubIdSettingName=null, $pubIdSettingValue=null, $rangeInfo=null)
Definition: PKPSubmissionDAO.inc.php:339
PKPSubmissionDAO\getByContextId
getByContextId($contextId)
Definition: PKPSubmissionDAO.inc.php:232
DAO\retrieve
& retrieve($sql, $params=false, $callHooks=true)
Definition: DAO.inc.php:85
PKPSubmissionDAO\deleteByContextId
deleteByContextId($contextId)
Definition: PKPSubmissionDAO.inc.php:245
PKPSubmissionDAO\deleteById
deleteById($submissionId)
Definition: PKPSubmissionDAO.inc.php:109
SchemaDAO\getById
getById($objectId)
Definition: SchemaDAO.inc.php:61
PKPSubmissionDAO\$primaryKeyColumn
$primaryKeyColumn
Definition: PKPSubmissionDAO.inc.php:38
PKPSubmissionDAO\getSortSelectOptions
getSortSelectOptions()
Definition: PKPSubmissionDAO.inc.php:287
PKPSubmissionDAO\$cache
$cache
Definition: PKPSubmissionDAO.inc.php:25
PKPSubmissionDAO\$primaryTableColumns
$primaryTableColumns
Definition: PKPSubmissionDAO.inc.php:41
PKPSubmissionDAO\flushCache
flushCache()
Definition: PKPSubmissionDAO.inc.php:222
CacheManager\getManager
static getManager()
Definition: CacheManager.inc.php:27
PKPSubmissionDAO\_fromRow
_fromRow($row)
Definition: PKPSubmissionDAO.inc.php:88
Symfony\Polyfill\Php72
Definition: Php72.php:12
PKPSubmissionDAO\_getCache
_getCache()
Definition: PKPSubmissionDAO.inc.php:77
DAO\_getInsertId
_getInsertId($table='', $id='')
Definition: DAO.inc.php:255
PKPSubmissionDAO\getSortBy
getSortBy($sortOption)
Definition: PKPSubmissionDAO.inc.php:311
PKPSubmissionDAO\$schemaName
$schemaName
Definition: PKPSubmissionDAO.inc.php:29
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
PKPSubmissionDAO\resetPermissions
resetPermissions($contextId)
Definition: PKPSubmissionDAO.inc.php:256
PKPSubmissionDAO
Operations for retrieving and modifying Submission objects.
Definition: PKPSubmissionDAO.inc.php:24
PKPSubmissionDAO\getInsertId
getInsertId()
Definition: PKPSubmissionDAO.inc.php:215
PKPSubmissionDAO\$authorDao
$authorDao
Definition: PKPSubmissionDAO.inc.php:26
SchemaDAO
A base class for DAOs which rely on a json-schema file to define the data object.
Definition: SchemaDAO.inc.php:18
PKPSubmissionDAO\$settingsTableName
$settingsTableName
Definition: PKPSubmissionDAO.inc.php:35
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49
PKPSubmissionDAO\getSortDirection
getSortDirection($sortOption)
Definition: PKPSubmissionDAO.inc.php:321