ILIAS  trunk Revision v11.0_alpha-1723-g8e69f309bab
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
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->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');
272  } catch (ilIndividualAssessmentException $e) {
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(
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(
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 
441  protected function getObject(): ilObjIndividualAssessment
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 }
$renderer
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)
Interface Observer Contains several chained tasks and infos about them.
renderer()
static updateLPStatusOfMember(ilIndividualAssessmentMember $member)
$url
Definition: shib_logout.php:66
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)
Builds a Color from either hex- or rgb values.
Definition: Factory.php:30
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
targetWasEditedByOtherUser(ilIndividualAssessmentMember $member)
saveMember(ilIndividualAssessmentUserGrading $grading, bool $keep_examiner=false, bool $amend=false)
Edit the record of a user, set LP.
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
__construct(Container $dic, ilPlugin $plugin)
global $lng
Definition: privfeed.php:31
This describes commonalities between all inputs.
Definition: Input.php:46
$message
Definition: xapiexit.php:31
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...