aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hackl <hackl@data-quest.de>2022-08-09 17:24:41 +0200
committerThomas Hackl <hackl@data-quest.de>2022-08-09 17:24:41 +0200
commitde32ac3ea1953219f6e0f4677bc04d7a063d51bb (patch)
treec793d0c9a0739ba3d5cf9fefd52e64174a29984d
parentb54ea35f36b02de8b260e41073de6cb24c653e0b (diff)
add additional handlers on creating/deleting SORM objects, re #688tic-688
-rw-r--r--app/views/admin/autoinsert/index.php38
-rw-r--r--lib/classes/AutoInsert.class.php101
-rw-r--r--lib/models/InstituteMember.class.php15
-rw-r--r--lib/models/UserStudyCourse.class.php25
4 files changed, 129 insertions, 50 deletions
diff --git a/app/views/admin/autoinsert/index.php b/app/views/admin/autoinsert/index.php
index 59029de..9934e33 100644
--- a/app/views/admin/autoinsert/index.php
+++ b/app/views/admin/autoinsert/index.php
@@ -79,6 +79,13 @@ use Studip\Button, Studip\LinkButton;
<? if (!empty($auto_sems)) : ?>
<table class="default">
<caption><?= _('Vorhandene Zuordnungen') ?></caption>
+ <colgroup>
+ <col>
+ <col>
+ <col>
+ <col>
+ <col width="20">
+ </colgroup>
<thead>
<tr>
<th><?= _('Veranstaltung') ?></th>
@@ -90,42 +97,37 @@ use Studip\Button, Studip\LinkButton;
</thead>
<tbody>
<? if ($grouping == 'by_course') : ?>
- <? foreach ($auto_sems as $id => $types): ?>
- <? $row = 1; foreach ($types as $type => $courses): ?>
- <? $typerow = 1; foreach ($courses as $auto_sem) : ?>
+ <? $typerow = 1; foreach ($auto_sems as $id => $types): ?>
+ <? $rangerow = 1; foreach ($types as $type => $courses): ?>
+ <? foreach ($courses as $auto_sem) : ?>
<tr>
- <? if ($row == 1) : ?>
+ <? if ($typerow == 1) : ?>
<td rowspan="<?= count($types) + 1 ?>">
- <a href="<?= $controller->link_for('course/overview', ['auswahl' => $auto_sem['seminar_id']]) ?>">
+ <a href="<?= URLHelper::getLink('seminar_main.php', ['auswahl' => $auto_sem['seminar_id']]) ?>">
<?= htmlReady($auto_sem['Name']) ?>
</a>
</td>
- <? endif ?>
- <? if ($typerow == 1) : ?>
- <td rowspan="<?= count($courses) ?>">
- <?= htmlReady($range_types[$auto_sem['range_type']]) ?>
- </td>
- <? endif ?>
+ <? endif; ?>
+ <td>
+ <?= htmlReady($range_types[$type]) ?>
+ </td>
<td>
<?= htmlReady($auto_sem['range_name']) ?>
</td>
<td>
- <?= htmlReady($auto_sem['status'] ?: _('alle')) ?>
+ <?= htmlReady($auto_sem['status']) ?: '-' ?>
</td>
-
- <td class="actions">
+ <td>
<a href="<?= $controller->delete($auto_sem['seminar_id'], $type, $auto_sem['range_id']) ?>">
<?= Icon::create(
'trash',
Icon::ROLE_CLICKABLE,
- ['title' => _('Veranstaltung entfernen'), 'class' => 'text-top']
+ ['title' => _('Zuordnung entfernen'), 'class' => 'text-top']
) ?>
</a>
</td>
</tr>
- <? $typerow++ ?>
- <? endforeach ?>
- <? $row++ ?>
+ <? $typerow++; endforeach ?>
<? endforeach ?>
<? endforeach ?>
<? endif ?>
diff --git a/lib/classes/AutoInsert.class.php b/lib/classes/AutoInsert.class.php
index 96f379c..2b7963e 100644
--- a/lib/classes/AutoInsert.class.php
+++ b/lib/classes/AutoInsert.class.php
@@ -52,26 +52,30 @@ class AutoInsert
private function loadSettings()
{
- $query = "SELECT a.seminar_id, GROUP_CONCAT(a.status,IF(LENGTH(a.range_id)=0,':keine',CONCAT(':',a.domain_id))) AS range_status, a,range_type, s.Name, s.Schreibzugriff, s.start_time ";
- $query .= "FROM auto_insert_sem a ";
- $query .= "JOIN seminare AS s USING (Seminar_id) ";
- $query .= "GROUP BY s.seminar_id ";
- $query .= "ORDER BY s.Name";
- $statement = DBManager::get()->query($query);
+ $query = "SELECT a.`seminar_id`, GROUP_CONCAT(a.`status`,IF(LENGTH(a.`range_id`)=0,':keine', " .
+ "CONCAT(':',a.`range_id`))) AS range_status, a.`range_type`, s.`Name`, s.`Schreibzugriff`, " .
+ "s.`start_time` ";
+ $query .= "FROM `auto_insert_sem` a ";
+ $query .= "JOIN `seminare` AS s USING (`Seminar_id`) ";
+ $query .= "GROUP BY s.`seminar_id`, a.`range_type` ";
+ $query .= "ORDER BY s.`Name`";
$statement = DBManager::get()->query($query);
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
+
foreach ($results as $result) {
if ($result['Schreibzugriff'] < 3) {
- $domains = explode(',', $result['domain_status']);
+ $ranges = explode(',', $result['range_status']);
- foreach ($domains as $domain) {
- $array = explode(':', $domain);
+ foreach ($ranges as $range) {
+ $array = explode(':', $range);
$key = $array[1] . '.' . $array[0];
- $this->settings[$key][$result['seminar_id']] = ['Seminar_id' => $result['seminar_id'],
- 'name' => $result['Name'],
- 'Schreibzugriff' => $result['Schreibzugriff'],
- 'start_time' => $result['start_time']];
+ $this->settings[$result['range_type']][$key][$result['seminar_id']] = [
+ 'Seminar_id' => $result['seminar_id'],
+ 'name' => $result['Name'],
+ 'Schreibzugriff' => $result['Schreibzugriff'],
+ 'start_time' => $result['start_time']
+ ];
}
}
}
@@ -95,33 +99,66 @@ class AutoInsert
* @return array 'added' Namen der Seminare in die der User eingetragen wurde
* array 'removed' Namen der Seminare aus denen der User ausgetragen wurde
*/
- public function saveUser($user_id, $status = false)
+ public function saveUser($user_id, $status = false, $check = 'domain', $range_id = '')
{
- $domains = [];
+ $entries = [];
if (!$status) {
$status = $GLOBALS['perm']->get_perm($user_id);
}
- foreach (UserDomain::getUserDomainsForUser($user_id) as $d) {
- $domains [] = $d->id; //Domains des Users
- }
- if (count($domains) === 0) {
- $domains [] = 'keine';
+ switch ($check) {
+ case 'degree':
+ foreach (UserStudyCourse::findByUser($user_id) as $entry) {
+ $entries[] = $entry->abschluss_id;
+ }
+ break;
+ case 'domain':
+ foreach (UserDomain::getUserDomainsForUser($user_id) as $d) {
+ $entries[] = $d->id; //Domains des Users
+ }
+
+ if (count($entries) === 0) {
+ $entries[] = 'keine';
+ }
+ break;
+ case 'institute':
+ $memberships = InstituteMember::findBySQL(
+ "`user_id` = :user AND `inst_perms` = :perm",
+ ['user' => $user_id, 'perm' => $status]
+ );
+
+ $entries = array_map(function ($m) { return $m->institut_id; }, $memberships);
+ break;
+ case 'semester':
+ foreach (UserStudyCourse::findByUser($user_id) as $entry) {
+ $entries[] = $entry->semester;
+ }
+ break;
+ case 'subject':
+ foreach (UserStudyCourse::findByUser($user_id) as $entry) {
+ $entries[] = $entry->fach_id;
+ }
+ break;
+
}
+
+ $entries = array_unique($entries);
+
$settings = [];
$all_seminare = [];
- foreach ($domains as $domain) {
-
- $key = $domain . '.' . $status;
- if (is_array($this->settings[$key])) {
- $id = key($this->settings[$key]);
- foreach ($this->settings[$key] as $id => $value) {
- $settings[$id] = $value;
+ foreach ($entries as $entry) {
+ $key = $entry . '.' . $status;
+ if (is_array($this->settings[$check][$key])) {
+ foreach ($this->settings[$check][$key] as $id => $value) {
+ $settings[$check][$id] = $value;
+ $all_seminare[$id] = $value;
}
}
- foreach ($this->settings as $key) {
- foreach ($key as $id => $sem) {
- $all_seminare[$id] = $sem;
+ }
+ foreach ($this->settings as $type) {
+ foreach ($type as $range) {
+ foreach ($range as $cid => $course) {
+ $all_seminare[$cid] = $course;
}
}
}
@@ -134,8 +171,8 @@ class AutoInsert
$seminare_tutor_dozent[$sem['Seminar_id']] = $sem;
}
}
- $toAdd = array_diff_key($settings, $seminare);
- $toRemove = array_diff_key($all_seminare, $toAdd, $settings, $seminare_tutor_dozent);
+ $toAdd = array_diff_key($settings[$check] ?: [], $seminare ?: []) ?: [];
+ $toRemove = array_diff_key($all_seminare ?: [], $toAdd ?: [], $settings[$check] ?: [], $seminare_tutor_dozent ?: []) ?: [];
$added = [];
$removed = [];
diff --git a/lib/models/InstituteMember.class.php b/lib/models/InstituteMember.class.php
index a501c61..d7d7daa 100644
--- a/lib/models/InstituteMember.class.php
+++ b/lib/models/InstituteMember.class.php
@@ -85,6 +85,21 @@ class InstituteMember extends SimpleORMap implements PrivacyObject
if ($institute) {
$institute->status_groups->removeUser($user_id, true);
+
+ AutoInsert::instance()->saveUser($user_id, $member->inst_perms, 'institute',
+ $member->institut_id);
+ }
+ };
+
+ $config['registered_callbacks']['after_create'][] = function ($member) {
+ AutoInsert::instance()->saveUser($member->user_id, $member->inst_perms, 'institute',
+ $member->institut_id);
+ };
+
+ $config['registered_callbacks']['before_update'][] = function ($member) {
+ if ($member->isFieldDirty('inst_perms')) {
+ AutoInsert::instance()->saveUser($member->user_id, $member->inst_perms, 'institute',
+ $member->institut_id);
}
};
diff --git a/lib/models/UserStudyCourse.class.php b/lib/models/UserStudyCourse.class.php
index ac7670c..965106a 100644
--- a/lib/models/UserStudyCourse.class.php
+++ b/lib/models/UserStudyCourse.class.php
@@ -45,6 +45,31 @@ class UserStudyCourse extends SimpleORMap implements PrivacyObject
$config['additional_fields']['degree_name'] = [];
$config['additional_fields']['studycourse_name'] = [];
+
+ $config['registered_callbacks']['after_create'][] = function ($entry) {
+ AutoInsert::instance()->saveUser($entry->user_id, false, 'degree', $entry->abschluss_id);
+ AutoInsert::instance()->saveUser($entry->user_id, false, 'subject', $entry->fach_id);
+ AutoInsert::instance()->saveUser($entry->user_id, false, 'semester', $entry->semester);
+ };
+
+ $config['registered_callbacks']['after_delete'][] = function ($entry) {
+ AutoInsert::instance()->saveUser($entry->user_id, false, 'degree', $entry->abschluss_id);
+ AutoInsert::instance()->saveUser($entry->user_id, false, 'subject', $entry->fach_id);
+ AutoInsert::instance()->saveUser($entry->user_id, false, 'semester', $entry->semester);
+ };
+
+ $config['registered_callbacks']['before_update'][] = function ($entry) {
+ if ($entry->isFieldDirty('abschluss_id')) {
+ AutoInsert::instance()->saveUser($entry->user_id, false, 'degree', $entry->abschluss_id);
+ }
+ if ($entry->isFieldDirty('fach_id')) {
+ AutoInsert::instance()->saveUser($entry->user_id, false, 'subject', $entry->fach_id);
+ }
+ if ($entry->isFieldDirty('semester')) {
+ AutoInsert::instance()->saveUser($entry->user_id, false, 'semester', $entry->semester);
+ }
+ };
+
parent::configure($config);
}