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
*/
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:
PageLayout::setTitle(_('Veranstaltungszuordnungen bearbeiten'));
Navigation::activateItem('/browse/my_courses/list');
$GLOBALS['perm']->check('admin');
// check the assign_semtree array and extract the relevant course IDs:
$courseIds = Request::optionArray('assign_semtree');
$order = Config::get()->IMPORTANT_SEMNUMBER
? "ORDER BY `start_time` DESC, `VeranstaltungsNummer`, `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');
// check if at least one course was selected (this can only happen from admin courses overview):
if (!$courseIds) {
PageLayout::postWarning('Es wurde keine Veranstaltung gewählt.');
if (count($this->courses) === 0) {
PageLayout::postWarning('Es wurde keine Veranstaltung gewählt oder die Zuordnungen können ' .
'nicht bearbeitet werden.');
$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.
* @return void
*/
public function do_batch_assign_action()
{
$GLOBALS['perm']->check('admin');
$astmt = DBManager::get()->prepare("INSERT IGNORE INTO `seminar_sem_tree` VALUES (:course, :node)");
$dstmt = DBManager::get()->prepare(
"DELETE FROM `seminar_sem_tree` WHERE `seminar_id` IN (:courses) AND `sem_tree_id` = :node");
if (!$GLOBALS['perm']->have_perm('admin')
&& !RolePersistence::isAssignedRole(User::findCurrent()->id, 'DedicatedAdmin')) {
throw new AccessDeniedException();
}
CSRFProtection::verifyUnsafeRequest();
$success = true;
// Add course assignments to the specified nodes.
foreach (Request::optionArray('courses') as $course) {
foreach (Request::optionArray('add_assignments') as $a) {
$success = $astmt->execute(['course' => $course, 'node' => $a]);
$courses = Course::findMany(Request::optionArray('courses'));
foreach ($courses as $course) {
if ($GLOBALS['perm']->have_studip_perm('tutor', $course->id)) {
$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) {
PageLayout::postSuccess(_('Die Zuordnungen wurden gespeichert.'));
} 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">
<?= CSRFProtection::tokenTag() ?>
<fieldset>
<legend><?= _('Studienbereichszuordnungen der ausgewählten Veranstaltungen bearbeiten') ?></legend>
<div data-studip-tree>
......
This diff is collapsed.
......@@ -157,6 +157,13 @@ class GarbageCollectorJob extends CronJob
$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
$cache = new StudipDbCache();
$cache->purge();
......
......@@ -278,6 +278,10 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe
"UPDATE `seminare` SET `parent_course` = NULL WHERE `parent_course` = :course",
['course' => $course->id]
);
DBManager::get()->execute(
"DELETE FROM `forum_visits` WHERE `seminar_id` = ?",
[$course->id]
);
};
parent::configure($config);
......
......@@ -211,6 +211,7 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
};
$config['registered_callbacks']['after_delete'][] = 'cbRemoveFeedback';
$config['registered_callbacks']['after_delete'][] = 'cbRemoveForumVisits';
$config['registered_callbacks']['before_store'][] = 'cbClearCaches';
$config['registered_callbacks']['before_store'][] = 'cbStudipLog';
......@@ -1490,6 +1491,17 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
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()
{
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__
System: Komplett neue Navigation auf Mobilgeräten
System: Kompatibilität mit PHP 8.0
System: Optionaler Virenscan beim Upload von Dateien
System: Usabilityverbesserung von Drag&Drop-Elementen
Fragebögen: Neue Fragetypen
Courseware: Zertifikatsversand
Courseware: Vereinfachtes Anordnen von Blöcken und Abschnitten, Verschieben von Blöcken im Inhaltsverzeichnis
Courseware: Optimierte Darstellung mehrerer Lernmaterialien
Raumverwaltung: Usability beim Stellen von Raumanfragen verbessert
Barrierefreiheit: Neue HTML-Strukturen
- System: Komplett neue Navigation auf Mobilgeräten
- System: Kompatibilität mit PHP 8.0
- System: Optionaler Virenscan beim Upload von Dateien
- System: Usabilityverbesserung von Drag&Drop-Elementen
- Fragebögen: Neue Fragetypen
- Courseware: Zertifikatsversand
- Courseware: Vereinfachtes Anordnen von Blöcken und Abschnitten, Verschieben von Blöcken im Inhaltsverzeichnis
- Courseware: Optimierte Darstellung mehrerer Lernmaterialien
- Raumverwaltung: Usability beim Stellen von Raumanfragen verbessert
- Barrierefreiheit: Neue HTML-Strukturen
__18.11.2022 V 5.2__
- Courseware: Verknüpfung von einem Lernmaterial in beliebig viele Bereiche
......