diff --git a/sql/cambios.sql b/sql/cambios.sql index b1352ea2e..876dc2ce0 100644 --- a/sql/cambios.sql +++ b/sql/cambios.sql @@ -10496,5 +10496,9 @@ INSERT INTO expanded_folders_backup SELECT * FROM expanded_folders; CREATE TABLE clipboard_backup LIKE clipboard; INSERT INTO clipboard_backup SELECT * FROM clipboard; +----- 2015-01-29, swad14.71 - +CREATE TABLE IF NOT EXISTS admin (UsrCod INT NOT NULL,Scope ENUM('Sys','Ins','Ctr','Deg') NOT NULL,Cod INT NOT NULL,UNIQUE INDEX(UsrCod,Scope,Cod)); +INSERT INTO admin (UsrCod,Scope,Cod) SELECT UsrCod,'Deg',DegCod FROM deg_admin WHERE DegCod>'0'; +INSERT INTO admin (UsrCod,Scope,Cod) SELECT UsrCod,'Sys',DegCod FROM deg_admin WHERE DegCod='-2'; +DROP TABLE deg_admin; diff --git a/sql/swad.sql b/sql/swad.sql index 73cc052ab..af0df4740 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -46,6 +46,14 @@ CREATE TABLE IF NOT EXISTS actions_MFU ( -- -- Table ann_seen: stores users who have seen global announcements -- +CREATE TABLE IF NOT EXISTS admin ( + UsrCod INT NOT NULL, + Scope ENUM('Sys','Ins','Ctr','Deg') NOT NULL, + Cod INT NOT NULL, + UNIQUE INDEX(UsrCod,Scope,Cod)); +-- +-- Table ann_seen: stores users who have seen global announcements +-- CREATE TABLE IF NOT EXISTS ann_seen ( AnnCod INT NOT NULL, UsrCod INT NOT NULL, diff --git a/swad_ID.c b/swad_ID.c index 347f30837..3562f114f 100644 --- a/swad_ID.c +++ b/swad_ID.c @@ -837,11 +837,7 @@ void ID_ConfirmUsrID (long UsrCod,const char *UsrID) bool ID_ICanSeeTeacherID (struct UsrData *UsrDat) { if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_DEG_ADMIN) - { - if (Usr_CheckIfUsrIsAdmOfAllDegs (Gbl.Usrs.Me.UsrDat.UsrCod)) // If I am admin of all degrees - return true; - // If I am an administrator of current degree, but not of all degrees, I only can see the users' IDs from current degree + // If I am an administrator of current degree, I only can see the users' IDs from current degree return Usr_CheckIfUsrBelongsToDeg (UsrDat->UsrCod,Gbl.CurrentDeg.Deg.DegCod); - } return (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER); } diff --git a/swad_account.c b/swad_account.c index f1906de24..12d378e0c 100644 --- a/swad_account.c +++ b/swad_account.c @@ -677,7 +677,7 @@ void Acc_CompletelyEliminateAccount (struct UsrData *UsrDat, } /***** Remove user as administrator of any degree *****/ - sprintf (Query,"DELETE FROM deg_admin" + sprintf (Query,"DELETE FROM admin" " WHERE UsrCod='%ld'", UsrDat->UsrCod); DB_QueryDELETE (Query,"can not remove a user as administrator"); diff --git a/swad_changelog.h b/swad_changelog.h index 62808252f..1f51b4c10 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -39,11 +39,18 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 14.70.6 (2015/01/28)" +#define Log_PLATFORM_VERSION "SWAD 14.71 (2015/01/29)" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h | tail -1 /* + Version 14.71: Jan 29, 2015 New table admin to store system, institution, centre or degree admins. (176255 lines) + 4 changes necessary in database: +CREATE TABLE IF NOT EXISTS admin (UsrCod INT NOT NULL,Scope ENUM('Sys','Ins','Ctr','Deg') NOT NULL,Cod INT NOT NULL,UNIQUE INDEX(UsrCod,Scope,Cod)); +INSERT INTO admin (UsrCod,Scope,Cod) SELECT UsrCod,'Deg',DegCod FROM deg_admin WHERE DegCod>'0'; +INSERT INTO admin (UsrCod,Scope,Cod) SELECT UsrCod,'Sys',DegCod FROM deg_admin WHERE DegCod='-2'; +DROP TABLE IF EXISTS deg_admin; + Version 14.70.6: Jan 28, 2015 Buttons to view list of institutions, centres, degrees and courses in information options. (176242 lines) Version 14.70.5: Jan 28, 2015 Links in list of countries, institutions, centres and degrees now go to information options. (176219 lines) Version 14.70.4: Jan 28, 2015 Links in breadcrumbs now go to information options. (176218 lines) diff --git a/swad_connected.c b/swad_connected.c index 08e4bb908..74cd43c09 100644 --- a/swad_connected.c +++ b/swad_connected.c @@ -520,11 +520,19 @@ static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnMainZone ( switch (Gbl.Scope.Current) { case Sco_SCOPE_PLATFORM: // Show connected users in the whole platform - case Sco_SCOPE_INSTITUTION: // Show connected users in the current centre - case Sco_SCOPE_CENTRE: // Show connected users in the current centre if (Gbl.Usrs.Me.LoggedRole != Rol_ROLE_SUPERUSER) return; break; + case Sco_SCOPE_INSTITUTION: // Show connected users in the current institution + if (!(Gbl.Usrs.Me.LoggedRole == Rol_ROLE_INS_ADMIN || + Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)) + return; + break; + case Sco_SCOPE_CENTRE: // Show connected users in the current centre + if (!(Gbl.Usrs.Me.LoggedRole == Rol_ROLE_CTR_ADMIN || + Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)) + return; + break; case Sco_SCOPE_DEGREE: // Show connected users in the current degree if (!(Gbl.Usrs.Me.LoggedRole == Rol_ROLE_DEG_ADMIN || Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)) @@ -589,11 +597,19 @@ static void Con_ShowConnectedUsrsWithARoleBelongingToCurrentLocationOnRightColum switch (Gbl.Scope.Current) { case Sco_SCOPE_PLATFORM: // Show connected users in the whole platform - case Sco_SCOPE_INSTITUTION: // Show connected users in the current institution - case Sco_SCOPE_CENTRE: // Show connected users in the current centre if (Gbl.Usrs.Me.LoggedRole != Rol_ROLE_SUPERUSER) return; break; + case Sco_SCOPE_INSTITUTION: // Show connected users in the current institution + if (!(Gbl.Usrs.Me.LoggedRole == Rol_ROLE_INS_ADMIN || + Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)) + return; + break; + case Sco_SCOPE_CENTRE: // Show connected users in the current centre + if (!(Gbl.Usrs.Me.LoggedRole == Rol_ROLE_CTR_ADMIN || + Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)) + return; + break; case Sco_SCOPE_DEGREE: // Show connected users in the current degree if (!(Gbl.Usrs.Me.LoggedRole == Rol_ROLE_DEG_ADMIN || Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)) diff --git a/swad_database.c b/swad_database.c index eb504a378..ebaac6c3e 100644 --- a/swad_database.c +++ b/swad_database.c @@ -169,6 +169,24 @@ mysql> DESCRIBE actions_MFU; "LastClick DATETIME NOT NULL," "UNIQUE INDEX(UsrCod,ActCod))"); +/***** Table admin *****/ +/* +mysql> DESCRIBE admin; ++--------+-------------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++--------+-------------------------------+------+-----+---------+-------+ +| UsrCod | int(11) | NO | PRI | NULL | | +| Scope | enum('Sys','Ins','Ctr','Deg') | NO | PRI | NULL | | +| Cod | int(11) | NO | PRI | NULL | | ++--------+-------------------------------+------+-----+---------+-------+ +3 rows in set (0.00 sec) +*/ + DB_CreateTable ("CREATE TABLE IF NOT EXISTS admin (" + "UsrCod INT NOT NULL," + "Scope ENUM('Sys','Ins','Ctr','Deg') NOT NULL," + "Cod INT NOT NULL," + "UNIQUE INDEX(UsrCod,Scope,Cod))"); + /***** Table ann_seen *****/ /* mysql> DESCRIBE ann_seen; @@ -185,7 +203,6 @@ mysql> DESCRIBE ann_seen; "UsrCod INT NOT NULL," "UNIQUE INDEX(AnnCod,UsrCod))"); - /***** Table announcements *****/ /* mysql> DESCRIBE announcements; @@ -806,22 +823,6 @@ mysql> DESCRIBE crs_usr_requests; "RequestTime DATETIME NOT NULL," "UNIQUE INDEX(ReqCod),UNIQUE INDEX(CrsCod,UsrCod),INDEX(UsrCod))"); - /***** Table deg_admin *****/ -/* -mysql> DESCRIBE deg_admin; -+--------+---------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+--------+---------+------+-----+---------+-------+ -| UsrCod | int(11) | NO | PRI | NULL | | -| DegCod | int(11) | NO | PRI | NULL | | -+--------+---------+------+-----+---------+-------+ -2 rows in set (0.00 sec) -*/ - DB_CreateTable ("CREATE TABLE IF NOT EXISTS deg_admin (" - "UsrCod INT NOT NULL," - "DegCod INT NOT NULL," - "UNIQUE INDEX(UsrCod,DegCod))"); - /***** Table deg_types *****/ /* mysql> DESCRIBE deg_types; diff --git a/swad_degree.c b/swad_degree.c index d21680090..1c056e87c 100644 --- a/swad_degree.c +++ b/swad_degree.c @@ -164,12 +164,13 @@ void Deg_SeeDegWithPendingCrss (void) { case Rol_ROLE_DEG_ADMIN: sprintf (Query,"SELECT courses.DegCod,COUNT(*)" - " FROM courses,deg_admin,degrees" - " WHERE (courses.Status & %u)<>0" - " AND courses.DegCod=deg_admin.DegCod AND deg_admin.UsrCod='%ld'" + " FROM admin,courses,degrees" + " WHERE admin.UsrCod='%ld' AND admin.Scope='Deg'" + " AND admin.Cod=courses.DegCod" + " AND (courses.Status & %u)<>0" " AND courses.DegCod=degrees.DegCod" " GROUP BY courses.DegCod ORDER BY degrees.ShortName", - (unsigned) Crs_STATUS_BIT_PENDING,Gbl.Usrs.Me.UsrDat.UsrCod); + Gbl.Usrs.Me.UsrDat.UsrCod,(unsigned) Crs_STATUS_BIT_PENDING); break; case Rol_ROLE_SUPERUSER: sprintf (Query,"SELECT courses.DegCod,COUNT(*)" @@ -303,7 +304,7 @@ static void Deg_Configuration (bool PrintView) /* Link to show courses */ Act_FormStart (ActSeeCrs); Act_LinkFormSubmit (Txt_Courses,The_ClassFormul[Gbl.Prefs.Theme]); - Lay_PutSendIcon ("deg",Txt_Courses,Txt_Courses); + Lay_PutSendIcon ("crs",Txt_Courses,Txt_Courses); fprintf (Gbl.F.Out,""); if (!PrintView) @@ -2507,8 +2508,9 @@ void Deg_GetListDegsAdminByMe (void) else // Gbl.Usrs.Me.LoggedRole == Rol_ROLE_DEG_ADMIN sprintf (Query,"SELECT degrees.DegCod,degrees.CtrCod,degrees.DegTypCod,degrees.Status,degrees.RequesterUsrCod," "degrees.ShortName,degrees.FullName,degrees.FirstYear,degrees.LastYear,degrees.OptYear,degrees.WWW" - " FROM deg_admin,degrees" - " WHERE deg_admin.UsrCod='%ld' AND deg_admin.DegCod<>'-1' AND deg_admin.DegCod=degrees.DegCod" + " FROM admin,degrees" + " WHERE admin.UsrCod='%ld' AND admin.Scope='Deg'" + " AND admin.Cod=degrees.DegCod" " ORDER BY degrees.ShortName", Gbl.Usrs.Me.UsrDat.UsrCod); Gbl.Usrs.Me.MyAdminDegs.Num = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get degrees admin by you"); @@ -3206,7 +3208,7 @@ static void Deg_RemoveDegreeCompletely (long DegCod) Brw_RemoveTree (PathDeg); /***** Remove administrators of this degree *****/ - sprintf (Query,"DELETE FROM deg_admin WHERE DegCod='%ld'", + sprintf (Query,"DELETE FROM admin WHERE Scope='Deg' AND Cod='%ld'", DegCod); DB_QueryDELETE (Query,"can not remove administrators of a degree"); @@ -3904,14 +3906,14 @@ void Deg_GetAndWriteDegreesAdminBy (long UsrCod,unsigned ColSpan) long DegCod; /***** Get degrees admin by a user from database *****/ - sprintf (Query,"(SELECT DegCod,'' AS ShortName,''" - " FROM deg_admin" - " WHERE UsrCod='%ld' AND DegCod<'0')" + sprintf (Query,"(SELECT -1 AS DegCod,'' AS ShortName,''" + " FROM admin" + " WHERE UsrCod='%ld' AND Scope='Sys')" " UNION " "(SELECT degrees.DegCod,degrees.ShortName AS ShortName,degrees.FullName" - " FROM deg_admin,degrees" - " WHERE deg_admin.UsrCod='%ld' AND deg_admin.DegCod>='0'" - " AND deg_admin.DegCod=degrees.DegCod)" + " FROM admin,degrees" + " WHERE admin.UsrCod='%ld' AND admin.Scope='Deg'" + " AND admin.Cod=degrees.DegCod)" " ORDER BY ShortName", UsrCod,UsrCod); if ((NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get degrees admin by a user"))) // If degrees found for this administrator diff --git a/swad_enrollment.c b/swad_enrollment.c index 1fd34669c..e27bbf30f 100644 --- a/swad_enrollment.c +++ b/swad_enrollment.c @@ -2075,9 +2075,9 @@ void Enr_ShowEnrollmentRequests (void) break; case Rol_ROLE_DEG_ADMIN: sprintf (Query,"SELECT crs_usr_requests.ReqCod,crs_usr_requests.CrsCod,crs_usr_requests.UsrCod,crs_usr_requests.Role,DATE_FORMAT(crs_usr_requests.RequestTime,'%%Y%%m%%d%%H%%i%%S')" - " FROM deg_admin,courses,crs_usr_requests" - " WHERE deg_admin.UsrCod='%ld'" - " AND deg_admin.DegCod=courses.DegCod" + " FROM admin,courses,crs_usr_requests" + " WHERE admin.UsrCod='%ld' AND admin.Scope='Deg'" + " AND admin.Cod=courses.DegCod" " AND courses.CrsCod=crs_usr_requests.CrsCod" " AND ((1<0" " ORDER BY crs_usr_requests.RequestTime DESC", @@ -2115,11 +2115,11 @@ void Enr_ShowEnrollmentRequests (void) break; case Rol_ROLE_DEG_ADMIN: sprintf (Query,"SELECT crs_usr_requests.ReqCod,crs_usr_requests.CrsCod,crs_usr_requests.UsrCod,crs_usr_requests.Role,DATE_FORMAT(crs_usr_requests.RequestTime,'%%Y%%m%%d%%H%%i%%S')" - " FROM deg_admin,centres,degrees,courses,crs_usr_requests" - " WHERE deg_admin.UsrCod='%ld'" + " FROM admin,centres,degrees,courses,crs_usr_requests" + " WHERE admin.UsrCod='%ld' AND admin.Scope='Deg'" " AND centres.InsCod='%ld'" - " AND deg_admin.DegCod=degrees.DegCod" - " AND deg_admin.DegCod=courses.DegCod" + " AND admin.Cod=degrees.DegCod" + " AND admin.Cod=courses.DegCod" " AND degrees.CtrCod=centres.CtrCod" " AND courses.CrsCod=crs_usr_requests.CrsCod" " AND ((1<0" @@ -2164,11 +2164,11 @@ void Enr_ShowEnrollmentRequests (void) break; case Rol_ROLE_DEG_ADMIN: sprintf (Query,"SELECT crs_usr_requests.ReqCod,crs_usr_requests.CrsCod,crs_usr_requests.UsrCod,crs_usr_requests.Role,DATE_FORMAT(crs_usr_requests.RequestTime,'%%Y%%m%%d%%H%%i%%S')" - " FROM deg_admin,degrees,courses,crs_usr_requests" - " WHERE deg_admin.UsrCod='%ld'" + " FROM admin,degrees,courses,crs_usr_requests" + " WHERE admin.UsrCod='%ld' AND admin.Scope='Deg'" " AND degrees.CtrCod='%ld'" - " AND deg_admin.DegCod=degrees.DegCod" - " AND deg_admin.DegCod=courses.DegCod" + " AND admin.Cod=degrees.DegCod" + " AND admin.Cod=courses.DegCod" " AND courses.CrsCod=crs_usr_requests.CrsCod" " AND ((1<0" " ORDER BY crs_usr_requests.RequestTime DESC", @@ -3294,8 +3294,8 @@ static void Enr_EffectivelyRemAdmFromDeg (struct UsrData *UsrDat) if (Usr_CheckIfUsrIsAdmOfDeg (UsrDat->UsrCod,Gbl.CurrentDeg.Deg.DegCod)) // User is administrator of current degree { /***** Remove user from the table of courses-users *****/ - sprintf (Query,"DELETE FROM deg_admin" - " WHERE UsrCod='%ld' AND DegCod='%ld'", + sprintf (Query,"DELETE FROM admin" + " WHERE UsrCod='%ld' AND Scope='Deg' AND Cod='%ld'", UsrDat->UsrCod,Gbl.CurrentDeg.Deg.DegCod); DB_QueryDELETE (Query,"can not remove an administrator from a degree"); diff --git a/swad_notification.c b/swad_notification.c index 3987f33f6..0e47bc8f3 100644 --- a/swad_notification.c +++ b/swad_notification.c @@ -1061,8 +1061,14 @@ unsigned Ntf_StoreNotifyEventsToAllUsrs (Ntf_NotifyEvent_t NotifyEvent,long Cod) // and I want to be a teacher (checked before calling this function // to not send requests to be a student to admins) // ==> send notification to administrators or superusers - sprintf (Query,"SELECT UsrCod FROM deg_admin" - " WHERE (DegCod='%ld' OR DegCod<=0) AND UsrCod<>'%ld'", + sprintf (Query,"SELECT UsrCod FROM admin" + " WHERE (Scope='Sys'" + " OR (Scope='Ins' AND Cod='%ld')" + " OR (Scope='Ctr' AND Cod='%ld')" + " OR (Scope='Deg' AND Cod='%ld'))" + " AND UsrCod<>'%ld'", + Gbl.CurrentIns.Ins.InsCod, + Gbl.CurrentCtr.Ctr.CtrCod, Gbl.CurrentDeg.Deg.DegCod, Gbl.Usrs.Me.UsrDat.UsrCod); break; diff --git a/swad_password.c b/swad_password.c index 33d7f66f4..b6d0df960 100644 --- a/swad_password.c +++ b/swad_password.c @@ -811,9 +811,7 @@ bool Pwd_CheckIfICanChangeOtherUsrPassword (long UsrCod) switch (Gbl.Usrs.Me.LoggedRole) { case Rol_ROLE_DEG_ADMIN: - if (Usr_CheckIfUsrIsAdmOfAllDegs (Gbl.Usrs.Me.UsrDat.UsrCod)) // If I am admin of all degrees - return true; - /* If I am an administrator of current degree, but not of all degrees, + /* If I am an administrator of current degree, I only can change the password of users from current degree */ return Usr_CheckIfUsrBelongsToDeg (UsrCod,Gbl.CurrentDeg.Deg.DegCod); case Rol_ROLE_SUPERUSER: diff --git a/swad_photo.c b/swad_photo.c index 0b7ed243f..c40b33d9f 100644 --- a/swad_photo.c +++ b/swad_photo.c @@ -125,9 +125,7 @@ bool Pho_CheckIfICanChangeOtherUsrPhoto (long UsrCod) case Rol_ROLE_TEACHER: return Usr_CheckIfUsrBelongsToCrs (UsrCod,Gbl.CurrentCrs.Crs.CrsCod); case Rol_ROLE_DEG_ADMIN: - if (Usr_CheckIfUsrIsAdmOfAllDegs (Gbl.Usrs.Me.UsrDat.UsrCod)) // If I am admin of all degrees - return true; - /* If I am an administrator of current degree, but not of all degrees, + /* If I am an administrator of current degree, I only can change the photo of users from current degree */ return Usr_CheckIfUsrBelongsToDeg (UsrCod,Gbl.CurrentDeg.Deg.DegCod); case Rol_ROLE_SUPERUSER: diff --git a/swad_user.c b/swad_user.c index 072c10cc6..c3ee8acd3 100644 --- a/swad_user.c +++ b/swad_user.c @@ -80,10 +80,6 @@ const char *Usr_IconsClassPhotoOrList[Usr_NUM_USR_LIST_TYPES] = "list" }; -/* Special codes for global administrator and superuser deg_admin table */ -#define Usr_SPECIAL_CODE_GLOBAL_ADMIN -1L -#define Usr_SPECIAL_CODE_SUPERUSER -2L - #define Usr_NUM_MAIN_FIELDS_DATA_USR 9 #define Usr_NUM_MAIN_FIELDS_DATA_ADM 8 #define Usr_NUM_ALL_FIELDS_DATA_INV 17 @@ -695,7 +691,7 @@ void Usr_RestrictLengthAndWriteName (struct UsrData *UsrDat,unsigned MaxChars) } /*****************************************************************************/ -/********** Check if a user is an administrator of current degree ************/ +/************* Check if a user is an administrator of a degree ***************/ /*****************************************************************************/ bool Usr_CheckIfUsrIsAdmOfDeg (long UsrCod,long DegCod) @@ -703,27 +699,12 @@ bool Usr_CheckIfUsrIsAdmOfDeg (long UsrCod,long DegCod) char Query[512]; /***** Get if a user is administrator of a degree from database *****/ - sprintf (Query,"SELECT COUNT(*) FROM deg_admin" - " WHERE UsrCod='%ld' AND DegCod='%ld'", + sprintf (Query,"SELECT COUNT(*) FROM admin" + " WHERE UsrCod='%ld' AND Scope='Deg' AND Cod='%ld'", UsrCod,DegCod); return (DB_QueryCOUNT (Query,"can not check if a user is administrator of a degree") != 0); } -/*****************************************************************************/ -/********** Check if a user is an administrator of current degree ************/ -/*****************************************************************************/ - -bool Usr_CheckIfUsrIsAdmOfAllDegs (long UsrCod) - { - char Query[512]; - - /***** Get if a user is administrator of all degrees from database *****/ - sprintf (Query,"SELECT COUNT(*) FROM deg_admin" - " WHERE UsrCod='%ld' AND DegCod='%ld'", - UsrCod,Usr_SPECIAL_CODE_GLOBAL_ADMIN); - return (DB_QueryCOUNT (Query,"can not check if a user is administrator of all degrees") != 0); - } - /*****************************************************************************/ /********************* Check if a user is a superuser ************************/ /*****************************************************************************/ @@ -733,9 +714,9 @@ bool Usr_CheckIfUsrIsSuperuser (long UsrCod) char Query[512]; /***** Get if a user is superuser from database *****/ - sprintf (Query,"SELECT COUNT(*) FROM deg_admin" - " WHERE UsrCod='%ld' AND DegCod='%ld'", - UsrCod,Usr_SPECIAL_CODE_SUPERUSER); + sprintf (Query,"SELECT COUNT(*) FROM admin" + " WHERE UsrCod='%ld' AND Scope='Sys'", + UsrCod); return (DB_QueryCOUNT (Query,"can not check if a user is superuser") != 0); } @@ -2241,8 +2222,6 @@ static void Usr_SetUsrRoleAndPrefs (void) if (Gbl.CurrentDeg.Deg.DegCod > 0) /* Check if I am and administrator of current degree */ ICanBeAdmin = Usr_CheckIfUsrIsAdmOfDeg (Gbl.Usrs.Me.UsrDat.UsrCod,Gbl.CurrentDeg.Deg.DegCod); - if (!ICanBeAdmin) - ICanBeAdmin = Usr_CheckIfUsrIsAdmOfAllDegs (Gbl.Usrs.Me.UsrDat.UsrCod); /***** Check if I belong to current course *****/ if (Gbl.CurrentCrs.Crs.CrsCod > 0) @@ -3964,41 +3943,48 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope) switch (Scope) { case Sco_SCOPE_PLATFORM: - strcpy (Query,"SELECT DISTINCT deg_admin.UsrCod,'Y',usr_data.Sex" - " FROM deg_admin,usr_data" - " WHERE deg_admin.UsrCod=usr_data.UsrCod " + strcpy (Query,"SELECT DISTINCT admin.UsrCod,'Y',usr_data.Sex" + " FROM admin,usr_data" + " WHERE (admin.Scope='Deg'" + " OR admin.Scope='Sys')" + " AND admin.UsrCod=usr_data.UsrCod " " ORDER BY usr_data.Surname1,usr_data.Surname2," "usr_data.FirstName,usr_data.UsrCod"); break; case Sco_SCOPE_INSTITUTION: - sprintf (Query,"SELECT DISTINCT deg_admin.UsrCod,'Y',usr_data.Sex" - " FROM centres,degrees,deg_admin,usr_data" - " WHERE ((centres.InsCod='%ld' AND centres.CtrCod=degrees.CtrCod AND degrees.DegCod=deg_admin.DegCod) OR deg_admin.DegCod='%ld')" - " AND deg_admin.UsrCod=usr_data.UsrCod " + sprintf (Query,"SELECT DISTINCT admin.UsrCod,'Y',usr_data.Sex" + " FROM centres,degrees,admin,usr_data" + " WHERE ((centres.InsCod='%ld'" + " AND centres.CtrCod=degrees.CtrCod" + " AND degrees.DegCod=admin.Cod" + " AND admin.Scope='Deg')" + " OR admin.Scope='Sys')" + " AND admin.UsrCod=usr_data.UsrCod " " ORDER BY usr_data.Surname1,usr_data.Surname2," "usr_data.FirstName,usr_data.UsrCod", - Gbl.CurrentIns.Ins.InsCod, - Usr_SPECIAL_CODE_GLOBAL_ADMIN); + Gbl.CurrentIns.Ins.InsCod); break; case Sco_SCOPE_CENTRE: - sprintf (Query,"SELECT DISTINCT deg_admin.UsrCod,'Y',usr_data.Sex" - " FROM degrees,deg_admin,usr_data" - " WHERE ((degrees.CtrCod='%ld' AND degrees.DegCod=deg_admin.DegCod) OR deg_admin.DegCod='%ld')" - " AND deg_admin.UsrCod=usr_data.UsrCod " + sprintf (Query,"SELECT DISTINCT admin.UsrCod,'Y',usr_data.Sex" + " FROM degrees,admin,usr_data" + " WHERE ((degrees.CtrCod='%ld'" + " AND degrees.DegCod=admin.Cod" + " AND admin.Scope='Deg')" + " OR admin.Scope='Sys')" + " AND admin.UsrCod=usr_data.UsrCod " " ORDER BY usr_data.Surname1,usr_data.Surname2," "usr_data.FirstName,usr_data.UsrCod", - Gbl.CurrentCtr.Ctr.CtrCod, - Usr_SPECIAL_CODE_GLOBAL_ADMIN); + Gbl.CurrentCtr.Ctr.CtrCod); break; case Sco_SCOPE_DEGREE: - sprintf (Query,"SELECT DISTINCT deg_admin.UsrCod,'Y',usr_data.Sex" - " FROM deg_admin,usr_data" - " WHERE (deg_admin.DegCod='%ld' OR deg_admin.DegCod='%ld')" - " AND deg_admin.UsrCod=usr_data.UsrCod " + sprintf (Query,"SELECT DISTINCT admin.UsrCod,'Y',usr_data.Sex" + " FROM admin,usr_data" + " WHERE ((admin.Scope='Deg' AND admin.Cod='%ld')" + " OR admin.Scope='Sys')" + " AND admin.UsrCod=usr_data.UsrCod " " ORDER BY usr_data.Surname1,usr_data.Surname2," "usr_data.FirstName,usr_data.UsrCod", - Gbl.CurrentDeg.Deg.DegCod, - Usr_SPECIAL_CODE_GLOBAL_ADMIN); + Gbl.CurrentDeg.Deg.DegCod); break; default: // not aplicable return; diff --git a/swad_user.h b/swad_user.h index d60dc683f..fc1136316 100644 --- a/swad_user.h +++ b/swad_user.h @@ -207,7 +207,6 @@ void Usr_BuildFullName (struct UsrData *UsrDat); void Usr_RestrictLengthAndWriteName (struct UsrData *UsrDat,unsigned MaxChars); bool Usr_CheckIfUsrIsAdmOfDeg (long UsrCod,long DegCod); -bool Usr_CheckIfUsrIsAdmOfAllDegs (long UsrCod); bool Usr_CheckIfUsrIsSuperuser (long UsrCod); bool Usr_CheckIfUsrSharesAnyOfMyCrs (long UsrCod); void Usr_GetMyInstitutions (void);