diff --git a/lib/pkp b/lib/pkp index 6db0ed3e8e..906217d442 160000 --- a/lib/pkp +++ b/lib/pkp @@ -1 +1 @@ -Subproject commit 6db0ed3e8e2bb433ad7863b548120c4ccc2bf991 +Subproject commit 906217d442f50712df1210228e4caf7d7ba2fa48 diff --git a/pages/submission/SubmissionHandler.php b/pages/submission/SubmissionHandler.php index 7211461c43..95dc6d7556 100644 --- a/pages/submission/SubmissionHandler.php +++ b/pages/submission/SubmissionHandler.php @@ -27,6 +27,7 @@ use APP\section\Section; use APP\submission\Submission; use APP\template\TemplateManager; +use Illuminate\Support\Collection; use Illuminate\Support\LazyCollection; use PKP\components\forms\FormComponent; use PKP\components\forms\publication\Details; @@ -36,7 +37,10 @@ use PKP\facades\Locale; use PKP\pages\submission\PKPSubmissionHandler; use PKP\plugins\Hook; +use PKP\security\Role; use PKP\submission\GenreDAO; +use PKP\user\User; +use PKP\userGroup\UserGroup; class SubmissionHandler extends PKPSubmissionHandler { @@ -295,4 +299,33 @@ protected function getConfirmSubmitMessage(Submission $submission, Context $cont } return __('submission.wizard.confirmSubmit', ['context' => $context->getLocalizedName()]); } + + /** + * Get the user groups that a user can submit in + */ + protected function getSubmitUserGroups(Context $context, User $user): Collection + { + $userGroups = UserGroup::query() + ->withContextIds([$context->getId()]) + ->withUserIds([$user->getId()]) + ->withRoleIds([Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN, Role::ROLE_ID_AUTHOR]) + ->get(); + + // Users without a submitting role can submit as an + // author role that allows self registration + if ($userGroups->isEmpty()) { + Repo::userGroup()->assignUserToGroup( + $user->getId(), + Repo::userGroup()->getByRoleIds([Role::ROLE_ID_AUTHOR], $context->getId())->first()->id + ); + $defaultUserGroup = UserGroup::withContextIds([$context->getId()]) + ->withRoleIds([Role::ROLE_ID_AUTHOR]) + ->permitSelfRegistration(true) + ->first(); + + $userGroups = collect($defaultUserGroup ? [$defaultUserGroup->id => $defaultUserGroup] : []); + } + + return $userGroups; + } }