From cf357a1eee6f41abc9cf3d4d2d36535602383717 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Fri, 12 Dec 2014 18:50:36 +0100 Subject: [PATCH] Version 14.35 --- Makefile | 2 +- swad_ID.c | 5 +- swad_action.c | 49 +- swad_changelog.h | 7 +- swad_course.c | 3 +- swad_file_browser.c | 1 + swad_import.c | 15 +- swad_mail.c | 5 +- swad_nickname.c | 5 +- swad_notification.c | 5 +- swad_password.c | 5 +- swad_photo.c | 3 +- swad_record.c | 13 +- swad_user.c | 4069 +------------------------------------------ swad_user.h | 82 +- 15 files changed, 126 insertions(+), 4143 deletions(-) diff --git a/Makefile b/Makefile index 4b65c6ba1..845cec68a 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ OBJS = swad_action.o swad_announcement.o swad_assignment.o swad_attendance.o \ swad_banner.o \ swad_centre.o swad_chat.o swad_config.o swad_connected.o swad_country.o swad_course.o swad_cryptography.o \ swad_database.o swad_date.o swad_degree.o swad_department.o \ - swad_exam.o \ + swad_enrollment.o swad_exam.o \ swad_file.o swad_file_browser.o swad_forum.o \ swad_global.o swad_group.o \ swad_holiday.o \ diff --git a/swad_ID.c b/swad_ID.c index b6ae4fe21..4454e7201 100644 --- a/swad_ID.c +++ b/swad_ID.c @@ -31,6 +31,7 @@ #include "swad_bool.h" #include "swad_database.h" +#include "swad_enrollment.h" #include "swad_global.h" #include "swad_ID.h" #include "swad_parameter.h" @@ -557,7 +558,7 @@ void ID_RemoveMyUsrID (void) ID_GetListIDsFromUsrCod (&Gbl.Usrs.Me.UsrDat); /***** Show my account again *****/ - Usr_ShowFormChangeMyAccount (); + Enr_ShowFormChangeMyAccount (); } /*****************************************************************************/ @@ -672,7 +673,7 @@ void ID_NewMyUsrID (void) ID_GetListIDsFromUsrCod (&Gbl.Usrs.Me.UsrDat); /***** Show my account again *****/ - Usr_ShowFormChangeMyAccount (); + Enr_ShowFormChangeMyAccount (); } /*****************************************************************************/ diff --git a/swad_action.c b/swad_action.c index 15e983fda..05b7043d0 100644 --- a/swad_action.c +++ b/swad_action.c @@ -40,6 +40,7 @@ #include "swad_chat.h" #include "swad_database.h" #include "swad_exam.h" +#include "swad_enrollment.h" #include "swad_global.h" #include "swad_ID.h" #include "swad_indicator.h" @@ -1849,10 +1850,10 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActSeeAtt */{ 861, 3,TabUsr,ActSeeAtt ,0x118,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Att_SeeAttEvents ,"rollcall" }, /* ActLstTch */{ 679, 4,TabUsr,ActLstTch ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_SeeTeachers ,"classphototch" }, /* ActLstAdm */{ 587, 5,TabUsr,ActLstAdm ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ListDataAdms ,"listtch" }, - /* ActReqSignUp */{1054, 6,TabUsr,ActReqSignUp ,0x000,0x006,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ReqSignUpInCrs ,"enrollmentrequest" }, - /* ActSeeSignUpReq */{1057, 7,TabUsr,ActSeeSignUpReq ,0x1F0,0x1F0,0x1F0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ShowEnrollmentRequests ,"enrollmentrequest" }, - /* ActReqMdfOneUsr */{ 177, 8,TabUsr,ActReqMdfOneUsr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ReqRegRemUsr ,"config" }, - /* ActReqMdfSevUsr */{ 797, 9,TabUsr,ActReqMdfSevUsr ,0x1F0,0x1E0,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ShowFormRegRemSeveralUsrs ,"configs" }, + /* ActReqSignUp */{1054, 6,TabUsr,ActReqSignUp ,0x000,0x006,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ReqSignUpInCrs ,"enrollmentrequest" }, + /* ActSeeSignUpReq */{1057, 7,TabUsr,ActSeeSignUpReq ,0x1F0,0x1F0,0x1F0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ShowEnrollmentRequests ,"enrollmentrequest" }, + /* ActReqMdfOneUsr */{ 177, 8,TabUsr,ActReqMdfOneUsr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ReqRegRemUsr ,"config" }, + /* ActReqMdfSevUsr */{ 797, 9,TabUsr,ActReqMdfSevUsr ,0x1F0,0x1E0,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ShowFormRegRemSeveralUsrs ,"configs" }, /* ActLstCon */{ 995,10,TabUsr,ActLstCon ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Con_ShowConnectedUsrs ,"userplugged" }, // Actions not in menu: @@ -1920,28 +1921,28 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActRecAttStd */{1072,-1,TabUsr,ActSeeAtt ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Att_RegisterStudentsInAttEvent ,NULL}, /* ActRecAttMe */{1076,-1,TabUsr,ActSeeAtt ,0x008,0x000,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Att_RegisterMeAsStdInAttEvent ,NULL}, - /* ActSignUp */{1056,-1,TabUsr,ActReqSignUp ,0x000,0x006,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_SignUpInCrs ,NULL}, - /* ActReqRejSignUp */{1058,-1,TabUsr,ActSeeSignUpReq ,0x1F0,0x1F0,0x1F0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_AskIfRejectSignUp ,NULL}, - /* ActRejSignUp */{1059,-1,TabUsr,ActSeeSignUpReq ,0x1F0,0x1F0,0x1F0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_RejectSignUp ,NULL}, + /* ActSignUp */{1056,-1,TabUsr,ActReqSignUp ,0x000,0x006,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_SignUpInCrs ,NULL}, + /* ActReqRejSignUp */{1058,-1,TabUsr,ActSeeSignUpReq ,0x1F0,0x1F0,0x1F0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_AskIfRejectSignUp ,NULL}, + /* ActRejSignUp */{1059,-1,TabUsr,ActSeeSignUpReq ,0x1F0,0x1F0,0x1F0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_RejectSignUp ,NULL}, - /* ActReqMdfUsr */{ 161,-1,TabUsr,ActReqMdfOneUsr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_AskIfRegRemAnotherUsr ,NULL}, + /* ActReqMdfUsr */{ 161,-1,TabUsr,ActReqMdfOneUsr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_AskIfRegRemAnotherUsr ,NULL}, /* ActReqUsrPho */{ 375,-1,TabUsr,ActReqMdfOneUsr ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_SendPhotoUsr ,NULL}, /* ActDetUsrPho */{ 695,-1,TabUsr,ActReqMdfOneUsr ,0x1F0,0x1E0,0x1E0,Act_CONTENT_DATA,Act_MAIN_WINDOW,NULL ,Pho_RecUsrPhotoDetFaces ,NULL}, /* ActUpdUsrPho */{ 374,-1,TabUsr,ActReqMdfOneUsr ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pho_UpdateUsrPhoto1 ,Pho_UpdateUsrPhoto2 ,NULL}, /* ActRemUsrPho */{ 429,-1,TabUsr,ActReqMdfOneUsr ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_RemoveUsrPhoto ,NULL}, - /* ActCreOthUsrDat */{ 440,-1,TabUsr,ActReqMdfOneUsr ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_CreatAndShowNewUsrRecordAndRegInCrs,NULL}, - /* ActUpdOthUsrDat */{ 439,-1,TabUsr,ActReqMdfOneUsr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ModifAndShowUsrCardAndRegInCrsAndGrps,NULL}, + /* ActCreOthUsrDat */{ 440,-1,TabUsr,ActReqMdfOneUsr ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_CreatAndShowNewUsrRecordAndRegInCrs,NULL}, + /* ActUpdOthUsrDat */{ 439,-1,TabUsr,ActReqMdfOneUsr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ModifAndShowUsrCardAndRegInCrsAndGrps,NULL}, - /* ActReqAccEnrCrs */{ 592,-1,TabUsr,ActReqMdfOneUsr ,0x1F8,0x000,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ReqAcceptRegisterInCrs ,NULL}, - /* ActAccEnrCrs */{ 558,-1,TabUsr,ActReqMdfOneUsr ,0x1F8,0x000,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_AcceptRegisterMeInCrs ,NULL}, - /* ActRemMeCrs */{ 559,-1,TabUsr,ActReqMdfOneUsr ,0x1F8,0x000,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ReqRemMeFromCrs ,NULL}, + /* ActReqAccEnrCrs */{ 592,-1,TabUsr,ActReqMdfOneUsr ,0x1F8,0x000,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ReqAcceptRegisterInCrs ,NULL}, + /* ActAccEnrCrs */{ 558,-1,TabUsr,ActReqMdfOneUsr ,0x1F8,0x000,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_AcceptRegisterMeInCrs ,NULL}, + /* ActRemMeCrs */{ 559,-1,TabUsr,ActReqMdfOneUsr ,0x1F8,0x000,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ReqRemMeFromCrs ,NULL}, - /* ActNewAdm */{ 586,-1,TabUsr,ActReqMdfOneUsr ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_AddAdmToDeg ,NULL}, - /* ActRemAdm */{ 584,-1,TabUsr,ActReqMdfOneUsr ,0x1E0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_RemAdm ,NULL}, + /* ActNewAdm */{ 586,-1,TabUsr,ActReqMdfOneUsr ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_AddAdmToDeg ,NULL}, + /* ActRemAdm */{ 584,-1,TabUsr,ActReqMdfOneUsr ,0x1E0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_RemAdm ,NULL}, - /* ActRcvFrmMdfUsrCrs*/{ 799,-1,TabUsr,ActReqMdfSevUsr ,0x1F0,0x1E0,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ReceiveFormUsrsCrs ,NULL}, + /* ActRcvFrmMdfUsrCrs*/{ 799,-1,TabUsr,ActReqMdfSevUsr ,0x1F0,0x1E0,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ReceiveFormUsrsCrs ,NULL}, /* ActFrmIDsOthUsr */{1239,-1,TabUsr,ActReqMdfOneUsr ,0x1E0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,ID_ShowFormOthIDs ,NULL}, /* ActRemIDOth */{1240,-1,TabUsr,ActReqMdfOneUsr ,0x1E0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,ID_RemoveOtherUsrID ,NULL}, @@ -1949,14 +1950,14 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActFrmPwdOthUsr */{ 598,-1,TabUsr,ActReqMdfOneUsr ,0x1E0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pwd_ShowFormOthPwd ,NULL}, /* ActChgPwdOthUsr */{ 82,-1,TabUsr,ActReqMdfOneUsr ,0x1E0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pwd_UpdateOtherPwd1 ,Pwd_UpdateOtherPwd2 ,NULL}, - /* ActRemUsrCrs */{ 58,-1,TabUsr,ActReqMdfOneUsr ,0x1F8,0x1E0,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_RemUsrFromCrs ,NULL}, - /* ActRemUsrGbl */{ 62,-1,TabUsr,ActReqMdfOneUsr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_RemUsrGbl ,NULL}, + /* ActRemUsrCrs */{ 58,-1,TabUsr,ActReqMdfOneUsr ,0x1F8,0x1E0,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_RemUsrFromCrs ,NULL}, + /* ActRemUsrGbl */{ 62,-1,TabUsr,ActReqMdfOneUsr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_RemUsrGbl ,NULL}, - /* ActReqRemAllStdCrs*/{ 88,-1,TabUsr,ActReqMdfSevUsr ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_AskRemAllStdsThisCrs ,NULL}, - /* ActRemAllStdCrs */{ 87,-1,TabUsr,ActReqMdfSevUsr ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_RemAllStdsThisCrs ,NULL}, + /* ActReqRemAllStdCrs*/{ 88,-1,TabUsr,ActReqMdfSevUsr ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_AskRemAllStdsThisCrs ,NULL}, + /* ActRemAllStdCrs */{ 87,-1,TabUsr,ActReqMdfSevUsr ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_RemAllStdsThisCrs ,NULL}, - /* ActReqRemOldUsr */{ 590,-1,TabUsr,ActReqMdfSevUsr ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_AskRemoveOldUsrs ,NULL}, - /* ActRemOldUsr */{ 773,-1,TabUsr,ActReqMdfSevUsr ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_RemoveOldUsrs ,NULL}, + /* ActReqRemOldUsr */{ 590,-1,TabUsr,ActReqMdfSevUsr ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_AskRemoveOldUsrs ,NULL}, + /* ActRemOldUsr */{ 773,-1,TabUsr,ActReqMdfSevUsr ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_RemoveOldUsrs ,NULL}, // TabMsg ****************************************************************** // Actions in menu: @@ -2185,7 +2186,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = // TabPrf ****************************************************************** // Actions in menu: /* ActFrmLogIn */{ 843, 0,TabPrf,ActFrmLogIn ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_WriteFormLoginLogout ,"keyuser" }, - /* ActFrmUsrAcc */{ 36, 1,TabPrf,ActFrmUsrAcc ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ShowFormAccount ,"arroba" }, + /* ActFrmUsrAcc */{ 36, 1,TabPrf,ActFrmUsrAcc ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ShowFormAccount ,"arroba" }, /* ActReqSndNewPwd */{ 665, 2,TabPrf,ActReqSndNewPwd ,0x000,0x001,0x001,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pwd_ShowFormSendNewPwd ,"key" }, /* ActFrmChgMyPwd */{ 34, 3,TabPrf,ActFrmChgMyPwd ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pwd_ShowFormChgPwd ,"key" }, /* ActReqEdiRecCom */{ 285, 4,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Rec_ShowFormMyCommRecord ,"card" }, @@ -2207,7 +2208,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActChgMyRol */{ 589,-1,TabPrf,ActFrmLogIn ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Usr_ChangeMyRole ,Usr_ShowFormsRoleAndLogout ,NULL}, - /* ActCreUsrAcc */{1163,-1,TabPrf,ActFrmUsrAcc ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_AfterCreationNewAccount ,NULL}, + /* ActCreUsrAcc */{1163,-1,TabPrf,ActFrmUsrAcc ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_AfterCreationNewAccount ,NULL}, /* ActRemIDMe */{1147,-1,TabPrf,ActFrmUsrAcc ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,ID_RemoveMyUsrID ,NULL}, /* ActNewIDMe */{1148,-1,TabPrf,ActFrmUsrAcc ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,ID_NewMyUsrID ,NULL}, diff --git a/swad_changelog.h b/swad_changelog.h index 8f59b4ce1..a07fb3df8 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -35,12 +35,17 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 14.34.4 (2014/12/08)" +#define Log_PLATFORM_VERSION "SWAD 14.35 (2014/12/12)" // 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.35 :Dic 12, 2014 New MIME type, suggested by Benito Palacios. + New module swad_enrollment for enrollment (registration) or removing of users. (170725 lines) + 1 change necessary in Makefile: +Add swad_enrollment.o to list of object files + Version 14.34.4 :Dic 08, 2014 Some messages translated. (170623 lines) Version 14.34.3 :Dic 08, 2014 Tables are printed with rounded corners. (170602 lines) Version 14.34.2 :Dic 08, 2014 Button to show more details on list of attendances. (170728 lines) diff --git a/swad_course.c b/swad_course.c index 44604c9e3..a04924f8a 100644 --- a/swad_course.c +++ b/swad_course.c @@ -35,6 +35,7 @@ #include "swad_constant.h" #include "swad_database.h" #include "swad_degree.h" +#include "swad_enrollment.h" #include "swad_exam.h" #include "swad_global.h" #include "swad_indicator.h" @@ -1884,7 +1885,7 @@ static void Crs_EmptyCourseCompletely (long CrsCod) Crs_GetDataOfCourseByCod (&Crs); /***** Remove all the students in the course *****/ - Usr_RemAllStdsInCrs (&Crs); + Enr_RemAllStdsInCrs (&Crs); /***** Set all the notifications from the course as removed, except notifications about new messages *****/ diff --git a/swad_file_browser.c b/swad_file_browser.c index a52787ac1..8c9ead6aa 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -853,6 +853,7 @@ const char *Brw_MIMETypesAllowed[] = "video/x-ms-wmv", // WMV (Windows Media File) "video/x-msvideo", // AVI "x-world/x-vrml", // VRML Worlds wrl + "x-java", // Source code in Java "zz-application/zz-winassoc-cdr", // Corel Draw (CDR) "zz-application/zz-winassoc-mpp" // Microsoft Project mpp }; diff --git a/swad_import.c b/swad_import.c index 685cd59e9..2c0f04c37 100644 --- a/swad_import.c +++ b/swad_import.c @@ -34,6 +34,7 @@ #include "swad_config.h" #include "swad_database.h" +#include "swad_enrollment.h" #include "swad_global.h" #include "swad_ID.h" #include "swad_import.h" @@ -202,7 +203,7 @@ void Imp_ImportStdsFromAnImpGrp (long ImpGrpCod,struct ListCodGrps *LstGrps,unsi UsrDat.Sex = ImpStd.Sex; /* Update user's data */ - Usr_UpdateUsrData (&UsrDat); + Enr_UpdateUsrData (&UsrDat); /* Update e-mail */ if (!UsrDat.Email[0]) @@ -214,11 +215,11 @@ void Imp_ImportStdsFromAnImpGrp (long ImpGrpCod,struct ListCodGrps *LstGrps,unsi } if (UsrDat.RoleInCurrentCrsDB == Rol_ROLE_STUDENT) // He/she was already a student in current course - Usr_AcceptUsrInCrs (UsrDat.UsrCod); + Enr_AcceptUsrInCrs (UsrDat.UsrCod); else // He/she not belonged to the current course /* Register user as student in the current course */ - Usr_RegisterUsrInCurrentCrs (&UsrDat,Rol_ROLE_STUDENT, - Cns_QUIET,Usr_SET_ACCEPTED_TO_TRUE); + Enr_RegisterUsrInCurrentCrs (&UsrDat,Rol_ROLE_STUDENT, + Cns_QUIET,Enr_SET_ACCEPTED_TO_TRUE); /* Register user in the selected groups */ if (Gbl.CurrentCrs.Grps.NumGrps) // If there are groups in current course @@ -245,15 +246,15 @@ void Imp_ImportStdsFromAnImpGrp (long ImpGrpCod,struct ListCodGrps *LstGrps,unsi /* Create user */ UsrDat.IDs.List[0].Confirmed = true; // If he/she is a new user ==> his/her ID will be stored as confirmed in database - Usr_CreateNewUsr (&UsrDat); + Enr_CreateNewUsr (&UsrDat); /* Update e-mail */ if (!Mai_UpdateEmailInDB (&UsrDat,UsrDat.Email)) // Email was already registered and confirmed by another user UsrDat.Email[0] = '\0'; /* Register user as student in the current course */ - Usr_RegisterUsrInCurrentCrs (&UsrDat,Rol_ROLE_STUDENT, - Cns_QUIET,Usr_SET_ACCEPTED_TO_TRUE); + Enr_RegisterUsrInCurrentCrs (&UsrDat,Rol_ROLE_STUDENT, + Cns_QUIET,Enr_SET_ACCEPTED_TO_TRUE); /* Register user in the selected groups */ if (Gbl.CurrentCrs.Grps.NumGrps) // If there are groups in current course diff --git a/swad_mail.c b/swad_mail.c index 3abb1db23..3efb4b86b 100644 --- a/swad_mail.c +++ b/swad_mail.c @@ -32,6 +32,7 @@ #include // For access, lstat, getpid, chdir, symlink, unlink #include "swad_database.h" +#include "swad_enrollment.h" #include "swad_global.h" #include "swad_mail.h" #include "swad_parameter.h" @@ -1108,7 +1109,7 @@ void Mai_RemoveEmail (void) Lay_ShowAlert (Lay_WARNING,Txt_You_can_not_delete_your_current_email); /***** Show my account again *****/ - Usr_ShowFormChangeMyAccount (); + Enr_ShowFormChangeMyAccount (); } /*****************************************************************************/ @@ -1188,7 +1189,7 @@ void Mai_UpdateEmail (void) } /***** Show my account again *****/ - Usr_ShowFormChangeMyAccount (); + Enr_ShowFormChangeMyAccount (); } /*****************************************************************************/ diff --git a/swad_nickname.c b/swad_nickname.c index f0ad8d34f..3e604611c 100644 --- a/swad_nickname.c +++ b/swad_nickname.c @@ -28,6 +28,7 @@ #include // For string functions #include "swad_database.h" +#include "swad_enrollment.h" #include "swad_global.h" #include "swad_parameter.h" #include "swad_QR.h" @@ -310,7 +311,7 @@ void Nck_RemoveNick (void) Lay_ShowAlert (Lay_WARNING,Txt_You_can_not_delete_your_current_nickname); /***** Show my account again *****/ - Usr_ShowFormChangeMyAccount (); + Enr_ShowFormChangeMyAccount (); } /*****************************************************************************/ @@ -405,7 +406,7 @@ void Nck_UpdateNick (void) Gbl.Message); /***** Show my account again *****/ - Usr_ShowFormChangeMyAccount (); + Enr_ShowFormChangeMyAccount (); } /*****************************************************************************/ diff --git a/swad_notification.c b/swad_notification.c index 67476e121..3cfcdc69b 100644 --- a/swad_notification.c +++ b/swad_notification.c @@ -35,6 +35,7 @@ #include "swad_config.h" #include "swad_config.h" #include "swad_database.h" +#include "swad_enrollment.h" #include "swad_exam.h" #include "swad_global.h" #include "swad_mark.h" @@ -699,10 +700,10 @@ void Ntf_GetNotifSummaryAndContent (char *SummaryStr,char **ContentStr,Ntf_Notif Mrk_GetNotifMyMarks (SummaryStr,ContentStr,Cod,UsrCod,MaxChars,GetContent); break; case Ntf_EVENT_ENROLLMENT: - Usr_GetNotifEnrollment (SummaryStr,CrsCod,UsrCod,MaxChars); + Enr_GetNotifEnrollment (SummaryStr,CrsCod,UsrCod,MaxChars); break; case Ntf_EVENT_ENROLLMENT_REQUEST: - Usr_GetNotifEnrollmentRequest (SummaryStr,ContentStr,Cod,MaxChars,GetContent); + Enr_GetNotifEnrollmentRequest (SummaryStr,ContentStr,Cod,MaxChars,GetContent); break; case Ntf_EVENT_NOTICE: Not_GetNotifNotice (SummaryStr,ContentStr,Cod,MaxChars,GetContent); diff --git a/swad_password.c b/swad_password.c index 4f0642046..7392d6af9 100644 --- a/swad_password.c +++ b/swad_password.c @@ -31,6 +31,7 @@ #include // For unlink #include "swad_database.h" +#include "swad_enrollment.h" #include "swad_global.h" #include "swad_ID.h" #include "swad_password.h" @@ -184,7 +185,7 @@ void Pwd_ActChgMyPwd1 (void) { strcpy (Gbl.Usrs.Me.UsrDat.Password,NewEncryptedPassword); Ses_UpdateSessionDataInDB (); - Usr_UpdateUsrData (&Gbl.Usrs.Me.UsrDat); + Enr_UpdateUsrData (&Gbl.Usrs.Me.UsrDat); strcpy (Gbl.Message,Txt_Your_password_has_been_changed_successfully); Gbl.Usrs.Error = false; } @@ -472,7 +473,7 @@ void Pwd_UpdateOtherPwd1 (void) { /* Update other user's data */ strcpy (Gbl.Usrs.Other.UsrDat.Password,NewEncryptedPassword); - Usr_UpdateUsrData (&Gbl.Usrs.Other.UsrDat); + Enr_UpdateUsrData (&Gbl.Usrs.Other.UsrDat); sprintf (Gbl.Message,Txt_The_X_password_has_been_changed_successfully, Gbl.Usrs.Other.UsrDat.FullName); diff --git a/swad_photo.c b/swad_photo.c index cc83925ce..635cac04a 100644 --- a/swad_photo.c +++ b/swad_photo.c @@ -36,6 +36,7 @@ #include "swad_action.h" #include "swad_config.h" #include "swad_database.h" +#include "swad_enrollment.h" #include "swad_file.h" #include "swad_file_browser.h" #include "swad_global.h" @@ -660,7 +661,7 @@ static void Pho_UpdatePhoto1 (struct UsrData *UsrDat) Pho_UpdatePhotoName (UsrDat); /* Remove the user from the list of users without photo */ - Usr_RemoveUsrFromTableClicksWithoutPhoto (UsrDat->UsrCod); + Enr_RemoveUsrFromTableClicksWithoutPhoto (UsrDat->UsrCod); Gbl.Error = false; } diff --git a/swad_record.c b/swad_record.c index d92b41a0c..e0b8737a9 100644 --- a/swad_record.c +++ b/swad_record.c @@ -33,6 +33,7 @@ #include "swad_action.h" #include "swad_config.h" #include "swad_database.h" +#include "swad_enrollment.h" #include "swad_global.h" #include "swad_ID.h" #include "swad_network.h" @@ -2338,7 +2339,7 @@ void Rec_ShowCommonRecord (Rec_RecordViewType_t TypeOfView, if (UsrDat->RoleInCurrentCrsDB < Rol_ROLE_STUDENT) // The other user does not belong to current course { /* If there is a request of this user, default role is the requested role */ - if ((DefaultRoleInCurrentCrs = Usr_GetRequestedRole (UsrDat->UsrCod)) == Rol_ROLE_UNKNOWN) + if ((DefaultRoleInCurrentCrs = Enr_GetRequestedRole (UsrDat->UsrCod)) == Rol_ROLE_UNKNOWN) DefaultRoleInCurrentCrs = (UsrDat->Roles & (1 << Rol_ROLE_TEACHER)) ? Rol_ROLE_TEACHER : Rol_ROLE_STUDENT; } @@ -2799,7 +2800,7 @@ void Rec_UpdateMyRecord (void) Rec_GetUsrExtraDataFromRecordForm (&Gbl.Usrs.Me.UsrDat); /***** Update my data in database *****/ - Usr_UpdateUsrData (&Gbl.Usrs.Me.UsrDat); + Enr_UpdateUsrData (&Gbl.Usrs.Me.UsrDat); } /*****************************************************************************/ @@ -3215,7 +3216,7 @@ void Rec_ChgCountryOfMyInstitution (void) Gbl.Usrs.Me.UsrDat.InsCod = -1L; Gbl.Usrs.Me.UsrDat.Tch.CtrCod = -1L; Gbl.Usrs.Me.UsrDat.Tch.DptCod = -1L; - Usr_UpdateInstitutionCentreDepartment (); + Enr_UpdateInstitutionCentreDepartment (); /***** Show form again *****/ Rec_ShowFormMyInsCtrDpt (); @@ -3246,7 +3247,7 @@ void Rec_UpdateMyInstitution (void) Gbl.Usrs.Me.UsrDat.InsCod = Ins.InsCod; Gbl.Usrs.Me.UsrDat.Tch.CtrCod = -1L; Gbl.Usrs.Me.UsrDat.Tch.DptCod = -1L; - Usr_UpdateInstitutionCentreDepartment (); + Enr_UpdateInstitutionCentreDepartment (); /***** Show form again *****/ Rec_ShowFormMyInsCtrDpt (); @@ -3278,7 +3279,7 @@ void Rec_UpdateMyCentre (void) /***** Update institution, centre and department *****/ Gbl.Usrs.Me.UsrDat.Tch.CtrCod = Ctr.CtrCod; - Usr_UpdateInstitutionCentreDepartment (); + Enr_UpdateInstitutionCentreDepartment (); /***** Show form again *****/ Rec_ShowFormMyInsCtrDpt (); @@ -3310,7 +3311,7 @@ void Rec_UpdateMyDepartment (void) /***** Update institution, centre and department *****/ Gbl.Usrs.Me.UsrDat.Tch.DptCod = Dpt.DptCod; - Usr_UpdateInstitutionCentreDepartment (); + Enr_UpdateInstitutionCentreDepartment (); /***** Show form again *****/ Rec_ShowFormMyInsCtrDpt (); diff --git a/swad_user.c b/swad_user.c index dcd03ac9a..0a46d7756 100644 --- a/swad_user.c +++ b/swad_user.c @@ -39,6 +39,7 @@ #include "swad_connected.h" #include "swad_course.h" #include "swad_database.h" +#include "swad_enrollment.h" #include "swad_global.h" #include "swad_group.h" #include "swad_ID.h" @@ -92,39 +93,12 @@ const char *Usr_UsrDatMainFieldNames[Usr_NUM_MAIN_FIELDS_DATA_USR]; /****************************** Internal types *******************************/ /*****************************************************************************/ -#define Usr_NUM_ACTIONS_REG_REM_ONE_USR 5 -typedef enum - { - Usr_REGISTER_MODIFY_ONE_USR_IN_CRS = 0, - Usr_REGISTER_ONE_DEGREE_ADMIN = 1, - Usr_REMOVE_ONE_USR_FROM_CRS = 2, - Usr_REMOVE_ONE_DEGREE_ADMIN = 3, - Usr_ELIMINATE_ONE_USR_FROM_PLATFORM = 4, - } Usr_RegRemOneUsrAction_t; - -#define Usr_NUM_ACTIONS_REG_REM_USRS 5 -typedef enum - { - Usr_REGISTER_SPECIFIED_USRS_IN_CRS = 0, - Usr_REMOVE_SPECIFIED_USRS_FROM_CRS = 1, - Usr_REMOVE_NOT_SPECIFIED_USRS_FROM_CRS = 2, - Usr_UPDATE_USRS_IN_CRS = 3, - Usr_ELIMINATE_USRS_FROM_PLATFORM = 4, - } Usr_RegRemUsrsAction_t; - -typedef enum - { - Usr_DO_NOT_REMOVE_WORKS, - Usr_REMOVE_WORKS, - } Usr_RemoveUsrWorks_t; - /*****************************************************************************/ /************** External global variables from others modules ****************/ /*****************************************************************************/ extern struct Globals Gbl; extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS]; -const char *Txt_RECORD_FIELD_VISIBILITY_RECORD[Rec_NUM_TYPES_VISIBILITY]; /*****************************************************************************/ /************************* Internal global variables *************************/ @@ -137,15 +111,6 @@ const char *Txt_RECORD_FIELD_VISIBILITY_RECORD[Rec_NUM_TYPES_VISIBILITY]; static void Usr_GetMyLastData (void); static void Usr_GetUsrCommentsFromString (char *Str,struct UsrData *UsrDat); static Usr_Sex_t Usr_GetSexFromStr (const char *Str); -static Rol_Role_t Usr_GetRoleInCrs (long CrsCod,long UsrCod); -static void Usr_ModifyRoleInCurrentCrs (struct UsrData *UsrDat, - Rol_Role_t NewRole, - Cns_QuietOrVerbose_t QuietOrVerbose, - Usr_KeepOrSetAccepted_t KeepOrSetAccepted); - -static void Usr_PutFormToRemOldUsrs (void); - -static bool Usr_ChkIfEncryptedUsrCodExists (const char *EncryptedUsrCod); static bool Usr_CheckIfMyBirthdayHasNotBeenCongratulated (void); static void Usr_InsertMyBirthday (void); @@ -153,36 +118,16 @@ static unsigned Usr_GetNumAvailableRoles (void); static void Usr_PutFormToChangeMyRole (bool FormInHead); static void Usr_GetParamOtherUsrIDNickOrEMail (void); -static unsigned Usr_GetParamOtherUsrIDNickOrEMailAndGetUsrCods (struct ListUsrCods *ListUsrCods); static bool Usr_ChkUsrAndGetUsrDataFromDirectLogin (void); static bool Usr_ChkUsrAndGetUsrDataFromExternalLogin (void); static bool Usr_ChkUsrAndGetUsrDataFromSession (void); -static bool Usr_CreateNewAccountAndLogIn (void); static void Usr_SetUsrRoleAndPrefs (void); static Rol_Role_t Usr_GetMaxRole (unsigned Roles); -static void Usr_ShowFormRequestNewAccountWithParams (const char *NewNicknameWithoutArroba, - const char *NewEmail); -static bool Usr_GetParamsNewAccount (char *NewNicknameWithoutArroba, - char *NewEmail, - char *NewEncryptedPassword); -static void Usr_PutLinkToRemoveMyAccount (void); -static void Usr_PrintAccountSeparator (void); - static void Usr_InsertMyLastData (void); -static void Usr_CreateNewEncryptedUsrCod (struct UsrData *UsrDat); -static void Usr_FilterUsrDat (struct UsrData *UsrDat); -static void Usr_RegisterAdminInCurrentDeg (struct UsrData *UsrDat); -static void Usr_EffectivelyRemUsrFromCrs (struct UsrData *UsrDat,struct Course *Crs, - Usr_RemoveUsrWorks_t RemoveUsrWorks,Cns_QuietOrVerbose_t QuietOrVerbose); -static void Usr_EffectivelyRemAdmFromDeg (struct UsrData *UsrDat); -static void Usr_DeleteUsrFromPlatform (struct UsrData *UsrDat, - Cns_QuietOrVerbose_t QuietOrVerbose); -static void Usr_RemoveUsr (struct UsrData *UsrDat); - static void Usr_WriteRowGstMainData (unsigned NumUsr,struct UsrData *UsrDat); static void Usr_WriteRowTchMainData (unsigned NumUsr,struct UsrData *UsrDat,bool PutCheckboxToSelectUsr); static void Usr_WriteRowGstAllData (struct UsrData *UsrDat); @@ -226,40 +171,56 @@ static void Usr_PutLinkToListOfficialStudents (void); static void Usr_DrawClassPhoto (Usr_ClassPhotoType_t ClassPhotoType, Rol_Role_t RoleInClassPhoto); -static void Usr_PutAreaToEnterUsrsIDs (void); -static bool Usr_PutActionsRegRemOneUsr (bool ItsMe); -static bool Usr_CheckIfICanEliminateAccount (bool ItsMe); -static void Usr_PutActionsRegRemSeveralUsrs (void); -static void Usr_PutAllRolesRegRemUsrsCrs (void); -static void Usr_PutOneRoleRegRemUsrsCrs (Rol_Role_t Role,bool Checked); - -static void Usr_RegisterUsr (struct UsrData *UsrDat,Rol_Role_t RegRemRole, - struct ListCodGrps *LstGrps,unsigned *NumUsrsRegistered); -static void Usr_MarkOfficialStdsAsRemovable (long ImpGrpCod,bool RemoveSpecifiedUsrs); - -static void Usr_PutFormToRemAllStdsThisCrs (void); -static void Usr_RemoveEnrollmentRequest (long CrsCod,long UsrCod); - -static void Usr_ReqAnotherUsrIDToRegisterRemove (void); -static void Usr_AskIfRegRemMe (void); -static void Usr_AskIfRegRemUsr (struct ListUsrCods *ListUsrCods); - -static void Usr_ShowFormToEditOtherUsr (void); - -static void Usr_ReqRemAdmOfDeg (void); -static void Usr_ReqRemOrRemAdm (Usr_ReqDelOrDelUsr_t ReqDelOrDelUsr); - -static void Usr_AskIfRemoveUsrFromCrs (struct UsrData *UsrDat,bool ItsMe); -static void Usr_AskIfCompletelyEliminateUsrFromPlatform (bool ItsMe); -static void Usr_ReqAddAdmOfDeg (void); - -static void Usr_ConstructPathUsr (long UsrCod,char *PathUsr); - static unsigned Usr_GetNumUsrsNotBelongingToAnyCrs (void); static unsigned Usr_GetNumUsrsBelongingToAnyCrs (Rol_Role_t Role); static float Usr_GetNumCrssPerUsr (Rol_Role_t Role); static float Usr_GetNumUsrsPerCrs (Rol_Role_t Role); +/*****************************************************************************/ +/********************* Write selector of users' roles ************************/ +/*****************************************************************************/ + +void Usr_WriteSelectorRoles (unsigned Roles) + { + extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; + Rol_Role_t Role; + + for (Role = Rol_ROLE_STUDENT; + Role <= Rol_ROLE_TEACHER; + Role++) + { + fprintf (Gbl.F.Out,"%s
", + Txt_ROLES_PLURAL_abc[Role][Usr_SEX_UNKNOWN]); + } + } + +/*****************************************************************************/ +/************************* Get selected users' roles *************************/ +/*****************************************************************************/ + +void Usr_GetSelectedRoles (unsigned *Roles) + { + char StrRoles[(10+1)*2]; + const char *Ptr; + char UnsignedStr[10+1]; + Rol_Role_t Role; + + Par_GetParMultiToText ("Roles",StrRoles,(10+1)*2); + *Roles = 0; + for (Ptr = StrRoles; + *Ptr;) + { + Par_GetNextStrUntilSeparParamMult (&Ptr,UnsignedStr,10); + if (sscanf (UnsignedStr,"%u",&Role) != 1) + Lay_ShowErrorAndExit ("can not get user's role"); + *Roles |= (1 << Role); + } + } + /*****************************************************************************/ /**** Show alert about number of clicks remaining before sending my photo ****/ /*****************************************************************************/ @@ -852,7 +813,7 @@ Rol_Role_t Usr_GetMyRoleInCrs (long CrsCod) /********************** Get role of a user in a course ***********************/ /*****************************************************************************/ -static Rol_Role_t Usr_GetRoleInCrs (long CrsCod,long UsrCod) +Rol_Role_t Usr_GetRoleInCrs (long CrsCod,long UsrCod) { char Query[256]; MYSQL_RES *mysql_res; @@ -917,69 +878,6 @@ unsigned Usr_GetRolesInAllCrss (long UsrCod) return Roles; } -/*****************************************************************************/ -/***************** Modify the role of a user in a course *********************/ -/*****************************************************************************/ - -static void Usr_ModifyRoleInCurrentCrs (struct UsrData *UsrDat, - Rol_Role_t NewRole, - Cns_QuietOrVerbose_t QuietOrVerbose, - Usr_KeepOrSetAccepted_t KeepOrSetAccepted) - { - extern const char *Txt_The_role_of_THE_USER_X_in_the_course_Y_has_changed_from_A_to_B; - extern const char *Txt_ROLES_SINGULAR_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - char Query[256]; - Rol_Role_t OldRole; - - /***** Change user's role if different *****/ - OldRole = Usr_GetRoleInCrs (Gbl.CurrentCrs.Crs.CrsCod,UsrDat->UsrCod); - if (NewRole != OldRole) // The role must be updated - { - /***** Check if user's role is allowed *****/ - if (!(NewRole == Rol_ROLE_STUDENT || - NewRole == Rol_ROLE_TEACHER)) - Lay_ShowErrorAndExit ("Wrong role."); - - /***** Update the role of a user in a course *****/ - sprintf (Query,"UPDATE crs_usr SET Role='%u'" - " WHERE CrsCod='%ld' AND UsrCod='%ld'", - (unsigned) NewRole,Gbl.CurrentCrs.Crs.CrsCod,UsrDat->UsrCod); - DB_QueryUPDATE (Query,"can not modify user's role in course"); - - /***** Show info message *****/ - if (QuietOrVerbose == Cns_VERBOSE) - { - sprintf (Gbl.Message,Txt_The_role_of_THE_USER_X_in_the_course_Y_has_changed_from_A_to_B, - UsrDat->FullName,Gbl.CurrentCrs.Crs.FullName, - Txt_ROLES_SINGULAR_abc[OldRole][UsrDat->Sex], - Txt_ROLES_SINGULAR_abc[NewRole][UsrDat->Sex]); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - - UsrDat->RoleInCurrentCrsDB = NewRole; - UsrDat->Roles |= (1 << NewRole); - } - - /***** Set user's acceptation to true in the current course *****/ - if (KeepOrSetAccepted == Usr_SET_ACCEPTED_TO_TRUE) - Usr_AcceptUsrInCrs (UsrDat->UsrCod); // Confirm user enrollment - } - -/*****************************************************************************/ -/********* Set a user's acceptation to true in the current course ************/ -/*****************************************************************************/ - -void Usr_AcceptUsrInCrs (long UsrCod) - { - char Query[512]; - - /***** Set enrollment of a user to "accepted" in the current course *****/ - sprintf (Query,"UPDATE crs_usr SET Accepted='Y'" - " WHERE CrsCod='%ld' AND UsrCod='%ld'", - Gbl.CurrentCrs.Crs.CrsCod,UsrCod); - DB_QueryUPDATE (Query,"can not confirm user's enrollment"); - } - /*****************************************************************************/ /********** Build full name using FirstName, Surname1 and Surname2 ***********/ /*****************************************************************************/ @@ -1515,149 +1413,11 @@ unsigned long Usr_GetCrssFromUsr (long UsrCod,long DegCod,MYSQL_RES **mysql_res) return DB_QuerySELECT (Query,mysql_res,"can not get the courses a user belongs to"); } -/*****************************************************************************/ -/******************** Put a link (form) to remove old users ******************/ -/*****************************************************************************/ - -static void Usr_PutFormToRemOldUsrs (void) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_Remove_old_users; - - /***** Put form to remove old users *****/ - Act_FormStart (ActReqRemOldUsr); - Act_LinkFormSubmit (Txt_Remove_old_users,The_ClassFormul[Gbl.Prefs.Theme]); - Lay_PutSendIcon ("delon",Txt_Remove_old_users,Txt_Remove_old_users); - fprintf (Gbl.F.Out,""); - } - -/*****************************************************************************/ -/*********************** Write form to remove old users **********************/ -/*****************************************************************************/ - -void Usr_AskRemoveOldUsrs (void) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_Eliminate_all_users_who_are_not_enrolled_on_any_courses_PART_1_OF_2; - extern const char *Txt_Eliminate_all_users_who_are_not_enrolled_on_any_courses_PART_2_OF_2; - extern const char *Txt_Eliminate; - unsigned MonthsWithoutAccess = Usr_DEF_MONTHS_WITHOUT_ACCESS_TO_REMOVE_OLD_USRS; - unsigned i; - - /***** Form to request number of months without clicks *****/ - fprintf (Gbl.F.Out,"
"); - Act_FormStart (ActRemOldUsr); - fprintf (Gbl.F.Out,"%s ", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_Eliminate_all_users_who_are_not_enrolled_on_any_courses_PART_1_OF_2); - fprintf (Gbl.F.Out,"" - " ", - The_ClassFormul[Gbl.Prefs.Theme]); - fprintf (Gbl.F.Out,Txt_Eliminate_all_users_who_are_not_enrolled_on_any_courses_PART_2_OF_2, - Cfg_PLATFORM_SHORT_NAME); - fprintf (Gbl.F.Out,""); - - /***** Send button*****/ - Lay_PutSendButton (Txt_Eliminate); - fprintf (Gbl.F.Out,"" - "
"); - } - -/*****************************************************************************/ -/****************************** Remove old users *****************************/ -/*****************************************************************************/ - -void Usr_RemoveOldUsrs (void) - { - extern const char *Txt_Eliminating_X_users_who_were_not_enrolled_in_any_course_and_with_more_than_Y_months_without_access_to_Z; - extern const char *Txt_X_users_have_been_eliminated; - char UnsignedStr[10+1]; - unsigned MonthsWithoutAccess; - unsigned long SecondsWithoutAccess; - char Query[1024]; - MYSQL_RES *mysql_res; - MYSQL_ROW row; - unsigned long NumUsr; - unsigned long NumUsrs; - unsigned NumUsrsEliminated = 0; - struct UsrData UsrDat; - - /***** Get parameter with number of months without access *****/ - Par_GetParToText ("Months",UnsignedStr,10); - if (sscanf (UnsignedStr,"%u",&MonthsWithoutAccess) != 1) - Lay_ShowErrorAndExit ("Number of months without clicks is missing."); - if (MonthsWithoutAccess < Usr_MIN_MONTHS_WITHOUT_ACCESS_TO_REMOVE_OLD_USRS || - MonthsWithoutAccess > Usr_MAX_MONTHS_WITHOUT_ACCESS_TO_REMOVE_OLD_USRS) - Lay_ShowErrorAndExit ("Wrong number of months without clicks."); - SecondsWithoutAccess = (unsigned long) MonthsWithoutAccess * Dat_SECONDS_IN_ONE_MONTH; - - /***** Get old users from database *****/ - sprintf (Query,"SELECT UsrCod FROM" - "(" - "SELECT UsrCod FROM usr_last WHERE" - " UNIX_TIMESTAMP(LastTime) < UNIX_TIMESTAMP()-%lu" - " UNION " - "SELECT UsrCod FROM usr_data WHERE" - " UsrCod NOT IN (SELECT UsrCod FROM usr_last)" - ") AS candidate_usrs" - " WHERE UsrCod NOT IN (SELECT DISTINCT UsrCod FROM crs_usr)", - SecondsWithoutAccess); - if ((NumUsrs = DB_QuerySELECT (Query,&mysql_res,"can not get old users"))) - { - sprintf (Gbl.Message,Txt_Eliminating_X_users_who_were_not_enrolled_in_any_course_and_with_more_than_Y_months_without_access_to_Z, - NumUsrs, - MonthsWithoutAccess, - Cfg_PLATFORM_SHORT_NAME); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - - /***** Initialize structure with user's data *****/ - Usr_UsrDataConstructor (&UsrDat); - - /***** Remove users *****/ - for (NumUsr = 0; - NumUsr < NumUsrs; - NumUsr++) - { - row = mysql_fetch_row (mysql_res); - UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]); - if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat)) // If user's data exist... - { - Usr_DeleteUsrFromPlatform (&UsrDat,Cns_QUIET); - NumUsrsEliminated++; - } - } - - /***** Free memory used for user's data *****/ - Usr_UsrDataDestructor (&UsrDat); - - /***** Free structure that stores the query result *****/ - DB_FreeMySQLResult (&mysql_res); - - /***** Move unused contents of messages to table of deleted contents of messages *****/ - Msg_MoveUnusedMsgsContentToDeleted (); - } - - /***** Write end message *****/ - sprintf (Gbl.Message,Txt_X_users_have_been_eliminated, - NumUsrsEliminated); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - /*****************************************************************************/ /******** Check if a user exists with a given encrypted user's code **********/ /*****************************************************************************/ -static bool Usr_ChkIfEncryptedUsrCodExists (const char *EncryptedUsrCod) +bool Usr_ChkIfEncryptedUsrCodExists (const char *EncryptedUsrCod) { char Query[512]; @@ -1667,59 +1427,6 @@ static bool Usr_ChkIfEncryptedUsrCodExists (const char *EncryptedUsrCod) return (DB_QueryCOUNT (Query,"can not check if an encrypted user's code already existed") != 0); } -/*****************************************************************************/ -/****** Request acceptation / refusion of register in current course *********/ -/*****************************************************************************/ - -void Usr_ReqAcceptRegisterInCrs (void) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_A_teacher_or_administrator_has_enrolled_you_into_the_course_; - extern const char *Txt_Confirm_my_enrollment; - extern const char *Txt_Remove_me_from_this_course; - - /***** Show message *****/ - sprintf (Gbl.Message,Txt_A_teacher_or_administrator_has_enrolled_you_into_the_course_, - Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - - /***** Send button to accept register in the current course *****/ - fprintf (Gbl.F.Out,"
"); - Act_FormStart (ActAccEnrCrs); - Act_LinkFormSubmit (Txt_Confirm_my_enrollment,The_ClassFormul[Gbl.Prefs.Theme]); - Lay_PutSendIcon ("ok_green",Txt_Confirm_my_enrollment,Txt_Confirm_my_enrollment); - fprintf (Gbl.F.Out,""); - - /***** Send button to refuse register in the current course *****/ - Act_FormStart (ActRemMeCrs); - Act_LinkFormSubmit (Txt_Remove_me_from_this_course,The_ClassFormul[Gbl.Prefs.Theme]); - Lay_PutSendIcon ("delon",Txt_Remove_me_from_this_course,Txt_Remove_me_from_this_course); - fprintf (Gbl.F.Out,"" - "
"); - - /***** Mark possible notification as seen *****/ - Ntf_SetNotifAsSeen (Ntf_EVENT_ENROLLMENT, - -1L, - Gbl.Usrs.Me.UsrDat.UsrCod); - } - -/*****************************************************************************/ -/*************** Accept my enrollment in the current course ******************/ -/*****************************************************************************/ - -void Usr_AcceptRegisterMeInCrs (void) - { - extern const char *Txt_You_have_confirmed_your_enrollment_in_the_course_X; - - /***** Confirm my enrollment *****/ - Usr_AcceptUsrInCrs (Gbl.Usrs.Me.UsrDat.UsrCod); - - /***** Confirmation message *****/ - sprintf (Gbl.Message,Txt_You_have_confirmed_your_enrollment_in_the_course_X, - Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - /*****************************************************************************/ /****************** Write form for user log in or log out ********************/ /*****************************************************************************/ @@ -2115,7 +1822,7 @@ static void Usr_GetParamOtherUsrIDNickOrEMail (void) /*****************************************************************************/ // Returns the number of users for a given ID, @nick or e-mail -static unsigned Usr_GetParamOtherUsrIDNickOrEMailAndGetUsrCods (struct ListUsrCods *ListUsrCods) +unsigned Usr_GetParamOtherUsrIDNickOrEMailAndGetUsrCods (struct ListUsrCods *ListUsrCods) { extern const char *Txt_The_ID_nickname_or_email_X_is_not_valid; @@ -2252,7 +1959,7 @@ void Usr_ChkUsrAndGetUsrData (void) if (Gbl.CurrentAct == ActCreUsrAcc) { /***** Create new account and login *****/ - if (Usr_CreateNewAccountAndLogIn ()) // User logged in + if (Enr_CreateNewAccountAndLogIn ()) // User logged in { Gbl.Usrs.Me.Logged = true; Usr_SetUsrRoleAndPrefs (); @@ -2718,52 +2425,6 @@ static bool Usr_ChkUsrAndGetUsrDataFromSession (void) return true; } -/*****************************************************************************/ -/*************** Create new user account with an ID and login ****************/ -/*****************************************************************************/ -// Return true if no error and user can be logged in -// Return false on error - -static bool Usr_CreateNewAccountAndLogIn (void) - { - char NewNicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_WITH_ARROBA+1]; - char NewEmail[Cns_MAX_BYTES_STRING+1]; - char NewEncryptedPassword[Cry_LENGTH_ENCRYPTED_STR_SHA512_BASE64+1]; - - if (Usr_GetParamsNewAccount (NewNicknameWithoutArroba,NewEmail,NewEncryptedPassword)) - { - /***** User's has no ID *****/ - Gbl.Usrs.Me.UsrDat.IDs.Num = 0; - Gbl.Usrs.Me.UsrDat.IDs.List = NULL; - - /***** Set password to the password typed by the user *****/ - strcpy (Gbl.Usrs.Me.UsrDat.Password,NewEncryptedPassword); - - /***** User does not exist in the platform, so create him/her! *****/ - Usr_CreateNewUsr (&Gbl.Usrs.Me.UsrDat); - - /***** Save nickname *****/ - Nck_UpdateMyNick (NewNicknameWithoutArroba); - strcpy (Gbl.Usrs.Me.UsrDat.Nickname,NewNicknameWithoutArroba); - - /***** Save e-mail *****/ - if (Mai_UpdateEmailInDB (&Gbl.Usrs.Me.UsrDat,NewEmail)) - { - /* E-mail updated sucessfully */ - strcpy (Gbl.Usrs.Me.UsrDat.Email,NewEmail); - Gbl.Usrs.Me.UsrDat.EmailConfirmed = false; - } - - return true; - } - else - { - /***** Show form again ******/ - Usr_ShowFormRequestNewAccountWithParams (NewNicknameWithoutArroba,NewEmail); - return false; - } - } - /*****************************************************************************/ /**** Check if users exists, if his password is correct, get his data... *****/ /*****************************************************************************/ @@ -3043,331 +2704,6 @@ unsigned Usr_UpdateMyClicksWithoutPhoto (void) return NumClicks; } -/*****************************************************************************/ -/******** Remove user from table with number of clicks without photo *********/ -/*****************************************************************************/ - -void Usr_RemoveUsrFromTableClicksWithoutPhoto (long UsrCod) - { - char Query[512]; - - sprintf (Query,"DELETE FROM clicks_without_photo WHERE UsrCod='%ld'",UsrCod); - DB_QueryDELETE (Query,"can not remove a user from the list of users without photo"); - } - -/*****************************************************************************/ -/****** Write a form to request another user's ID, @nickname or e-mail *******/ -/*****************************************************************************/ - -void Usr_WriteFormToReqAnotherUsrID (Act_Action_t NextAction) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_nick_email_or_ID; - extern const char *Txt_Continue; - - /***** Form to request user's ID, @nickname or e-mail address *****/ - Act_FormStart (NextAction); - fprintf (Gbl.F.Out,"
" - "%s: " - "" - "
", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_nick_email_or_ID, - Usr_MAX_BYTES_USR_LOGIN); - - /***** Send button*****/ - Lay_PutSendButton (Txt_Continue); - fprintf (Gbl.F.Out,""); - } - -/*****************************************************************************/ -/********************* Show form to create a new account *********************/ -/*****************************************************************************/ - -static void Usr_ShowFormRequestNewAccountWithParams (const char *NewNicknameWithoutArroba, - const char *NewEmail) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_Log_in; - extern const char *Txt_Nickname; - extern const char *Txt_Email; - // extern const char *Txt_ID; - extern const char *Txt_New_on_PLATFORM_Sign_up; - extern const char *Txt_Create_account; - - /***** Link to log in *****/ - fprintf (Gbl.F.Out,"
"); - Act_FormStart (ActFrmLogIn); - Act_LinkFormSubmit (Txt_Log_in,The_ClassFormul[Gbl.Prefs.Theme]); - Lay_PutSendIcon ("login",Txt_Log_in,Txt_Log_in); - fprintf (Gbl.F.Out,"" - "
"); - - /***** Form to enter the ID of the new user *****/ - fprintf (Gbl.F.Out,"
"); - Act_FormStart (ActCreUsrAcc); - sprintf (Gbl.Title,Txt_New_on_PLATFORM_Sign_up,Cfg_PLATFORM_SHORT_NAME); - Lay_StartRoundFrameTable10 (NULL,2,Gbl.Title); - - /***** Nickname *****/ - fprintf (Gbl.F.Out,"" - "" - "%s: " - "" - "" - "" - "" - "", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_Nickname, - 1+Nck_MAX_LENGTH_NICKNAME_WITHOUT_ARROBA, - NewNicknameWithoutArroba); - - /***** E-mail *****/ - fprintf (Gbl.F.Out,"" - "" - "%s: " - "" - "" - "" - "" - "", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_Email, - Cns_MAX_BYTES_STRING, - NewEmail); - - /***** Password *****/ - Pwd_PutFormToGetNewPasswordTwice (); - - /***** Send button and form end *****/ - fprintf (Gbl.F.Out,"" - "" - "" - "" - "", - Txt_Create_account); - Lay_EndRoundFrameTable10 (); - fprintf (Gbl.F.Out,"" - "
"); - } - -/*****************************************************************************/ -/************* Get parameters for the creation of a new account **************/ -/*****************************************************************************/ -// Return false on error - -static bool Usr_GetParamsNewAccount (char *NewNicknameWithoutArroba, - char *NewEmail, - char *NewEncryptedPassword) - { - extern const char *Txt_The_nickname_X_had_been_registered_by_another_user; - extern const char *Txt_The_nickname_entered_X_is_not_valid_; - extern const char *Txt_The_email_address_X_had_been_registered_by_another_user; - extern const char *Txt_The_email_address_entered_X_is_not_valid; - extern const char *Txt_You_have_not_written_twice_the_same_new_password; - char Query[1024]; - char NewNicknameWithArroba[Nck_MAX_BYTES_NICKNAME_WITH_ARROBA+1]; - char NewPlainPassword[2][Pwd_MAX_LENGTH_PLAIN_PASSWORD+1]; - bool Error = false; - - /***** Step 1/3: Get new nickname from form *****/ - Par_GetParToText ("NewNick",NewNicknameWithArroba,Nck_MAX_BYTES_NICKNAME_WITH_ARROBA); - - if (Nck_CheckIfNickWithArrobaIsValid (NewNicknameWithArroba)) // If new nickname is valid - { - /***** Remove arrobas at the beginning *****/ - strncpy (NewNicknameWithoutArroba,NewNicknameWithArroba,Nck_MAX_BYTES_NICKNAME_WITH_ARROBA); - NewNicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_WITH_ARROBA] = '\0'; - Str_RemoveLeadingArrobas (NewNicknameWithoutArroba); - - /***** Check if the new nickname matches any of the nicknames of other users *****/ - sprintf (Query,"SELECT COUNT(*) FROM usr_nicknames" - " WHERE Nickname='%s' AND UsrCod<>'%ld'", - NewNicknameWithoutArroba,Gbl.Usrs.Me.UsrDat.UsrCod); - if (DB_QueryCOUNT (Query,"can not check if nickname already existed")) // A nickname of another user is the same that this nickname - { - Error = true; - sprintf (Gbl.Message,Txt_The_nickname_X_had_been_registered_by_another_user, - NewNicknameWithoutArroba); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - } - } - else // New nickname is not valid - { - Error = true; - sprintf (Gbl.Message,Txt_The_nickname_entered_X_is_not_valid_, - NewNicknameWithArroba, - Nck_MIN_LENGTH_NICKNAME_WITHOUT_ARROBA, - Nck_MAX_LENGTH_NICKNAME_WITHOUT_ARROBA); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - } - - /***** Step 2/3: Get new e-mail from form *****/ - Par_GetParToText ("NewEmail",NewEmail,Cns_MAX_BYTES_STRING); - - if (Mai_CheckIfEmailIsValid (NewEmail)) // New e-mail is valid - { - /***** Check if the new e-mail matches any of the confirmed e-mails of other users *****/ - sprintf (Query,"SELECT COUNT(*) FROM usr_emails" - " WHERE E_mail='%s' AND Confirmed='Y'", - NewEmail); - if (DB_QueryCOUNT (Query,"can not check if e-mail already existed")) // An e-mail of another user is the same that my e-mail - { - Error = true; - sprintf (Gbl.Message,Txt_The_email_address_X_had_been_registered_by_another_user, - NewEmail); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - } - } - else // New e-mail is not valid - { - Error = true; - sprintf (Gbl.Message,Txt_The_email_address_entered_X_is_not_valid, - NewEmail); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - } - - /***** Step 3/3: Get new user's ID from form *****/ - Par_GetParToText ("Paswd1",NewPlainPassword[0],Pwd_MAX_LENGTH_PLAIN_PASSWORD); - Par_GetParToText ("Paswd2",NewPlainPassword[1],Pwd_MAX_LENGTH_PLAIN_PASSWORD); - if (strcmp (NewPlainPassword[0],NewPlainPassword[1])) - { - // Passwords don't match - Error = true; - Lay_ShowAlert (Lay_WARNING,Txt_You_have_not_written_twice_the_same_new_password); - } - else - { - Str_ChangeFormat (Str_FROM_FORM,Str_TO_TEXT, - NewPlainPassword[0],Pwd_MAX_LENGTH_PLAIN_PASSWORD,true); - Cry_EncryptSHA512Base64 (NewPlainPassword[0],NewEncryptedPassword); - if (!Pwd_SlowCheckIfPasswordIsGood (NewPlainPassword[0],NewEncryptedPassword,-1L)) // New password is good? - { - Error = true; - Lay_ShowAlert (Lay_WARNING,Gbl.Message); // Error message is set in Usr_SlowCheckIfPasswordIsGood - } - } - - return !Error; - } - -/*****************************************************************************/ -/***************** Message after creation of a new account *******************/ -/*****************************************************************************/ - -void Usr_AfterCreationNewAccount (void) - { - extern const char *Txt_New_account_created; - - if (Gbl.Usrs.Me.Logged) // If account has been created without problem, I am logged - { - /***** Show message of success *****/ - Lay_ShowAlert (Lay_SUCCESS,Txt_New_account_created); - - /***** Show form with account data *****/ - Usr_ShowFormChangeMyAccount (); - } - } - -/*****************************************************************************/ -/******** Show form to change my account or to create a new account **********/ -/*****************************************************************************/ - -void Usr_ShowFormAccount (void) - { - if (Gbl.Usrs.Me.Logged) - Usr_ShowFormChangeMyAccount (); - else - Usr_ShowFormRequestNewAccountWithParams ("",""); - } - -/*****************************************************************************/ -/*********************** Show form to change my account **********************/ -/*****************************************************************************/ - -void Usr_ShowFormChangeMyAccount (void) - { - extern const char *Txt_Before_going_to_any_other_option_you_must_fill_your_nickname; - extern const char *Txt_Before_going_to_any_other_option_you_must_fill_your_email_address; - extern const char *Txt_Before_going_to_any_other_option_you_must_fill_your_ID; - extern const char *Txt_User_account; - - /***** Get current user's nickname and e-mail address - It's necessary because current nickname or e-mail could be just updated *****/ - Nck_GetNicknameFromUsrCod (Gbl.Usrs.Me.UsrDat.UsrCod,Gbl.Usrs.Me.UsrDat.Nickname); - Mai_GetEmailFromUsrCod (Gbl.Usrs.Me.UsrDat.UsrCod,Gbl.Usrs.Me.UsrDat.Email,&(Gbl.Usrs.Me.UsrDat.EmailConfirmed)); - - /***** Check nickname and e-mail *****/ - if (!Gbl.Usrs.Me.UsrDat.Nickname[0]) - Lay_ShowAlert (Lay_WARNING,Txt_Before_going_to_any_other_option_you_must_fill_your_nickname); - else if (!Gbl.Usrs.Me.UsrDat.Email[0]) - Lay_ShowAlert (Lay_WARNING,Txt_Before_going_to_any_other_option_you_must_fill_your_email_address); - else if (!Gbl.Usrs.Me.UsrDat.IDs.Num) - Lay_ShowAlert (Lay_WARNING,Txt_Before_going_to_any_other_option_you_must_fill_your_ID); - - /***** Put links to change my password and to remove my account*****/ - fprintf (Gbl.F.Out,"
"); - Pwd_PutLinkToChangeUsrPassword (&Gbl.Usrs.Me.UsrDat); - if (Usr_CheckIfICanEliminateAccount (true)) // ItsMe = true - Usr_PutLinkToRemoveMyAccount (); - fprintf (Gbl.F.Out,"
"); - - /***** Start table *****/ - Lay_StartRoundFrameTable10 ("80%",2,Txt_User_account); - - /***** Nickname *****/ - Nck_ShowFormChangeUsrNickname (); - - /***** Separator *****/ - Usr_PrintAccountSeparator (); - - /***** E-mail *****/ - Mai_ShowFormChangeUsrEmail (); - - /***** Separator *****/ - Usr_PrintAccountSeparator (); - - /***** User's ID *****/ - ID_ShowFormChangeUsrID (&Gbl.Usrs.Me.UsrDat,true); - - /***** End of table *****/ - Lay_EndRoundFrameTable10 (); - } - -static void Usr_PrintAccountSeparator (void) - { - extern const char *The_ClassSeparator[The_NUM_THEMES]; - - /***** Separator *****/ - fprintf (Gbl.F.Out,"" - "" - "
" - "" - "", - The_ClassSeparator[Gbl.Prefs.Theme]); - } - -/*****************************************************************************/ -/******** Put a link to the action used to request user's password ***********/ -/*****************************************************************************/ - -static void Usr_PutLinkToRemoveMyAccount (void) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_Remove_account; - - Act_FormStart (ActUpdOthUsrDat); - Usr_PutParamOtherUsrCodEncrypted (Gbl.Usrs.Me.UsrDat.EncryptedUsrCod); - Par_PutHiddenParamUnsigned ("RegRemAction",(unsigned) Usr_ELIMINATE_ONE_USR_FROM_PLATFORM); - Act_LinkFormSubmit (Txt_Remove_account,The_ClassFormul[Gbl.Prefs.Theme]); - Lay_PutSendIcon ("delon",Txt_Remove_account,Txt_Remove_account); - fprintf (Gbl.F.Out,""); - } - /*****************************************************************************/ /******* Check a user's code and get all user's data from user's code ********/ /*****************************************************************************/ @@ -3464,787 +2800,6 @@ static void Usr_InsertMyLastData (void) (unsigned) Gbl.CurrentTab); DB_QueryINSERT (Query,"can not insert last user's data"); } - -/*****************************************************************************/ -/******************* Create and show data from other user ********************/ -/*****************************************************************************/ - -void Usr_CreatAndShowNewUsrRecordAndRegInCrs (void) - { - extern const char *Txt_The_ID_X_is_not_valid; - Rol_Role_t NewRole; - - /***** Get user's ID from form *****/ - ID_GetParamOtherUsrIDPlain (); // User's ID was already modified and passed as a hidden parameter - - if (ID_CheckIfUsrIDIsValid (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID)) // User's ID valid - { - Gbl.Usrs.Other.UsrDat.UsrCod = -1L; - - /***** Get new role *****/ - NewRole = Rec_GetRoleFromRecordForm (); - if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_TEACHER && - NewRole != Rol_ROLE_STUDENT) - Lay_ShowErrorAndExit ("A teacher only can create new users as students."); - - /***** Get user's name from form *****/ - Rec_GetUsrNameFromRecordForm (&Gbl.Usrs.Other.UsrDat); - - /***** Create user *****/ - Gbl.Usrs.Other.UsrDat.IDs.List[0].Confirmed = true; // User's ID will be stored as confirmed - Usr_CreateNewUsr (&Gbl.Usrs.Other.UsrDat); - - /***** Register user in current course in database *****/ - if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected - { - if (Usr_CheckIfUsrBelongsToCrs (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.CurrentCrs.Crs.CrsCod)) // User does belong to current course, modify his/her role - Usr_ModifyRoleInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole, - Cns_VERBOSE,Usr_SET_ACCEPTED_TO_FALSE); - else - Usr_RegisterUsrInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole, - Cns_VERBOSE,Usr_SET_ACCEPTED_TO_FALSE); - - /***** Change user's groups *****/ - if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups? - Grp_ChangeOtherUsrGrps (); - } - - /***** Show user's record *****/ - Rec_ShowCommonRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - } - else // User's ID not valid - { - /***** Write message *****/ - sprintf (Gbl.Message,Txt_The_ID_X_is_not_valid, - Gbl.Usrs.Other.UsrDat.IDs.List[0].ID); - Lay_ShowAlert (Lay_ERROR,Gbl.Message); - } - } - -/*****************************************************************************/ -/**** Modify other user's data and register her/him in course and groups *****/ -/*****************************************************************************/ - -void Usr_ModifAndShowUsrCardAndRegInCrsAndGrps (void) - { - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - char UnsignedStr[10+1]; - unsigned UnsignedNum; - bool ItsMe; - bool IAmTeacher; - bool HeIsTeacher; - bool ICanChangeUsrName; - Usr_RegRemOneUsrAction_t RegRemAction; - Rol_Role_t NewRole; - bool Error = false; - - /***** Get user from form *****/ - if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ()) - { - ItsMe = (Gbl.Usrs.Other.UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod); - - /***** Get the action to do *****/ - Par_GetParToText ("RegRemAction",UnsignedStr,1); - if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1) - if (UnsignedNum < Usr_NUM_ACTIONS_REG_REM_ONE_USR) - switch ((RegRemAction = (Usr_RegRemOneUsrAction_t) UnsignedNum)) - { - case Usr_REGISTER_MODIFY_ONE_USR_IN_CRS: - if (Gbl.Usrs.Me.LoggedRole >= Rol_ROLE_TEACHER || ItsMe) - { - IAmTeacher = (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_TEACHER); // I am logged as teacher - HeIsTeacher = (Gbl.Usrs.Other.UsrDat.Roles & (1 << Rol_ROLE_TEACHER)); // He/she is already a teacher in any course - ICanChangeUsrName = ItsMe || - !(IAmTeacher && HeIsTeacher); // A teacher can not change another teacher's name - - /***** Get user's name from record form *****/ - if (ICanChangeUsrName) - Rec_GetUsrNameFromRecordForm (&Gbl.Usrs.Other.UsrDat); - - /***** Update user's data in database *****/ - Usr_UpdateUsrData (&Gbl.Usrs.Other.UsrDat); - - if (Gbl.CurrentCrs.Crs.CrsCod > 0) - { - /***** Get new role from record form *****/ - NewRole = Rec_GetRoleFromRecordForm (); - - /***** Register user in current course in database *****/ - if (Usr_CheckIfUsrBelongsToCrs (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.CurrentCrs.Crs.CrsCod)) // User does belong to current course, modify his/her role - Usr_ModifyRoleInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole, - Cns_VERBOSE,Usr_SET_ACCEPTED_TO_FALSE); - else - Usr_RegisterUsrInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole, - Cns_VERBOSE,Usr_SET_ACCEPTED_TO_FALSE); - - /***** Change user's groups *****/ - if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups? - { - if (ItsMe) - Grp_ChangeMyGrps (); - else - Grp_ChangeOtherUsrGrps (); - } - } - - /***** Show user's record *****/ - Rec_ShowCommonRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - } - else - Error = true; - break; - case Usr_REGISTER_ONE_DEGREE_ADMIN: - if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER) - Usr_ReqAddAdmOfDeg (); - else - Error = true; - break; - case Usr_REMOVE_ONE_USR_FROM_CRS: - if (Gbl.Usrs.Me.LoggedRole >= Rol_ROLE_TEACHER || ItsMe) - Usr_ReqRemUsrFromCrs (); - else - Error = true; - break; - case Usr_REMOVE_ONE_DEGREE_ADMIN: - if ((Gbl.Usrs.Me.LoggedRole == Rol_ROLE_DEG_ADMIN && ItsMe) || - Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER) - Usr_ReqRemAdmOfDeg (); - else - Error = true; - break; - case Usr_ELIMINATE_ONE_USR_FROM_PLATFORM: - if (Usr_CheckIfICanEliminateAccount (ItsMe)) - Usr_ReqRemUsrGbl (); - else - Error = true; - break; - default: - Error = true; - break; - } - else - Error = true; - else - Error = true; - } - else - Error = true; - - if (Error) - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - -/*****************************************************************************/ -/****************** Put an enrollment into a notification ********************/ -/*****************************************************************************/ -// This function may be called inside a web service, so don't report error - -void Usr_GetNotifEnrollment (char *SummaryStr, - long CrsCod,long UsrCod, - unsigned MaxChars) - { - extern const char *Txt_ROLES_SINGULAR_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - char Query[256]; - MYSQL_RES *mysql_res; - MYSQL_ROW row; - struct UsrData UsrDat; - Rol_Role_t Role; - - SummaryStr[0] = '\0'; // Return nothing on error - - /***** Get user's role in course from database *****/ - sprintf (Query,"SELECT Role" - " FROM crs_usr" - " WHERE CrsCod='%ld' AND UsrCod='%ld'", - CrsCod,UsrCod); - - if (!mysql_query (&Gbl.mysql,Query)) - if ((mysql_res = mysql_store_result (&Gbl.mysql)) != NULL) - { - /***** Result should have a unique row *****/ - if (mysql_num_rows (mysql_res) == 1) - { - /***** Get user's role in course *****/ - row = mysql_fetch_row (mysql_res); - - /* Initialize structure with user's data */ - Usr_UsrDataConstructor (&UsrDat); - - /* Get user's data */ - UsrDat.UsrCod = UsrCod; - Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat); - - /* Role (row[0]) */ - Role = Usr_ConvertUnsignedStrToRole (row[0]); - strcpy (SummaryStr,Txt_ROLES_SINGULAR_Abc[Role][UsrDat.Sex]); - if (MaxChars) - Str_LimitLengthHTMLStr (SummaryStr,MaxChars); - - /* Free memory used for user's data */ - Usr_UsrDataDestructor (&UsrDat); - } - - mysql_free_result (mysql_res); - } - } - -/*****************************************************************************/ -/****************************** Create new user ******************************/ -/*****************************************************************************/ -// UsrDat->UsrCod must be <= 0 -// UsrDat->UsrDat.IDs must contain a list of IDs for the new user - -void Usr_CreateNewUsr (struct UsrData *UsrDat) - { - extern const char *Txt_STR_LANG_ID[Txt_NUM_LANGUAGES]; - extern const char *The_ThemeId[The_NUM_THEMES]; - extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS]; - char Query[2048]; - char PathRelUsr[PATH_MAX+1]; - unsigned NumID; - - /***** Check if user's code is initialized *****/ - if (UsrDat->UsrCod > 0) - Lay_ShowErrorAndExit ("Can not create new user."); - - /***** Create encrypted user's code *****/ - Usr_CreateNewEncryptedUsrCod (UsrDat); - - /***** Filter some user's data before inserting */ - Usr_FilterUsrDat (UsrDat); - - /***** Insert new user in database *****/ - /* Insert user's data */ - sprintf (Query,"INSERT INTO usr_data (EncryptedUsrCod,Password,Surname1,Surname2,FirstName,Sex," - "Layout,Theme,IconSet,Language,PublicPhoto," - "CtyCod," - "LocalAddress,LocalPhone,FamilyAddress,FamilyPhone,OriginPlace,Birthday,Comments," - "SideCols,NotifNtfEvents,EmailNtfEvents)" - " VALUES ('%s','%s','%s','%s','%s','%s'," - "'%u','%s','%s','%s','%c'," - "'%ld'," - "'%s','%s','%s','%s','%s','%04u-%02u-%02u','%s'," - "'3','-1','0')", - UsrDat->EncryptedUsrCod, - UsrDat->Password, - UsrDat->Surname1,UsrDat->Surname2,UsrDat->FirstName, - Usr_StringsSexDB[UsrDat->Sex], - (unsigned) UsrDat->Prefs.Layout, - The_ThemeId[UsrDat->Prefs.Theme], - Ico_IconSetId[UsrDat->Prefs.IconSet], - Txt_STR_LANG_ID[UsrDat->Prefs.Language], - UsrDat->PublicPhoto ? 'Y' : - 'N', - UsrDat->CtyCod, - UsrDat->LocalAddress ,UsrDat->LocalPhone, - UsrDat->FamilyAddress,UsrDat->FamilyPhone, - UsrDat->OriginPlace, - UsrDat->Birthday.Year,UsrDat->Birthday.Month,UsrDat->Birthday.Day, - UsrDat->Comments ? UsrDat->Comments : - ""); - UsrDat->UsrCod = DB_QueryINSERTandReturnCode (Query,"can not create user"); - - /* Insert user's IDs as confirmed */ - for (NumID = 0; - NumID < UsrDat->IDs.Num; - NumID++) - { - Str_ConvertToUpperText (UsrDat->IDs.List[NumID].ID); - sprintf (Query,"INSERT INTO usr_IDs (UsrCod,UsrID,CreatTime,Confirmed)" - " VALUES ('%ld','%s',NOW(),'%c')", - UsrDat->UsrCod, - UsrDat->IDs.List[NumID].ID, - UsrDat->IDs.List[NumID].Confirmed ? 'Y' : - 'N'); - DB_QueryINSERT (Query,"can not store user's ID when creating user"); - } - - /***** Create directory for the user, if not exists *****/ - Usr_ConstructPathUsr (UsrDat->UsrCod,PathRelUsr); - Fil_CreateDirIfNotExists (PathRelUsr); - } - -/*****************************************************************************/ -/***************************** Update user's data ****************************/ -/*****************************************************************************/ -// UsrDat->UsrCod must be > 0 - -void Usr_UpdateUsrData (struct UsrData *UsrDat) - { - extern const char *Txt_STR_LANG_ID[Txt_NUM_LANGUAGES]; - extern const char *The_ThemeId[The_NUM_THEMES]; - extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS]; - char Query[2048]; - - /***** Check if user's code is initialized *****/ - if (UsrDat->UsrCod <= 0) - Lay_ShowErrorAndExit ("Can not update user's data. Wrong user's code."); - - /***** Filter some user's data before updating */ - Usr_FilterUsrDat (UsrDat); - - /***** Update user's common data *****/ - sprintf (Query,"UPDATE usr_data" - " SET Password='%s'," - "Surname1='%s',Surname2='%s',FirstName='%s',Sex='%s'," - "Layout='%u',Theme='%s',IconSet='%s',Language='%s',PublicPhoto='%c'," - "CtyCod='%ld'," - "LocalAddress='%s',LocalPhone='%s',FamilyAddress='%s',FamilyPhone='%s',OriginPlace='%s',Birthday='%04u-%02u-%02u',Comments='%s'" - " WHERE UsrCod='%ld'", - UsrDat->Password, - UsrDat->Surname1,UsrDat->Surname2,UsrDat->FirstName, - Usr_StringsSexDB[UsrDat->Sex], - (unsigned) UsrDat->Prefs.Layout, - The_ThemeId[UsrDat->Prefs.Theme], - Ico_IconSetId[UsrDat->Prefs.IconSet], - Txt_STR_LANG_ID[UsrDat->Prefs.Language], - UsrDat->PublicPhoto ? 'Y' : - 'N', - UsrDat->CtyCod, - UsrDat->LocalAddress,UsrDat->LocalPhone, - UsrDat->FamilyAddress,UsrDat->FamilyPhone,UsrDat->OriginPlace, - UsrDat->Birthday.Year,UsrDat->Birthday.Month,UsrDat->Birthday.Day, - UsrDat->Comments ? UsrDat->Comments : - "", - UsrDat->UsrCod); - DB_QueryUPDATE (Query,"can not update user's data"); - } - -/*****************************************************************************/ -/**************** Update institution, centre and department ******************/ -/*****************************************************************************/ - -void Usr_UpdateInstitutionCentreDepartment (void) - { - char Query[256]; - - sprintf (Query,"UPDATE usr_data" - " SET InsCtyCod='%ld',InsCod='%ld',CtrCod='%ld',DptCod='%ld'" - " WHERE UsrCod='%ld'", - Gbl.Usrs.Me.UsrDat.InsCtyCod, - Gbl.Usrs.Me.UsrDat.InsCod, - Gbl.Usrs.Me.UsrDat.Tch.CtrCod, - Gbl.Usrs.Me.UsrDat.Tch.DptCod, - Gbl.Usrs.Me.UsrDat.UsrCod); - DB_QueryUPDATE (Query,"can not update institution, centre and department"); - } - -/*****************************************************************************/ -/******************** Create a new encrypted user's code *********************/ -/*****************************************************************************/ - -#define LENGTH_RANDOM_STR 32 -#define MAX_TRY 10 - -static void Usr_CreateNewEncryptedUsrCod (struct UsrData *UsrDat) - { - char RandomStr[LENGTH_RANDOM_STR+1]; - unsigned NumTry; - - for (NumTry = 0; - NumTry < MAX_TRY; - NumTry++) - { - Str_CreateRandomAlphanumStr (RandomStr,LENGTH_RANDOM_STR); - Cry_EncryptSHA256Base64 (RandomStr,UsrDat->EncryptedUsrCod); - if (!Usr_ChkIfEncryptedUsrCodExists (UsrDat->EncryptedUsrCod)) - break; - } - if (NumTry == MAX_TRY) - Lay_ShowErrorAndExit ("Can not create a new encrypted user's code."); - } - -/*****************************************************************************/ -/************************* Filter some user's data ***************************/ -/*****************************************************************************/ - -static void Usr_FilterUsrDat (struct UsrData *UsrDat) - { - /***** Fix birthday *****/ - if (UsrDat->Birthday.Year < Gbl.Now.Date.Year-99 || - UsrDat->Birthday.Year > Gbl.Now.Date.Year-16) - UsrDat->Birthday.Year = - UsrDat->Birthday.Month = - UsrDat->Birthday.Day = 0; - } - -/*****************************************************************************/ -/*********************** Register user in current course *********************/ -/*****************************************************************************/ -// Before calling this function, you must be sure that -// the user does not belong to the current course - -void Usr_RegisterUsrInCurrentCrs (struct UsrData *UsrDat,Rol_Role_t NewRole, - Cns_QuietOrVerbose_t QuietOrVerbose, - Usr_KeepOrSetAccepted_t KeepOrSetAccepted) - { - extern const char *Txt_THE_USER_X_has_been_enrolled_in_the_course_Y; - char Query[1024]; - bool CreateNotif; - bool NotifyByEmail; - - /***** Check if user's role is allowed *****/ - if (!(NewRole == Rol_ROLE_STUDENT || - NewRole == Rol_ROLE_TEACHER)) - Lay_ShowErrorAndExit ("Wrong role."); - - /***** Register user in current course in database *****/ - sprintf (Query,"INSERT INTO crs_usr (CrsCod,UsrCod,Role,Accepted," - "LastAccDownloadCrs,LastAccCommonCrs,LastAccMyWorks,LastAccCrsWorks,LastAccMarksCrs," - "LastDowGrpCod,LastComGrpCod,LastAssGrpCod,NumAccTst,LastAccTst,NumQstsLastTst," - "UsrListType,ColsClassPhoto,ListWithPhotos)" - " VALUES ('%ld','%ld','%u','%c'," - "'0000-00-00','0000-00-00','0000-00-00','0000-00-00','0000-00-00'," - "'-1','-1','-1','0','0000-00-00','0'," - "'%s','%u','%c')", - Gbl.CurrentCrs.Crs.CrsCod,UsrDat->UsrCod,(unsigned) NewRole, - KeepOrSetAccepted == Usr_SET_ACCEPTED_TO_TRUE ? 'Y' : - 'N', - Usr_StringsUsrListTypeInDB[Usr_SHOW_USRS_TYPE_DEFAULT], - Usr_CLASS_PHOTO_COLS_DEF, - Usr_LIST_WITH_PHOTOS_DEF ? 'Y' : - 'N'); - DB_QueryINSERT (Query,"can not register user in course"); - UsrDat->RoleInCurrentCrsDB = NewRole; - UsrDat->Roles |= NewRole; - - /***** Remove possible inscription request ******/ - Usr_RemoveEnrollmentRequest (Gbl.CurrentCrs.Crs.CrsCod,UsrDat->UsrCod); - - /***** Create notification for this user. - If this user wants to receive notifications by e-mail, - activate the sending of a notification *****/ - CreateNotif = (UsrDat->Prefs.NotifNtfEvents & (1 << Ntf_EVENT_ENROLLMENT)); - NotifyByEmail = CreateNotif && - (UsrDat->UsrCod != Gbl.Usrs.Me.UsrDat.UsrCod) && - (UsrDat->Prefs.EmailNtfEvents & (1 << Ntf_EVENT_ENROLLMENT)); - if (CreateNotif) - Ntf_StoreNotifyEventToOneUser (Ntf_EVENT_ENROLLMENT,UsrDat,-1L, - (Ntf_Status_t) (NotifyByEmail ? Ntf_STATUS_BIT_EMAIL : - 0)); - - /***** Show info message *****/ - if (QuietOrVerbose == Cns_VERBOSE) - { - sprintf (Gbl.Message,Txt_THE_USER_X_has_been_enrolled_in_the_course_Y, - UsrDat->FullName,Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - } - -/*****************************************************************************/ -/******************* Register administrator in current degree ****************/ -/*****************************************************************************/ - -static void Usr_RegisterAdminInCurrentDeg (struct UsrData *UsrDat) - { - extern const char *Txt_THE_USER_X_is_already_an_administrator_of_the_degree_Y; - extern const char *Txt_THE_USER_X_has_been_enrolled_as_administrator_of_the_degree_Y; - char Query[512]; - - /***** Check if user was and administrator of current degree *****/ - if (Usr_CheckIfUsrIsAdmOfDeg (UsrDat->UsrCod,Gbl.CurrentDeg.Deg.DegCod)) - sprintf (Gbl.Message,Txt_THE_USER_X_is_already_an_administrator_of_the_degree_Y, - UsrDat->FullName,Gbl.CurrentDeg.Deg.FullName); - else // User was not administrator of current degree - { - /***** Insert or replace administrator in current degree *****/ - sprintf (Query,"REPLACE INTO deg_admin (UsrCod,DegCod)" - " VALUES ('%ld','%ld')", - UsrDat->UsrCod,Gbl.CurrentDeg.Deg.DegCod); - DB_QueryREPLACE (Query,"can not create administrator of degree"); - - sprintf (Gbl.Message,Txt_THE_USER_X_has_been_enrolled_as_administrator_of_the_degree_Y, - UsrDat->FullName,Gbl.CurrentDeg.Deg.FullName); - } - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - -/*****************************************************************************/ -/************************ Remove a user from a course ************************/ -/*****************************************************************************/ - -static void Usr_EffectivelyRemUsrFromCrs (struct UsrData *UsrDat,struct Course *Crs, - Usr_RemoveUsrWorks_t RemoveUsrWorks,Cns_QuietOrVerbose_t QuietOrVerbose) - { - extern const char *Txt_THE_USER_X_has_been_removed_from_the_course_Y; - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - char Query[1024]; - - if (Usr_CheckIfUsrBelongsToCrs (UsrDat->UsrCod,Crs->CrsCod)) // User belongs to the course - { - /***** Remove user from all the attendance events in course *****/ - Att_RemoveUsrFromCrsAttEvents (UsrDat->UsrCod,Crs->CrsCod); - - /***** Remove user from all the groups in course *****/ - Grp_RemUsrFromAllGrpsInCrs (UsrDat,Crs,QuietOrVerbose); - - /***** Remove user's status about reading of course information *****/ - Inf_RemoveUsrFromCrsInfoRead (UsrDat->UsrCod,Crs->CrsCod); - - /***** Remove works zone of this user in course *****/ - if (RemoveUsrWorks == Usr_REMOVE_WORKS) - Brw_RemoveUsrWorksInCrs (UsrDat,Crs,QuietOrVerbose); - - /***** Remove fields of this user in its course record *****/ - Rec_RemoveFieldsCrsRecordInCrs (UsrDat->UsrCod,Crs,QuietOrVerbose); - - /***** Remove user's clipboard in course *****/ - Brw_RemoveUsrClipboardInCrs (UsrDat->UsrCod,Crs->CrsCod); - - /***** Remove user's expanded folders in course *****/ - Brw_RemoveUsrExpandedFoldersInCrs (UsrDat->UsrCod,Crs->CrsCod); - - /***** Remove exams made by user in course *****/ - Tst_RemoveExamsMadeByUsrInCrs (UsrDat->UsrCod,Crs->CrsCod); - - /***** Set all the notifications for this user in this course as removed, - except notifications about new messages *****/ - Ntf_SetNotifInCrsAsRemoved (Crs->CrsCod,UsrDat->UsrCod); - - /***** Remove user from the table of courses-users *****/ - sprintf (Query,"DELETE FROM crs_usr" - " WHERE CrsCod='%ld' AND UsrCod='%ld'", - Crs->CrsCod,UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove a user from a course"); - - if (QuietOrVerbose == Cns_VERBOSE) - { - sprintf (Gbl.Message,Txt_THE_USER_X_has_been_removed_from_the_course_Y, - UsrDat->FullName,Crs->FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - } - else // User does not belong to course - if (QuietOrVerbose == Cns_VERBOSE) - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - -/*****************************************************************************/ -/************* Remove an administrator from current degree *******************/ -/*****************************************************************************/ - -static void Usr_EffectivelyRemAdmFromDeg (struct UsrData *UsrDat) - { - extern const char *Txt_THE_USER_X_has_been_removed_as_administrator_of_the_degree_Y; - extern const char *Txt_THE_USER_X_is_not_an_administrator_of_the_degree_Y; - char Query[1024]; - - 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'", - UsrDat->UsrCod,Gbl.CurrentDeg.Deg.DegCod); - DB_QueryDELETE (Query,"can not remove an administrator from a degree"); - - sprintf (Gbl.Message,Txt_THE_USER_X_has_been_removed_as_administrator_of_the_degree_Y, - UsrDat->FullName,Gbl.CurrentDeg.Deg.FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - else // User is not an administrator of the current degree - { - sprintf (Gbl.Message,Txt_THE_USER_X_is_not_an_administrator_of_the_degree_Y, - UsrDat->FullName,Gbl.CurrentDeg.Deg.FullName); - Lay_ShowAlert (Lay_ERROR,Gbl.Message); - } - } - -/*****************************************************************************/ -/************* Remove completely a user from the whole platform **************/ -/*****************************************************************************/ - -static void Usr_DeleteUsrFromPlatform (struct UsrData *UsrDat, - Cns_QuietOrVerbose_t QuietOrVerbose) - { - extern const char *Txt_THE_USER_X_has_been_removed_from_all_his_her_courses; - extern const char *Txt_THE_USER_X_has_been_removed_as_administrator; - extern const char *Txt_Messages_of_THE_USER_X_have_been_deleted; - extern const char *Txt_Virtual_pendrive_of_THE_USER_X_has_been_removed; - extern const char *Txt_Photo_of_THE_USER_X_has_been_removed; - extern const char *Txt_Record_card_of_THE_USER_X_has_been_removed; - char Query[1024]; - bool PhotoRemoved = false; - - /***** Remove the works zones of the user in all courses *****/ - Brw_RemoveUsrWorksInAllCrss (UsrDat,QuietOrVerbose); // Make this before of removing the user from the courses - - /***** Remove the fields of course record in all courses *****/ - Rec_RemoveFieldsCrsRecordAll (UsrDat->UsrCod,QuietOrVerbose); - - /***** Remove user from all the attendance events *****/ - Att_RemoveUsrFromAllAttEvents (UsrDat->UsrCod); - - /***** Remove user from all the groups of all courses *****/ - Grp_RemUsrFromAllGrps (UsrDat,QuietOrVerbose); - - /***** Remove user's requests for inscription *****/ - sprintf (Query,"DELETE FROM crs_usr_requests" - " WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove user's requests for inscription"); - - /***** Remove user from the table of courses and users *****/ - sprintf (Query,"DELETE FROM crs_usr" - " WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove a user from all courses"); - - if (QuietOrVerbose == Cns_VERBOSE) - { - sprintf (Gbl.Message,Txt_THE_USER_X_has_been_removed_from_all_his_her_courses, - UsrDat->FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - - /***** Remove user as administrator of any degree *****/ - sprintf (Query,"DELETE FROM deg_admin" - " WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove a user as administrator"); - - if (QuietOrVerbose == Cns_VERBOSE) - { - sprintf (Gbl.Message,Txt_THE_USER_X_has_been_removed_as_administrator, - UsrDat->FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - - /***** Remove user's clipboards *****/ - Brw_RemoveUsrClipboard (UsrDat->UsrCod); - For_RemoveUsrFromThrClipboard (UsrDat->UsrCod); - - /***** Remove user's expanded folders *****/ - Brw_RemoveUsrExpandedFolders (UsrDat->UsrCod); - - /***** Remove exams made by user in all courses *****/ - Tst_RemoveExamsMadeByUsrInAllCrss (UsrDat->UsrCod); - - /***** Remove user's notifications *****/ - Ntf_RemoveUsrNtfs (UsrDat->UsrCod); - - /***** Delete user's messages sent and received *****/ - Gbl.Msg.FilterContent[0] = '\0'; - Msg_DelAllRecAndSntMsgsUsr (UsrDat->UsrCod); - if (QuietOrVerbose == Cns_VERBOSE) - { - sprintf (Gbl.Message,Txt_Messages_of_THE_USER_X_have_been_deleted, - UsrDat->FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - - /***** Remove user from table of banned users *****/ - Msg_RemoveUsrFromBanned (UsrDat->UsrCod); - - /***** Delete thread read status for this user *****/ - For_RemoveUsrFromReadThrs (UsrDat->UsrCod); - - /***** Remove user from table of seen announcements *****/ - Ann_RemoveUsrFromSeenAnnouncements (UsrDat->UsrCod); - - /***** Remove user from table of connected users *****/ - sprintf (Query,"DELETE FROM connected WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove a user from table of connected users"); - - /***** Remove all sessions of this user *****/ - sprintf (Query,"DELETE FROM sessions WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove sessions of a user"); - - /***** Remove the user from the list of users without photo *****/ - Usr_RemoveUsrFromTableClicksWithoutPhoto (UsrDat->UsrCod); - - /***** Remove the file tree of a user *****/ - Usr_RemoveUsrBriefcase (UsrDat); - if (QuietOrVerbose == Cns_VERBOSE) - { - sprintf (Gbl.Message,Txt_Virtual_pendrive_of_THE_USER_X_has_been_removed, - UsrDat->FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - - /***** Remove user's photo *****/ - PhotoRemoved = Pho_RemovePhoto (UsrDat); - if (PhotoRemoved && QuietOrVerbose == Cns_VERBOSE) - { - sprintf (Gbl.Message,Txt_Photo_of_THE_USER_X_has_been_removed, - UsrDat->FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - - /***** Remove user *****/ - Usr_RemoveUsr (UsrDat); - if (QuietOrVerbose == Cns_VERBOSE) - { - sprintf (Gbl.Message,Txt_Record_card_of_THE_USER_X_has_been_removed, - UsrDat->FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - } - -/*****************************************************************************/ -/********************** Remove the briefcase of a user ***********************/ -/*****************************************************************************/ - -void Usr_RemoveUsrBriefcase (struct UsrData *UsrDat) - { - char PathRelUsr[PATH_MAX+1]; - - /***** Remove the briefcase of the user *****/ - Usr_ConstructPathUsr (UsrDat->UsrCod,PathRelUsr); - Brw_RemoveTree (PathRelUsr); - - /***** Remove files in the course from database *****/ - Brw_RemoveFilesFromDB (-1L,-1L,UsrDat->UsrCod); - - /***** Remove size of the briefcase of the user from database *****/ - Brw_RemoveSizeOfFileTreeFromDB (-1L,-1L,UsrDat->UsrCod); - } - -/*****************************************************************************/ -/************************ Remove a user from database ************************/ -/*****************************************************************************/ - -static void Usr_RemoveUsr (struct UsrData *UsrDat) - { - char Query[128]; - - /***** Remove user's webs / social networks *****/ - sprintf (Query,"DELETE FROM usr_webs WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove user's webs / social networks"); - - /***** Remove user's nicknames *****/ - sprintf (Query,"DELETE FROM usr_nicknames WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove user's nicknames"); - - /***** Remove user's e-mails *****/ - sprintf (Query,"DELETE FROM pending_emails WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove pending user's e-mails"); - - sprintf (Query,"DELETE FROM usr_emails WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove user's e-mails"); - - /***** Remove user's IDs *****/ - sprintf (Query,"DELETE FROM usr_IDs WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove user's IDs"); - - /***** Remove user's last data *****/ - sprintf (Query,"DELETE FROM usr_last WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove user's last data"); - - /***** Remove user's data *****/ - sprintf (Query,"DELETE FROM usr_data WHERE UsrCod='%ld'", - UsrDat->UsrCod); - DB_QueryDELETE (Query,"can not remove user's data"); - } - /*****************************************************************************/ /************* Write a row of a table with the data of a guest ***************/ /*****************************************************************************/ @@ -6968,6 +5523,7 @@ void Usr_ListAllDataStds (void) extern const char *Txt_Place_of_origin; extern const char *Txt_Date_of_birth; extern const char *Txt_Group; + extern const char *Txt_RECORD_FIELD_VISIBILITY_RECORD[Rec_NUM_TYPES_VISIBILITY]; unsigned NumColumnsCommonCard; unsigned NumColumnsCardAndGroups; unsigned NumColumnsTotal; @@ -8681,2532 +7237,11 @@ void Usr_PutSelectorNumColsClassPhoto (void) The_ClassFormul[Gbl.Prefs.Theme],Txt_columns); } -/*****************************************************************************/ -/***** Register/remove users (taken from a list) in/from current course ******/ -/*****************************************************************************/ - -void Usr_ShowFormRegRemSeveralUsrs (void) - { - extern const char *The_ClassTitle[The_NUM_THEMES]; - extern const char *Txt_Step_1_Provide_a_list_of_users; - extern const char *Txt_Option_a_Import_students_from_the_official_lists; - extern const char *Txt_There_is_no_external_service_for_authentication_and_official_lists; - extern const char *Txt_Select_the_groups_of_students_you_want_to_register_in_remove_from_this_course; - extern const char *Txt_Option_b_Type_or_paste_a_list_of_users; - extern const char *Txt_Type_or_paste_a_list_of_IDs_nicks_or_emails_; - extern const char *Txt_Step_2_Select_the_type_of_user_to_register_remove; - extern const char *Txt_Step_3_Select_the_desired_action; - extern const char *Txt_Step_4_Optionally_select_groups; - extern const char *Txt_Select_the_groups_in_from_which_you_want_to_register_remove_users_; - extern const char *Txt_No_groups_have_been_created_in_the_course_X_Therefore_; - extern const char *Txt_Step_5_Confirm_the_enrollment_removing; - extern const char *Txt_Confirm; - - fprintf (Gbl.F.Out,"
"); - - /***** Put link to remove all the students in the current course *****/ - if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected - Usr_PutFormToRemAllStdsThisCrs (); - - /***** Put link to remove old users *****/ - if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER) - Usr_PutFormToRemOldUsrs (); - - /***** Form to send students to be enrolled / removed *****/ - Act_FormStart (ActRcvFrmMdfUsrCrs); - - /***** Step 1: List of students to be enrolled / removed *****/ - fprintf (Gbl.F.Out,"
" - "
%s
", - The_ClassTitle[Gbl.Prefs.Theme], - Txt_Step_1_Provide_a_list_of_users); - - /* Option a: get students from official lists */ - fprintf (Gbl.F.Out,"
" - "
%s
 
", - The_ClassTitle[Gbl.Prefs.Theme], - Txt_Option_a_Import_students_from_the_official_lists); - if (Cfg_EXTERNAL_LOGIN_CLIENT_COMMAND[0] == '\0') - Lay_ShowAlert (Lay_INFO,Txt_There_is_no_external_service_for_authentication_and_official_lists); - else - { - Lay_ShowAlert (Lay_INFO,Txt_Select_the_groups_of_students_you_want_to_register_in_remove_from_this_course); - Imp_ListMyImpGrpsAndStdsForm (); - } - - /* Option b: get students' IDs from pasted text */ - fprintf (Gbl.F.Out,"
" - "
%s
 
", - The_ClassTitle[Gbl.Prefs.Theme], - Txt_Option_b_Type_or_paste_a_list_of_users); - Lay_ShowAlert (Lay_INFO,Txt_Type_or_paste_a_list_of_IDs_nicks_or_emails_); - Usr_PutAreaToEnterUsrsIDs (); - - /***** Step 2: Select type of user to register/remove to/from current course *****/ - fprintf (Gbl.F.Out,"
" - "
%s
 
", - The_ClassTitle[Gbl.Prefs.Theme], - Txt_Step_2_Select_the_type_of_user_to_register_remove); - if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected - Usr_PutAllRolesRegRemUsrsCrs (); - - /***** Step 3: Put different actions to register/remove students to/from current course *****/ - fprintf (Gbl.F.Out,"
" - "
%s
 
", - The_ClassTitle[Gbl.Prefs.Theme], - Txt_Step_3_Select_the_desired_action); - Usr_PutActionsRegRemSeveralUsrs (); - - /***** Step 4: Select groups in which register / remove students *****/ - fprintf (Gbl.F.Out,"
" - "
%s
 
", - The_ClassTitle[Gbl.Prefs.Theme], - Txt_Step_4_Optionally_select_groups); - if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected - { - if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups? - { - Lay_ShowAlert (Lay_INFO,Txt_Select_the_groups_in_from_which_you_want_to_register_remove_users_); - Grp_ShowLstGrpsToChgOtherUsrsGrps (-1L); - } - else - { - /* Write help message */ - sprintf (Gbl.Message,Txt_No_groups_have_been_created_in_the_course_X_Therefore_, - Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - } - } - - /***** Step 5: Button to register / remove students *****/ - fprintf (Gbl.F.Out,"
" - "
%s
 
", - The_ClassTitle[Gbl.Prefs.Theme], - Txt_Step_5_Confirm_the_enrollment_removing); - Pwd_AskForConfirmationOnDangerousAction (); - Lay_PutSendButton (Txt_Confirm); - - /***** End of form *****/ - fprintf (Gbl.F.Out,"" - "
"); - } - -/*****************************************************************************/ -/***** Put text area to enter/paste IDs of users to be enrolled/removed ******/ -/*****************************************************************************/ - -static void Usr_PutAreaToEnterUsrsIDs (void) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_List_of_nicks_emails_or_IDs; - - /***** Start of text area *****/ - fprintf (Gbl.F.Out,"" - "" - "" - "" - "" - "
%s: " - "" - "
"); - } - -/*****************************************************************************/ -/*** Put different actions to register/remove users to/from current course ***/ -/*****************************************************************************/ -// Returns true if at least one action can be shown - -static bool Usr_PutActionsRegRemOneUsr (bool ItsMe) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_Modify_me_in_the_course_X; - extern const char *Txt_Modify_user_in_the_course_X; - extern const char *Txt_Register_me_in_the_course_X; - extern const char *Txt_Register_user_in_the_course_X; - extern const char *Txt_Register_user_as_an_administrator_of_the_degree_X; - extern const char *Txt_Remove_me_from_the_course_X; - extern const char *Txt_Remove_user_from_the_course_X; - extern const char *Txt_Remove_me_as_an_administrator_of_the_degree_X; - extern const char *Txt_Remove_user_as_an_administrator_of_the_degree_X; - extern const char *Txt_Completely_eliminate_me; - extern const char *Txt_Completely_eliminate_user; - unsigned NumOptionsShown = 0; - bool UsrBelongsToCrs = false; - bool UsrIsDegAdmin = false; - bool OptionChecked = false; - - /***** Check if the other user belongs to the current course *****/ - if (Gbl.CurrentCrs.Crs.CrsCod > 0) - UsrBelongsToCrs = Usr_CheckIfUsrBelongsToCrs (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.CurrentCrs.Crs.CrsCod); - - /***** Check if the other user is administrator of the current degree *****/ - if (Gbl.CurrentDeg.Deg.DegCod > 0 && - ((Gbl.Usrs.Me.LoggedRole == Rol_ROLE_DEG_ADMIN && ItsMe) || - Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)) - UsrIsDegAdmin = Usr_CheckIfUsrIsAdmOfDeg (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.CurrentDeg.Deg.DegCod); - - /***** Start list of options *****/ - fprintf (Gbl.F.Out,"
" - "
    ", - The_ClassFormul[Gbl.Prefs.Theme]); - - /***** Register user in course / Modify user's data *****/ - if (Gbl.CurrentCrs.Crs.CrsCod > 0) - { - sprintf (Gbl.Message,UsrBelongsToCrs ? (ItsMe ? Txt_Modify_me_in_the_course_X : - Txt_Modify_user_in_the_course_X) : - (ItsMe ? Txt_Register_me_in_the_course_X : - Txt_Register_user_in_the_course_X), - Gbl.CurrentCrs.Crs.ShortName); - fprintf (Gbl.F.Out,"
  • " - "%s
  • ",Gbl.Message); - - NumOptionsShown++; - } - - /***** Register user as administrator of degree *****/ - if (Gbl.CurrentDeg.Deg.DegCod > 0 && - !UsrIsDegAdmin && - Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER) - { - sprintf (Gbl.Message,Txt_Register_user_as_an_administrator_of_the_degree_X, - Gbl.CurrentDeg.Deg.ShortName); - fprintf (Gbl.F.Out,"
  • " - "%s
  • ",Gbl.Message); - - NumOptionsShown++; - } - - /***** Remove user from the course *****/ - if (UsrBelongsToCrs) - { - sprintf (Gbl.Message, - ItsMe ? Txt_Remove_me_from_the_course_X : - Txt_Remove_user_from_the_course_X, - Gbl.CurrentCrs.Crs.ShortName); - fprintf (Gbl.F.Out,"
  • " - "%s
  • ",Gbl.Message); - - NumOptionsShown++; - } - - /***** Remove user as an administrator of the degree *****/ - if (Gbl.CurrentDeg.Deg.DegCod > 0 && - UsrIsDegAdmin && - ((Gbl.Usrs.Me.LoggedRole == Rol_ROLE_DEG_ADMIN && ItsMe) || - Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)) - { - sprintf (Gbl.Message, - ItsMe ? Txt_Remove_me_as_an_administrator_of_the_degree_X : - Txt_Remove_user_as_an_administrator_of_the_degree_X, - Gbl.CurrentDeg.Deg.ShortName); - fprintf (Gbl.F.Out,"
  • " - "%s
  • ",Gbl.Message); - - NumOptionsShown++; - } - - /***** Eliminate user completely from platform *****/ - if (Usr_CheckIfICanEliminateAccount (ItsMe)) - { - fprintf (Gbl.F.Out,"
  • " - "%s
  • ", - ItsMe ? Txt_Completely_eliminate_me : - Txt_Completely_eliminate_user); - - NumOptionsShown++; - } - - /***** End list of options *****/ - fprintf (Gbl.F.Out,"
" - "
"); - - return (NumOptionsShown ? true : - false); - } - -/*****************************************************************************/ -/******** Check if I can eliminate completely another user's account *********/ -/*****************************************************************************/ - -static bool Usr_CheckIfICanEliminateAccount (bool ItsMe) - { - // A user logged as superuser can eliminate any user except her/him - // Other users only can eliminate themselves - return (( ItsMe && // It's me - (Gbl.Usrs.Me.AvailableRoles & (1 << Rol_ROLE_SUPERUSER)) == 0) // I can not be superuser - || - (!ItsMe && // It's not me - Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)); // I am logged as superuser - } - -/*****************************************************************************/ -/*** Put different actions to register/remove users to/from current course ***/ -/*****************************************************************************/ - -static void Usr_PutActionsRegRemSeveralUsrs (void) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_Register_the_users_indicated_in_step_1; - extern const char *Txt_Remove_the_users_indicated_in_step_1; - extern const char *Txt_Remove_the_users_not_indicated_in_step_1; - extern const char *Txt_Register_the_users_indicated_in_step_1_and_remove_the_users_not_indicated; - extern const char *Txt_Eliminate_from_the_platform_the_users_indicated_in_step_1; - - /***** Start list of options *****/ - fprintf (Gbl.F.Out,"
" - "
    ", - The_ClassFormul[Gbl.Prefs.Theme]); - - /***** Register / remove users listed or not listed *****/ - if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected - fprintf (Gbl.F.Out,"
  • " - "" - "%s
  • " - "
  • " - "" - "%s
  • " - "
  • " - "" - "%s
  • " - "
  • " - "" - "%s
  • ", - (unsigned) Usr_REGISTER_SPECIFIED_USRS_IN_CRS, - Txt_Register_the_users_indicated_in_step_1, - (unsigned) Usr_REMOVE_SPECIFIED_USRS_FROM_CRS, - Txt_Remove_the_users_indicated_in_step_1, - (unsigned) Usr_REMOVE_NOT_SPECIFIED_USRS_FROM_CRS, - Txt_Remove_the_users_not_indicated_in_step_1, - (unsigned) Usr_UPDATE_USRS_IN_CRS, - Txt_Register_the_users_indicated_in_step_1_and_remove_the_users_not_indicated); - - /***** Only for superusers *****/ - if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER) - fprintf (Gbl.F.Out,"
  • " - "" - "%s
  • ", - (unsigned) Usr_ELIMINATE_USRS_FROM_PLATFORM, - Txt_Eliminate_from_the_platform_the_users_indicated_in_step_1); - - /***** End list of options *****/ - fprintf (Gbl.F.Out,"
" - "
"); - } - -/*****************************************************************************/ -/*** Select types of user to register/remove users to/from current course ****/ -/*****************************************************************************/ - -static void Usr_PutAllRolesRegRemUsrsCrs (void) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - - /***** Students or teachers *****/ - fprintf (Gbl.F.Out,"
" - "
    ", - The_ClassFormul[Gbl.Prefs.Theme]); - Usr_PutOneRoleRegRemUsrsCrs (Rol_ROLE_STUDENT,true); - Usr_PutOneRoleRegRemUsrsCrs (Rol_ROLE_TEACHER,false); - fprintf (Gbl.F.Out,"
" - "
"); - } - -/*****************************************************************************/ -/*** Select types of user to register/remove users to/from current course ****/ -/*****************************************************************************/ - -static void Usr_PutOneRoleRegRemUsrsCrs (Rol_Role_t Role,bool Checked) - { - extern const char *Txt_ROLES_SINGULAR_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - - fprintf (Gbl.F.Out,"
  • " - "%s
  • ", - Txt_ROLES_SINGULAR_Abc[Role][Usr_SEX_UNKNOWN]); - } - -/*****************************************************************************/ -/******* Receive the list of users of the course to register/remove **********/ -/*****************************************************************************/ - -void Usr_ReceiveFormUsrsCrs (void) - { - extern const char *Txt_You_must_specify_in_step_3_the_action_to_perform; - extern const char *Txt_In_a_type_of_group_with_single_enrollment_students_can_not_be_registered_in_more_than_one_group; - extern const char *Txt_No_user_has_been_eliminated; - extern const char *Txt_One_user_has_been_eliminated; - extern const char *Txt_No_user_has_been_removed; - extern const char *Txt_One_user_has_been_removed; - extern const char *Txt_X_users_have_been_eliminated; - extern const char *Txt_X_users_have_been_removed; - extern const char *Txt_No_user_has_been_enrolled; - extern const char *Txt_One_user_has_been_enrolled; - extern const char *Txt_X_users_have_been_enrolled_including_possible_repetitions; - char ListExternalGrpCods[Imp_MAX_BYTES_LIST_EXTERNAL_GRP_CODS+1]; - char ExternalStr[1+10+1+Crs_LENGTH_INSTITUTIONAL_CRS_COD+1]; - char ExternalCrsCod[Crs_LENGTH_INSTITUTIONAL_CRS_COD+1]; - char UnsignedStr[10+1]; - unsigned UnsignedNum; - long LongNum; - Rol_Role_t RegRemRole = Rol_ROLE_STUDENT; - struct - { - bool RemoveUsrs; - bool RemoveSpecifiedUsrs; - bool EliminateUsrs; - bool RegisterUsrs; - } WhatToDo; - char *ListUsrsIDs; - struct ListUsrCods ListUsrCods; // List with users' codes for a given user's ID - unsigned NumUsrFound; - const char *Ptr; - unsigned NumCurrentUsr; - long GrpCod; - unsigned NumUsrsRegistered = 0; - unsigned NumUsrsRemoved = 0; - unsigned NumUsrsEliminated = 0; - struct ListUsers *LstCurrentUsrs; - struct ListCodGrps LstGrps; - struct UsrData UsrDat; - bool ItLooksLikeAUsrID; - Usr_RegRemUsrsAction_t RegRemUsrsAction; - bool ErrorInForm = false; - - /***** Get confirmation *****/ - if (!Pwd_GetConfirmationOnDangerousAction ()) - return; - - /***** Get the type of user to register / remove *****/ - Par_GetParToText ("RegRemRole",UnsignedStr,1); - if (UnsignedStr[0]) - switch ((RegRemRole = Usr_ConvertUnsignedStrToRole (UnsignedStr))) - { - case Rol_ROLE_STUDENT: - break; - case Rol_ROLE_TEACHER: - switch (Gbl.Usrs.Me.LoggedRole) // Can I register/remove teachers? - { - case Rol_ROLE_DEG_ADMIN: - case Rol_ROLE_SUPERUSER: // Yes, I can - break; - default: // No, I can not (TODO: teachers should be able to register/remove existing teachers) - Lay_ShowErrorAndExit ("You are not allowed to perform this action."); // If user manipulated the form - break; - } - break; - default: - Lay_ShowErrorAndExit ("Wrong role."); // If user manipulated the form - break; - } - - /***** Get the action to do *****/ - WhatToDo.RemoveUsrs = false; - WhatToDo.RemoveSpecifiedUsrs = false; - WhatToDo.EliminateUsrs = false; - WhatToDo.RegisterUsrs = false; - - Par_GetParToText ("RegRemAction",UnsignedStr,1); - if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1) - if (UnsignedNum < Usr_NUM_ACTIONS_REG_REM_USRS) - switch (RegRemUsrsAction = (Usr_RegRemUsrsAction_t) UnsignedNum) - { - case Usr_REGISTER_SPECIFIED_USRS_IN_CRS: - WhatToDo.RemoveUsrs = false; - WhatToDo.RemoveSpecifiedUsrs = false; // Ignored - WhatToDo.EliminateUsrs = false; // Ignored - WhatToDo.RegisterUsrs = true; - break; - case Usr_REMOVE_SPECIFIED_USRS_FROM_CRS: - WhatToDo.RemoveUsrs = true; - WhatToDo.RemoveSpecifiedUsrs = true; - WhatToDo.EliminateUsrs = false; - WhatToDo.RegisterUsrs = false; - break; - case Usr_REMOVE_NOT_SPECIFIED_USRS_FROM_CRS: - WhatToDo.RemoveUsrs = true; - WhatToDo.RemoveSpecifiedUsrs = false; - WhatToDo.EliminateUsrs = false; - WhatToDo.RegisterUsrs = false; - break; - case Usr_UPDATE_USRS_IN_CRS: - WhatToDo.RemoveUsrs = true; - WhatToDo.RemoveSpecifiedUsrs = false; - WhatToDo.EliminateUsrs = false; - WhatToDo.RegisterUsrs = true; - break; - case Usr_ELIMINATE_USRS_FROM_PLATFORM: - if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER) - { - WhatToDo.RemoveUsrs = true; - WhatToDo.RemoveSpecifiedUsrs = true; - WhatToDo.EliminateUsrs = true; - WhatToDo.RegisterUsrs = false; - } - else - Lay_ShowErrorAndExit ("You are not allowed to perform this action."); - break; - default: - Lay_ShowErrorAndExit ("Wrong registering / removing specification."); - break; - } - else - Lay_ShowErrorAndExit ("Wrong registering / removing specification."); - else - { - Lay_ShowAlert (Lay_WARNING,Txt_You_must_specify_in_step_3_the_action_to_perform); - - /* Show form again */ - Usr_ShowFormRegRemSeveralUsrs (); - ErrorInForm = true; - } - - if (!ErrorInForm) - { - /***** Get external groups of students *****/ - Par_GetParMultiToText ("ImpGrpCod",ListExternalGrpCods,Imp_MAX_BYTES_LIST_EXTERNAL_GRP_CODS); - - /***** Get groups to which register/remove users *****/ - LstGrps.NumGrps = 0; - if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups? - { - /***** Get list of groups types and groups in current course *****/ - Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS); - - /***** Get the list of groups to which register/remove students *****/ - Grp_GetLstCodsGrpWanted (&LstGrps); - - /***** A student can't belong to more than one group when the type of group only allows to register in one group *****/ - if (WhatToDo.RegisterUsrs && - RegRemRole == Rol_ROLE_STUDENT && - LstGrps.NumGrps >= 2) - /* Check if I have selected more than one group of single enrollment */ - if (!Grp_CheckIfSelectionGrpsIsValid (&LstGrps)) - { - /* Show warning message and exit */ - Lay_ShowAlert (Lay_WARNING,Txt_In_a_type_of_group_with_single_enrollment_students_can_not_be_registered_in_more_than_one_group); - - /* Free memory used by lists of groups and abort */ - Grp_FreeListCodGrp (&LstGrps); - Grp_FreeListGrpTypesAndGrps (); - return; - } - } - - /***** Get list of users' IDs *****/ - if ((ListUsrsIDs = (char *) malloc (ID_MAX_BYTES_LIST_USRS_IDS+1)) == NULL) - Lay_ShowErrorAndExit ("Not enough memory to store users' IDs."); - Par_GetParToText ("UsrsIDs",ListUsrsIDs,ID_MAX_BYTES_LIST_USRS_IDS); - - /***** Initialize structure with user's data *****/ - Usr_UsrDataConstructor (&UsrDat); - - /***** Remove users *****/ - if (WhatToDo.RemoveUsrs) - { - /***** Get list of users in current course *****/ - switch (RegRemRole) - { - case Rol_ROLE_STUDENT: - Usr_GetUsrsLst (Rol_ROLE_STUDENT,Sco_SCOPE_COURSE,NULL,false); - LstCurrentUsrs = &Gbl.Usrs.LstStds; - break; - case Rol_ROLE_TEACHER: - Usr_GetUsrsLst (Rol_ROLE_TEACHER,Sco_SCOPE_COURSE,NULL,false); - LstCurrentUsrs = &Gbl.Usrs.LstTchs; - break; - default: - LstCurrentUsrs = NULL; // To avoid warning - Lay_ShowErrorAndExit ("Wrong role."); // If user manipulated the form - break; - } - - if (LstCurrentUsrs->NumUsrs) - { - /***** Initialize list of users to remove *****/ - for (NumCurrentUsr = 0; - NumCurrentUsr < LstCurrentUsrs->NumUsrs; - NumCurrentUsr++) - LstCurrentUsrs->Lst[NumCurrentUsr].Remove = !WhatToDo.RemoveSpecifiedUsrs; - - /***** Loop 1: go through form list setting if a student must be removed *****/ - /* Step a: Get students from a list of official groups */ - if (RegRemRole == Rol_ROLE_STUDENT) - { - Ptr = ListExternalGrpCods; - while (*Ptr) - { - /* Find next external group code and course code in list */ - Str_GetNextStringUntilSeparator (&Ptr,ExternalStr,1+10+1+Crs_LENGTH_INSTITUTIONAL_CRS_COD); - if (sscanf (ExternalStr,"%ld_%s",&LongNum,ExternalCrsCod) == 2) - { - GrpCod = LongNum; - - /* Mark users belonging to this official group as removable */ - Usr_MarkOfficialStdsAsRemovable (GrpCod,WhatToDo.RemoveSpecifiedUsrs); - } - } - } - - /* Step b: Get users from a list of users' IDs */ - Ptr = ListUsrsIDs; - while (*Ptr) - { - /* Reset user */ - UsrDat.UsrCod = -1L; - - /* Find next string in text */ - Str_GetNextStringUntilSeparator (&Ptr,UsrDat.UsrIDNickOrEmail,Usr_MAX_BYTES_USR_LOGIN); - - /* Reset default list of users' codes */ - ListUsrCods.NumUsrs = 0; - ListUsrCods.Lst = NULL; - - /* Check if string is a user's ID, user's nickname or user's e-mail address */ - if (Nck_CheckIfNickWithArrobaIsValid (UsrDat.UsrIDNickOrEmail)) // 1: It's a nickname - { - if ((UsrDat.UsrCod = Nck_GetUsrCodFromNickname (UsrDat.UsrIDNickOrEmail)) > 0) - { - ListUsrCods.NumUsrs = 1; - Usr_AllocateListUsrCods (&ListUsrCods); - ListUsrCods.Lst[0] = UsrDat.UsrCod; - } - } - else if (Mai_CheckIfEmailIsValid (UsrDat.UsrIDNickOrEmail)) // 2: It's an e-mail - { - if ((UsrDat.UsrCod = Mai_GetUsrCodFromEmail (UsrDat.UsrIDNickOrEmail)) > 0) - { - ListUsrCods.NumUsrs = 1; - Usr_AllocateListUsrCods (&ListUsrCods); - ListUsrCods.Lst[0] = UsrDat.UsrCod; - } - } - else // 3: It looks like a user's ID - { - // Users' IDs are always stored internally in capitals and without leading zeros - Str_RemoveLeadingZeros (UsrDat.UsrIDNickOrEmail); - Str_ConvertToUpperText (UsrDat.UsrIDNickOrEmail); - if (ID_CheckIfUsrIDSeemsAValidID (UsrDat.UsrIDNickOrEmail)) - { - /***** Find users for this user's ID *****/ - ID_ReallocateListIDs (&UsrDat,1); // Only one user's ID - strcpy (UsrDat.IDs.List[0].ID,UsrDat.UsrIDNickOrEmail); - ID_GetListUsrCodsFromUsrID (&UsrDat,NULL,&ListUsrCods,false); - } - } - - if (WhatToDo.RemoveSpecifiedUsrs) // Remove the specified users (of the role) - { - if (ListUsrCods.NumUsrs == 1) // If more than one user found ==> do not remove - for (NumCurrentUsr = 0; - NumCurrentUsr < LstCurrentUsrs->NumUsrs; - NumCurrentUsr++) - if (LstCurrentUsrs->Lst[NumCurrentUsr].UsrCod == ListUsrCods.Lst[0]) // User found - LstCurrentUsrs->Lst[NumCurrentUsr].Remove = true; // Mark as removable - } - else // Remove all the users (of the role) except these specified - { - for (NumCurrentUsr = 0; - NumCurrentUsr < LstCurrentUsrs->NumUsrs; - NumCurrentUsr++) - for (NumUsrFound = 0; - NumUsrFound < ListUsrCods.NumUsrs; - NumUsrFound++) - if (LstCurrentUsrs->Lst[NumCurrentUsr].UsrCod == ListUsrCods.Lst[NumUsrFound]) // User found - LstCurrentUsrs->Lst[NumCurrentUsr].Remove = false; // Mark as not removable - } - - /* Free memory used for list of users' codes found for this ID */ - Usr_FreeListUsrCods (&ListUsrCods); - } - - /***** Loop 2: go through users list removing users *****/ - for (NumCurrentUsr = 0; - NumCurrentUsr < LstCurrentUsrs->NumUsrs; - NumCurrentUsr++) - if (LstCurrentUsrs->Lst[NumCurrentUsr].Remove) // If this student must be removed - { - UsrDat.UsrCod = LstCurrentUsrs->Lst[NumCurrentUsr].UsrCod; - if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat)) // If user's data exist... - { - if (WhatToDo.EliminateUsrs) // Eliminate user completely from the platform - { - Usr_DeleteUsrFromPlatform (&UsrDat,Cns_QUIET); // Remove definitely the user from the platform - NumUsrsEliminated++; - } - else - { - if (Gbl.CurrentCrs.Grps.NumGrps) // If there are groups in the course - { - if (LstGrps.NumGrps) // If the teacher has selected groups - { - if (Grp_RemoveUsrFromGroups (&UsrDat,&LstGrps)) // Remove user from the selected groups, not from the whole course - NumUsrsRemoved++; - } - else // The teacher has not selected groups - { - Usr_EffectivelyRemUsrFromCrs (&UsrDat,&Gbl.CurrentCrs.Crs, - Usr_DO_NOT_REMOVE_WORKS,Cns_QUIET); // Remove user from the course - NumUsrsRemoved++; - } - } - else // No groups - { - Usr_EffectivelyRemUsrFromCrs (&UsrDat,&Gbl.CurrentCrs.Crs, - Usr_DO_NOT_REMOVE_WORKS,Cns_QUIET); // Remove user from the course - NumUsrsRemoved++; - } - } - } - } - } - - /***** Free memory for users list *****/ - Usr_FreeUsrsList (LstCurrentUsrs); - } - - /***** Register users *****/ - if (WhatToDo.RegisterUsrs) // TODO: !!!!! NO CAMBIAR EL ROL DE LOS USUARIOS QUE YA ESTÉN EN LA ASIGNATURA SI HAY MÁS DE UN USUARIO ENCONTRADO PARA EL MISMO DNI !!!!!! - { - /***** Step a: Get users from a list of official groups *****/ - if (RegRemRole == Rol_ROLE_STUDENT) - { - Ptr = ListExternalGrpCods; - while (*Ptr) - { - /* Find next official group code in list */ - Str_GetNextStringUntilSeparator (&Ptr,ExternalStr,1+10+1+Crs_LENGTH_INSTITUTIONAL_CRS_COD); - if (sscanf (ExternalStr,"%ld_%s",&LongNum,ExternalCrsCod) == 2) - { - GrpCod = LongNum; - - /* Import official group of users */ - Imp_ImportStdsFromAnImpGrp (GrpCod,&LstGrps,&NumUsrsRegistered); - - /* Update the institutional course code to the external course code */ - Crs_UpdateCurrentInstitutionalCrsCod (&Gbl.CurrentCrs.Crs,ExternalCrsCod); - } - } - } - - /***** Step b: Get users from a list of users' IDs ******/ - Ptr = ListUsrsIDs; - while (*Ptr) - { - /* Reset user */ - UsrDat.UsrCod = -1L; - ItLooksLikeAUsrID = false; - - /* Find next string in text */ - Str_GetNextStringUntilSeparator (&Ptr,UsrDat.UsrIDNickOrEmail,Usr_MAX_BYTES_USR_LOGIN); - - /* Reset default list of users' codes */ - ListUsrCods.NumUsrs = 0; - ListUsrCods.Lst = NULL; - - /* Check if the string is a user's ID, a user's nickname or a user's e-mail address */ - if (Nck_CheckIfNickWithArrobaIsValid (UsrDat.UsrIDNickOrEmail)) // 1: It's a nickname - { - if ((UsrDat.UsrCod = Nck_GetUsrCodFromNickname (UsrDat.UsrIDNickOrEmail)) > 0) - { - ListUsrCods.NumUsrs = 1; - Usr_AllocateListUsrCods (&ListUsrCods); - ListUsrCods.Lst[0] = UsrDat.UsrCod; - } - } - else if (Mai_CheckIfEmailIsValid (UsrDat.UsrIDNickOrEmail)) // 2: It's an e-mail - { - if ((UsrDat.UsrCod = Mai_GetUsrCodFromEmail (UsrDat.UsrIDNickOrEmail)) > 0) - { - ListUsrCods.NumUsrs = 1; - Usr_AllocateListUsrCods (&ListUsrCods); - ListUsrCods.Lst[0] = UsrDat.UsrCod; - } - } - else // 3: It looks like a user's ID - { - // Users' IDs are always stored internally in capitals and without leading zeros - Str_RemoveLeadingZeros (UsrDat.UsrIDNickOrEmail); - Str_ConvertToUpperText (UsrDat.UsrIDNickOrEmail); - if (ID_CheckIfUsrIDSeemsAValidID (UsrDat.UsrIDNickOrEmail)) - { - ItLooksLikeAUsrID = true; - - /* Find users for this user's ID */ - ID_ReallocateListIDs (&UsrDat,1); // Only one user's ID - strcpy (UsrDat.IDs.List[0].ID,UsrDat.UsrIDNickOrEmail); - ID_GetListUsrCodsFromUsrID (&UsrDat,NULL,&ListUsrCods,false); - } - } - - /* Register user(s) */ - if (ListUsrCods.NumUsrs) // User(s) found - for (NumUsrFound = 0; - NumUsrFound < ListUsrCods.NumUsrs; - NumUsrFound++) - { - UsrDat.UsrCod = ListUsrCods.Lst[NumUsrFound]; - Usr_RegisterUsr (&UsrDat,RegRemRole,&LstGrps,&NumUsrsRegistered); - } - else if (ItLooksLikeAUsrID) // User not found. He/she is a new user. Register him/her using ID - Usr_RegisterUsr (&UsrDat,RegRemRole,&LstGrps,&NumUsrsRegistered); - - /* Free memory used for list of users' codes found for this ID */ - Usr_FreeListUsrCods (&ListUsrCods); - } - } - - /***** Free memory used for user's data *****/ - Usr_UsrDataDestructor (&UsrDat); - - if (NumUsrsEliminated) - /***** Move unused contents of messages to table of deleted contents of messages *****/ - Msg_MoveUnusedMsgsContentToDeleted (); - - /***** Write messages with the number of users enrolled/removed *****/ - if (WhatToDo.RemoveUsrs) - { - if (WhatToDo.EliminateUsrs) // Eliminate completely from the platform - switch (NumUsrsEliminated) - { - case 0: - Lay_ShowAlert (Lay_INFO,Txt_No_user_has_been_eliminated); - break; - case 1: - Lay_ShowAlert (Lay_SUCCESS,Txt_One_user_has_been_eliminated); - break; - default: - sprintf (Gbl.Message,Txt_X_users_have_been_eliminated, - NumUsrsEliminated); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - break; - } - else // Only remove from course / groups - switch (NumUsrsRemoved) - { - case 0: - Lay_ShowAlert (Lay_INFO,Txt_No_user_has_been_removed); - break; - case 1: - Lay_ShowAlert (Lay_SUCCESS,Txt_One_user_has_been_removed); - break; - default: - sprintf (Gbl.Message,Txt_X_users_have_been_removed, - NumUsrsRemoved); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - break; - } - } - if (WhatToDo.RegisterUsrs) - switch (NumUsrsRegistered) - { - case 0: - Lay_ShowAlert (Lay_INFO,Txt_No_user_has_been_enrolled); - break; - case 1: - Lay_ShowAlert (Lay_SUCCESS,Txt_One_user_has_been_enrolled); - break; - default: - sprintf (Gbl.Message,Txt_X_users_have_been_enrolled_including_possible_repetitions, - NumUsrsRegistered); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - break; - } - - /***** Free memory used by the list of user's IDs *****/ - free (ListUsrsIDs); - - /***** Free memory with the list of groups to/from which register/remove users *****/ - Grp_FreeListCodGrp (&LstGrps); - - /***** Free list of groups types and groups in current course *****/ - Grp_FreeListGrpTypesAndGrps (); - } - } - -/*****************************************************************************/ -/********************** Register a user using his/her ID *********************/ -/*****************************************************************************/ -// If user does not exists, UsrDat->IDs must hold the user's ID - -static void Usr_RegisterUsr (struct UsrData *UsrDat,Rol_Role_t RegRemRole, - struct ListCodGrps *LstGrps,unsigned *NumUsrsRegistered) - { - /***** Check if I can register this user *****/ - if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_TEACHER && - RegRemRole != Rol_ROLE_STUDENT) - Lay_ShowErrorAndExit ("A teacher only can register new users if they are students."); - - /***** Check if the record of the user exists and get the type of user *****/ - if (UsrDat->UsrCod > 0) // User exists in database - Usr_GetAllUsrDataFromUsrCod (UsrDat); // Get user's data - else // User does not exist in database, create it using his/her ID! - { - // Reset user's data - Usr_ResetUsrDataExceptUsrCodAndIDs (UsrDat); // It's necessary, because the same struct UsrDat was used for former user - - // User does not exist in database;list of IDs is initialized - UsrDat->IDs.List[0].Confirmed = true; // If he/she is a new user ==> his/her ID will be stored as confirmed in database - Usr_CreateNewUsr (UsrDat); - } - - /***** Register user in current course in database *****/ - if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected - { - if (Usr_CheckIfUsrBelongsToCrs (UsrDat->UsrCod,Gbl.CurrentCrs.Crs.CrsCod)) // User does belong to current course, modify his/her role - Usr_ModifyRoleInCurrentCrs (UsrDat,RegRemRole, - Cns_QUIET,Usr_SET_ACCEPTED_TO_FALSE); - else - Usr_RegisterUsrInCurrentCrs (UsrDat,RegRemRole, - Cns_QUIET,Usr_SET_ACCEPTED_TO_FALSE); - - /***** Register user in the selected groups *****/ - if (Gbl.CurrentCrs.Grps.NumGrps) // If there are groups in the course - Grp_RegisterUsrIntoGroups (UsrDat,LstGrps); - } - - (*NumUsrsRegistered)++; - } - -/*****************************************************************************/ -/****** Mark the students belonging to an official group as removable ********/ -/*****************************************************************************/ - -static void Usr_MarkOfficialStdsAsRemovable (long ImpGrpCod,bool RemoveSpecifiedUsrs) - { - char Query[1024]; - MYSQL_RES *mysql_res; - MYSQL_ROW row; - unsigned NumStds; - unsigned NumStd; - unsigned NumUsr; - struct ListUsrCods ListUsrCods; // List with users' codes for a given user's ID - unsigned NumUsrFound; - - /***** Get imported students belonging to this group from database *****/ - sprintf (Query,"SELECT UsrID FROM imported_students WHERE GrpCod='%ld'", - ImpGrpCod); - NumStds = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get imported students"); - - /***** Mark the students from this official group as removable *****/ - for (NumStd = 0; - NumStd < NumStds; - NumStd++) // For each student inside the official group... - { - /* Get user's ID of the student from official list */ - row = mysql_fetch_row (mysql_res); - - /***** Allocate space for the list *****/ - ID_ReallocateListIDs (&Gbl.Usrs.Other.UsrDat,1); - - strncpy (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID,row[0],ID_MAX_LENGTH_USR_ID); - Gbl.Usrs.Other.UsrDat.IDs.List[0].ID[ID_MAX_LENGTH_USR_ID] = '\0'; - // Users' IDs are always stored internally in capitals and without leading zeros - Str_RemoveLeadingZeros (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID); - Str_ConvertToUpperText (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID); - - /* Check if this official user's ID is in the list of students */ - if (ID_CheckIfUsrIDIsValid (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID)) - if (ID_GetListUsrCodsFromUsrID (&Gbl.Usrs.Other.UsrDat,NULL,&ListUsrCods,false)) // User(s) found - { - for (NumUsr = 0; - NumUsr < Gbl.Usrs.LstStds.NumUsrs; - NumUsr++) - for (NumUsrFound = 0; - NumUsrFound < ListUsrCods.NumUsrs; - NumUsrFound++) - if (Gbl.Usrs.LstStds.Lst[NumUsr].UsrCod == ListUsrCods.Lst[NumUsrFound]) // User found - Gbl.Usrs.LstStds.Lst[NumUsr].Remove = RemoveSpecifiedUsrs; - - /* Free memory used for list of users' codes found for this ID */ - Usr_FreeListUsrCods (&ListUsrCods); - } - } - - /***** Free structure that stores the query result *****/ - DB_FreeMySQLResult (&mysql_res); - } - -/*****************************************************************************/ -/**** Put a link (form) to remove all the students in the current course *****/ -/*****************************************************************************/ - -static void Usr_PutFormToRemAllStdsThisCrs (void) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_Remove_all_students; - - /***** Put form to remove all the students in the current course *****/ - Act_FormStart (ActReqRemAllStdCrs); - Act_LinkFormSubmit (Txt_Remove_all_students,The_ClassFormul[Gbl.Prefs.Theme]); - Lay_PutSendIcon ("delon",Txt_Remove_all_students,Txt_Remove_all_students); - fprintf (Gbl.F.Out,""); - } - -/*****************************************************************************/ -/********** Ask for removing all the students from current course ************/ -/*****************************************************************************/ - -void Usr_AskRemAllStdsThisCrs (void) - { - extern const char *Txt_Do_you_really_want_to_remove_the_X_students_from_the_course_Y_; - extern const char *Txt_Remove_students; - extern const char *Txt_No_users_found[Rol_NUM_ROLES]; - unsigned NumStds; - - if ((NumStds = Usr_GetNumUsrsInCrs (Rol_ROLE_STUDENT,Gbl.CurrentCrs.Crs.CrsCod))) - { - /***** Write message to confirm the removing *****/ - sprintf (Gbl.Message,Txt_Do_you_really_want_to_remove_the_X_students_from_the_course_Y_, - NumStds,Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - - /***** Form to remove all the students in current course *****/ - Act_FormStart (ActRemAllStdCrs); - Grp_PutParamAllGroups (); - Pwd_AskForConfirmationOnDangerousAction (); - Lay_PutSendButton (Txt_Remove_students); - fprintf (Gbl.F.Out,""); - } - else - { - sprintf (Gbl.Message,Txt_No_users_found[Rol_ROLE_STUDENT], - Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - } - } - -/*****************************************************************************/ -/***************** Remove all the students from current course ***************/ -/*****************************************************************************/ - -void Usr_RemAllStdsThisCrs (void) - { - extern const char *Txt_The_X_students_who_belonged_to_the_course_Y_have_been_removed_from_it; - extern const char *Txt_No_users_found[Rol_NUM_ROLES]; - unsigned NumStdsInCrs; - - if (Pwd_GetConfirmationOnDangerousAction ()) - { - if ((NumStdsInCrs = Usr_RemAllStdsInCrs (&Gbl.CurrentCrs.Crs))) - { - sprintf (Gbl.Message,Txt_The_X_students_who_belonged_to_the_course_Y_have_been_removed_from_it, - NumStdsInCrs,Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - else - { - sprintf (Gbl.Message,Txt_No_users_found[Rol_ROLE_STUDENT], - Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - } - } - } - -/*****************************************************************************/ -/***************** Remove all the students from a given course ***************/ -/*****************************************************************************/ -// Returns the numbers of students in the course before deletion - -unsigned Usr_RemAllStdsInCrs (struct Course *Crs) - { - unsigned NumStdsInCrs; - unsigned NumUsr; - - /***** Get list of students in current course *****/ - Gbl.Usrs.ClassPhoto.AllGroups = true; // Get all the students of the current course - Usr_GetUsrsLst (Rol_ROLE_STUDENT,Sco_SCOPE_COURSE,NULL,false); - NumStdsInCrs = Gbl.Usrs.LstStds.NumUsrs; - - /***** Remove all the students *****/ - for (NumUsr = 0; - NumUsr < NumStdsInCrs; - NumUsr++) - { - Gbl.Usrs.Other.UsrDat.UsrCod = Gbl.Usrs.LstStds.Lst[NumUsr].UsrCod; - Usr_EffectivelyRemUsrFromCrs (&Gbl.Usrs.Other.UsrDat,Crs, - Usr_REMOVE_WORKS,Cns_QUIET); - } - - /***** Free memory for students list *****/ - Usr_FreeUsrsList (&Gbl.Usrs.LstStds); - - return NumStdsInCrs; - } - -/*****************************************************************************/ -/************* Form to request sign up in the current course *****************/ -/*****************************************************************************/ - -void Usr_ReqSignUpInCrs (void) - { - extern const char *Txt_You_were_already_enrolled_as_X_in_the_course_Y; - extern const char *Txt_ROLES_SINGULAR_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - - /***** Check if I already belong to course *****/ - if (Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB >= Rol_ROLE_STUDENT) - { - sprintf (Gbl.Message,Txt_You_were_already_enrolled_as_X_in_the_course_Y, - Txt_ROLES_SINGULAR_abc[Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB][Gbl.Usrs.Me.UsrDat.Sex], - Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - } - else if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_GUEST || - Gbl.Usrs.Me.LoggedRole == Rol_ROLE_VISITOR) - /***** Show form to modify only the user's role or the user's data *****/ - Rec_ShowFormSignUpWithMyCommonRecord (); - else - Lay_ShowErrorAndExit ("You must be logged to sign up in a course."); // This never should happen - } - -/*****************************************************************************/ -/*********************** Sign up in the current course ***********************/ -/*****************************************************************************/ - -void Usr_SignUpInCrs (void) - { - extern const char *Txt_You_were_already_enrolled_as_X_in_the_course_Y; - extern const char *Txt_ROLES_SINGULAR_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - extern const char *Txt_Your_request_for_enrollment_as_X_in_the_course_Y_has_been_accepted_for_processing; - char Query[512]; - MYSQL_RES *mysql_res; - MYSQL_ROW row; - char UnsignedStr[10+1]; - Rol_Role_t RoleFromForm; - long ReqCod = -1L; - unsigned NumUsrsToBeNotifiedByEMail; - - /***** Check if I already belong to course *****/ - if (Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB >= Rol_ROLE_STUDENT) - { - sprintf (Gbl.Message,Txt_You_were_already_enrolled_as_X_in_the_course_Y, - Txt_ROLES_SINGULAR_abc[Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB][Gbl.Usrs.Me.UsrDat.Sex], - Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - } - else - { - /***** Get new role from record form *****/ - Par_GetParToText ("Role",UnsignedStr,10); - RoleFromForm = Usr_ConvertUnsignedStrToRole (UnsignedStr); - - /* Check if role is correct */ - if (!(RoleFromForm == Rol_ROLE_STUDENT || - RoleFromForm == Rol_ROLE_TEACHER)) - Lay_ShowErrorAndExit ("Wrong role."); - - /***** Try to get and old request of the same user in the same course from database *****/ - sprintf (Query,"SELECT ReqCod FROM crs_usr_requests" - " WHERE CrsCod='%ld' AND UsrCod='%ld'", - Gbl.CurrentCrs.Crs.CrsCod, - Gbl.Usrs.Me.UsrDat.UsrCod); - if (DB_QuerySELECT (Query,&mysql_res,"can not get enrollment request")) - { - row = mysql_fetch_row (mysql_res); - /* Get request code (row[0]) */ - ReqCod = Str_ConvertStrCodToLongCod (row[0]); - } - /* Free structure that stores the query result */ - DB_FreeMySQLResult (&mysql_res); - - /***** Request user in current course in database *****/ - if (ReqCod > 0) // Old request exists in database - { - sprintf (Query,"UPDATE crs_usr_requests SET Role='%u',RequestTime=NOW()" - " WHERE ReqCod='%ld' AND CrsCod='%ld' AND UsrCod='%ld'", - (unsigned) RoleFromForm, - ReqCod, - Gbl.CurrentCrs.Crs.CrsCod, - Gbl.Usrs.Me.UsrDat.UsrCod); - DB_QueryUPDATE (Query,"can not update enrollment request"); - } - else // No request in database for this user in this course - { - sprintf (Query,"INSERT INTO crs_usr_requests (CrsCod,UsrCod,Role,RequestTime)" - " VALUES ('%ld','%ld','%u',NOW())", - Gbl.CurrentCrs.Crs.CrsCod, - Gbl.Usrs.Me.UsrDat.UsrCod, - (unsigned) RoleFromForm); - ReqCod = DB_QueryINSERTandReturnCode (Query,"can not save enrollment request"); - } - - /***** Show confirmation message *****/ - sprintf (Gbl.Message,Txt_Your_request_for_enrollment_as_X_in_the_course_Y_has_been_accepted_for_processing, - Txt_ROLES_SINGULAR_abc[RoleFromForm][Gbl.Usrs.Me.UsrDat.Sex], - Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - - /***** Notify teachers or admins by e-mail about the new enrollment request *****/ - // If this course has teachers ==> send notification to teachers - // If this course has no teachers and I want to be a teacher ==> send notification to administrators or superusers - if (Gbl.CurrentCrs.Crs.NumTchs || RoleFromForm == Rol_ROLE_TEACHER) - { - NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_ENROLLMENT_REQUEST,ReqCod); - Ntf_ShowAlertNumUsrsToBeNotifiedByEMail (NumUsrsToBeNotifiedByEMail); - } - } - } - -/*****************************************************************************/ -/************** Put an enrollment request into a notification *****************/ -/*****************************************************************************/ -// This function may be called inside a web service, so don't report error - -void Usr_GetNotifEnrollmentRequest (char *SummaryStr,char **ContentStr, - long ReqCod,unsigned MaxChars,bool GetContent) - { - extern const char *Txt_ROLES_SINGULAR_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - char Query[256]; - MYSQL_RES *mysql_res; - MYSQL_ROW row; - struct UsrData UsrDat; - Rol_Role_t DesiredRole; - - SummaryStr[0] = '\0'; // Return nothing on error - - /***** Get user and requested role from database *****/ - sprintf (Query,"SELECT UsrCod,Role," - "DATE_FORMAT(RequestTime,'%%Y%%m%%d%%H%%i%%S')" - " FROM crs_usr_requests" - " WHERE ReqCod='%ld'", - ReqCod); - - if (!mysql_query (&Gbl.mysql,Query)) - if ((mysql_res = mysql_store_result (&Gbl.mysql)) != NULL) - { - /***** Result should have a unique row *****/ - if (mysql_num_rows (mysql_res) == 1) - { - /***** Get user and requested role *****/ - row = mysql_fetch_row (mysql_res); - - /* Initialize structure with user's data */ - Usr_UsrDataConstructor (&UsrDat); - - /* User's code (row[0]) */ - UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]); - Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat); - - /* Role (row[1]) */ - DesiredRole = Usr_ConvertUnsignedStrToRole (row[1]); - strcpy (SummaryStr,Txt_ROLES_SINGULAR_Abc[DesiredRole][UsrDat.Sex]); - if (MaxChars) - Str_LimitLengthHTMLStr (SummaryStr,MaxChars); - - if (GetContent) - if ((*ContentStr = (char *) malloc (16+1))) - /* Write date (row[2]) into content */ - sprintf (*ContentStr,"%c%c/%c%c/%c%c%c%c %c%c:%c%c", - row[2][ 6],row[2][ 7], - row[2][ 4],row[2][ 5], - row[2][ 0],row[2][ 1],row[2][ 2],row[2][ 3], - row[2][ 8],row[2][ 9], - row[2][10],row[2][11]); - - /* Free memory used for user's data */ - Usr_UsrDataDestructor (&UsrDat); - } - - mysql_free_result (mysql_res); - } - } - -/*****************************************************************************/ -/****** Ask if reject the request for enrollment of a user in a course *******/ -/*****************************************************************************/ - -void Usr_AskIfRejectSignUp (void) - { - extern const char *Txt_THE_USER_X_is_already_enrolled_in_the_course_Y; - extern const char *Txt_Do_you_really_want_to_reject_the_enrollment_request_; - extern const char *Txt_ROLES_SINGULAR_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - extern const char *Txt_Reject; - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - - Rol_Role_t Role; - - /***** Get user's code *****/ - Usr_GetParamOtherUsrCodEncrypted (); - - if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat)) // If user's data exist... - { - if (Usr_CheckIfUsrBelongsToCrs (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.CurrentCrs.Crs.CrsCod)) - { - /* User already belongs to this course */ - sprintf (Gbl.Message,Txt_THE_USER_X_is_already_enrolled_in_the_course_Y, - Gbl.Usrs.Other.UsrDat.FullName,Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - Rec_ShowCommonRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - - /* Remove inscription request because it has not sense */ - Usr_RemoveEnrollmentRequest (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Usrs.Other.UsrDat.UsrCod); - } - else // User does not belong to this course - { - Role = Usr_GetRequestedRole (Gbl.Usrs.Other.UsrDat.UsrCod); - if (Role == Rol_ROLE_STUDENT || - Role == Rol_ROLE_TEACHER) - { - /* Ask if reject */ - sprintf (Gbl.Message,Txt_Do_you_really_want_to_reject_the_enrollment_request_, - Gbl.Usrs.Other.UsrDat.FullName, - Txt_ROLES_SINGULAR_abc[Role][Gbl.Usrs.Other.UsrDat.Sex], - Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - Rec_ShowCommonRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - - /* Button to confirm rejection */ - Act_FormStart (ActRejSignUp); - Usr_PutParamOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EncryptedUsrCod); - - Lay_PutSendButton (Txt_Reject); - fprintf (Gbl.F.Out,""); - } - else - Lay_ShowErrorAndExit ("Wrong role."); - } - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - -/*****************************************************************************/ -/********* Reject the request for enrollment of a user in a course ***********/ -/*****************************************************************************/ - -void Usr_RejectSignUp (void) - { - extern const char *Txt_THE_USER_X_is_already_enrolled_in_the_course_Y; - extern const char *Txt_Enrollment_of_X_rejected; - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - - /***** Get user's code *****/ - Usr_GetParamOtherUsrCodEncrypted (); - - if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat)) // If user's data exist... - { - if (Usr_CheckIfUsrBelongsToCrs (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.CurrentCrs.Crs.CrsCod)) - { - /* User already belongs to this course */ - sprintf (Gbl.Message,Txt_THE_USER_X_is_already_enrolled_in_the_course_Y, - Gbl.Usrs.Other.UsrDat.FullName,Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - Rec_ShowCommonRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - } - - /* Remove inscription request */ - Usr_RemoveEnrollmentRequest (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Usrs.Other.UsrDat.UsrCod); - - /* Confirmation message */ - sprintf (Gbl.Message,Txt_Enrollment_of_X_rejected, - Gbl.Usrs.Other.UsrDat.FullName); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - - /* Show again the rest of registrarion requests */ - Usr_ShowEnrollmentRequests (); - } - -/*****************************************************************************/ -/******** Show pending requests for enrollment in the current course *********/ -/*****************************************************************************/ - -void Usr_ShowEnrollmentRequests (void) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_Scope; - extern const char *Txt_Users; - extern const char *Txt_Update; - extern const char *Txt_Course; - extern const char *Txt_Teachers_ABBREVIATION; - extern const char *Txt_Requester; - extern const char *Txt_Role; - extern const char *Txt_Date; - extern const char *Txt_Go_to_X; - extern const char *Txt_ROLES_SINGULAR_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - extern const char *Txt_Register; - extern const char *Txt_Reject; - extern const char *Txt_No_enrollment_requests; - unsigned Roles; - char Query[1024]; - MYSQL_RES *mysql_res; - MYSQL_ROW row; - unsigned NumReq; - unsigned NumRequests; - long ReqCod; - struct Degree Deg; - struct Course Crs; - struct UsrData UsrDat; - bool UsrExists; - bool UsrBelongsToCrs; - bool ShowPhoto = false; - char PhotoURL[PATH_MAX+1]; - Rol_Role_t DesiredRole; - - /***** Selection of scope and roles *****/ - /* Start form */ - Act_FormStart (ActSeeSignUpReq); - fprintf (Gbl.F.Out,"
    " - ""); - - /* Scope (whole platform, current centre, current degree or current course) */ - fprintf (Gbl.F.Out,"" - "" - "" - ""); - - /* Users' roles in listing */ - fprintf (Gbl.F.Out,"" - "" - "" - ""); - /* Form end */ - fprintf (Gbl.F.Out,"
    %s:", - The_ClassFormul[Gbl.Prefs.Theme],Txt_Scope); - Gbl.Scope.Allowed = 1 << Sco_SCOPE_PLATFORM | - 1 << Sco_SCOPE_COUNTRY | - 1 << Sco_SCOPE_INSTITUTION | - 1 << Sco_SCOPE_CENTRE | - 1 << Sco_SCOPE_DEGREE | - 1 << Sco_SCOPE_COURSE; - Gbl.Scope.Default = Sco_SCOPE_COURSE; - Sco_GetScope (); - Sco_PutSelectorScope (false); - fprintf (Gbl.F.Out,"
    %s:", - The_ClassFormul[Gbl.Prefs.Theme],Txt_Users); - Usr_GetSelectedRoles (&Roles); - if (!Roles) - /* Set default roles */ - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_ROLE_TEACHER: - Roles = (1 << Rol_ROLE_STUDENT) | (1 << Rol_ROLE_TEACHER); - break; - case Rol_ROLE_DEG_ADMIN: - case Rol_ROLE_SUPERUSER: - Roles = (1 << Rol_ROLE_TEACHER); - break; - default: - Lay_ShowErrorAndExit ("You don't have permission to list requesters."); - break; - } - Usr_WriteSelectorRoles (Roles); - fprintf (Gbl.F.Out,"
    " - "
    "); - Lay_PutSendButton (Txt_Update); - fprintf (Gbl.F.Out,""); - - /***** Build query *****/ - switch (Gbl.Scope.Current) - { - case Sco_SCOPE_PLATFORM: // Show requesters for the whole platform - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_ROLE_TEACHER: - 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 crs_usr,crs_usr_requests" - " WHERE crs_usr.UsrCod='%ld'" - " AND crs_usr.CrsCod=crs_usr_requests.CrsCod" - " AND ((1<0" - " ORDER BY crs_usr_requests.RequestTime DESC", - Gbl.Usrs.Me.UsrDat.UsrCod, - Roles); - 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" - " AND courses.CrsCod=crs_usr_requests.CrsCod" - " AND ((1<0" - " ORDER BY crs_usr_requests.RequestTime DESC", - Gbl.Usrs.Me.UsrDat.UsrCod, - Roles); - break; - case Rol_ROLE_SUPERUSER: - sprintf (Query,"SELECT ReqCod,CrsCod,UsrCod,Role,DATE_FORMAT(RequestTime,'%%Y%%m%%d%%H%%i%%S')" - " FROM crs_usr_requests WHERE ((1<0" - " ORDER BY RequestTime DESC", - Roles); - break; - default: - Lay_ShowErrorAndExit ("You don't have permission to list requesters."); - break; - } - break; - case Sco_SCOPE_INSTITUTION: // Show requesters for the current institution - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_ROLE_TEACHER: - 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 crs_usr,centres,degrees,courses,crs_usr_requests" - " WHERE crs_usr.UsrCod='%ld'" - " AND centres.InsCod='%ld'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND degrees.DegCod=courses.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND courses.CrsCod=crs_usr_requests.CrsCod" - " AND ((1<0" - " ORDER BY crs_usr_requests.RequestTime DESC", - Gbl.Usrs.Me.UsrDat.UsrCod, - Gbl.CurrentIns.Ins.InsCod, - Roles); - 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'" - " AND centres.InsCod='%ld'" - " AND deg_admin.DegCod=degrees.DegCod" - " AND deg_admin.DegCod=courses.DegCod" - " AND degrees.CtrCod=centres.CtrCod" - " AND courses.CrsCod=crs_usr_requests.CrsCod" - " AND ((1<0" - " ORDER BY crs_usr_requests.RequestTime DESC", - Gbl.Usrs.Me.UsrDat.UsrCod, - Gbl.CurrentIns.Ins.InsCod, - Roles); - break; - case Rol_ROLE_SUPERUSER: - 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 centres,degrees,courses,crs_usr_requests" - " WHERE centres.InsCod='%ld'" - " AND centres.CtrCod=degrees.CtrCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr_requests.CrsCod" - " AND ((1<0" - " ORDER BY crs_usr_requests.RequestTime DESC", - Gbl.CurrentIns.Ins.InsCod, - Roles); - break; - default: - Lay_ShowErrorAndExit ("You don't have permission to list requesters."); - break; - } - break; - case Sco_SCOPE_CENTRE: // Show requesters for the current centre - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_ROLE_TEACHER: - 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 crs_usr,degrees,courses,crs_usr_requests" - " WHERE crs_usr.UsrCod='%ld'" - " AND degrees.CtrCod='%ld'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr_requests.CrsCod" - " AND ((1<0" - " ORDER BY crs_usr_requests.RequestTime DESC", - Gbl.Usrs.Me.UsrDat.UsrCod, - Gbl.CurrentCtr.Ctr.CtrCod, - Roles); - 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'" - " AND degrees.CtrCod='%ld'" - " AND deg_admin.DegCod=degrees.DegCod" - " AND deg_admin.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr_requests.CrsCod" - " AND ((1<0" - " ORDER BY crs_usr_requests.RequestTime DESC", - Gbl.Usrs.Me.UsrDat.UsrCod, - Gbl.CurrentCtr.Ctr.CtrCod, - Roles); - break; - case Rol_ROLE_SUPERUSER: - 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 degrees,courses,crs_usr_requests" - " WHERE degrees.CtrCod='%ld'" - " AND degrees.DegCod=courses.DegCod" - " AND courses.CrsCod=crs_usr_requests.CrsCod" - " AND ((1<0" - " ORDER BY crs_usr_requests.RequestTime DESC", - Gbl.CurrentCtr.Ctr.CtrCod, - Roles); - break; - default: - Lay_ShowErrorAndExit ("You don't have permission to list requesters."); - break; - } - break; - case Sco_SCOPE_DEGREE: // Show requesters for the current degree - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_ROLE_TEACHER: - 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 crs_usr,courses,crs_usr_requests" - " WHERE crs_usr.UsrCod='%ld'" - " AND crs_usr.CrsCod=courses.CrsCod" - " AND courses.DegCod='%ld'" - " AND courses.CrsCod=crs_usr_requests.CrsCod" - " AND ((1<0" - " ORDER BY crs_usr_requests.RequestTime DESC", - Gbl.Usrs.Me.UsrDat.UsrCod, - Gbl.CurrentDeg.Deg.DegCod, - Roles); - break; - case Rol_ROLE_DEG_ADMIN: - case Rol_ROLE_SUPERUSER: - 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 courses,crs_usr_requests" - " WHERE courses.DegCod='%ld'" - " AND courses.CrsCod=crs_usr_requests.CrsCod" - " AND ((1<0" - " ORDER BY crs_usr_requests.RequestTime DESC", - Gbl.CurrentDeg.Deg.DegCod, - Roles); - break; - default: - Lay_ShowErrorAndExit ("You don't have permission to list requesters."); - break; - } - break; - case Sco_SCOPE_COURSE: // Show requesters for the current course - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_ROLE_TEACHER: - case Rol_ROLE_DEG_ADMIN: - case Rol_ROLE_SUPERUSER: - sprintf (Query,"SELECT ReqCod,CrsCod,UsrCod,Role,DATE_FORMAT(RequestTime,'%%Y%%m%%d%%H%%i%%S')" - " FROM crs_usr_requests" - " WHERE CrsCod='%ld'" - " AND ((1<0" - " ORDER BY RequestTime DESC", - Gbl.CurrentCrs.Crs.CrsCod,Roles); - break; - default: - Lay_ShowErrorAndExit ("You don't have permission to list requesters."); - break; - } - break; - default: - Lay_ShowErrorAndExit ("Wrong scope."); - break; - } - - NumRequests = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get requests for enrollment"); - - /***** List requests *****/ - if (NumRequests) - { - /* Initialize structure with user's data */ - Usr_UsrDataConstructor (&UsrDat); - - /* Start table */ - Lay_StartRoundFrameTable10 (NULL,2,NULL); - fprintf (Gbl.F.Out,"" - "" - "%s" - "%s" - "%s" - "%s" - "%s" - "" - "" - "", - Txt_Course, - Txt_Teachers_ABBREVIATION, - Txt_Requester, - Txt_Role, - Txt_Date); - - /* List requests */ - for (NumReq = 0; - NumReq < NumRequests; - NumReq++) - { - row = mysql_fetch_row (mysql_res); - - /* Get request code (row[0]) */ - ReqCod = Str_ConvertStrCodToLongCod (row[0]); - - /* Get course code (row[1]) */ - Crs.CrsCod = Str_ConvertStrCodToLongCod (row[1]); - - /* Get user code (row[2]) */ - UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[2]); - - UsrExists = Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat); - - if (UsrExists) - UsrBelongsToCrs = Usr_CheckIfUsrBelongsToCrs (UsrDat.UsrCod,Crs.CrsCod); - else - UsrBelongsToCrs = false; - - if (UsrExists & !UsrBelongsToCrs) - { - /***** Number *****/ - fprintf (Gbl.F.Out,"" - "%u", - NumRequests - NumReq); - - /***** Link to course *****/ - Crs_GetDataOfCourseByCod (&Crs); - Deg.DegCod = Crs.DegCod; - Deg_GetDataOfDegreeByCod (&Deg); - fprintf (Gbl.F.Out,""); - Act_FormGoToStart (ActSeeCrsInf); - Crs_PutParamCrsCod (Crs.CrsCod); - sprintf (Gbl.Title,Txt_Go_to_X,Crs.FullName); - Act_LinkFormSubmit (Gbl.Title,"DAT"); - fprintf (Gbl.F.Out,"%s > %s" - "" - "", - Deg.ShortName,Crs.ShortName); - - /***** Number of teachers in the course *****/ - fprintf (Gbl.F.Out,"" - "%u" - "", - Crs.NumTchs); - - /***** User photo *****/ - fprintf (Gbl.F.Out,""); - ShowPhoto = Pho_ShowUsrPhotoIsAllowed (&UsrDat,PhotoURL); - Pho_ShowUsrPhoto (&UsrDat, - ShowPhoto ? PhotoURL : - NULL, - 18,24,true); - fprintf (Gbl.F.Out,""); - - /***** User name *****/ - fprintf (Gbl.F.Out,""); - Usr_RestrictLengthAndWriteName (&UsrDat,20); - - /***** Requested role (row[3]) *****/ - DesiredRole = Usr_ConvertUnsignedStrToRole (row[3]); - fprintf (Gbl.F.Out,"%s", - Txt_ROLES_SINGULAR_abc[DesiredRole][UsrDat.Sex]); - - /***** Request time (row[4]) *****/ - Msg_WriteMsgDate (row[4],"DAT"); - - /***** Button to confirm the request *****/ - fprintf (Gbl.F.Out,""); - Act_FormStart (ActReqMdfUsr); - Crs_PutParamCrsCod (Crs.CrsCod); - Usr_PutParamOtherUsrCodEncrypted (UsrDat.EncryptedUsrCod); - Lay_PutSendButton (Txt_Register); - fprintf (Gbl.F.Out,""); - - /***** Button to reject the request *****/ - fprintf (Gbl.F.Out,""); - Act_FormStart (ActReqRejSignUp); - Crs_PutParamCrsCod (Crs.CrsCod); - Usr_PutParamOtherUsrCodEncrypted (UsrDat.EncryptedUsrCod); - Lay_PutSendButton (Txt_Reject); - fprintf (Gbl.F.Out,"" - ""); - - /***** Mark possible notification as seen *****/ - Ntf_SetNotifAsSeen (Ntf_EVENT_ENROLLMENT_REQUEST, - ReqCod, - Gbl.Usrs.Me.UsrDat.UsrCod); - } - else // User does not exists or user already belongs to course ==> remove pair from crs_usr_requests table - Usr_RemoveEnrollmentRequest (Crs.CrsCod,UsrDat.UsrCod); - } - - /* End of table */ - Lay_EndRoundFrameTable10 (); - - /* Free memory used for user's data */ - Usr_UsrDataDestructor (&UsrDat); - } - else // There are no requests - Lay_ShowAlert (Lay_INFO,Txt_No_enrollment_requests); - } - -/*****************************************************************************/ -/********************* Write selector of users' roles ************************/ -/*****************************************************************************/ - -void Usr_WriteSelectorRoles (unsigned Roles) - { - extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - Rol_Role_t Role; - - for (Role = Rol_ROLE_STUDENT; - Role <= Rol_ROLE_TEACHER; - Role++) - { - fprintf (Gbl.F.Out,"%s
    ", - Txt_ROLES_PLURAL_abc[Role][Usr_SEX_UNKNOWN]); - } - } - -/*****************************************************************************/ -/************************* Get selected users' roles *************************/ -/*****************************************************************************/ - -void Usr_GetSelectedRoles (unsigned *Roles) - { - char StrRoles[(10+1)*2]; - const char *Ptr; - char UnsignedStr[10+1]; - Rol_Role_t Role; - - Par_GetParMultiToText ("Roles",StrRoles,(10+1)*2); - *Roles = 0; - for (Ptr = StrRoles; - *Ptr;) - { - Par_GetNextStrUntilSeparParamMult (&Ptr,UnsignedStr,10); - if (sscanf (UnsignedStr,"%u",&Role) != 1) - Lay_ShowErrorAndExit ("can not get user's role"); - *Roles |= (1 << Role); - } - } - -/*****************************************************************************/ -/******************** Remove a request for inscription ***********************/ -/*****************************************************************************/ - -static void Usr_RemoveEnrollmentRequest (long CrsCod,long UsrCod) - { - char Query[256]; - MYSQL_RES *mysql_res; - MYSQL_ROW row; - long ReqCod; - - /***** Mark possible notifications as removed - Important: do this before removing the request *****/ - /* Request request code (returns 0 or 1 rows) */ - sprintf (Query,"SELECT ReqCod FROM crs_usr_requests" - " WHERE CrsCod='%ld' AND UsrCod='%ld'", - CrsCod,UsrCod); - if (DB_QuerySELECT (Query,&mysql_res,"can not get request code")) // Request exists - { - /* Get request code */ - row = mysql_fetch_row (mysql_res); - ReqCod = Str_ConvertStrCodToLongCod (row[0]); - - /* Mark possible notifications as removed */ - Ntf_SetNotifAsRemoved (Ntf_EVENT_ENROLLMENT_REQUEST,ReqCod); - } - /* Free structure that stores the query result */ - DB_FreeMySQLResult (&mysql_res); - - /***** Remove enrollment request *****/ - sprintf (Query,"DELETE FROM crs_usr_requests" - " WHERE CrsCod='%ld' AND UsrCod='%ld'", - CrsCod,UsrCod); - DB_QueryDELETE (Query,"can not remove a request for enrollment"); - } - -/*****************************************************************************/ -/************ Get requested role of a user in current course *****************/ -/*****************************************************************************/ - -Rol_Role_t Usr_GetRequestedRole (long UsrCod) - { - char Query[256]; - MYSQL_RES *mysql_res; - MYSQL_ROW row; - Rol_Role_t Role = Rol_ROLE_UNKNOWN; - - /***** Get requested role from database *****/ - sprintf (Query,"SELECT Role FROM crs_usr_requests" - " WHERE CrsCod='%ld' AND UsrCod='%ld'", - Gbl.CurrentCrs.Crs.CrsCod,UsrCod); - if (DB_QuerySELECT (Query,&mysql_res,"can not get requested role")) - { - /***** Get role *****/ - row = mysql_fetch_row (mysql_res); - Role = Usr_ConvertUnsignedStrToRole (row[0]); - } - - /***** Free structure that stores the query result *****/ - DB_FreeMySQLResult (&mysql_res); - - return Role; - } - -/*****************************************************************************/ -/************** Form to request the user's ID of another user ****************/ -/*****************************************************************************/ - -void Usr_ReqRegRemUsr (void) - { - extern const char *Txt_You_dont_have_permission_to_perform_this_action; - - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_ROLE_GUEST: - case Rol_ROLE_VISITOR: - case Rol_ROLE_STUDENT: - Usr_AskIfRegRemMe (); - break; - case Rol_ROLE_TEACHER: - if (Gbl.CurrentCrs.Crs.CrsCod > 0) - Usr_ReqAnotherUsrIDToRegisterRemove (); - else - Usr_AskIfRegRemMe (); - break; - case Rol_ROLE_DEG_ADMIN: - if (Gbl.CurrentDeg.Deg.DegCod > 0) - Usr_ReqAnotherUsrIDToRegisterRemove (); - else - Usr_AskIfRegRemMe (); - break; - case Rol_ROLE_CTR_ADMIN: - if (Gbl.CurrentCtr.Ctr.CtrCod > 0) - Usr_ReqAnotherUsrIDToRegisterRemove (); - else - Usr_AskIfRegRemMe (); - break; - case Rol_ROLE_INS_ADMIN: - if (Gbl.CurrentIns.Ins.InsCod > 0) - Usr_ReqAnotherUsrIDToRegisterRemove (); - else - Usr_AskIfRegRemMe (); - break; - case Rol_ROLE_SUPERUSER: - Usr_ReqAnotherUsrIDToRegisterRemove (); - break; - default: - Lay_ShowAlert (Lay_ERROR,Txt_You_dont_have_permission_to_perform_this_action); - break; - } - } - -/*****************************************************************************/ -/****** Write a form to request another user's ID, @nickname or e-mail *******/ -/*****************************************************************************/ - -static void Usr_ReqAnotherUsrIDToRegisterRemove (void) - { - extern const char *Txt_Enter_the_ID_of_the_user_you_want_to_register_remove_; - - Lay_ShowAlert (Lay_INFO,Txt_Enter_the_ID_of_the_user_you_want_to_register_remove_); - - Usr_WriteFormToReqAnotherUsrID (ActReqMdfUsr); - } - -/*****************************************************************************/ -/********************** Ask me for register/remove me ************************/ -/*****************************************************************************/ - -static void Usr_AskIfRegRemMe (void) - { - struct ListUsrCods ListUsrCods; - - /***** I only can admin me *****/ - Gbl.Usrs.Other.UsrDat.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod; - ListUsrCods.NumUsrs = 1; - Usr_AllocateListUsrCods (&ListUsrCods); - ListUsrCods.Lst[0] = Gbl.Usrs.Other.UsrDat.UsrCod; - - Usr_AskIfRegRemUsr (&ListUsrCods); - } - -/*****************************************************************************/ -/****************** Ask me for register/remove another user ******************/ -/*****************************************************************************/ - -void Usr_AskIfRegRemAnotherUsr (void) - { - struct ListUsrCods ListUsrCods; - - /***** Check if UsrCod is present in parameters *****/ - Usr_GetParamOtherUsrCodEncrypted (); - if (Gbl.Usrs.Other.UsrDat.UsrCod > 0) - { - /***** If UsrCod is present in parameters, - use this parameter to identify the user to be enrolled / removed *****/ - ListUsrCods.NumUsrs = 1; - Usr_AllocateListUsrCods (&ListUsrCods); - ListUsrCods.Lst[0] = Gbl.Usrs.Other.UsrDat.UsrCod; - } - else // Parameter with user code not present - /***** If UsrCod is not present in parameters from form, - use user's ID to identify the user to be enrolled /removed *****/ - Usr_GetParamOtherUsrIDNickOrEMailAndGetUsrCods (&ListUsrCods); - - Usr_AskIfRegRemUsr (&ListUsrCods); - } - -/*****************************************************************************/ -/********************** Ask me for register/remove user **********************/ -/*****************************************************************************/ - -static void Usr_AskIfRegRemUsr (struct ListUsrCods *ListUsrCods) - { - extern const char *Txt_There_are_X_users_with_the_ID_Y; - extern const char *Txt_THE_USER_X_is_already_enrolled_in_the_course_Y; - extern const char *Txt_THE_USER_X_is_already_in_the_course_Y_but_has_not_yet_accepted_the_enrollment; - extern const char *Txt_THE_USER_X_already_exists_in_Y_but_is_not_yet_enrolled_in_the_course_Z; - extern const char *Txt_THE_USER_X_already_exists_in_Y; - extern const char *Txt_The_user_is_new_does_not_exists_yet_in_X; - extern const char *Txt_If_this_is_a_new_user_in_X_you_should_indicate_her_his_ID; - unsigned NumUsr; - bool NewUsrIDValid; - - if (ListUsrCods->NumUsrs) // User(s) found with the ID - { - /***** Warning if more than one user found *****/ - if (ListUsrCods->NumUsrs > 1) - { - sprintf (Gbl.Message,Txt_There_are_X_users_with_the_ID_Y, - ListUsrCods->NumUsrs,Gbl.Usrs.Other.UsrDat.UsrIDNickOrEmail); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - } - - /***** For each user found... *****/ - for (NumUsr = 0; - NumUsr < ListUsrCods->NumUsrs; - NumUsr++) - { - /* Get user's data */ - Gbl.Usrs.Other.UsrDat.UsrCod = ListUsrCods->Lst[NumUsr]; - Usr_GetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat); - - if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected - { - /* Check if this user belongs to the current course */ - if (Usr_CheckIfUsrBelongsToCrs (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.CurrentCrs.Crs.CrsCod)) - { - Gbl.Usrs.Other.UsrDat.Accepted = Usr_GetIfUserHasAcceptedEnrollmentInCurrentCrs (Gbl.Usrs.Other.UsrDat.UsrCod); - if (Gbl.Usrs.Other.UsrDat.Accepted) - sprintf (Gbl.Message,Txt_THE_USER_X_is_already_enrolled_in_the_course_Y, - Gbl.Usrs.Other.UsrDat.FullName,Gbl.CurrentCrs.Crs.FullName); - else // Enrollment not yet accepted - sprintf (Gbl.Message,Txt_THE_USER_X_is_already_in_the_course_Y_but_has_not_yet_accepted_the_enrollment, - Gbl.Usrs.Other.UsrDat.FullName,Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - - Usr_ShowFormToEditOtherUsr (); - } - else // User does not belong to the current course - { - sprintf (Gbl.Message,Txt_THE_USER_X_already_exists_in_Y_but_is_not_yet_enrolled_in_the_course_Z, - Gbl.Usrs.Other.UsrDat.FullName,Cfg_PLATFORM_SHORT_NAME,Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - - Usr_ShowFormToEditOtherUsr (); - } - } - else // No course selected - { - sprintf (Gbl.Message,Txt_THE_USER_X_already_exists_in_Y, - Gbl.Usrs.Other.UsrDat.FullName,Cfg_PLATFORM_SHORT_NAME); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - - Usr_ShowFormToEditOtherUsr (); - } - } - - /***** Free list of users' codes *****/ - Usr_FreeListUsrCods (ListUsrCods); - } - else // No users found, he/she is a new user - { - /***** If UsrCod is not present in parameters from form, - use user's ID to identify the user to be enrolled *****/ - if (Gbl.Usrs.Other.UsrDat.IDs.List) - NewUsrIDValid = ID_CheckIfUsrIDIsValid (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID); // Check the first element of the list - else - NewUsrIDValid = false; - - if (NewUsrIDValid) - { - /* Initialize some data of this new user */ - Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB = Rol_ROLE_STUDENT; - Gbl.Usrs.Other.UsrDat.Roles = (1 << Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB); - - /***** Show form to enter the data of a new user *****/ - sprintf (Gbl.Message,Txt_The_user_is_new_does_not_exists_yet_in_X, - Cfg_PLATFORM_SHORT_NAME); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - Rec_ShowFormOtherNewCommonRecord (&Gbl.Usrs.Other.UsrDat); - } - else // User's ID is not valid - { - /* Write message and request a new user's ID */ - sprintf (Gbl.Message,Txt_If_this_is_a_new_user_in_X_you_should_indicate_her_his_ID, - Cfg_PLATFORM_SHORT_NAME); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - Usr_ReqRegRemUsr (); - } - } - } - -/*****************************************************************************/ -/************ Show form to edit the record of an existing user ***************/ -/*****************************************************************************/ - -static void Usr_ShowFormToEditOtherUsr (void) - { - extern const char *Txt_Confirm; - bool ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); - - fprintf (Gbl.F.Out,"
    "); - - /***** Buttons for edition *****/ - if (Pwd_CheckIfICanChangeOtherUsrPassword (Gbl.Usrs.Other.UsrDat.UsrCod)) - { - ID_PutLinkToChangeUsrIDs (&Gbl.Usrs.Other.UsrDat); // Put link (form) to change user's IDs - Pwd_PutLinkToChangeUsrPassword (&Gbl.Usrs.Other.UsrDat); // Put link (form) to change user's password - } - if (Pho_CheckIfICanChangeOtherUsrPhoto (Gbl.Usrs.Other.UsrDat.UsrCod)) - Pho_PutLinkToChangeUsrPhoto (&Gbl.Usrs.Other.UsrDat); // Put link (form) to change user's photo - - /***** User's record *****/ - Rec_ShowCommonRecord (Rec_FORM_MODIFY_RECORD_OTHER_EXISTING_USR,&Gbl.Usrs.Other.UsrDat); - - /***** Show list of groups to register/remove me/user *****/ - if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups? - { - if (ItsMe) - Grp_ShowLstGrpsToChgMyGrps ((Gbl.Usrs.Me.LoggedRole == Rol_ROLE_STUDENT)); - else - Grp_ShowLstGrpsToChgOtherUsrsGrps (Gbl.Usrs.Other.UsrDat.UsrCod); - } - - /***** Which action, register or removing? *****/ - if (Usr_PutActionsRegRemOneUsr (ItsMe)) - Lay_PutSendButton (Txt_Confirm); - - fprintf (Gbl.F.Out,"" - "
    "); - } - -/*****************************************************************************/ -/******************* Add an administrator to current degree ******************/ -/*****************************************************************************/ - -void Usr_AddAdmToDeg (void) - { - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - - if (Gbl.CurrentDeg.Deg.DegCod > 0) - { - /***** Get plain user's ID of the user to add/modify *****/ - if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ()) - { - /* Check if it's allowed to register this administrator in degree */ - if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER) - { - /***** Register administrator in current degree in database *****/ - Usr_RegisterAdminInCurrentDeg (&Gbl.Usrs.Other.UsrDat); - - /***** Show user's record *****/ - Rec_ShowCommonRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - } - -/*****************************************************************************/ -/****************** Ask for remove me from current course ********************/ -/*****************************************************************************/ - -void Usr_ReqRemMeFromCrs (void) - { - Usr_AskIfRemoveUsrFromCrs (&Gbl.Usrs.Me.UsrDat,true); - } - -/*****************************************************************************/ -/************** Ask for remove of a user from current course *****************/ -/*****************************************************************************/ - -void Usr_ReqRemUsrFromCrs (void) - { - Usr_ReqRemOrRemUsrFromCrs (Usr_REQUEST_REMOVE_USR); - } - -/*****************************************************************************/ -/********************* Remove a user from current course *********************/ -/*****************************************************************************/ - -void Usr_RemUsrFromCrs (void) - { - if (Pwd_GetConfirmationOnDangerousAction ()) - Usr_ReqRemOrRemUsrFromCrs (Usr_REMOVE_USR); - } - -/*****************************************************************************/ -/******************** Remove of a user from current course *******************/ -/*****************************************************************************/ - -void Usr_ReqRemOrRemUsrFromCrs (Usr_ReqDelOrDelUsr_t ReqDelOrDelUsr) - { - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - bool ItsMe; - bool ICanRemove; - - /***** Get user to be removed *****/ - if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ()) - { - /* Check if it's forbidden remove that user */ - // A teacher can remove a student or himself - // An administrator can remove anyone - ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); - ICanRemove = (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_STUDENT ? ItsMe : - (Gbl.Usrs.Me.LoggedRole >= Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB)); - if (ICanRemove) - switch (ReqDelOrDelUsr) - { - case Usr_REQUEST_REMOVE_USR: // Ask if remove user from current course - Usr_AskIfRemoveUsrFromCrs (&Gbl.Usrs.Other.UsrDat,ItsMe); - break; - case Usr_REMOVE_USR: // Remove user from current course - Usr_EffectivelyRemUsrFromCrs (&Gbl.Usrs.Other.UsrDat,&Gbl.CurrentCrs.Crs, - Usr_REMOVE_WORKS,Cns_VERBOSE); - break; - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - -/*****************************************************************************/ -/********* Ask for remove of an administrator from current degree ************/ -/*****************************************************************************/ - -static void Usr_ReqRemAdmOfDeg (void) - { - Usr_ReqRemOrRemAdm (Usr_REQUEST_REMOVE_USR); - } - -/*****************************************************************************/ -/********************* Remove a user from current course *********************/ -/*****************************************************************************/ - -void Usr_RemAdm (void) - { - Usr_ReqRemOrRemAdm (Usr_REMOVE_USR); - } - -/*****************************************************************************/ -/******************** Remove of a user from current course *******************/ -/*****************************************************************************/ - -static void Usr_ReqRemOrRemAdm (Usr_ReqDelOrDelUsr_t ReqDelOrDelUsr) - { - extern const char *Txt_THE_USER_X_is_not_an_administrator_of_the_degree_Y; - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - bool ItsMe; - bool ICanRemove; - - if (Gbl.CurrentDeg.Deg.DegCod > 0) - { - /***** Get user to be removed *****/ - if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ()) - { - /* Check if it's forbidden remove that administrator */ - // A superuser can remove any administrator - // An administrator only can remove itself - ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); - ICanRemove = (ItsMe || Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER); - if (ICanRemove) - { - /* Check if the other user belong to current course */ - if (Usr_CheckIfUsrIsAdmOfDeg (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.CurrentDeg.Deg.DegCod)) - { // The other user is an administrator of current degree ==> ask for removing or remove him - switch (ReqDelOrDelUsr) - { - case Usr_REQUEST_REMOVE_USR: // Ask if remove administrator from current degree - Usr_AskIfRemAdmFromDeg (ItsMe); - break; - case Usr_REMOVE_USR: // Remove administrator from current degree - Usr_EffectivelyRemAdmFromDeg (&Gbl.Usrs.Other.UsrDat); - break; - } - } - else // The other user is not an administrator of current degree - { - sprintf (Gbl.Message,Txt_THE_USER_X_is_not_an_administrator_of_the_degree_Y, - Gbl.Usrs.Other.UsrDat.FullName,Gbl.CurrentDeg.Deg.FullName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - } - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - } - -/*****************************************************************************/ -/********* Request definite removing of a user from the platform *************/ -/*****************************************************************************/ - -void Usr_ReqRemUsrGbl (void) - { - Usr_ReqDelOrDelUsrGbl (Usr_REQUEST_REMOVE_USR); - } - -/*****************************************************************************/ -/************** Definite removing of a user from the platform ****************/ -/*****************************************************************************/ - -void Usr_RemUsrGbl (void) - { - Usr_ReqDelOrDelUsrGbl (Usr_REMOVE_USR); - } - -/*****************************************************************************/ -/**************************** Removing of a user *****************************/ -/*****************************************************************************/ - -void Usr_ReqDelOrDelUsrGbl (Usr_ReqDelOrDelUsr_t ReqDelOrDelUsr) - { - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - bool ItsMe; - - /***** Get user to be removed *****/ - if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ()) - { - ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); - if (Usr_CheckIfICanEliminateAccount (ItsMe)) - switch (ReqDelOrDelUsr) - { - case Usr_REQUEST_REMOVE_USR: // Ask if eliminate completely the user from the platform - Usr_AskIfCompletelyEliminateUsrFromPlatform (ItsMe); - break; - case Usr_REMOVE_USR: // Eliminate completely the user from the platform - if (Pwd_GetConfirmationOnDangerousAction ()) - { - Usr_DeleteUsrFromPlatform (&Gbl.Usrs.Other.UsrDat,Cns_VERBOSE); - - /***** Move unused contents of messages to table of deleted contents of messages *****/ - Msg_MoveUnusedMsgsContentToDeleted (); - } - break; - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - -/*****************************************************************************/ -/******************* Ask if really wanted to remove a user *******************/ -/*****************************************************************************/ - -static void Usr_AskIfRemoveUsrFromCrs (struct UsrData *UsrDat,bool ItsMe) - { - extern const char *Txt_Do_you_really_want_to_be_removed_from_the_course_X; - extern const char *Txt_Do_you_really_want_to_remove_the_following_user_from_the_course_X; - extern const char *Txt_Remove_me_from_this_course; - extern const char *Txt_Remove_user_from_this_course; - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - - if (Usr_CheckIfUsrBelongsToCrs (UsrDat->UsrCod,Gbl.CurrentCrs.Crs.CrsCod)) - { - sprintf (Gbl.Message, - ItsMe ? Txt_Do_you_really_want_to_be_removed_from_the_course_X : - Txt_Do_you_really_want_to_remove_the_following_user_from_the_course_X, - Gbl.CurrentCrs.Crs.FullName); - Lay_ShowAlert (Lay_WARNING,Gbl.Message); - - Rec_ShowCommonRecordUnmodifiable (UsrDat); - - fprintf (Gbl.F.Out,"
    "); - Act_FormStart (ActRemUsrCrs); - Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); - Pwd_AskForConfirmationOnDangerousAction (); - fprintf (Gbl.F.Out,"", - ItsMe ? Txt_Remove_me_from_this_course : - Txt_Remove_user_from_this_course); - fprintf (Gbl.F.Out,"" - "
    "); - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - -/*****************************************************************************/ -/*********** Ask if really wanted to eliminate completely a user *************/ -/*****************************************************************************/ - -static void Usr_AskIfCompletelyEliminateUsrFromPlatform (bool ItsMe) - { - extern const char *Txt_Do_you_really_want_to_completely_eliminate_your_user_account; - extern const char *Txt_Do_you_really_want_to_completely_eliminate_the_following_user; - extern const char *Txt_Completely_eliminate_me; - extern const char *Txt_Completely_eliminate_user; - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - - if (Usr_ChkIfUsrCodExists (Gbl.Usrs.Other.UsrDat.UsrCod)) - { - Lay_ShowAlert (Lay_WARNING,ItsMe ? Txt_Do_you_really_want_to_completely_eliminate_your_user_account : - Txt_Do_you_really_want_to_completely_eliminate_the_following_user); - - Rec_ShowCommonRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - - Act_FormStart (ActRemUsrGbl); - Usr_PutParamOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EncryptedUsrCod); - - /* Ask for consent on dangerous actions */ - Pwd_AskForConfirmationOnDangerousAction (); - - fprintf (Gbl.F.Out,"
    " - "" - "
    " - "", - ItsMe ? Txt_Completely_eliminate_me : - Txt_Completely_eliminate_user); - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - -/*****************************************************************************/ -/****** Ask if really wanted to add an administrator to current degree *******/ -/*****************************************************************************/ - -static void Usr_ReqAddAdmOfDeg (void) - { - extern const char *Txt_THE_USER_X_is_already_an_administrator_of_the_degree_Y; - extern const char *Txt_Do_you_really_want_to_register_the_following_user_as_an_administrator_of_the_degree_X; - extern const char *Txt_Register_user_IN_A_COURSE_OR_DEGREE; - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - - if (Gbl.CurrentDeg.Deg.DegCod > 0) - { - /***** Get user's identificator of the user to register as admin *****/ - if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ()) - { - /* Check if it's allowed to register this administrator in degree */ - if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER) - { - if (Usr_CheckIfUsrIsAdmOfDeg (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.CurrentDeg.Deg.DegCod)) // User is yet an administrator of current degree - { - sprintf (Gbl.Message,Txt_THE_USER_X_is_already_an_administrator_of_the_degree_Y, - Gbl.Usrs.Other.UsrDat.FullName,Gbl.CurrentDeg.Deg.FullName); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - Rec_ShowCommonRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - } - else - { - sprintf (Gbl.Message,Txt_Do_you_really_want_to_register_the_following_user_as_an_administrator_of_the_degree_X, - Gbl.CurrentDeg.Deg.FullName); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - Rec_ShowCommonRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - - Act_FormStart (ActNewAdm); - Usr_PutParamOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EncryptedUsrCod); - fprintf (Gbl.F.Out,"
    " - "" - "
    " - "", - Txt_Register_user_IN_A_COURSE_OR_DEGREE); - } - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - else - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - } - } - -/*****************************************************************************/ -/**** Ask if really wanted to remove an administrator from current degree ****/ -/*****************************************************************************/ - -void Usr_AskIfRemAdmFromDeg (bool ItsMe) - { - extern const char *Txt_Do_you_really_want_to_be_removed_as_an_administrator_of_the_degree_X; - extern const char *Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_the_degree_X; - extern const char *Txt_Remove_me_as_an_administrator; - extern const char *Txt_Remove_user_as_an_administrator; - - if (Usr_ChkIfUsrCodExists (Gbl.Usrs.Other.UsrDat.UsrCod)) - { - sprintf (Gbl.Message, - ItsMe ? Txt_Do_you_really_want_to_be_removed_as_an_administrator_of_the_degree_X : - Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_the_degree_X, - Gbl.CurrentDeg.Deg.FullName); - Lay_ShowAlert (Lay_INFO,Gbl.Message); - - Rec_ShowCommonRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - - Act_FormStart (ActRemAdm); - Usr_PutParamOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EncryptedUsrCod); - fprintf (Gbl.F.Out,"
    " - "" - "
    " - "", - ItsMe ? Txt_Remove_me_as_an_administrator : - Txt_Remove_user_as_an_administrator); - } - else - Lay_ShowErrorAndExit ("User doen't exist."); - } - /*****************************************************************************/ /********** Build the relative path of a user from his user's code ***********/ /*****************************************************************************/ -static void Usr_ConstructPathUsr (long UsrCod,char *PathUsr) +void Usr_ConstructPathUsr (long UsrCod,char *PathUsr) { char PathUsrs[PATH_MAX+1]; char PathAboveUsr[PATH_MAX+1]; diff --git a/swad_user.h b/swad_user.h index 2d8e9a005..428b1b0a4 100644 --- a/swad_user.h +++ b/swad_user.h @@ -103,20 +103,6 @@ typedef enum } Usr_ShowUsrsType_t; #define Usr_SHOW_USRS_TYPE_DEFAULT Usr_CLASS_PHOTO -typedef enum - { - Usr_REPLACE_DATA, - Usr_INSERT_NEW_DATA, - } Usr_ReplaceInsert_t; - -// Related with users adding or removing -typedef enum - { - Usr_REQUEST_REMOVE_USR, - Usr_REMOVE_USR, - } Usr_ReqDelOrDelUsr_t; - - // Related with user's data struct UsrData { @@ -200,16 +186,13 @@ struct ListUsrCods unsigned NumUsrs; // Number of users in the list }; -typedef enum - { - Usr_SET_ACCEPTED_TO_FALSE, - Usr_SET_ACCEPTED_TO_TRUE, - } Usr_KeepOrSetAccepted_t; - /*****************************************************************************/ /****************************** Public prototypes ****************************/ /*****************************************************************************/ +void Usr_WriteSelectorRoles (unsigned Roles); +void Usr_GetSelectedRoles (unsigned *Roles); + void Usr_InformAboutNumClicksBeforePhoto (void); void Usr_UsrDataConstructor (struct UsrData *UsrDat); @@ -228,8 +211,8 @@ Rol_Role_t Usr_GetMyMaxRoleInIns (long InsCod); Rol_Role_t Usr_GetMyMaxRoleInCtr (long CtrCod); Rol_Role_t Usr_GetMyMaxRoleInDeg (long DegCod); Rol_Role_t Usr_GetMyRoleInCrs (long CrsCod); +Rol_Role_t Usr_GetRoleInCrs (long CrsCod,long UsrCod); unsigned Usr_GetRolesInAllCrss (long UsrCod); -void Usr_AcceptUsrInCrs (long UsrCod); void Usr_BuildFullName (struct UsrData *UsrDat); void Usr_RestrictLengthAndWriteName (struct UsrData *UsrDat,unsigned MaxChars); @@ -253,11 +236,7 @@ unsigned long Usr_GetCtrsFromUsr (long UsrCod,long InsCod,MYSQL_RES **mysql_res) unsigned long Usr_GetDegsFromUsr (long UsrCod,long CtrCod,MYSQL_RES **mysql_res); unsigned long Usr_GetCrssFromUsr (long UsrCod,long DegCod,MYSQL_RES **mysql_res); -void Usr_AskRemoveOldUsrs (void); -void Usr_RemoveOldUsrs (void); - -void Usr_ReqAcceptRegisterInCrs (void); -void Usr_AcceptRegisterMeInCrs (void); +bool Usr_ChkIfEncryptedUsrCodExists (const char *EncryptedUsrCod); void Usr_WriteFormLoginLogout (void); void Usr_Logout (void); @@ -267,6 +246,7 @@ void Usr_PutFormLogIn (void); void Usr_WriteLoggedUsrHead (void); void Usr_PutFormLogOut (void); void Usr_GetParamUsrIdLogin (void); +unsigned Usr_GetParamOtherUsrIDNickOrEMailAndGetUsrCods (struct ListUsrCods *ListUsrCods); void Usr_PutParamOtherUsrCodEncrypted (const char EncryptedUsrCod[Cry_LENGTH_ENCRYPTED_STR_SHA256_BASE64+1]); void Usr_GetParamOtherUsrCodEncrypted (void); bool Usr_GetParamOtherUsrCodEncryptedAndGetUsrData (void); @@ -278,33 +258,12 @@ void Usr_ChangeMyRole (void); void Usr_ShowFormsRoleAndLogout (void); unsigned Usr_UpdateMyClicksWithoutPhoto (void); -void Usr_RemoveUsrFromTableClicksWithoutPhoto (long UsrCod); - -void Usr_WriteFormToReqAnotherUsrID (Act_Action_t NextAction); - -void Usr_AfterCreationNewAccount (void); -void Usr_ShowFormAccount (void); -void Usr_ShowFormChangeMyAccount (void); bool Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (struct UsrData *UsrDat); bool Usr_GetIfUserHasAcceptedEnrollmentInCurrentCrs (long UsrCod); void Usr_UpdateMyLastData (void); void Usr_InsertMyLastCrsTabAndTime (void); -void Usr_CreatAndShowNewUsrRecordAndRegInCrs (void); -void Usr_ModifAndShowUsrCardAndRegInCrsAndGrps (void); -void Usr_GetNotifEnrollment (char *SummaryStr, - long CrsCod,long UsrCod, - unsigned MaxChars); -void Usr_CreateNewUsr (struct UsrData *UsrDat); -void Usr_UpdateUsrData (struct UsrData *UsrDat); -void Usr_UpdateInstitutionCentreDepartment (void); -void Usr_RegisterUsrInCurrentCrs (struct UsrData *UsrDat,Rol_Role_t NewRole, - Cns_QuietOrVerbose_t QuietOrVerbose, - Usr_KeepOrSetAccepted_t KeepOrSetAccepted); - -void Usr_RemoveUsrBriefcase (struct UsrData *UsrDat); - void Usr_WriteRowStdMainData (unsigned NumUsr,struct UsrData *UsrDat,bool PutCheckboxToSelectUsr); void Usr_WriteRowStdAllData (struct UsrData *UsrDat,char *GrpNames); void Usr_WriteRowTchAllData (struct UsrData *UsrDat); @@ -369,34 +328,7 @@ void Usr_SeeStdClassPhotoPrn (void); void Usr_SeeTchClassPhotoPrn (void); void Usr_PutSelectorNumColsClassPhoto (void); -void Usr_ShowFormRegRemSeveralUsrs (void); -void Usr_ReceiveFormUsrsCrs (void); -void Usr_AskRemAllStdsThisCrs (void); -void Usr_RemAllStdsThisCrs (void); -unsigned Usr_RemAllStdsInCrs (struct Course *Crs); -void Usr_ReqSignUpInCrs (void); -void Usr_SignUpInCrs (void); -void Usr_GetNotifEnrollmentRequest (char *SummaryStr,char **ContentStr, - long ReqCod,unsigned MaxChars,bool GetContent); -void Usr_AskIfRejectSignUp (void); -void Usr_RejectSignUp (void); -void Usr_ShowEnrollmentRequests (void); -void Usr_WriteSelectorRoles (unsigned Roles); -void Usr_GetSelectedRoles (unsigned *Roles); -Rol_Role_t Usr_GetRequestedRole (long UsrCod); -void Usr_ReqRegRemUsr (void); -void Usr_AskIfRegRemAnotherUsr (void); -void Usr_AddAdmToDeg (void); - -void Usr_ReqRemMeFromCrs (void); -void Usr_ReqRemUsrFromCrs (void); -void Usr_RemUsrFromCrs (void); -void Usr_ReqRemOrRemUsrFromCrs (Usr_ReqDelOrDelUsr_t ReqDelOrDelUsr); -void Usr_ReqRemUsrGbl (void); -void Usr_RemAdm (void); -void Usr_RemUsrGbl (void); -void Usr_ReqDelOrDelUsrGbl (Usr_ReqDelOrDelUsr_t ReqDelOrDelUsr); -void Usr_AskIfRemAdmFromDeg (bool ItsMe); +void Usr_ConstructPathUsr (long UsrCod,char *PathUsr); bool Usr_ChkIfUsrCodExists (long UsrCod); void Usr_ShowWarningNoUsersFound (Rol_Role_t Role);