-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathAssignmentPermissionPolicy.php
More file actions
142 lines (121 loc) · 4.62 KB
/
AssignmentPermissionPolicy.php
File metadata and controls
142 lines (121 loc) · 4.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php
namespace App\Security\Policies;
use App\Model\Entity\Assignment;
use App\Model\Entity\GroupMembership;
use App\Security\Identity;
use App\Helpers\SubmissionConfigHelper;
use DateTime;
class AssignmentPermissionPolicy extends BasePermissionPolicy implements IPermissionPolicy
{
/** @var SubmissionConfigHelper */
private $submissionHelper;
public function __construct(SubmissionConfigHelper $submissionHelper)
{
$this->submissionHelper = $submissionHelper;
}
public function acceptsSubmissions(Identity $identity, Assignment $assignment)
{
return !$this->submissionHelper->isLocked();
}
public function getAssociatedClass()
{
return Assignment::class;
}
public function isPublic(Identity $identity, Assignment $assignment)
{
return $assignment->isPublic();
}
public function isVisible(Identity $identity, Assignment $assignment)
{
$user = $identity->getUserData();
if ($user === null) {
return false;
}
$now = new DateTime();
$group = $assignment->getGroup();
if (!$group) {
return false;
}
$now = new DateTime();
$visibleFromOk = $assignment->getVisibleFrom() === null || $assignment->getVisibleFrom() <= $now;
// additional test for exam assignments: there is no pending exam or the student is already locked
return $assignment->isPublic() && $visibleFromOk && (!$assignment->isExam() || !$group->hasExamPeriodSet($now)
|| $now < $group->getExamBegin() || $user->getGroupLock()?->getId() === $group->getId());
}
public function isInActiveGroup(Identity $identity, Assignment $assignment)
{
$group = $assignment->getGroup();
return $group && !$group->isArchived(); // active = not deleted and not archived
}
public function isAssignee(Identity $identity, Assignment $assignment)
{
$user = $identity->getUserData();
if ($user === null) {
return false;
}
return $assignment->getGroup() && $assignment->getGroup()->isMemberOf($user);
}
public function isSupervisorOrAdmin(Identity $identity, Assignment $assignment)
{
return $this->checkMinimalMembership(
$identity->getUserData(),
$assignment->getGroup(),
GroupMembership::TYPE_SUPERVISOR
);
}
public function isObserverOrBetter(Identity $identity, Assignment $assignment)
{
return $this->checkMinimalMembership(
$identity->getUserData(),
$assignment->getGroup(),
GroupMembership::TYPE_OBSERVER
);
}
/**
* Current user is either not locked at all, or locked to this group (where the assignment is).
*/
public function userIsNotLockedElsewhere(Identity $identity, Assignment $assignment): bool
{
$user = $identity->getUserData();
$group = $assignment->getGroup();
if ($user === null || $group === null) {
return false;
}
return !$user->isGroupLocked() || $user->getGroupLock()->getId() === $group->getId();
}
/**
* Current user is either not locked at all, or locked to this group (where the assignment is),
* or the current lock is not strict.
*/
public function userIsNotLockedElsewhereStrictly(Identity $identity, Assignment $assignment): bool
{
$user = $identity->getUserData();
$group = $assignment->getGroup();
if ($user === null || $group === null) {
return false;
}
return !$user->isGroupLocked() || $user->getGroupLock()->getId() === $group->getId()
|| !$user->isGroupLockStrict();
}
/**
* The assignment is not in an exam group, or it is still before/already after the exam.
*/
public function isExamNotInProgress(Identity $identity, Assignment $assignment): bool
{
$group = $assignment->getGroup();
$now = new DateTime();
return $group && (!$group->hasExamPeriodSet($now) ||
$now < $group->getExamBegin() || $group->getExamEnd() < $now);
}
/**
* The assignment is for an exam in progress and the student is already locked in the group.
*/
public function isExamInProgressAndStudentLocked(Identity $identity, Assignment $assignment): bool
{
$user = $identity->getUserData();
$group = $assignment->getGroup();
$now = new DateTime();
return $group && $group->hasExamPeriodSet($now) && $group->getExamBegin() <= $now
&& $now <= $group->getExamEnd() && $user->getGroupLock()?->getId() === $group->getId();
}
}