aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorViktoria Wiebe <vwiebe@uni-osnabrueck.de>2024-10-01 14:07:24 +0000
committerRon Lucke <lucke@elan-ev.de>2024-10-01 14:07:24 +0000
commit332f5ef297815502adbc79df6aa4962688a9aebc (patch)
treef869d6ef1666f5a43e5ead85b19c8804dcff5d80 /lib
parent7a924cef24ce44013e6da5295651d02c9f88ec38 (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.php2
-rw-r--r--lib/classes/JsonApi/Routes/Courseware/TasksUpdate.php4
-rw-r--r--lib/classes/JsonApi/Schemas/Courseware/Task.php1
-rw-r--r--lib/models/Courseware/StructuralElement.php18
-rw-r--r--lib/models/Courseware/Task.php22
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)]);