ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilIndividualAssessmentMemberGUI.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
27use GuzzleHttp\Psr7\ServerRequest;
33use ILIAS\Data;
36
38{
39 public const CMD_VIEW = 'view';
40 public const CMD_EDIT = 'edit';
41 public const CMD_UPDATE = 'update';
42 public const CMD_FINALIZE = 'finalize';
43 public const CMD_FINALIZE_CONFIRMATION = 'finalizeConfirmation';
44 public const CMD_AMEND = 'amend';
45 public const CMD_SAVE_AMEND = "saveAmend";
46 public const CMD_DOWNLOAD_FILE = "downloadFile";
47
49
50 public function __construct(
51 protected ilCtrl $ctrl,
52 protected ilLanguage $lng,
53 protected ilGlobalPageTemplate $tpl,
54 protected ilObjUser $user,
55 protected Input\Factory $input_factory,
56 protected MessageBox\Factory $messagebox_factory,
57 protected Button\Factory $button_factory,
58 protected Link\Factory $link_factory,
59 protected Refinery\Factory $refinery_factory,
60 protected Data\Factory $data_factory,
61 protected Renderer $renderer,
62 protected ServerRequest $request,
64 protected ilToolbarGUI $toolbar,
65 protected ilObjIndividualAssessment $object,
66 protected ilErrorHandling $error_object,
68 protected ILIAS\HTTP\Wrapper\RequestWrapper $request_wrapper,
69 protected ilIndividualAssessmentDateFormatter $date_formatter,
70 protected IRSS $irss,
71 protected ilIndividualAssessmentGradingStakeholder $stakeholder,
72 ) {
74 }
75
76 public function executeCommand(): void
77 {
78 $cmd = $this->ctrl->getCmd();
79
80 switch ($cmd) {
81 case self::CMD_VIEW:
83 case self::CMD_EDIT:
86 case self::CMD_AMEND:
89 $this->$cmd();
90 break;
91 case AbstractCtrlAwareUploadHandler::CMD_UPLOAD:
92 case AbstractCtrlAwareUploadHandler::CMD_REMOVE:
93 case AbstractCtrlAwareUploadHandler::CMD_INFO:
94 parent::executeCommand();
95 break;
96 default:
97 throw new LogicException("Unknown command $cmd");
98 }
99 }
100
101 protected function view(): void
102 {
103 if (!$this->mayBeViewed()) {
104 $this->handleAccessViolation();
105 return;
106 }
107 $form = $this->buildForm('', false);
108 $this->tpl->setContent($this->renderer->render($form));
109 }
110
111 protected function edit(): void
112 {
113 if (!$this->mayBeEdited()) {
114 $this->handleAccessViolation();
115 return;
116 }
117
118 $this->setToolbar();
119 $form = $this->buildForm($this->getFormActionForCommand(self::CMD_UPDATE), true);
120 $this->tpl->setContent($this->renderer->render($form));
121 }
122
123 protected function update(): void
124 {
125 $form = $this
126 ->buildForm($this->getFormActionForCommand(self::CMD_UPDATE), true)
127 ->withRequest($this->request)
128 ;
129
131 $grading = $form->getData();
132 if (is_null($grading)) {
133 $this->tpl->setContent($this->renderer->render($form));
134 return;
135 }
136
137 if ($grading->isFinalized()) {
138 $not_finalized_grading = $grading->withFinalized(false);
139 $this->saveMember($not_finalized_grading);
140 $this->finalizeConfirmation();
141 return;
142 }
143
144 $this->saveMember($grading);
145
146 if ($this->getObject()->isActiveLP()) {
148 }
149
150 $this->tpl->setOnScreenMessage("success", $this->lng->txt('iass_membership_saved'), true);
151 $this->ctrl->redirectByClass(ilIndividualAssessmentMembersGUI::class, 'view');
152 }
153
154 protected function amend(): void
155 {
156 if (!$this->mayBeAmended()) {
157 $this->handleAccessViolation();
158 return;
159 }
160
161 $this->setToolbar();
162 $form = $this->buildForm($this->getFormActionForCommand(self::CMD_SAVE_AMEND), true, true);
163 $form->withSubmitLabel($this->lng->txt("save_amend"));
164 $this->tpl->setContent($this->renderer->render($form));
165 }
166
167 protected function getFormActionForCommand(string $cmd): string
168 {
169 $this->ctrl->setParameterByClass(self::class, 'usr_id', $this->getExaminee()->getId());
170 $action = $this->ctrl->getFormAction($this, $cmd);
171 $this->ctrl->clearParameterByClass(self::class, 'usr_id');
172
173 return $action;
174 }
175
176 protected function downloadFile(): void
177 {
178 $identifier = $this->getMember()->getGrading()->getFile();
179 $resource_id = $this->irss->manage()->find($identifier);
180 if ($resource_id) {
181 $this->irss->consume()->download($resource_id)->run();
182 }
183 }
184
185 protected function saveAmend(): void
186 {
187 if (!$this->mayBeAmended()) {
188 $this->handleAccessViolation();
189 return;
190 }
191
192 $form = $this
193 ->buildForm($this->ctrl->getFormAction($this, self::CMD_AMEND), true, true)
194 ->withRequest($this->request)
195 ;
196
197 $grading = $form->getData();
198
199 if (!is_null($grading)) {
200 $this->saveMember($grading, true, true);
201
202 if ($this->getObject()->isActiveLP()) {
204 }
205
206 $this->tpl->setOnScreenMessage("success", $this->lng->txt('iass_amend_saved'), true);
207 $this->ctrl->redirectByClass(ilIndividualAssessmentMembersGUI::class, 'view');
208 }
209 }
210
211 protected function buildForm(
212 string $form_action,
213 bool $may_be_edited,
214 bool $amend = false
216 $section = $this->getMember()->getGrading()->toFormInput(
217 $this->input_factory->field(),
218 $this->data_factory,
219 $this->lng,
220 $this->refinery_factory,
221 $this,
222 $this->user->getDateFormat(),
223 $this->getObject()->getSettings()->getRecordTemplate(),
224 $this->getPossibleLPStates(),
225 $may_be_edited,
226 $this->getObject()->getSettings()->isEventTimePlaceRequired(),
227 $this->getObject()->getSettings()->isFileRequired(),
228 $amend
229 );
230
231 $form = $this->input_factory->container()->form()->standard($form_action, [$section]);
232 return $form->withAdditionalTransformation(
233 $this->refinery_factory->custom()->transformation(
234 function ($values) use ($amend) {
235 return array_shift($values);
236 }
237 )
238 );
239 }
240
241 protected function finalize(): void
242 {
243 if (!$this->mayBeEdited()) {
244 $this->handleAccessViolation();
245 return;
246 }
247
248 $member = $this->getMember();
249 if (!$member->mayBeFinalized()) {
250 $this->tpl->setOnScreenMessage("failure", $this->lng->txt('iass_may_not_finalize'), true);
251 $this->redirect('edit');
252 return;
253 }
254
255 try {
256 $grading = $member->getGrading()->withFinalized(true);
257 $member = $member->withGrading($grading);
258 $this->getObject()->membersStorage()->updateMember($member);
260 $this->tpl->setOnScreenMessage("failure", $e->getMessage(), true);
261 $this->redirect('edit');
262 return;
263 }
264
265 if ($this->object->isActiveLP()) {
267 }
268
269 try {
270 $member->maybeSendNotification($this->notificator);
271 $this->ctrl->redirectByClass(ilIndividualAssessmentMembersGUI::class, 'view');
273 $this->tpl->setOnScreenMessage("failure", $e->getMessage(), true);
274 $this->redirect('edit');
275 return;
276 }
277
278 $this->tpl->setOnScreenMessage("success", $this->lng->txt('iass_membership_finalized'), true);
279 $this->redirect('view');
280 }
281
282 protected function finalizeConfirmation(): void
283 {
284 if (!$this->mayBeEdited()) {
285 $this->handleAccessViolation();
286 return;
287 }
288
289 $message = $this->lng->txt('iass_finalize_user_qst');
290 $this->ctrl->setParameterByClass(self::class, 'usr_id', $this->getExaminee()->getId());
291 $finalize = $this->ctrl->getFormActionByClass(self::class, self::CMD_FINALIZE);
292 $cancel = $this->ctrl->getFormActionByClass(self::class, self::CMD_EDIT);
293 $this->ctrl->clearParameterByClass(self::class, 'usr_id');
294
295 $buttons = [
296 $this->button_factory->standard($this->lng->txt('iass_confirm_finalize'), $finalize),
297 $this->button_factory->standard($this->lng->txt('iass_cancel'), $cancel)
298 ];
299
300 $message_box = $this->messagebox_factory->confirmation($message)->withButtons($buttons);
301
302 $this->tpl->setContent($this->renderer->render($message_box));
303 }
304
305 protected function saveMember(
307 bool $keep_examiner = false,
308 bool $amend = false
309 ): void {
310 $member = $this->getMember()
311 ->withGrading($grading)
312 ;
313
314 if ($amend) {
315 $member = $member->withChangerId($this->user->getId());
316 }
317
318 if (!$keep_examiner) {
319 $member = $member->withExaminerId($this->user->getId());
320 }
321 $this->getObject()->membersStorage()->updateMember($member);
322 }
323
324 protected function getPossibleLPStates(): array
325 {
326 return [
327 ilIndividualAssessmentMembers::LP_IN_PROGRESS => $this->lng->txt('iass_status_pending'),
328 ilIndividualAssessmentMembers::LP_COMPLETED => $this->lng->txt('iass_status_completed'),
329 ilIndividualAssessmentMembers::LP_FAILED => $this->lng->txt('iass_status_failed')
330 ];
331 }
332
333 protected function getUploadResult(): HandlerResult
334 {
335 $this->upload->process();
336 $array = $this->upload->getResults();
337 $result = end($array);
338
339 if ($result instanceof UploadResult && $result->isOK()) {
340
341 $resource_id = $this->irss->manage()->upload($result, $this->stakeholder);
342 $identifier = $resource_id->serialize();
343 $status = HandlerResult::STATUS_OK;
344 $message = 'Upload ok';
345 } else {
346 $status = HandlerResult::STATUS_FAILED;
347 $identifier = '';
348 $message = $result->getStatus()->getMessage();
349 }
350
351 return new BasicHandlerResult($this->getFileIdentifierParameterName(), $status, $identifier, $message);
352 }
353
354 protected function getRemoveResult(string $identifier): HandlerResult
355 {
356 $resource_id = $this->irss->manage()->find($identifier);
357 if ($resource_id) {
358 $this->irss->manage()->remove($resource_id, $this->stakeholder);
359 $status = HandlerResult::STATUS_OK;
360 $message = $this->lng->txt('iass_file_deleted');
361 } else {
362 $status = HandlerResult::STATUS_FAILED;
363 $identifier = '';
364 $message = 'no resource to delete';
365 }
366 return new BasicHandlerResult($this->getFileIdentifierParameterName(), $status, $identifier, $message);
367 }
368
369 public function getInfoResult(string $identifier): ?FileInfoResult
370 {
371 $resource_id = $this->irss->manage()->find($identifier);
372 if (!$resource_id) {
373 return null;
374 }
375 $resource = $this->irss->manage()->getResource($resource_id);
376 $info = $resource->getCurrentRevision()->getInformation();
377
378 return new BasicFileInfoResult(
379 $this->getFileIdentifierParameterName(),
380 $identifier,
381 $info->getTitle(),
382 $info->getSize(),
383 $info->getMimeType()
384 );
385 }
386
387 public function getInfoForExistingFiles(array $file_ids): array
388 {
389 $file_ids = array_filter($file_ids, fn($id) => $id !== "");
390 return array_map(function ($id) {
391 $resource_id = $this->irss->manage()->find($identifier);
392 if (!$resource_id) {
393 return null;
394 }
395 $resource = $this->irss->manage()->getResource($resource_id);
396 $info = $resource->getCurrentRevision()->getInformation();
397 return new BasicFileInfoResult(
398 $this->getFileIdentifierParameterName(),
399 $id,
400 $info->getTitle(),
401 $info->getSize(),
402 $info->getMimeType()
403 );
404 }, $file_ids);
405 }
406
407 public function getFileIdentifierParameterName(): string
408 {
409 return 'iass';
410 }
411
412 public function getUploadURL(): string
413 {
414 $this->ctrl->setParameter($this, 'usr_id', $this->getExaminee()->getId());
415 $link = $this->ctrl->getLinkTarget($this, self::CMD_UPLOAD);
416 $this->ctrl->setParameter($this, 'usr_id', null);
417
418 return $link;
419 }
420
421 public function getExistingFileInfoURL(): string
422 {
423 $this->ctrl->setParameter($this, 'usr_id', $this->getExaminee()->getId());
424 $link = $this->ctrl->getLinkTarget($this, self::CMD_INFO);
425 $this->ctrl->setParameter($this, 'usr_id', null);
426
427 return $link;
428 }
429
430 protected function redirect(string $cmd): void
431 {
432 $this->ctrl->setParameterByClass(self::class, 'usr_id', $this->getExaminee()->getId());
433 $this->ctrl->redirect($this, $cmd);
434 }
435
436 public function setObject(ilObjIndividualAssessment $object): void
437 {
438 $this->object = $object;
439 }
440
442 {
443 return $this->object;
444 }
445
446 public function setParentGUI(ilIndividualAssessmentMembersGUI $parent_gui): void
447 {
448 $this->parent_gui = $parent_gui;
449 }
450
452 {
453 return $this->parent_gui;
454 }
455
457 {
458 if (is_null($this->iass_access)) {
459 $this->iass_access = $this->getObject()->accessHandler();
460 }
461 return $this->iass_access;
462 }
463
464 protected function getExaminee(): ilObjUser
465 {
466 return new ilObjUser($this->request_wrapper->retrieve('usr_id', $this->refinery->kindlyTo()->int()));
467 }
468
470 {
471 return $this->getObject()->membersStorage()->loadMember(
472 $this->getObject(),
473 $this->getExaminee()
474 );
475 }
476
477 protected function setToolbar(): void
478 {
479 $member = $this->getMember();
480 if ($member->fileName() != '') {
481 $this->ctrl->setParameter($this, 'usr_id', $this->getExaminee()->getId());
482 $url = $this->ctrl->getLinkTarget($this, self::CMD_DOWNLOAD_FILE, "", false, true);
483 $this->ctrl->setParameter($this, 'usr_id', null);
484 $btn = $this->link_factory->standard(
485 $this->lng->txt('download_assessment_paper'),
486 $url
487 );
488 $this->toolbar->addComponent($btn);
489 }
490 }
491
492 protected function mayBeEdited(): bool
493 {
494 return $this->getAccessHandler()->isSystemAdmin() || (!$this->isFinalized() && $this->userMayGrade());
495 }
496
497 protected function mayBeViewed(): bool
498 {
499 return
500 $this->getAccessHandler()->isSystemAdmin() ||
501 ($this->isFinalized() && ($this->userMayGrade() || $this->userMayView()))
502 ;
503 }
504
505 protected function mayBeAmended(): bool
506 {
507 return $this->getAccessHandler()->isSystemAdmin() || ($this->isFinalized() && $this->userMayAmend());
508 }
509
510 protected function userMayGrade(): bool
511 {
512 return
513 $this->getAccessHandler()->isSystemAdmin() ||
514 (!$this->targetWasEditedByOtherUser($this->getMember()) && $this->getAccessHandler()->mayGradeUser($this->getMember()->id()))
515 ;
516 }
517
518 protected function userMayView(): bool
519 {
520 return $this->getAccessHandler()->mayViewUser($this->getMember()->id());
521 }
522
523 protected function userMayAmend(): bool
524 {
525 return $this->getAccessHandler()->mayAmendAllUsers();
526 }
527
529 {
530 return
531 (int) $member->examinerId() !== $this->user->getId() &&
532 0 !== (int) $member->examinerId()
533 ;
534 }
535
536 protected function isFinalized(): bool
537 {
538 return $this->getMember()->finalized();
539 }
540
541 public function handleAccessViolation(): void
542 {
543 $this->error_object->raiseError($this->lng->txt("msg_no_perm_read"), $this->error_object->WARNING);
544 }
545}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
renderer()
$renderer
Builds a Color from either hex- or rgb values.
Definition: Factory.php:31
Definition: UI.php:24
Class ilCtrl provides processing control methods.
Error Handling & global info handling.
static updateLPStatusOfMember(ilIndividualAssessmentMember $member)
buildForm(string $form_action, bool $may_be_edited, bool $amend=false)
saveMember(ilIndividualAssessmentUserGrading $grading, bool $keep_examiner=false, bool $amend=false)
setParentGUI(ilIndividualAssessmentMembersGUI $parent_gui)
executeCommand()
Since this is a ilCtrl aware UploadHandler executeCommand MUST be implemented.
__construct(protected ilCtrl $ctrl, protected ilLanguage $lng, protected ilGlobalPageTemplate $tpl, protected ilObjUser $user, protected Input\Factory $input_factory, protected MessageBox\Factory $messagebox_factory, protected Button\Factory $button_factory, protected Link\Factory $link_factory, protected Refinery\Factory $refinery_factory, protected Data\Factory $data_factory, protected Renderer $renderer, protected ServerRequest $request, protected ilIndividualAssessmentPrimitiveInternalNotificator $notificator, protected ilToolbarGUI $toolbar, protected ilObjIndividualAssessment $object, protected ilErrorHandling $error_object, protected ILIAS\Refinery\Factory $refinery, protected ILIAS\HTTP\Wrapper\RequestWrapper $request_wrapper, protected ilIndividualAssessmentDateFormatter $date_formatter, protected IRSS $irss, protected ilIndividualAssessmentGradingStakeholder $stakeholder,)
targetWasEditedByOtherUser(ilIndividualAssessmentMember $member)
ilIndividualAssessmentAccessHandler $iass_access
Edit the record of a user, set LP.
For the purpose of streamlining the grading and learning-process status definition outside of tests,...
language handling
For the purpose of streamlining the grading and learning-process status definition outside of tests,...
User class.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$info
Definition: entry_point.php:21
This describes commonalities between all inputs.
Definition: Input.php:47
An entity that renders components to a string output.
Definition: Renderer.php:31
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: Bulky.php:21
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
global $lng
Definition: privfeed.php:31
$url
Definition: shib_logout.php:68
$message
Definition: xapiexit.php:31