diff options
| author | Marcus Eibrink-Lunzenauer <lunzenauer@elan-ev.de> | 2024-06-18 13:18:06 +0000 |
|---|---|---|
| committer | Marcus Eibrink-Lunzenauer <lunzenauer@elan-ev.de> | 2024-06-18 13:18:06 +0000 |
| commit | 33fd1358507b4a5abb3dcebe78d407d0567717c1 (patch) | |
| tree | 6bd8f6959da4c3fc1b8907c0bbc28eb9e10d4a5a /lib/classes/AdminCourseFilter.php | |
| parent | 42d46671c0309bddb71a91bbfdc5f2fa2e44384e (diff) | |
Deprecate `StudipAutoloader` and use composer's `autoload`
Closes #4282
Merge request studip/studip!3099
Diffstat (limited to 'lib/classes/AdminCourseFilter.php')
| -rw-r--r-- | lib/classes/AdminCourseFilter.php | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/lib/classes/AdminCourseFilter.php b/lib/classes/AdminCourseFilter.php new file mode 100644 index 0000000..f643e09 --- /dev/null +++ b/lib/classes/AdminCourseFilter.php @@ -0,0 +1,220 @@ +<?php + +/** + * Class AdminCourseFilter + * + * The main class to filter all courses for admins. It's a singleton class, so you + * better call it with AdminCourseFilter::get(). The whole class is created to + * provide a nice hook for plugins to add special filters into the admin-area of + * Stud.IP. + * + * To add a filter with a plugin, listen to the notification "AdminCourseFilterWillQuery" + * like this: + * + * NotificationCenter::addObserver($this, "addMyFilter", "AdminCourseFilterWillQuery"); + * + * Where $this is an object and "addMyFilter" a method. Such a method might look like this: + * + * public function addLectureshipFilter($event, $filter) + * { + * if ($GLOBALS['user']->cfg->getValue("LECTURESHIP_FILTER")) { + * $filter->query->join('lehrauftrag', 'seminare.Seminar_id = lehrauftrag.seminar_id'); + * } + * } + * + * Within this method you alter the public $filter->query object. That query object is of type SQLQuery. + * + */ +class AdminCourseFilter +{ + static protected $instance = null; + + /** @var SQLQuery|null */ + public $query = null; + public $max_show_courses = 500; + public $settings = []; + + /** + * returns an AdminCourseFilter singleton object + * @return AdminCourseFilter or derived-class object + */ + static public function get($reset_settings = false) + { + if (!self::$instance) { + $class = get_called_class(); + self::$instance = new $class($reset_settings); + } + return self::$instance; + } + + /** + * Constructor of the singleton-object. + */ + public function __construct() + { + $this->initSettings(); + } + + protected function initSettings() + { + $this->query = SQLQuery::table('seminare'); + $this->query->join('sem_types', 'sem_types', 'sem_types.id = seminare.status'); + $this->query->join('sem_classes', 'sem_classes', 'sem_classes.id = sem_types.class'); + $this->query->where("sem_classes.studygroup_mode = '0'"); + $this->query->groupBy('seminare.Seminar_id'); + + if ($GLOBALS['user']->cfg->ADMIN_COURSES_SEARCHTEXT) { + $this->query->join('teachers_su', 'seminar_user', "teachers_su.Seminar_id = seminare.Seminar_id AND teachers_su.status = 'dozent'"); + $this->query->join('teachers', 'auth_user_md5', 'teachers.user_id = teachers_su.user_id'); + $this->query->where( + 'search', + "(seminare.name LIKE :search OR seminare.VeranstaltungsNummer LIKE :search OR seminare.untertitel LIKE :search OR CONCAT(teachers.Vorname, ' ', teachers.Nachname) LIKE :search)", + ['search' => '%'.$GLOBALS['user']->cfg->ADMIN_COURSES_SEARCHTEXT.'%'] + ); + } + if (Request::option('course_id')) { + $this->query->where('course_id', 'seminare.Seminar_id = :course_id', ['course_id' => Request::option('course_id')]); + } + $inst_ids = []; + + if ( + !$GLOBALS['user']->cfg->MY_INSTITUTES_DEFAULT + || $GLOBALS['user']->cfg->MY_INSTITUTES_DEFAULT === 'all' + ) { + $inst = new SimpleCollection(Institute::getMyInstitutes($GLOBALS['user']->id)); + $inst_ids = $inst->map(function ($a) { + return $a['Institut_id']; + }); + } else { + + $inst_id = $GLOBALS['user']->cfg->MY_INSTITUTES_DEFAULT; + $inst_ids[] = $inst_id; + + if ($GLOBALS['user']->cfg->MY_INSTITUTES_INCLUDE_CHILDREN) { + $inst = Institute::find($inst_id); + if ($inst && $inst->isFaculty()) { + foreach ($inst->sub_institutes->pluck('Institut_id') as $institut_id) { + $inst_ids[] = $institut_id; + } + } + } + } + + if (Config::get()->ALLOW_ADMIN_RELATED_INST) { + $this->query->where('seminar_inst', 'EXISTS (SELECT 1 FROM seminar_inst WHERE seminar_id = seminare.Seminar_id AND institut_id IN (:institut_ids))'); + } else { + $this->query->where("seminar_inst", "seminare.institut_id IN (:institut_ids)"); + } + $this->query->parameter('institut_ids', $inst_ids); + + if ($GLOBALS['user']->cfg->MY_COURSES_SELECTED_CYCLE) { + $this->query->join('semester_courses', 'semester_courses.course_id = seminare.Seminar_id', 'LEFT JOIN'); + $this->query->where('semester_id', '(semester_courses.semester_id = :semester_id OR semester_courses.semester_id IS NULL)', [ + 'semester_id' => $GLOBALS['user']->cfg->MY_COURSES_SELECTED_CYCLE + ]); + } + + if ($GLOBALS['user']->cfg->MY_COURSES_TYPE_FILTER && $GLOBALS['user']->cfg->MY_COURSES_TYPE_FILTER !== 'all') { + if (str_contains($GLOBALS['user']->cfg->MY_COURSES_TYPE_FILTER, '_')) { + list($sem_class_id, $sem_type_id) = explode('_', $GLOBALS['user']->cfg->MY_COURSES_TYPE_FILTER); + $this->query->where('course_type', 'seminare.status = :course_type', ['course_type' => $sem_type_id]); + } else { + //sem class + $this->query->where('course_class', 'sem_types.class = :course_class', [ + 'course_class' => $GLOBALS['user']->cfg->MY_COURSES_TYPE_FILTER + ]); + } + + } + + if ($GLOBALS['user']->cfg->MY_COURSES_SELECTED_STGTEIL) { + $this->query->join('mvv_lvgruppe_seminar', '`mvv_lvgruppe_seminar`.`seminar_id` = `seminare`.`Seminar_id`'); + $this->query->join('mvv_lvgruppe_modulteil', '`mvv_lvgruppe_modulteil`.`lvgruppe_id` = `mvv_lvgruppe_seminar`.`lvgruppe_id`'); + $this->query->join('mvv_modulteil', '`mvv_modulteil`.`modulteil_id` = `mvv_lvgruppe_modulteil`.`modulteil_id`'); + $this->query->join('mvv_modul', '`mvv_modul`.`modul_id` = `mvv_modulteil`.`modul_id`'); + $this->query->join('mvv_stgteilabschnitt_modul', '`mvv_stgteilabschnitt_modul`.`modul_id` = `mvv_modul`.`modul_id`'); + $this->query->join('mvv_stgteilabschnitt', '`mvv_stgteilabschnitt`.`abschnitt_id` = `mvv_stgteilabschnitt_modul`.`abschnitt_id`'); + $this->query->join('mvv_stgteilversion', '`mvv_stgteilversion`.`version_id` = `mvv_stgteilabschnitt`.`version_id`'); + $this->query->where('stgteil', 'mvv_stgteilversion.stgteil_id = :stgteil_id', [ + 'stgteil_id' => $GLOBALS['user']->cfg->MY_COURSES_SELECTED_STGTEIL + ]); + } + + if ($GLOBALS['user']->cfg->ADMIN_COURSES_TEACHERFILTER) { + $this->query->join('teachers_su', 'seminar_user', "teachers_su.Seminar_id = seminare.Seminar_id AND teachers_su.status = 'dozent'"); + $this->query->where( + 'teacher_filter', + "teachers_su.user_id = :teacher_id", + ['teacher_id' => $GLOBALS['user']->cfg->ADMIN_COURSES_TEACHERFILTER] + ); + } + + + + $datafields_filters = $GLOBALS['user']->cfg->ADMIN_COURSES_DATAFIELDS_FILTERS; + foreach ($datafields_filters as $datafield_id => $value) { + $this->query->join('de_'.$datafield_id, 'datafields_entries', 'de_'.$datafield_id.'.range_id = seminare.Seminar_id AND `de_'.$datafield_id.'`.datafield_id = :de_'.$datafield_id.'_id'); + $this->query->where('de_' . $datafield_id . '_contents', 'de_' . $datafield_id . '.`content` LIKE :de_' . $datafield_id . '_content', + [ + 'de_' . $datafield_id . '_id' => $datafield_id, + 'de_' . $datafield_id . '_content' => '%' . $value . '%' + ]); + } + } + + /** + * Returns the data of the resultset of the AdminCourseFilter. + * Also saves the settings in the session. + * Note that a notification AdminCourseFilterWillQuery will be posted, before the result is computed. + * Plugins may register at this event to fully alter this AdminCourseFilter-object and so the resultset. + * @return array associative array with seminar_ids as keys and seminar-data-arrays as values. + */ + public function getCourses() + { + NotificationCenter::postNotification("AdminCourseFilterWillQuery", $this); + return $this->query->fetchAll(Course::class); + } + + /** + * @return integer number of courses that this filter would return + */ + public function countCourses() + { + NotificationCenter::postNotification("AdminCourseFilterWillQuery", $this); + return $this->query->count(); + } + + /** + * @param int|null $limit + * @return Course[] + */ + public function fetchCourses(?int $limit = null): array + { + NotificationCenter::postNotification('AdminCourseFilterWillQuery', $this); + return $this->query->fetchAll(Course::class, $limit); + } + + /** + * Returns the data of the resultset of the AdminCourseFilter. + * + * @param string $order_by possible values name or number + * + * Note that a notification AdminCourseFilterWillQuery will be posted, before the result is computed. + * Plugins may register at this event to fully alter this AdminCourseFilter-object and so the resultset. + * @return array associative array with seminar_ids as keys and seminar-data-arrays as values. + */ + public function getCoursesForAdminWidget(string $order_by = 'name') + { + try { + $order = 'seminare.name'; + if ($order_by === 'number') { + $order = 'seminare.veranstaltungsnummer, seminare.name'; + } + $this->query->orderBy($order); + return $this->fetchCourses($this->max_show_courses); + } catch (OverflowException $e) { + return []; + } + } + +} |
