diff --git a/application/config/navigation.php b/application/config/navigation.php index cf87ce19d..5f3414759 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -119,6 +119,13 @@ $config['navigation_header'] = array( 'expand' => true, 'sort' => 30, 'requiredPermissions' => 'system/issues_verwalten:r' + ), + 'gruppenmanagement' => array( + 'link' => site_url('person/Gruppenmanagement'), + 'description' => 'Gruppenmanagement', + 'expand' => true, + 'sort' => 40, + 'requiredPermissions' => 'lehre/gruppenmanager:r' ) ) ), diff --git a/application/controllers/person/Gruppenmanagement.php b/application/controllers/person/Gruppenmanagement.php new file mode 100644 index 000000000..4bc80c760 --- /dev/null +++ b/application/controllers/person/Gruppenmanagement.php @@ -0,0 +1,237 @@ + 'lehre/gruppenmanager:r', + 'showBenutzergruppe' => 'lehre/gruppenmanager:r', + 'getBenutzer' => 'lehre/gruppenmanager:r', + 'getAllBenutzer' => 'lehre/gruppenmanager:r', + 'addBenutzer' => 'lehre/gruppenmanager:rw', + 'removeBenutzer' => 'lehre/gruppenmanager:rw' + ) + ); + + // Loads models + $this->load->model('person/benutzer_model', 'BenutzerModel'); + $this->load->model('person/benutzergruppe_model', 'BenutzergruppeModel'); + $this->load->model('system/Log_model', 'LogModel'); + + $this->load->library('WidgetLib'); + $this->loadPhrases( + array( + 'global', + 'person', + 'lehre', + 'ui', + 'filter', + 'gruppenmanagement' + ) + ); + + $this->setControllerId(); // sets the controller id + $this->_setAuthUID(); // sets property uid + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * Main page + */ + public function index() + { + $this->load->view( + 'person/gruppenmanagement/gruppenmanagement.php', + array('uid' => $this->_uid) + ); + } + + /** + * Shows Benutzergruppe overview page. + */ + public function showBenutzergruppe() + { + $this->_setNavigationMenuShowDetails(); + $gruppe_kurzbz = $this->input->get('gruppe_kurzbz'); + + $data[self::FHC_CONTROLLER_ID] = $this->getControllerId(); + + $this->load->view( + 'person/gruppenmanagement/benutzergruppe.php', + array('gruppe_kurzbz' => $gruppe_kurzbz) + ); + } + + /** + * Gets Benutzer assigned to a Gruppe + */ + public function getBenutzer() + { + $gruppe_kurzbz = $this->input->get('gruppe_kurzbz'); + + $this->BenutzergruppeModel->addSelect('uid, vorname, nachname, ben.aktiv'); + $this->BenutzergruppeModel->addJoin('public.tbl_benutzer ben', 'uid'); + $this->BenutzergruppeModel->addJoin('public.tbl_person', 'person_id'); + $benutzerRes = $this->BenutzergruppeModel->loadWhere(array('gruppe_kurzbz' => $gruppe_kurzbz)); + + $this->outputJson($benutzerRes); + } + + /** + * Gets all Benutzer for assignment to Gruppe + */ + public function getAllBenutzer() + { + $this->BenutzerModel->addSelect('uid, vorname, nachname'); + $this->BenutzerModel->addJoin('public.tbl_person', 'person_id'); + $benutzerRes = $this->BenutzerModel->loadWhere( + array('tbl_benutzer.aktiv' => true) + ); + $this->outputJson($benutzerRes); + } + + /** + * Adds a Benutzer to Gruppe + */ + public function addBenutzer() + { + $uid = $this->input->post('uid'); + $gruppe_kurzbz = $this->input->post('gruppe_kurzbz'); + + if (isEmptyString($uid)) + $result = error('Uid missing'); + else + { + $benutzerExistsRes = $this->BenutzergruppeModel->loadWhere( + array( + 'uid' => $uid, + 'gruppe_kurzbz' => $gruppe_kurzbz + ) + ); + + if (isError($benutzerExistsRes)) + { + $this->outputJsonError(getError($benutzerExistsRes)); + return; + } + + if (hasData($benutzerExistsRes)) + { + $this->outputJsonError($this->p->t('gruppenmanagement', 'benutzerSchonZugewiesen')); + return; + } + + $result = $this->BenutzergruppeModel->insert( + array( + 'uid' => $uid, + 'gruppe_kurzbz' => $gruppe_kurzbz, + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => $this->_uid + ) + ); + + // log the group add + $lastQry = $this->db->last_query(); + + if (isSuccess($result)) + { + $this->LogModel->insert(array( + 'mitarbeiter_uid' => $this->_uid, + 'beschreibung' => 'Gruppenmanagement: Nutzer zu Gruppe hinzugefügt', + 'sql' => $lastQry + )); + } + } + + $this->outputJson($result); + } + + /** + * Removes Benutzer from Gruppe + */ + public function removeBenutzer() + { + $uid = $this->input->post('uid'); + $gruppe_kurzbz = $this->input->post('gruppe_kurzbz'); + + if (isEmptyString($uid)) + $result = error('Uid missing'); + else + { + $result = $this->BenutzergruppeModel->delete( + array( + 'uid' => $uid, + 'gruppe_kurzbz' => $gruppe_kurzbz + ) + ); + } + + // log the group remove + $lastQry = $this->db->last_query(); + + if (isSuccess($result)) + { + $this->LogModel->insert(array( + 'mitarbeiter_uid' => $this->_uid, + 'beschreibung' => 'Gruppenmanagement: Nutzer aus Gruppe entfernt', + 'sql' => $lastQry + )); + } + + $this->outputJson($result); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + + /** + * Define the navigation menu for the showDetails page + */ + private function _setNavigationMenuShowDetails() + { + $this->load->library('NavigationLib', array('navigation_page' => 'person/Gruppenmanagement/showBenutzergruppe')); + + $link = site_url('person/Gruppenmanagement'); + + $this->navigationlib->setSessionMenu( + array( + 'back' => $this->navigationlib->oneLevel( + 'Zurück', // description + $link, // link + array(), // children + 'angle-left', // icon + true, // expand + null, // subscriptDescription + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 1 // sort + ) + ) + ); + } + + /** + * Set uid of authentificated user + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } +} diff --git a/application/views/person/gruppenmanagement/benutzergruppe.php b/application/views/person/gruppenmanagement/benutzergruppe.php new file mode 100644 index 000000000..1bb698591 --- /dev/null +++ b/application/views/person/gruppenmanagement/benutzergruppe.php @@ -0,0 +1,76 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Benutzer in Gruppe', + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'sbadmintemplate' => true, + 'tablesorter' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'filterwidget' => true, + 'navigationwidget' => true, + 'phrases' => array( + 'gruppenmanagement', + 'ui' + ), + 'customCSSs' => 'public/css/sbadmin2/tablesort_bootstrap.css', + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/tablesort/tablesort.js', 'public/js/person/benutzergruppe.js') + ) + ); +?> + + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+
+
+ +
+
+
+
+
+
+ + + + + + +
+
+
+
+
+
+ + + + + + + + + + +
Uidp->t('person', 'vorname')); ?>p->t('person', 'nachname')); ?>p->t('gruppenmanagement', 'aktiv')); ?>p->t('ui', 'entfernen')); ?>
+
+
+
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/person/gruppenmanagement/gruppenmanagement.php b/application/views/person/gruppenmanagement/gruppenmanagement.php new file mode 100644 index 000000000..32416eb86 --- /dev/null +++ b/application/views/person/gruppenmanagement/gruppenmanagement.php @@ -0,0 +1,46 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Gruppenmanagement', + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'sbadmintemplate' => true, + 'tablesorter' => true, + 'ajaxlib' => true, + 'filterwidget' => true, + 'navigationwidget' => true, + 'phrases' => array( + 'ui' + ), + 'customCSSs' => 'public/css/sbadmin2/tablesort_bootstrap.css', + 'customJSs' => array('public/js/bootstrapper.js') + ) + ); +?> + + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+
+
+ +
+
+
+ load->view('person/gruppenmanagement/gruppenmanagementData.php'); ?> +
+
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/person/gruppenmanagement/gruppenmanagementData.php b/application/views/person/gruppenmanagement/gruppenmanagementData.php new file mode 100644 index 000000000..4eef0acec --- /dev/null +++ b/application/views/person/gruppenmanagement/gruppenmanagementData.php @@ -0,0 +1,66 @@ + ' + SELECT gruppe_kurzbz, grp.bezeichnung AS gruppe_bezeichnung, grp.beschreibung AS gruppe_beschreibung, + studiengang_kz, UPPER(stg.typ||stg.kurzbz) AS studiengang_kurzbz, semester, sichtbar, lehre, grp.aktiv, mailgrp, generiert + FROM public.tbl_gruppe grp + JOIN public.tbl_studiengang stg USING (studiengang_kz) + JOIN public.tbl_gruppe_manager grpmgr USING (gruppe_kurzbz) + WHERE grp.aktiv = TRUE + AND grpmgr.uid = \''.$uid.'\'', + 'requiredPermissions' => 'admin', + 'datasetRepresentation' => 'tablesorter', + 'additionalColumns' => array('Teilnehmer'), + 'columnsAliases' => array( + ucfirst($this->p->t('gruppenmanagement', 'kurzbezeichnung')), + ucfirst($this->p->t('gruppenmanagement', 'bezeichnung')), + ucfirst($this->p->t('gruppenmanagement', 'beschreibung')), + ucfirst($this->p->t('lehre', 'studiengangskennzahlLehre')), + ucfirst($this->p->t('lehre', 'studiengang')), + ucfirst($this->p->t('lehre', 'semester')), + 'Sichtbar', + 'Lehre', + 'Aktiv', + 'Mailgrp', + 'Generiert' + ), + 'formatRow' => function($datasetRaw) { + + /* NOTE: Dont use $this here for PHP Version compatibility */ + $datasetRaw->{'Teilnehmer'} = sprintf( + ''.$this->p->t('gruppenmanagement', 'zuweisenloeschen').'', + site_url('person/Gruppenmanagement/showBenutzergruppe'), + $datasetRaw->{'gruppe_kurzbz'}, + 'index', + (isset($_GET['fhc_controller_id'])?$_GET['fhc_controller_id']:'') + ); + + if ($datasetRaw->{'gruppe_bezeichnung'} == null) + { + $datasetRaw->{'gruppe_bezeichnung'} = '-'; + } + if ($datasetRaw->{'gruppe_beschreibung'} == null) + { + $datasetRaw->{'gruppe_beschreibung'} = '-'; + } + if ($datasetRaw->{'semester'} == null) + { + $datasetRaw->{'semester'} = '-'; + } + $datasetRaw->{'sichtbar'} = $datasetRaw->{'sichtbar'} == 'true' ? 'ja' : 'nein'; + $datasetRaw->{'lehre'} = $datasetRaw->{'lehre'} == 'true' ? 'ja' : 'nein'; + $datasetRaw->{'aktiv'} = $datasetRaw->{'aktiv'} == 'true' ? 'ja' : 'nein'; + $datasetRaw->{'mailgrp'} = $datasetRaw->{'mailgrp'} == 'true' ? 'ja' : 'nein'; + $datasetRaw->{'generiert'} = $datasetRaw->{'generiert'} == 'true' ? 'ja' : 'nein'; + + return $datasetRaw; + } + ); + + $filterWidgetArray['app'] = 'core'; + $filterWidgetArray['datasetName'] = 'gruppenmanagement'; + $filterWidgetArray['filterKurzbz'] = 'gruppenmanagement'; + $filterWidgetArray['filter_id'] = $this->input->get('filter_id'); + + echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray); +?> diff --git a/include/gruppemanager.class.php b/include/gruppemanager.class.php new file mode 100644 index 000000000..009804204 --- /dev/null +++ b/include/gruppemanager.class.php @@ -0,0 +1,187 @@ +. + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); + +class gruppemanager extends basis_db +{ + public $new; + + //Tabellenspalten + public $uid; // varchar(32) + public $gruppe_kurzbz; // varchar(32) + public $insertamum; // timestamp + public $insertvon; // varchar(32) + + public $uids = array(); // array + + /** + * Konstruktor - Laedt optional einen Gruppenmanager + * @param $uid + * @param $gruppe_kurzbz + */ + public function __construct($uid=null, $gruppe_kurzbz=null) + { + parent::__construct(); + + if(!is_null($gruppe_kurzbz) && !is_null($uid)) + $this->load($uid, $gruppe_kurzbz); + } + + /** + * Laedt die BenutzerGruppe + * @param uid, gruppe_kurzbz + * @return true wenn ok, false im Fehlerfall + */ + public function load($uid, $gruppe_kurzbz) + { + $qry = "SELECT * FROM public.tbl_gruppe_manager WHERE uid=".$this->db_add_param($uid)." AND gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz); + + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $this->uid = $row->uid; + $this->gruppe_kurzbz = $row->gruppe_kurzbz; + $this->insertamum = $row->insertamum; + $this->insertvon = $row->insertvon; + return true; + } + else + { + $this->errormsg = 'Es wurde kein Datensatz gefunden'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Laden des Datensatzes'; + return false; + } + } + + /** + * Laedt die Manager einer Benutzergruppe + * @param gruppe_kurzbz + * @return true wenn ok, false im Fehlerfall + */ + public function load_uids($gruppe_kurzbz) + { + $qry = "SELECT * FROM public.tbl_gruppe_manager + WHERE gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz); + + if ($this->db_query($qry)) + { + if ($this->db_num_rows() == 0) + return false; + else + { + while ($row = $this->db_fetch_object()) + { + $gm_obj = new gruppemanager(); + $gm_obj->uid = $row->uid; + $this->uids[] = $gm_obj; + } + return true; + } + } + else + { + $this->errormsg = 'Fehler beim Laden des Datensatzes'; + return false; + } + } + + /** + * Prueft die Variablen vor dem Speichern + * auf Gueltigkeit. + * @return true wenn ok, false im Fehlerfall + */ + protected function validate() + { + if(mb_strlen($this->uid)>32) + { + $this->errormsg = 'UID darf nich laenger als 32 Zeichen sein'; + return false; + } + if(mb_strlen($this->gruppe_kurzbz)>32) + { + $this->errormsg = 'Gruppe_kurzbz darf nicht laenger als 32 Zeichen sein'; + return false; + } + if(mb_strlen($this->insertvon)>32) + { + $this->errormsg = 'Insertvon darf nicht laenger als 32 Zeichen sein'; + return false; + } + + return true; + } + + /** + * Speichert GruppeManager in die Datenbank + * Wenn $new auf true gesetzt ist wird ein neuer Datensatz + * angelegt, ansonsten der Datensatz upgedated + * @return true wenn erfolgreich, false im Fehlerfall + */ + public function save() + { + //Variablen auf Gueltigkeit pruefen + if(!$this->validate()) + return false; + + $qry = 'INSERT INTO public.tbl_gruppe_manager (uid, gruppe_kurzbz, insertamum, insertvon) + VALUES('.$this->db_add_param($this->uid).','. + $this->db_add_param($this->gruppe_kurzbz).','. + $this->db_add_param($this->insertamum).','. + $this->db_add_param($this->insertvon).');'; + + if($this->db_query($qry)) + { + //Log schreiben + return true; + } + else + { + $this->errormsg = 'Fehler beim Speichern des GruppeManagers'; + return false; + } + } + + /** + * Loescht eine Gruppenmanagerzuordnung + * + * @param $uid + * @param $gruppe_kurzbz + * @return boolean + */ + public function delete($uid, $gruppe_kurzbz) + { + $qry = "DELETE FROM public.tbl_gruppe_manager WHERE uid=".$this->db_add_param($uid)." AND gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz); + + if($this->db_query($qry)) + return true; + else + { + $this->errormsg = 'Fehler beim Loeschen der Zuteilung'; + return false; + } + } +} +?> diff --git a/public/js/person/benutzergruppe.js b/public/js/person/benutzergruppe.js new file mode 100644 index 000000000..353cb6ea3 --- /dev/null +++ b/public/js/person/benutzergruppe.js @@ -0,0 +1,223 @@ +/** + * Javascript file for benutzergruppe management page + */ + +var Benutzergruppe = { + getBenutzer: function(gruppe_kurzbz) { + FHC_AjaxClient.ajaxCallGet( + 'person/gruppenmanagement/getBenutzer', + { + gruppe_kurzbz: gruppe_kurzbz + }, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + return; + } + + let benutzerTable = $("#benutzer-table tbody"); + benutzerTable.empty(); + + if (FHC_AjaxClient.hasData(data)) + { + // save loaded data + let benutzerData = FHC_AjaxClient.getData(data); + + // fill table with Benutzer of Gruppe + for (let i = 0; i < benutzerData.length; i++) + { + let benutzer = benutzerData[i]; + benutzerTable.append( + ""+ + ""+benutzer.uid+""+ + ""+benutzer.vorname+""+ + ""+benutzer.nachname+""+ + ""+(benutzer.aktiv === true ? "Ja" : "Nein")+""+ + ""+ + ""+ + ""+ + "" + ); + + // add delete event to button + $("#"+benutzer.uid+"_benutzerLoeschen").click( + function() { + Benutzergruppe.removeBenutzer(benutzer.uid, gruppe_kurzbz); + } + ) + } + } + + // add tablesorter to benutzergruppe table + Benutzergruppe._setTablesorter(); + }, + errorCallback: function(jqXHR, textStatus, errorThrown) { + FHC_DialogLib.alertError(textStatus); + } + } + ); + }, + getAllBenutzer: function() { + FHC_AjaxClient.ajaxCallGet( + 'person/gruppenmanagement/getAllBenutzer', + null, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + return; + } + + if (FHC_AjaxClient.hasData(data)) + { + benutzerArr = []; + + // save loaded data + let benutzerData = FHC_AjaxClient.getData(data); + + for (let i = 0; i < benutzerData.length; i++) + { + let ben = benutzerData[i]; + + benutzerArr.push( + { + vorname: ben.vorname, + nachname: ben.nachname, + uid: ben.uid, + label: ben.nachname + " " + ben.vorname + " (" + ben.uid + ")", + id: ben.uid + } + ); + } + + // callback for searching source mitarbeiter array correctly + let sourceCallback = function(request, response) + { + // case insensitive matcher + let matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i"); + + // match vorname nachname OR nachname vorname OR uid + response($.grep(benutzerArr, function (value) { + return matcher.test(value.nachname + ' '+value.vorname + ' ' + value.nachname) + || matcher.test(value.uid); + })); + } + + // fill autocomplete field with benutzer data + Benutzergruppe._fillAutocomplete( + 'teilnehmerSelect', + 'teilnehmer_uid', + sourceCallback + ); + } + }, + errorCallback: function(jqXHR, textStatus, errorThrown) { + FHC_DialogLib.alertError(textStatus); + } + } + ); + }, + addBenutzer: function(uid, gruppe_kurzbz) { + FHC_AjaxClient.ajaxCallPost( + 'person/gruppenmanagement/addBenutzer', + { + uid: uid, + gruppe_kurzbz: gruppe_kurzbz + }, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + return; + } + + if (FHC_AjaxClient.hasData(data)) + { + // load Benutzer after add to show change + Benutzergruppe.getBenutzer(gruppe_kurzbz); + } + }, + errorCallback: function(jqXHR, textStatus, errorThrown) { + FHC_DialogLib.alertError(textStatus); + } + } + ); + }, + removeBenutzer: function(uid, gruppe_kurzbz) { + FHC_AjaxClient.ajaxCallPost( + 'person/gruppenmanagement/removeBenutzer', + { + uid: uid, + gruppe_kurzbz: gruppe_kurzbz + }, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + return; + } + + if (FHC_AjaxClient.hasData(data)) + { + // load Benutzer after remove to show change + Benutzergruppe.getBenutzer(gruppe_kurzbz); + } + }, + errorCallback: function(jqXHR, textStatus, errorThrown) { + FHC_DialogLib.alertError(textStatus); + } + } + ); + }, + _fillAutocomplete: function(autocompleteId, idFieldId, source) { + // jQuery ui autocomplete for benutzer + $("#"+autocompleteId).autocomplete( + { + // custom matcher + source: source, + autoFocus: true, + select: function(event, ui) + { + // when autocmplete entry selected, display label text in autocomplete, fill hidden value field + $("#"+autocompleteId).val(ui.item.label); + $("#"+idFieldId).val(ui.item.id); + return false; + } + } + ); + }, + _setTablesorter: function() { + Tablesort.addTablesorter( + // sort by first and third column asc, show filters beggining with 2 Benutzer, exclude fifth column from filter + "benutzer-table", [[0,0], [2,0]], ["filter", "zebra"], 2, {headers: {4: {filter: false}}} + ) + } +}; + +/** + * When JQuery is up + */ +$(document).ready(function() { + // get the group name + let gruppe_kurzbz = $("#gruppe_kurzbz").val(); + + // load Benutzer for autocomplete selection + Benutzergruppe.getAllBenutzer(); + // load Benutzer for table + Benutzergruppe.getBenutzer(gruppe_kurzbz); + + // add click event to "add Benutzer" button + $("#teilnehmerHinzufuegen").click(function(){ + let uid = $("#teilnehmer_uid").val(); + Benutzergruppe.addBenutzer(uid, gruppe_kurzbz); + $("#teilnehmerSelect").val(''); + } + ); +}); diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 14193b32e..b29171f86 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -6203,6 +6203,72 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht } } +// Creates table public.tbl_gruppe_manager if it doesn't exist and grants privileges +if (!$result = @$db->db_query('SELECT 1 FROM public.tbl_gruppe_manager LIMIT 1')) +{ + $qry = 'CREATE TABLE public.tbl_gruppe_manager ( + gruppe_manager_id integer, + gruppe_kurzbz varchar(32) NOT NULL, + uid varchar(32) NOT NULL, + insertamum timestamp DEFAULT NOW(), + insertvon varchar(32) + ); + + COMMENT ON TABLE public.tbl_gruppe_manager IS \'Table to save assignments groups to their managers.\'; + COMMENT ON COLUMN public.tbl_gruppe_manager.gruppe_kurzbz IS \'Name of group\'; + COMMENT ON COLUMN public.tbl_gruppe_manager.uid IS \'User id of group manager\'; + + CREATE SEQUENCE public.seq_gruppe_manager_gruppe_manager_id + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + ALTER TABLE public.tbl_gruppe_manager ALTER COLUMN gruppe_manager_id SET DEFAULT nextval(\'public.seq_gruppe_manager_gruppe_manager_id\'::regclass); + + GRANT SELECT, UPDATE ON SEQUENCE public.seq_gruppe_manager_gruppe_manager_id TO vilesci; + GRANT SELECT, UPDATE ON SEQUENCE public.seq_gruppe_manager_gruppe_manager_id TO fhcomplete; + + ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT pk_gruppe_manager PRIMARY KEY (gruppe_manager_id); + + ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT fk_gruppe_manager_gruppe_kurzbz FOREIGN KEY (gruppe_kurzbz) REFERENCES public.tbl_gruppe(gruppe_kurzbz) ON UPDATE CASCADE ON DELETE CASCADE; + ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT fk_gruppe_manager_uid FOREIGN KEY (uid) REFERENCES public.tbl_benutzer(uid) ON UPDATE CASCADE ON DELETE RESTRICT; + + ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT uk_gruppe_manager_gruppe_kurzbz_uid UNIQUE (gruppe_kurzbz, uid);'; + + if (!$db->db_query($qry)) + echo 'public.tbl_gruppe_manager: '.$db->db_last_error().'
'; + else + echo '
public.tbl_gruppe_manager table created'; + + $qry = 'GRANT SELECT ON TABLE public.tbl_gruppe_manager TO web;'; + if (!$db->db_query($qry)) + echo 'public.tbl_gruppe_manager: '.$db->db_last_error().'
'; + else + echo '
Granted privileges to web on public.tbl_gruppe_manager'; + + $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_gruppe_manager TO vilesci;'; + if (!$db->db_query($qry)) + echo 'public.tbl_gruppe_manager: '.$db->db_last_error().'
'; + else + echo '
Granted privileges to vilesci on public.tbl_gruppe_manager'; +} + +// Add permission for managing user groups +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'lehre/gruppenmanager';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('lehre/gruppenmanager', 'Manager einer Gruppe werden und die Gruppe verwalten');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
'; + else + echo ' system.tbl_berechtigung: Added permission for lehre/gruppenmanager
'; + } +} + // NOTE(chris): Add "Template" to "Lehrtyp" if($result = @$db->db_query("SELECT 1 FROM lehre.tbl_lehrtyp WHERE bezeichnung = 'Template';")) { diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 3237eae2d..2aa2dc5c2 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1142,6 +1142,27 @@ $filters = array( } ', 'oe_kurzbz' => null + ), + array( + 'app' => 'core', + 'dataset_name' => 'gruppenmanagement', + 'filter_kurzbz' => 'gruppenmanagement', + 'description' => '{Meine Gruppen}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "gruppenmanagement", + "columns": [ + {"name": "gruppe_kurzbz"}, + {"name": "gruppe_bezeichnung"}, + {"name": "gruppe_beschreibung"}, + {"name": "studiengang_kurzbz"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, ) ); diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index b1f22c473..0f68a3558 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -16107,6 +16107,186 @@ array( 'insertvon' => 'system' ) ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'benutzerSchonZugewiesen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Benutzer ist bereits der Gruppe zugewiesen", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "User is already assigned to the group", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'gruppenmanagement', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Gruppenmanagement", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Group management", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'kurzbezeichnung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Kurzbezeichnung", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Short description", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'bezeichnung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Bezeichnung", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Name", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'beschreibung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Beschreibung", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Description", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'zuweisenloeschen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Zuweisen/Entfernen", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Assign/Remove", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'benutzergruppe', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Benutzergruppe", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "User group", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'benutzerHinzufuegen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Benutzer hinzufügen", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Add user", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'aktiv', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "aktiv", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "active", + 'description' => '', + 'insertvon' => 'system' + ) + ) ) ); diff --git a/vilesci/lehre/einheit_menu.php b/vilesci/lehre/einheit_menu.php index bfb44e8d9..a6e09fe23 100644 --- a/vilesci/lehre/einheit_menu.php +++ b/vilesci/lehre/einheit_menu.php @@ -24,6 +24,7 @@ require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/gruppe.class.php'); +require_once('../../include/gruppemanager.class.php'); require_once('../../include/person.class.php'); require_once('../../include/benutzer.class.php'); require_once('../../include/student.class.php'); @@ -82,17 +83,59 @@ if(!$rechte->isBerechtigt('lehre/gruppe', null, 's')) Gruppe-Verwaltung + - + %s - %s %s " + ."Manager entfernen" + ."" + .""; + ?> + @@ -158,8 +301,10 @@ else if (isset($_GET['type']) && $_GET['type']=='delete') if($rechte->isBerechtigt('lehre/gruppe', $oe_studiengang, 'suid')) { + $grp_kurzbz = $_GET['einheit_id']; + $e=new gruppe(); - if(!$e->delete($_GET['einheit_id'])) + if(!$e->delete($grp_kurzbz)) echo $e->errormsg; } else @@ -214,6 +359,7 @@ function printDropDown() echo ''; echo ''; } + function doSave() { global $rechte; @@ -241,8 +387,10 @@ function doSave() $e->new = false; } + $user = get_uid(); + $e->updateamum = date('Y-m-d H:i:s'); - $e->updatevon = get_uid(); + $e->updatevon = $user; $e->bezeichnung = $_POST['bezeichnung']; $e->beschreibung = $_POST['beschreibung']; $e->studiengang_kz = $_POST['studiengang_kz']; @@ -258,13 +406,66 @@ function doSave() $e->sort = $_POST['sort']; $e->content_visible = isset($_POST['content_visible']); + + // gruppemanager immer array, leer wenn keine angegeben + $gruppemanager_uids = isset($_POST['gruppemanager']) && is_array($_POST['gruppemanager']) ? $_POST['gruppemanager'] : array(); + + // Prüfung: generierte Gruppen haben keine Manager + if (count($gruppemanager_uids) > 0 && $e->generiert === true) + { + echo "Generierte Gruppen dürfen keine Administratoren haben!"; + return; + } + if(!$e->save()) - echo $e->errormsg; + echo "".$e->errormsg.""; + else // wenn Gruppe erfolgreich gespeichert, Gruppenmanager speichern + { + // Gruppe gemäss Konvention in Großbuchstaben + $gruppe_kurzbz = mb_strtoupper($_POST['kurzbz']); + + // bestehende Gruppenmanager laden + $bestehende_gruppemanager_uids = array(); + $gruppemanager_hlp = new gruppemanager(); + if ($gruppemanager_hlp->load_uids($gruppe_kurzbz)) + { + foreach ($gruppemanager_hlp->uids as $uid_obj) + { + $bestehende_gruppemanager_uids[] = $uid_obj->uid; + } + } + + foreach ($gruppemanager_uids as $gruppemanager_uid) + { + // wenn Gruppenmanager noch nicht zugewiesen + if (!in_array($gruppemanager_uid, $bestehende_gruppemanager_uids)) + { + // Gruppemanager speichern + $gruppemgr = new gruppemanager(); + $gruppemgr->uid = $gruppemanager_uid; + $gruppemgr->gruppe_kurzbz = $gruppe_kurzbz; + $gruppemgr->insertamum = date('Y-m-d H:i:s'); + $gruppemgr->insertvon = $user; + + if(!$gruppemgr->save()) + echo $gruppemgr->errormsg; + } + } + + // zu löschende Gruppemanager ermitteln + $geloeschte_gruppemanager_uids = array_diff($bestehende_gruppemanager_uids, $gruppemanager_uids); + + // Nicht mehr vorhandene Gruppenmanager löschen + $gruppemanager_hlp = new gruppemanager(); + foreach ($geloeschte_gruppemanager_uids as $geloeschte_uid) + { + if (!$gruppemanager_hlp->delete($geloeschte_uid, $gruppe_kurzbz)) + echo $gruppemanager_hlp->errormsg; + } + } } } - - function doEdit($kurzbz,$new=false) { global $db, $rechte, $studiengang, $searchItems; @@ -282,6 +483,9 @@ function doEdit($kurzbz,$new=false)

Gruppe
+ + + @@ -341,6 +545,44 @@ function doEdit($kurzbz,$new=false) + + + load_uids($e->gruppe_kurzbz); + + // richtige Tabellenzeige Grösse wenn Administratoren vorhanden + if ($gruppemanager_uids_result === true) + { + $gruppemanagerCellClass = ' class="gruppenmanager-cell"'; + } + ?> + id="gruppenmanager-cell"> + + + Generierte Gruppen dürfen keine Administratoren haben. + + "; + // alle Manager der Gruppe anzeigen + if ($gruppemanager_uids_result === true) + { + $count = 1; + foreach ($gruppemanager_hlp->uids as $uid_obj) + { + $ben = new benutzer($uid_obj->uid); + // Vorlagestring durch Werte ersetzen und ausgeben + echo sprintf(MANAGER_HTML, $uid_obj->uid, $ben->vorname, $ben->nachname, $uid_obj->uid); + if ($count % 5 == 0) // neue Zeile nach 5 Elementen + echo "

"; + $count++; + } + } + ?> + +
+
Kurzbezeichnung
GruppenadministratorOptional, Administratoren, die Benutzer zur Gruppe entfernen/hinzufügen können
Semester