Version 20.92: Jun 09, 2021 New modules swad_admin and swad_admin_database for administrators.

This commit is contained in:
acanas 2021-06-11 11:36:34 +02:00
parent 486382daaa
commit 59a34f37fe
15 changed files with 749 additions and 482 deletions

View File

@ -26,10 +26,11 @@
# #
###############################################################################
OBJS = swad_account.o swad_account_database.o swad_action.o swad_agenda.o \
swad_agenda_database.o swad_alert.o swad_announcement.o \
swad_announcement_database.o swad_API.o swad_assignment.o \
swad_assignment_database.o swad_attendance.o swad_attendance_database.o \
OBJS = swad_account.o swad_account_database.o swad_action.o swad_admin.o \
swad_admin_database.o swad_agenda.o swad_agenda_database.o swad_alert.o \
swad_announcement.o swad_announcement_database.o swad_API.o \
swad_assignment.o swad_assignment_database.o swad_attendance.o \
swad_attendance_database.o \
swad_banner.o swad_banner_database.o swad_box.o swad_building.o \
swad_building_database.o swad_button.o \
swad_calendar.o swad_call_for_exam.o swad_call_for_exam_database.o \

View File

@ -29,6 +29,7 @@
#include "swad_account.h"
#include "swad_account_database.h"
#include "swad_admin_database.h"
#include "swad_agenda_database.h"
#include "swad_announcement_database.h"
#include "swad_attendance_database.h"
@ -996,7 +997,7 @@ void Acc_CompletelyEliminateAccount (struct UsrData *UsrDat,
UsrDat->FullName);
/***** Remove user as administrator of any degree/center/institution *****/
Enr_DB_RemUsrAsAdmin (UsrDat->UsrCod);
Adm_DB_RemUsrAsAdmin (UsrDat->UsrCod);
if (QuietOrVerbose == Cns_VERBOSE)
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_removed_as_administrator,

View File

@ -26,6 +26,7 @@
#include "swad_account.h"
#include "swad_action.h"
#include "swad_admin.h"
#include "swad_agenda.h"
#include "swad_announcement.h"
#include "swad_attendance.h"
@ -1449,14 +1450,14 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActRemMe_NET ] = {1641,-1,TabUnk,ActLstTch ,0x3D0, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Enr_ReqRemMeFromCrs ,NULL},
[ActRemMe_Tch ] = {1461,-1,TabUnk,ActLstTch ,0x3E0, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Enr_ReqRemMeFromCrs ,NULL},
[ActNewAdmIns ] = {1337,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Enr_AddAdmToIns ,NULL},
[ActRemAdmIns ] = {1338,-1,TabUnk,ActLstOth ,0x300,0x300,0x300,0x300,0x300,0x300,0x300,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Enr_RemAdmIns ,NULL},
[ActNewAdmIns ] = {1337,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Adm_AddAdmToIns ,NULL},
[ActRemAdmIns ] = {1338,-1,TabUnk,ActLstOth ,0x300,0x300,0x300,0x300,0x300,0x300,0x300,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Adm_RemAdmIns ,NULL},
[ActNewAdmCtr ] = {1339,-1,TabUnk,ActLstOth ,0x300,0x300,0x300,0x300,0x300,0x300,0x300,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Enr_AddAdmToCtr ,NULL},
[ActRemAdmCtr ] = {1340,-1,TabUnk,ActLstOth ,0x380,0x380,0x380,0x380,0x380,0x380,0x380,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Enr_RemAdmCtr ,NULL},
[ActNewAdmCtr ] = {1339,-1,TabUnk,ActLstOth ,0x300,0x300,0x300,0x300,0x300,0x300,0x300,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Adm_AddAdmToCtr ,NULL},
[ActRemAdmCtr ] = {1340,-1,TabUnk,ActLstOth ,0x380,0x380,0x380,0x380,0x380,0x380,0x380,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Adm_RemAdmCtr ,NULL},
[ActNewAdmDeg ] = { 586,-1,TabUnk,ActLstOth ,0x380,0x380,0x380,0x380,0x380,0x380,0x380,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Enr_AddAdmToDeg ,NULL},
[ActRemAdmDeg ] = { 584,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Enr_RemAdmDeg ,NULL},
[ActNewAdmDeg ] = { 586,-1,TabUnk,ActLstOth ,0x380,0x380,0x380,0x380,0x380,0x380,0x380,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Adm_AddAdmToDeg ,NULL},
[ActRemAdmDeg ] = { 584,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Adm_RemAdmDeg ,NULL},
[ActRcvFrmEnrSevStd ] = {1428,-1,TabUnk,ActLstStd ,0x3E0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Enr_ReceiveFormAdminStds ,NULL},
[ActRcvFrmEnrSevNET ] = {1643,-1,TabUnk,ActLstTch ,0x3C0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Enr_ReceiveFormAdminNonEditTchs,NULL},

475
swad_admin.c Normal file
View File

@ -0,0 +1,475 @@
// swad_admin.c: administrators
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2021 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General 3 License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/*********************************** Headers *********************************/
/*****************************************************************************/
// #define _GNU_SOURCE // For asprintf
// #include <stdio.h> // For asprintf
// #include <stdlib.h> // For exit, system, malloc, free, rand, etc.
// #include <string.h> // For string functions
// #include "swad_account.h"
// #include "swad_account_database.h"
#include "swad_admin.h"
#include "swad_admin_database.h"
// #include "swad_announcement.h"
// #include "swad_attendance_database.h"
// #include "swad_box.h"
// #include "swad_database.h"
// #include "swad_duplicate.h"
// #include "swad_enrolment.h"
// #include "swad_enrolment_database.h"
// #include "swad_error.h"
// #include "swad_exam_print.h"
// #include "swad_form.h"
#include "swad_global.h"
// #include "swad_hierarchy.h"
// #include "swad_HTML.h"
// #include "swad_ID.h"
// #include "swad_match.h"
// #include "swad_message.h"
// #include "swad_notification.h"
// #include "swad_parameter.h"
// #include "swad_photo.h"
// #include "swad_role.h"
// #include "swad_setting.h"
// #include "swad_test_print.h"
// #include "swad_user.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES] =
{
/* Users who can not admin */
[Rol_UNK ] = false,
[Rol_GST ] = false,
[Rol_USR ] = false,
[Rol_STD ] = false,
[Rol_NET ] = false,
/* Users who can admin */
[Rol_TCH ] = true,
[Rol_DEG_ADM] = true,
[Rol_CTR_ADM] = true,
[Rol_INS_ADM] = true,
[Rol_SYS_ADM] = true,
};
/*****************************************************************************/
/***************************** Private constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/******************************* Private types *******************************/
/*****************************************************************************/
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/************************** Private global variables *************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static void Adm_ReqAddAdm (HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName);
static void Enr_AddAdm (HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName);
static void Adm_RegisterAdmin (struct UsrData *UsrDat,
HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName);
static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName);
static void Adm_AskIfRemAdm (bool ItsMe,HieLvl_Level_t Scope,
const char *InsCtrDegName);
static void Adm_EffectivelyRemAdm (struct UsrData *UsrDat,
HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName);
/*****************************************************************************/
/**** Ask if really wanted to add an administrator to current institution ****/
/*****************************************************************************/
void Adm_ReqAddAdmOfIns (void)
{
Adm_ReqAddAdm (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Ins.FullName);
}
/*****************************************************************************/
/****** Ask if really wanted to add an administrator to current center *******/
/*****************************************************************************/
void Adm_ReqAddAdmOfCtr (void)
{
Adm_ReqAddAdm (HieLvl_CTR,Gbl.Hierarchy.Ctr.CtrCod,Gbl.Hierarchy.Ctr.FullName);
}
/*****************************************************************************/
/****** Ask if really wanted to add an administrator to current degree *******/
/*****************************************************************************/
void Adm_ReqAddAdmOfDeg (void)
{
Adm_ReqAddAdm (HieLvl_DEG,Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Deg.FullName);
}
/*****************************************************************************/
/**** Ask if really wanted to add an administrator to current institution ****/
/*****************************************************************************/
static void Adm_ReqAddAdm (HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName)
{
extern const char *Txt_THE_USER_X_is_already_an_administrator_of_Y;
extern const char *Txt_Do_you_really_want_to_register_the_following_user_as_an_administrator_of_X;
extern const char *Txt_Register_user_IN_A_COURSE_OR_DEGREE;
static const Act_Action_t Enr_ActNewAdm[HieLvl_NUM_LEVELS] =
{
[HieLvl_UNK] = ActUnk,
[HieLvl_SYS] = ActUnk,
[HieLvl_CTY] = ActUnk,
[HieLvl_INS] = ActNewAdmIns,
[HieLvl_CTR] = ActNewAdmCtr,
[HieLvl_DEG] = ActNewAdmDeg,
[HieLvl_CRS] = ActUnk,
};
bool ICanRegister;
if (Cod > 0)
{
/***** Get user's identificator of the user to register as admin *****/
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
{
/* Check if I am allowed to register user as administrator in institution/center/degree */
ICanRegister = ((Scope == HieLvl_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Scope == HieLvl_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Scope == HieLvl_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
if (ICanRegister)
{
if (Usr_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Scope,Cod)) // User is already an administrator of current institution/center/degree
{
Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_is_already_an_administrator_of_Y,
Gbl.Usrs.Other.UsrDat.FullName,InsCtrDegName);
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
}
else
{
/***** Show question and button to register user as administrator *****/
/* Begin alert */
Ale_ShowAlertAndButton1 (Ale_QUESTION,Txt_Do_you_really_want_to_register_the_following_user_as_an_administrator_of_X,
InsCtrDegName);
/* Show user's record */
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
/* End alert */
Ale_ShowAlertAndButton2 (Enr_ActNewAdm[Scope],NULL,NULL,
Usr_PutParamOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
Btn_CREATE_BUTTON,Txt_Register_user_IN_A_COURSE_OR_DEGREE);
}
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
}
/*****************************************************************************/
/*************** Add an administrator to current institution *****************/
/*****************************************************************************/
void Adm_AddAdmToIns (void)
{
Enr_AddAdm (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Ins.FullName);
}
/*****************************************************************************/
/******************* Add an administrator to current center ******************/
/*****************************************************************************/
void Adm_AddAdmToCtr (void)
{
Enr_AddAdm (HieLvl_CTR,Gbl.Hierarchy.Ctr.CtrCod,Gbl.Hierarchy.Ctr.FullName);
}
/*****************************************************************************/
/******************* Add an administrator to current degree ******************/
/*****************************************************************************/
void Adm_AddAdmToDeg (void)
{
Enr_AddAdm (HieLvl_DEG,Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Deg.FullName);
}
/*****************************************************************************/
/******************* Add an administrator to current degree ******************/
/*****************************************************************************/
static void Enr_AddAdm (HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName)
{
bool ICanRegister;
if (Cod > 0)
{
/***** Get plain user's ID of the user to add/modify *****/
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
{
/* Check if I am allowed to register user as administrator in institution/center/degree */
ICanRegister = ((Scope == HieLvl_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Scope == HieLvl_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Scope == HieLvl_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
if (ICanRegister)
{
/***** Register administrator in current institution/center/degree in database *****/
Adm_RegisterAdmin (&Gbl.Usrs.Other.UsrDat,Scope,
Cod,InsCtrDegName);
/***** Show user's record *****/
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
}
/*****************************************************************************/
/**************** Register administrator in current institution **************/
/*****************************************************************************/
static void Adm_RegisterAdmin (struct UsrData *UsrDat,
HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName)
{
extern const char *Txt_THE_USER_X_is_already_an_administrator_of_Y;
extern const char *Txt_THE_USER_X_has_been_enroled_as_administrator_of_Y;
/***** Check if user was and administrator of current institution/center/degree *****/
if (Usr_CheckIfUsrIsAdm (UsrDat->UsrCod,Scope,Cod))
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_is_already_an_administrator_of_Y,
UsrDat->FullName,InsCtrDegName);
else // User was not administrator of current institution/center/degree
{
/***** Insert or replace administrator in current institution/center/degree *****/
Adm_DB_InsertAdmin (UsrDat->UsrCod,Scope,Cod);
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_enroled_as_administrator_of_Y,
UsrDat->FullName,InsCtrDegName);
}
}
/*****************************************************************************/
/******* Ask for remove of an administrator from current institution *********/
/*****************************************************************************/
void Adm_ReqRemAdmOfIns (void)
{
Adm_ReqRemOrRemAdm (Enr_REQUEST_REMOVE_USR,HieLvl_INS,
Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Ins.FullName);
}
/*****************************************************************************/
/********* Ask for remove of an administrator from current center ************/
/*****************************************************************************/
void Adm_ReqRemAdmOfCtr (void)
{
Adm_ReqRemOrRemAdm (Enr_REQUEST_REMOVE_USR,HieLvl_CTR,
Gbl.Hierarchy.Ctr.CtrCod,Gbl.Hierarchy.Ctr.FullName);
}
/*****************************************************************************/
/********* Ask for remove of an administrator from current degree ************/
/*****************************************************************************/
void Adm_ReqRemAdmOfDeg (void)
{
Adm_ReqRemOrRemAdm (Enr_REQUEST_REMOVE_USR,HieLvl_DEG,
Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Deg.FullName);
}
/*****************************************************************************/
/************ Remove an administrator from current institution ***************/
/*****************************************************************************/
void Adm_RemAdmIns (void)
{
Adm_ReqRemOrRemAdm (Enr_REMOVE_USR,HieLvl_INS,
Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Ins.FullName);
}
/*****************************************************************************/
/*************** Remove an administrator from current center *****************/
/*****************************************************************************/
void Adm_RemAdmCtr (void)
{
Adm_ReqRemOrRemAdm (Enr_REMOVE_USR,HieLvl_CTR,
Gbl.Hierarchy.Ctr.CtrCod,Gbl.Hierarchy.Ctr.FullName);
}
/*****************************************************************************/
/*************** Remove an administrator from current degree *****************/
/*****************************************************************************/
void Adm_RemAdmDeg (void)
{
Adm_ReqRemOrRemAdm (Enr_REMOVE_USR,HieLvl_DEG,
Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Deg.FullName);
}
/*****************************************************************************/
/***************** Remove an admin from current institution ******************/
/*****************************************************************************/
static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName)
{
extern const char *Txt_THE_USER_X_is_not_an_administrator_of_Y;
bool ItsMe;
bool ICanRemove;
if (Cod > 0)
{
/***** Get user to be removed *****/
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
{
/* Check if it's forbidden to remove an administrator */
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
ICanRemove = (ItsMe ||
(Scope == HieLvl_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Scope == HieLvl_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Scope == HieLvl_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
if (ICanRemove)
{
/* Check if the other user is an admin of the current institution/center/degree */
if (Usr_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Scope,Cod))
{ // The other user is an administrator of current institution/center/degree ==> ask for removing or remove her/him
switch (ReqDelOrDelUsr)
{
case Enr_REQUEST_REMOVE_USR: // Ask if remove administrator from current institution
Adm_AskIfRemAdm (ItsMe,Scope,InsCtrDegName);
break;
case Enr_REMOVE_USR: // Remove administrator from current institution
Adm_EffectivelyRemAdm (&Gbl.Usrs.Other.UsrDat,Scope,
Cod,InsCtrDegName);
break;
}
}
else // The other user is not an administrator of current institution
Ale_ShowAlert (Ale_WARNING,Txt_THE_USER_X_is_not_an_administrator_of_Y,
Gbl.Usrs.Other.UsrDat.FullName,InsCtrDegName);
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
}
/*****************************************************************************/
/** Ask if really wanted to remove an administrator from current institution */
/*****************************************************************************/
static void Adm_AskIfRemAdm (bool ItsMe,HieLvl_Level_t Scope,
const char *InsCtrDegName)
{
extern const char *Txt_Do_you_really_want_to_be_removed_as_an_administrator_of_X;
extern const char *Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_X;
extern const char *Txt_Remove_me_as_an_administrator;
extern const char *Txt_Remove_USER_as_an_administrator;
static const Act_Action_t Enr_ActRemAdm[HieLvl_NUM_LEVELS] =
{
[HieLvl_UNK] = ActUnk,
[HieLvl_SYS] = ActUnk,
[HieLvl_CTY] = ActUnk,
[HieLvl_INS] = ActRemAdmIns,
[HieLvl_CTR] = ActRemAdmCtr,
[HieLvl_DEG] = ActRemAdmDeg,
[HieLvl_CRS] = ActUnk,
};
if (Usr_ChkIfUsrCodExists (Gbl.Usrs.Other.UsrDat.UsrCod))
{
/***** Show question and button to remove user as administrator *****/
/* Begin alert */
Ale_ShowAlertAndButton1 (Ale_QUESTION,ItsMe ? Txt_Do_you_really_want_to_be_removed_as_an_administrator_of_X :
Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_X,
InsCtrDegName);
/* Show user's record */
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
/* End alert */
Ale_ShowAlertAndButton2 (Enr_ActRemAdm[Scope],NULL,NULL,
Usr_PutParamOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
Btn_REMOVE_BUTTON,
ItsMe ? Txt_Remove_me_as_an_administrator :
Txt_Remove_USER_as_an_administrator);
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
/*****************************************************************************/
/**** Remove an administrator from current institution, center or degree *****/
/*****************************************************************************/
static void Adm_EffectivelyRemAdm (struct UsrData *UsrDat,
HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName)
{
extern const char *Txt_THE_USER_X_has_been_removed_as_administrator_of_Y;
extern const char *Txt_THE_USER_X_is_not_an_administrator_of_Y;
if (Usr_CheckIfUsrIsAdm (UsrDat->UsrCod,Scope,Cod)) // User is administrator of current institution/center/degree
{
/***** Remove user as administrator of institution, center or degree *****/
Adm_DB_RemAdmin (UsrDat->UsrCod,Scope,Cod);
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_removed_as_administrator_of_Y,
UsrDat->FullName,InsCtrDegName);
}
else // User is not an administrator of the current institution/center/degree
Ale_ShowAlert (Ale_ERROR,Txt_THE_USER_X_is_not_an_administrator_of_Y,
UsrDat->FullName,InsCtrDegName);
}

65
swad_admin.h Normal file
View File

@ -0,0 +1,65 @@
// swad_admin.h: administrators
#ifndef _SWAD_ADM
#define _SWAD_ADM
/*
SWAD (Shared Workspace At a Distance in Spanish),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2021 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************** Headers **********************************/
/*****************************************************************************/
#include "swad_admin.h"
// #include "swad_course.h"
#include "swad_enrolment.h"
#include "swad_hierarchy.h"
// #include "swad_notification.h"
// #include "swad_user.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/******************************** Public types *******************************/
/*****************************************************************************/
/*****************************************************************************/
/****************************** Public prototypes ****************************/
/*****************************************************************************/
void Adm_ReqAddAdmOfIns (void);
void Adm_ReqAddAdmOfCtr (void);
void Adm_ReqAddAdmOfDeg (void);
void Adm_AddAdmToIns (void);
void Adm_AddAdmToCtr (void);
void Adm_AddAdmToDeg (void);
void Adm_ReqRemAdmOfIns (void);
void Adm_ReqRemAdmOfCtr (void);
void Adm_ReqRemAdmOfDeg (void);
void Adm_RemAdmIns (void);
void Adm_RemAdmCtr (void);
void Adm_RemAdmDeg (void);
#endif

116
swad_admin_database.c Normal file
View File

@ -0,0 +1,116 @@
// swad_admin_database.c: administrators operations with database
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2021 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General 3 License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/*********************************** Headers *********************************/
/*****************************************************************************/
#include "swad_database.h"
#include "swad_admin.h"
#include "swad_admin_database.h"
// #include "swad_error.h"
// #include "swad_global.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/******************************* Private types *******************************/
/*****************************************************************************/
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/************************** Private global variables *************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
/*****************************************************************************/
/** Insert/replace user as administrator of an institution, center or degree */
/*****************************************************************************/
void Adm_DB_InsertAdmin (long UsrCod,HieLvl_Level_t Scope,long Cod)
{
DB_QueryREPLACE ("can not create administrator",
"REPLACE INTO usr_admins"
" (UsrCod,Scope,Cod)"
" VALUES"
" (%ld,'%s',%ld)",
UsrCod,
Sco_GetDBStrFromScope (Scope),
Cod);
}
/*****************************************************************************/
/***** Remove user as administrator of an institution, center or degree ******/
/*****************************************************************************/
void Adm_DB_RemAdmin (long UsrCod,HieLvl_Level_t Scope,long Cod)
{
DB_QueryDELETE ("can not remove an administrator",
"DELETE FROM usr_admins"
" WHERE UsrCod=%ld"
" AND Scope='%s'"
" AND Cod=%ld",
UsrCod,
Sco_GetDBStrFromScope (Scope),
Cod);
}
/*****************************************************************************/
/******* Remove user as administrator of any degree/center/institution *******/
/*****************************************************************************/
void Adm_DB_RemUsrAsAdmin (long UsrCod)
{
DB_QueryDELETE ("can not remove a user as administrator",
"DELETE FROM usr_admins"
" WHERE UsrCod=%ld",
UsrCod);
}
/*****************************************************************************/
/********* Remove administrators of an institution, center or degree *********/
/*****************************************************************************/
void Adm_DB_RemAdmins (HieLvl_Level_t Scope,long Cod)
{
DB_QueryDELETE ("can not remove administrators",
"DELETE FROM usr_admins"
" WHERE Scope='%s'"
" AND Cod=%ld",
Sco_GetDBStrFromScope (Scope),
Cod);
}

49
swad_admin_database.h Normal file
View File

@ -0,0 +1,49 @@
// swad_admin_database.h: administrators operations with database
#ifndef _SWAD_ADM_DB
#define _SWAD_ADM_DB
/*
SWAD (Shared Workspace At a Distance in Spanish),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2021 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************** Headers **********************************/
/*****************************************************************************/
#include "swad_hierarchy.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/******************************** Public types *******************************/
/*****************************************************************************/
/*****************************************************************************/
/****************************** Public prototypes ****************************/
/*****************************************************************************/
void Adm_DB_InsertAdmin (long UsrCod,HieLvl_Level_t Scope,long Cod);
void Adm_DB_RemAdmin (long UsrCod,HieLvl_Level_t Scope,long Cod);
void Adm_DB_RemUsrAsAdmin (long UsrCod);
void Adm_DB_RemAdmins (HieLvl_Level_t Scope,long Cod);
#endif

View File

@ -30,6 +30,7 @@
#include <stdlib.h> // For free
#include <string.h> // For string functions
#include "swad_admin_database.h"
#include "swad_center.h"
#include "swad_center_config.h"
#include "swad_center_database.h"
@ -1097,7 +1098,7 @@ void Ctr_RemoveCenter (void)
Fil_RemoveTree (PathCtr);
/***** Remove administrators of this center *****/
Enr_DB_RemAdmins (HieLvl_CTR,Ctr_EditingCtr->CtrCod);
Adm_DB_RemAdmins (HieLvl_CTR,Ctr_EditingCtr->CtrCod);
/***** Remove center *****/
Ctr_DB_RemoveCenter (Ctr_EditingCtr->CtrCod);

View File

@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/
#define Log_PLATFORM_VERSION "SWAD 20.91.3 (2021-06-11)"
#define Log_PLATFORM_VERSION "SWAD 20.92 (2021-06-11)"
#define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.69.1.js"
/*
TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 20.92: Jun 09, 2021 New modules swad_admin and swad_admin_database for administrators. (313381 lines)
Version 20.91.3: Jun 11, 2021 Queries moved to module swad_enrolment_database. (313173 lines)
Version 20.91.2: Jun 11, 2021 Queries moved to module swad_enrolment_database. (313143 lines)
Version 20.91.1: Jun 10, 2021 Queries moved to module swad_enrolment_database. (313145 lines)

View File

@ -30,6 +30,7 @@
#include <stdlib.h> // For free
#include <string.h> // For string functions
#include "swad_admin_database.h"
#include "swad_course_database.h"
#include "swad_database.h"
#include "swad_degree.h"
@ -1364,7 +1365,7 @@ void Deg_RemoveDegreeCompletely (long DegCod)
Fil_RemoveTree (PathDeg);
/***** Remove administrators of this degree *****/
Enr_DB_RemAdmins (HieLvl_DEG,DegCod);
Adm_DB_RemAdmins (HieLvl_DEG,DegCod);
/***** Remove the degree *****/
Deg_DB_RemoveDeg (DegCod);

View File

@ -32,6 +32,7 @@
#include "swad_account.h"
#include "swad_account_database.h"
#include "swad_admin.h"
#include "swad_announcement.h"
#include "swad_attendance_database.h"
#include "swad_box.h"
@ -64,22 +65,6 @@
/***************************** Private constants *****************************/
/*****************************************************************************/
static const bool Enr_ICanAdminOtherUsrs[Rol_NUM_ROLES] =
{
/* Users who can not admin */
[Rol_UNK ] = false,
[Rol_GST ] = false,
[Rol_USR ] = false,
[Rol_STD ] = false,
[Rol_NET ] = false,
/* Users who can admin */
[Rol_TCH ] = true,
[Rol_DEG_ADM] = true,
[Rol_CTR_ADM] = true,
[Rol_INS_ADM] = true,
[Rol_SYS_ADM] = true,
};
/*****************************************************************************/
/******************************* Private types *******************************/
/*****************************************************************************/
@ -95,12 +80,6 @@ typedef enum
Enr_ELIMINATE_USRS_FROM_PLATFORM = 5,
} Enr_RegRemUsrsAction_t;
typedef enum
{
Enr_REQUEST_REMOVE_USR,
Enr_REMOVE_USR,
} Enr_ReqDelOrDelUsr_t;
/* Remove important user production (works and match results)? */
typedef enum
{
@ -163,28 +142,14 @@ static void Enr_AskIfRegRemUsr (struct ListUsrCods *ListUsrCods,Rol_Role_t Role)
static void Enr_ShowFormToEditOtherUsr (void);
static void Enr_AddAdm (HieLvl_Level_t Scope,long Cod,const char *InsCtrDegName);
static void Enr_RegisterAdmin (struct UsrData *UsrDat,HieLvl_Level_t Scope,
long Cod,const char *InsCtrDegName);
static bool Enr_CheckIfICanRemUsrFromCrs (void);
static void Enr_ReqRemAdmOfDeg (void);
static void Enr_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,HieLvl_Level_t Scope,
long Cod,const char *InsCtrDegName);
static void Enr_ReqAddAdm (HieLvl_Level_t Scope,long Cod,const char *InsCtrDegName);
static void Enr_AskIfRemoveUsrFromCrs (struct UsrData *UsrDat);
static void Enr_EffectivelyRemUsrFromCrs (struct UsrData *UsrDat,
struct Crs_Course *Crs,
Enr_RemoveUsrProduction_t RemoveUsrWorks,
Cns_QuietOrVerbose_t QuietOrVerbose);
static void Enr_AskIfRemAdm (bool ItsMe,HieLvl_Level_t Scope,
const char *InsCtrDegName);
static void Enr_EffectivelyRemAdm (struct UsrData *UsrDat,HieLvl_Level_t Scope,
long Cod,const char *InsCtrDegName);
/*****************************************************************************/
/** Check if current course has students and show warning no students found **/
/*****************************************************************************/
@ -2419,9 +2384,10 @@ static void Enr_RemUsrEnrolmentRequestInCrs (long UsrCod,long CrsCod)
void Enr_PutLinkToAdminOneUsr (Act_Action_t NextAction)
{
extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES];
extern const char *Txt_Administer_me;
extern const char *Txt_Administer_one_user;
const char *TitleText = Enr_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged] ? Txt_Administer_one_user :
const char *TitleText = Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged] ? Txt_Administer_one_user :
Txt_Administer_me;
Lay_PutContextualLinkIconText (NextAction,NULL,
@ -2479,11 +2445,13 @@ void Enr_ReqRegRemOth (void)
void Enr_ReqRegRemStd (void)
{
extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES];
/***** Contextual menu *****/
if (Enr_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged])
if (Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged])
{
Mnu_ContextMenuBegin ();
Enr_PutLinkToAdminSeveralUsrs (Rol_STD); // Admin several students
Enr_PutLinkToAdminSeveralUsrs (Rol_STD); // Admin several students
Mnu_ContextMenuEnd ();
}
@ -2499,7 +2467,9 @@ void Enr_ReqRegRemTch (void)
static void Enr_ReqRegRemUsr (Rol_Role_t Role)
{
if (Enr_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged])
extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES];
if (Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged])
/***** Form to request the user's ID of another user *****/
Enr_ReqAnotherUsrIDToRegisterRemove (Role);
else
@ -2720,90 +2690,6 @@ static void Enr_ShowFormToEditOtherUsr (void)
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
/*****************************************************************************/
/*************** Add an administrator to current institution *****************/
/*****************************************************************************/
void Enr_AddAdmToIns (void)
{
Enr_AddAdm (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Ins.FullName);
}
/*****************************************************************************/
/******************* Add an administrator to current center ******************/
/*****************************************************************************/
void Enr_AddAdmToCtr (void)
{
Enr_AddAdm (HieLvl_CTR,Gbl.Hierarchy.Ctr.CtrCod,Gbl.Hierarchy.Ctr.FullName);
}
/*****************************************************************************/
/******************* Add an administrator to current degree ******************/
/*****************************************************************************/
void Enr_AddAdmToDeg (void)
{
Enr_AddAdm (HieLvl_DEG,Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Deg.FullName);
}
/*****************************************************************************/
/******************* Add an administrator to current degree ******************/
/*****************************************************************************/
static void Enr_AddAdm (HieLvl_Level_t Scope,long Cod,const char *InsCtrDegName)
{
bool ICanRegister;
if (Cod > 0)
{
/***** Get plain user's ID of the user to add/modify *****/
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
{
/* Check if I am allowed to register user as administrator in institution/center/degree */
ICanRegister = ((Scope == HieLvl_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Scope == HieLvl_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Scope == HieLvl_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
if (ICanRegister)
{
/***** Register administrator in current institution/center/degree in database *****/
Enr_RegisterAdmin (&Gbl.Usrs.Other.UsrDat,Scope,
Cod,InsCtrDegName);
/***** Show user's record *****/
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
}
/*****************************************************************************/
/**************** Register administrator in current institution **************/
/*****************************************************************************/
static void Enr_RegisterAdmin (struct UsrData *UsrDat,HieLvl_Level_t Scope,long Cod,const char *InsCtrDegName)
{
extern const char *Txt_THE_USER_X_is_already_an_administrator_of_Y;
extern const char *Txt_THE_USER_X_has_been_enroled_as_administrator_of_Y;
/***** Check if user was and administrator of current institution/center/degree *****/
if (Usr_CheckIfUsrIsAdm (UsrDat->UsrCod,Scope,Cod))
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_is_already_an_administrator_of_Y,
UsrDat->FullName,InsCtrDegName);
else // User was not administrator of current institution/center/degree
{
/***** Insert or replace administrator in current institution/center/degree *****/
Enr_DB_InsertAdmin (UsrDat->UsrCod,Scope,Cod);
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_enroled_as_administrator_of_Y,
UsrDat->FullName,InsCtrDegName);
}
}
/*****************************************************************************/
/****************** Ask for remove me from current course ********************/
/*****************************************************************************/
@ -2890,178 +2776,6 @@ static bool Enr_CheckIfICanRemUsrFromCrs (void)
return false;
}
/*****************************************************************************/
/******* Ask for remove of an administrator from current institution *********/
/*****************************************************************************/
static void Enr_ReqRemAdmOfIns (void)
{
Enr_ReqRemOrRemAdm (Enr_REQUEST_REMOVE_USR,HieLvl_INS,
Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Ins.FullName);
}
/*****************************************************************************/
/********* Ask for remove of an administrator from current center ************/
/*****************************************************************************/
static void Enr_ReqRemAdmOfCtr (void)
{
Enr_ReqRemOrRemAdm (Enr_REQUEST_REMOVE_USR,HieLvl_CTR,
Gbl.Hierarchy.Ctr.CtrCod,Gbl.Hierarchy.Ctr.FullName);
}
/*****************************************************************************/
/********* Ask for remove of an administrator from current degree ************/
/*****************************************************************************/
static void Enr_ReqRemAdmOfDeg (void)
{
Enr_ReqRemOrRemAdm (Enr_REQUEST_REMOVE_USR,HieLvl_DEG,
Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Deg.FullName);
}
/*****************************************************************************/
/************ Remove an administrator from current institution ***************/
/*****************************************************************************/
void Enr_RemAdmIns (void)
{
Enr_ReqRemOrRemAdm (Enr_REMOVE_USR,HieLvl_INS,
Gbl.Hierarchy.Ins.InsCod,Gbl.Hierarchy.Ins.FullName);
}
/*****************************************************************************/
/*************** Remove an administrator from current center *****************/
/*****************************************************************************/
void Enr_RemAdmCtr (void)
{
Enr_ReqRemOrRemAdm (Enr_REMOVE_USR,HieLvl_CTR,
Gbl.Hierarchy.Ctr.CtrCod,Gbl.Hierarchy.Ctr.FullName);
}
/*****************************************************************************/
/*************** Remove an administrator from current degree *****************/
/*****************************************************************************/
void Enr_RemAdmDeg (void)
{
Enr_ReqRemOrRemAdm (Enr_REMOVE_USR,HieLvl_DEG,
Gbl.Hierarchy.Deg.DegCod,Gbl.Hierarchy.Deg.FullName);
}
/*****************************************************************************/
/***************** Remove an admin from current institution ******************/
/*****************************************************************************/
static void Enr_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,HieLvl_Level_t Scope,
long Cod,const char *InsCtrDegName)
{
extern const char *Txt_THE_USER_X_is_not_an_administrator_of_Y;
bool ItsMe;
bool ICanRemove;
if (Cod > 0)
{
/***** Get user to be removed *****/
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
{
/* Check if it's forbidden to remove an administrator */
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
ICanRemove = (ItsMe ||
(Scope == HieLvl_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Scope == HieLvl_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Scope == HieLvl_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
if (ICanRemove)
{
/* Check if the other user is an admin of the current institution/center/degree */
if (Usr_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Scope,Cod))
{ // The other user is an administrator of current institution/center/degree ==> ask for removing or remove her/him
switch (ReqDelOrDelUsr)
{
case Enr_REQUEST_REMOVE_USR: // Ask if remove administrator from current institution
Enr_AskIfRemAdm (ItsMe,Scope,InsCtrDegName);
break;
case Enr_REMOVE_USR: // Remove administrator from current institution
Enr_EffectivelyRemAdm (&Gbl.Usrs.Other.UsrDat,Scope,
Cod,InsCtrDegName);
break;
}
}
else // The other user is not an administrator of current institution
Ale_ShowAlert (Ale_WARNING,Txt_THE_USER_X_is_not_an_administrator_of_Y,
Gbl.Usrs.Other.UsrDat.FullName,InsCtrDegName);
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
}
/*****************************************************************************/
/**** Ask if really wanted to add an administrator to current institution ****/
/*****************************************************************************/
static void Enr_ReqAddAdm (HieLvl_Level_t Scope,long Cod,const char *InsCtrDegName)
{
extern const char *Txt_THE_USER_X_is_already_an_administrator_of_Y;
extern const char *Txt_Do_you_really_want_to_register_the_following_user_as_an_administrator_of_X;
extern const char *Txt_Register_user_IN_A_COURSE_OR_DEGREE;
static const Act_Action_t Enr_ActNewAdm[HieLvl_NUM_LEVELS] =
{
[HieLvl_UNK] = ActUnk,
[HieLvl_SYS] = ActUnk,
[HieLvl_CTY] = ActUnk,
[HieLvl_INS] = ActNewAdmIns,
[HieLvl_CTR] = ActNewAdmCtr,
[HieLvl_DEG] = ActNewAdmDeg,
[HieLvl_CRS] = ActUnk,
};
bool ICanRegister;
if (Cod > 0)
{
/***** Get user's identificator of the user to register as admin *****/
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
{
/* Check if I am allowed to register user as administrator in institution/center/degree */
ICanRegister = ((Scope == HieLvl_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Scope == HieLvl_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Scope == HieLvl_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
if (ICanRegister)
{
if (Usr_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Scope,Cod)) // User is already an administrator of current institution/center/degree
{
Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_is_already_an_administrator_of_Y,
Gbl.Usrs.Other.UsrDat.FullName,InsCtrDegName);
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
}
else
{
/***** Show question and button to register user as administrator *****/
/* Begin alert */
Ale_ShowAlertAndButton1 (Ale_QUESTION,Txt_Do_you_really_want_to_register_the_following_user_as_an_administrator_of_X,
InsCtrDegName);
/* Show user's record */
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
/* End alert */
Ale_ShowAlertAndButton2 (Enr_ActNewAdm[Scope],NULL,NULL,
Usr_PutParamOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
Btn_CREATE_BUTTON,Txt_Register_user_IN_A_COURSE_OR_DEGREE);
}
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
}
/*****************************************************************************/
/*************** Accept my enrolment in the current course ******************/
/*****************************************************************************/
@ -3376,16 +3090,13 @@ void Enr_ModifyUsr2 (void)
Enr_ShowFormToEditOtherUsr ();
break;
case Enr_REGISTER_ONE_DEGREE_ADMIN:
Enr_ReqAddAdm (HieLvl_DEG,Gbl.Hierarchy.Deg.DegCod,
Gbl.Hierarchy.Deg.FullName);
Adm_ReqAddAdmOfDeg ();
break;
case Enr_REGISTER_ONE_CENTER_ADMIN:
Enr_ReqAddAdm (HieLvl_CTR,Gbl.Hierarchy.Ctr.CtrCod,
Gbl.Hierarchy.Ctr.FullName);
Adm_ReqAddAdmOfCtr ();
break;
case Enr_REGISTER_ONE_INSTITUTION_ADMIN:
Enr_ReqAddAdm (HieLvl_INS,Gbl.Hierarchy.Ins.InsCod,
Gbl.Hierarchy.Ins.FullName);
Adm_ReqAddAdmOfIns ();
break;
case Enr_REPORT_USR_AS_POSSIBLE_DUPLICATE:
Dup_ReportUsrAsPossibleDuplicate ();
@ -3394,13 +3105,13 @@ void Enr_ModifyUsr2 (void)
Enr_ReqRemUsrFromCrs ();
break;
case Enr_REMOVE_ONE_DEGREE_ADMIN:
Enr_ReqRemAdmOfDeg ();
Adm_ReqRemAdmOfDeg ();
break;
case Enr_REMOVE_ONE_CENTER_ADMIN:
Enr_ReqRemAdmOfCtr ();
Adm_ReqRemAdmOfCtr ();
break;
case Enr_REMOVE_ONE_INSTITUTION_ADMIN:
Enr_ReqRemAdmOfIns ();
Adm_ReqRemAdmOfIns ();
break;
case Enr_ELIMINATE_ONE_USR_FROM_PLATFORM:
Acc_ReqRemAccountOrRemAccount (Acc_REQUEST_REMOVE_USR);
@ -3560,70 +3271,3 @@ static void Enr_EffectivelyRemUsrFromCrs (struct UsrData *UsrDat,
if (QuietOrVerbose == Cns_VERBOSE)
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
}
/*****************************************************************************/
/** Ask if really wanted to remove an administrator from current institution */
/*****************************************************************************/
static void Enr_AskIfRemAdm (bool ItsMe,HieLvl_Level_t Scope,
const char *InsCtrDegName)
{
extern const char *Txt_Do_you_really_want_to_be_removed_as_an_administrator_of_X;
extern const char *Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_X;
extern const char *Txt_Remove_me_as_an_administrator;
extern const char *Txt_Remove_USER_as_an_administrator;
static const Act_Action_t Enr_ActRemAdm[HieLvl_NUM_LEVELS] =
{
[HieLvl_UNK] = ActUnk,
[HieLvl_SYS] = ActUnk,
[HieLvl_CTY] = ActUnk,
[HieLvl_INS] = ActRemAdmIns,
[HieLvl_CTR] = ActRemAdmCtr,
[HieLvl_DEG] = ActRemAdmDeg,
[HieLvl_CRS] = ActUnk,
};
if (Usr_ChkIfUsrCodExists (Gbl.Usrs.Other.UsrDat.UsrCod))
{
/***** Show question and button to remove user as administrator *****/
/* Begin alert */
Ale_ShowAlertAndButton1 (Ale_QUESTION,ItsMe ? Txt_Do_you_really_want_to_be_removed_as_an_administrator_of_X :
Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_X,
InsCtrDegName);
/* Show user's record */
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
/* End alert */
Ale_ShowAlertAndButton2 (Enr_ActRemAdm[Scope],NULL,NULL,
Usr_PutParamOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
Btn_REMOVE_BUTTON,
ItsMe ? Txt_Remove_me_as_an_administrator :
Txt_Remove_USER_as_an_administrator);
}
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
/*****************************************************************************/
/**** Remove an administrator from current institution, center or degree *****/
/*****************************************************************************/
static void Enr_EffectivelyRemAdm (struct UsrData *UsrDat,HieLvl_Level_t Scope,
long Cod,const char *InsCtrDegName)
{
extern const char *Txt_THE_USER_X_has_been_removed_as_administrator_of_Y;
extern const char *Txt_THE_USER_X_is_not_an_administrator_of_Y;
if (Usr_CheckIfUsrIsAdm (UsrDat->UsrCod,Scope,Cod)) // User is administrator of current institution/center/degree
{
/***** Remove user as administrator of institution, center or degree *****/
Enr_DB_RemAdmin (UsrDat->UsrCod,Scope,Cod);
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_removed_as_administrator_of_Y,
UsrDat->FullName,InsCtrDegName);
}
else // User is not an administrator of the current institution/center/degree
Ale_ShowAlert (Ale_ERROR,Txt_THE_USER_X_is_not_an_administrator_of_Y,
UsrDat->FullName,InsCtrDegName);
}

View File

@ -67,6 +67,12 @@ typedef enum
Enr_ELIMINATE_ONE_USR_FROM_PLATFORM = 10,
} Enr_RegRemOneUsrAction_t;
typedef enum
{
Enr_REQUEST_REMOVE_USR,
Enr_REMOVE_USR,
} Enr_ReqDelOrDelUsr_t;
/*****************************************************************************/
/****************************** Public prototypes ****************************/
/*****************************************************************************/
@ -123,17 +129,11 @@ void Enr_ReqRegRemTch (void);
void Enr_AskIfRegRemAnotherOth (void);
void Enr_AskIfRegRemAnotherStd (void);
void Enr_AskIfRegRemAnotherTch (void);
void Enr_AddAdmToIns (void);
void Enr_AddAdmToCtr (void);
void Enr_AddAdmToDeg (void);
void Enr_ReqRemMeFromCrs (void);
void Enr_ReqRemUsrFromCrs (void);
void Enr_RemUsrFromCrs1 (void);
void Enr_RemUsrFromCrs2 (void);
void Enr_RemAdmIns (void);
void Enr_RemAdmCtr (void);
void Enr_RemAdmDeg (void);
void Enr_AcceptRegisterMeInCrs (void);
void Enr_CreateNewUsr1 (void);

View File

@ -25,34 +25,11 @@
/*********************************** Headers *********************************/
/*****************************************************************************/
// #define _GNU_SOURCE // For asprintf
// #include <stdio.h> // For asprintf
// #include <stdlib.h> // For exit, system, malloc, free, rand, etc.
// #include <string.h> // For string functions
// #include "swad_account.h"
// #include "swad_announcement.h"
// #include "swad_attendance_database.h"
// #include "swad_box.h"
#include "swad_database.h"
// #include "swad_duplicate.h"
#include "swad_enrolment.h"
#include "swad_enrolment_database.h"
#include "swad_error.h"
// #include "swad_exam_print.h"
// #include "swad_form.h"
#include "swad_global.h"
// #include "swad_hierarchy.h"
// #include "swad_HTML.h"
// #include "swad_ID.h"
// #include "swad_match.h"
// #include "swad_message.h"
// #include "swad_notification.h"
// #include "swad_parameter.h"
// #include "swad_photo.h"
// #include "swad_role.h"
// #include "swad_test_print.h"
// #include "swad_user.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
@ -815,61 +792,3 @@ void Enr_DB_RemoveExpiredEnrolmentRequests (void)
" WHERE RequestTime<FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)",
Cfg_TIME_TO_DELETE_ENROLMENT_REQUESTS);
}
/*****************************************************************************/
/** Insert/replace user as administrator of an institution, center or degree */
/*****************************************************************************/
void Enr_DB_InsertAdmin (long UsrCod,HieLvl_Level_t Scope,long Cod)
{
DB_QueryREPLACE ("can not create administrator",
"REPLACE INTO usr_admins"
" (UsrCod,Scope,Cod)"
" VALUES"
" (%ld,'%s',%ld)",
UsrCod,
Sco_GetDBStrFromScope (Scope),
Cod);
}
/*****************************************************************************/
/***** Remove user as administrator of an institution, center or degree ******/
/*****************************************************************************/
void Enr_DB_RemAdmin (long UsrCod,HieLvl_Level_t Scope,long Cod)
{
DB_QueryDELETE ("can not remove an administrator",
"DELETE FROM usr_admins"
" WHERE UsrCod=%ld"
" AND Scope='%s'"
" AND Cod=%ld",
UsrCod,
Sco_GetDBStrFromScope (Scope),
Cod);
}
/*****************************************************************************/
/******* Remove user as administrator of any degree/center/institution *******/
/*****************************************************************************/
void Enr_DB_RemUsrAsAdmin (long UsrCod)
{
DB_QueryDELETE ("can not remove a user as administrator",
"DELETE FROM usr_admins"
" WHERE UsrCod=%ld",
UsrCod);
}
/*****************************************************************************/
/********* Remove administrators of an institution, center or degree *********/
/*****************************************************************************/
void Enr_DB_RemAdmins (HieLvl_Level_t Scope,long Cod)
{
DB_QueryDELETE ("can not remove administrators",
"DELETE FROM usr_admins"
" WHERE Scope='%s'"
" AND Cod=%ld",
Sco_GetDBStrFromScope (Scope),
Cod);
}

View File

@ -27,11 +27,8 @@
/********************************** Headers **********************************/
/*****************************************************************************/
// #include "swad_course.h"
#include "swad_enrolment.h"
#include "swad_hierarchy.h"
// #include "swad_notification.h"
// #include "swad_user.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
@ -62,9 +59,4 @@ void Enr_DB_RemCrsRequests (long CrsCod);
void Enr_DB_RemUsrRequests (long UsrCod);
void Enr_DB_RemoveExpiredEnrolmentRequests (void);
void Enr_DB_InsertAdmin (long UsrCod,HieLvl_Level_t Scope,long Cod);
void Enr_DB_RemAdmin (long UsrCod,HieLvl_Level_t Scope,long Cod);
void Enr_DB_RemUsrAsAdmin (long UsrCod);
void Enr_DB_RemAdmins (HieLvl_Level_t Scope,long Cod);
#endif

View File

@ -30,6 +30,7 @@
#include <stdlib.h> // For free
#include <string.h> // For string functions
#include "swad_admin_database.h"
#include "swad_database.h"
#include "swad_department.h"
#include "swad_enrolment_database.h"
@ -1366,7 +1367,7 @@ void Ins_RemoveInstitution (void)
Fil_RemoveTree (PathIns);
/***** Remove administrators of this institution *****/
Enr_DB_RemAdmins (HieLvl_INS,Ins_EditingIns->InsCod);
Adm_DB_RemAdmins (HieLvl_INS,Ins_EditingIns->InsCod);
/***** Remove institution *****/
DB_QueryDELETE ("can not remove an institution",