Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • alexander.vorwerk/studip
  • hochschule-wismar/stud-ip
  • tleilax/studip
  • marcus/studip
  • manschwa/studip
  • eberhardt/studip
  • uol/studip
  • pluta/studip
  • thienel/extern-uni-b
  • studip/studip
  • strohm/studip
  • uni-osnabrueck/studip
  • FloB/studip
  • universit-t-rostock/studip
  • Robinyyy/studip
  • jakob.diel/studip
  • HyperSpeeed/studip
  • ann/studip
  • nod3zer0/stud-ip-siple-saml-php-plugin
19 results
Show changes
Commits on Source (4)
...@@ -184,64 +184,78 @@ class Admin_TreeController extends AuthenticatedController ...@@ -184,64 +184,78 @@ class Admin_TreeController extends AuthenticatedController
*/ */
public function batch_assign_semtree_action() public function batch_assign_semtree_action()
{ {
$GLOBALS['perm']->check('admin'); if (!$GLOBALS['perm']->have_perm('admin')
&& !RolePersistence::isAssignedRole(User::findCurrent()->id, 'DedicatedAdmin')) {
throw new AccessDeniedException();
}
//set the page title with the area of Stud.IP: //set the page title with the area of Stud.IP:
PageLayout::setTitle(_('Veranstaltungszuordnungen bearbeiten')); PageLayout::setTitle(_('Veranstaltungszuordnungen bearbeiten'));
Navigation::activateItem('/browse/my_courses/list'); Navigation::activateItem('/browse/my_courses/list');
$GLOBALS['perm']->check('admin');
// check the assign_semtree array and extract the relevant course IDs: // check the assign_semtree array and extract the relevant course IDs:
$courseIds = Request::optionArray('assign_semtree'); $courseIds = Request::optionArray('assign_semtree');
$order = Config::get()->IMPORTANT_SEMNUMBER $order = Config::get()->IMPORTANT_SEMNUMBER
? "ORDER BY `start_time` DESC, `VeranstaltungsNummer`, `Name`" ? "ORDER BY `start_time` DESC, `VeranstaltungsNummer`, `Name`"
: "ORDER BY `start_time` DESC, `Name`"; : "ORDER BY `start_time` DESC, `Name`";
$this->courses = Course::findMany($courseIds, $order); $this->courses = array_filter(
Course::findMany($courseIds, $order),
function (Course $course): bool {
/*
* Check if sem_tree entries are allowed and may be changed and remove all courses
* where this is not the case.
*/
return !LockRules::Check($course->id, 'sem_tree', 'sem')
&& $course->getSemClass()['bereiche'];
}
);
$this->return = Request::get('return'); $this->return = Request::get('return');
// check if at least one course was selected (this can only happen from admin courses overview): // check if at least one course was selected (this can only happen from admin courses overview):
if (!$courseIds) { if (count($this->courses) === 0) {
PageLayout::postWarning('Es wurde keine Veranstaltung gewählt.'); PageLayout::postWarning('Es wurde keine Veranstaltung gewählt oder die Zuordnungen können ' .
'nicht bearbeitet werden.');
$this->relocate('admin/courses'); $this->relocate('admin/courses');
} }
} }
public function assign_courses_action($class_id)
{
$GLOBALS['perm']->check('root');
$data = $this->checkClassAndId($class_id);
$GLOBALS['perm']->check('admin');
$this->search = QuickSearch::get('courses[]', new StandardSearch('Seminar_id'))->withButton();
$this->node = $data['id'];
}
/** /**
* Store (de-)assignments from courses to sem_tree nodes. * Store (de-)assignments from courses to sem_tree nodes.
* @return void * @return void
*/ */
public function do_batch_assign_action() public function do_batch_assign_action()
{ {
$GLOBALS['perm']->check('admin'); if (!$GLOBALS['perm']->have_perm('admin')
$astmt = DBManager::get()->prepare("INSERT IGNORE INTO `seminar_sem_tree` VALUES (:course, :node)"); && !RolePersistence::isAssignedRole(User::findCurrent()->id, 'DedicatedAdmin')) {
$dstmt = DBManager::get()->prepare( throw new AccessDeniedException();
"DELETE FROM `seminar_sem_tree` WHERE `seminar_id` IN (:courses) AND `sem_tree_id` = :node"); }
CSRFProtection::verifyUnsafeRequest();
$success = true; $success = true;
// Add course assignments to the specified nodes. $courses = Course::findMany(Request::optionArray('courses'));
foreach (Request::optionArray('courses') as $course) { foreach ($courses as $course) {
foreach (Request::optionArray('add_assignments') as $a) { if ($GLOBALS['perm']->have_studip_perm('tutor', $course->id)) {
$success = $astmt->execute(['course' => $course, 'node' => $a]); $areas = $course->study_areas->pluck('sem_tree_id');
$newAreas = array_merge($areas, Request::optionArray('add_assignments'));
$delete = Request::optionArray('delete_assignments');
$changed = array_diff($newAreas, $delete);
// Set new areas for course if at least one area remains.
if (count($changed) > 0) {
$course->setStudyAreas($changed);
// Allow to remove all study areas only when there are modules.
} else if ($course->getSemClass()['module'] && count(Lvgruppe::findBySeminar($course->id))) {
$course->setStudyAreas($changed);
} else {
$success = false;
}
} else {
$success = false;
} }
} }
// Remove course assignments from the specified nodes.
foreach (Request::optionArray('delete_assignments') as $d) {
$success = $dstmt->execute(['courses' => Request::optionArray('courses'), 'node' => $d]);
}
if ($success) { if ($success) {
PageLayout::postSuccess(_('Die Zuordnungen wurden gespeichert.')); PageLayout::postSuccess(_('Die Zuordnungen wurden gespeichert.'));
} else { } else {
......
<form action="<?= $controller->link_for('admin/tree/do_batch_assign') ?>" method="post">
<section>
<?= $search->render() ?>
</section>
<input type="hidden" name="node" value="<?= htmlReady($node) ?>">
<footer data-dialog-button>
<?= Studip\Button::createAccept(_('Zuordnen'), 'assign') ?>
<?= Studip\Button::createCancel(_('Abbrechen'), 'cancel', ['data-dialog' => 'close']) ?>
</footer>
</form>
<form class="default" action="<?= $controller->link_for('admin/tree/do_batch_assign') ?>" method="post"> <form class="default" action="<?= $controller->link_for('admin/tree/do_batch_assign') ?>" method="post">
<?= CSRFProtection::tokenTag() ?>
<fieldset> <fieldset>
<legend><?= _('Studienbereichszuordnungen der ausgewählten Veranstaltungen bearbeiten') ?></legend> <legend><?= _('Studienbereichszuordnungen der ausgewählten Veranstaltungen bearbeiten') ?></legend>
<div data-studip-tree> <div data-studip-tree>
......
This diff is collapsed.
...@@ -157,6 +157,13 @@ class GarbageCollectorJob extends CronJob ...@@ -157,6 +157,13 @@ class GarbageCollectorJob extends CronJob
$statement->execute(); $statement->execute();
} }
// Remove outdated entries from forum_visits
$query = "DELETE FROM `forum_visits`
WHERE GREATEST(`visitdate`, `last_visitdate`) < UNIX_TIMESTAMP() - :threshold";
DBManager::get()->execute($query, [
':threshold' => ForumVisit::LAST_VISIT_MAX,
]);
// clean db cache // clean db cache
$cache = new StudipDbCache(); $cache = new StudipDbCache();
$cache->purge(); $cache->purge();
......
...@@ -278,6 +278,10 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe ...@@ -278,6 +278,10 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe
"UPDATE `seminare` SET `parent_course` = NULL WHERE `parent_course` = :course", "UPDATE `seminare` SET `parent_course` = NULL WHERE `parent_course` = :course",
['course' => $course->id] ['course' => $course->id]
); );
DBManager::get()->execute(
"DELETE FROM `forum_visits` WHERE `seminar_id` = ?",
[$course->id]
);
}; };
parent::configure($config); parent::configure($config);
......
...@@ -211,6 +211,7 @@ class User extends AuthUserMd5 implements Range, PrivacyObject ...@@ -211,6 +211,7 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
}; };
$config['registered_callbacks']['after_delete'][] = 'cbRemoveFeedback'; $config['registered_callbacks']['after_delete'][] = 'cbRemoveFeedback';
$config['registered_callbacks']['after_delete'][] = 'cbRemoveForumVisits';
$config['registered_callbacks']['before_store'][] = 'cbClearCaches'; $config['registered_callbacks']['before_store'][] = 'cbClearCaches';
$config['registered_callbacks']['before_store'][] = 'cbStudipLog'; $config['registered_callbacks']['before_store'][] = 'cbStudipLog';
...@@ -1490,6 +1491,17 @@ class User extends AuthUserMd5 implements Range, PrivacyObject ...@@ -1490,6 +1491,17 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
FeedbackEntry::deleteBySQL('user_id = ?', [$this->id]); FeedbackEntry::deleteBySQL('user_id = ?', [$this->id]);
} }
/**
* This callback is called after deleting a User.
* It removes forum visit entries that are associated with the User.
*/
public function cbRemoveForumVisits()
{
$query = "DELETE FROM `forum_visits`
WHERE `user_id` = ?";
DBManager::get()->execute($query, [$this->id]);
}
public function cbClearCaches() public function cbClearCaches()
{ {
if ($this->isFieldDirty('perms')) { if ($this->isFieldDirty('perms')) {
......
__08.11.2023 V 5.4__
- System: Komplett neu entwickelte Verzeichnisstrukturen
- System: Systemweiter Pool von Bilder
- System: Barrierefreiheitserklärung und Meldefunktion integriert
- System: WYSWIG-Editor hat einen kompakten Modus zur Nutzung auf Mobilgeräten bekommen
- Raumverwaltung: Vereinfachte Raumanfragen
- Raumverwaltung: Sammelaktionen
- Veranstaltungen: "Mehr"-Seite gibt es nicht mehr als separaten Reiter. Die Verwaltung der Veranstaltungswerkzeuge passiert jetzt auf der Verwaltungsseite
- Veranstaltungen: Hauptordner im Dateibereich lässt sich für Uploads von Teilnehmenden sperren.
- Courseware: Jede Courseware ist nun ein einzelnes Lernmaterial und kann kopiert, exportiert, importiert und mit einem eigenen Lernfortschritt versehen werden.
- Courseware: Sammelmappe für Abschnitte und Blöcke
- Courseware: Übersichtsseite für Feedback und Kommentare
- Courseware: Neue Blöcke zur Darstellung eines Lebenslaufs
- Courseware: Funktionen zum Teilen von Seiten an Peers
- Courseware: Übersichtsseite für verteilte Aufgaben mit Bearbeitungsstatus, Feedbackfunktion und Fristverlängerungsanfrage
__11.03.2023 V 5.3__ __11.03.2023 V 5.3__
System: Komplett neue Navigation auf Mobilgeräten - System: Komplett neue Navigation auf Mobilgeräten
System: Kompatibilität mit PHP 8.0 - System: Kompatibilität mit PHP 8.0
System: Optionaler Virenscan beim Upload von Dateien - System: Optionaler Virenscan beim Upload von Dateien
System: Usabilityverbesserung von Drag&Drop-Elementen - System: Usabilityverbesserung von Drag&Drop-Elementen
Fragebögen: Neue Fragetypen - Fragebögen: Neue Fragetypen
Courseware: Zertifikatsversand - Courseware: Zertifikatsversand
Courseware: Vereinfachtes Anordnen von Blöcken und Abschnitten, Verschieben von Blöcken im Inhaltsverzeichnis - Courseware: Vereinfachtes Anordnen von Blöcken und Abschnitten, Verschieben von Blöcken im Inhaltsverzeichnis
Courseware: Optimierte Darstellung mehrerer Lernmaterialien - Courseware: Optimierte Darstellung mehrerer Lernmaterialien
Raumverwaltung: Usability beim Stellen von Raumanfragen verbessert - Raumverwaltung: Usability beim Stellen von Raumanfragen verbessert
Barrierefreiheit: Neue HTML-Strukturen - Barrierefreiheit: Neue HTML-Strukturen
__18.11.2022 V 5.2__ __18.11.2022 V 5.2__
- Courseware: Verknüpfung von einem Lernmaterial in beliebig viele Bereiche - Courseware: Verknüpfung von einem Lernmaterial in beliebig viele Bereiche
......