From 15046b8affa113ab1f63e4ee59b23bb5d30f4b0f Mon Sep 17 00:00:00 2001 From: acanas Date: Fri, 19 Apr 2024 12:49:42 +0200 Subject: [PATCH] Version 23.76.1: Apr 19, 2024 Code refactoring related to don't belong/belong. --- swad_assignment.c | 4 +- swad_attendance_database.c | 2 +- swad_center_database.c | 31 +-- swad_center_database.h | 4 +- swad_changelog.h | 3 +- swad_course.c | 8 +- swad_degree_database.c | 7 +- swad_degree_database.h | 4 +- swad_enrolment.c | 457 +++++++++++++++++++----------------- swad_enrolment.h | 2 +- swad_enrolment_database.c | 7 +- swad_enrolment_database.h | 4 +- swad_follow.c | 6 +- swad_global.h | 4 +- swad_group.c | 2 +- swad_hierarchy.c | 10 +- swad_hierarchy.h | 4 +- swad_institution_database.c | 35 +-- swad_institution_database.h | 4 +- swad_mail.c | 28 +-- swad_record.c | 4 +- swad_role.c | 4 +- swad_user.c | 12 +- swad_zip.c | 2 +- 24 files changed, 334 insertions(+), 314 deletions(-) diff --git a/swad_assignment.c b/swad_assignment.c index 12a87fc6f..00b8ef870 100644 --- a/swad_assignment.c +++ b/swad_assignment.c @@ -1401,8 +1401,8 @@ void Asg_ReceiveAssignment (void) /***** Get folder name where to send works of the assignment *****/ Par_GetParText ("Folder",Assignments.Asg.Folder,Brw_MAX_BYTES_FOLDER); - Assignments.Asg.SendWork = (Assignments.Asg.Folder[0]) ? Asg_SEND_WORK : - Asg_DONT_SEND_WORK; + Assignments.Asg.SendWork = Assignments.Asg.Folder[0] ? Asg_SEND_WORK : + Asg_DONT_SEND_WORK; /***** Get assignment text *****/ Par_GetParHTML ("Txt",Description,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) diff --git a/swad_attendance_database.c b/swad_attendance_database.c index 0db91ff87..ac55a9daa 100644 --- a/swad_attendance_database.c +++ b/swad_attendance_database.c @@ -659,7 +659,7 @@ void Att_DB_SetUsrsAsPresent (long AttCod,const char *ListUsrs,bool SetOthersAsA if (Usr_DB_ChkIfUsrCodExists (UsrDat.UsrCod)) // The user must belong to course, // but it's not necessary he/she belongs to groups associated to the event - if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat) == Usr_BELONG) { /* Mark user as present */ if (Att_DB_CheckIfUsrIsInTableAttUsr (AttCod,UsrDat.UsrCod,&Present)) // User is in table att_users diff --git a/swad_center_database.c b/swad_center_database.c index f66e1a3a3..8c25dd9f4 100644 --- a/swad_center_database.c +++ b/swad_center_database.c @@ -766,25 +766,26 @@ unsigned Ctr_DB_GetMyCtrs (MYSQL_RES **mysql_res,long PrtCod) /******************* Check if a user belongs to a center *********************/ /*****************************************************************************/ -bool Ctr_DB_CheckIfUsrBelongsToCtr (long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses) +Usr_Belong_t Ctr_DB_CheckIfUsrBelongsToCtr (long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses) { const char *SubQuery = (CountOnlyAcceptedCourses ? " AND crs_users.Accepted='Y'" : // Only if user accepted ""); - return (DB_QueryCOUNT ("can not check if a user belongs to a center", - "SELECT COUNT(DISTINCT deg_degrees.CtrCod)" - " FROM crs_users," - "crs_courses," - "deg_degrees" - " WHERE crs_users.UsrCod=%ld" - "%s" - " AND crs_users.CrsCod=crs_courses.CrsCod" - " AND crs_courses.DegCod=deg_degrees.DegCod" - " AND deg_degrees.CtrCod=%ld", - UsrCod, - SubQuery, - HieCod) != 0); + return DB_QueryCOUNT ("can not check if a user belongs to a center", + "SELECT COUNT(DISTINCT deg_degrees.CtrCod)" + " FROM crs_users," + "crs_courses," + "deg_degrees" + " WHERE crs_users.UsrCod=%ld" + "%s" + " AND crs_users.CrsCod=crs_courses.CrsCod" + " AND crs_courses.DegCod=deg_degrees.DegCod" + " AND deg_degrees.CtrCod=%ld", + UsrCod, + SubQuery, + HieCod) ? Usr_BELONG : + Usr_DONT_BELONG; } /*****************************************************************************/ diff --git a/swad_center_database.h b/swad_center_database.h index 2f079e8c1..f50e4e3fd 100644 --- a/swad_center_database.h +++ b/swad_center_database.h @@ -88,8 +88,8 @@ unsigned Ctr_DB_GetCtrsWithCoords (MYSQL_RES **mysql_res); unsigned Ctr_DB_GetCtrsWithCoordsInCurrentIns (MYSQL_RES **mysql_res); unsigned Ctr_DB_GetMyCtrs (MYSQL_RES **mysql_res,long PrtCod); -bool Ctr_DB_CheckIfUsrBelongsToCtr (long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses); +Usr_Belong_t Ctr_DB_CheckIfUsrBelongsToCtr (long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses); unsigned Ctr_DB_GetNumUsrsWhoClaimToBelongToCtr (long HieCod); void Ctr_DB_RemoveCenter (long HieCod); diff --git a/swad_changelog.h b/swad_changelog.h index ba960c866..9cf4b7240 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -633,10 +633,11 @@ Me sale este error, no s "can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod') */ -#define Log_PLATFORM_VERSION "SWAD 23.76 (2024-04-19)" +#define Log_PLATFORM_VERSION "SWAD 23.76.1 (2024-04-19)" #define CSS_FILE "swad23.67.2.css" #define JS_FILE "swad23.53.6.js" /* + Version 23.76.1: Apr 19, 2024 Code refactoring related to don't belong/belong. (335570 lines) Version 23.76: Apr 19, 2024 Code refactoring related to don't belong/belong. (335550 lines) Version 23.75: Apr 13, 2024 Code refactoring related to closed/open. (335484 lines) Copy the following icons to icon public directory: diff --git a/swad_course.c b/swad_course.c index 30f249a43..9e0331584 100644 --- a/swad_course.c +++ b/swad_course.c @@ -1550,19 +1550,19 @@ void Crs_ContEditAfterChgCrs (void) PutButtonToRequestRegistration = true; break; case Rol_USR: - PutButtonToRequestRegistration = !Hie_CheckIfUsrBelongsTo (Hie_CRS, + PutButtonToRequestRegistration = (Hie_CheckIfUsrBelongsTo (Hie_CRS, Gbl.Usrs.Me.UsrDat.UsrCod, Crs_EditingCrs->HieCod, - false); + false) == Usr_DONT_BELONG); break; case Rol_STD: case Rol_NET: case Rol_TCH: if (Crs_EditingCrs->HieCod != Gbl.Hierarchy.Node[Hie_CRS].HieCod) - PutButtonToRequestRegistration = !Hie_CheckIfUsrBelongsTo (Hie_CRS, + PutButtonToRequestRegistration = (Hie_CheckIfUsrBelongsTo (Hie_CRS, Gbl.Usrs.Me.UsrDat.UsrCod, Crs_EditingCrs->HieCod, - false); + false) == Usr_DONT_BELONG); break; default: break; diff --git a/swad_degree_database.c b/swad_degree_database.c index c2b1b1e89..aa04eb3c8 100644 --- a/swad_degree_database.c +++ b/swad_degree_database.c @@ -828,8 +828,8 @@ unsigned Deg_DB_GetUsrMainDeg (MYSQL_RES **mysql_res,long UsrCod) /******************* Check if a user belongs to a degree *********************/ /*****************************************************************************/ -bool Deg_DB_CheckIfUsrBelongsToDeg (long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses) +Usr_Belong_t Deg_DB_CheckIfUsrBelongsToDeg (long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses) { const char *SubQuery = (CountOnlyAcceptedCourses ? " AND crs_users.Accepted='Y'" : // Only if user accepted ""); @@ -846,7 +846,8 @@ bool Deg_DB_CheckIfUsrBelongsToDeg (long UsrCod,long HieCod, " AND crs_courses.DegCod=%ld)", UsrCod, SubQuery, - HieCod); + HieCod) ? Usr_BELONG : + Usr_DONT_BELONG; } /*****************************************************************************/ diff --git a/swad_degree_database.h b/swad_degree_database.h index b3a12c05f..e75d85dcb 100644 --- a/swad_degree_database.h +++ b/swad_degree_database.h @@ -83,8 +83,8 @@ void Deg_DB_UpdateDegStatus (long DegCod,Hie_Status_t NewStatus); unsigned Deg_DB_GetMyDegs (MYSQL_RES **mysql_res,long HieCod); unsigned Deg_DB_GetUsrMainDeg (MYSQL_RES **mysql_res,long UsrCod); -bool Deg_DB_CheckIfUsrBelongsToDeg (long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses); +Usr_Belong_t Deg_DB_CheckIfUsrBelongsToDeg (long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses); void Deg_DB_RemoveDegTyp (long DegTypCod); void Deg_DB_RemoveDeg (long DegCod); diff --git a/swad_enrolment.c b/swad_enrolment.c index 05692282a..ffd9f612d 100644 --- a/swad_enrolment.c +++ b/swad_enrolment.c @@ -114,7 +114,7 @@ static void Enr_PutActionsRegRemSeveralUsrs (void); static void Enr_ReceiveUsrsCrs (Rol_Role_t Role); static void Enr_PutActionModifyOneUsr (bool *OptionChecked, - bool UsrBelongsToCrs,Usr_MeOrOther_t MeOrOther); + Usr_Belong_t UsrBelongsToCrs,Usr_MeOrOther_t MeOrOther); static void Enr_PutActionRegOneDegAdm (bool *OptionChecked); static void Enr_PutActionRegOneCtrAdm (bool *OptionChecked); static void Enr_PutActionRegOneInsAdm (bool *OptionChecked); @@ -1315,7 +1315,7 @@ static void Enr_ReceiveUsrsCrs (Rol_Role_t Role) bool Enr_PutActionsRegRemOneUsr (Usr_MeOrOther_t MeOrOther) { bool OptionsShown = false; - bool UsrBelongsToCrs = false; + Usr_Belong_t UsrBelongsToCrs = Usr_DONT_BELONG; bool UsrIsDegAdmin = false; bool UsrIsCtrAdmin = false; bool UsrIsInsAdmin = false; @@ -1390,7 +1390,7 @@ bool Enr_PutActionsRegRemOneUsr (Usr_MeOrOther_t MeOrOther) } /***** Remove user from the course *****/ - if (UsrBelongsToCrs) + if (UsrBelongsToCrs == Usr_BELONG) { Enr_PutActionRemUsrFromCrs (&OptionChecked,MeOrOther); OptionsShown = true; @@ -1445,18 +1445,18 @@ bool Enr_PutActionsRegRemOneUsr (Usr_MeOrOther_t MeOrOther) /*****************************************************************************/ static void Enr_PutActionModifyOneUsr (bool *OptionChecked, - bool UsrBelongsToCrs,Usr_MeOrOther_t MeOrOther) + Usr_Belong_t UsrBelongsToCrs,Usr_MeOrOther_t MeOrOther) { extern const char *Txt_Register_me_in_X; extern const char *Txt_Register_USER_in_the_course_X; extern const char *Txt_Modify_me_in_the_course_X; extern const char *Txt_Modify_user_in_the_course_X; - const char *Txt[2][Usr_NUM_ME_OR_OTHER] = + const char *Txt[Usr_NUM_BELONG][Usr_NUM_ME_OR_OTHER] = { - [false][Usr_ME ] = Txt_Register_me_in_X, - [false][Usr_OTHER] = Txt_Register_USER_in_the_course_X, - [true ][Usr_ME ] = Txt_Modify_me_in_the_course_X, - [true ][Usr_OTHER] = Txt_Modify_user_in_the_course_X, + [Usr_DONT_BELONG][Usr_ME ] = Txt_Register_me_in_X, + [Usr_DONT_BELONG][Usr_OTHER] = Txt_Register_USER_in_the_course_X, + [Usr_BELONG ][Usr_ME ] = Txt_Modify_me_in_the_course_X, + [Usr_BELONG ][Usr_OTHER] = Txt_Modify_user_in_the_course_X, }; Enr_RegRemOneUsrActionBegin (Enr_REGISTER_MODIFY_ONE_USR_IN_CRS,OptionChecked); @@ -1671,16 +1671,20 @@ static void Enr_RegisterUsr (struct Usr_Data *UsrDat,Rol_Role_t RegRemRole, /***** Register user in current course in database *****/ if (Gbl.Hierarchy.Level == Hie_CRS) // Course selected { - if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) + switch (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) { - if (RegRemRole != UsrDat->Roles.InCurrentCrs) // The role must be updated - /* Modify role */ - Enr_ModifyRoleInCurrentCrs (UsrDat,RegRemRole); + case Usr_BELONG: + if (RegRemRole != UsrDat->Roles.InCurrentCrs) // The role must be updated + /* Modify role */ + Enr_ModifyRoleInCurrentCrs (UsrDat,RegRemRole); + break; + case Usr_DONT_BELONG: // User does not belong to this course + default: + /* Register user */ + Enr_RegisterUsrInCurrentCrs (UsrDat,RegRemRole, + Enr_SET_ACCEPTED_TO_FALSE); + break; } - else // User does not belong to this course - /* Register user */ - Enr_RegisterUsrInCurrentCrs (UsrDat,RegRemRole, - Enr_SET_ACCEPTED_TO_FALSE); /***** Register user in the selected groups *****/ if (Gbl.Crs.Grps.NumGrps) // If there are groups in the course @@ -1955,47 +1959,47 @@ void Enr_AskIfRejectSignUp (void) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) - { // User's data exist... - if (Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Other.UsrDat)) - { - /* User already belongs to this course */ - Ale_ShowAlert (Ale_WARNING,Txt_THE_USER_X_is_already_enroled_in_the_course_Y, - Gbl.Usrs.Other.UsrDat.FullName, - Gbl.Hierarchy.Node[Hie_CRS].FullName); - Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); + switch (Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Other.UsrDat)) + { + case Usr_BELONG: + /* User already belongs to this course */ + Ale_ShowAlert (Ale_WARNING,Txt_THE_USER_X_is_already_enroled_in_the_course_Y, + Gbl.Usrs.Other.UsrDat.FullName, + Gbl.Hierarchy.Node[Hie_CRS].FullName); + Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - /* Remove inscription request because it has not sense */ - Enr_RemUsrEnrolmentRequestInCrs (Gbl.Usrs.Other.UsrDat.UsrCod, - Gbl.Hierarchy.Node[Hie_CRS].HieCod); + /* Remove inscription request because it has not sense */ + Enr_RemUsrEnrolmentRequestInCrs (Gbl.Usrs.Other.UsrDat.UsrCod, + Gbl.Hierarchy.Node[Hie_CRS].HieCod); + break; + case Usr_DONT_BELONG: // User does not belong to this course + default: + Role = Rol_DB_GetRequestedRole (Gbl.Hierarchy.Node[Hie_CRS].HieCod, + Gbl.Usrs.Other.UsrDat.UsrCod); + if (Role == Rol_STD || + Role == Rol_NET || + Role == Rol_TCH) + { + /***** Show question and button to reject user's enrolment request *****/ + /* Begin alert */ + Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Txt_Do_you_really_want_to_reject_the_enrolment_request_, + Gbl.Usrs.Other.UsrDat.FullName, + Txt_ROLES_SINGUL_abc[Role][Gbl.Usrs.Other.UsrDat.Sex], + Gbl.Hierarchy.Node[Hie_CRS].FullName); + + /* Show user's record */ + Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); + + /* End alert */ + Ale_ShowAlertAndButtonEnd (ActRejSignUp,NULL,NULL, + Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod, + Btn_REMOVE_BUTTON,Txt_Reject); + } + else + Err_WrongRoleExit (); + break; } - else // User does not belong to this course - { - Role = Rol_DB_GetRequestedRole (Gbl.Hierarchy.Node[Hie_CRS].HieCod, - Gbl.Usrs.Other.UsrDat.UsrCod); - if (Role == Rol_STD || - Role == Rol_NET || - Role == Rol_TCH) - { - /***** Show question and button to reject user's enrolment request *****/ - /* Begin alert */ - Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Txt_Do_you_really_want_to_reject_the_enrolment_request_, - Gbl.Usrs.Other.UsrDat.FullName, - Txt_ROLES_SINGUL_abc[Role][Gbl.Usrs.Other.UsrDat.Sex], - Gbl.Hierarchy.Node[Hie_CRS].FullName); - - /* Show user's record */ - Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); - - /* End alert */ - Ale_ShowAlertAndButtonEnd (ActRejSignUp,NULL,NULL, - Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod, - Btn_REMOVE_BUTTON,Txt_Reject); - } - else - Err_WrongRoleExit (); - } - } else Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); } @@ -2017,7 +2021,7 @@ void Enr_RejectSignUp (void) Usr_DONT_GET_ROLE_IN_CRS)) { // User's data exist... - if (Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Other.UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Other.UsrDat) == Usr_BELONG) { /* User already belongs to this course */ Ale_ShowAlert (Ale_WARNING,Txt_THE_USER_X_is_already_enroled_in_the_course_Y, @@ -2119,7 +2123,7 @@ static void Enr_ShowEnrolmentRequestsGivenRoles (unsigned RolesSelected) struct Hie_Node Crs; struct Usr_Data UsrDat; bool UsrExists; - bool UsrBelongsToCrs; + Usr_Belong_t UsrBelongsToCrs; Rol_Role_t DesiredRole; static Act_Action_t NextAction[Rol_NUM_ROLES] = { @@ -2230,10 +2234,10 @@ static void Enr_ShowEnrolmentRequestsGivenRoles (unsigned RolesSelected) Crs.HieCod, false); else - UsrBelongsToCrs = false; + UsrBelongsToCrs = Usr_DONT_BELONG; if (UsrExists && - !UsrBelongsToCrs && + UsrBelongsToCrs == Usr_DONT_BELONG && (DesiredRole == Rol_STD || DesiredRole == Rol_NET || DesiredRole == Rol_TCH)) @@ -2623,32 +2627,32 @@ static void Enr_ShowFormToEditOtherUsr (void) { /***** Show form to edit user *****/ if (Gbl.Hierarchy.Level == Hie_CRS) // Course selected - { /* Check if this user belongs to the current course */ - if (Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Other.UsrDat)) + switch (Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Other.UsrDat)) { - Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); - if (Gbl.Usrs.Other.UsrDat.Accepted) - Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_is_already_enroled_in_the_course_Y, - Gbl.Usrs.Other.UsrDat.FullName, - Gbl.Hierarchy.Node[Hie_CRS].FullName); - else // Enrolment not yet accepted - Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_is_in_the_course_Y_but_has_not_yet_accepted_the_enrolment, + case Usr_BELONG: + Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); + if (Gbl.Usrs.Other.UsrDat.Accepted) + Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_is_already_enroled_in_the_course_Y, + Gbl.Usrs.Other.UsrDat.FullName, + Gbl.Hierarchy.Node[Hie_CRS].FullName); + else // Enrolment not yet accepted + Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_is_in_the_course_Y_but_has_not_yet_accepted_the_enrolment, + Gbl.Usrs.Other.UsrDat.FullName, + Gbl.Hierarchy.Node[Hie_CRS].FullName); + + Rec_ShowOtherSharedRecordEditable (); + break; + case Usr_DONT_BELONG: // User does not belong to the current course + default: + Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_exists_in_Y_but_is_not_enroled_in_the_course_Z, Gbl.Usrs.Other.UsrDat.FullName, + Cfg_PLATFORM_SHORT_NAME, Gbl.Hierarchy.Node[Hie_CRS].FullName); - Rec_ShowOtherSharedRecordEditable (); + Rec_ShowOtherSharedRecordEditable (); + break; } - else // User does not belong to the current course - { - Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_exists_in_Y_but_is_not_enroled_in_the_course_Z, - Gbl.Usrs.Other.UsrDat.FullName, - Cfg_PLATFORM_SHORT_NAME, - Gbl.Hierarchy.Node[Hie_CRS].FullName); - - Rec_ShowOtherSharedRecordEditable (); - } - } else // No course selected { Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_already_exists_in_Y, @@ -2817,34 +2821,36 @@ void Enr_CreateNewUsr1 (void) /***** Register user in current course in database *****/ if (Gbl.Hierarchy.Level == Hie_CRS) // Course selected { - if (Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Other.UsrDat)) + switch (Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Other.UsrDat)) { - OldRole = Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs; // Remember old role before changing it - if (NewRole != OldRole) // The role must be updated - { - /* Modify role */ - Enr_ModifyRoleInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole); + case Usr_BELONG: + OldRole = Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs; // Remember old role before changing it + if (NewRole != OldRole) // The role must be updated + { + /* Modify role */ + Enr_ModifyRoleInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole); + + /* Success message */ + Ale_CreateAlert (Ale_SUCCESS,NULL, + Txt_The_role_of_THE_USER_X_in_the_course_Y_has_changed_from_A_to_B, + Gbl.Usrs.Other.UsrDat.FullName, + Gbl.Hierarchy.Node[Hie_CRS].FullName, + Txt_ROLES_SINGUL_abc[OldRole][Gbl.Usrs.Other.UsrDat.Sex], + Txt_ROLES_SINGUL_abc[NewRole][Gbl.Usrs.Other.UsrDat.Sex]); + } + break; + case Usr_DONT_BELONG: // User does not belong to current course + default: + /* Register user */ + Enr_RegisterUsrInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole, + Enr_SET_ACCEPTED_TO_FALSE); /* Success message */ - Ale_CreateAlert (Ale_SUCCESS,NULL, - Txt_The_role_of_THE_USER_X_in_the_course_Y_has_changed_from_A_to_B, + Ale_CreateAlert (Ale_SUCCESS,NULL, + Txt_THE_USER_X_has_been_enroled_in_the_course_Y, Gbl.Usrs.Other.UsrDat.FullName, - Gbl.Hierarchy.Node[Hie_CRS].FullName, - Txt_ROLES_SINGUL_abc[OldRole][Gbl.Usrs.Other.UsrDat.Sex], - Txt_ROLES_SINGUL_abc[NewRole][Gbl.Usrs.Other.UsrDat.Sex]); - } - } - else // User does not belong to current course - { - /* Register user */ - Enr_RegisterUsrInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole, - Enr_SET_ACCEPTED_TO_FALSE); - - /* Success message */ - Ale_CreateAlert (Ale_SUCCESS,NULL, - Txt_THE_USER_X_has_been_enroled_in_the_course_Y, - Gbl.Usrs.Other.UsrDat.FullName, - Gbl.Hierarchy.Node[Hie_CRS].FullName); + Gbl.Hierarchy.Node[Hie_CRS].FullName); + break; } /***** Change user's groups *****/ @@ -2928,34 +2934,36 @@ void Enr_ModifyUsr1 (void) NewRole = Rec_GetRoleFromRecordForm (); /***** Register user in current course in database *****/ - if (Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Other.UsrDat)) + switch (Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Other.UsrDat)) { - OldRole = Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs; // Remember old role before changing it - if (NewRole != OldRole) // The role must be updated - { - /* Modify role */ - Enr_ModifyRoleInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole); + case Usr_BELONG: + OldRole = Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs; // Remember old role before changing it + if (NewRole != OldRole) // The role must be updated + { + /* Modify role */ + Enr_ModifyRoleInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole); + + /* Set success message */ + Ale_CreateAlert (Ale_SUCCESS,NULL, + Txt_The_role_of_THE_USER_X_in_the_course_Y_has_changed_from_A_to_B, + Gbl.Usrs.Other.UsrDat.FullName, + Gbl.Hierarchy.Node[Hie_CRS].FullName, + Txt_ROLES_SINGUL_abc[OldRole][Gbl.Usrs.Other.UsrDat.Sex], + Txt_ROLES_SINGUL_abc[NewRole][Gbl.Usrs.Other.UsrDat.Sex]); + } + break; + case Usr_DONT_BELONG: // User does not belong to current course + default: + /* Register user */ + Enr_RegisterUsrInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole, + Enr_SET_ACCEPTED_TO_FALSE); /* Set success message */ Ale_CreateAlert (Ale_SUCCESS,NULL, - Txt_The_role_of_THE_USER_X_in_the_course_Y_has_changed_from_A_to_B, + Txt_THE_USER_X_has_been_enroled_in_the_course_Y, Gbl.Usrs.Other.UsrDat.FullName, - Gbl.Hierarchy.Node[Hie_CRS].FullName, - Txt_ROLES_SINGUL_abc[OldRole][Gbl.Usrs.Other.UsrDat.Sex], - Txt_ROLES_SINGUL_abc[NewRole][Gbl.Usrs.Other.UsrDat.Sex]); - } - } - else // User does not belong to current course - { - /* Register user */ - Enr_RegisterUsrInCurrentCrs (&Gbl.Usrs.Other.UsrDat,NewRole, - Enr_SET_ACCEPTED_TO_FALSE); - - /* Set success message */ - Ale_CreateAlert (Ale_SUCCESS,NULL, - Txt_THE_USER_X_has_been_enroled_in_the_course_Y, - Gbl.Usrs.Other.UsrDat.FullName, - Gbl.Hierarchy.Node[Hie_CRS].FullName); + Gbl.Hierarchy.Node[Hie_CRS].FullName); + break; } /***** Change user's groups *****/ @@ -3113,34 +3121,38 @@ static void Enr_AskIfRemoveUsrFromCrs (struct Usr_Data *UsrDat) [Usr_OTHER] = Txt_Remove_user_from_this_course }; - if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) + switch (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) { - MeOrOther = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); + case Usr_BELONG: + MeOrOther = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); - /***** Show question and button to remove user as administrator *****/ - /* Begin alert */ - Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Question[MeOrOther], - Gbl.Hierarchy.Node[Hie_CRS].FullName); + /***** Show question and button to remove user as administrator *****/ + /* Begin alert */ + Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Question[MeOrOther], + Gbl.Hierarchy.Node[Hie_CRS].FullName); - /* Show user's record */ - Rec_ShowSharedRecordUnmodifiable (UsrDat); + /* Show user's record */ + Rec_ShowSharedRecordUnmodifiable (UsrDat); - /* Show form to request confirmation */ - if (!NextAction[UsrDat->Roles.InCurrentCrs]) - Err_WrongRoleExit (); - Frm_BeginForm (NextAction[UsrDat->Roles.InCurrentCrs]); - Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod); - Pwd_AskForConfirmationOnDangerousAction (); - Btn_PutRemoveButton (TxtButton[MeOrOther]); - Frm_EndForm (); + /* Show form to request confirmation */ + if (!NextAction[UsrDat->Roles.InCurrentCrs]) + Err_WrongRoleExit (); + Frm_BeginForm (NextAction[UsrDat->Roles.InCurrentCrs]); + Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod); + Pwd_AskForConfirmationOnDangerousAction (); + Btn_PutRemoveButton (TxtButton[MeOrOther]); + Frm_EndForm (); - /* End alert */ - Ale_ShowAlertAndButtonEnd (ActUnk,NULL,NULL, - NULL,NULL, - Btn_NO_BUTTON,NULL); + /* End alert */ + Ale_ShowAlertAndButtonEnd (ActUnk,NULL,NULL, + NULL,NULL, + Btn_NO_BUTTON,NULL); + break; + case Usr_DONT_BELONG: // User does not belong to current course + default: + Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); + break; } - else // User does not belong to current course - Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); } /*****************************************************************************/ @@ -3154,86 +3166,90 @@ static void Enr_EffectivelyRemUsrFromCrs (struct Usr_Data *UsrDat, { extern const char *Txt_THE_USER_X_has_been_removed_from_the_course_Y; - if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) + switch (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) { - /***** Remove user from all attendance events in course *****/ - Att_DB_RemoveUsrFromCrsEvents (UsrDat->UsrCod,Crs->HieCod); + case Usr_BELONG: + /***** Remove user from all attendance events in course *****/ + Att_DB_RemoveUsrFromCrsEvents (UsrDat->UsrCod,Crs->HieCod); - /***** Remove user from all groups in course *****/ - Grp_RemUsrFromAllGrpsInCrs (UsrDat->UsrCod,Crs->HieCod); + /***** Remove user from all groups in course *****/ + Grp_RemUsrFromAllGrpsInCrs (UsrDat->UsrCod,Crs->HieCod); - /***** Remove user's status about reading of course information *****/ - Inf_DB_RemoveUsrFromCrsInfoRead (UsrDat->UsrCod,Crs->HieCod); + /***** Remove user's status about reading of course information *****/ + Inf_DB_RemoveUsrFromCrsInfoRead (UsrDat->UsrCod,Crs->HieCod); - /***** Remove important production of this user in course *****/ - if (RemoveUsrWorks == Enr_REMOVE_USR_PRODUCTION) - { - /* Remove works zone in course */ - Brw_RemoveUsrWorksInCrs (UsrDat,Crs); + /***** Remove important production of this user in course *****/ + if (RemoveUsrWorks == Enr_REMOVE_USR_PRODUCTION) + { + /* Remove works zone in course */ + Brw_RemoveUsrWorksInCrs (UsrDat,Crs); - /* Remove tests, exams and matches results made by user in course */ - TstPrn_RemovePrintsMadeByUsrInCrs (UsrDat->UsrCod,Crs->HieCod); - Exa_DB_RemovePrintQstsMadeByUsrInCrs (UsrDat->UsrCod,Crs->HieCod); - Exa_DB_RemoveAllPrintsMadeByUsrInCrs (UsrDat->UsrCod,Crs->HieCod); - Mch_RemoveMatchesMadeByUsrInCrs (UsrDat->UsrCod,Crs->HieCod); - } + /* Remove tests, exams and matches results made by user in course */ + TstPrn_RemovePrintsMadeByUsrInCrs (UsrDat->UsrCod,Crs->HieCod); + Exa_DB_RemovePrintQstsMadeByUsrInCrs (UsrDat->UsrCod,Crs->HieCod); + Exa_DB_RemoveAllPrintsMadeByUsrInCrs (UsrDat->UsrCod,Crs->HieCod); + Mch_RemoveMatchesMadeByUsrInCrs (UsrDat->UsrCod,Crs->HieCod); + } - /***** Remove fields of this user in its course record *****/ - Rec_DB_RemoveAllFieldContentsFromUsrRecordInCrs (UsrDat->UsrCod,Crs->HieCod); + /***** Remove fields of this user in its course record *****/ + Rec_DB_RemoveAllFieldContentsFromUsrRecordInCrs (UsrDat->UsrCod,Crs->HieCod); - /***** Remove some information about files in course and groups *****/ - Brw_DB_RemoveSomeInfoAboutCrsUsrFiles (UsrDat->UsrCod,Crs->HieCod); + /***** Remove some information about files in course and groups *****/ + Brw_DB_RemoveSomeInfoAboutCrsUsrFiles (UsrDat->UsrCod,Crs->HieCod); - /***** Set all notifications for this user in this course as removed, - except notifications about new messages *****/ - Ntf_DB_MarkNotifInCrsAsRemoved (UsrDat->UsrCod,Crs->HieCod); + /***** Set all notifications for this user in this course as removed, + except notifications about new messages *****/ + Ntf_DB_MarkNotifInCrsAsRemoved (UsrDat->UsrCod,Crs->HieCod); - /***** Remove user from the tables of courses-users *****/ - Set_DB_RemUsrFromCrsSettings (UsrDat->UsrCod,Crs->HieCod); - Enr_DB_RemUsrFromCrs (UsrDat->UsrCod,Crs->HieCod); + /***** Remove user from the tables of courses-users *****/ + Set_DB_RemUsrFromCrsSettings (UsrDat->UsrCod,Crs->HieCod); + Enr_DB_RemUsrFromCrs (UsrDat->UsrCod,Crs->HieCod); - /***** Flush caches *****/ - Usr_FlushCachesUsr (); + /***** Flush caches *****/ + Usr_FlushCachesUsr (); - /***** If it's me, change my roles *****/ - switch (Usr_ItsMe (UsrDat->UsrCod)) - { - case Usr_ME: - /* Now I don't belong to current course */ - Gbl.Usrs.Me.IBelongToCurrent[Hie_CRS] = Usr_DONT_BELONG; - Gbl.Usrs.Me.UsrDat.Accepted = false; + /***** If it's me, change my roles *****/ + switch (Usr_ItsMe (UsrDat->UsrCod)) + { + case Usr_ME: + /* Now I don't belong to current course */ + Gbl.Usrs.Me.IBelongToCurrent[Hie_CRS] = Usr_DONT_BELONG; + Gbl.Usrs.Me.UsrDat.Accepted = false; - /* Fill the list with the courses I belong to */ - Gbl.Usrs.Me.Hierarchy[Hie_CRS].Filled = false; - Hie_GetMyHierarchy (Hie_CRS); + /* Fill the list with the courses I belong to */ + Gbl.Usrs.Me.Hierarchy[Hie_CRS].Filled = false; + Hie_GetMyHierarchy (Hie_CRS); - /* Set my roles */ - Gbl.Usrs.Me.Role.FromSession = - Gbl.Usrs.Me.Role.Logged = - Gbl.Usrs.Me.Role.LoggedBeforeCloseSession = - Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs = - UsrDat->Roles.InCurrentCrs = Rol_UNK; + /* Set my roles */ + Gbl.Usrs.Me.Role.FromSession = + Gbl.Usrs.Me.Role.Logged = + Gbl.Usrs.Me.Role.LoggedBeforeCloseSession = + Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs = + UsrDat->Roles.InCurrentCrs = Rol_UNK; - Gbl.Usrs.Me.UsrDat.Roles.InCrss = - UsrDat->Roles.InCrss = -1; // not yet filled/calculated + Gbl.Usrs.Me.UsrDat.Roles.InCrss = + UsrDat->Roles.InCrss = -1; // not yet filled/calculated - Rol_SetMyRoles (); - break; - case Usr_OTHER: - /* Now he/she does not belong to current course */ - UsrDat->Accepted = false; - UsrDat->Roles.InCurrentCrs = Rol_USR; - break; - } + Rol_SetMyRoles (); + break; + case Usr_OTHER: + /* Now he/she does not belong to current course */ + UsrDat->Accepted = false; + UsrDat->Roles.InCurrentCrs = Rol_USR; + break; + } - if (QuietOrVerbose == Cns_VERBOSE) - Ale_CreateAlert (Ale_SUCCESS,NULL, - Txt_THE_USER_X_has_been_removed_from_the_course_Y, - UsrDat->FullName,Crs->FullName); + if (QuietOrVerbose == Cns_VERBOSE) + Ale_CreateAlert (Ale_SUCCESS,NULL, + Txt_THE_USER_X_has_been_removed_from_the_course_Y, + UsrDat->FullName,Crs->FullName); + break; + case Usr_DONT_BELONG: // User does not belong to course + default: + if (QuietOrVerbose == Cns_VERBOSE) + Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); + break; } - else // User does not belong to course - if (QuietOrVerbose == Cns_VERBOSE) - Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); } /*****************************************************************************/ @@ -3246,12 +3262,12 @@ void Enr_FlushCacheUsrBelongsToCurrentCrs (void) Gbl.Cache.UsrBelongsToCurrentCrs.Valid = false; } -bool Enr_CheckIfUsrBelongsToCurrentCrs (const struct Usr_Data *UsrDat) +Usr_Belong_t Enr_CheckIfUsrBelongsToCurrentCrs (const struct Usr_Data *UsrDat) { /***** 1. Fast check: Trivial cases *****/ if (UsrDat->UsrCod <= 0 || Gbl.Hierarchy.Node[Hie_CRS].HieCod <= 0) - return false; + return Usr_DONT_BELONG; /***** 2. Fast check: If cached... *****/ if (Gbl.Cache.UsrBelongsToCurrentCrs.Valid && @@ -3262,9 +3278,10 @@ bool Enr_CheckIfUsrBelongsToCurrentCrs (const struct Usr_Data *UsrDat) if (UsrDat->Roles.InCurrentCrs != Rol_UNK) { Gbl.Cache.UsrBelongsToCurrentCrs.UsrCod = UsrDat->UsrCod; - Gbl.Cache.UsrBelongsToCurrentCrs.Belongs = UsrDat->Roles.InCurrentCrs == Rol_STD || - UsrDat->Roles.InCurrentCrs == Rol_NET || - UsrDat->Roles.InCurrentCrs == Rol_TCH; + Gbl.Cache.UsrBelongsToCurrentCrs.Belongs = (UsrDat->Roles.InCurrentCrs == Rol_STD || + UsrDat->Roles.InCurrentCrs == Rol_NET || + UsrDat->Roles.InCurrentCrs == Rol_TCH) ? Usr_BELONG : + Usr_DONT_BELONG; Gbl.Cache.UsrBelongsToCurrentCrs.Valid = true; return Gbl.Cache.UsrBelongsToCurrentCrs.Belongs; } @@ -3303,9 +3320,9 @@ bool Enr_CheckIfUsrHasAcceptedInCurrentCrs (const struct Usr_Data *UsrDat) /***** 3. Fast / slow check: Get if user belongs to current course and has accepted *****/ Gbl.Cache.UsrHasAcceptedInCurrentCrs.UsrCod = UsrDat->UsrCod; - Gbl.Cache.UsrHasAcceptedInCurrentCrs.Accepted = Hie_CheckIfUsrBelongsTo (Hie_CRS,UsrDat->UsrCod, - Gbl.Hierarchy.Node[Hie_CRS].HieCod, - true); + Gbl.Cache.UsrHasAcceptedInCurrentCrs.Accepted = (Hie_CheckIfUsrBelongsTo (Hie_CRS,UsrDat->UsrCod, + Gbl.Hierarchy.Node[Hie_CRS].HieCod, + true) == Usr_BELONG); Gbl.Cache.UsrHasAcceptedInCurrentCrs.Valid = true; return Gbl.Cache.UsrHasAcceptedInCurrentCrs.Accepted; } @@ -3340,7 +3357,7 @@ bool Enr_CheckIfUsrSharesAnyOfMyCrs (struct Usr_Data *UsrDat) /***** 5. Fast check: Is course selected and we both belong to it? *****/ if (Gbl.Usrs.Me.IBelongToCurrent[Hie_CRS] == Usr_BELONG) - if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) // Course selected and we both belong to it + if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat) == Usr_BELONG) // Course selected and we both belong to it { Gbl.Cache.UsrSharesAnyOfMyCrs.UsrCod = UsrDat->UsrCod; Gbl.Cache.UsrSharesAnyOfMyCrs.SharesAnyOfMyCrs = true; diff --git a/swad_enrolment.h b/swad_enrolment.h index 83a280db5..e21242be9 100644 --- a/swad_enrolment.h +++ b/swad_enrolment.h @@ -140,7 +140,7 @@ void Enr_ModifyUsr1 (void); void Enr_ModifyUsr2 (void); void Enr_FlushCacheUsrBelongsToCurrentCrs (void); -bool Enr_CheckIfUsrBelongsToCurrentCrs (const struct Usr_Data *UsrDat); +Usr_Belong_t Enr_CheckIfUsrBelongsToCurrentCrs (const struct Usr_Data *UsrDat); void Enr_FlushCacheUsrHasAcceptedInCurrentCrs (void); bool Enr_CheckIfUsrHasAcceptedInCurrentCrs (const struct Usr_Data *UsrDat); void Enr_FlushCacheUsrSharesAnyOfMyCrs (void); diff --git a/swad_enrolment_database.c b/swad_enrolment_database.c index 1ae75ab89..9986b64d1 100644 --- a/swad_enrolment_database.c +++ b/swad_enrolment_database.c @@ -158,8 +158,8 @@ unsigned Enr_DB_GetMyCoursesNames (MYSQL_RES **mysql_res) /******************** Check if a user belongs to a course ********************/ /*****************************************************************************/ -bool Enr_DB_CheckIfUsrBelongsToCrs (long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses) +Usr_Belong_t Enr_DB_CheckIfUsrBelongsToCrs (long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses) { const char *SubQuery = (CountOnlyAcceptedCourses ? " AND crs_users.Accepted='Y'" : // Only if user accepted ""); @@ -174,7 +174,8 @@ bool Enr_DB_CheckIfUsrBelongsToCrs (long UsrCod,long HieCod, "%s)", HieCod, UsrCod, - SubQuery); + SubQuery) ? Usr_BELONG : + Usr_DONT_BELONG; } /*****************************************************************************/ diff --git a/swad_enrolment_database.h b/swad_enrolment_database.h index fcf1408a5..82cc7cbce 100644 --- a/swad_enrolment_database.h +++ b/swad_enrolment_database.h @@ -44,8 +44,8 @@ unsigned Enr_DB_GetMyCrss (MYSQL_RES **mysql_res,long PrtCod); void Enr_DB_DropTmpTableMyCourses (void); unsigned Enr_DB_GetMyCoursesNames (MYSQL_RES **mysql_res); -bool Enr_DB_CheckIfUsrBelongsToCrs (long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses); +Usr_Belong_t Enr_DB_CheckIfUsrBelongsToCrs (long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses); bool Enr_DB_CheckIfUsrSharesAnyOfMyCrs (long UsrCod); bool Enr_DB_CheckIfUsrSharesAnyOfMyCrsWithDifferentRole (long UsrCod); long Enr_DB_GetRamdomStdFromCrs (long HieCod); diff --git a/swad_follow.c b/swad_follow.c index c38b7869b..aafa5913e 100644 --- a/swad_follow.c +++ b/swad_follow.c @@ -927,7 +927,7 @@ static void Fol_GetFollowedFromSelectedUsrs (unsigned *NumFollowed, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) // Get from the database the data of the student - if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat) == Usr_BELONG) { /* Check if I follow this user, and update number of users */ if (Fol_DB_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod, @@ -975,7 +975,7 @@ void Fol_FollowUsrs () if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get user's data from database Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) - if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat) == Usr_BELONG) /* If I don't follow this user ==> follow him/her */ if (!Fol_DB_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod, UsrDat.UsrCod)) @@ -1024,7 +1024,7 @@ void Fol_UnfollowUsrs (void) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get user's data from database Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) - if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat) == Usr_BELONG) /* If I follow this user ==> unfollow him/her */ if (Fol_DB_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod, UsrDat.UsrCod)) diff --git a/swad_global.h b/swad_global.h index b3b189ac1..b57be4205 100644 --- a/swad_global.h +++ b/swad_global.h @@ -291,13 +291,13 @@ struct Globals long UsrCod; long HieCod; bool CountOnlyAcceptedCourses; - bool Belongs; + Usr_Belong_t Belongs; bool Valid; } UsrBelongsTo[Hie_NUM_LEVELS]; struct { long UsrCod; - bool Belongs; + Usr_Belong_t Belongs; bool Valid; } UsrBelongsToCurrentCrs; struct diff --git a/swad_group.c b/swad_group.c index bac06a4b4..009366598 100644 --- a/swad_group.c +++ b/swad_group.c @@ -3101,7 +3101,7 @@ bool Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (const struct Usr_Data *UsrDat) return Gbl.Cache.UsrSharesAnyOfMyGrpsInCurrentCrs.Shares; /***** 7. Fast / slow check: Does he/she belong to the current course? *****/ - if (!Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat) == Usr_DONT_BELONG) { Gbl.Cache.UsrSharesAnyOfMyGrpsInCurrentCrs.UsrCod = UsrDat->UsrCod; Gbl.Cache.UsrSharesAnyOfMyGrpsInCurrentCrs.Shares = false; diff --git a/swad_hierarchy.c b/swad_hierarchy.c index 3d1e5a60b..525e75910 100644 --- a/swad_hierarchy.c +++ b/swad_hierarchy.c @@ -1036,11 +1036,11 @@ void Hie_FlushCacheUsrBelongsTo (Hie_Level_t Level) /******************** Check if a user belongs to a course ********************/ /*****************************************************************************/ -bool Hie_CheckIfUsrBelongsTo (Hie_Level_t Level,long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses) +Usr_Belong_t Hie_CheckIfUsrBelongsTo (Hie_Level_t Level,long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses) { - static bool (*FunctionToGetIfUsrBelongsToFromDB[Hie_NUM_LEVELS]) (long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses) = + static Usr_Belong_t (*FunctionToGetIfUsrBelongsToFromDB[Hie_NUM_LEVELS]) (long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses) = { [Hie_INS] = Ins_DB_CheckIfUsrBelongsToIns, [Hie_CTR] = Ctr_DB_CheckIfUsrBelongsToCtr, @@ -1055,7 +1055,7 @@ bool Hie_CheckIfUsrBelongsTo (Hie_Level_t Level,long UsrCod,long HieCod, /***** 1. Fast check: Trivial cases *****/ if (UsrCod <= 0 || HieCod <= 0) - return false; + return Usr_DONT_BELONG; /***** 2. Fast check: If cached... *****/ if (Gbl.Cache.UsrBelongsTo[Level].Valid && diff --git a/swad_hierarchy.h b/swad_hierarchy.h index 75ed4a338..7fa80d70a 100644 --- a/swad_hierarchy.h +++ b/swad_hierarchy.h @@ -70,8 +70,8 @@ void Hie_GetMyHierarchy (Hie_Level_t Level); Usr_Belong_t Hie_CheckIfIBelongTo (Hie_Level_t Level,long HieCod); void Hie_FlushCacheUsrBelongsTo (Hie_Level_t Level); -bool Hie_CheckIfUsrBelongsTo (Hie_Level_t Level,long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses); +Usr_Belong_t Hie_CheckIfUsrBelongsTo (Hie_Level_t Level,long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses); //-------------------------------- Figures ------------------------------------ void Hie_GetAndShowHierarchyStats (void); diff --git a/swad_institution_database.c b/swad_institution_database.c index 312b0181f..c9de101a0 100644 --- a/swad_institution_database.c +++ b/swad_institution_database.c @@ -807,27 +807,28 @@ unsigned Ins_DB_GetMyInss (MYSQL_RES **mysql_res,long PrtCod) /**************** Check if a user belongs to an institution ******************/ /*****************************************************************************/ -bool Ins_DB_CheckIfUsrBelongsToIns (long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses) +Usr_Belong_t Ins_DB_CheckIfUsrBelongsToIns (long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses) { const char *SubQuery = (CountOnlyAcceptedCourses ? " AND crs_users.Accepted='Y'" : // Only if user accepted ""); - return (DB_QueryCOUNT ("can not check if a user belongs to an institution", - "SELECT COUNT(DISTINCT ctr_centers.InsCod)" - " FROM crs_users," - "crs_courses," - "deg_degrees," - "ctr_centers" - " WHERE crs_users.UsrCod=%ld" - "%s" - " AND crs_users.CrsCod=crs_courses.CrsCod" - " AND crs_courses.DegCod=deg_degrees.DegCod" - " AND deg_degrees.CtrCod=ctr_centers.CtrCod" - " AND ctr_centers.InsCod=%ld", - UsrCod, - SubQuery, - HieCod) != 0); + return DB_QueryCOUNT ("can not check if a user belongs to an institution", + "SELECT COUNT(DISTINCT ctr_centers.InsCod)" + " FROM crs_users," + "crs_courses," + "deg_degrees," + "ctr_centers" + " WHERE crs_users.UsrCod=%ld" + "%s" + " AND crs_users.CrsCod=crs_courses.CrsCod" + " AND crs_courses.DegCod=deg_degrees.DegCod" + " AND deg_degrees.CtrCod=ctr_centers.CtrCod" + " AND ctr_centers.InsCod=%ld", + UsrCod, + SubQuery, + HieCod) ? Usr_BELONG : + Usr_DONT_BELONG; } /*****************************************************************************/ diff --git a/swad_institution_database.h b/swad_institution_database.h index 71ebd885e..382d3ac86 100644 --- a/swad_institution_database.h +++ b/swad_institution_database.h @@ -79,8 +79,8 @@ unsigned Ins_DB_GetNumInnsWithUsrs (Rol_Role_t Role, Hie_Level_t Level,long HieCod); unsigned Ins_DB_GetMyInss (MYSQL_RES **mysql_res,long HieCod); -bool Ins_DB_CheckIfUsrBelongsToIns (long UsrCod,long HieCod, - bool CountOnlyAcceptedCourses); +Usr_Belong_t Ins_DB_CheckIfUsrBelongsToIns (long UsrCod,long HieCod, + bool CountOnlyAcceptedCourses); unsigned Ins_DB_GetNumUsrsWhoClaimToBelongToIns (long HieCod); void Ins_DB_RemoveInstitution (long HieCod); diff --git a/swad_mail.c b/swad_mail.c index cf4a5ec42..b543b0a8b 100644 --- a/swad_mail.c +++ b/swad_mail.c @@ -1698,30 +1698,30 @@ Usr_Can_t Mai_ICanSeeOtherUsrEmail (const struct Usr_Data *UsrDat) case Rol_TCH: /* If I am a teacher in the current course, I can see the email of confirmed students and teachers */ - return (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat) && // A user belonging to the current course - UsrDat->Accepted) ? Usr_CAN : // who accepted registration + return (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat) == Usr_BELONG && // A user belonging to the current course + UsrDat->Accepted) ? Usr_CAN : // who accepted registration Usr_CAN_NOT; case Rol_DEG_ADM: /* If I am an administrator of current degree, I only can see the user's email of users from current degree */ - return Hie_CheckIfUsrBelongsTo (Hie_DEG,UsrDat->UsrCod, - Gbl.Hierarchy.Node[Hie_DEG].HieCod, - true) ? Usr_CAN : // count only accepted courses - Usr_CAN_NOT; + return (Hie_CheckIfUsrBelongsTo (Hie_DEG,UsrDat->UsrCod, + Gbl.Hierarchy.Node[Hie_DEG].HieCod, + true) == Usr_BELONG) ? Usr_CAN : // count only accepted courses + Usr_CAN_NOT; case Rol_CTR_ADM: /* If I am an administrator of current center, I only can see the user's email of users from current center */ - return Hie_CheckIfUsrBelongsTo (Hie_CTR,UsrDat->UsrCod, - Gbl.Hierarchy.Node[Hie_CTR].HieCod, - true) ? Usr_CAN : // count only accepted courses - Usr_CAN_NOT; + return (Hie_CheckIfUsrBelongsTo (Hie_CTR,UsrDat->UsrCod, + Gbl.Hierarchy.Node[Hie_CTR].HieCod, + true) == Usr_BELONG) ? Usr_CAN : // count only accepted courses + Usr_CAN_NOT; case Rol_INS_ADM: /* If I am an administrator of current institution, I only can see the user's email of users from current institution */ - return Hie_CheckIfUsrBelongsTo (Hie_INS,UsrDat->UsrCod, - Gbl.Hierarchy.Node[Hie_INS].HieCod, - true) ? Usr_CAN : // count only accepted courses - Usr_CAN_NOT; + return (Hie_CheckIfUsrBelongsTo (Hie_INS,UsrDat->UsrCod, + Gbl.Hierarchy.Node[Hie_INS].HieCod, + true) == Usr_BELONG) ? Usr_CAN : // count only accepted courses + Usr_CAN_NOT; case Rol_SYS_ADM: return Usr_CAN; default: diff --git a/swad_record.c b/swad_record.c index 6c035015a..d5dd8f8fb 100644 --- a/swad_record.c +++ b/swad_record.c @@ -1113,7 +1113,7 @@ static void Rec_ListRecordsStds (Rec_SharedRecordViewType_t ShaTypeOfView, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get student's data from database Usr_DONT_GET_PREFS, Usr_GET_ROLE_IN_CRS)) - if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat) == Usr_BELONG) { /* Check if this user has accepted his/her inscription in the current course */ @@ -1326,7 +1326,7 @@ static void Rec_ListRecordsTchs (Rec_SharedRecordViewType_t TypeOfView) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get teacher's data from database Usr_DONT_GET_PREFS, Usr_GET_ROLE_IN_CRS)) - if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat) == Usr_BELONG) { /* Check if this user has accepted his/her inscription in the current course */ diff --git a/swad_role.c b/swad_role.c index eb52be399..ff8441dbb 100644 --- a/swad_role.c +++ b/swad_role.c @@ -128,9 +128,7 @@ void Rol_SetMyRoles (void) /***** Check if I belong to current course *****/ if (Gbl.Hierarchy.Level == Hie_CRS) // Course selected { - Gbl.Usrs.Me.IBelongToCurrent[Hie_CRS] = - Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Me.UsrDat) ? Usr_BELONG : - Usr_DONT_BELONG; + Gbl.Usrs.Me.IBelongToCurrent[Hie_CRS] = Enr_CheckIfUsrBelongsToCurrentCrs (&Gbl.Usrs.Me.UsrDat); switch (Gbl.Usrs.Me.IBelongToCurrent[Hie_CRS]) { case Usr_BELONG: diff --git a/swad_user.c b/swad_user.c index b41562f4e..f3294542b 100644 --- a/swad_user.c +++ b/swad_user.c @@ -820,7 +820,7 @@ Usr_Can_t Usr_CheckIfICanEditOtherUsr (const struct Usr_Data *UsrDat) I only can edit users from current degree who have accepted */ if (Hie_CheckIfUsrBelongsTo (Hie_DEG,UsrDat->UsrCod, Gbl.Hierarchy.Node[Hie_DEG].HieCod, - true)) // count only accepted courses + true) == Usr_BELONG) // count only accepted courses // Degree admins can't edit superusers' data if (!Usr_CheckIfUsrIsSuperuser (UsrDat->UsrCod)) return Usr_CAN; @@ -830,7 +830,7 @@ Usr_Can_t Usr_CheckIfICanEditOtherUsr (const struct Usr_Data *UsrDat) I only can edit from current center who have accepted */ if (Hie_CheckIfUsrBelongsTo (Hie_CTR,UsrDat->UsrCod, Gbl.Hierarchy.Node[Hie_CTR].HieCod, - true)) // count only accepted courses + true) == Usr_BELONG) // count only accepted courses // Center admins can't edit superusers' data if (!Usr_CheckIfUsrIsSuperuser (UsrDat->UsrCod)) return Usr_CAN; @@ -840,7 +840,7 @@ Usr_Can_t Usr_CheckIfICanEditOtherUsr (const struct Usr_Data *UsrDat) I only can edit from current institution who have accepted */ if (Hie_CheckIfUsrBelongsTo (Hie_INS,UsrDat->UsrCod, Gbl.Hierarchy.Node[Hie_INS].HieCod, - true)) // count only accepted courses + true) == Usr_BELONG) // count only accepted courses // Institution admins can't edit superusers' data if (!Usr_CheckIfUsrIsSuperuser (UsrDat->UsrCod)) return Usr_CAN; @@ -887,7 +887,7 @@ Usr_Can_t Usr_CheckIfICanViewRecordStd (const struct Usr_Data *UsrDat) return Usr_CAN; /***** 8. Fast / slow check: Does he/she belong to the current course? *****/ - if (!Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat) == Usr_DONT_BELONG) return Usr_CAN_NOT; /***** 9. Fast / slow check depending on roles *****/ @@ -962,7 +962,7 @@ Usr_Can_t Usr_CheckIfICanViewTstExaMchResult (const struct Usr_Data *UsrDat) return Usr_CAN; /***** 7. Fast check: Does he/she belong to the current course? *****/ - if (!Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat) == Usr_DONT_BELONG) return Usr_CAN_NOT; /***** 8. Fast / slow check depending on roles *****/ @@ -998,7 +998,7 @@ Usr_Can_t Usr_CheckIfICanViewAsgWrk (const struct Usr_Data *UsrDat) /***** 4. Fast check: Does he/she belong to the current course? *****/ // Only users beloging to course can have files in assignments/works - if (!Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat) == Usr_DONT_BELONG) return Usr_CAN_NOT; /***** 5. Fast check: Am I a system admin? *****/ diff --git a/swad_zip.c b/swad_zip.c index 3f0d7b9f9..ad5412f38 100644 --- a/swad_zip.c +++ b/swad_zip.c @@ -152,7 +152,7 @@ void ZIP_CreateZIPAsgWrk (void) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get user's data from database Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) - if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat)) + if (Enr_CheckIfUsrBelongsToCurrentCrs (&UsrDat) == Usr_BELONG) ZIP_CreateDirCompressionUsr (&UsrDat); }