19 use \DAOResultFactory;
22 use \PKP\Services\interfaces\EntityPropertyInterface;
23 use \PKP\Services\interfaces\EntityReadInterface;
24 use \PKP\Services\QueryBuilders\PKPUserQueryBuilder;
26 class PKPUserService implements EntityPropertyInterface, EntityReadInterface {
31 public function get($userId) {
33 return $userDao->getById($userId);
73 if (isset($args[
'count'])) {
74 import(
'lib.pkp.classes.db.DBResultRange');
75 $range = new \DBResultRange($args[
'count'],
null, isset($args[
'offset']) ? $args[
'offset'] : 0);
79 if (isset($args[
'count'])) unset($args[
'count']);
80 if (isset($args[
'offset'])) unset($args[
'offset']);
83 $result = $userDao->retrieveRange($userListQO->toSql(), $userListQO->getBindings(), $range);
84 $queryResults =
new DAOResultFactory($result, $userDao,
'_returnUserFromRowWithData');
86 return $queryResults->toIterator();
94 if (isset($args[
'count'])) unset($args[
'count']);
95 if (isset($args[
'offset'])) unset($args[
'offset']);
104 $defaultArgs = array(
105 'contextId' => CONTEXT_ID_NONE,
107 'orderDirection' =>
'DESC',
109 'assignedToSubmission' =>
null,
110 'assignedToSubmissionStage' =>
null,
111 'registeredAfter' =>
'',
112 'registeredBefore' =>
'',
113 'includeUsers' =>
null,
114 'excludeUsers' =>
null,
115 'status' =>
'active',
116 'searchPhrase' =>
null,
119 $args = array_merge($defaultArgs, $args);
123 ->filterByContext($args[
'contextId'])
124 ->orderBy($args[
'orderBy'], $args[
'orderDirection'])
125 ->filterByRoleIds($args[
'roleIds'])
126 ->assignedToSubmission($args[
'assignedToSubmission'], $args[
'assignedToSubmissionStage'])
127 ->registeredAfter($args[
'registeredAfter'])
128 ->registeredBefore($args[
'registeredBefore'])
129 ->includeUsers($args[
'includeUsers'])
130 ->excludeUsers($args[
'excludeUsers'])
131 ->filterByStatus($args[
'status'])
132 ->searchPhrase($args[
'searchPhrase']);
134 if (isset($args[
'count'])) {
135 $userListQB->limitTo($args[
'count']);
138 if (isset($args[
'offset'])) {
139 $userListQB->offsetBy($args[
'count']);
142 if (isset($args[
'assignedToSection'])) {
143 $userListQB->assignedToSection($args[
'assignedToSection']);
146 if (isset($args[
'assignedToCategory'])) {
147 $userListQB->assignedToCategory($args[
'assignedToCategory']);
164 if (isset($args[
'count'])) {
165 import(
'lib.pkp.classes.db.DBResultRange');
166 $range = new \DBResultRange($args[
'count'],
null, isset($args[
'offset']) ? $args[
'offset'] : 0);
170 if (isset($args[
'count'])) unset($args[
'count']);
171 if (isset($args[
'offset'])) unset($args[
'offset']);
174 $result = $userDao->retrieveRange($userListQO->toSql(), $userListQO->getBindings(), $range);
175 $queryResults =
new DAOResultFactory($result, $userDao,
'_returnUserFromRowWithReviewerStats');
177 return $queryResults->toIterator();
188 if (isset($args[
'count'])) unset($args[
'count']);
189 if (isset($args[
'offset'])) unset($args[
'offset']);
201 $defaultArgs = array(
202 'contextId' => CONTEXT_ID_NONE,
203 'reviewStage' =>
null,
204 'reviewsCompleted' =>
null,
205 'reviewsActive' =>
null,
206 'daysSinceLastAssignment' =>
null,
207 'averageCompletion' =>
null,
208 'reviewerRating' =>
null,
211 $args = array_merge($defaultArgs, $args);
212 $args[
'roleIds'] = [ROLE_ID_REVIEWER];
216 ->getReviewerData(
true)
217 ->filterByReviewStage($args[
'reviewStage'])
218 ->filterByReviewerRating($args[
'reviewerRating'])
219 ->filterByReviewsCompleted($args[
'reviewsCompleted'])
220 ->filterByReviewsActive($args[
'reviewsActive'])
221 ->filterByDaysSinceLastAssignment($args[
'daysSinceLastAssignment'])
222 ->filterByAverageCompletion($args[
'averageCompletion']);
226 return $reviewerListQB;
233 $request = $args[
'request'];
234 $context = $request->getContext();
235 $dispatcher = $request->getDispatcher();
238 foreach ($props as $prop) {
241 $values[$prop] = (int) $user->getId();
244 $values[$prop] = $user->getUserName();
247 $values[$prop] = $user->getFullName();
250 $values[$prop] = $user->getGivenName(
null);
253 $values[$prop] = $user->getFamilyName(
null);
256 $values[$prop] = $user->getAffiliation(
null);
259 $values[$prop] = $user->getCountry();
262 $values[$prop] = $user->getUrl();
265 $values[$prop] = $user->getEmail();
268 $values[$prop] = $user->getOrcid();
271 $values[$prop] = $user->getBiography(
null);
274 $values[$prop] = $user->getSignature(
null);
277 $values[$prop] = $user->getAuthId();
280 $values[$prop] = $user->getAuthStr();
283 $values[$prop] = $user->getPhone();
285 case 'mailingAddress':
286 $values[$prop] = $user->getMailingAddress();
288 case 'billingAddress':
289 $values[$prop] = $user->getBillingAddress();
293 $values[$prop] = $user->getGossip();
296 case 'reviewsActive':
297 $values[$prop] = $user->getData(
'incompleteCount');
299 case 'reviewsCompleted':
300 $values[$prop] = $user->getData(
'completeCount');
302 case 'reviewsDeclined':
303 $values[$prop] = $user->getData(
'declinedCount');
305 case 'reviewsCancelled':
306 $values[$prop] = $user->getData(
'cancelledCount');
308 case 'averageReviewCompletionDays':
309 $values[$prop] = $user->getData(
'averageTime');
311 case 'dateLastReviewAssignment':
312 $values[$prop] = $user->getData(
'lastAssigned');
314 case 'reviewerRating':
315 $values[$prop] = $user->getData(
'reviewerRating');
318 $values[$prop] = (boolean) $user->getDisabled();
320 case 'disabledReason':
321 $values[$prop] = $user->getDisabledReason();
323 case 'dateRegistered':
324 $values[$prop] = $user->getDateRegistered();
326 case 'dateValidated':
327 $values[$prop] = $user->getDateValidated();
329 case 'dateLastLogin':
330 $values[$prop] = $user->getDateLastLogin();
332 case 'mustChangePassword':
333 $values[$prop] = (boolean) $user->getMustChangePassword();
336 $values[$prop] =
null;
337 if (!empty($args[
'slimRequest'])) {
338 $route = $args[
'slimRequest']->getAttribute(
'route');
339 $arguments = $route->getArguments();
340 $values[$prop] = $dispatcher->url(
343 $arguments[
'contextPath'],
344 'users/' . $user->getId()
349 $values[$prop] =
null;
351 import(
'lib.pkp.classes.security.UserGroupDAO');
353 $userGroups = $userGroupDao->getByUserId($user->getId(), $context->getId());
354 $values[$prop] = array();
355 while ($userGroup = $userGroups->next()) {
356 $values[$prop][] = array(
357 'id' => (
int) $userGroup->getId(),
358 'name' => $userGroup->getName(
null),
359 'abbrev' => $userGroup->getAbbrev(
null),
360 'roleId' => (
int) $userGroup->getRoleId(),
361 'showTitle' => (
boolean) $userGroup->getShowTitle(),
362 'permitSelfRegistration' => (
boolean) $userGroup->getPermitSelfRegistration(),
363 'permitMetadataEdit' => (
boolean) $userGroup->getPermitMetadataEdit(),
364 'recommendOnly' => (
boolean) $userGroup->getRecommendOnly(),
372 import(
'lib.pkp.classes.user.InterestDAO');
374 $interestEntryIds = $interestDao->getUserInterestIds($user->getId());
375 if (!empty($interestEntryIds)) {
376 import(
'lib.pkp.classes.user.InterestEntryDAO');
378 $results = $interestEntryDao->getByIds($interestEntryIds);
379 $values[$prop] = array();
380 while ($interest = $results->next()) {
381 $values[$prop][] = array(
382 'id' => (
int) $interest->getId(),
383 'interest' => $interest->getInterest(),
391 $values =
Services::get(
'schema')->addMissingMultilingualValues(
SCHEMA_USER, $values, $context->getSupportedFormLocales());
406 'id',
'_href',
'userName',
'email',
'fullName',
'orcid',
'groups',
'disabled',
409 \HookRegistry::call(
'User::getProperties::summaryProperties', array(&$props, $user, $args));
419 'id',
'userName',
'fullName',
'givenName',
'familyName',
'affiliation',
'country',
'email',
'url',
420 'orcid',
'groups',
'interests',
'biography',
'signature',
'authId',
'authString',
'phone',
421 'mailingAddress',
'billingAddress',
'gossip',
'disabled',
'disabledReason',
422 'dateRegistered',
'dateValidated',
'dateLastLogin',
'mustChangePassword',
440 'id',
'_href',
'userName',
'fullName',
'affiliation',
'biography',
'groups',
'interests',
'gossip',
441 'reviewsActive',
'reviewsCompleted',
'reviewsDeclined',
'reviewsCancelled',
'averageReviewCompletionDays',
442 'dateLastReviewAssignment',
'reviewerRating',
'orcid',
'disabled',
445 \HookRegistry::call(
'User::getProperties::reviewerSummaryProperties', array(&$props, $user, $args));
460 return $roleDao->userHasRole($contextId, $userId, $roleIds);
471 $context = $request->getContext();
472 $contextId = $context ? $context->getId() : CONTEXT_ID_NONE;
473 $currentUser = $request->getUser();
481 if ($currentUser->getId() === $userId) {
486 if (!$this->
userHasRole($userId, ROLE_ID_REVIEWER, $contextId)) {
491 if (!$this->
userHasRole($currentUser->getId(), array(ROLE_ID_MANAGER, ROLE_ID_SITE_ADMIN, ROLE_ID_SUB_EDITOR), $contextId)) {
514 if (array_key_exists($stageId, $userAccessibleStages)
515 && !empty(array_intersect($workflowRoles, $userAccessibleStages[$stageId]))) {
518 if (empty($userAccessibleStages) && in_array(ROLE_ID_MANAGER, $userRoles)) {
535 $stageAssignmentsResult = $stageAssignmentDao->getBySubmissionAndUserIdAndStageId($submission->getId(), $userId, $stageId);
537 $accessibleStageRoles = array();
540 if ($stageAssignmentsResult->wasEmpty()) {
542 $userRoles = $roleDao->getByUserId($userId, $contextId);
543 foreach ($userRoles as $userRole) {
544 if (in_array($userRole->getId(), array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER))) {
545 $accessibleStageRoles[] = $userRole->getId();
548 $accessibleStageRoles = array_unique($accessibleStageRoles);
552 while ($stageAssignment = $stageAssignmentsResult->next()) {
553 $userGroup = $userGroupDao->getById($stageAssignment->getUserGroupId(), $contextId);
554 $accessibleStageRoles[] = $userGroup->getRoleId();
556 $accessibleStageRoles = array_unique($accessibleStageRoles);
559 return $accessibleStageRoles;
569 return $qb->getQuery()->get()->count();
583 if (isset($args[
'roleIds'])) {
584 unset($args[
'roleIds']);
590 'name' =>
'stats.allUsers',
591 'value' => $this->
count($args),
598 if (!empty($args[
'contextId'])) {
599 unset($roleNames[ROLE_ID_SITE_ADMIN]);
602 foreach ($roleNames as $roleId => $roleName) {
606 'value' => $this->
count(array_merge($args, [
'roleIds' => $roleId])),