ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
class.ilIndividualAssessmentMemberGUI.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
33 use ILIAS\Data;
34 use ILIAS\Refinery;
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,
67  protected ILIAS\Refinery\Factory $refinery,
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:
82  case self::CMD_UPDATE:
83  case self::CMD_EDIT:
84  case self::CMD_FINALIZE:
85  case self::CMD_FINALIZE_CONFIRMATION:
86  case self::CMD_AMEND:
87  case self::CMD_SAVE_AMEND:
88  case self::CMD_DOWNLOAD_FILE:
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
215  ): ILIAS\UI\Component\Input\Container\Form\Form {
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->getPossibleLPStates(),
224  $may_be_edited,
225  $this->getObject()->getSettings()->isEventTimePlaceRequired(),
226  $this->getObject()->getSettings()->isFileRequired(),
227  $amend
228  );
229 
230  $form = $this->input_factory->container()->form()->standard($form_action, [$section]);
231  return $form->withAdditionalTransformation(
232  $this->refinery_factory->custom()->transformation(
233  function ($values) use ($amend) {
234  return array_shift($values);
235  }
236  )
237  );
238  }
239 
240  protected function finalize(): void
241  {
242  if (!$this->mayBeEdited()) {
243  $this->handleAccessViolation();
244  return;
245  }
246 
247  $member = $this->getMember();
248  if (!$member->mayBeFinalized()) {
249  $this->tpl->setOnScreenMessage("failure", $this->lng->txt('iass_may_not_finalize'), true);
250  $this->redirect('edit');
251  return;
252  }
253 
254  try {
255  $grading = $member->getGrading()->withFinalized(true);
256  $member = $member->withGrading($grading);
257  $this->getObject()->membersStorage()->updateMember($member);
259  $this->tpl->setOnScreenMessage("failure", $e->getMessage(), true);
260  $this->redirect('edit');
261  return;
262  }
263 
264  if ($this->object->isActiveLP()) {
266  }
267 
268  try {
269  $member->maybeSendNotification($this->notificator);
270  $this->ctrl->redirectByClass(ilIndividualAssessmentMembersGUI::class, 'view');
271  } catch (ilIndividualAssessmentException $e) {
272  $this->tpl->setOnScreenMessage("failure", $e->getMessage(), true);
273  $this->redirect('edit');
274  return;
275  }
276 
277  $this->tpl->setOnScreenMessage("success", $this->lng->txt('iass_membership_finalized'), true);
278  $this->redirect('view');
279  }
280 
281  protected function finalizeConfirmation(): void
282  {
283  if (!$this->mayBeEdited()) {
284  $this->handleAccessViolation();
285  return;
286  }
287 
288  $message = $this->lng->txt('iass_finalize_user_qst');
289  $this->ctrl->setParameterByClass(self::class, 'usr_id', $this->getExaminee()->getId());
290  $finalize = $this->ctrl->getFormActionByClass(self::class, self::CMD_FINALIZE);
291  $cancel = $this->ctrl->getFormActionByClass(self::class, self::CMD_EDIT);
292  $this->ctrl->clearParameterByClass(self::class, 'usr_id');
293 
294  $buttons = [
295  $this->button_factory->standard($this->lng->txt('iass_confirm_finalize'), $finalize),
296  $this->button_factory->standard($this->lng->txt('iass_cancel'), $cancel)
297  ];
298 
299  $message_box = $this->messagebox_factory->confirmation($message)->withButtons($buttons);
300 
301  $this->tpl->setContent($this->renderer->render($message_box));
302  }
303 
304  protected function saveMember(
306  bool $keep_examiner = false,
307  bool $amend = false
308  ): void {
309  $member = $this->getMember()
310  ->withGrading($grading)
311  ;
312 
313  if ($amend) {
314  $member = $member->withChangerId($this->user->getId());
315  }
316 
317  if (!$keep_examiner) {
318  $member = $member->withExaminerId($this->user->getId());
319  }
320  $this->getObject()->membersStorage()->updateMember($member);
321  }
322 
323  protected function getPossibleLPStates(): array
324  {
325  return [
326  ilIndividualAssessmentMembers::LP_IN_PROGRESS => $this->lng->txt('iass_status_pending'),
327  ilIndividualAssessmentMembers::LP_COMPLETED => $this->lng->txt('iass_status_completed'),
328  ilIndividualAssessmentMembers::LP_FAILED => $this->lng->txt('iass_status_failed')
329  ];
330  }
331 
332  protected function getUploadResult(): HandlerResult
333  {
334  $this->upload->process();
335  $array = $this->upload->getResults();
336  $result = end($array);
337 
338  if ($result instanceof UploadResult && $result->isOK()) {
339 
340  $resource_id = $this->irss->manage()->upload($result, $this->stakeholder);
341  $identifier = $resource_id->serialize();
342  $status = HandlerResult::STATUS_OK;
343  $message = 'Upload ok';
344  } else {
345  $status = HandlerResult::STATUS_FAILED;
346  $identifier = '';
347  $message = $result->getStatus()->getMessage();
348  }
349 
350  return new BasicHandlerResult($this->getFileIdentifierParameterName(), $status, $identifier, $message);
351  }
352 
353  protected function getRemoveResult(string $identifier): HandlerResult
354  {
355  $resource_id = $this->irss->manage()->find($identifier);
356  if($resource_id) {
357  $this->irss->manage()->remove($resource_id, $this->stakeholder);
358  $status = HandlerResult::STATUS_OK;
359  $message = $this->lng->txt('iass_file_deleted');
360  } else {
361  $status = HandlerResult::STATUS_FAILED;
362  $identifier = '';
363  $message = 'no resource to delete';
364  }
365  return new BasicHandlerResult($this->getFileIdentifierParameterName(), $status, $identifier, $message);
366  }
367 
368  public function getInfoResult(string $identifier): ?FileInfoResult
369  {
370  $resource_id = $this->irss->manage()->find($identifier);
371  if(! $resource_id) {
372  return null;
373  }
374  $resource = $this->irss->manage()->getResource($resource_id);
375  $info = $resource->getCurrentRevision()->getInformation();
376 
377  return new BasicFileInfoResult(
379  $identifier,
380  $info->getTitle(),
381  $info->getSize(),
382  $info->getMimeType()
383  );
384  }
385 
386  public function getInfoForExistingFiles(array $file_ids): array
387  {
388  $file_ids = array_filter($file_ids, fn($id) => $id !== "");
389  return array_map(function ($id) {
390  $resource_id = $this->irss->manage()->find($identifier);
391  if(! $resource_id) {
392  return null;
393  }
394  $resource = $this->irss->manage()->getResource($resource_id);
395  $info = $resource->getCurrentRevision()->getInformation();
396  return new BasicFileInfoResult(
398  $id,
399  $info->getTitle(),
400  $info->getSize(),
401  $info->getMimeType()
402  );
403  }, $file_ids);
404  }
405 
406  public function getFileIdentifierParameterName(): string
407  {
408  return 'iass';
409  }
410 
411  public function getUploadURL(): string
412  {
413  $this->ctrl->setParameter($this, 'usr_id', $this->getExaminee()->getId());
414  $link = $this->ctrl->getLinkTarget($this, self::CMD_UPLOAD);
415  $this->ctrl->setParameter($this, 'usr_id', null);
416 
417  return $link;
418  }
419 
420  public function getExistingFileInfoURL(): string
421  {
422  $this->ctrl->setParameter($this, 'usr_id', $this->getExaminee()->getId());
423  $link = $this->ctrl->getLinkTarget($this, self::CMD_INFO);
424  $this->ctrl->setParameter($this, 'usr_id', null);
425 
426  return $link;
427  }
428 
429  protected function redirect(string $cmd): void
430  {
431  $this->ctrl->setParameterByClass(self::class, 'usr_id', $this->getExaminee()->getId());
432  $this->ctrl->redirect($this, $cmd);
433  }
434 
435  public function setObject(ilObjIndividualAssessment $object): void
436  {
437  $this->object = $object;
438  }
439 
440  protected function getObject(): ilObjIndividualAssessment
441  {
442  return $this->object;
443  }
444 
445  public function setParentGUI(ilIndividualAssessmentMembersGUI $parent_gui): void
446  {
447  $this->parent_gui = $parent_gui;
448  }
449 
451  {
452  return $this->parent_gui;
453  }
454 
456  {
457  if (is_null($this->iass_access)) {
458  $this->iass_access = $this->getObject()->accessHandler();
459  }
460  return $this->iass_access;
461  }
462 
463  protected function getExaminee(): ilObjUser
464  {
465  return new ilObjUser($this->request_wrapper->retrieve('usr_id', $this->refinery->kindlyTo()->int()));
466  }
467 
469  {
470  return $this->getObject()->membersStorage()->loadMember(
471  $this->getObject(),
472  $this->getExaminee()
473  );
474  }
475 
476  protected function setToolbar(): void
477  {
478  $member = $this->getMember();
479  if ($member->fileName() != '') {
480  $this->ctrl->setParameter($this, 'usr_id', $this->getExaminee()->getId());
481  $url = $this->ctrl->getLinkTarget($this, self::CMD_DOWNLOAD_FILE, "", false, true);
482  $this->ctrl->setParameter($this, 'usr_id', null);
483  $btn = $this->link_factory->standard(
484  $this->lng->txt('download_assessment_paper'),
485  $url
486  );
487  $this->toolbar->addComponent($btn);
488  }
489  }
490 
491  protected function mayBeEdited(): bool
492  {
493  return $this->getAccessHandler()->isSystemAdmin() || (!$this->isFinalized() && $this->userMayGrade());
494  }
495 
496  protected function mayBeViewed(): bool
497  {
498  return
499  $this->getAccessHandler()->isSystemAdmin() ||
500  ($this->isFinalized() && ($this->userMayGrade() || $this->userMayView()))
501  ;
502  }
503 
504  protected function mayBeAmended(): bool
505  {
506  return $this->getAccessHandler()->isSystemAdmin() || ($this->isFinalized() && $this->userMayAmend());
507  }
508 
509  protected function userMayGrade(): bool
510  {
511  return
512  $this->getAccessHandler()->isSystemAdmin() ||
513  (!$this->targetWasEditedByOtherUser($this->getMember()) && $this->getAccessHandler()->mayGradeUser($this->getMember()->id()))
514  ;
515  }
516 
517  protected function userMayView(): bool
518  {
519  return $this->getAccessHandler()->mayViewUser($this->getMember()->id());
520  }
521 
522  protected function userMayAmend(): bool
523  {
524  return $this->getAccessHandler()->mayAmendAllUsers();
525  }
526 
528  {
529  return
530  (int) $member->examinerId() !== $this->user->getId() &&
531  0 !== (int) $member->examinerId()
532  ;
533  }
534 
535  protected function isFinalized(): bool
536  {
537  return $this->getMember()->finalized();
538  }
539 
540  public function handleAccessViolation(): void
541  {
542  $this->error_object->raiseError($this->lng->txt("msg_no_perm_read"), $this->error_object->WARNING);
543  }
544 }
An entity that renders components to a string output.
Definition: Renderer.php:30
For the purpose of streamlining the grading and learning-process status definition outside of tests...
ilIndividualAssessmentAccessHandler $iass_access
buildForm(string $form_action, bool $may_be_edited, bool $amend=false)
Class ChatMainBarProvider .
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static updateLPStatusOfMember(ilIndividualAssessmentMember $member)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: Bulky.php:21
setParentGUI(ilIndividualAssessmentMembersGUI $parent_gui)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct(VocabulariesInterface $vocabularies)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$lng
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: Factory.php:21
targetWasEditedByOtherUser(ilIndividualAssessmentMember $member)
$url
Definition: ltiregstart.php:35
saveMember(ilIndividualAssessmentUserGrading $grading, bool $keep_examiner=false, bool $amend=false)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Error Handling & global info handling.
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
This describes commonalities between all inputs.
Definition: Input.php:46
$message
Definition: xapiexit.php:32
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,)
For the purpose of streamlining the grading and learning-process status definition outside of tests...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Refinery Factory $refinery