mirror of
https://github.com/standardebooks/web.git
synced 2025-07-06 06:40:33 -04:00
Don't allow the manager or reviewer to be the same as the ebook producer
This commit is contained in:
parent
133c968fc0
commit
ac56d2d896
3 changed files with 38 additions and 7 deletions
|
@ -281,9 +281,17 @@ final class Project{
|
||||||
* @throws Exceptions\UserNotFoundException If a manager or reviewer could not be auto-assigned.
|
* @throws Exceptions\UserNotFoundException If a manager or reviewer could not be auto-assigned.
|
||||||
*/
|
*/
|
||||||
public function Create(): void{
|
public function Create(): void{
|
||||||
|
// Is this `Project` being produced by one of the editors?
|
||||||
|
try{
|
||||||
|
$producer = User::GetByIdentifier($this->ProducerName);
|
||||||
|
}
|
||||||
|
catch(Exceptions\UserNotFoundException){
|
||||||
|
$producer = null;
|
||||||
|
}
|
||||||
|
|
||||||
if(!isset($this->ManagerUserId)){
|
if(!isset($this->ManagerUserId)){
|
||||||
try{
|
try{
|
||||||
$this->Manager = User::GetByAvailableForProjectAssignment(Enums\ProjectRoleType::Manager, null);
|
$this->Manager = User::GetByAvailableForProjectAssignment(Enums\ProjectRoleType::Manager, [$producer->UserId ?? 0]);
|
||||||
}
|
}
|
||||||
catch(Exceptions\UserNotFoundException){
|
catch(Exceptions\UserNotFoundException){
|
||||||
throw new Exceptions\UserNotFoundException('Could not auto-assign a suitable manager.');
|
throw new Exceptions\UserNotFoundException('Could not auto-assign a suitable manager.');
|
||||||
|
@ -294,7 +302,7 @@ final class Project{
|
||||||
|
|
||||||
if(!isset($this->ReviewerUserId)){
|
if(!isset($this->ReviewerUserId)){
|
||||||
try{
|
try{
|
||||||
$this->Reviewer = User::GetByAvailableForProjectAssignment(Enums\ProjectRoleType::Reviewer, $this->Manager->UserId);
|
$this->Reviewer = User::GetByAvailableForProjectAssignment(Enums\ProjectRoleType::Reviewer, [$this->Manager->UserId, $producer->UserId ?? 0]);
|
||||||
}
|
}
|
||||||
catch(Exceptions\UserNotFoundException){
|
catch(Exceptions\UserNotFoundException){
|
||||||
unset($this->Manager);
|
unset($this->Manager);
|
||||||
|
|
25
lib/User.php
25
lib/User.php
|
@ -401,18 +401,33 @@ class User{
|
||||||
', [], User::class);
|
', [], User::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<stdClass>
|
||||||
|
*/
|
||||||
|
public static function GetNamesByHasProducedProject(): array{
|
||||||
|
return Db::Query('
|
||||||
|
SELECT
|
||||||
|
distinct (ProducerName)
|
||||||
|
from Projects
|
||||||
|
order by ProducerName asc
|
||||||
|
', []);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a random `User` who is available to be assigned to the given role.
|
* Get a random `User` who is available to be assigned to the given role.
|
||||||
*
|
*
|
||||||
* @param Enums\ProjectRoleType $role The role to select for.
|
* @param Enums\ProjectRoleType $role The role to select for.
|
||||||
* @param int $excludedUserId Don't include this `UserId` when selecting; `null` to not exclude any users.
|
* @param array<int> $excludedUserIds Don't include these `UserId` when selecting.
|
||||||
*
|
*
|
||||||
* @throws Exceptions\UserNotFoundException If no `User` is available to be assigned to a `Project`.
|
* @throws Exceptions\UserNotFoundException If no `User` is available to be assigned to a `Project`.
|
||||||
*/
|
*/
|
||||||
public static function GetByAvailableForProjectAssignment(Enums\ProjectRoleType $role, ?int $excludedUserId): User{
|
public static function GetByAvailableForProjectAssignment(Enums\ProjectRoleType $role, array $excludedUserIds = []): User{
|
||||||
|
if(sizeof($excludedUserIds) == 0){
|
||||||
|
$excludedUserIds = [0];
|
||||||
|
}
|
||||||
|
|
||||||
// First, check if there are `User`s available for assignment.
|
// First, check if there are `User`s available for assignment.
|
||||||
// We use `coalesce()` to allow comparison in case `$excludedUserId` is `null` - there will never be a `UserId` of `0`.
|
$doUnassignedUsersExist = Db::QueryBool('SELECT exists (select * from ProjectUnassignedUsers where Role = ? and UserId not in ' . Db::CreateSetSql($excludedUserIds) . ')', array_merge([$role], $excludedUserIds));
|
||||||
$doUnassignedUsersExist = Db::QueryBool('SELECT exists (select * from ProjectUnassignedUsers where Role = ? and UserId != coalesce(?, 0))', [$role, $excludedUserId]);
|
|
||||||
|
|
||||||
// No unassigned `User`s left. Refill the list.
|
// No unassigned `User`s left. Refill the list.
|
||||||
if(!$doUnassignedUsersExist){
|
if(!$doUnassignedUsersExist){
|
||||||
|
@ -433,7 +448,7 @@ class User{
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now, select a random `User`.
|
// Now, select a random `User`.
|
||||||
$user = Db::Query('SELECT u.* from Users u inner join ProjectUnassignedUsers puu using (UserId) where Role = ? and UserId != coalesce(?, 0) order by rand()', [$role, $excludedUserId], User::class)[0] ?? throw new Exceptions\UserNotFoundException();
|
$user = Db::Query('SELECT u.* from Users u inner join ProjectUnassignedUsers puu using (UserId) where Role = ? and UserId not in ' . Db::CreateSetSql($excludedUserIds) . ' order by rand()', array_merge([$role], $excludedUserIds), User::class)[0] ?? throw new Exceptions\UserNotFoundException();
|
||||||
|
|
||||||
// Delete the `User` we just got from the unassigned users list.
|
// Delete the `User` we just got from the unassigned users list.
|
||||||
Db::Query('DELETE from ProjectUnassignedUsers where UserId = ? and Role = ?', [$user->UserId, $role]);
|
Db::Query('DELETE from ProjectUnassignedUsers where UserId = ? and Role = ?', [$user->UserId, $role]);
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
$project = $project ?? new Project();
|
$project = $project ?? new Project();
|
||||||
$managers = User::GetAllByCanManageProjects();
|
$managers = User::GetAllByCanManageProjects();
|
||||||
$reviewers = User::GetAllByCanReviewProjects();
|
$reviewers = User::GetAllByCanReviewProjects();
|
||||||
|
$pastProducers = User::GetNamesByHasProducedProject();
|
||||||
$areFieldsRequired = $areFieldsRequired ?? true;
|
$areFieldsRequired = $areFieldsRequired ?? true;
|
||||||
$isEditForm = $isEditForm ?? false;
|
$isEditForm = $isEditForm ?? false;
|
||||||
?>
|
?>
|
||||||
|
@ -9,11 +10,18 @@ $isEditForm = $isEditForm ?? false;
|
||||||
<input type="hidden" name="project-ebook-id" value="<?= $project->EbookId ?? '' ?>" />
|
<input type="hidden" name="project-ebook-id" value="<?= $project->EbookId ?? '' ?>" />
|
||||||
<? } ?>
|
<? } ?>
|
||||||
|
|
||||||
|
<datalist id="editors">
|
||||||
|
<? foreach($pastProducers as $row){ ?>
|
||||||
|
<option value="<?= Formatter::EscapeHtml($row->ProducerName) ?>"><?= Formatter::EscapeHtml($row->ProducerName) ?></option>
|
||||||
|
<? } ?>
|
||||||
|
</datalist>
|
||||||
|
|
||||||
<label class="icon user">
|
<label class="icon user">
|
||||||
<span>Producer name</span>
|
<span>Producer name</span>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="project-producer-name"
|
name="project-producer-name"
|
||||||
|
list="editors"
|
||||||
<? if($areFieldsRequired){ ?>
|
<? if($areFieldsRequired){ ?>
|
||||||
required="required"
|
required="required"
|
||||||
<? } ?>
|
<? } ?>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue