3
3
/**
4
4
* Copyright 2016-17, Afshin Sadeghi ([email protected] ) of the OSCOSS
5
5
* Project.
6
- * License: MIT . See LICENSE.md for details.
6
+ * License: GNU GPL v2 . See LICENSE.md for details.
7
7
*/
8
8
9
+ class MockObject extends stdClass {
10
+ // Used to create request mock object, to emulate real request. See below.
11
+ public function __call ($ closure , $ args ) {
12
+ return call_user_func_array ($ this ->{$ closure }->bindTo ($ this ),$ args );
13
+ }
14
+
15
+ public function __toString () {
16
+ return call_user_func ($ this ->{"__toString " }->bindTo ($ this ));
17
+ }
18
+ }
19
+
9
20
import ('lib.pkp.classes.plugins.GatewayPlugin ' );
10
21
11
22
class FidusWriterGatewayPlugin extends GatewayPlugin {
@@ -351,7 +362,9 @@ function authorSubmit() {
351
362
// Together with the 'fidusId', OJS will be able to create
352
363
// a link to send the user to FW to edit the file.
353
364
$ fidusUrl = $ this ->getPOSTPayloadVariable ("fidus_url " );
354
- $ submissionId = $ this ->createNewSubmission ($ title , $ journalId , $ fidusUrl , $ fidusId );
365
+ $ submission = $ this ->createNewSubmission ($ title , $ journalId , $ fidusUrl , $ fidusId );
366
+
367
+ $ submissionId = $ submission ->getId ();
355
368
356
369
// We also create a user for the author
357
370
$ emailAddress = $ this ->getPOSTPayloadVariable ("email " );
@@ -368,13 +381,217 @@ function authorSubmit() {
368
381
$ biography = $ this ->getPOSTPayloadVariable ("biography " );
369
382
$ authorId = $ this ->saveAuthor ($ submissionId , $ journalId , $ emailAddress , $ firstName , $ lastName , $ affiliation , $ country , $ authorUrl , $ biography );
370
383
371
- // Assign the user author to the stage
372
- $ stageAssignmentDao = DAORegistry::getDAO ('StageAssignmentDAO ' );
373
- $ authorUserGroupId = $ this ->getAuthorUserGroupId ($ journalId );
384
+ // Create a fake request object as the real request does not contain the required data.
385
+ // $request is required in the following code which comes from different parts of OJS.
386
+
387
+ $ request = new MockObject ();
388
+ $ request ->journalId = $ journalId ;
389
+ $ request ->user = $ user ;
390
+ $ application = PKPApplication::getApplication ();
391
+ $ request ->origRequest = $ application ->getRequest ();
392
+
393
+ $ request ->getContext = function () {
394
+ $ contextDao = Application::getContextDAO ();
395
+ return $ contextDao ->getById ($ this ->journalId );
396
+ };
397
+
398
+ $ request ->getUser = function () {
399
+ return $ this ->user ;
400
+ };
401
+
402
+ $ request ->getRouter = function () {
403
+ return $ this ->origRequest ->getRouter ();
404
+ };
405
+
406
+ $ request ->isPathInfoEnabled = function () {
407
+ return $ this ->origRequest ->isPathInfoEnabled ();
408
+ };
409
+
410
+ $ request ->isRestfulUrlsEnabled = function () {
411
+ return $ this ->origRequest ->isRestfulUrlsEnabled ();
412
+ };
413
+
414
+ $ request ->getBaseUrl = function () {
415
+ return $ this ->origRequest ->getBaseUrl ();
416
+ };
417
+
418
+ $ request ->getRemoteAddr = function () {
419
+ return $ this ->origRequest ->getRemoteAddr ();
420
+ };
421
+
422
+
423
+ // The following has been adapted from PKPSubmissionSubmitStep4Form
424
+
425
+ // Manager and assistant roles -- for each assigned to this
426
+ // stage in setup, iff there is only one user for the group,
427
+ // automatically assign the user to the stage.
428
+ $ stageAssignmentDao = DAORegistry::getDAO ('StageAssignmentDAO ' );
429
+ $ userGroupDao = DAORegistry::getDAO ('UserGroupDAO ' );
430
+ $ submissionStageGroups = $ userGroupDao ->getUserGroupsByStage ($ journalId , WORKFLOW_STAGE_ID_SUBMISSION );
431
+ $ managerFound = false ;
432
+ while ($ userGroup = $ submissionStageGroups ->next ()) {
433
+ // Only handle manager and assistant roles
434
+ if (!in_array ($ userGroup ->getRoleId (), array (ROLE_ID_MANAGER , ROLE_ID_ASSISTANT ))) continue ;
435
+
436
+ $ users = $ userGroupDao ->getUsersById ($ userGroup ->getId (), $ journalId );
437
+ if ($ users ->getCount () == 1 ) {
438
+ $ user = $ users ->next ();
439
+ $ stageAssignmentDao ->build ($ submissionId , $ userGroup ->getId (), $ user ->getId (), $ userGroup ->getRecommendOnly ());
440
+ if ($ userGroup ->getRoleId () == ROLE_ID_MANAGER ) $ managerFound = true ;
441
+ }
442
+ }
443
+
444
+ // Assign the user author to the stage
445
+ $ authorUserGroupId = $ this ->getAuthorUserGroupId ($ journalId );
374
446
if ($ authorUserGroupId ) {
375
447
$ stageAssignmentDao ->build ($ submissionId , $ authorUserGroupId , $ userId );
376
448
}
377
449
450
+
451
+
452
+ // Assign sub editors for that section
453
+ $ submissionSubEditorFound = false ;
454
+ $ subEditorsDao = DAORegistry::getDAO ('SubEditorsDAO ' );
455
+ $ subEditors = $ subEditorsDao ->getBySectionId ($ submission ->getSectionId (), $ journalId );
456
+ foreach ($ subEditors as $ subEditor ) {
457
+ $ userGroups = $ userGroupDao ->getByUserId ($ subEditor ->getId (), $ journalId );
458
+ while ($ userGroup = $ userGroups ->next ()) {
459
+ if ($ userGroup ->getRoleId () != ROLE_ID_SUB_EDITOR ) continue ;
460
+ $ stageAssignmentDao ->build ($ submissionId , $ userGroup ->getId (), $ subEditor ->getId (), $ userGroup ->getRecommendOnly ());
461
+ // If we assign a stage assignment in the Submission stage to a sub editor, make note.
462
+ if ($ userGroupDao ->userGroupAssignedToStage ($ userGroup ->getId (), WORKFLOW_STAGE_ID_SUBMISSION )) {
463
+ $ submissionSubEditorFound = true ;
464
+ }
465
+ }
466
+ }
467
+
468
+ // Update assignment notifications
469
+ import ('classes.workflow.EditorDecisionActionsManager ' );
470
+ $ notificationManager = new NotificationManager ();
471
+ $ notificationManager ->updateNotification (
472
+ $ request ,
473
+ EditorDecisionActionsManager::getStageNotifications (),
474
+ null ,
475
+ ASSOC_TYPE_SUBMISSION ,
476
+ $ journalId
477
+ );
478
+
479
+ // Send a notification to associated users if an editor needs assigning
480
+ if (!$ managerFound && !$ submissionSubEditorFound ) {
481
+ $ roleDao = DAORegistry::getDAO ('RoleDAO ' ); /* @var $roleDao RoleDAO */
482
+
483
+ // Get the managers.
484
+ $ managers = $ roleDao ->getUsersByRoleId (ROLE_ID_MANAGER , $ journalId );
485
+
486
+ $ managersArray = $ managers ->toAssociativeArray ();
487
+
488
+ $ allUserIds = array_keys ($ managersArray );
489
+ foreach ($ allUserIds as $ userId ) {
490
+ $ notificationManager ->createNotification (
491
+ $ request , $ userId , NOTIFICATION_TYPE_SUBMISSION_SUBMITTED ,
492
+ $ journalId , ASSOC_TYPE_SUBMISSION , $ submissionId
493
+ );
494
+
495
+ // Add TASK notification indicating that a submission is unassigned
496
+ $ notificationManager ->createNotification (
497
+ $ request ,
498
+ $ userId ,
499
+ NOTIFICATION_TYPE_EDITOR_ASSIGNMENT_REQUIRED ,
500
+ $ journalId ,
501
+ ASSOC_TYPE_SUBMISSION ,
502
+ $ submissionId ,
503
+ NOTIFICATION_LEVEL_TASK
504
+ );
505
+ }
506
+ }
507
+
508
+ $ notificationManager ->updateNotification (
509
+ $ request ,
510
+ array (NOTIFICATION_TYPE_APPROVE_SUBMISSION ),
511
+ null ,
512
+ ASSOC_TYPE_SUBMISSION ,
513
+ $ submissionId
514
+ );
515
+
516
+ // End adaption from PKPSubmissionSubmitStep4Form
517
+
518
+ // The following has been adapted from SubmissionSubmitStep4Form
519
+
520
+ // Send author notification email
521
+ import ('classes.mail.ArticleMailTemplate ' );
522
+ $ context = $ request ->getContext ();
523
+ $ router = $ request ->getRouter ();
524
+ $ mail = new ArticleMailTemplate ($ submission , 'SUBMISSION_ACK ' , null , null , false );
525
+ $ mail ->setContext ($ context );
526
+ $ authorMail = new ArticleMailTemplate ($ submission , 'SUBMISSION_ACK_NOT_USER ' , null , null , false );
527
+ $ authorMail ->setContext ($ context );
528
+
529
+ if ($ mail ->isEnabled ()) {
530
+ // submission ack emails should be from the contact.
531
+ $ mail ->setFrom ($ context ->getSetting ('contactEmail ' ), $ context ->getSetting ('contactName ' ));
532
+ $ authorMail ->setFrom ($ context ->getSetting ('contactEmail ' ), $ context ->getSetting ('contactName ' ));
533
+
534
+ $ user = $ request ->getUser ();
535
+ $ primaryAuthor = $ submission ->getPrimaryAuthor ();
536
+ if (!isset ($ primaryAuthor )) {
537
+ $ authors = $ submission ->getAuthors ();
538
+ $ primaryAuthor = $ authors [0 ];
539
+ }
540
+ $ mail ->addRecipient ($ user ->getEmail (), $ user ->getFullName ());
541
+ // Add primary contact and e-mail address as specified in the journal submission settings
542
+ if ($ context ->getSetting ('copySubmissionAckPrimaryContact ' )) {
543
+ $ mail ->addBcc (
544
+ $ context ->getSetting ('contactEmail ' ),
545
+ $ context ->getSetting ('contactName ' )
546
+ );
547
+ }
548
+ if ($ copyAddress = $ context ->getSetting ('copySubmissionAckAddress ' )) {
549
+ $ mail ->addBcc ($ copyAddress );
550
+ }
551
+
552
+ if ($ user ->getEmail () != $ primaryAuthor ->getEmail ()) {
553
+ $ authorMail ->addRecipient ($ primaryAuthor ->getEmail (), $ primaryAuthor ->getFullName ());
554
+ }
555
+
556
+ $ assignedAuthors = $ submission ->getAuthors ();
557
+
558
+ foreach ($ assignedAuthors as $ author ) {
559
+ $ authorEmail = $ author ->getEmail ();
560
+ // only add the author email if they have not already been added as the primary author
561
+ // or user creating the submission.
562
+ if ($ authorEmail != $ primaryAuthor ->getEmail () && $ authorEmail != $ user ->getEmail ()) {
563
+ $ authorMail ->addRecipient ($ author ->getEmail (), $ author ->getFullName ());
564
+ }
565
+ }
566
+ $ mail ->bccAssignedSubEditors ($ submission ->getId (), WORKFLOW_STAGE_ID_SUBMISSION );
567
+
568
+ $ mail ->assignParams (array (
569
+ 'authorName ' => $ user ->getFullName (),
570
+ 'authorUsername ' => $ user ->getUsername (),
571
+ 'editorialContactSignature ' => $ context ->getSetting ('contactName ' ),
572
+ 'submissionUrl ' => $ router ->url ($ request , null , 'authorDashboard ' , 'submission ' , $ submission ->getId ()),
573
+ ));
574
+
575
+ $ authorMail ->assignParams (array (
576
+ 'submitterName ' => $ user ->getFullName (),
577
+ 'editorialContactSignature ' => $ context ->getSetting ('contactName ' ),
578
+ ));
579
+
580
+ $ mail ->send ($ request );
581
+
582
+ $ recipients = $ authorMail ->getRecipients ();
583
+ if (!empty ($ recipients )) {
584
+ $ authorMail ->send ($ request );
585
+ }
586
+ }
587
+
588
+ // Log submission.
589
+ import ('classes.log.SubmissionEventLogEntry ' ); // Constants
590
+ import ('lib.pkp.classes.log.SubmissionLog ' );
591
+ SubmissionLog::logEvent ($ request , $ submission , SUBMISSION_LOG_SUBMISSION_SUBMIT , 'submission.event.submissionSubmitted ' );
592
+
593
+ // End adaption from SubmissionSubmitStep4Form
594
+
378
595
}
379
596
380
597
$ resultArray = array (
@@ -394,6 +611,7 @@ function createNewSubmission($title, $journalId, $fidusUrl, $fidusId) {
394
611
$ submissionDao = Application::getSubmissionDAO ();
395
612
$ submission = $ submissionDao ->newDataObject ();
396
613
$ submission ->setStatus (STATUS_QUEUED );
614
+ $ submission ->stampStatusModified ();
397
615
$ submission ->setSubmissionProgress (0 );
398
616
// $journalId in OJS is same as $contextId in PKP lib.
399
617
$ submission ->setContextId ($ journalId );
@@ -417,13 +635,14 @@ function createNewSubmission($title, $journalId, $fidusUrl, $fidusId) {
417
635
$ submission ->setData ("sectionId " , $ sectionId );
418
636
$ submission ->setTitle ($ title , $ locale );
419
637
$ submission ->setCleanTitle ($ title , $ locale );
638
+
420
639
// Set fidus writer related fields.
421
640
$ submission ->setData ("fidusUrl " , $ fidusUrl );
422
641
$ submission ->setData ("fidusId " , $ fidusId );
423
642
// Insert the submission
424
- $ submissionId = $ submissionDao ->insertObject ($ submission );
643
+ $ submissionDao ->insertObject ($ submission );
425
644
426
- return $ submissionId ;
645
+ return $ submission ;
427
646
}
428
647
429
648
/**
0 commit comments