aboutsummaryrefslogtreecommitdiff
path: root/lib/models/StudipStudyArea.class.php
diff options
context:
space:
mode:
authorPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-09-24 10:53:31 +0200
committerPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-09-24 10:53:31 +0200
commit4459dd7917f4d1c34f40bb68f0e991e9c3d53e4c (patch)
tree5c07151ae61276d334e88f6309c30d439a85c12e /lib/models/StudipStudyArea.class.php
parentda0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff)
parent97a188592c679890a25c37ab78463add76a52ff7 (diff)
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'lib/models/StudipStudyArea.class.php')
-rw-r--r--lib/models/StudipStudyArea.class.php637
1 files changed, 0 insertions, 637 deletions
diff --git a/lib/models/StudipStudyArea.class.php b/lib/models/StudipStudyArea.class.php
deleted file mode 100644
index 8da8e16..0000000
--- a/lib/models/StudipStudyArea.class.php
+++ /dev/null
@@ -1,637 +0,0 @@
-<?php
-/**
- * Studienbereich... TODO
- *
- * Copyright (C) 2008 - 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.
- *
- * @package studip
- *
- * @author mlunzena
- * @author André Noack <noack@data-quest.de>
- * @copyright (c) Authors
- *
- * @property string $id alias column for sem_tree_id
- * @property string $sem_tree_id database column
- * @property string $parent_id database column
- * @property int $priority database column
- * @property string $info database column
- * @property string $name database column
- * @property string|null $studip_object_id database column
- * @property int $type database column
- * @property int|null $mkdate database column
- * @property int|null $chdate database column
- * @property SimpleORMapCollection|StudipStudyArea[] $_children has_many StudipStudyArea
- * @property StudipStudyArea $_parent belongs_to StudipStudyArea
- * @property SimpleORMapCollection|Course[] $courses has_and_belongs_to_many Course
- */
-
-class StudipStudyArea extends SimpleORMap implements StudipTreeNode
-{
- use StudipTreeNodeCachableTrait;
-
- /**
- * This constant represents the key of the root area.
- */
- const ROOT = 'root';
-
- protected static function configure($config = [])
- {
- $config['db_table'] = 'sem_tree';
- $config['has_many']['_children'] = [
- 'class_name' => StudipStudyArea::class,
- 'assoc_foreign_key' => 'parent_id',
- 'assoc_func' => 'findByParent',
- 'on_delete' => 'delete',
- 'on_store' => 'store',
- ];
- $config['has_and_belongs_to_many']['courses'] = [
- 'class_name' => Course::class,
- 'thru_table' => 'seminar_sem_tree',
- ];
- $config['belongs_to']['_parent'] = [
- 'class_name' => StudipStudyArea::class,
- 'foreign_key' => 'parent_id',
- ];
-
- $config = self::registerCachableCallbacks($config);
-
- parent::configure($config);
- }
-
- /**
- * This is required, if the nodes are added backwards
- */
- public $required_children = [];
-
- /**
- * Returns the children of the study area with the specified ID.
- */
- public static function findByParent($parent_id)
- {
- return self::findByparent_id($parent_id, "ORDER BY priority,name");
- }
-
- /**
- * Returns the study area with the specified ID.
- */
- public static function find($id)
- {
-
- $result = NULL;
-
- if ($id === self::ROOT) {
- $result = self::getRootArea();
- }
-
- else {
- $result = parent::find($id);
- }
-
- return $result;
- }
-
- /**
- * Get a string representation of this study area.
- */
- public function __toString()
- {
- return $this->id;
- }
-
-
- /**
- * Get the comment of this study area.
- */
- public function getInfo()
- {
- return $this->content['info'];
- }
-
-
- /**
- * Set the comment of this study area.
- */
- public function setInfo($info)
- {
- $this->content['info'] = (string) $info;
- return $this;
- }
-
-
- /**
- * Get the display name of this study area.
- */
- public function getName(): string
- {
- return $this->content['name'];
- }
-
- /**
- * Set the display name of this study area.
- */
- public function setName($name)
- {
- $this->content['name'] = (string) $name;
- return $this;
- }
-
-
- /**
- * Get the parent ID of this study area.
- */
- public function getParentId()
- {
- return $this->content['parent_id'];
- }
-
-
- /**
- * Get the parent.
- */
- public function getParent()
- {
- $result = NULL;
- if ($this->getID() !== self::ROOT) {
- $result = $this->_parent;
- }
- return $result;
- }
-
-
- /**
- * Set the parent of this study area.
- */
- public function setParentId($parent_id)
- {
- $this->content['parent_id'] = (string) $parent_id;
- $this->resetRelation('parent');
- return $this;
- }
-
- /**
- * get the type of this study area.
- */
- public function getType()
- {
- return $this->content['type'];
- }
-
- /**
- * set the type of this study area.
- */
- public function setType($type)
- {
- $this->content['type'] = (int) $type;
- return $this;
- }
-
- /**
- * get the name of the type of this study area, see $SEM_TREE_TYPES in config.inc.php
- *
- * @return string
- */
- public function getTypeName()
- {
- if(isset($GLOBALS['SEM_TREE_TYPES'][$this->getType()]['name'])){
- return $GLOBALS['SEM_TREE_TYPES'][$this->getType()]['name'];
- } else {
- return '';
- }
- }
-
- /**
- * is this study area editable, see $SEM_TREE_TYPES in config.inc.php
- *
- * @return bool
- */
- public function isEditable()
- {
- if(isset($GLOBALS['SEM_TREE_TYPES'][$this->getType()]['editable'])){
- return (bool)$GLOBALS['SEM_TREE_TYPES'][$this->getType()]['editable'];
- } else {
- return false;
- }
- }
-
- /**
- * is this study area hidden, see $SEM_TREE_TYPES in config.inc.php
- *
- * @return bool
- */
- public function isHidden()
- {
- if (isset($GLOBALS['SEM_TREE_TYPES'][$this->getType()]['hidden'])) {
- return (bool) $GLOBALS['SEM_TREE_TYPES'][$this->getType()]['hidden'];
- } else {
- return false;
- }
- }
-
- /**
- * Get the path along the sem_tree to this study area.
- *
- * @param string optional; TODO
- *
- * @return mixed TODO
- */
- public function getPath($separator = NULL)
- {
-
- $path = [];
-
- $area = $this;
- while ($area) {
- if ($area->getName() != '') {
- $path[] = $area->getName();
- }
- if ($area->getParentId() == self::ROOT) {
- break;
- }
- $area = $area->getParent();
- }
-
- $path = array_reverse($path);
-
- return isset($separator)
- ? join($separator, $path)
- : $path;
- }
-
-
- /**
- * Get the priority of this study area.
- */
- public function getPriority()
- {
- return $this->content['priority'];
- }
-
-
- /**
- * Set the priority of this study area.
- */
- public function setPriority($priority)
- {
- $this->content['priority'] = (int) $priority;
- return $this;
- }
-
-
- /**
- * Returns the children of this study area.
- */
- public function getChildren()
- {
- return $this->_children;
- }
-
- /**
- * Returns1 TRUE if the area has children.
- */
- public function hasChildren()
- {
- return sizeof($this->_children) > 0;
- }
-
-
- /**
- * Returns TRUE if this area is the root.
- */
- public function isRoot()
- {
- return $this->getId() === self::ROOT;
- }
-
-
- /**
- * Returns TRUE if this area can be select.
- */
- public function isAssignable()
- {
- $cfg = Config::GetInstance();
- $leaves_too = $cfg->getValue('SEM_TREE_ALLOW_BRANCH_ASSIGN');
- if ($leaves_too) {
- return !$this->isRoot() && !$this->isHidden();
- } else {
- return !$this->isRoot() && !$this->isHidden() && !$this->hasChildren();
- }
- }
-
- /**
- * is this study area considered a study modul?, see $SEM_TREE_TYPES in config.inc.php
- *
- * @return bool
- */
- public function isModule()
- {
- return isset($GLOBALS['SEM_TREE_TYPES'][$this->getType()]['is_module']);
- }
-
- /**
- * Get an associative array of all study areas of a course. The array
- * contains StudipStudyArea instances
- *
- * @param id the course's ID
- *
- * @return SimpleCollection a SimpleORMapCollection of that course's study areas
- */
- public static function getStudyAreasForCourse($id)
- {
- $course = Course::find($id);
- return $course ? $course->study_areas : new SimpleCollection();
- }
-
-
- /**
- * Returns the not really existing root study area.
- *
- * @return object the root study area object
- */
- public static function getRootArea()
- {
- $root = new StudipStudyArea();
- $root->setID(self::ROOT);
- $root->setName(Config::get()->UNI_NAME_CLEAN);
- return $root;
- }
-
-
- /**
- * Search for study areas whose name matches the given search term.
- *
- * @param string $searchTerm the seach term
- *
- * @return StudipStudyArea[] nodes
- */
- public static function search($searchTerm)
- {
- return self::findBySql(
- "name LIKE :searchTerm ORDER BY priority",
- ['searchTerm' => "%$searchTerm%"]
- );
- }
-
- /**
- * Takes an array of StudyArea objects and produces the tree to the root node
- *
- * @param array $nodes All required nodes in the tree
- * @return StudipStudyArea the root node
- */
- public static function backwards($nodes)
- {
- // create the dummy root
- $root = static::getRootArea();
-
- $hashmap = [];
-
- $i = 0;
-
- // let the backwardssearch begin
- while ($nodes && $i < 99) {
-
- //clear cache
- $newNodes = [];
-
- //process nodes on this level
- foreach ($nodes as $node) {
-
- // if we know the node already place there
- if (isset($hashmap[$node->parent_id])) {
- $cached = $hashmap[$node->parent_id];
- $cached->required_children[$node->id] = $node;
- } else {
- // if we have a node that is directly under root
- if ($node->parent_id == $root->id) {
- $root->required_children[$node->id] = $node;
- } else {
- // else store in hashmap and continue
- $hashmap[$node->parent_id] = $node->_parent;
- $node->_parent->required_children[$node->id] = $node;
- $newNodes[$node->id] = $node->_parent;
- }
- }
- }
- $nodes = $newNodes;
- $i++;
- }
-
- // plant the tree
- return $root;
- }
-
- public static function getNode($id): StudipTreeNode
- {
- if ($id === 'root') {
- return static::build([
- 'id' => 'root',
- 'name' => Config::get()->UNI_NAME_CLEAN,
- ]);
- }
-
- return static::find($id);
- }
-
- public static function getCourseNodes(string $course_id): array
- {
- return Course::find($course_id)->study_areas->getArrayCopy();
- }
-
- public function getDescription(): string
- {
- return $this->getInfo();
- }
-
- /**
- * @see StudipTreeNode::getImage()
- */
- public function getImage()
- {
- return null;
- }
-
- public function hasChildNodes(): bool
- {
- return count($this->_children) > 0;
- }
-
- /**
- * @see StudipTreeNode::getChildNodes()
- */
- public function getChildNodes(bool $onlyVisible = false): array
- {
- if ($onlyVisible) {
- $visibleTypes = array_filter($GLOBALS['SEM_TREE_TYPES'], function ($t) {
- return isset($t['hidden']) ? !$t['hidden'] : true;
- });
-
- return static::findBySQL(
- "`parent_id` = :parent AND `type` IN (:types) ORDER BY `priority`, `name`",
- ['parent' => $this->id, 'types' => $visibleTypes]
- );
- } else {
- return static::findByParent_id($this->id, "ORDER BY `priority`, `name`");
- }
- }
-
- /**
- * @see StudipTreeNode::countCourses()
- */
- public function countCourses(
- $semester_id = 'all',
- $semclass = 0,
- $with_children = false
- ) :int
- {
- $query = "SELECT COUNT(DISTINCT t.`seminar_id`) FROM `seminar_sem_tree` t";
-
- if ($semester_id !== 'all') {
- $query .= " JOIN `seminare` s ON (s.`Seminar_id` = t.`seminar_id`)
- LEFT JOIN `semester_courses` sc ON (t.`seminar_id` = sc.`course_id`)
- WHERE sc.`semester_id` = :semester";
- $parameters = [
- 'semester' => $semester_id
- ];
- } else {
- $query .= " JOIN `seminare` s ON (s.`Seminar_id` = t.`seminar_id`)";
- $parameters = [];
- }
-
- if ($with_children) {
- $query .= " AND t.`sem_tree_id` IN (:ids)";
- $parameters['ids'] = array_merge([$this->id], $this->getDescendantIds());
- } else {
- $query .= " AND t.`sem_tree_id` = :id";
- $parameters['id'] = $this->id;
- }
-
- if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) {
- $query .= " AND s.`visible` = 1";
- }
-
- if ($semclass !== 0) {
- $query .= " AND s.`status` IN (:types)";
- $parameters['types'] = array_map(
- function ($type) {
- return $type['id'];
- },
- array_filter(
- SemType::getTypes(),
- function ($t) use ($semclass) { return $t['class'] === $semclass; }
- )
- );
- }
-
- return $this->id === 'root' && !$with_children ? 0 : DBManager::get()->fetchColumn($query, $parameters);
- }
-
- public function getCourses(
- $semester_id = 'all',
- $semclass = 0,
- $searchterm = '',
- $with_children = false,
- array $courses = []
- ): array
- {
- $query = "SELECT DISTINCT s.* FROM `seminar_sem_tree` t";
-
- if ($semester_id !== 'all') {
- $query .= " JOIN `seminare` s ON (s.`Seminar_id` = t.`seminar_id`)
- LEFT JOIN `semester_courses` sc ON (t.`seminar_id` = sc.`course_id`)
- WHERE sc.`semester_id` = :semester";
- $parameters = [
- 'semester' => $semester_id
- ];
- } else {
- $query .= " JOIN `seminare` s ON (s.`Seminar_id` = t.`seminar_id`)";
- $parameters = [];
- }
-
- if ($with_children) {
- $query .= " AND t.`sem_tree_id` IN (:ids)";
- $parameters['ids'] = array_merge([$this->id], $this->getDescendantIds());
- } else {
- $query .= " AND t.`sem_tree_id` = :id";
- $parameters['id'] = $this->id;
- }
-
- if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) {
- $query .= " AND s.`visible` = 1";
- }
-
- if ($semclass !== 0) {
- $query .= " AND s.`status` IN (:types)";
- $parameters['types'] = array_map(
- function ($type) {
- return $type['id'];
- },
- array_filter(
- SemType::getTypes(),
- function ($t) use ($semclass) { return $t['class'] === $semclass; }
- )
- );
- }
-
- if ($searchterm) {
- $query .= " AND s.`Name` LIKE :searchterm";
- $parameters['searchterm'] = '%' . trim($searchterm) . '%';
- }
-
- if ($courses) {
- $query .= " AND t.`seminar_id` IN (:courses)";
- $parameters['courses'] = $courses;
- }
-
- if (Config::get()->IMPORTANT_SEMNUMBER) {
- $query .= " ORDER BY s.`start_time`, s.`VeranstaltungsNummer`, s.`Name`";
- } else {
- $query .= " ORDER BY s.`start_time`, s.`Name`";
- }
-
- return DBManager::get()->fetchAll($query, $parameters, 'Course::buildExisting');
- }
-
- public function getAncestors(): array
- {
- $path = [
- [
- 'id' => $this->id,
- 'name' => $this->getName(),
- 'classname' => static::class
- ]
- ];
-
- if ($this->parent_id) {
- $path = array_merge($this->getNode($this->parent_id)->getAncestors(), $path);
- }
-
- return $path;
- }
-
- /**
- * Constructs an index from the level hierarchy, This index is a number,
- * containing the "depth" level and the priority on this level. For example,
- * a node on level 2 with priority 3 will get an index of 23.
- *
- * @return int
- */
- public function getIndex()
- {
- $level = 1;
- $index = (string) $level . (string) $this->priority;
- $current = $this;
-
- while ($current->getParent()) {
- $current = $current->getParent();
- $index .= $level . $current->priority;
- $level++;
- }
-
- return $index;
- }
-
-}