aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/admin/ilias_interface.php5
-rw-r--r--app/controllers/my_ilias_accounts.php75
-rw-r--r--app/views/admin/ilias_interface/edit_permissions.php21
-rw-r--r--app/views/my_ilias_accounts/add_workgroup.php13
-rw-r--r--app/views/my_ilias_accounts/my_courses.php15
-rw-r--r--lib/ilias_interface/ConnectedIlias.php45
6 files changed, 164 insertions, 10 deletions
diff --git a/app/controllers/admin/ilias_interface.php b/app/controllers/admin/ilias_interface.php
index f4711a3..89a8880 100644
--- a/app/controllers/admin/ilias_interface.php
+++ b/app/controllers/admin/ilias_interface.php
@@ -157,6 +157,9 @@ class Admin_IliasInterfaceController extends AuthenticatedController
'course_veranstaltungsnummer' => false,
'workgroup_category_name' => '',
'workgroup_category' => '',
+ 'workgroup_perm' => '',
+ 'workgroup_role_name' => '',
+ 'workgroup_role' => '',
'modules' => [],
'author_role_name' => 'Author',
@@ -401,6 +404,8 @@ class Admin_IliasInterfaceController extends AuthenticatedController
$this->ilias_configs[$index]['author_role_name'] = Request::get('ilias_author_role_name');
$this->ilias_configs[$index]['author_perm'] = Request::get('ilias_author_perm');
$this->ilias_configs[$index]['allow_change_account'] = Request::get('ilias_allow_change_account');
+ $this->ilias_configs[$index]['workgroup_role_name'] = Request::get('ilias_workgroup_role_name');
+ $this->ilias_configs[$index]['workgroup_perm'] = Request::get('ilias_workgroup_perm');
// remove ilias role assignment
if (
diff --git a/app/controllers/my_ilias_accounts.php b/app/controllers/my_ilias_accounts.php
index 644ff6f..3b8716b 100644
--- a/app/controllers/my_ilias_accounts.php
+++ b/app/controllers/my_ilias_accounts.php
@@ -72,11 +72,79 @@ class MyIliasAccountsController extends AuthenticatedController
}
/**
+ * Adds workgroup
+ */
+ public function add_workgroup_action($ilias_index)
+ {
+ $this->ilias = new ConnectedIlias($ilias_index);
+ $this->ilias_workgroup_name = sprintf(_('Arbeitsbereich von %s'), User::findCurrent()->getFullName());
+
+ if (
+ empty($this->ilias->ilias_config['workgroup_perm'])
+ || !$GLOBALS['perm']->have_perm($this->ilias->ilias_config['workgroup_perm'])
+ ) {
+ throw new AccessDeniedException();
+ }
+
+ if (Request::submitted('add_workgroup')) {
+ $this->ilias_workgroup_name = trim(Request::get('ilias_workgroup_name'));
+ if (
+ empty($this->ilias_workgroup_name)
+ || mb_strlen($this->ilias_workgroup_name) < 3
+ ) {
+ PageLayout::postError(_('Der Name des Arbeitsbereichs ist zu kurz.'));
+ } elseif (
+ $this->ilias->isActive()
+ && !empty($this->ilias->ilias_config['workgroup_category'])
+ && !empty($this->ilias->ilias_config['workgroup_role'])
+ ) {
+ //create workgroup category in ILIAS
+ $object_data = [
+ 'title' => $this->ilias_workgroup_name,
+ 'description' => '',
+ 'type' => 'cat',
+ 'owner' => $this->ilias->soap_client->lookupUser($this->ilias_config['admin']),
+ ];
+ $workgroup_cat = $this->ilias->soap_client->addObject($object_data, $this->ilias->ilias_config['workgroup_category']);
+
+ if (!empty($workgroup_cat)) {
+ // create local role from template
+ $role_data = [
+ 'title' => "studip_workgroup_ref_" . $workgroup_cat,
+ 'description' => sprintf(_('Arbeitsbereichsrolle für ref_id %s, angelegt von %s'), $workgroup_cat, User::findCurrent()->getFullName()),
+ ];
+ $role_id = $this->ilias->soap_client->addRoleFromTemplate($role_data, $workgroup_cat, $this->ilias->ilias_config['workgroup_role']);
+
+ if (!empty($role_id)) {
+ //add current user to new role entry
+ $this->ilias->soap_client->addUserRoleEntry($this->ilias->user->getId(), $role_id);
+
+ // delete permissions for all global roles (User, Guest, Anonymous) for this category
+ foreach ($this->ilias->global_roles as $role) {
+ $this->ilias->soap_client->revokePermissions($role, $workgroup_cat);
+ }
+
+ PageLayout::postSuccess(sprintf(_('Der Arbeitsbereich mit dem Namen "%s" wurde angelegt.'), $this->ilias_workgroup_name));
+ } else {
+ PageLayout::postError(sprintf(_('Die Mitglieder-Rolle für den Arbeitsbereich "%s" konnte nicht angelegt werden.'), $this->ilias_workgroup_name));
+ }
+ } else {
+ PageLayout::postError(sprintf(_('Der Arbeitsbereich "%s" konnte nicht angelegt werden.'), $this->ilias_workgroup_name));
+ }
+ } else {
+ PageLayout::postError(sprintf(_('Die ILIAS-Installation %s ist nicht aktiv.'), $this->ilias->ilias_config['name']));
+ }
+ $this->redirect($this->url_for('my_ilias_accounts/my_courses'));
+ }
+ }
+
+ /**
* Sends workgroup requests to given user(s)
*/
public function request_workgroup_member_action($ilias_index, $workgroup_id)
{
$this->ilias = new ConnectedIlias($ilias_index);
+
if ($this->ilias->isActive()) {
$this->ilias_index = $ilias_index;
// Get selected persons.
@@ -141,6 +209,7 @@ class MyIliasAccountsController extends AuthenticatedController
public function accept_workgroup_request_action($ilias_index, $workgroup_id)
{
$this->ilias = new ConnectedIlias($ilias_index);
+
if ($this->ilias->isActive()) {
$this->ilias_index = $ilias_index;
@@ -283,6 +352,12 @@ class MyIliasAccountsController extends AuthenticatedController
}
$this->workgroups_list[$ilias_list_index] = $ilias->getUserWorkgroups($GLOBALS['perm']->have_perm('root'));
+
+ $this->add_workgroups_perm[$ilias_list_index] =
+ !empty($ilias->ilias_config['workgroup_category'])
+ && !empty($ilias->ilias_config['workgroup_role'])
+ && !empty($ilias->ilias_config['workgroup_perm'])
+ && $GLOBALS['perm']->have_perm($ilias->ilias_config['workgroup_perm']);
}
}
}
diff --git a/app/views/admin/ilias_interface/edit_permissions.php b/app/views/admin/ilias_interface/edit_permissions.php
index b6b6f21..701ebb9 100644
--- a/app/views/admin/ilias_interface/edit_permissions.php
+++ b/app/views/admin/ilias_interface/edit_permissions.php
@@ -89,4 +89,25 @@
</section>
<? endif ?>
</fieldset>
+ <? if (!empty($ilias_config['workgroup_category'])) : ?>
+ <fieldset>
+ <legend>
+ <?= _('Arbeitsbereiche') ?>
+ </legend>
+ <label>
+ <span class="required"><?= _('Erforderliche Rechtestufe zum Erstellen von Arbeitsbereichen') ?></span>
+ <select name="ilias_workgroup_perm">
+ <option value="autor" <?= $ilias_config['workgroup_perm'] === 'autor' ? 'selected' : '' ?>><?= _('autor') ?></option>
+ <option value="tutor" <?= $ilias_config['workgroup_perm'] === 'tutor' ? 'selected' : '' ?>><?= _('tutor') ?></option>
+ <option value="dozent" <?= empty($ilias_config['workgroup_perm']) || $ilias_config['workgroup_perm'] === 'dozent' ? 'selected' : '' ?>><?= _('dozent') ?></option>
+ <option value="admin" <?= $ilias_config['workgroup_perm'] == 'admin' ? 'selected' : '' ?>><?= _('admin') ?></option>
+ <option value="root" <?= $ilias_config['workgroup_perm'] === 'root' ? 'selected' : '' ?>><?= _('root') ?></option>
+ </select>
+ </label>
+ <label>
+ <span class="required"><?= _('Name oder ID des Rollen-Templates für Mitglieder von Arbeitsbereichen') ?></span>
+ <input type="text" name="ilias_workgroup_role_name" size="50" maxlength="255" value="<?= htmlReady($ilias_config['workgroup_role_name'] ?? '') ?>" required>
+ </label>
+ </fieldset>
+ <? endif ?>
</form>
diff --git a/app/views/my_ilias_accounts/add_workgroup.php b/app/views/my_ilias_accounts/add_workgroup.php
new file mode 100644
index 0000000..1c3e4ca
--- /dev/null
+++ b/app/views/my_ilias_accounts/add_workgroup.php
@@ -0,0 +1,13 @@
+<form class="default" action="<?= $controller->link_for('my_ilias_accounts/add_workgroup/'.$ilias->index) ?>" method="post">
+ <?= CSRFProtection::tokenTag() ?>
+ <label>
+ <span class="required"><?= _('Name des Arbeitsbereichs') ?></span>
+ <input type="text" name="ilias_workgroup_name" size="50" maxlength="255" value="<?=htmlReady($ilias_workgroup_name)?>" required>
+ </label>
+ <footer data-dialog-button>
+ <? if ($ilias->isActive()) : ?>
+ <?= Studip\Button::createAccept(_('Erstellen'), 'add_workgroup') ?>
+ <? endif ?>
+ <?= Studip\Button::createCancel(_('Abbrechen'), 'cancel', ['data-dialog' => 'close']) ?>
+ </footer>
+</form> \ No newline at end of file
diff --git a/app/views/my_ilias_accounts/my_courses.php b/app/views/my_ilias_accounts/my_courses.php
index c748bdf..33e99af 100644
--- a/app/views/my_ilias_accounts/my_courses.php
+++ b/app/views/my_ilias_accounts/my_courses.php
@@ -60,7 +60,7 @@
</table>
<? endforeach ?>
<? foreach ($ilias_list as $ilias_index => $ilias) : ?>
- <? if (!empty($workgroups_list[$ilias_index])) : ?>
+ <? if (!empty($workgroups_list[$ilias_index]) || !empty($add_workgroups_perm)) : ?>
<br>
<br>
<table class="default">
@@ -100,6 +100,19 @@
</td>
</tr>
<? endforeach ?>
+ <? else : ?>
+ <tr>
+ <td colspan="3"><?=_('Sie sind noch keinem Arbeitsbereich zugeordnet.')?></td>
+ </tr>
+ <? endif ?>
+ <? if (!empty($add_workgroups_perm[$ilias_index])) : ?>
+ <tfoot>
+ <tr>
+ <td colspan="3">
+ <?= Studip\LinkButton::create(_('Neuen Arbeitsbereich anlegen'), $controller->url_for('my_ilias_accounts/add_workgroup/'.$ilias_index), ['data-dialog' => 'size=auto']) ?>
+ </td>
+ </tr>
+ </tfoot>
<? endif ?>
</table>
<? endif ?>
diff --git a/lib/ilias_interface/ConnectedIlias.php b/lib/ilias_interface/ConnectedIlias.php
index 057a70b..b72c8d3 100644
--- a/lib/ilias_interface/ConnectedIlias.php
+++ b/lib/ilias_interface/ConnectedIlias.php
@@ -147,6 +147,7 @@ class ConnectedIlias
$interface_config_options = [
'show_course_paths' => true,
+ 'create_objects' => true,
];
foreach ($interface_config_options as $option_key => $option_value) {
@@ -188,6 +189,9 @@ class ConnectedIlias
'course_veranstaltungsnummer' => false,
'workgroup_category_name' => '',
'workgroup_category' => '',
+ 'workgroup_perm' => '',
+ 'workgroup_role_name' => '',
+ 'workgroup_role' => '',
'modules' => [],
'author_role_name' => '',
@@ -422,27 +426,48 @@ class ConnectedIlias
*/
public function getPermissionsSettingsStatus()
{
+ $permission_error = false;
// check role template
if (empty($this->ilias_config['author_role_name'])) {
$this->error[] = _("Das Rollen-Template für die persönliche Kategorie wurde noch nicht festgelegt.");
+ return false;
} elseif (is_numeric($this->ilias_config['author_role_name'])) {
// if an ID was entered, simply use it; else check for title
$this->ilias_config['author_role'] = $this->ilias_config['author_role_name'];
$this->storeSettings();
- return true;
} else {
$role_template = $this->soap_client->getObjectByTitle($this->ilias_config['author_role_name'], 'rolt');
- if ($role_template == false) {
- $this->error[] = sprintf(_('Das Rollen-Template mit dem Namen „%1$s“ wurde im System %2$s nicht gefunden.'), htmlReady($this->ilias_config['author_role_name']), htmlReady($this->getName()));
- } else if (is_array($role_template)) {
+ if (!empty($role_template) && is_array($role_template)) {
$this->ilias_config['author_role'] = $role_template["obj_id"];
- $this->ilias_config['author_role_name'] = $role_template['title'];
+ $this->ilias_config['author_role_name'] = $role_template["title"];
$this->storeSettings();
- return true;
+ } else {
+ $this->error[] = sprintf(_('Das Rollen-Template mit dem Namen „%1$s“ wurde im System %2$s nicht gefunden.'), htmlReady($this->ilias_config['author_role_name']), htmlReady($this->getName()));
+ return false;
}
}
- return false;
+ // check workgroup role template
+ if (!empty($this->ilias_config['workgroup_category']) && empty($this->ilias_config['workgroup_role_name'])) {
+ $this->error[] = _("Das Rollen-Template für die Arbeitsgruppen wurde noch nicht festgelegt.");
+ return false;
+ } elseif (is_numeric($this->ilias_config['workgroup_role_name'])) {
+ // if an ID was entered, simply use it; else check for title
+ $this->ilias_config['workgroup_role'] = $this->ilias_config['workgroup_role_name'];
+ $this->storeSettings();
+ } else {
+ $role_template = $this->soap_client->getObjectByTitle($this->ilias_config['workgroup_role_name'], 'rolt');
+
+ if (is_array($role_template)) {
+ $this->ilias_config['workgroup_role'] = $role_template["obj_id"];
+ $this->ilias_config['workgroup_role_name'] = $role_template["title"];
+ $this->storeSettings();
+ } else {
+ $this->error[] = sprintf(_('Das Rollen-Template mit dem Namen „%1$s“ wurde im System %2$s nicht gefunden.'), htmlReady($this->ilias_config['workgroup_role_name']), htmlReady($this->getName()));
+ return false;
+ }
+ }
+ return true;
}
/**
@@ -933,8 +958,10 @@ class ConnectedIlias
$data = $statement->fetch(PDO::FETCH_ASSOC);
$user_list = [];
- foreach ($data as $user_data) {
- $user_list[$data['user_id']] = trim($data['title_front'] . ' ' . $data['Vorname'] . ' ' . $data['Nachname'] . ' ' . $data['title_rear']);
+ if (is_array($data)) {
+ foreach ($data as $user_data) {
+ $user_list[$data['user_id']] = trim($data['title_front'] . ' ' . $data['Vorname'] . ' ' . $data['Nachname'] . ' ' . $data['title_rear']);
+ }
}
return $user_list;