Skip to content
Snippets Groups Projects
Commit fbf008ef authored by Moritz Strohm's avatar Moritz Strohm
Browse files

TIC 4391, closes #4391

Closes #4391

Merge request !3211
parent 1efacbf3
Branches
No related tags found
No related merge requests found
Showing
with 127 additions and 259 deletions
......@@ -74,6 +74,9 @@
- Als Ersatz für viele Methoden der Seminar-Klasse dienen die Klassen `Course`, `CourseDate` und `SeminarCycleDate`, sowie die neue `CourseDateList`-Klasse.
- Die Klassen `TreeAbstract`, `TreeView` und `SemBrowse` wurden ausgebaut. ([Issue #4392](https://gitlab.studip.de/studip/studip/-/issues/4392))
- Zur Anzeige von Baumstrukturen können als Ersatz die Implementierungen des `StudipTreeNode`-Interfaces genutzt werden.
- Die Zuordnung von Veranstaltungen zu Semestern anhand von Timestamps wurde entfernt. In der Datenbank wurden die Spalten `start_time` und `duration_time` der Tabelle `seminare` entfernt. ([Issue #4391]https://gitlab.studip.de/studip/studip/-/issues/4391))
- Plugins, die Veranstaltungen anhand von Timestamps laden oder anderweitig verwenden, müssen angepasst werden!
- Das Mapping von Veranstaltungen zu Semestern findet nun ausschließlich anhand der Semester-ID über die Verknüpfungstabelle `semester_courses` statt.
## Security related issues
......
......@@ -238,8 +238,8 @@ class Admin_TreeController extends AuthenticatedController
$courseIds = Request::optionArray('assign_semtree');
$order = Config::get()->IMPORTANT_SEMNUMBER
? "ORDER BY `start_time` DESC, `VeranstaltungsNummer`, `Name`"
: "ORDER BY `start_time` DESC, `Name`";
? "ORDER BY `VeranstaltungsNummer`, `Name`"
: "ORDER BY `Name`";
$this->courses = array_filter(
Course::findMany($courseIds, $order),
function (Course $course): bool {
......
......@@ -1634,8 +1634,8 @@ class Admin_UserController extends AuthenticatedController
$courseIds = Request::optionArray('export_members');
$order = Config::get()->IMPORTANT_SEMNUMBER
? "ORDER BY `start_time` DESC, `VeranstaltungsNummer`, `Name`"
: "ORDER BY `start_time` DESC, `Name`";
? "ORDER BY `VeranstaltungsNummer`, `Name`"
: "ORDER BY `Name`";
$this->courses = array_filter(
Course::findMany($courseIds, $order),
function (Course $course): bool {
......
......@@ -86,6 +86,7 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
_("Endzeitpunkt")];
$data = [];
foreach ($this->courses as $course) {
$sorm_course = Course::find($course['seminare.seminar_id']);
$row = [];
$row[] = $course['cs_name'];
$row[] = $course['course_number'];
......@@ -96,8 +97,8 @@ class Admission_RestrictedCoursesController extends AuthenticatedController
$row[] = (int)$course['count_prelim'];
$row[] = (int)$course['count_waiting'];
$row[] = $course['distribution_time'] ? strftime('%x %R', $course['distribution_time']) : '';
$row[] = isset($course['start_time']) ? strftime('%x %R', $course['start_time']) : '';
$row[] = isset($course['end_time']) ? strftime('%x %R', $course['end_time']) : '';
$row[] = $sorm_course?->getStartSemester()?->beginn ?? '';
$row[] = $sorm_course?->getEndSemester()?->ende ?? '';
$data[] = $row;
}
......
......@@ -171,46 +171,6 @@ class Contents_CoursewareController extends CoursewareController
$this->sem_courses = $this->getCoursewareCourses($sem_key);
}
public function pdf_export_action($element_id, $with_children): void
{
$element = \Courseware\StructuralElement::findOneById($element_id);
$this->render_pdf($element->pdfExport($this->user, $with_children), trim($element->title).'.pdf');
}
/**
* To display the shared courseware
*
* @param string $entry_element_id the shared struct element id
*/
public function shared_content_courseware_action($entry_element_id): void
{
global $user;
$navigation = new Navigation(_('Geteiltes Lernmaterial'), 'dispatch.php/contents/courseware/shared_content_courseware/' . $entry_element_id);
Navigation::addItem('/contents/courseware/shared_content_courseware', $navigation);
Navigation::activateItem('/contents/courseware/shared_content_courseware');
$this->entry_element_id = $entry_element_id;
$struct = \Courseware\StructuralElement::findOneBySQL(
"id = ? AND range_type = 'user'",
[$this->entry_element_id]
);
if (!$struct) {
throw new Trails\Exception(404, _('Der geteilte Inhalt kann nicht gefunden werden.'));
}
if (!$struct->canRead($user) && !$struct->canEdit($user)) {
throw new AccessDeniedException();
}
$this->user_id = $struct->owner_id;
$this->setCoursewareSidebar();
}
/**
* Return list of coursewares grouped by semester_id
*
......
......@@ -102,22 +102,18 @@ class Course_DatesController extends AuthenticatedController
);
$sidebar->addWidget($actions);
$course_end_time = $this->course->getEnd_Time();
if (($course_end_time == -1) || ($course_end_time > 0)) {
if (count($this->course->semesters) !== 1) {
//The course has more than one semester:
$semester_widget = new SemesterSelectorWidget(
$this->url_for('course/dates/index')
);
$semester_end_range = $course_end_time;
if ($semester_end_range == -1) {
//The end semester is set to unlimited.
$semester_end_range = PHP_INT_MAX;
}
$semester_widget->includeAll();
if ($this->course->start_semester && $this->course->end_semester) {
$semester_widget->setRange(
$this->course->start_time,
$semester_end_range
$this->course->start_semester->beginn,
$this->course->end_semester->ende
);
}
$sidebar->addWidget($semester_widget);
}
......
......@@ -98,11 +98,9 @@ class Course_DetailsController extends AuthenticatedController
// Ausgabe der Modulzuordnung MVV
if ($this->course->getSemClass()->offsetGet('module')) {
$course_start = $this->course->start_time;
$course_end = ($this->course->end_time < 0 || is_null($this->course->end_time))
? PHP_INT_MAX
: $this->course->end_time;
// set filter to show only pathes with valid semester data
$course_start = $this->course->start_semester?->beginn ?? 0;
$course_end = $this->course->end_semester?->ende ?? PHP_INT_MAX;
//Set the filter to show only paths with valid semester data:
ModuleManagementModelTreeItem::setObjectFilter('Modul',
function ($modul) use ($course_start, $course_end) {
// check for public status
......
......@@ -69,8 +69,10 @@ class LtiController extends AuthenticatedController
];
$sql = "JOIN seminar_user USING(Seminar_id)
LEFT JOIN semester_courses sc ON seminare.seminar_id = sc.course_id
LEFT JOIN semester_data s USING (semester_id)
WHERE user_id = ? AND seminar_user.status IN ('dozent', 'tutor')
ORDER BY start_time DESC, Name";
ORDER BY s.beginn DESC, Name";
$this->courses = Course::findBySQL($sql, [$GLOBALS['user']->id]);
}
......
......@@ -577,7 +577,7 @@ class MyCoursesController extends AuthenticatedController
LEFT JOIN archiv USING (seminar_id)
WHERE user_id = :user_id
GROUP BY seminar_id
ORDER BY start_time DESC, :sortby";
ORDER BY mkdate DESC, :sortby";
$statement = DBManager::get()->prepare($query);
$statement->bindValue(':user_id', $GLOBALS['user']->id);
$statement->bindValue(':sortby', $sortby, StudipPDO::PARAM_COLUMN);
......
......@@ -621,150 +621,6 @@ class NewsController extends StudipController
return strtotime($date);
}
/**
* Searchs for studip areas using given search term
*
* @param string $term search term
* @return array area data
*/
private function search_area($term)
{
global $perm;
$result = $tmp_result = [];
if (mb_strlen($term) < 3) {
PageLayout::postError(_('Der Suchbegriff muss mindestens drei Zeichen lang sein.'));
return $result;
}
if ($term === '__THIS_SEMESTER__') {
$current_semester = Semester::findCurrent();
$query = "SELECT seminare.Name AS sem_name, seminare.Seminar_id, seminare.visible
FROM seminar_user
LEFT JOIN seminare USING (Seminar_id)
LEFT JOIN semester_courses ON (semester_courses.course_id = seminar_user.Seminar_id)
WHERE seminar_user.user_id = :user_id
AND seminar_user.status IN('tutor', 'dozent')
AND (semester_courses.semester_id = :semester_id OR semester_courses.semester_id IS NULL)
";
if (Config::get()->DEPUTIES_ENABLE) {
$query .= " UNION SELECT CONCAT(seminare.Name, ' ["._("Vertretung")."]') AS sem_name, seminare.Seminar_id,
seminare.visible
FROM deputies
LEFT JOIN seminare ON (deputies.range_id=seminare.Seminar_id)
LEFT JOIN semester_courses ON (semester_courses.course_id = deputies.range_id)
WHERE deputies.user_id = :user_id
AND (semester_courses.semester_id = :semester_id OR semester_courses.semester_id IS NULL)";
}
$query .= " ORDER BY sem_name ASC";
$statement = DBManager::get()->prepare($query);
$statement->bindValue(':user_id', $GLOBALS['user']->id);
$statement->bindValue(':semester_id', $current_semester->semester_id);
$statement->execute();
$seminars = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach($seminars as $sem) {
$tmp_result[$sem['Seminar_id']] = [
'name' => $sem['sem_name'],
'type' => 'sem',
];
}
$term = '';
} elseif ($term === '__NEXT_SEMESTER__') {
$next_semester = Semester::findNext();
$query = "SELECT seminare.Name AS sem_name, seminare.Seminar_id, seminare.visible
FROM seminar_user
LEFT JOIN seminare USING (Seminar_id)
LEFT JOIN semester_courses ON (semester_courses.course_id = seminar_user.Seminar_id)
WHERE seminar_user.user_id = :user_id
AND seminar_user.status IN('tutor', 'dozent')
AND (semester_courses.semester_id = :semester_id OR semester_courses.semester_id IS NULL)";
if (Config::get()->DEPUTIES_ENABLE) {
$query .= " UNION SELECT CONCAT(seminare.Name, ' ["._("Vertretung")."]') AS sem_name, seminare.Seminar_id,
seminare.visible
FROM deputies
LEFT JOIN seminare ON (deputies.range_id=seminare.Seminar_id)
LEFT JOIN semester_courses ON (semester_courses.course_id = deputies.range_id)
WHERE deputies.user_id = :user_id
AND (semester_courses.semester_id = :semester_id OR semester_courses.semester_id IS NULL)";
}
$query .= " ORDER BY sem_name ASC";
$statement = DBManager::get()->prepare($query);
$statement->bindValue(':user_id', $GLOBALS['user']->id);
$statement->bindValue(':semester_id', $next_semester->semester_id);
$statement->execute();
$seminars = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach($seminars as $sem) {
$tmp_result[$sem['Seminar_id']] = [
'name' => $sem['sem_name'],
'type' => 'sem',
];
}
$term = '';
} elseif ($term === '__MY_INSTITUTES__') {
$term = '';
if ($perm->have_perm('root')) {
$tmp_result['studip'] = [
'name' => 'Stud.IP',
'type' => 'global'
];
}
$inst_list = Institute::getMyInstitutes();
if (count($inst_list)) {
foreach($inst_list as $data) {
$tmp_result[$data['Institut_id']] = [
'name' => $data['Name'],
'type' => $data['is_fak'] ? 'fak' : 'inst'
];
}
}
} else {
$tmp_result = search_range($term, true) ?: [];
// add users
if (mb_stripos(get_fullname(), $term) !== false) {
$tmp_result[$GLOBALS['user']->id] = [
'name' => get_fullname(),
'type' => 'user'
];
}
if (Deputy::isEditActivated()) {
$query = "SELECT DISTINCT a.user_id
FROM deputies d
JOIN auth_user_md5 a ON (d.range_id = a.user_id)
JOIN user_info u ON (a.user_id=u.user_id)
WHERE d.user_id = ?
AND CONCAT(u.title_front, ' ', a.Vorname, ' ', a.Nachname, ', ', u.title_rear) LIKE CONCAT('%',?,'%')";
$statement = DBManager::get()->prepare($query);
$statement->execute([$GLOBALS['user']->id, $term]);
while ($data = $statement->fetch(PDO::FETCH_ASSOC)) {
$tmp_result[$data['user_id']] = [
'name' => get_fullname($data['user_id']),
'type' => 'user',
];
}
}
}
// workaround: apply search term (ignored by search_range below admin)
if (count($tmp_result) && !$GLOBALS['perm']->have_perm('admin') && $term) {
foreach ($tmp_result as $id => $data) {
if (mb_stripos($data['name'], $term) === false) {
unset($tmp_result[$id]);
}
}
}
// prepare result
if (count($tmp_result)) {
foreach ($tmp_result as $id => $data) {
$index = $data['type'] === 'fak'
? 'inst'
: $data['type'];
$result[$index][$id] = $data['name'];
}
} elseif ($term) {
PageLayout::postError(_('Zu diesem Suchbegriff wurden keine Bereiche gefunden.'));
}
return $result;
}
public function rss_config_action($range_id)
{
if (!Config::get()->NEWS_RSS_EXPORT_ENABLE || !StudipNews::haveRangePermission('edit', $range_id)) {
......
......@@ -158,12 +158,18 @@ if (isset($flash['error'])) {
<?= sprintf(_("%s zugewiesene Veranstaltungen"), count($courseIds)) ?>
<? else : ?>
<?
Course::findEachMany(function($c) {
Course::findEachBySQL(
function($c) {
echo htmlReady($c->getFullName('number-name-semester'));
echo '<br>';
},
$courseIds,
'ORDER BY start_time,VeranstaltungsNummer,Name');
"JOIN `semester_courses`
ON `seminare`.`seminar_id` = `semester_courses`.`course_id`
JOIN `semester_data` USING (`semester_id`)
WHERE `seminare`.`seminar_id` IN ( :course_ids )
'ORDER BY `semester_data`.`beginn`, `VeranstaltungsNummer`, `Name`",
['course_ids' => $courseIds],
)
?>
<? endif ?>
<? endif ?>
......
......@@ -41,11 +41,11 @@
<td style="white-space:nowrap" data-sort-value="<?= (int) $course['distribution_time']?>">
<?= htmlReady($course['distribution_time'] ? strftime('%x %R', $course['distribution_time']) : '-') ?>
</td>
<td style="white-space:nowrap" data-sort-value="<?= (int) ($course['start_time'] ?? null) ?>">
<?= htmlReady(isset($course['start_time']) ? strftime('%x %R', $course['start_time']) : '-') ?>
<td style="white-space:nowrap" data-sort-value="<?= (int) ($course->start_semester->beginn ?? null) ?>">
<?= htmlReady(($course->start_semester instanceof Semester) ? strftime('%x %R', $course->start_semester->beginn) : '-') ?>
</td>
<td style="white-space:nowrap" data-sort-value="<?= (int) ($course['end_time'] ?? null) ?>">
<?= htmlReady(isset($course['end_time']) ? strftime('%x %R', $course['end_time']) : '-') ?>
<td style="white-space:nowrap" data-sort-value="<?= (int) ($course->end_semester->ende ?? null) ?>">
<?= htmlReady(($course->end_semester instanceof Semester) ? strftime('%x %R', $course->end_semester->ende) : '-') ?>
</td>
</tr>
<? endforeach ?>
......
<?php
/**
* @var Semester[] $semesters
*/
?>
<legend>
<?= _('Grunddaten') ?>
</legend>
......@@ -21,13 +26,18 @@
<label for="wizard-start-time" class="required">
<?= _('Semester') ?>
</label>
<select name="start_time" id="wizard-start-time" >
<?php foreach (array_reverse($semesters) as $semester) { ?>
<? ($values['start_time'] < time()) ? (($semester->beginn <= time() && time() <= $semester->ende) ? $values['start_time'] = $semester->beginn : '' ): '' ?>
<option value="<?= $semester->beginn ?>"<?= $semester->beginn == $values['start_time'] ? ' selected="selected"' : '' ?>>
<select name="semester_id" id="wizard-start-time" >
<?php
$default_semester = Semester::findDefault();
if ($default_semester && empty($values['start_semester'])) {
$values['start_semester'] = $default_semester;
}
?>
<?php foreach (array_reverse($semesters) as $semester) : ?>
<option value="<?= htmlReady($semester->id) ?>" <?= $semester->id == $values['start_semester'] ? ' selected' : '' ?>>
<?= htmlReady($semester->name) ?>
</option>
<?php } ?>
<?php endforeach ?>
</select>
</section>
<section>
......
......@@ -71,9 +71,9 @@
<?= _('Einverstanden') ?>
</label>
<input type="hidden" name="institute" value="<?= htmlReady($values['institute']) ?>">
<input type="hidden" name="start_time" value="<?= htmlReady($values['start_time']) ?>">
<input type="hidden" name="institute" value="<?= $values['institute'] ?>"/>
<input type="hidden" name="start_semester" value="<?= htmlReady($values['start_semester']) ?>">
<input type="hidden" name="studygroup" value="1"/>
<?php foreach ($values['lecturers'] as $id => $assigned) : ?>
<input type="hidden" name="lecturers[<?= htmlReady($id) ?>]" value="1">
<input type="hidden" name="lecturers[<?= $id ?>]" value="1"/>
<?php endforeach ?>
<?php
/**
* @var Course[] $courses
*/
?>
<td colspan="6">
<table class="default nohover">
<colgroup>
......@@ -80,7 +85,7 @@
<? foreach ($courses[$semester->id] as $course) : ?>
<li>
<a href="<?= URLHelper::getLink('dispatch.php/course/details', ['sem_id' => $course['seminar_id']]) ?>">
<?= htmlReady(($course['VeranstaltungsNummer'] ? $course['VeranstaltungsNummer'] . ' - ' : '') . $course['Name']) ?>
<?= htmlReady($course->getFullName('number-name')) ?>
</a>
</li>
<? endforeach; ?>
......@@ -99,7 +104,7 @@
<? foreach ($courses[$semester->id] as $course) : ?>
<li>
<a href="<?= URLHelper::getLink('dispatch.php/course/details', ['sem_id' => $course['seminar_id']]) ?>">
<?= htmlReady(($course['VeranstaltungsNummer'] ? $course['VeranstaltungsNummer'] . ' - ' : '') . $course['Name']) ?>
<?= htmlReady($course->getFullName('number-name')) ?>
</a>
</li>
<? endforeach; ?>
......
<?php
class RemoveCourseMappingByTimestamps extends Migration
{
public function description()
{
return 'Removes the mapping of courses to semesters by timestamps (by removing seminare.start_time and seminare.duration_time).';
}
public function up()
{
$db = DBManager::get();
$db->exec(
"ALTER TABLE `seminare`
DROP COLUMN `start_time`,
DROP COLUMN `duration_time`"
);
}
protected function down()
{
$db = DBManager::get();
$db->exec(
"ALTER TABLE `seminare`
ADD COLUMN start_time INT(11) UNSIGNED NULL DEFAULT 0,
ADD COLUMN duration_time INT(11) NULL DEFAULT NULL"
);
}
}
......@@ -52,7 +52,7 @@ class AutoInsert
private function loadSettings()
{
$query = "SELECT a.seminar_id, GROUP_CONCAT(a.status,IF(LENGTH(a.domain_id)=0,':keine',CONCAT(':',a.domain_id))) AS domain_status, s.Name, s.Schreibzugriff, s.start_time ";
$query = "SELECT a.seminar_id, GROUP_CONCAT(a.status,IF(LENGTH(a.domain_id)=0,':keine',CONCAT(':',a.domain_id))) AS domain_status, s.Name, s.Schreibzugriff ";
$query .= "FROM auto_insert_sem a ";
$query .= "JOIN seminare AS s USING (Seminar_id) ";
$query .= "GROUP BY s.seminar_id ";
......@@ -68,8 +68,7 @@ class AutoInsert
$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']];
'Schreibzugriff' => $result['Schreibzugriff']];
}
}
}
......@@ -78,7 +77,7 @@ class AutoInsert
private function getUserSeminars($user_id, $seminare)
{
$statement = DBManager::get()->prepare("SELECT Seminar_id,s.name,s.Schreibzugriff,s.start_time,su.status
$statement = DBManager::get()->prepare("SELECT Seminar_id, s.name, s.Schreibzugriff, su.status
FROM seminar_user su
INNER JOIN seminare s USING(Seminar_id)
WHERE user_id = ? AND Seminar_id IN(?)");
......@@ -256,7 +255,7 @@ class AutoInsert
$statement = DBManager::get()->query($query);
$results = $statement->fetchAll(PDO::FETCH_COLUMN);
} else {
$query = "SELECT a.seminar_id, GROUP_CONCAT(a.status,IF(LENGTH(a.domain_id)=0,':keine',CONCAT(':',a.domain_id))) AS domain_status, s.Name, s.Schreibzugriff, s.start_time ";
$query = "SELECT a.seminar_id, GROUP_CONCAT(a.status,IF(LENGTH(a.domain_id)=0,':keine',CONCAT(':',a.domain_id))) AS domain_status, s.Name, s.Schreibzugriff ";
$query .= "FROM auto_insert_sem a ";
$query .= "JOIN seminare AS s USING (Seminar_id) ";
......
......@@ -46,13 +46,11 @@ class CoursesetModel
INNER JOIN `seminare` s USING (`Seminar_id`)
LEFT JOIN semester_courses ON (semester_courses.course_id = s.Seminar_id)
WHERE s.status NOT IN(?)
AND s.`start_time` <= ?
AND (semester_courses.semester_id IS NULL OR semester_courses.semester_id = ?)
AND su.`user_id` = ?
GROUP BY su.`Seminar_id` ";
$parameters = [
$excludeTypes,
$currentSemester->beginn,
$currentSemester->id,
$GLOBALS['user']->id
];
......@@ -63,14 +61,13 @@ class CoursesetModel
FROM `seminare` s
INNER JOIN `deputies` d ON (s.`Seminar_id`=d.`range_id`)
LEFT JOIN semester_courses ON (semester_courses.course_id = s.Seminar_id)
WHERE s.`start_time` <= ?
AND (semester_courses.semester_id IS NULL OR semester_courses.semester_id = ?)
WHERE (semester_courses.semester_id IS NULL OR semester_courses.semester_id = ?)
AND d.`user_id` = ?
GROUP BY s.`Seminar_id`
";
$parameters = array_merge(
$parameters,
[$currentSemester->beginn, $currentSemester->id, $GLOBALS['user']->id]
[$currentSemester->id, $GLOBALS['user']->id]
);
}
$courses = $db->fetchFirst($query, $parameters);
......@@ -88,7 +85,6 @@ class CoursesetModel
LEFT JOIN semester_courses ON (semester_courses.course_id = s.Seminar_id)
INNER JOIN auth_user_md5 aum USING (user_id)
WHERE s.status NOT IN (:exclude_types)
AND s.start_time <= :sembegin
AND (semester_courses.semester_id IS NULL OR semester_courses.semester_id = :semester_id)
AND $sem_inst.Institut_id IN (:institutes)
AND (
......@@ -98,7 +94,6 @@ class CoursesetModel
)";
$courses = $db->fetchFirst($query, [
'exclude_types' => $excludeTypes,
'sembegin' => $currentSemester->beginn,
'semester_id' => $currentSemester->id,
'institutes' => $instituteIds,
'filter' => '%' . $filter .'%',
......@@ -136,13 +131,15 @@ class CoursesetModel
'visible' => $course->visible,
];
$query = "SELECT type
FROM seminar_courseset
INNER JOIN courseset_rule USING (set_id)
WHERE type IN ('LockedAdmission','PasswordAdmission')
AND seminar_id = ?";
$query = "SELECT `type`
FROM `seminar_courseset`
JOIN `courseset_rule` USING (`set_id`)
LEFT JOIN `semester_courses` ON `seminar_courseset`.`seminar_id` = `semester_courses`.`course_id`
LEFT JOIN `semester_data` USING (`semester_id`)
WHERE `type` IN ('LockedAdmission','PasswordAdmission')
AND `seminar_id` = ?";
if ($coursesetId) {
$query .= "AND set_id <> ?";
$query .= "AND `set_id` <> ?";
}
$data[$course->id]['admission_type'] = DBManager::get()->fetchColumn(
......@@ -151,7 +148,7 @@ class CoursesetModel
);
};
Course::findEachMany($callable, array_unique($courses),"ORDER BY start_time DESC, VeranstaltungsNummer ASC, Name ASC");
Course::findEachMany($callable, array_unique($courses),"ORDER BY `semester_data`.`beginn` DESC, `VeranstaltungsNummer` ASC, `Name` ASC");
return $data;
}
......@@ -177,6 +174,7 @@ class CoursesetModel
LEFT JOIN courseset_rule cr ON c.set_id = cr.set_id
LEFT JOIN seminar_courseset sc ON c.set_id = sc.set_id
LEFT JOIN seminare s ON s.seminar_id = sc.seminar_id
LEFT JOIN semester_courses ON s.seminar_id = semester_courses.course_id
WHERE ci.institute_id = ?";
if ($filter['course_set_name']) {
$query .= " AND c.name LIKE ?";
......@@ -187,8 +185,8 @@ class CoursesetModel
$parameters[] = $filter['rule_types'];
}
if ($filter['semester_id']) {
$query .= " AND s.start_time = ?";
$parameters[] = Semester::find($filter['semester_id'])->beginn;
$query .= " AND semester_courses.semester_id = ?";
$parameters[] = $filter['semester_id'];
}
$cs_count_statement = DBManager::get()->prepare($query);
$query = str_replace('ci.institute_id', '1', $query);
......
......@@ -98,9 +98,14 @@ class CoursesByUserIndex extends JsonApiController
*/
private function findCoursesByUser(User $user, ?Semester $semester): array
{
$courses = Course::findMany(
$user->course_memberships->pluck('seminar_id'),
'ORDER BY start_time, name'
$courses = Course::findBySQL(
'LEFT JOIN `semester_courses`
ON `seminare`.`seminar_id` = `semester_courses`.`course_id`
LEFT JOIN `semester_data` USING (`semester_id`)
WHERE
`seminare`.`seminar_id` IN ( :course_ids )
ORDER BY `semester_data`.`beginn`, `seminare`.`name`',
['course_ids' => $user->course_memberships->pluck('seminar_id')]
);
if ($semester) {
......
......@@ -57,11 +57,12 @@ class UserScheduleShow extends JsonApiController
{
// get all virtually added seminars
$stmt = \DBManager::get()->prepare(
'SELECT c.course_id FROM schedule_courses as c
LEFT JOIN seminare ON seminare.seminar_id = c.course_id
WHERE user_id = ? AND start_time = ?'
'SELECT c.`course_id` FROM `schedule_courses` as c
LEFT JOIN `seminare` ON `seminare`.`seminar_id` = c.`course_id`
JOIN `semester_courses` ON `seminare`.`seminar_id` = `semester_courses`.`course_id`
WHERE user_id = :user_id AND semester_id = :semester_id'
);
$stmt->execute([$user->id, $semester['beginn']]);
$stmt->execute(['user_id' => $user->id, 'semester_id' => $semester->id]);
$ids = $stmt->fetchFirst();
// fetch seminar-entries
......@@ -71,12 +72,10 @@ class UserScheduleShow extends JsonApiController
LEFT JOIN seminare as s USING (seminar_id)
LEFT JOIN semester_courses ON (s.Seminar_id = semester_courses.course_id)
WHERE su.user_id = :userid
AND s.start_time <= :begin
AND (semester_courses.semester_id IS NULL OR semester_courses.semester_id = :semester_id)
');
$stmt->execute([
'userid' => $user->id,
'begin' => $semester->beginn,
'semester_id' => $semester->id,
]);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment