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
Showing
with 331 additions and 361 deletions
......@@ -25,7 +25,7 @@ class Course_ManagementController extends AuthenticatedController
parent::before_filter($action, $args);
if (!$GLOBALS['perm']->have_studip_perm("tutor", $GLOBALS['SessionSeminar'])) {
throw new Trails_Exception(400);
throw new AccessDeniedException();
}
if (Context::isCourse()) {
$sem_class = $GLOBALS['SEM_CLASS'][$GLOBALS['SEM_TYPE'][Context::get()->status]['class']] ?: SemClass::getDefaultSemClass();
......@@ -82,7 +82,7 @@ class Course_ManagementController extends AuthenticatedController
$is_visible = $course->visible;
if ($course->isOpenEnded() || $course->end_semester->visible) {
$actions->addLink(
_('Sichtbarkeit ändern') . ' (' . ($is_visible ? _('sichtbar') : _('unsichtbar')) . ')',
($is_visible ? _('Veranstaltung verstecken') : _('Veranstaltung sichtbar schalten')),
URLHelper::getURL($this->url_for('course/management/change_visibility'), ['studip_ticket' => Seminar_Session::get_ticket()]),
Icon::create('visibility-' . ($is_visible ? 'visible' : 'invisible'))
);
......@@ -97,13 +97,12 @@ class Course_ManagementController extends AuthenticatedController
)->asDialog('size=auto');
}
}
if (in_array($GLOBALS['perm']->get_studip_perm($course->id), words('tutor dozent'))) {
$actions->addLink(
_('Studierendenansicht simulieren'),
URLHelper::getURL('dispatch.php/course/change_view/set_changed_view'),
Icon::create('visibility-invisible')
);
}
$actions->addLink(
_('Studierendenansicht simulieren'),
URLHelper::getURL('dispatch.php/course/change_view/set_changed_view'),
Icon::create('visibility-invisible')
);
$sidebar->addWidget($actions);
......
......@@ -58,9 +58,6 @@ class Course_MembersController extends AuthenticatedController
// Layoutsettings
PageLayout::setTitle(sprintf('%s - %s', Course::findCurrent()->getFullname(), _("Teilnehmende")));
SkipLinks::addIndex(Navigation::getItem('/course/members')->getTitle(), 'main_content', 100);
$this->studip_module = checkObjectModule('participants');
object_set_visit_module( $this->studip_module->getPluginId());
$this->last_visitdate = object_get_visit($this->course_id, $this->studip_module->getPluginId());
......@@ -125,7 +122,6 @@ class Course_MembersController extends AuthenticatedController
// Check autor-perms
if (!$this->is_tutor) {
SkipLinks::addIndex(_("Sichtbarkeit ändern"), 'change_visibility');
// filter invisible user
$this->invisibles = count($filtered_members['autor']->findBy('visible', 'no')) + count($filtered_members['user']->findBy('visible', 'no'));
$current_user_id = $this->user_id;
......@@ -383,7 +379,7 @@ class Course_MembersController extends AuthenticatedController
if (Config::get()->DEPUTIES_ENABLE) {
// Check whether chosen person is set as deputy
// -> delete deputy entry.
$deputy = Deputy::find([$dozent, $this->course_id]);
$deputy = Deputy::find([$this->course_id, $dozent]);
if ($deputy) {
$deputy->delete();
}
......@@ -1368,6 +1364,10 @@ class Course_MembersController extends AuthenticatedController
} else {
PageLayout::postWarning(_('Keine Veränderungen vorgenommen.'));
}
} else if ($course->aux_lock_rule_forced) {
if (empty(array_column($this->datafields, 'content'))) {
PageLayout::postWarning(_('Um die Anmeldung zur Veranstaltung abzuschließen, müssen Sie zusätzliche Angaben auf dieser Seite machen.'));
}
}
}
......
......@@ -31,8 +31,6 @@ class Course_OverviewController extends AuthenticatedController
PageLayout::setHelpKeyword('Basis.InVeranstaltungKurzinfo');
PageLayout::setTitle(Context::getHeaderLine() . ' - ' . _('Kurzinfo'));
Navigation::activateItem('/course/main/info');
// add skip link
SkipLinks::addIndex(Navigation::getItem('/course/main/info')->getTitle(), 'main_content', 100);
$this->sem = Seminar::getInstance($this->course_id);
$sem_class = $this->sem->getSemClass();
......@@ -57,7 +55,7 @@ class Course_OverviewController extends AuthenticatedController
}
// Fetch news
$response = $this->relay('news/display/' . $this->course_id);
$response = $this->relayWithRedirect('news/display/' . $this->course_id);
$this->news = $response->body;
// Fetch votes
......@@ -147,34 +145,6 @@ class Course_OverviewController extends AuthenticatedController
Sidebar::get()->addWidget($actions);
}
if (Config::get()->CONSULTATION_ENABLED) {
$links = $sidebar->addWidget(new LinksWidget());
$links->setTitle(_('Sprechstunden der Lehrenden'));
foreach ($this->course->getMembersWithStatus('dozent', true)->pluck('user') as $teacher) {
$consultations = ConsultationBlock::countByRange($teacher);
if ($consultations === 0) {
continue;
}
$link = ($teacher->id === $GLOBALS['user']->id || $GLOBALS['user']->perms === 'root')
? 'admin'
: 'overview';
$disabled = $GLOBALS['user']->id !== $teacher->id
&& $GLOBALS['user']->perms === 'dozent'
&& !Config::get()->CONSULTATION_ALLOW_DOCENTS_RESERVING;
$links->addLink(
$teacher->getFullName(),
URLHelper::getURL("dispatch.php/consultation/{$link}", [
'username' => $teacher->username,
'cid' => null,
]),
Icon::create(Avatar::getAvatar($teacher->id)->getURL(Avatar::SMALL)),
compact('disabled')
);
}
}
$share = new ShareWidget();
if ($this->studygroup_mode) {
$share->addCopyableLink(
......
......@@ -101,11 +101,21 @@ class Course_PlusController extends AuthenticatedController
PageLayout::setTitle(_('Reihenfolge der Werkzeuge ändern'));
if (Request::submitted('order')) {
CSRFProtection::verifyUnsafeRequest();
$plugin_id = Request::get('id');
$plugin_id = explode('_', Request::get('id'))[1];
$newpos = Request::get('index') + 1;
if ($this->sem->tools->findOneBy('plugin_id', $plugin_id)) {
$this->sem->tools->findBy('position', $newpos, '>=')->each(function ($p) {$p->position++;});
$this->sem->tools->findOneBy('plugin_id', $plugin_id)->position = $newpos;
$oldpos = $this->sem->tools->findOneBy('plugin_id', $plugin_id)->position;
if ($oldpos < $newpos) {
$this->sem->tools->findBy('position', $newpos, '>')->each(function ($p) {
$p->position++;
});
$this->sem->tools->findOneBy('plugin_id', $plugin_id)->position = $newpos + 1;
} else {
$this->sem->tools->findBy('position', $newpos, '>=')->each(function ($p) {
$p->position++;
});
$this->sem->tools->findOneBy('plugin_id', $plugin_id)->position = $newpos;
}
$this->sem->tools->orderBy('position asc')->each(function ($p) {static $pos = 0; $p->position = $pos++;});
$this->sem->tools->store();
$this->render_nothing();
......
......@@ -539,6 +539,7 @@ class Course_RoomRequestsController extends AuthenticatedController
foreach ($this->selected_properties as $name => $state) {
$result = $this->request->setProperty($name, $state);
}
$this->request->store();
//Delete the session data:
$session_data = [];
PageLayout::postSuccess(_('Die Anfrage wurde gespeichert!'));
......@@ -600,27 +601,66 @@ class Course_RoomRequestsController extends AuthenticatedController
null
];
}
$this->matching_rooms = [];
if (!$this->room_name && !$this->selected_properties) {
//Load all requestable rooms:
$this->available_rooms = RoomManager::findRooms(
$this->matching_rooms = RoomManager::findRooms(
'',
null,
null,
[],
$this->request->getTimeIntervals(),
[],
'name ASC, mkdate ASC'
);
} else {
//Search rooms by the selected properties:
$this->available_rooms = RoomManager::findRooms(
$this->matching_rooms = RoomManager::findRooms(
$this->room_name,
null,
null,
$search_properties,
$this->request->getTimeIntervals(),
[],
'name ASC, mkdate ASC'
);
}
$this->available_room_icons = [];
$request_time_intervals = $this->request->getTimeIntervals();
$request_date_amount = count($request_time_intervals);
foreach ($this->matching_rooms as $room) {
$request_dates_booked = 0;
foreach ($request_time_intervals as $interval) {
$booked = ResourceBookingInterval::countBySql(
'resource_id = :room_id AND begin < :end AND end > :begin',
[
'room_id' => $room->id,
'begin' => $interval['begin'],
'end' => $interval['end']
]
) > 0;
if ($booked) {
$request_dates_booked++;
}
}
if ($request_dates_booked == 0) {
$this->available_room_icons[$room->id] =
Icon::create('check-circle', Icon::ROLE_STATUS_GREEN)->asImg(
[
'class' => 'text-bottom',
'title' => _('freier Raum')
]
);
$this->available_rooms[] = $room;
} elseif ($request_dates_booked < $request_time_intervals) {
$this->available_room_icons[$room->id] =
Icon::create('exclaim-circle', Icon::ROLE_STATUS_YELLOW)->asImg(
[
'class' => 'text-bottom',
'title' => _('teilweise belegter Raum')
]
);
$this->available_rooms[] = $room;
}
}
if (Request::isPost()) {
CSRFProtection::verifyUnsafeRequest();
......@@ -836,6 +876,8 @@ class Course_RoomRequestsController extends AuthenticatedController
$session_data['reply_lecturers'] = $this->reply_lecturers;
$session_data['preparation_time'] = $this->preparation_time;
$session_data['category_id'] = $this->category_id;
//Set the request-ID in the session to make it clear that the request has been modified:
$session_data['request_id'] = $this->request->id;
if (Request::submitted('select_other_room')) {
$this->redirect('course/room_requests/request_select_room/' . $this->request_id);
} elseif (Request::submitted('reset_category')) {
......@@ -849,6 +891,8 @@ class Course_RoomRequestsController extends AuthenticatedController
}
return;
} elseif (Request::submitted('save') || Request::submitted('save_and_close')) {
// if a closed request is stored again, reopen it
if ($this->seats < 1) {
PageLayout::postError(
_('Es wurde keine Anzahl an Sitzplätzen angegeben!')
......@@ -889,6 +933,11 @@ class Course_RoomRequestsController extends AuthenticatedController
$this->request->category_id = $this->category_id;
}
if ($this->request->closed != 0) {
PageLayout::postInfo(_('Die Raumanfrage wurde wieder geöffnet und damit erneut gestellt.'));
$this->request->closed = 0;
}
$storing_successful = false;
if ($this->request->isDirty()) {
$storing_successful = $this->request->store();
......@@ -907,6 +956,7 @@ class Course_RoomRequestsController extends AuthenticatedController
} else {
$result = $this->request->setProperty('seats', $this->seats);
}
$this->request->store();
//Delete the session data:
$session_data = [];
PageLayout::postSuccess(_('Die Anfrage wurde gespeichert!'));
......@@ -971,4 +1021,4 @@ class Course_RoomRequestsController extends AuthenticatedController
}
$this->redirect('course/room_requests/index');
}
}
\ No newline at end of file
}
......@@ -39,7 +39,7 @@ class Course_StatusgroupsController extends AuthenticatedController
$this->is_autor = $perm->have_studip_perm('autor', $this->course_id);
// Hide groups page?
if (!$this->is_tutor && $this->config->COURSE_MEMBERGROUPS_HIDE) {
if (!$this->is_tutor && $this->config->COURSE_MEMBERS_HIDE) {
throw new AccessDeniedException();
}
......@@ -291,18 +291,6 @@ class Course_StatusgroupsController extends AuthenticatedController
);
}
$sidebar->addWidget($actions);
if ($this->is_tutor) {
$options = $sidebar->addWidget(new OptionsWidget());
$options->addCheckbox(
_('Diese Seite für Studierende verbergen'),
$this->config->COURSE_MEMBERGROUPS_HIDE,
$this->url_for('course/statusgroups/course_groups_hide/1'),
$this->url_for('course/statusgroups/course_groups_hide/0'),
['title' => _('Über diese Option können Sie die Teilnehmendengruppenliste für Studierende der Veranstaltung unsichtbar machen')]
);
}
}
/**
......@@ -869,7 +857,7 @@ class Course_StatusgroupsController extends AuthenticatedController
$dates = CourseDate::findBySeminar_id($this->course_id);
$singledates = array_filter($dates, function ($d) { return !((bool) $d->metadate_id); });
foreach ($singledates as $d) {
$name = $d->toString();
$name = $d->getFullname();
// Append description to group title if applicable.
if ($d->description) {
......@@ -1402,17 +1390,6 @@ class Course_StatusgroupsController extends AuthenticatedController
$this->render_nothing();
}
public function course_groups_hide_action($state)
{
if (!$this->is_tutor) {
throw new AccessDeniedException();
}
$this->config->store('COURSE_MEMBERGROUPS_HIDE', $state);
$this->redirect('course/statusgroups');
}
private function sortMembers(SimpleCollection $members, $sort_by = null, $sort_dir = null)
{
$order = "nachname asc, vorname asc";
......
......@@ -442,17 +442,6 @@ class Course_StudygroupController extends AuthenticatedController
// test whether we have a group name...
if (!Request::get('groupname')) {
$errors[] = _("Bitte Gruppennamen angeben");
//... if so, test if this is not taken by another group
} else {
$query = "SELECT 1 FROM seminare WHERE name = ? AND Seminar_id != ?";
$statement = DBManager::get()->prepare($query);
$statement->execute([
Request::get('groupname'),
$id,
]);
if ($statement->fetchColumn()) {
$errors[] = _("Eine Veranstaltung/Studiengruppe mit diesem Namen existiert bereits. Bitte wählen Sie einen anderen Namen");
}
}
if (count($errors)) {
$this->flash['errors'] = $errors;
......@@ -509,7 +498,7 @@ class Course_StudygroupController extends AuthenticatedController
Request::set('choose_member_parameter', $this->flash['choose_member_parameter']);
$this->studip_module = checkObjectModule('participants');
$this->studip_module = checkObjectModule('StudygroupParticipants');
object_set_visit_module($this->studip_module->getPluginId());
......
......@@ -74,10 +74,11 @@ class Course_TimesroomsController extends AuthenticatedController
$this->course->applyTimeFilter($semester['beginn'], $semester['ende']);
}
$selectable_semesters = new SimpleCollection(Semester::getAll());
$start = $this->course->start_time;
$end = $this->course->getEndSemester()->ende;
$selectable_semesters = $selectable_semesters->findBy('beginn', [$start, $end], '>=<=')->toArray();
if ($this->course->isOpenEnded()) {
$selectable_semesters = Semester::getAll();
} else {
$selectable_semesters = $this->course->semesters->toArray();
}
if (count($selectable_semesters) > 1 || (count($selectable_semesters) == 1 && $this->course->hasDatesOutOfDuration())) {
$selectable_semesters[] = ['name' => _('Alle Semester'), 'semester_id' => 'all'];
}
......@@ -247,11 +248,12 @@ class Course_TimesroomsController extends AuthenticatedController
if ($end_semester != 0 && $end_semester != -1 && $start_semester->beginn >= $end_semester->beginn) {
PageLayout::postError(_('Das Startsemester liegt nach dem Endsemester!'));
} else {
$old_start_weeks = !$course->isOpenEnded() ? $course->start_semester->getStartWeeks($course->end_semester) : [];
//set the new semester array:
if ($end_semester == -1) {
$course->setSemesters([]);
$course->semesters = [];
} elseif($end_semester == 0) {
$course->setSemesters([$start_semester]);
$course->semesters = [$start_semester];
} else {
$selected_semesters = [];
foreach (Semester::getAll() as $sem) {
......@@ -259,29 +261,23 @@ class Course_TimesroomsController extends AuthenticatedController
$selected_semesters[] = $sem;
}
}
$course->setSemesters($selected_semesters);
$course->semesters = $selected_semesters;
}
//deprecated: this is the old way
$course['start_time'] = $start_semester['beginn'];
$course['duration_time'] = $end_semester <= 0
? $end_semester
: $end_semester['ende'] - $start_semester['beginn'];
$old_start_weeks = $course->end_semester ? $course->end_semester->getStartWeeks() : [];
// set the semester-chooser to the first semester
$this->course->setFilter($course->getStartSemester());
$this->semester_filter = $start_semester->semester_id;
$course->store();
$new_start_weeks = $course->start_semester->getStartWeeks();
SeminarCycleDate::removeOutRangedSingleDates($this->course->getStartSemester(), $this->course->getEndSemesterVorlesEnde(), $course->id);
$cycles = SeminarCycleDate::findBySeminar_id($course->id);
foreach ($cycles as $cycle) {
$cycle->end_offset = $this->getNewEndOffset($cycle, $old_start_weeks, $new_start_weeks);
$cycle->generateNewDates();
$cycle->store();
if (!$course->isOpenEnded()) {
$new_start_weeks = $course->start_semester->getStartWeeks($course->end_semester);
SeminarCycleDate::removeOutRangedSingleDates($this->course->getStartSemester(), $this->course->getEndSemesterVorlesEnde(), $course->id);
$cycles = SeminarCycleDate::findBySeminar_id($course->id);
foreach ($cycles as $cycle) {
$cycle->end_offset = $this->getNewEndOffset($cycle, $old_start_weeks, $new_start_weeks);
$cycle->generateNewDates();
$cycle->store();
}
}
$messages = $this->course->getStackedMessages();
......@@ -1051,23 +1047,19 @@ class Course_TimesroomsController extends AuthenticatedController
$this->has_bookings = $count > 0;
}
$course = Course::find($this->course->id);
if ($this->course->isOpenEnded()) { // course with endless lifespan
$end_semester = Semester::findBySQL("beginn >= ? ", [$this->course->start_time]);
} else { // course over more than one semester
$end_semester = $course->semesters;
$end_semester = array_values(array_filter(Semester::getAll(), function ($s) {return $s->past === false;}));
} else { // course over one or more semester
$end_semester = $this->course->semesters->getArrayCopy();
}
$this->start_weeks = $this->course->end_semester->getStartWeeks();
$this->start_weeks = [];
$this->end_semester_weeks = [];
if (!empty($end_semester)) {
$this->end_semester_weeks = [];
$this->start_weeks = $end_semester[0]->getStartWeeks($end_semester[count($end_semester) - 1]);
foreach ($end_semester as $sem) {
$sem_duration = $sem->ende - $sem->beginn;
$weeks = $sem->getStartWeeks($sem_duration);
$weeks = $sem->getStartWeeks();
foreach ($this->start_weeks as $key => $week) {
if (mb_strpos($week, mb_substr($weeks[0], -15)) !== false) {
......
......@@ -171,9 +171,10 @@ class Course_TopicsController extends AuthenticatedController
PageLayout::postMessage(MessageBox::success(sprintf(_("%s Themen kopiert."), count(Request::getArray("topic")))));
$this->redirect("course/topics");
}
$semester_sql = " CONCAT('(',IFNULL(GROUP_CONCAT(DISTINCT semester_data.name ORDER BY semester_data.beginn SEPARATOR '-'),'" . _('unbegrenzt') . "'),')')";
if ($GLOBALS['perm']->have_perm("root")) {
$this->courseSearch = new SQLSearch("
SELECT seminare.Seminar_id, CONCAT_WS(' ', seminare.VeranstaltungsNummer, seminare.name, '(', IF(seminare.semester_id IS NULL, GROUP_CONCAT(', ', semester_data.name), 'unbegrenzt'), ') (', COUNT(issue_id), ')')
SELECT seminare.Seminar_id, CONCAT_WS(' ', seminare.VeranstaltungsNummer, seminare.name, $semester_sql, '(', COUNT(issue_id), ')')
FROM seminare
LEFT JOIN semester_courses ON (seminare.Seminar_id = semester_courses.course_id)
LEFT JOIN semester_data ON (semester_data.semester_id = semester_courses.semester_id)
......@@ -187,7 +188,7 @@ class Course_TopicsController extends AuthenticatedController
);
} elseif ($GLOBALS['perm']->have_perm("admin")) {
$this->courseSearch = new SQLSearch("
SELECT seminare.Seminar_id, CONCAT_WS(' ', seminare.VeranstaltungsNummer, seminare.name, '(', CONCAT_WS(' ', seminare.VeranstaltungsNummer, seminare.name, '(', IF(seminare.semester_id IS NULL, GROUP_CONCAT(', ', semester_data.name), 'unbegrenzt'), ') (', COUNT(issue_id), ')')
SELECT seminare.Seminar_id, CONCAT_WS(' ', seminare.VeranstaltungsNummer, seminare.name, $semester_sql, '(', COUNT(issue_id), ')')
FROM seminare
INNER JOIN seminar_inst ON (seminare.Seminar_id = seminar_inst.seminar_id)
INNER JOIN user_inst ON (user_inst.Institut_id = seminar_inst.institut_id)
......@@ -206,7 +207,7 @@ class Course_TopicsController extends AuthenticatedController
);
} else {
$this->courseSearch = new SQLSearch("
SELECT seminare.Seminar_id, CONCAT_WS(' ', seminare.VeranstaltungsNummer, seminare.name, '(', IF(seminare.semester_id IS NULL, GROUP_CONCAT(', ', semester_data.name), 'unbegrenzt'), ') (', COUNT(issue_id), ')')
SELECT seminare.Seminar_id, CONCAT_WS(' ', seminare.VeranstaltungsNummer, seminare.name, $semester_sql, '(', COUNT(issue_id), ')')
FROM seminare
INNER JOIN seminar_user ON (seminare.Seminar_id = seminar_user.Seminar_id)
LEFT JOIN semester_courses ON (seminare.Seminar_id = semester_courses.course_id)
......
......@@ -244,7 +244,8 @@ class Course_WizardController extends AuthenticatedController
$this->stepnumber = $stepnumber;
$this->temp_id = $temp_id;
if (!$this->getValues()) {
throw new UnexpectedValueException('no data found');
PageLayout::postError(_('Ihre Session ist abgelaufen, bitte erneut anfangen.'));
$this->redirect('course/wizard');
}
if (isset($_SESSION['coursewizard'][$this->temp_id]['source_id'])) {
$this->source_course = Course::find($_SESSION['coursewizard'][$this->temp_id]['source_id']);
......
......@@ -739,23 +739,25 @@ class FileController extends AuthenticatedController
$this->plugin = Request::get('from_plugin');
if (!$GLOBALS['perm']->have_perm("admin")) {
$query = "SELECT seminare.*, COUNT(semester_courses.semester_id) AS semesters
$query = "SELECT seminare.*, MAX(`beginn`) as sorter
FROM seminare
INNER JOIN seminar_user ON (seminar_user.Seminar_id = seminare.Seminar_id)
LEFT JOIN semester_courses ON (semester_courses.course_id = seminare.Seminar_id)
LEFT JOIN semester_data ON (semester_courses.semester_id = semester_data.semester_id)
WHERE seminar_user.user_id = :user_id
GROUP BY seminare.Seminar_id
";
if (Config::get()->DEPUTIES_ENABLE) {
$query .= " UNION
SELECT `seminare`.*, COUNT(semester_courses.semester_id) AS semesters
SELECT `seminare`.*, MAX(`beginn`) as sorter
FROM `seminare`
INNER JOIN `deputies` ON (`deputies`.`range_id` = `seminare`.`Seminar_id`)
LEFT JOIN semester_courses ON (semester_courses.course_id = seminare.Seminar_id)
LEFT JOIN semester_data ON (semester_courses.semester_id = semester_data.semester_id)
WHERE `deputies`.`user_id` = :user_id
GROUP BY seminare.Seminar_id";
}
$query .= " ORDER BY semesters = 0 DESC, start_time DESC, Name ASC";
$query .= " ORDER BY sorter DESC, Name ASC";
$statement = DBManager::get()->prepare($query);
$statement->execute([':user_id' => $GLOBALS['user']->id]);
$this->courses = [];
......@@ -1255,22 +1257,24 @@ class FileController extends AuthenticatedController
$this->folder_id = $folder_id;
$this->plugin = Request::get('to_plugin');
if (!$GLOBALS['perm']->have_perm('admin')) {
$query = "SELECT seminare.*, COUNT(semester_courses.semester_id) AS semesters
$query = "SELECT seminare.*, MAX(semester_data.`beginn`) as sorter
FROM seminare
INNER JOIN seminar_user ON (seminar_user.Seminar_id = seminare.Seminar_id)
LEFT JOIN semester_courses ON (semester_courses.course_id = seminare.Seminar_id)
LEFT JOIN semester_data ON (semester_courses.semester_id = semester_data.semester_id)
WHERE seminar_user.user_id = :user_id
GROUP BY seminare.Seminar_id";
if (Config::get()->DEPUTIES_ENABLE) {
$query .= " UNION
SELECT `seminare`.*, COUNT(semester_courses.semester_id) AS semesters
SELECT `seminare`.*, MAX(semester_data.`beginn`) as sorter
FROM `seminare`
INNER JOIN `deputies` ON (`deputies`.`range_id` = `seminare`.`Seminar_id`)
LEFT JOIN semester_courses ON (semester_courses.course_id = seminare.Seminar_id)
LEFT JOIN semester_data ON (semester_courses.semester_id = semester_data.semester_id)
WHERE `deputies`.`user_id` = :user_id
GROUP BY seminare.Seminar_id";
}
$query .= " ORDER BY semesters = 0 DESC, start_time DESC, Name ASC";
$query .= " ORDER BY sorter DESC, Name ASC";
$statement = DBManager::get()->prepare($query);
$statement->execute(['user_id' => $GLOBALS['user']->id]);
......
......@@ -46,13 +46,11 @@ class FilesController extends AuthenticatedController
throw new AccessDeniedException();
}
$constraints = FileManager::getUploadTypeConfig($this->user->id);
PageLayout::addHeadElement('script', ['type' => 'text/javascript'], sprintf(
'STUDIP.Files.setUploadConstraints(%s);',
json_encode([
'filesize' => $GLOBALS['UPLOAD_TYPES']['personalfiles']['file_sizes'][$this->user->perms],
'type' => $GLOBALS['UPLOAD_TYPES']['personalfiles']['type'],
'file_types' => $GLOBALS['UPLOAD_TYPES']['personalfiles']['file_types'],
])
json_encode($constraints)
));
}
......@@ -272,7 +270,7 @@ class FilesController extends AuthenticatedController
)->setActive($current_view == 'all_files');
$views->addLink(
_('Persönlicher Dateibereich'),
_('Meine hochgeladenen Dateien'),
$this->url_for('files/overview', ['view' => 'my_uploaded_files']),
null,
[],
......@@ -387,10 +385,12 @@ class FilesController extends AuthenticatedController
$this->all_files = [];
$count_visible = 0;
foreach ($all_file_refs as $file_ref) {
$vue_data = FilesystemVueDataManager::getFileVueData(
$file_ref->getFileType(),
$this->topFolder
);
if ($file_ref->getFileType()->isVisible($GLOBALS['user']->id)) {
$vue_data = FilesystemVueDataManager::getFileVueData(
$file_ref->getFileType(),
$this->topFolder
);
}
if (isset($vue_data['download_url'])) {
$this->all_files[] = $vue_data;
if (++$count_visible === 5) break;
......@@ -471,7 +471,6 @@ class FilesController extends AuthenticatedController
//]
$folders = [];
$new_file_refs = FileRef::findAll($GLOBALS['user']->id, $this->begin, $this->end, $this->course_id, $this->page_size, $offset);
//Group the file refs by their folder:
foreach ($new_file_refs as $file_ref) {
if (!is_array($folders[$file_ref->folder_id])) {
......@@ -507,10 +506,36 @@ class FilesController extends AuthenticatedController
$this->files[] = $file_ref->getFileType();
}
} elseif ($this->current_view == 'my_uploaded_files') {
$this->page_size = 25;
$this->page = 1;
if (!$course_did_change) {
$this->page = Request::get('page') + 1;
}
if (($this->page < 1) || !$this->page) {
$this->page = 1;
}
$offset = $this->page_size * ($this->page - 1);
$this->addFiltersToOverviewSidebar(['time_range', 'course']);
$this->table_title = _('Persönlicher Dateibereich');
$file_refs = FileRef::findUploadedFiles($GLOBALS['user']->id, $this->begin, $this->end, $this->course_id);
$this->table_title = _('Meine hochgeladenen Dateien');
$file_refs = FileRef::findUploadedFiles($GLOBALS['user']->id, $this->begin, $this->end, $this->course_id, $this->page_size, $offset);
$this->files_c = FileRef::countUploadedFiles($GLOBALS['user']->id, $this->begin, $this->end, $this->course_id);
$pagination = Pagination::create(
$this->files_c,
$this->page - 1,
$this->page_size
);
$this->pagination_html = $pagination->asLinks(
function ($page_id) {
return URLHelper::getLink(
'dispatch.php/files/overview',
[
'view' => 'my_uploaded_files',
'page' => $page_id
]
);
}
);
$this->files = [];
foreach ($file_refs as $file_ref) {
$this->files[] = $file_ref->getFileType();
......
......@@ -37,13 +37,11 @@ class Institute_FilesController extends AuthenticatedController
Navigation::activateItem('/course/files');
if (is_object($GLOBALS['user']) && $GLOBALS['user']->id !== 'nobody') {
$constraints = FileManager::getUploadTypeConfig($this->institute->id);
PageLayout::addHeadElement('script', ['type' => 'text/javascript'], sprintf(
'STUDIP.Files.setUploadConstraints(%s);',
json_encode([
'filesize' => $GLOBALS['UPLOAD_TYPES']['default']['file_sizes'][$GLOBALS['user']->perms],
'type' => $GLOBALS['UPLOAD_TYPES']['default']['type'],
'file_types' => $GLOBALS['UPLOAD_TYPES']['default']['file_types'],
])
json_encode($constraints)
));
}
}
......@@ -150,6 +148,7 @@ class Institute_FilesController extends AuthenticatedController
$this->range_type = 'institute';
$this->show_default_sidebar = true;
$this->enable_table_filter = true;
$this->form_action = $this->url_for('file/bulk/' . $folder->getId());
$this->render_template('files/flat.php', $this->layout);
}
......
......@@ -132,7 +132,7 @@ class Institute_OverviewController extends AuthenticatedController
}
// Fetch news
$response = $this->relay('news/display/' . $this->institute_id);
$response = $this->relayWithRedirect('news/display/' . $this->institute_id);
$this->news = $response->body;
// Fetch votes
......
<?php
# Lifter010: TODO
/*
* Copyright (C) 2010 - Marcus Lunzenauer <mlunzena@uos.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*/
/**
* TODO
*/
class LocalizationsController extends Trails_Controller {
/**
* Callback function being called before an action is executed. If this
* function does not return FALSE, the action will be called, otherwise
* an error will be generated and processing will be aborted. If this function
* already #rendered or #redirected, further processing of the action is
* withheld.
*
* @param string Name of the action to perform.
* @param array An array of arguments to the action.
*
* @return bool
*/
public function before_filter(&$action, &$args)
{
require_once 'lib/language.inc.php';
// substitute dashes with underscores, remove things like .UTF-8
$args = (array) strtr(current(explode('.', $action)), "-", "_");
// invalid language?
if (!isset($GLOBALS['INSTALLED_LANGUAGES'][$action])) {
$action = "not_acceptable";
} else {
$action = "show";
}
}
function show_action($language = NULL)
{
$this->set_content_type('application/javascript; charset=UTF-8');
$modified = filemtime(dirname(__FILE__) . '/../views/localizations/show.php');
$this->response->add_header('Last-Modified', date("r", $modified));
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) === $modified) {
$this->set_status(304, "Not modified.");
$this->render_nothing();
return;
}
}
$this->language = $language;
setLocaleEnv($language, "studip");
// make this instance available to the view to use
// the helper methods
$this->plugin = $this;
}
function not_acceptable_action($language = NULL)
{
$this->set_status(406);
$this->set_content_type('application/json; charset=UTF-8');
$languages = array_keys($GLOBALS['INSTALLED_LANGUAGES']);
$this->render_text(json_encode($languages));
}
}
......@@ -204,7 +204,7 @@ class Lvgruppen_LvgruppenController extends MVVController
$success_message,
htmlReady($this->lvgruppe->getDisplayName())
));
$this->relocate('/index');
$this->relocate($this->url_for('/index'));
return;
}
}
......
......@@ -27,7 +27,6 @@ class MessagesController extends AuthenticatedController {
if (in_array($action, ['overview', 'sent'])) {
$this->tags = Message::getUserTags();
}
$this->setupSidebar($action);
}
......@@ -43,13 +42,17 @@ class MessagesController extends AuthenticatedController {
}
if (Request::isPost()) {
$mbox = Request::option('mbox');
foreach (Request::optionArray('bulk') as $message_id) {
$this->deleteMessage($message_id);
$this->deleteMessage($message_id, $mbox);
}
PageLayout::postSuccess(sprintf(
_('%u Nachrichten wurden gelöscht'),
count(Request::optionArray('bulk'))
));
$this->redirect($this->overviewURL());
return;
}
$this->messages = $this->getMessages(
......@@ -69,13 +72,17 @@ class MessagesController extends AuthenticatedController {
Navigation::activateItem('/messaging/messages/sent');
if (Request::isPost()) {
$mbox = Request::option('mbox');
foreach (Request::optionArray('bulk') as $message_id) {
$this->deleteMessage($message_id);
$this->deleteMessage($message_id, $mbox);
}
PageLayout::postSuccess(sprintf(
_('%u Nachrichten wurden gelöscht'),
count(Request::optionArray('bulk'))
));
$this->redirect($this->sentURL());
return;
}
$this->messages = $this->getMessages(
......@@ -123,7 +130,7 @@ class MessagesController extends AuthenticatedController {
$this->render_json($this->output);
}
public function read_action($message_id)
public function read_action($message_id, $mbox = 'rec')
{
$this->message = new Message($message_id);
if (!$this->message->permissionToRead()) {
......@@ -161,6 +168,8 @@ class MessagesController extends AuthenticatedController {
));
}
$this->message->markAsRead($GLOBALS['user']->id);
$this->mbox = $mbox;
}
/**
......@@ -260,87 +269,88 @@ class MessagesController extends AuthenticatedController {
}
//check if the message shall be sent to all members of an institute:
if(Request::get('inst_id') && $GLOBALS['perm']->have_perm('admin')) {
$query = "SELECT user_id FROM user_inst WHERE Institut_id = ? AND inst_perms != 'user'";
$this->default_message->receivers = DBManager::get()->fetchAll($query, [Request::option('inst_id')], 'MessageUser::build');
if (Request::get('inst_id') && $GLOBALS['perm']->have_studip_perm('admin', Request::get('inst_id'))) {
if (Request::get('filter') === 'inst_status') {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM user_inst
JOIN auth_user_md5 USING (user_id)
WHERE Institut_id = ? AND inst_perms = ?
ORDER BY Nachname, Vorname";
} else {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM user_inst
JOIN auth_user_md5 USING (user_id)
WHERE Institut_id = ? AND inst_perms != 'user'
ORDER BY Nachname, Vorname";
}
$this->default_message->receivers = DBManager::get()->fetchAll($query, [Request::option('inst_id'), Request::option('who')], 'MessageUser::build');
}
//check if the message shall be sent to all (or some) members of a course:
if (Request::get('filter') && Request::option("course_id")) {
$course = new Course(Request::option('course_id'));
if ($GLOBALS['perm']->have_studip_perm('tutor', $course->id) || $course->getSemClass()['studygroup_mode'] || CourseConfig::get($course->id)->COURSE_STUDENT_MAILING) {
$filter = Request::get('filter');
$course = Course::find(Request::option('course_id'));
if ($filter && $course) {
if ($GLOBALS['perm']->have_studip_perm('tutor', $course->id)
|| ($GLOBALS['perm']->have_studip_perm('autor', $course->id)
&& ($course->getSemClass()['studygroup_mode'] || CourseConfig::get($course->id)->COURSE_STUDENT_MAILING))) {
$this->default_message->receivers = [];
if (Request::get('filter') === 'claiming') {
$cs = CourseSet::getSetForCourse($course->id);
if (is_object($cs) && !$cs->hasAlgorithmRun()) {
foreach (AdmissionPriority::getPrioritiesByCourse($cs->getId(), $course->id) as $user_id => $p) {
$this->default_message->receivers[] = MessageUser::build(['user_id' => $user_id, 'snd_rec' => 'rec']);
}
}
} else {
// Exclude hidden course members from mail if not at least tutor
$additional = '';
if (!$GLOBALS['perm']->have_studip_perm('tutor', $course->id)) {
$additonal = " AND seminar_user.visible != 'no'";
}
$params = [$course->id, Request::option('who')];
switch (Request::get('filter')) {
case 'send_sms_to_all':
$query = "SELECT user_id, 'rec' AS snd_rec
$query = '';
$params = [$course->id, Request::option('who')];
if ($GLOBALS['perm']->have_studip_perm('tutor', $course->id)) {
if ($filter === 'send_sms_to_all') {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM seminar_user
JOIN auth_user_md5 USING (user_id)
WHERE Seminar_id = ? AND status = ? {$additonal}
WHERE Seminar_id = ? AND status = ?
ORDER BY Nachname, Vorname";
break;
case 'all':
$query = "SELECT user_id, 'rec' AS snd_rec
} elseif ($filter === 'all') {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM seminar_user
JOIN auth_user_md5 USING (user_id)
WHERE Seminar_id = ? {$additonal}
WHERE Seminar_id = ?
ORDER BY Nachname, Vorname";
break;
case 'prelim':
$query = "SELECT user_id, 'rec' AS snd_rec
} elseif ($filter === 'prelim') {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM admission_seminar_user
JOIN auth_user_md5 USING (user_id)
WHERE seminar_id = ? AND status = 'accepted'
{$additonal}
ORDER BY Nachname, Vorname";
break;
case 'awaiting':
$query = "SELECT user_id, 'rec' AS snd_rec
} elseif ($filter === 'awaiting') {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM admission_seminar_user
JOIN auth_user_md5 USING (user_id)
WHERE seminar_id = ? AND status = 'awaiting'
{$additonal}
ORDER BY Nachname, Vorname";
break;
case 'inst_status':
$query = "SELECT user_id, 'rec' AS snd_rec
FROM user_inst
JOIN auth_user_md5 USING (user_id)
WHERE Institut_id = ? AND inst_perms = ?
{$additonal}
ORDER BY Nachname, Vorname";
break;
case 'not_grouped':
$query = "SELECT seminar_user.user_id, 'rec' as snd_rec
} elseif ($filter === 'not_grouped') {
$query = "SELECT seminar_user.user_id, 'rec' as snd_rec
FROM seminar_user
JOIN auth_user_md5 USING (user_id)
LEFT JOIN statusgruppen ON range_id = seminar_id
LEFT JOIN statusgruppe_user ON statusgruppen.statusgruppe_id = statusgruppe_user.statusgruppe_id
AND seminar_user.user_id = statusgruppe_user.user_id
AND seminar_user.user_id = statusgruppe_user.user_id
WHERE seminar_id = ?
GROUP BY seminar_user.user_id
HAVING COUNT(statusgruppe_user.statusgruppe_id) = 0
ORDER BY Nachname, Vorname";
break;
} elseif ($filter === 'claiming') {
$cs = CourseSet::getSetForCourse($course->id);
if (is_object($cs) && !$cs->hasAlgorithmRun()) {
foreach (AdmissionPriority::getPrioritiesByCourse($cs->getId(), $course->id) as $user_id => $p) {
$this->default_message->receivers[] = MessageUser::build(['user_id' => $user_id, 'snd_rec' => 'rec']);
}
}
}
} else {
$query = "SELECT user_id, 'rec' AS snd_rec
FROM seminar_user
JOIN auth_user_md5 USING (user_id)
WHERE Seminar_id = ? AND seminar_user.visible != 'no'
ORDER BY Nachname, Vorname";
}
if ($query) {
$this->default_message->receivers = DBManager::get()->fetchAll($query, $params, 'MessageUser::build');
}
}
}
if (Request::option('prof_id') && Request::option('deg_id') && $GLOBALS['perm']->have_perm('root')) {
......@@ -659,34 +669,29 @@ class MessagesController extends AuthenticatedController {
}
}
protected function deleteMessage($message_id)
protected function deleteMessage($message_id, $mbox)
{
$message = Message::find($message_id);
if ($message) {
$message->markAsRead($GLOBALS['user']->id);
}
$messageuser = new MessageUser([$GLOBALS['user']->id, $message_id, "snd"]);
$success = 0;
if (!$messageuser->isNew()) {
$messageuser['deleted'] = 1;
$messageuser = MessageUser::find([$GLOBALS['user']->id, $message_id, $mbox]);
if ($messageuser) {
$messageuser['deleted'] = true;
$success = $messageuser->store();
}
$messageuser = new MessageUser([$GLOBALS['user']->id, $message_id, "rec"]);
if (!$messageuser->isNew()) {
$messageuser['deleted'] = 1;
$success += $messageuser->store();
}
return $success;
}
public function delete_action($message_id)
public function delete_action($message_id, $mbox = 'rec')
{
$message = Message::find($message_id);
$ticket = Request::get('studip-ticket');
if (Request::isPost() && $ticket && check_ticket($ticket)) {
$success = $this->deleteMessage($message_id);
$success = $this->deleteMessage($message_id, $mbox);
if ($success) {
PageLayout::postMessage(MessageBox::success(_('Nachricht gelöscht!')));
} else {
......@@ -694,9 +699,9 @@ class MessagesController extends AuthenticatedController {
}
}
$redirect = $message->autor_id === $GLOBALS['user']->id
? $this->url_for('messages/sent')
: $this->url_for('messages/overview');
$redirect = $mbox === 'rec'
? $this->url_for('messages/overview')
: $this->url_for('messages/sent');
$this->redirect($redirect);
}
......@@ -717,7 +722,7 @@ class MessagesController extends AuthenticatedController {
'id' => $GLOBALS['user']->id,
]);
foreach ($returnedMessages as $returnedMessage) {
$this->deleteMessage($returnedMessage);
$this->deleteMessage($returnedMessage, $sndrec);
}
if ($sndrec === 'rec') {
PageLayout::postSuccess(_('Alle empfangenen Nachrichten wurden gelöscht.'));
......@@ -933,12 +938,16 @@ class MessagesController extends AuthenticatedController {
Icon::create('accept', 'clickable')
);
}
$actions->addLink(
_('Ausgewählte Nachrichten löschen'),
'#',
Icon::create('trash'),
[
'onclick' => "if (window.confirm('Wirklich %s Nachrichten löschen?'.toLocaleString().replace('%s', jQuery('#bulk tbody :checked').length))) { jQuery('#bulk').submit(); } return false;"
'onclick' => sprintf(
'return STUDIP.Dialog.confirm("%s".replace("%%s", $("#bulk tbody :checked").length), function() { $("#bulk").submit(); })',
_('Wirklich %s Nachricht(en) löschen?')
)
]
);
......
......@@ -989,7 +989,7 @@ class Module_ModuleController extends MVVController
} else {
PageLayout::postInfo(_('Es wurden keine Änderungen vorgenommen.'));
}
$this->relocate('/details/' . $this->modulteil->modul_id . '/' . $this->modulteil->id);
$this->relocate($this->url_for('/details/' . $this->modulteil->modul_id . '/' . $this->modulteil->id));
return;
}
}
......@@ -1078,7 +1078,7 @@ class Module_ModuleController extends MVVController
$this->variante = $this->modul->modul_variante;
} else {
PageLayout::postError(_('Unbekanntes Modul'));
$this->relocate('/index');
$this->relocate($this->url_for('/index'));
}
}
......@@ -1117,6 +1117,9 @@ class Module_ModuleController extends MVVController
$type_old = 2;
}
$diff_config = new Caxy\HtmlDiff\HtmlDiffConfig();
$diff_config->setPurifierCacheLocation($GLOBALS['TMP_PATH']);
PageLayout::setTitle(_('Vergleichsansicht'));
PageLayout::addStylesheet('print.css');
$factory = $this->get_template_factory();
......@@ -1127,7 +1130,8 @@ class Module_ModuleController extends MVVController
'old_module' => $old_module,
'type_new' => $type_new,
'type_old' => $type_old,
'plugin' => $this->plugin
'plugin' => $this->plugin,
'diff_config' => $diff_config,
]);
$this->render_text($template->render());
......
......@@ -77,7 +77,6 @@ class MyCoursesController extends AuthenticatedController
Navigation::activateItem('/browse/my_courses/list');
PageLayout::setHelpKeyword('Basis.MeineVeranstaltungen');
PageLayout::setTitle(_('Meine Veranstaltungen'));
SkipLinks::addIndex(_('Meine Veranstaltungen'), 'mycourses');
$this->sem_data = Semester::getAllAsArray();
......@@ -190,11 +189,11 @@ class MyCoursesController extends AuthenticatedController
'allow_dozent_visibility' => Config::get()->ALLOW_DOZENT_VISIBILITY,
'open_groups' => $GLOBALS['user']->cfg->MY_COURSES_OPEN_GROUPS,
'sem_number' => Config::get()->IMPORTANT_SEMNUMBER,
'allow_tiled_display' => Config::get()->MY_COURSES_ALLOW_TILED_DISPLAY,
'display_type' => Config::get()->MY_COURSES_ALLOW_TILED_DISPLAY && $GLOBALS['user']->cfg->MY_COURSES_TILED_DISPLAY ? 'tiles' : 'tables',
'responsive_type' => Config::get()->MY_COURSES_ALLOW_TILED_DISPLAY && $GLOBALS['user']->cfg->MY_COURSES_TILED_DISPLAY_RESPONSIVE ? 'tiles' : 'tables',
'navigation_show_only_new' => $GLOBALS['user']->cfg->MY_COURSES_SHOW_NEW_ICONS_ONLY,
'group_by' => $this->getGroupField(),
],
];
......@@ -561,6 +560,9 @@ class MyCoursesController extends AuthenticatedController
// enable others to do something after the user has been deleted
NotificationCenter::postNotification('UserDidLeaveCourse', $course_id, $GLOBALS['user']->id);
// Delete course related datafield entries
DatafieldEntryModel::deleteBySQL('range_id = ? AND sec_range_id = ?', [$GLOBALS['user']->id, $course_id]);
// Delete from statusgroups
foreach (Statusgruppen::findBySeminar_id($course_id) as $group) {
$group->removeUser($GLOBALS['user']->id, true);
......@@ -635,7 +637,6 @@ class MyCoursesController extends AuthenticatedController
PageLayout::setTitle(_('Meine archivierten Veranstaltungen'));
PageLayout::setHelpKeyword('Basis.MeinArchiv');
Navigation::activateItem('/browse/my_courses/archive');
SkipLinks::addIndex(_('Hauptinhalt'), 'layout_content', 100);
if (Config::get()->ENABLE_ARCHIVE_SEARCH) {
$actions = Sidebar::get()->addWidget(new ActionsWidget());
......@@ -765,28 +766,6 @@ class MyCoursesController extends AuthenticatedController
$this->redirect($this->url_for('my_courses'));
}
/**
* Changes a config setting for the current use
* @param string $config Config setting
* @param bool $state State of setting
*/
public function config_action($config, $state = null)
{
if ($config === 'tiled') {
if ($state === null) {
$state = !$GLOBALS['user']->cfg->MY_COURSES_TILED_DISPLAY;
}
$GLOBALS['user']->cfg->store('MY_COURSES_TILED_DISPLAY', (bool) $state);
} elseif ($config === 'new') {
if ($state === null) {
$state = !$GLOBALS['user']->cfg->MY_COURSES_SHOW_NEW_ICONS_ONLY;
}
$GLOBALS['user']->cfg->store('MY_COURSES_SHOW_NEW_ICONS_ONLY', (bool) $state);
}
$this->redirect('my_courses');
}
/**
* Get widget for grouping selected courses (e.g. by colors, ...)
* @param $action
......@@ -929,22 +908,23 @@ class MyCoursesController extends AuthenticatedController
$views->id = 'tiled-courses-sidebar-switch';
$views->addLink(
_('Tabellarische Ansicht'),
$this->config('tiled', 0)
'#'
)->setActive(!$GLOBALS['user']->cfg->MY_COURSES_TILED_DISPLAY);
$views->addLink(
_('Kachelansicht'),
$this->config('tiled', 1)
'#'
)->setActive($GLOBALS['user']->cfg->MY_COURSES_TILED_DISPLAY);
$options = $sidebar->addWidget(new OptionsWidget());
$options->id = 'tiled-courses-new-contents-toggle';
$options->addCheckbox(
_('Nur neue Inhalte anzeigen'),
$GLOBALS['user']->cfg->MY_COURSES_SHOW_NEW_ICONS_ONLY,
$this->config('new')
);
}
$options = $sidebar->addWidget(new OptionsWidget());
$options->id = 'tiled-courses-new-contents-toggle';
$options->addCheckbox(
_('Nur neue Inhalte anzeigen'),
$GLOBALS['user']->cfg->MY_COURSES_SHOW_NEW_ICONS_ONLY,
'#'
);
$export_widget = $sidebar->addWidget(new ExportWidget());
$export_widget->addLink(
_('Veranstaltungsübersicht exportieren'),
......@@ -1025,7 +1005,7 @@ class MyCoursesController extends AuthenticatedController
'url' => $n->getURL(),
'icon' => $this->convertIcon($n->getImage()),
'attr' => $attr,
'important' => in_array($n->getImage()->getRole(), [Icon::ROLE_ATTENTION, Icon::ROLE_STATUS_RED, Icon::ROLE_NEW])
'important' => $n->getImage()->signalsAttention(),
];
}
$result[$key] = $item;
......@@ -1074,6 +1054,7 @@ class MyCoursesController extends AuthenticatedController
uksort($course['navigation'], function ($a, $b) use ($positions) {
return array_search($a, $positions) - array_search($b, $positions);
});
$course['navigation'] = array_values($course['navigation']);
return $course;
},
$courses
......
......@@ -9,14 +9,13 @@ class MyInstitutesController extends AuthenticatedController
if (!$GLOBALS['perm']->have_perm("root")) {
Navigation::activateItem('/browse/my_institutes');
}
$this->user_id = $GLOBALS['auth']->auth['uid'];
PageLayout::setHelpKeyword("Basis.MeineEinrichtungen");
PageLayout::setTitle(_("Meine Einrichtungen"));
$this->user_id = $GLOBALS['user']->id;
PageLayout::setHelpKeyword('Basis.MeineEinrichtungen');
PageLayout::setTitle(_('Meine Einrichtungen'));
}
public function index_action()
{
$this->institutes = MyRealmModel::getMyInstitutes();
if ($this->check_for_new($this->institutes)) {
......@@ -24,6 +23,11 @@ class MyInstitutesController extends AuthenticatedController
}
$this->nav_elements = MyRealmModel::calc_single_navigation($this->institutes);
$this->setupSidebar(
$this->institutes,
$this->check_for_new($this->institutes)
);
}
public function decline_inst_action($inst_id)
......@@ -31,22 +35,24 @@ class MyInstitutesController extends AuthenticatedController
$institut = Institute::find($inst_id);
$ticket_check = Seminar_Session::check_ticket(Request::option('studipticket'));
if (Request::option('cmd') != 'kill' && Request::get('cmd') != 'back') {
if (Request::option('cmd') !== 'kill' && Request::get('cmd') !== 'back') {
$this->flash['decline_inst'] = true;
$this->flash['inst_id'] = $inst_id;
$this->flash['name'] = $institut->name;
$this->flash['studipticket'] = Seminar_Session::get_ticket();
} else {
if (Request::get('cmd') == 'kill' && $ticket_check && Request::get('cmd') != 'back') {
$query = "DELETE FROM user_inst WHERE user_id = ? AND Institut_id = ? AND inst_perms = 'user'";
$statement = DBManager::get()->prepare($query);
$statement->execute([$GLOBALS['user']->id, $inst_id]);
if ($statement->rowCount() > 0) {
PageLayout::postMessage(MessageBox::success(sprintf(_("Die Zuordnung zur Einrichtung %s wurde aufgehoben."), "<b>" . htmlReady($institut->name) . "</b>")));
} else {
PageLayout::postMessage(MessageBox::error(_('Datenbankfehler')));
}
} elseif (Request::get('cmd') === 'kill' && $ticket_check && Request::get('cmd') !== 'back') {
$changed = InstituteMember::deleteBySQL(
"user_id = ? AND Institut_id = ? AND inst_perms = 'user'",
[$this->user_id, $inst_id]
);
if ($changed > 0) {
PageLayout::postSuccess(sprintf(
_('Die Zuordnung zur Einrichtung %s wurde aufgehoben.'),
'<strong>' . htmlReady($institut->name) . '</strong>'
));
} else {
PageLayout::postError(_('Datenbankfehler'));
}
}
$this->redirect('my_institutes/index');
......@@ -56,14 +62,14 @@ class MyInstitutesController extends AuthenticatedController
{
$institutes = MyRealmModel::getMyInstitutes();
foreach ($institutes as $index => $institut) {
MyRealmModel::setObjectVisits($institutes[$index], $institut['institut_id'], $GLOBALS['user']->id, $timestamp);
MyRealmModel::setObjectVisits($institutes[$index], $institut['institut_id'], $this->user_id, $timestamp);
}
PageLayout::postMessage(MessageBox::success(_('Alles als gelesen markiert!')));
PageLayout::postSuccess(_('Alles als gelesen markiert!'));
$this->redirect('my_institutes/index');
}
function check_for_new($my_obj)
protected function check_for_new($my_obj): bool
{
if(!empty($my_obj)) {
foreach ($my_obj as $inst) {
......@@ -75,8 +81,7 @@ class MyInstitutesController extends AuthenticatedController
return false;
}
function check_institute($institute)
protected function check_institute($institute): bool
{
if ($institute['visitdate'] || $institute['last_modified']) {
if ($institute['visitdate'] <= $institute["chdate"] || $institute['last_modified'] > 0) {
......@@ -98,4 +103,35 @@ class MyInstitutesController extends AuthenticatedController
return false;
}
private function setupSidebar(array $institutes, bool $reset)
{
$links = Sidebar::Get()->addWidget(new ActionsWidget());
if ($reset) {
$links->addLink(
_('Alles als gelesen markieren'),
$this->tabularasaURL(time()),
Icon::create('accept')
);
}
if ($GLOBALS['perm']->have_perm('dozent') && count($institutes) > 0) {
$links->addLink(
_('Einrichtungsdaten bearbeiten'),
URLHelper::getURL('dispatch.php/settings/statusgruppen'),
Icon::create('institute+edit')
);
}
if ($GLOBALS['perm']->have_perm('autor')) {
$links->addLink(
_('Einrichtungen suchen'),
URLHelper::getURL('dispatch.php/search/globalsearch#GlobalSearchInstitutes'),
Icon::create('institute+add')
);
$links->addLink(
_('Studiendaten bearbeiten'),
URLHelper::getURL('dispatch.php/settings/studies'),
Icon::create('person')
);
}
}
}