42 $this->db =
$DIC->database();
43 $this->
user = $DIC->user();
44 $this->assignment = $a_assignment;
45 $this->assignment_id = $a_assignment->
getId();
47 $this->domain =
$DIC->exercise()->internal()->domain();
54 $set =
$ilDB->query(
"SELECT count(*) cnt" .
55 " FROM exc_assignment_peer" .
56 " WHERE ass_id = " .
$ilDB->quote($this->assignment_id,
"integer"));
57 $cnt =
$ilDB->fetchAssoc($set);
58 return (
bool) $cnt[
"cnt"];
63 $set = $this->db->queryF(
64 "SELECT id FROM exc_assignment_peer " .
65 " WHERE ass_id = %s AND giver_id = %s AND peer_id = %s",
66 [
"integer",
"integer",
"integer"],
67 [$this->assignment_id, $giver_id, $peer_id]
69 $rec = $this->db->fetchAssoc($set);
70 return $rec[
"id"] ?? 0;
78 return $this->domain->submission($this->assignment_id)->getUsersWithSubmission();
86 if (!$this->assignment->afterDeadlineStrict()) {
95 foreach ($user_ids as $rater_id) {
96 foreach ($distribution->getPeersOfRater($rater_id) as $peer_id) {
97 $next_id =
$ilDB->nextId(
"exc_assignment_peer");
98 $ilDB->manipulate(
"INSERT INTO exc_assignment_peer" .
99 " (id, ass_id, giver_id, peer_id, migrated)" .
100 " VALUES (" .
$ilDB->quote($next_id,
"integer") .
101 ", " .
$ilDB->quote($this->assignment_id,
"integer") .
102 ", " .
$ilDB->quote($rater_id,
"integer") .
103 ", " .
$ilDB->quote($peer_id,
"integer") .
104 ", " .
$ilDB->quote(1,
"integer") .
")");
122 foreach (array_keys($reviews) as $giver_id) {
125 foreach ($this->assignment->getPeerReviewCriteriaCatalogueItems() as $crit) {
126 $crit->setPeerReviewContext($this->assignment, $giver_id, $peer_id);
127 $crit->resetReview();
133 $ilDB->manipulate(
"DELETE FROM exc_assignment_peer" .
134 " WHERE ass_id = " .
$ilDB->quote($this->assignment_id,
"integer"));
146 $peer_ids = $invalid_peer_ids = $invalid_giver_ids = $all_reviews = array();
148 $peer_ids[] = $peer_id;
150 if (!in_array($peer_id, $all_valid) ||
151 !in_array($peer_id, $all_exc)) {
152 $invalid_peer_ids[] = $peer_id;
154 foreach ($reviews as $giver_id =>
$valid) {
155 if (!in_array($giver_id, $all_valid) ||
156 !in_array($peer_id, $all_exc)) {
157 $invalid_giver_ids[] = $giver_id;
159 $all_reviews[$peer_id][$giver_id] =
$valid;
163 $invalid_giver_ids = array_unique($invalid_giver_ids);
165 $missing_user_ids = array();
168 if (!in_array(
$user_id, $peer_ids)) {
173 $not_returned_ids = array();
175 if (!in_array(
$user_id, $all_valid)) {
181 "invalid" => (count($missing_user_ids) ||
182 count($invalid_peer_ids) ||
183 count($invalid_giver_ids)),
184 "missing_user_ids" => $missing_user_ids,
185 "not_returned_ids" => $not_returned_ids,
186 "invalid_peer_ids" => $invalid_peer_ids,
187 "invalid_giver_ids" => $invalid_giver_ids,
188 "reviews" => $all_reviews);
200 if ($item[
"peer_id"] == $a_peer_id) {
207 $data = $peer[
"pcomment"];
209 $items = unserialize(
$data, [
'allowed_classes' =>
false]);
210 if (!is_array($items)) {
212 $items = array(
"text" =>
$data);
225 if ($this->initPeerReviews()) {
227 $set =
$ilDB->query(
"SELECT *" .
228 " FROM exc_assignment_peer" .
229 " WHERE giver_id = " .
$ilDB->quote($a_user_id,
"integer") .
230 " AND ass_id = " .
$ilDB->quote($this->assignment_id,
"integer") .
231 " ORDER BY peer_id");
232 while ($row =
$ilDB->fetchAssoc($set)) {
233 $row[
"seq"] = ++$idx;
245 foreach ($this->getPeerReviewsByGiver($a_giver_id) as $peer) {
246 if ($peer[
"peer_id"] == $a_peer_id) {
247 return (
int) $peer[
"seq"];
258 $data = $a_data[
"pcomment"];
261 $values = unserialize(
$data, [
'allowed_classes' =>
false]);
262 }
catch (Exception
$e) {
264 if (!is_array($values)) {
266 $values = array(
"text" =>
$data);
270 foreach ($this->assignment->getPeerReviewCriteriaCatalogueItems() as $crit) {
271 $crit_id = $crit->getId()
274 $crit->setPeerReviewContext(
279 if (!$crit->validate($values[$crit_id] ??
null)) {
282 if ($crit->hasValue($values[$crit_id] ??
null)) {
292 bool $a_only_valid =
false
299 $set =
$ilDB->query(
"SELECT *" .
300 " FROM exc_assignment_peer" .
301 " WHERE peer_id = " .
$ilDB->quote($a_user_id,
"integer") .
302 " AND ass_id = " .
$ilDB->quote($this->assignment_id,
"integer") .
303 " ORDER BY peer_id");
304 while ($row =
$ilDB->fetchAssoc($set)) {
305 if (!$a_only_valid ||
306 $this->validatePeerReview($row)) {
309 $row[
"seq"] = ++$idx;
319 bool $only_valid =
true
321 return count($this->getPeerReviewsByPeerId(
$user_id, $only_valid));
325 bool $a_only_valid =
true
331 $set =
$ilDB->query(
"SELECT *" .
332 " FROM exc_assignment_peer" .
333 " WHERE ass_id = " .
$ilDB->quote($this->assignment_id,
"integer") .
334 " ORDER BY peer_id");
335 while ($row =
$ilDB->fetchAssoc($set)) {
336 $valid = $this->validatePeerReview($row);
337 if (!$a_only_valid ||
339 $res[$row[
"peer_id"]][$row[
"giver_id"]] =
$valid;
350 $ilUser = $this->user;
352 $set =
$ilDB->query(
"SELECT ass_id" .
353 " FROM exc_assignment_peer" .
354 " WHERE giver_id = " .
$ilDB->quote($ilUser->getId(),
"integer") .
355 " AND peer_id = " .
$ilDB->quote($a_peer_id,
"integer") .
356 " AND ass_id = " .
$ilDB->quote($this->assignment_id,
"integer"));
357 $row =
$ilDB->fetchAssoc($set);
358 return ((
int) ($row[
"ass_id"] ?? 0) > 0);
365 $ilUser = $this->user;
367 $ilDB->manipulate(
"UPDATE exc_assignment_peer" .
369 " WHERE giver_id = " .
$ilDB->quote($ilUser->getId(),
"integer") .
370 " AND peer_id = " .
$ilDB->quote($a_peer_id,
"integer") .
371 " AND ass_id = " .
$ilDB->quote($this->assignment_id,
"integer"));
379 $ilUser = $this->user;
382 "pcomment" => serialize($a_values),
383 "peer_id" => $a_peer_id,
384 "giver_id" => $ilUser->getId()
388 $sql =
"UPDATE exc_assignment_peer" .
390 ",pcomment = " .
$ilDB->quote(serialize($a_values),
"text") .
391 ",is_valid = " .
$ilDB->quote((
int)
$valid,
"integer") .
392 " WHERE giver_id = " .
$ilDB->quote($ilUser->getId(),
"integer") .
393 " AND peer_id = " .
$ilDB->quote($a_peer_id,
"integer") .
394 " AND ass_id = " .
$ilDB->quote($this->assignment_id,
"integer");
396 $ilDB->manipulate($sql);
400 bool $a_validate =
true,
401 ?
int $a_user_id =
null
404 $ilUser = $this->user;
407 $a_user_id = $ilUser->getId();
412 $set =
$ilDB->query(
"SELECT *" .
413 " FROM exc_assignment_peer" .
414 " WHERE ass_id = " .
$ilDB->quote($this->assignment_id,
"integer") .
415 " AND giver_id = " .
$ilDB->quote($a_user_id,
"integer"));
416 while ($row =
$ilDB->fetchAssoc($set)) {
418 $this->validatePeerReview($row)) {
428 return (count($this->domain->submission($this->assignment_id)->getUsersWithSubmission()) - 1);
433 $max = $this->getMaxPossibleFeedbacks();
441 if ($this->assignment->getPeerReviewSimpleUnlock() == 2) {
443 } elseif ($this->assignment->getPeerReviewSimpleUnlock() == 0) {
444 $needed = $this->assignment->getPeerReviewMin();
449 $min = min($max, $needed);
450 return max(0, $min - $this->countGivenFeedback());
461 if (!$this->assignment->afterDeadlineStrict()) {
466 $max = $this->getMaxPossibleFeedbacks();
471 $no_of_feedbacks = $this->countGivenFeedback(
true, $a_user_id);
473 switch ($this->assignment->getPeerReviewValid()) {
475 return (
bool) $no_of_feedbacks;
479 $min = min($max, $this->assignment->getPeerReviewMin());
481 return (($min - $no_of_feedbacks) < 1);
494 "SELECT DISTINCT(giver_id) FROM exc_assignment_peer " .
495 " WHERE ass_id = " .
$ilDB->quote($a_ass_id,
"integer") .
496 " AND tstamp is NULL"
499 while ($row =
$ilDB->fetchAssoc($set)) {
500 $user_ids[] = $row[
"giver_id"];
Calculates peer review distribution (rater to peer assignments)
const PEER_REVIEW_VALID_NONE
const PEER_REVIEW_VALID_ALL
const PEER_REVIEW_VALID_ONE
countGivenFeedback(bool $a_validate=true, ?int $a_user_id=null)
getPeerMaskedId(int $a_giver_id, int $a_peer_id)
updatePeerReviewTimestamp(int $a_peer_id)
countReceivedFeedbacks(int $user_id, bool $only_valid=true)
getPeerReviewsByGiver(int $a_user_id)
static lookupGiversWithPendingFeedback(int $a_ass_id)
getPeerReviewsByPeerId(int $a_user_id, bool $a_only_valid=false)
getMaxPossibleFeedbacks()
__construct(ilExAssignment $a_assignment)
getAllPeerReviews(bool $a_only_valid=true)
validatePeerReview(array $a_data)
validatePeerReviewGroups()
hasPeerReviewAccess(int $a_peer_id)
getValidPeerReviewUsers()
getPeerReviewValues(int $a_giver_id, int $a_peer_id)
getNumberOfMissingFeedbacksForReceived()
isFeedbackValidForPassed(int $a_user_id)
InternalDomainService $domain
updatePeerReview(int $a_peer_id, array $a_values)
ilExAssignment $assignment
getReviewId(int $giver_id, int $peer_id)
static _getMembers(int $a_obj_id)
static getLogger(string $a_component_id)
Get component logger.
Component logger with individual log levels by component id.
static now()
Return current timestamp in Y-m-d H:i:s format.
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...