diff options
| author | Viktoria Wiebe <vwiebe@uni-osnabrueck.de> | 2024-10-01 14:07:24 +0000 |
|---|---|---|
| committer | Ron Lucke <lucke@elan-ev.de> | 2024-10-01 14:07:24 +0000 |
| commit | 332f5ef297815502adbc79df6aa4962688a9aebc (patch) | |
| tree | f869d6ef1666f5a43e5ead85b19c8804dcff5d80 /lib | |
| parent | 7a924cef24ce44013e6da5295651d02c9f88ec38 (diff) | |
Tic 2807 - add toggling task visibility functionality to student task dashboard
Closes #2807
Merge request studip/studip!3096
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/classes/JsonApi/Routes/Courseware/Authority.php | 2 | ||||
| -rw-r--r-- | lib/classes/JsonApi/Routes/Courseware/TasksUpdate.php | 4 | ||||
| -rw-r--r-- | lib/classes/JsonApi/Schemas/Courseware/Task.php | 1 | ||||
| -rw-r--r-- | lib/models/Courseware/StructuralElement.php | 18 | ||||
| -rw-r--r-- | lib/models/Courseware/Task.php | 22 |
5 files changed, 46 insertions, 1 deletions
diff --git a/lib/classes/JsonApi/Routes/Courseware/Authority.php b/lib/classes/JsonApi/Routes/Courseware/Authority.php index 2acf83e..7ed609f 100644 --- a/lib/classes/JsonApi/Routes/Courseware/Authority.php +++ b/lib/classes/JsonApi/Routes/Courseware/Authority.php @@ -324,7 +324,7 @@ class Authority public static function canShowTask(User $user, Task $resource): bool { - return self::canUpdateTask($user, $resource); + return self::canUpdateTask($user, $resource) || $resource->visible; } public static function canIndexTasks(User $user): bool diff --git a/lib/classes/JsonApi/Routes/Courseware/TasksUpdate.php b/lib/classes/JsonApi/Routes/Courseware/TasksUpdate.php index 33b51ad..dd9f648 100644 --- a/lib/classes/JsonApi/Routes/Courseware/TasksUpdate.php +++ b/lib/classes/JsonApi/Routes/Courseware/TasksUpdate.php @@ -81,6 +81,10 @@ class TasksUpdate extends JsonApiController $resource->requestRenewal(); } + if (self::arrayHas($json, 'data.attributes.visible')) { + $resource->setVisibility(self::arrayGet($json, 'data.attributes.visible')); + } + return $resource; } diff --git a/lib/classes/JsonApi/Schemas/Courseware/Task.php b/lib/classes/JsonApi/Schemas/Courseware/Task.php index 81c7a0d..c612333 100644 --- a/lib/classes/JsonApi/Schemas/Courseware/Task.php +++ b/lib/classes/JsonApi/Schemas/Courseware/Task.php @@ -36,6 +36,7 @@ class Task extends SchemaProvider 'submitted' => (bool) $resource['submitted'], 'renewal' => empty($resource['renewal']) ? null : (string) $resource['renewal'], 'renewal-date' => date('c', $resource['renewal_date']), + 'visible' => (bool) $resource['visible'], 'mkdate' => date('c', $resource['mkdate']), 'chdate' => date('c', $resource['chdate']), ]; diff --git a/lib/models/Courseware/StructuralElement.php b/lib/models/Courseware/StructuralElement.php index e72cc4f..8e06a39 100644 --- a/lib/models/Courseware/StructuralElement.php +++ b/lib/models/Courseware/StructuralElement.php @@ -391,6 +391,19 @@ class StructuralElement extends \SimpleORMap implements \PrivacyObject, \Feedbac return true; } + if ($task->isSubmitted()) { + if ($task->visible) { + return true; + } + $solvers = $task->getTaskGroup()->getSolvers(); + foreach ($solvers as $solver) { + if ($solver->id === $user->id) { + return true; + } + } + return false; + } + return $task->userIsASolver($user); } @@ -1240,4 +1253,9 @@ SQL; [$this->id, self::class] ); } + + public function isTaskVisible(): bool + { + return $this->payload['task-visibility']; + } } diff --git a/lib/models/Courseware/Task.php b/lib/models/Courseware/Task.php index d409676..2a1a28d 100644 --- a/lib/models/Courseware/Task.php +++ b/lib/models/Courseware/Task.php @@ -21,6 +21,7 @@ use User; * @property int $submitted database column * @property string|null $renewal database column * @property int $renewal_date database column + * @property int $visible database column * @property int|null $feedback_id database column * @property int $mkdate database column * @property int $chdate database column @@ -90,6 +91,11 @@ class Task extends \SimpleORMap parent::configure($config); } + public function getTaskGroup(): TaskGroup + { + return $this->task_group; + } + /** * Returns the structural element of this task. * This structural element and all its children are part of the task. @@ -130,6 +136,16 @@ class Task extends \SimpleORMap if ($this->solver_id === $user->id) { return true; } + + if ($this->visible) { + $solvers = $this->getTaskGroup()->getSolvers(); + foreach ($solvers as $solver) { + if ($solver->id === $user->id) { + return true; + } + } + } + break; case 'group': @@ -235,6 +251,12 @@ class Task extends \SimpleORMap $this->store(); } + public function setVisibility(bool $visibility): void + { + $this->visible = (int) $visibility; + $this->store(); + } + private function getStructuralElementProgress(StructuralElement $structural_element): float { $containers = Container::findBySQL('structural_element_id = ?', [intval($structural_element->id)]); |
