Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Plugins, funzionalità sviluppate dagli utenti, patch, fix...
barlasd
Newbie
Posts: 10
Joined: Wed Jan 24, 2018 8:53 am

Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by barlasd »

Dopo aver creato un profilo amministratore e averlo assegnato ad un Utente amministratore mi sono accorto che nonostante l'assegnazione di Gruppi di utenti specifici, l'admin ha comunque accesso a tutti i gruppi disponibili dalla Gestione gruppi.
E' molto grave perché, se gli vengono abilitati i permessi, l'admin in questione può rimuovere o modificare gruppi e aggiungere utenti a gruppi non a lui assegnati.

La stessa situazione si propone anche durante la sottoscrizione di un Gruppo di utenti ad un corso . In questo caso nonostante appaiano tutti i gruppi disponibili (anche quelli non assegnati all'amministratore) la sottoscrizione del gruppo scelto (all'infuori di quelli assegnati) non va a buon fine e appare un messaggio di errore che riporta "Selezione vuota".

Studiando un po' il codice (per capire quale funzione si occupasse di mostrare i gruppi) sono riuscito a trovare una soluzione per evitare che amministratori "non autorizzati" possano visualizzare e agire su gruppi non a loro assegnati.

Il file da modificare è il seguente appCore/models/GroupmanagementAdm.php

E' necessario sostituire le righe che vanno dalla 63 alla 65 con la seguente porzione di codice:

Code: Select all

$idstLogged = Docebo::user()->getIdSt();
		$user_level = Docebo::user()->getUserLevelId();
		
		if ($user_level == ADMIN_GROUP_ADMIN){
			$query = "SELECT g.idst, g.groupid, g.description, COUNT(*) as usercount "
				." FROM %adm_group as g LEFT JOIN (%adm_group_members AS gm ) ON (gm.idst = g.idst) "
				." LEFT JOIN %adm_admin_tree AS tree ON (g.idst=tree.idst) "
				." WHERE tree.idstAdmin='".$idstLogged."' AND g.hidden = 'false' ".($learning_filter === 'none' ? "AND g.type <> 'course' " : '');
		}
		else{
			$query = "SELECT g.idst, g.groupid, g.description, COUNT(*) as usercount "
				." FROM %adm_group as g LEFT JOIN (%adm_group_members AS gm ) ON (gm.idst = g.idst) "
				." WHERE g.hidden = 'false' ".($learning_filter === 'none' ? "AND g.type <> 'course' " : '');
		}
alfa24
Senior Boarder
Posts: 1982
Joined: Fri Nov 24, 2017 8:45 am

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by alfa24 »

$user_level e $idstLogged le devi definire però... In teoria sarebbe più pulito utilizzare lib.preference.php:

Code: Select all

$query = "SELECT g.idst, g.groupid, g.description, COUNT(*) as usercount "
			." FROM %adm_group as g LEFT JOIN (%adm_group_members AS gm ) ON (gm.idst = g.idst) "
			." WHERE g.hidden = 'false' ".($learning_filter === 'none' ? "AND g.type <> 'course' " : '');
			
$ulevel = Docebo::user()->getUserLevelId();
if ($ulevel != ADMIN_GROUP_GODADMIN) {
				require_once(_base_.'/lib/lib.preference.php');
				$adminManager = new AdminPreference();
				$admin_tree = $adminManager->getAdminTree(Docebo::user()->getIdST());
				$query .= " AND g.idst IN (".implode(",", $admin_tree).") ";
			}
Dimmi se funziona;)
Per supporto GRATUITO contattatemi in privato qui
barlasd
Newbie
Posts: 10
Joined: Wed Jan 24, 2018 8:53 am

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by barlasd »

alfa24 wrote:$user_level e $idstLogged le devi definire però... In teoria sarebbe più pulito utilizzare lib.preference.php:

Code: Select all

$query = "SELECT g.idst, g.groupid, g.description, COUNT(*) as usercount "
			." FROM %adm_group as g LEFT JOIN (%adm_group_members AS gm ) ON (gm.idst = g.idst) "
			." WHERE g.hidden = 'false' ".($learning_filter === 'none' ? "AND g.type <> 'course' " : '');
			
$ulevel = Docebo::user()->getUserLevelId();
if ($ulevel != ADMIN_GROUP_GODADMIN) {
				require_once(_base_.'/lib/lib.preference.php');
				$adminManager = new AdminPreference();
				$admin_tree = $adminManager->getAdminTree(Docebo::user()->getIdST());
				$query .= " AND g.idst IN (".implode(",", $admin_tree).") ";
			}
Dimmi se funziona;)
Non sapevo ci fosse già una funzione dedicata al recupero dei gruppi associati agli admin, ma ci sto giocando solo da qualche giorno e non ho avuto tempo di approfondire proprio tutto :)
E' sicuramente più pulito da vedere il tuo codice, però teoricamente dovrebbe essere meno performante in quanto in quel modo sei costretto ad eseguire due query quando con una LEFT JOIN puoi fare tutto in un'unica query.
alfa24
Senior Boarder
Posts: 1982
Joined: Fri Nov 24, 2017 8:45 am

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by alfa24 »

in generale una left non è più performante, ma se tenti una explain delle due query, ti renderai conto che in questo caso (come in molti altri su forma) una left è criticamente più lenta
Per supporto GRATUITO contattatemi in privato qui
AF24
FormaLms User
Posts: 103
Joined: Thu Oct 26, 2017 11:34 am
Version: forma.lms 2.4

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by AF24 »

alfa24 wrote: Thu Feb 01, 2018 4:32 pm $user_level e $idstLogged le devi definire però... In teoria sarebbe più pulito utilizzare lib.preference.php:

Code: Select all

$query = "SELECT g.idst, g.groupid, g.description, COUNT(*) as usercount "
			." FROM %adm_group as g LEFT JOIN (%adm_group_members AS gm ) ON (gm.idst = g.idst) "
			." WHERE g.hidden = 'false' ".($learning_filter === 'none' ? "AND g.type <> 'course' " : '');
			
$ulevel = Docebo::user()->getUserLevelId();
if ($ulevel != ADMIN_GROUP_GODADMIN) {
				require_once(_base_.'/lib/lib.preference.php');
				$adminManager = new AdminPreference();
				$admin_tree = $adminManager->getAdminTree(Docebo::user()->getIdST());
				$query .= " AND g.idst IN (".implode(",", $admin_tree).") ";
			}
Dimmi se funziona;)
quindi sarebbe piu corretto utilizzare questo codice su su lib.preference.php?
basterebbe solo copiare ed incollare o bisogna sostituire le righe? se si potete specificare quali?
alfa24
Senior Boarder
Posts: 1982
Joined: Fri Nov 24, 2017 8:45 am

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by alfa24 »

No. Devi usare il mio codice al posto di quello di barlasd, righe 63-65 di appCore/models/GroupmanagementAdm.php
Per supporto GRATUITO contattatemi in privato qui
AF24
FormaLms User
Posts: 103
Joined: Thu Oct 26, 2017 11:34 am
Version: forma.lms 2.4

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by AF24 »

nella versione 2.0 questo problema viene risolto. Rimane invece il problema sulla statistica del corso, un amministratore quale anche tutor o docente vede tutti i corsisti, sarebbe piu corretto, per questioni di privacy, che il tutor/docente assegnato ad un nodo gestisse solo quegli studenti.
alfa24
Senior Boarder
Posts: 1982
Joined: Fri Nov 24, 2017 8:45 am

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by alfa24 »

un tutor/docente non è necessariamente un admin della piattaforma, per cui non puoi assegnargli un nodo da amministrare
gli stai dando il corso, con tutti i suoi utenti
probabilmente la tua necessità si risolve con le edizioni
Per supporto GRATUITO contattatemi in privato qui
AF24
FormaLms User
Posts: 103
Joined: Thu Oct 26, 2017 11:34 am
Version: forma.lms 2.4

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by AF24 »

Grazie per la risposta però aprire tutti i mesi le edizioni dei corsi, per vari clienti/docenti ecc... risulta essere molto macchinoso.... Penso sia piu appropriato, rispettando anche il GDPR, assegnare ad ogni docente il suo corsista....
alfa24 wrote: Fri Jun 29, 2018 6:53 pm un tutor/docente non è necessariamente un admin della piattaforma, per cui non puoi assegnargli un nodo da amministrare
gli stai dando il corso, con tutti i suoi utenti
probabilmente la tua necessità si risolve con le edizioni
User avatar
alberto
FormaLms Guru
Posts: 1134
Joined: Fri Mar 02, 2012 9:18 am
Contact:

Re: Mostrare agli Amministratori solo i gruppi che gli sono stati assegnati

Post by alberto »

A rigor di logica un corso dovrebbe avere un docente, o al limite più docenti per temi diversi trattati nel corso: questi utenti sono docenti per tutti gli studenti del corso, ed è corretto che li vedano tutti. Questo è il caso più comune, e il docente può essere un normale "user".

In organizzazioni più articolate potresti avere dei tutor o dei supervisori che si occupano solo di un certo stabilimento o dipartimento, e quindi devono vedere solo gli studenti di loro competenza: a questi utenti darai livello e permessi da "admin", in modo che possano vedere solo i propri utenti anche all'interno dei corsi.

NB: con forma 2, su alcune voci di menu (es. le statistiche) è stato introdotto un nuovo permesso "view_all" che consente agli admin di vedere tutti gli utenti. Togliendo questo permesso vedranno solo i propri utenti
Post Reply