From 665eb5e4ce8a9663f2b759fc747c8333d788fca5 Mon Sep 17 00:00:00 2001 From: acanas Date: Mon, 1 Apr 2024 17:59:51 +0200 Subject: [PATCH] Version 23.72: Apr 01, 2024 New type Usr_ICan_t. --- swad_API.c | 8 +- swad_ID.c | 28 ++-- swad_ID.h | 2 +- swad_account.c | 18 ++- swad_account.h | 2 +- swad_admin.c | 33 +++-- swad_admin.h | 2 + swad_agenda.c | 36 ++++- swad_agenda.h | 2 + swad_alert.c | 70 +++++----- swad_assignment.c | 86 ++++++------ swad_assignment.h | 2 +- swad_assignment_database.c | 5 +- swad_assignment_database.h | 2 +- swad_attendance.c | 33 ++--- swad_attendance.h | 2 +- swad_banner.c | 12 +- swad_browser.c | 238 ++++++++++++++++++---------------- swad_building.c | 17 ++- swad_calendar.c | 4 +- swad_call_for_exam.c | 19 ++- swad_call_for_exam.h | 2 +- swad_call_for_exam_database.c | 2 +- swad_center.c | 28 ++-- swad_changelog.h | 4 +- swad_country.c | 13 +- swad_country.h | 3 +- swad_country_config.c | 2 +- swad_course.c | 40 +++--- swad_degree.c | 35 +++-- swad_degree_type.c | 16 +-- swad_degree_type.h | 2 +- swad_department.c | 10 +- swad_duplicate.c | 2 +- swad_enrolment.c | 39 +++--- swad_exam.c | 52 +++----- swad_exam.h | 5 +- swad_exam_database.c | 14 +- swad_exam_database.h | 2 +- swad_exam_log.c | 6 +- swad_exam_log.h | 4 +- swad_exam_print.c | 4 +- swad_exam_result.c | 94 +++++++------- swad_exam_session.c | 88 ++++++------- swad_exam_session.h | 6 +- swad_exam_set.c | 61 +++++---- swad_follow.c | 16 +-- swad_forum.c | 21 +-- swad_game.c | 102 +++++++-------- swad_group.c | 42 +++--- swad_hierarchy.c | 22 ++-- swad_hierarchy.h | 2 +- swad_holiday.c | 37 +++--- swad_institution.c | 40 +++--- swad_link.c | 37 +++--- swad_mail.c | 13 +- swad_match.c | 100 +++++++------- swad_match.h | 2 +- swad_match_database.c | 5 +- swad_match_database.h | 2 +- swad_match_result.c | 50 +++---- swad_nickname.c | 4 +- swad_notice.c | 13 +- swad_password.c | 2 +- swad_photo.c | 28 ++-- swad_photo.h | 2 +- swad_place.c | 39 +++--- swad_plugin.c | 6 +- swad_privacy.c | 25 ++-- swad_privacy.h | 2 +- swad_profile.c | 6 +- swad_program.c | 20 ++- swad_program.h | 2 +- swad_program_resource.c | 6 +- swad_project.c | 188 ++++++++++++++------------- swad_project.h | 4 +- swad_project_config.c | 8 +- swad_project_config.h | 2 +- swad_question.c | 10 -- swad_question.h | 1 - swad_record.c | 52 ++++---- swad_resource.c | 8 +- swad_resource.h | 3 +- swad_room.c | 17 ++- swad_room_database.c | 5 +- swad_room_database.h | 2 +- swad_rubric.c | 44 +++---- swad_rubric.h | 2 +- swad_rubric_criteria.c | 2 +- swad_rubric_criteria.h | 2 +- swad_rubric_resource.c | 2 +- swad_survey.c | 45 +++---- swad_survey_database.c | 5 +- swad_survey_database.h | 2 +- swad_tab.c | 39 +++--- swad_test_print.c | 128 +++++++++--------- swad_test_print.h | 2 +- swad_timeline_comment.c | 2 +- swad_timeline_favourite.c | 8 +- swad_timeline_note.c | 2 +- swad_timeline_share.c | 4 +- swad_timeline_user.c | 16 +-- swad_timeline_user.h | 4 +- swad_timetable.c | 9 +- swad_user.c | 159 ++++++++++------------- swad_user.h | 23 ++-- 106 files changed, 1329 insertions(+), 1272 deletions(-) diff --git a/swad_API.c b/swad_API.c index 278a4eb03..2a06a5d97 100644 --- a/swad_API.c +++ b/swad_API.c @@ -1772,7 +1772,7 @@ static void API_CopyListUsers (struct soap *soap, /* Get list of user's IDs */ ID_GetListIDsFromUsrCod (&UsrDat); - ICanSeeUsrID = ID_ICanSeeOtherUsrIDs (&UsrDat); + ICanSeeUsrID = (ID_ICanSeeOtherUsrIDs (&UsrDat) == Usr_I_CAN); /* Get nickname */ Nck_DB_GetNicknameFromUsrCod (UsrDat.UsrCod,UsrDat.Nickname); @@ -4326,7 +4326,6 @@ int swad__getMatchStatus (struct soap *soap, int ReturnCode; struct Gam_Game Game; struct Mch_Match Match; - bool ICanPlayThisMatchBasedOnGrps; struct Mch_UsrAnswer UsrAnswer; /***** Reset game and match *****/ @@ -4395,8 +4394,7 @@ int swad__getMatchStatus (struct soap *soap, "Requester must be a student in the course"); /***** Can I play this match? *****/ - ICanPlayThisMatchBasedOnGrps = Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match); - if (!ICanPlayThisMatchBasedOnGrps) + if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match) == Usr_I_CAN_NOT) return soap_receiver_fault (soap, "Request forbidden", "Requester can not join this match"); @@ -5263,7 +5261,7 @@ int swad__getLastLocation (struct soap *soap, The other user does not have to share any course with me, but at least some course of each one has to share center. */ - if (Roo_DB_CheckIfICanSeeUsrLocation ((long) userCode)) + if (Roo_DB_CheckIfICanSeeUsrLocation ((long) userCode) == Usr_I_CAN) { /***** Get list of locations *****/ NumLocs = Roo_DB_GetUsrLastLocation (&mysql_res,(long) userCode); diff --git a/swad_ID.c b/swad_ID.c index 4f4c6d517..04051f95f 100644 --- a/swad_ID.c +++ b/swad_ID.c @@ -308,7 +308,7 @@ static bool ID_CheckIfUsrIDIsValidUsingMinDigits (const char *UsrID,unsigned Min void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor) { unsigned NumID; - bool ICanSeeUsrID = ID_ICanSeeOtherUsrIDs (UsrDat); + bool ICanSeeUsrID = (ID_ICanSeeOtherUsrIDs (UsrDat) == Usr_I_CAN); bool ICanConfirmUsrID = ICanSeeUsrID && Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER && // Not me !Frm_CheckIfInside () && // Not inside another form @@ -343,11 +343,11 @@ void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor) /***************** Check if I can see another user's IDs *********************/ /*****************************************************************************/ -bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat) +Usr_ICan_t ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat) { /***** Fast check: It's me? *****/ if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - return true; + return Usr_I_CAN; /***** Check if I have permission to see another user's IDs *****/ switch (Gbl.Usrs.Me.Role.Logged) @@ -356,12 +356,12 @@ bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat) case Rol_TCH: /* Check 1: I can see the IDs of users who do not exist in database */ if (UsrDat->UsrCod <= 0) // User does not exist (when creating a new user) - return true; + return Usr_I_CAN; /* Check 2: I can see the IDs of confirmed students */ if (UsrDat->Roles.InCurrentCrs == Rol_STD && // A student UsrDat->Accepted) // who accepted registration - return true; + return Usr_I_CAN; /* Check 3: I can see the IDs of users with user's data empty */ // This check is made to not view simultaneously: @@ -372,16 +372,16 @@ bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat) !UsrDat->Surname2[0] && // and who has no surname 2 (nobody filled user's surname 2) !UsrDat->FrstName[0] && // and who has no first name (nobody filled user's first name) !UsrDat->Email[0]) // and who has no email (nobody filled user's email) - return true; + return Usr_I_CAN; - return false; + return Usr_I_CAN_NOT; case Rol_DEG_ADM: case Rol_CTR_ADM: case Rol_INS_ADM: case Rol_SYS_ADM: - return Usr_ICanEditOtherUsr (UsrDat); + return Usr_CheckIfICanEditOtherUsr (UsrDat); default: - return false; + return Usr_I_CAN_NOT; } } @@ -691,7 +691,7 @@ void ID_RemoveOtherUsrID (void) /***** Get other user's code from form and get user's data *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Remove user's ID *****/ ID_RemoveUsrID (&Gbl.Usrs.Other.UsrDat, @@ -721,7 +721,7 @@ static void ID_RemoveUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOt char UsrID[ID_MAX_BYTES_USR_ID + 1]; bool ICanRemove; - if (Usr_ICanEditOtherUsr (UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN) { /***** Get user's ID from form *****/ Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID); @@ -787,7 +787,7 @@ void ID_ChangeOtherUsrID (void) /***** Get other user's code from form and get user's data *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Change user's ID *****/ ID_ChangeUsrID (&Gbl.Usrs.Other.UsrDat, @@ -822,7 +822,7 @@ static void ID_ChangeUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOt bool AlreadyExists; unsigned NumIDFound = 0; // Initialized to avoid warning - if (Usr_ICanEditOtherUsr (UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN) { /***** Get new user's ID from form *****/ Par_GetParText ("NewID",NewID,ID_MAX_BYTES_USR_ID); @@ -911,7 +911,7 @@ void ID_ConfirmOtherUsrID (void) if (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs == Rol_STD) Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); - if (ID_ICanSeeOtherUsrIDs (&Gbl.Usrs.Other.UsrDat)) + if (ID_ICanSeeOtherUsrIDs (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) ICanConfirm = true; } diff --git a/swad_ID.h b/swad_ID.h index fc70fb26b..816b6c4a8 100644 --- a/swad_ID.h +++ b/swad_ID.h @@ -70,7 +70,7 @@ bool ID_CheckIfUsrIDIsValid (const char *UsrID); bool ID_CheckIfUsrIDSeemsAValidID (const char *UsrID); void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor); -bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat); +Usr_ICan_t ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat); void ID_ShowFormChangeMyID (bool IShouldFillInID); void ID_ShowFormChangeOtherUsrID (void); diff --git a/swad_account.c b/swad_account.c index e5adb73d4..071948201 100644 --- a/swad_account.c +++ b/swad_account.c @@ -488,7 +488,7 @@ void Acc_ShowFormChgOtherUsrAccount (void) /***** Get user whose account must be changed *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Get user's nickname and email address It's necessary because nickname or email could be just updated *****/ @@ -530,7 +530,7 @@ void Acc_ShowFormChgOtherUsrAccount (void) void Acc_PutLinkToRemoveMyAccount (__attribute__((unused)) void *Args) { - if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Me.UsrDat.UsrCod)) + if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Me.UsrDat.UsrCod) == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (ActReqRemMyAcc,NULL, Acc_PutParsToRemoveMyAccount,Gbl.Usrs.Me.UsrDat.EnUsrCod, "trash.svg",Ico_RED); @@ -771,7 +771,7 @@ void Acc_GetUsrCodAndRemUsrGbl (void) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod)) + if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_I_CAN) Acc_ReqRemAccountOrRemAccount (Acc_REMOVE_USR); else Error = true; @@ -814,7 +814,7 @@ void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove) /******** Check if I can eliminate completely another user's account *********/ /*****************************************************************************/ -bool Acc_CheckIfICanEliminateAccount (long UsrCod) +Usr_ICan_t Acc_CheckIfICanEliminateAccount (long UsrCod) { Usr_MeOrOther_t MeOrOther = Usr_ItsMe (UsrCod); @@ -823,10 +823,14 @@ bool Acc_CheckIfICanEliminateAccount (long UsrCod) switch (MeOrOther) { case Usr_ME: - return (Gbl.Usrs.Me.Role.Available & (1 << Rol_SYS_ADM)) == 0; // I can not be system admin + // A system admin can not eliminate him/herself + return (Gbl.Usrs.Me.Role.Available & (1 << Rol_SYS_ADM)) == 0 ? Usr_I_CAN : + Usr_I_CAN_NOT; case Usr_OTHER: default: - return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; // I am logged as system admin + // Only a system admin can eliminate other's account + return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ? Usr_I_CAN : + Usr_I_CAN_NOT; } } @@ -1100,7 +1104,7 @@ void Acc_PutIconToChangeUsrAccount (struct Usr_Data *UsrDat) break; case Usr_OTHER: default: - if (Usr_ICanEditOtherUsr (UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL, Rec_PutParUsrCodEncrypted,NULL, "at.svg",Ico_BLACK); diff --git a/swad_account.h b/swad_account.h index 52399b13a..02718cd2e 100644 --- a/swad_account.h +++ b/swad_account.h @@ -62,7 +62,7 @@ void Acc_AfterCreationNewAccount (void); void Acc_GetUsrCodAndRemUsrGbl (void); void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove); -bool Acc_CheckIfICanEliminateAccount (long UsrCod); +Usr_ICan_t Acc_CheckIfICanEliminateAccount (long UsrCod); void Acc_AskIfRemoveMyAccount (void); void Acc_RemoveMyAccount (void); void Acc_CompletelyEliminateAccount (struct Usr_Data *UsrDat, diff --git a/swad_admin.c b/swad_admin.c index 26e89e165..080b12b14 100644 --- a/swad_admin.c +++ b/swad_admin.c @@ -34,20 +34,6 @@ #include "swad_global.h" #include "swad_user_database.h" -/*****************************************************************************/ -/****************************** Public constants *****************************/ -/*****************************************************************************/ - -const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES] = - { - /* Users who can admin */ - [Rol_TCH ] = true, - [Rol_DEG_ADM] = true, - [Rol_CTR_ADM] = true, - [Rol_INS_ADM] = true, - [Rol_SYS_ADM] = true, - }; - /*****************************************************************************/ /************** External global variables from others modules ****************/ /*****************************************************************************/ @@ -66,6 +52,25 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr, static void Adm_AskIfRemAdm (Usr_MeOrOther_t MeOrOther,Hie_Level_t Level); static void Adm_EffectivelyRemAdm (struct Usr_Data *UsrDat,Hie_Level_t Level); +/*****************************************************************************/ +/**************** Check if I can admin another user's account ****************/ +/*****************************************************************************/ + +Usr_ICan_t Adm_CheckIfICanAdminOtherUsrs (void) + { + static Usr_ICan_t Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES] = + { + /* Users who can admin */ + [Rol_TCH ] = Usr_I_CAN, + [Rol_DEG_ADM] = Usr_I_CAN, + [Rol_CTR_ADM] = Usr_I_CAN, + [Rol_INS_ADM] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, + }; + + return Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged]; + } + /*****************************************************************************/ /**** Ask if really wanted to add an administrator to current institution ****/ /*****************************************************************************/ diff --git a/swad_admin.h b/swad_admin.h index 53be95202..7d7c64104 100644 --- a/swad_admin.h +++ b/swad_admin.h @@ -35,6 +35,8 @@ /****************************** Public prototypes ****************************/ /*****************************************************************************/ +Usr_ICan_t Adm_CheckIfICanAdminOtherUsrs (void); + void Adm_ReqAddAdm (Hie_Level_t Level); void Adm_AddAdmToIns (void); diff --git a/swad_agenda.c b/swad_agenda.c index e566e24c5..c993849d5 100644 --- a/swad_agenda.c +++ b/swad_agenda.c @@ -121,6 +121,29 @@ static void Agd_FreeListEvents (struct Agd_Agenda *Agenda); static void Agd_HideUnhideEvent (HidVis_HiddenOrVisible_t HiddenOrVisible); +/*****************************************************************************/ +/******************* Check if I can view a user's agenda *********************/ +/*****************************************************************************/ + +Usr_ICan_t Agd_CheckIfICanViewUsrAgenda (struct Usr_Data *UsrDat) + { + /***** 1. Fast check: Am I logged? *****/ + if (!Gbl.Usrs.Me.Logged) + return Usr_I_CAN_NOT; + + /***** 2. Fast check: It's me? *****/ + if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) + return Usr_I_CAN; + + /***** 3. Fast check: Am I logged as system admin? *****/ + if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) + return Usr_I_CAN; + + /***** 4. Slow check: Get if user shares any course with me from database *****/ + return Enr_CheckIfUsrSharesAnyOfMyCrs (UsrDat) ? Usr_I_CAN : + Usr_I_CAN_NOT; + } + /*****************************************************************************/ /*************************** Reset agenda context ****************************/ /*****************************************************************************/ @@ -386,7 +409,7 @@ void Agd_ShowUsrAgenda (void) /***** Get user *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) - if (Usr_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat)) + if (Agd_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { Error = false; @@ -695,8 +718,7 @@ static void Agd_PutIconToCreateNewEvent (void *Agenda) static void Agd_PutIconToViewEditMyFullAgenda (void *EncryptedUsrCod) { - Ico_PutContextualIconToEdit (ActSeeMyAgd,NULL, - NULL,EncryptedUsrCod); + Ico_PutContextualIconToEdit (ActSeeMyAgd,NULL,NULL,EncryptedUsrCod); } static void Agd_PutIconToShowQR (void) @@ -714,19 +736,19 @@ static void Agd_PutIconToShowQR (void) static void Agd_PutIconsOtherPublicAgenda (void *EncryptedUsrCod) { /***** Button to view user's public profile *****/ - if (Pri_ShowingIsAllowed (Gbl.Usrs.Other.UsrDat.BaPrfVisibility, - &Gbl.Usrs.Other.UsrDat)) + if (Pri_CheckIfICanView (Gbl.Usrs.Other.UsrDat.BaPrfVisibility, + &Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (ActSeeOthPubPrf,NULL, Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod, "user.svg",Ico_BLACK); /***** Button to view user's record card *****/ - if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) /* View student's records: common record card and course record card */ Lay_PutContextualLinkOnlyIcon (ActSeeRecOneStd,NULL, Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod, "address-card.svg",Ico_BLACK); - else if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat)) + else if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (ActSeeRecOneTch,NULL, Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod, "address-card.svg",Ico_BLACK); diff --git a/swad_agenda.h b/swad_agenda.h index 3fcdd7b26..fb9f9998e 100644 --- a/swad_agenda.h +++ b/swad_agenda.h @@ -101,6 +101,8 @@ typedef enum /***************************** Public prototypes *****************************/ /*****************************************************************************/ +Usr_ICan_t Agd_CheckIfICanViewUsrAgenda (struct Usr_Data *UsrDat); + void Agd_PutFormLogInToShowUsrAgenda (void); void Agd_PutParAgd (void); diff --git a/swad_alert.c b/swad_alert.c index e88edd2fb..27974cb96 100644 --- a/swad_alert.c +++ b/swad_alert.c @@ -34,6 +34,7 @@ #include "swad_action_list.h" #include "swad_alert.h" +#include "swad_box.h" #include "swad_error.h" #include "swad_form.h" #include "swad_global.h" @@ -398,15 +399,15 @@ static void Ale_ShowFixAlertAndButtonBegin (Ale_AlertType_t AlertType,const char { extern const char *Txt_Close; char IdAlert[Frm_MAX_BYTES_ID + 1]; - static const bool AlertClosable[Ale_NUM_ALERT_TYPES] = + static Box_Closable_t AlertClosable[Ale_NUM_ALERT_TYPES] = { - [Ale_NONE ] = false, - [Ale_CLIPBOARD] = true, - [Ale_INFO ] = true, - [Ale_SUCCESS ] = true, - [Ale_QUESTION ] = true, - [Ale_WARNING ] = true, - [Ale_ERROR ] = true, + [Ale_NONE ] = Box_NOT_CLOSABLE, + [Ale_CLIPBOARD] = Box_CLOSABLE, + [Ale_INFO ] = Box_CLOSABLE, + [Ale_SUCCESS ] = Box_CLOSABLE, + [Ale_QUESTION ] = Box_CLOSABLE, + [Ale_WARNING ] = Box_CLOSABLE, + [Ale_ERROR ] = Box_CLOSABLE, }; static const char *Ale_AlertIcons[Ale_NUM_ALERT_TYPES] = { @@ -424,38 +425,49 @@ static void Ale_ShowFixAlertAndButtonBegin (Ale_AlertType_t AlertType,const char Lay_WriteStartOfPage (); /***** Begin container *****/ - if (AlertClosable[AlertType]) + switch (AlertClosable[AlertType]) { - /* Create unique id for alert */ - Frm_SetUniqueId (IdAlert); - HTM_DIV_Begin ("id=\"%s\" class=\"CM\"",IdAlert); + case Box_NOT_CLOSABLE: + HTM_DIV_Begin ("class=\"CM\""); + break; + case Box_CLOSABLE: + /* Create unique id for alert */ + Frm_SetUniqueId (IdAlert); + HTM_DIV_Begin ("id=\"%s\" class=\"CM\"",IdAlert); + break; } - else - HTM_DIV_Begin ("class=\"CM\""); /***** Begin box *****/ HTM_DIV_Begin ("class=\"ALERT ALERT_BG_%s\"",The_GetSuffix ()); /***** Icon to close the alert *****/ - if (AlertClosable[AlertType]) + switch (AlertClosable[AlertType]) { - HTM_DIV_Begin ("class=\"ALERT_CLOSE\""); - HTM_A_Begin ("href=\"\" onclick=\"toggleDisplay('%s');return false;\" /", - IdAlert); - Ico_PutIcon ("times.svg",Ico_BLACK,Txt_Close,"ICO16x16"); - HTM_A_End (); - HTM_DIV_End (); + case Box_NOT_CLOSABLE: + break; + case Box_CLOSABLE: + HTM_DIV_Begin ("class=\"ALERT_CLOSE\""); + HTM_A_Begin ("href=\"\" onclick=\"toggleDisplay('%s');return false;\" /", + IdAlert); + Ico_PutIcon ("times.svg",Ico_BLACK,Txt_Close,"ICO16x16"); + HTM_A_End (); + HTM_DIV_End (); + break; } /***** Write message *****/ - if (AlertType == Ale_NONE) - HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\"", - The_GetSuffix ()); - else - HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\"" - " style=\"background-image:url('%s/%s');\"", - The_GetSuffix (), - Cfg_URL_ICON_PUBLIC,Ale_AlertIcons[AlertType]); + switch (AlertType) + { + case Ale_NONE: + HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\"",The_GetSuffix ()); + break; + default: + HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\"" + " style=\"background-image:url('%s/%s');\"", + The_GetSuffix (), + Cfg_URL_ICON_PUBLIC,Ale_AlertIcons[AlertType]); + break; + } HTM_Txt (Txt); HTM_DIV_End (); } diff --git a/swad_assignment.c b/swad_assignment.c index 091a56d7d..b78a8eff5 100644 --- a/swad_assignment.c +++ b/swad_assignment.c @@ -56,6 +56,16 @@ #include "swad_setting.h" #include "swad_string.h" +/*****************************************************************************/ +/******************************* Private types *******************************/ +/*****************************************************************************/ + +typedef enum + { + Asg_ONE_ASSIGMENT, + Asg_MULTIPLE_ASSIGMENTS + } Asg_OneOrMultiple_t; + /*****************************************************************************/ /************** External global variables from others modules ****************/ /*****************************************************************************/ @@ -67,14 +77,15 @@ extern struct Globals Gbl; /*****************************************************************************/ static void Asg_PutHead (struct Asg_Assignments *Assignments, - bool OnlyOneAssignment,Vie_ViewType_t ViewType); -static bool Asg_CheckIfICanCreateAssignments (void); + Asg_OneOrMultiple_t OneOrMultiple, + Vie_ViewType_t ViewType); +static Usr_ICan_t Asg_CheckIfICanCreateAssignments (void); static void Asg_PutIconsListAssignments (void *Assignments); static void Asg_PutIconToCreateNewAsg (void *Assignments); static void Asg_ParsWhichGroupsToShow (void *Assignments); static void Asg_PutIconsOneAsg (void *Assignments); static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments, - bool OnlyOneAssignment, + Asg_OneOrMultiple_t OneOrMultiple, Vie_ViewType_t ViewType); static void Asg_WriteAsgAuthor (struct Asg_Assignment *Asg); static void Asg_WriteAssignmentFolder (struct Asg_Assignment *Asg, @@ -176,9 +187,7 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments) HTM_TABLE_Begin ("TBL_SCROLL"); /***** Table head *****/ - Asg_PutHead (Assignments, - false, // Not only this assignment in table - Vie_VIEW); // Not print view + Asg_PutHead (Assignments,Asg_MULTIPLE_ASSIGMENTS,Vie_VIEW); /***** Write all assignments *****/ for (NumAsg = Pagination.FirstItemVisible, The_ResetRowColor (); @@ -187,9 +196,7 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments) { Assignments->Asg.AsgCod = Assignments->LstAsgCods[NumAsg - 1]; Asg_GetAssignmentDataByCod (&Assignments->Asg); - Asg_ShowAssignmentRow (Assignments, - false, // Not only this assignment in table - Vie_VIEW); // Not print view + Asg_ShowAssignmentRow (Assignments,Asg_MULTIPLE_ASSIGMENTS,Vie_VIEW); } /***** End table *****/ @@ -214,7 +221,8 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments) /*****************************************************************************/ static void Asg_PutHead (struct Asg_Assignments *Assignments, - bool OnlyOneAssignment,Vie_ViewType_t ViewType) + Asg_OneOrMultiple_t OneOrMultiple, + Vie_ViewType_t ViewType) { extern const char *Txt_START_END_TIME_HELP[Dat_NUM_START_END_TIME]; extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; @@ -225,7 +233,7 @@ static void Asg_PutHead (struct Asg_Assignments *Assignments, HTM_TR_Begin (NULL); - if (!OnlyOneAssignment) + if (OneOrMultiple == Asg_MULTIPLE_ASSIGMENTS) HTM_TH_Span (NULL,HTM_HEAD_CENTER,1,1,"CONTEXT_COL"); // Column for contextual icons for (Order = (Dat_StartEndTime_t) 0; @@ -279,10 +287,11 @@ static void Asg_PutHead (struct Asg_Assignments *Assignments, /******************** Check if I can create assignments **********************/ /*****************************************************************************/ -static bool Asg_CheckIfICanCreateAssignments (void) +static Usr_ICan_t Asg_CheckIfICanCreateAssignments (void) { - return Gbl.Usrs.Me.Role.Logged == Rol_TCH || - Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; + return (Gbl.Usrs.Me.Role.Logged == Rol_TCH || + Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -294,11 +303,11 @@ static void Asg_PutIconsListAssignments (void *Assignments) /***** Put icon to create a new assignment *****/ if (Assignments) { - if (Asg_CheckIfICanCreateAssignments ()) + if (Asg_CheckIfICanCreateAssignments () == Usr_I_CAN) Asg_PutIconToCreateNewAsg (Assignments); /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) { ((struct Asg_Assignments *) Assignments)->Asg.AsgCod = -1L; Ico_PutContextualIconToGetLink (ActReqLnkAsg,NULL, @@ -393,14 +402,10 @@ void Asg_PrintOneAssignment (void) HTM_TABLE_BeginWideMarginPadding (2); /***** Table head *****/ - Asg_PutHead (&Assignments, - true, // Only this assignment in table - Vie_PRINT); // Print view + Asg_PutHead (&Assignments,Asg_ONE_ASSIGMENT,Vie_PRINT); /***** Write assignment *****/ - Asg_ShowAssignmentRow (&Assignments, - true, // Only this assignment in table - Vie_PRINT); // Print view + Asg_ShowAssignmentRow (&Assignments,Asg_ONE_ASSIGMENT,Vie_PRINT); /***** End table *****/ HTM_TABLE_End (); @@ -425,14 +430,10 @@ void Asg_ShowOneAssignmentInBox (struct Asg_Assignments *Assignments) HTM_TABLE_Begin ("TBL_SCROLL"); /***** Table head *****/ - Asg_PutHead (Assignments, - true, // Only this assignment in table - Vie_VIEW); // Not print view + Asg_PutHead (Assignments,Asg_ONE_ASSIGMENT,Vie_VIEW); /***** Write assignment *****/ - Asg_ShowAssignmentRow (Assignments, - true, // Only this assignment in table - Vie_VIEW); // Not print view + Asg_ShowAssignmentRow (Assignments,Asg_ONE_ASSIGMENT,Vie_VIEW); /***** End table *****/ HTM_TABLE_End (); @@ -467,7 +468,7 @@ static void Asg_PutIconsOneAsg (void *Assignments) /*****************************************************************************/ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments, - bool OnlyOneAssignment, + Asg_OneOrMultiple_t OneOrMultiple, Vie_ViewType_t ViewType) { extern const char *Txt_Actions[ActLst_NUM_ACTIONS]; @@ -488,7 +489,7 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments, HTM_TR_Begin (NULL); /* Forms to remove/edit this assignment */ - if (!OnlyOneAssignment) + if (OneOrMultiple == Asg_MULTIPLE_ASSIGMENTS) { HTM_TD_Begin ("rowspan=\"2\" class=\"CONTEXT_COL %s\"", The_GetColorRows ()); @@ -768,7 +769,7 @@ static void Asg_PutIconsToRemEditOneAsg (struct Asg_Assignments *Assignments, Asg_PutPars,Assignments); /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) Ico_PutContextualIconToGetLink (ActReqLnkAsg,NULL, Asg_PutPars,Assignments); /* falls through */ @@ -1640,7 +1641,7 @@ static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod) case Rol_TCH: // Students and teachers can do assignments depending on groups /***** Get if I can do an assignment from database *****/ - return Asg_DB_CheckIfICanDoAssignment (AsgCod); + return (Asg_DB_CheckIfICanDoAssignment (AsgCod) == Usr_I_CAN); case Rol_SYS_ADM: return true; default: @@ -1703,31 +1704,32 @@ void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg) /* Check if I have permission to create a file or folder into an assignment **/ /*****************************************************************************/ -bool Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg) +Usr_ICan_t Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg) { /***** Trivial check 1: assignment is valid *****/ if (Asg->AsgCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** Check 2: Do not create anything in hidden assigments *****/ if (Asg->HiddenOrVisible == HidVis_HIDDEN) - return false; + return Usr_I_CAN_NOT; /***** Check 3: If I do not belong to course / groups of this assignment, I can not create anything inside this assignment *****/ if (!Asg->IBelongToCrsOrGrps) - return false; + return Usr_I_CAN_NOT; /***** Check 4: Depending on my role in this course... *****/ switch (Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs) { - case Rol_STD: // Students... - case Rol_NET: // ...and non-editing teachers... - return Asg->Open; // ...can create inside open assignments - case Rol_TCH: // Teachers... - return true; // ...can create inside open or closed assignments + case Rol_STD: // Students... + case Rol_NET: // ...and non-editing teachers... + return Asg->Open ? Usr_I_CAN : // ...can create inside open assignments + Usr_I_CAN_NOT; + case Rol_TCH: // Teachers... + return Usr_I_CAN; // ...can create inside open or closed assignments default: - return false; + return Usr_I_CAN_NOT; } } diff --git a/swad_assignment.h b/swad_assignment.h index 82968f8e9..86f5393e6 100644 --- a/swad_assignment.h +++ b/swad_assignment.h @@ -106,7 +106,7 @@ void Asg_ReceiveAssignment (void); void Asg_RemoveCrsAssignments (long CrsCod); void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg); -bool Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg); +Usr_ICan_t Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg); void Asg_SetFolder (struct Asg_Assignment *Asg,unsigned Level); unsigned Asg_GetNumAssignments (Hie_Level_t Level,unsigned *NumNotif); diff --git a/swad_assignment_database.c b/swad_assignment_database.c index 6bd314430..47b00a200 100644 --- a/swad_assignment_database.c +++ b/swad_assignment_database.c @@ -331,7 +331,7 @@ void Asg_DB_RemoveAssignment (long AsgCod) /********************* Check if I can do an assignment ***********************/ /*****************************************************************************/ -bool Asg_DB_CheckIfICanDoAssignment (long AsgCod) +Usr_ICan_t Asg_DB_CheckIfICanDoAssignment (long AsgCod) { // Students and teachers can do assignments depending on groups return @@ -355,7 +355,8 @@ bool Asg_DB_CheckIfICanDoAssignment (long AsgCod) " AND asg_groups.GrpCod=grp_users.GrpCod)" "))", AsgCod, - Gbl.Usrs.Me.UsrDat.UsrCod); + Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ diff --git a/swad_assignment_database.h b/swad_assignment_database.h index 94f63f91d..039cc941c 100644 --- a/swad_assignment_database.h +++ b/swad_assignment_database.h @@ -59,7 +59,7 @@ void Asg_DB_HideOrUnhideAssignment (long AsgCod, void Asg_DB_RemoveAssignment (long AsgCod); -bool Asg_DB_CheckIfICanDoAssignment (long AsgCod); +Usr_ICan_t Asg_DB_CheckIfICanDoAssignment (long AsgCod); unsigned Asg_DB_GetGrps (MYSQL_RES **mysql_res,long AsgCod); void Asg_DB_CreateGroup (long AsgCod,long GrpCod); diff --git a/swad_attendance.c b/swad_attendance.c index 5abfe3bd9..37ad699ee 100644 --- a/swad_attendance.c +++ b/swad_attendance.c @@ -371,7 +371,7 @@ static void Att_PutIconsInListOfEvents (void *Events) Usr_PutParMyUsrCodEncrypted,Gbl.Usrs.Me.UsrDat.EnUsrCod); /***** Put icon to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) Ico_PutContextualIconToGetLink (ActReqLnkAtt,NULL, Att_PutPars,Events); } @@ -579,7 +579,7 @@ static void Att_PutFormsToRemEditOneEvent (struct Att_Events *Events, [HidVis_VISIBLE] = ActHidAtt, // Visible ==> action to hide }; - if (Att_CheckIfICanEditEvents ()) + if (Att_CheckIfICanEditEvents () == Usr_I_CAN) { /***** Icon to remove attendance event *****/ Ico_PutContextualIconToRemove (ActReqRemAtt,NULL, @@ -591,27 +591,24 @@ static void Att_PutFormsToRemEditOneEvent (struct Att_Events *Events, Events->Event.HiddenOrVisible); /***** Icon to edit attendance event *****/ - Ico_PutContextualIconToEdit (ActEdiOneAtt,NULL, - Att_PutPars,Events); + Ico_PutContextualIconToEdit (ActEdiOneAtt,NULL,Att_PutPars,Events); } /***** Icon to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) - Ico_PutContextualIconToGetLink (ActReqLnkAtt,NULL, - Att_PutPars,Events); + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) + Ico_PutContextualIconToGetLink (ActReqLnkAtt,NULL,Att_PutPars,Events); } - /*****************************************************************************/ /******************* Check if I can edit calls for exams *********************/ /*****************************************************************************/ -bool Att_CheckIfICanEditEvents (void) +Usr_ICan_t Att_CheckIfICanEditEvents (void) { - static const bool ICanEditAttEvents[Rol_NUM_ROLES] = + static Usr_ICan_t ICanEditAttEvents[Rol_NUM_ROLES] = { - [Rol_TCH ] = true, - [Rol_SYS_ADM] = true, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanEditAttEvents[Gbl.Usrs.Me.Role.Logged]; @@ -2181,7 +2178,7 @@ static void Att_ReqListOrPrintUsrsAttendanceCrs (__attribute__((unused)) void *A Txt_Attendance_list, Hlp_USERS_Attendance_attendance_list, Txt_View_attendance, - false); // Do not put form with date range + Frm_DONT_PUT_FORM); // Do not put form with date range /***** Free list of attendance events *****/ Att_FreeListEvents (&Events); @@ -2722,8 +2719,7 @@ static void Att_ListEventsToSelect (struct Att_Events *Events, static void Att_PutIconToViewAttEvents (__attribute__((unused)) void *Args) { - Ico_PutContextualIconToView (ActSeeAllAtt,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeAllAtt,NULL,NULL,NULL); } /*****************************************************************************/ @@ -2732,8 +2728,7 @@ static void Att_PutIconToViewAttEvents (__attribute__((unused)) void *Args) static void Att_PutIconToEditAttEvents (__attribute__((unused)) void *Args) { - Ico_PutContextualIconToEdit (ActSeeAllAtt,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActSeeAllAtt,NULL,NULL,NULL); } /*****************************************************************************/ @@ -2775,7 +2770,7 @@ static void Att_ListUsrsAttendanceTable (struct Att_Events *Events, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get from the database the data of the student Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewAtt (&UsrDat)) + if (Usr_CheckIfICanViewAtt (&UsrDat) == Usr_I_CAN) { UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&UsrDat); Att_WriteRowUsrSeveralAttEvents (Events,NumUsr,&UsrDat); @@ -3010,7 +3005,7 @@ static void Att_ListStdsWithAttEventsDetails (struct Att_Events *Events, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get from the database the data of the student Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewAtt (&UsrDat)) + if (Usr_CheckIfICanViewAtt (&UsrDat) == Usr_I_CAN) { UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&UsrDat); Att_ListAttEventsForAStd (Events,NumUsr,&UsrDat); diff --git a/swad_attendance.h b/swad_attendance.h index 92e9f7a91..252dbb364 100644 --- a/swad_attendance.h +++ b/swad_attendance.h @@ -85,7 +85,7 @@ struct Att_Events void Att_SeeEvents (void); -bool Att_CheckIfICanEditEvents (void); +Usr_ICan_t Att_CheckIfICanEditEvents (void); void Att_ReqCreatOrEditEvent (void); bool Att_GetEventDataByCod (struct Att_Event *Event); diff --git a/swad_banner.c b/swad_banner.c index d03d868d7..65bfd999f 100644 --- a/swad_banner.c +++ b/swad_banner.c @@ -205,8 +205,7 @@ static void Ban_PutIconsListingBanners (__attribute__((unused)) void *Args) static void Ban_PutIconToEditBanners (void) { - Ico_PutContextualIconToEdit (ActEdiBan,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiBan,NULL,NULL,NULL); } /*****************************************************************************/ @@ -357,8 +356,7 @@ static void Ban_GetBannerDataFromRow (MYSQL_RES *mysql_res, static void Ban_PutIconsEditingBanners (__attribute__((unused)) void *Args) { /***** Put icon to view banners *****/ - Ico_PutContextualIconToView (ActSeeBan,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeBan,NULL,NULL,NULL); /***** Put icon to view links *****/ Lnk_PutIconToViewLinks (); @@ -370,9 +368,7 @@ static void Ban_PutIconsEditingBanners (__attribute__((unused)) void *Args) void Ban_PutIconToViewBanners (void) { - Lay_PutContextualLinkOnlyIcon (ActSeeBan,NULL, - NULL,NULL, - "flag.svg",Ico_BLACK); + Lay_PutContextualLinkOnlyIcon (ActSeeBan,NULL,NULL,NULL,"flag.svg",Ico_BLACK); } /*****************************************************************************/ @@ -447,7 +443,7 @@ static void Ban_ListBannersForEdition (struct Ban_Banners *Banners) Nam_ExistingShortAndFullNames (ActionRename, ParCod_Ban,Banners->BanCodToEdit, Names, - true); // Put form + Frm_PUT_FORM); /* Banner image */ HTM_TD_Begin ("class=\"LM\""); diff --git a/swad_browser.c b/swad_browser.c index bb7922380..2b519c6fd 100644 --- a/swad_browser.c +++ b/swad_browser.c @@ -1097,7 +1097,7 @@ static Act_Action_t Brw_ActZIPFolder[Brw_NUM_TYPES_FILE_BROWSER] = /***************************** Private variables *****************************/ /*****************************************************************************/ -bool Brw_ICanEditFileOrFolder; // Can I modify (remove, rename, create inside, etc.) a file or folder? +Usr_ICan_t Brw_ICanEditFileOrFolder; // Can I modify (remove, rename, create inside, etc.) a file or folder? /*****************************************************************************/ /**************************** Private prototypes *****************************/ @@ -1213,7 +1213,7 @@ static bool Brw_CheckIfUploadIsAllowed (const char *FileType); static void Brw_PutIconToGetLinkToFile (void *FileMetadata); static void Brw_PutParsToGetLinkToFile (void *FileMetadata); -static bool Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner); +static Usr_ICan_t Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner); static bool Brw_CheckIfIAmOwnerOfFile (long PublisherUsrCod); static void Brw_WriteBigLinkToDownloadFile (const char *URL, struct Brw_FileMetadata *FileMetadata, @@ -1233,15 +1233,15 @@ static unsigned Brw_GetFileViewsFromMe (long FilCod); static void Brw_RemoveOneFileOrFolderFromDB (const char Path[PATH_MAX + 1]); static void Brw_RemoveChildrenOfFolderFromDB (const char Path[PATH_MAX + 1]); -static void Brw_SetIfICanEditFileOrFolder (bool Value); -static bool Brw_GetIfICanEditFileOrFolder (void); -static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level); +static void Brw_SetIfICanEditFileOrFolder (Usr_ICan_t Value); +static Usr_ICan_t Brw_GetIfICanEditFileOrFolder (void); +static Usr_ICan_t Brw_CheckIfICanEditFileOrFolder (unsigned Level); -static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level); -static bool Brw_CheckIfICanModifySharedFileOrFolder (void); -static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void); -static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void); -static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void); +static Usr_ICan_t Brw_CheckIfICanCreateIntoFolder (unsigned Level); +static Usr_ICan_t Brw_CheckIfICanModifySharedFileOrFolder (void); +static Usr_ICan_t Brw_CheckIfICanModifyPrivateFileOrFolder (void); +static Usr_ICan_t Brw_CheckIfICanModifyPrjDocFileOrFolder (void); +static Usr_ICan_t Brw_CheckIfICanModifyPrjAssFileOrFolder (void); static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row); @@ -2711,7 +2711,7 @@ static void Brw_AskEditWorksCrsInternal (__attribute__((unused)) void *Args) Txt_Assignments_and_other_works, Hlp_FILES_Homework_for_teachers, Txt_View_homework, - false); // Do not put form with date range + Frm_DONT_PUT_FORM); // Do not put form with date range } /*****************************************************************************/ @@ -2744,7 +2744,7 @@ void Brw_ShowFileBrowserProject (long PrjCod) Brw_WriteTopBeforeShowingFileBrowser (); - if (Prj_CheckIfICanViewProjectDocuments (PrjCod)) + if (Prj_CheckIfICanViewProjectDocuments (PrjCod) == Usr_I_CAN) { /***** Show the tree with the project documents *****/ Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ; @@ -2752,7 +2752,7 @@ void Brw_ShowFileBrowserProject (long PrjCod) Brw_ShowFileBrowser (); } - if (Prj_CheckIfICanViewProjectAssessment (PrjCod)) + if (Prj_CheckIfICanViewProjectAssessment (PrjCod) == Usr_I_CAN) { /***** Show the tree with the project assessment *****/ Gbl.FileBrowser.Type = Brw_ADMI_ASS_PRJ; @@ -2798,7 +2798,7 @@ static void Brw_ShowFileBrowsersAsgWrkCrs (void) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, Usr_DONT_GET_PREFS, Usr_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewAsgWrk (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewAsgWrk (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); @@ -3333,7 +3333,7 @@ static void Brw_PutIconsFileBrowser (__attribute__((unused)) void *Args) /***** Put icon to get resource link *****/ if (Brw_ActReqLnk[Gbl.FileBrowser.Type] != ActUnk && - Rsc_CheckIfICanGetLink ()) + Rsc_CheckIfICanGetLink () == Usr_I_CAN) Ico_PutContextualIconToGetLink (Brw_ActReqLnk[Gbl.FileBrowser.Type],NULL, NULL,NULL); @@ -3997,7 +3997,7 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId, } /****** If current action allows file administration... ******/ - Brw_SetIfICanEditFileOrFolder (false); + Brw_SetIfICanEditFileOrFolder (Usr_I_CAN_NOT); if (Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type) && !Gbl.FileBrowser.ShowOnlyPublicFiles) { @@ -4155,7 +4155,7 @@ static bool Brw_CheckIfCanPasteIn (unsigned Level) return false; /**** If I can not create elements into this folder... *****/ - if (!Brw_CheckIfICanCreateIntoFolder (Level)) + if (Brw_CheckIfICanCreateIntoFolder (Level) == Usr_I_CAN_NOT) return false; // Pasting into top level of assignments is forbidden /**** If we are in the same tree of the clipboard... *****/ @@ -4182,7 +4182,7 @@ static void Brw_PutIconRemove (void) { HTM_TD_Begin ("class=\"BM %s\"",The_GetColorRows ()); - if (Brw_GetIfICanEditFileOrFolder ()) // Can I remove this? + if (Brw_GetIfICanEditFileOrFolder () == Usr_I_CAN) // Can I remove this? switch (Gbl.FileBrowser.FilFolLnk.Type) { case Brw_IS_FILE: @@ -4459,13 +4459,11 @@ static void Brw_PutIconFolder (unsigned Level, const char *FileBrowserId,const char *RowId, Brw_IconTree_t IconSubtree) { - bool ICanCreate; - /***** Begin cell *****/ HTM_TD_Begin ("class=\"BM %s\"",The_GetColorRows ()); /***** Put icon to create a new file or folder *****/ - if ((ICanCreate = Brw_CheckIfICanCreateIntoFolder (Level))) // I can create a new file or folder + if (Brw_CheckIfICanCreateIntoFolder (Level) == Usr_I_CAN) // I can create a new file or folder { if (IconSubtree == Brw_ICON_TREE_EXPAND) { @@ -4721,7 +4719,7 @@ static void Brw_WriteFileName (unsigned Level,bool IsPublic, HTM_NBSP (); - if (Brw_GetIfICanEditFileOrFolder ()) // Can I rename this folder? + if (Brw_GetIfICanEditFileOrFolder () == Usr_I_CAN) // Can I rename this folder? { /***** Form to rename folder *****/ Frm_BeginForm (Brw_ActRenameFolder[Gbl.FileBrowser.Type]); @@ -4935,7 +4933,7 @@ void Brw_AskRemFileFromTree (void) Brw_GetParAndInitFileBrowser (); /***** Button of confirmation of removing *****/ - if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this file? + if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) // Can I remove this file? { /***** Show question and button to remove file/link *****/ Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type, @@ -4970,7 +4968,7 @@ void Brw_RemFileFromTree (void) /***** Get parameters related to file browser *****/ Brw_GetParAndInitFileBrowser (); - if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this file? + if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) // Can I remove this file? { snprintf (Path,sizeof (Path),"%s/%s", Gbl.FileBrowser.Path.AboveRootFolder, @@ -5023,7 +5021,7 @@ void Brw_RemFolderFromTree (void) /***** Get parameters related to file browser *****/ Brw_GetParAndInitFileBrowser (); - if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this folder? + if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) // Can I remove this folder? { snprintf (Path,sizeof (Path),"%s/%s", Gbl.FileBrowser.Path.AboveRootFolder, @@ -5089,7 +5087,7 @@ void Brw_RemSubtreeInFileBrowser (void) /***** Get parameters related to file browser *****/ Brw_GetParAndInitFileBrowser (); - if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this subtree? + if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) // Can I remove this subtree? { snprintf (Path,sizeof (Path),"%s/%s", Gbl.FileBrowser.Path.AboveRootFolder, @@ -6191,7 +6189,7 @@ void Brw_ShowFormFileBrowser (void) Brw_GetParAndInitFileBrowser (); /***** Check if creating a new folder or file is allowed *****/ - if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level)) + if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) { /***** Name of the folder to be shown ****/ Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type, @@ -6487,7 +6485,7 @@ void Brw_RecFolderFileBrowser (void) Brw_GetParAndInitFileBrowser (); /***** Check if creating a new folder is allowed *****/ - if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level)) + if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) { if (Str_ConvertFilFolLnkNameToValid (Gbl.FileBrowser.NewFilFolLnkName)) { @@ -6587,7 +6585,7 @@ void Brw_RenFolderFileBrowser (void) /***** Get parameters related to file browser *****/ Brw_GetParAndInitFileBrowser (); - if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I rename this folder? + if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) // Can I rename this folder? { if (Str_ConvertFilFolLnkNameToValid (Gbl.FileBrowser.NewFilFolLnkName)) { @@ -6758,7 +6756,7 @@ static bool Brw_RcvFileInFileBrw (struct BrwSiz_BrowserSize *Size, Brw_GetParAndInitFileBrowser (); /***** Check if creating a new file is allowed *****/ - if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level)) + if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) { /***** First, we save in disk the file received *****/ Par = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, @@ -6938,7 +6936,7 @@ void Brw_RecLinkFileBrowser (void) Brw_GetParAndInitFileBrowser (); /***** Check if creating a new link is allowed *****/ - if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level)) + if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) { /***** Create a new file to store URL ****/ Par_GetParText ("NewLinkURL",URL,PATH_MAX); @@ -7259,9 +7257,9 @@ void Brw_ShowFileMetadata (void) char URL[PATH_MAX + 1]; char FileSizeStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1]; bool Found; - bool ICanView = false; + Usr_ICan_t ICanView = Usr_I_CAN_NOT; bool IAmTheOwner; - bool ICanEdit; + Usr_ICan_t ICanEdit; bool ICanChangePublic = false; bool FileHasPublisher; Brw_License_t License; @@ -7285,32 +7283,36 @@ void Brw_ShowFileMetadata (void) /***** Check if I can view this file. It could be marked as hidden or in a hidden folder *****/ - ICanView = true; + ICanView = Usr_I_CAN; switch (Gbl.FileBrowser.Type) { case Brw_SHOW_DOC_INS: if (Gbl.Usrs.Me.Role.Logged < Rol_INS_ADM) - ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata); + ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT : + Usr_I_CAN; break; case Brw_SHOW_DOC_CTR: if (Gbl.Usrs.Me.Role.Logged < Rol_CTR_ADM) - ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata); + ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT : + Usr_I_CAN; break; case Brw_SHOW_DOC_DEG: if (Gbl.Usrs.Me.Role.Logged < Rol_DEG_ADM) - ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata); + ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT : + Usr_I_CAN; break; case Brw_SHOW_DOC_CRS: case Brw_SHOW_DOC_GRP: if (Gbl.Usrs.Me.Role.Logged < Rol_TCH) - ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata); + ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT : + Usr_I_CAN; break; default: break; } } - if (ICanView) + if (ICanView == Usr_I_CAN) { if (FileMetadata.FilFolLnk.Type == Brw_IS_FILE || FileMetadata.FilFolLnk.Type == Brw_IS_LINK) @@ -7354,7 +7356,7 @@ void Brw_ShowFileMetadata (void) if (Brw_ActReqLnk[Gbl.FileBrowser.Type] != ActUnk && (FileMetadata.FilFolLnk.Type == Brw_IS_FILE || // Only files or links FileMetadata.FilFolLnk.Type == Brw_IS_LINK) && - Rsc_CheckIfICanGetLink ()) + Rsc_CheckIfICanGetLink () == Usr_I_CAN) Box_BoxShadowBegin (NULL,Brw_PutIconToGetLinkToFile,&FileMetadata, NULL); else @@ -7363,7 +7365,7 @@ void Brw_ShowFileMetadata (void) /***** Begin form to update the metadata of a file *****/ - if (ICanEdit) // I can edit file properties + if (ICanEdit == Usr_I_CAN) // I can edit file properties { /* Can the file be public? */ switch (Gbl.FileBrowser.Type) @@ -7507,14 +7509,14 @@ void Brw_ShowFileMetadata (void) HTM_TR_Begin (NULL); /* Label */ - Frm_LabelColumn ("RT",ICanEdit ? "License" : - NULL, + Frm_LabelColumn ("RT",ICanEdit == Usr_I_CAN ? "License" : + NULL, Txt_License); /* Data */ HTM_TD_Begin ("class=\"LT DAT_STRONG_%s\"", The_GetSuffix ()); - if (ICanEdit) // I can edit file properties + if (ICanEdit == Usr_I_CAN) // I can edit file properties { HTM_SELECT_Begin (HTM_DONT_SUBMIT_ON_CHANGE,NULL, "id=\"License\" name=\"License\" class=\"LICENSE\""); @@ -7584,7 +7586,7 @@ void Brw_ShowFileMetadata (void) HTM_TABLE_End (); /***** End form *****/ - if (ICanEdit) // I can edit file properties + if (ICanEdit == Usr_I_CAN) // I can edit file properties { Btn_PutButton (Btn_CONFIRM_BUTTON,Txt_Save_file_properties); Frm_EndForm (); @@ -7628,7 +7630,7 @@ void Brw_ShowFileMetadata (void) /***** Add paths until file to table of expanded folders *****/ Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders (Gbl.FileBrowser.FilFolLnk.Path); } - else // !ICanView + else // ICanView == Usr_I_CAN_NOT { /***** Mark possible notifications about non visible file as removed *****/ switch (Gbl.FileBrowser.Type) @@ -7741,7 +7743,7 @@ void Brw_DownloadFile (void) struct Brw_FileMetadata FileMetadata; char URL[PATH_MAX + 1]; bool Found; - bool ICanView = false; + Usr_ICan_t ICanView = Usr_I_CAN_NOT; /***** Get parameters related to file browser *****/ Brw_GetParAndInitFileBrowser (); @@ -7760,32 +7762,36 @@ void Brw_DownloadFile (void) /***** Check if I can view this file. It could be marked as hidden or in a hidden folder *****/ - ICanView = true; + ICanView = Usr_I_CAN; switch (Gbl.FileBrowser.Type) { case Brw_SHOW_DOC_INS: if (Gbl.Usrs.Me.Role.Logged < Rol_INS_ADM) - ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata); + ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT : + Usr_I_CAN; break; case Brw_SHOW_DOC_CTR: if (Gbl.Usrs.Me.Role.Logged < Rol_CTR_ADM) - ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata); + ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT : + Usr_I_CAN; break; case Brw_SHOW_DOC_DEG: if (Gbl.Usrs.Me.Role.Logged < Rol_DEG_ADM) - ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata); + ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT : + Usr_I_CAN; break; case Brw_SHOW_DOC_CRS: case Brw_SHOW_DOC_GRP: if (Gbl.Usrs.Me.Role.Logged < Rol_TCH) - ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata); + ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT : + Usr_I_CAN; break; default: break; } } - if (ICanView) + if (ICanView == Usr_I_CAN) { if (FileMetadata.FilFolLnk.Type == Brw_IS_FILE || FileMetadata.FilFolLnk.Type == Brw_IS_LINK) @@ -7845,7 +7851,7 @@ void Brw_DownloadFile (void) Gbl.Layout.DivsEndWritten = Gbl.Layout.HTMLEndWritten = true; // Don't write HTML at all } - else // !ICanView + else // ICanView == Usr_I_CAN_NOT { /***** Mark possible notifications about non visible file as removed *****/ switch (Gbl.FileBrowser.Type) @@ -7889,7 +7895,7 @@ void Brw_DownloadFile (void) /*********** Check if I have permission to change file metadata **************/ /*****************************************************************************/ -static bool Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner) +static Usr_ICan_t Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner) { switch (Gbl.Action.Act) // Only in actions where edition is allowed { @@ -7918,9 +7924,10 @@ static bool Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner) case ActReqDatWrkUsr: case ActChgDatWrkUsr: case ActReqDatBrf: case ActChgDatBrf: - return IAmTheOwner; + return IAmTheOwner ? Usr_I_CAN : + Usr_I_CAN_NOT; default: - return false; + return Usr_I_CAN_NOT; } } @@ -8089,7 +8096,7 @@ void Brw_ChgFileMetadata (void) { /***** Check if I can change file metadata *****/ IAmTheOwner = Brw_CheckIfIAmOwnerOfFile (FileMetadata.PublisherUsrCod); - if (!Brw_CheckIfICanEditFileMetadata (IAmTheOwner)) + if (Brw_CheckIfICanEditFileMetadata (IAmTheOwner) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Check if the file was public before the edition *****/ @@ -8658,37 +8665,40 @@ static void Brw_RemoveChildrenOfFolderFromDB (const char Path[PATH_MAX + 1]) /********** Check if I have permission to modify a file or folder ************/ /*****************************************************************************/ -static void Brw_SetIfICanEditFileOrFolder (bool Value) +static void Brw_SetIfICanEditFileOrFolder (Usr_ICan_t Value) { Brw_ICanEditFileOrFolder = Value; } -static bool Brw_GetIfICanEditFileOrFolder (void) +static Usr_ICan_t Brw_GetIfICanEditFileOrFolder (void) { return Brw_ICanEditFileOrFolder; } -static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level) +static Usr_ICan_t Brw_CheckIfICanEditFileOrFolder (unsigned Level) { /***** Level 0 (root folder) can not be removed/renamed *****/ if (Level == 0) - return false; + return Usr_I_CAN_NOT; /***** I must be student or a superior role to edit *****/ if (Gbl.Usrs.Me.Role.Max < Rol_STD) - return false; + return Usr_I_CAN_NOT; /***** Set depending on browser, level, logged role... *****/ switch (Gbl.FileBrowser.Type) { case Brw_ADMI_DOC_CRS: - return Gbl.Usrs.Me.Role.Logged >= Rol_TCH; + return (Gbl.Usrs.Me.Role.Logged >= Rol_TCH) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Brw_ADMI_DOC_GRP: if (Gbl.Usrs.Me.Role.Logged == Rol_TCH) // A teacher... // ...can edit only if he/she belongs to group - return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod); + return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; // An administrator can edit - return (Gbl.Usrs.Me.Role.Logged > Rol_TCH); + return (Gbl.Usrs.Me.Role.Logged > Rol_TCH) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Brw_ADMI_TCH_CRS: case Brw_ADMI_TCH_GRP: // Check if I am the publisher of the file/folder @@ -8701,7 +8711,7 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level) case Brw_ADMI_ASG_CRS: if (Gbl.FileBrowser.FilFolLnk.Type == Brw_IS_FOLDER && // The main folder of an assignment Level == 1) - return false; // Do not remove / rename main folder of assigment + return Usr_I_CAN_NOT; // Do not remove / rename main folder of assigment return Asg_CheckIfICanCreateIntoAssigment (&Gbl.FileBrowser.Asg); case Brw_ADMI_DOC_PRJ: @@ -8709,7 +8719,8 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level) case Brw_ADMI_ASS_PRJ: return Brw_CheckIfICanModifyPrjAssFileOrFolder (); default: - return Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type); + return Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type) ? Usr_I_CAN : + Usr_I_CAN_NOT; } return false; } @@ -8718,59 +8729,68 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level) /**** Check if I have permission to create a file or folder into a folder ****/ /*****************************************************************************/ -static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level) +static Usr_ICan_t Brw_CheckIfICanCreateIntoFolder (unsigned Level) { /***** If not in a folder... *****/ if (Gbl.FileBrowser.FilFolLnk.Type != Brw_IS_FOLDER) - return false; + return Usr_I_CAN_NOT; /***** I must be student, teacher, admin or superuser to edit *****/ if (Gbl.Usrs.Me.Role.Max < Rol_STD) - return false; + return Usr_I_CAN_NOT; /***** If maximum level is reached, I can not create/paste *****/ if (Level >= BrwSiz_MAX_DIR_LEVELS) - return false; + return Usr_I_CAN_NOT; /***** Have I permission to create/paste a new file or folder into the folder? *****/ switch (Gbl.FileBrowser.Type) { case Brw_ADMI_DOC_CRS: - return Gbl.Usrs.Me.Role.Logged >= Rol_TCH; + return (Gbl.Usrs.Me.Role.Logged >= Rol_TCH) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Brw_ADMI_DOC_GRP: if (Gbl.Usrs.Me.Role.Logged == Rol_TCH) // A teacher // ...can create/paste only if he/she belongs to group - return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod); + return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; // An administrator can create/paste - return (Gbl.Usrs.Me.Role.Logged > Rol_TCH); + return (Gbl.Usrs.Me.Role.Logged > Rol_TCH) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Brw_ADMI_TCH_CRS: - return Gbl.Usrs.Me.Role.Logged >= Rol_NET; + return (Gbl.Usrs.Me.Role.Logged >= Rol_NET) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Brw_ADMI_TCH_GRP: if (Gbl.Usrs.Me.Role.Logged == Rol_NET || // A non-editing teacher... Gbl.Usrs.Me.Role.Logged == Rol_TCH) // ...or a teacher // ...can create/paste only if he/she belongs to group - return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod); + return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; // An administrator can create/paste - return (Gbl.Usrs.Me.Role.Logged > Rol_TCH); + return (Gbl.Usrs.Me.Role.Logged > Rol_TCH) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Brw_ADMI_SHR_CRS: - return Gbl.Usrs.Me.Role.Logged >= Rol_STD; + return (Gbl.Usrs.Me.Role.Logged >= Rol_STD) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Brw_ADMI_SHR_GRP: if (Gbl.Usrs.Me.Role.Logged >= Rol_STD && // A student, non-editing teacher... Gbl.Usrs.Me.Role.Logged <= Rol_TCH) // ...or a teacher // ...can create/paste only if he/she belongs to group - return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod); + return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; // An administrator can create/paste - return Gbl.Usrs.Me.Role.Logged >= Rol_STD; + return (Gbl.Usrs.Me.Role.Logged >= Rol_STD) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Brw_ADMI_ASG_USR: case Brw_ADMI_ASG_CRS: - if (Level == 0) // If root folder - return false; // Folders of assigments (level 1) - // can only be created automatically + if (Level == 0) // If root folder + return Usr_I_CAN_NOT; // Folders of assigments (level 1) + // can only be created automatically return Asg_CheckIfICanCreateIntoAssigment (&Gbl.FileBrowser.Asg); default: - return Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type); + return Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type) ? Usr_I_CAN : + Usr_I_CAN_NOT; } - return false; } /*****************************************************************************/ @@ -8779,7 +8799,7 @@ static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level) bool Brw_CheckIfFileBrowserIsEditable (Brw_FileBrowser_t FileBrowser) { - static const bool Brw_FileBrowserIsEditable[Brw_NUM_TYPES_FILE_BROWSER] = + static bool Brw_FileBrowserIsEditable[Brw_NUM_TYPES_FILE_BROWSER] = { [Brw_UNKNOWN ] = false, [Brw_SHOW_DOC_CRS] = false, @@ -8823,42 +8843,42 @@ bool Brw_CheckIfFileBrowserIsEditable (Brw_FileBrowser_t FileBrowser) // I can remove or rename a file if I am the publisher // I can remove or rename a folder if I am the unique publisher of all files and folders in the subtree starting there -static bool Brw_CheckIfICanModifySharedFileOrFolder (void) +static Usr_ICan_t Brw_CheckIfICanModifySharedFileOrFolder (void) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: // If I am a student or a non-editing teacher... case Rol_NET: // ...I can modify the file/folder if I am the publisher - return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full)); // Am I the publisher of subtree? + return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN : + Usr_I_CAN_NOT); // Am I the publisher of subtree? case Rol_TCH: case Rol_DEG_ADM: case Rol_CTR_ADM: case Rol_INS_ADM: case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } - return false; } -static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void) +static Usr_ICan_t Brw_CheckIfICanModifyPrivateFileOrFolder (void) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_NET: // If I am a student or a non-editing teacher... // ...I can modify the file/folder if I am the publisher - return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full)); // Am I the publisher of subtree? + return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN : + Usr_I_CAN_NOT); // Am I the publisher of subtree? case Rol_TCH: case Rol_DEG_ADM: case Rol_CTR_ADM: case Rol_INS_ADM: case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } - return false; } /*****************************************************************************/ @@ -8869,22 +8889,22 @@ static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void) // I can remove or rename a file if I am the publisher // I can remove or rename a folder if I am the unique publisher of all files and folders in the subtree starting there -static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void) +static Usr_ICan_t Brw_CheckIfICanModifyPrjDocFileOrFolder (void) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: case Rol_NET: if (Prj_GetMyRolesInProject (Prj_GetPrjCod ())) // I am a member - return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full)); // Am I the publisher of subtree? - return false; + return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN : + Usr_I_CAN_NOT); // Am I the publisher of subtree? + return Usr_I_CAN_NOT; case Rol_TCH: // Editing teachers in a course can access to all files case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } - return false; } /*****************************************************************************/ @@ -8895,7 +8915,7 @@ static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void) // I can remove or rename a file if I am the publisher // I can remove or rename a folder if I am the unique publisher of all files and folders in the subtree starting there -static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void) +static Usr_ICan_t Brw_CheckIfICanModifyPrjAssFileOrFolder (void) { switch (Gbl.Usrs.Me.Role.Logged) { @@ -8903,15 +8923,15 @@ static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void) case Rol_NET: if ((Prj_GetMyRolesInProject (Prj_GetPrjCod ()) & (1 << Prj_ROLE_TUT | // Tutor... 1 << Prj_ROLE_EVL))) // ...or evaluator - return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full)); // Am I the publisher of subtree? - return false; + return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN : + Usr_I_CAN_NOT); // Am I the publisher of subtree? + return Usr_I_CAN_NOT; case Rol_TCH: // Editing teachers in a course can access to all files case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } - return false; } /*****************************************************************************/ diff --git a/swad_building.c b/swad_building.c index fb5a72a90..6177d87f7 100644 --- a/swad_building.c +++ b/swad_building.c @@ -60,7 +60,7 @@ static struct Bld_Building *Bld_EditingBuilding = NULL; // Static variable to ke /*****************************************************************************/ static Bld_Order_t Bld_GetParBuildingOrder (void); -static bool Bld_CheckIfICanCreateBuildings (void); +static Usr_ICan_t Bld_CheckIfICanCreateBuildings (void); static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args); static void Bld_PutIconToEditBuildings (void); static void Bld_PutIconsEditingBuildings (__attribute__((unused)) void *Args); @@ -196,9 +196,10 @@ static Bld_Order_t Bld_GetParBuildingOrder (void) /********************* Check if I can create buildings ***********************/ /*****************************************************************************/ -static bool Bld_CheckIfICanCreateBuildings (void) +static Usr_ICan_t Bld_CheckIfICanCreateBuildings (void) { - return Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM; + return (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -208,7 +209,7 @@ static bool Bld_CheckIfICanCreateBuildings (void) static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args) { /***** Put icon to edit buildings *****/ - if (Bld_CheckIfICanCreateBuildings ()) + if (Bld_CheckIfICanCreateBuildings () == Usr_I_CAN) Bld_PutIconToEditBuildings (); } @@ -218,8 +219,7 @@ static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args) static void Bld_PutIconToEditBuildings (void) { - Ico_PutContextualIconToEdit (ActEdiBld,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiBld,NULL,NULL,NULL); } /*****************************************************************************/ @@ -275,8 +275,7 @@ static void Bld_EditBuildingsInternal (void) static void Bld_PutIconsEditingBuildings (__attribute__((unused)) void *Args) { /***** Put icon to view buildings *****/ - Ico_PutContextualIconToView (ActSeeBld,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeBld,NULL,NULL,NULL); } /*****************************************************************************/ @@ -435,7 +434,7 @@ static void Bld_ListBuildingsForEdition (const struct Bld_Buildings *Buildings) Nam_ExistingShortAndFullNames (ActionRename, ParCod_Bld,Building->BldCod, Names, - true); // Put form + Frm_PUT_FORM); /* Building location */ HTM_TD_Begin ("class=\"LM\""); diff --git a/swad_calendar.c b/swad_calendar.c index 7b90d05c0..f38e20127 100644 --- a/swad_calendar.c +++ b/swad_calendar.c @@ -56,7 +56,7 @@ extern struct Globals Gbl; /***************************** Public constants ******************************/ /*****************************************************************************/ -const bool Cal_DayIsValidAsFirstDayOfWeek[7] = +bool Cal_DayIsValidAsFirstDayOfWeek[7] = { [0] = true, // monday [1] = false, // tuesday @@ -332,7 +332,7 @@ void Cal_PutIconToSeeCalendar (void) void Cal_GetAndShowNumUsrsPerFirstDayOfWeek (void) { - extern const bool Cal_DayIsValidAsFirstDayOfWeek[7]; + extern bool Cal_DayIsValidAsFirstDayOfWeek[7]; extern const char *Hlp_ANALYTICS_Figures_calendar; extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES]; extern const char *Txt_Calendar; diff --git a/swad_call_for_exam.c b/swad_call_for_exam.c index 5868cef9f..c7d5279b8 100644 --- a/swad_call_for_exam.c +++ b/swad_call_for_exam.c @@ -675,13 +675,12 @@ static void Cfe_ListCallsForExams (struct Cfe_CallsForExams *CallsForExams, static void Cfe_PutIconsCallsForExams (__attribute__((unused)) void *Args) { /***** Icon to create a new call for exam *****/ - if (Cfe_CheckIfICanEditCallsForExams ()) + if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN) Ico_PutContextualIconToAdd (ActEdiCfe,NULL,NULL,NULL); /***** Icon to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) - Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL, - NULL,NULL); + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) + Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL,NULL,NULL); } /*****************************************************************************/ @@ -1465,7 +1464,7 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams) if (CallsForExams) { - if (Cfe_CheckIfICanEditCallsForExams ()) + if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN) { /***** Icon to remove call for exam *****/ Ico_PutContextualIconToRemove (ActReqRemCfe,NULL, @@ -1499,7 +1498,7 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams) &((struct Cfe_CallsForExams *) CallsForExams)->ExaCod); /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL, Cfe_PutParExaCod, &((struct Cfe_CallsForExams *) CallsForExams)->ExaCod); @@ -1510,12 +1509,12 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams) /******************* Check if I can edit calls for exams *********************/ /*****************************************************************************/ -bool Cfe_CheckIfICanEditCallsForExams (void) +Usr_ICan_t Cfe_CheckIfICanEditCallsForExams (void) { - static const bool ICanEditCallsForExams[Rol_NUM_ROLES] = + static Usr_ICan_t ICanEditCallsForExams[Rol_NUM_ROLES] = { - [Rol_TCH ] = true, - [Rol_SYS_ADM] = true, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanEditCallsForExams[Gbl.Usrs.Me.Role.Logged]; diff --git a/swad_call_for_exam.h b/swad_call_for_exam.h index 792815fa2..85aaa84e5 100644 --- a/swad_call_for_exam.h +++ b/swad_call_for_exam.h @@ -129,7 +129,7 @@ void Cfe_ListCallsForExamsDay (void); void Cfe_CreateListCallsForExams (struct Cfe_CallsForExams *CallsForExams); -bool Cfe_CheckIfICanEditCallsForExams (void); +Usr_ICan_t Cfe_CheckIfICanEditCallsForExams (void); void Cfe_GetSummaryAndContentCallForExam (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], char **ContentStr, diff --git a/swad_call_for_exam_database.c b/swad_call_for_exam_database.c index c16b5fbd2..a08c8336c 100644 --- a/swad_call_for_exam_database.c +++ b/swad_call_for_exam_database.c @@ -85,7 +85,7 @@ unsigned Cfe_DB_GetCallsForExamsInCurrentCrs (MYSQL_RES **mysql_res) char SubQueryStatus[64]; /***** Build subquery about status depending on my role *****/ - if (Cfe_CheckIfICanEditCallsForExams ()) + if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN) sprintf (SubQueryStatus,"Status<>%u", (unsigned) Cfe_DELETED_CALL_FOR_EXAM); else diff --git a/swad_center.c b/swad_center.c index 430b99a41..12a95c4d0 100644 --- a/swad_center.c +++ b/swad_center.c @@ -89,7 +89,7 @@ static void Ctr_GetCoordFromRow (MYSQL_RES *mysql_res, struct Map_Coordinates *Coord); static void Ctr_ListCentersForEdition (const struct Plc_Places *Places); -static bool Ctr_CheckIfICanEditACenter (struct Hie_Node *Ctr); +static Usr_ICan_t Ctr_CheckIfICanEditACenter (struct Hie_Node *Ctr); static void Ctr_ShowAlertAndButtonToGoToCtr (void); @@ -289,7 +289,7 @@ static void Ctr_ListCenters (void) static void Ctr_PutIconsListingCenters (__attribute__((unused)) void *Args) { /***** Put icon to edit centers *****/ - if (Hie_CheckIfICanEdit ()) + if (Hie_CheckIfICanEdit () == Usr_I_CAN) Ctr_PutIconToEditCenters (); /***** Put icon to show a figure *****/ @@ -302,8 +302,7 @@ static void Ctr_PutIconsListingCenters (__attribute__((unused)) void *Args) static void Ctr_PutIconToEditCenters (void) { - Ico_PutContextualIconToEdit (ActEdiCtr,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiCtr,NULL,NULL,NULL); } /*****************************************************************************/ @@ -460,8 +459,7 @@ static void Ctr_EditCentersInternal (void) static void Ctr_PutIconsEditingCenters (__attribute__((unused)) void *Args) { /***** Put icon to view centers *****/ - Ico_PutContextualIconToView (ActSeeCtr,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeCtr,NULL,NULL,NULL); /***** Put icon to show a figure *****/ Fig_PutIconToShowFigure (Fig_HIERARCHY); @@ -737,7 +735,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places) const struct Plc_Place *Plc; char WWW[Cns_MAX_BYTES_WWW + 1]; struct Usr_Data UsrDat; - bool ICanEdit; + Usr_ICan_t ICanEdit; unsigned NumDegs; unsigned NumUsrsCtr; unsigned NumUsrsInCrssOfCtr; @@ -773,7 +771,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places) /* Put icon to remove center */ HTM_TD_Begin ("class=\"BT\""); - if (!ICanEdit || // I cannot edit + if (ICanEdit == Usr_I_CAN_NOT || // I cannot edit NumDegs || // Center has degrees NumUsrsCtr || // Center has users who claim to belong to it NumUsrsInCrssOfCtr) // Center has users @@ -795,7 +793,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places) /* Place */ HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); - if (ICanEdit) + if (ICanEdit == Usr_I_CAN) { Frm_BeginForm (ActChgCtrPlc); ParCod_PutPar (ParCod_OthHie,Ctr->HieCod); @@ -836,11 +834,12 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places) Nam_ExistingShortAndFullNames (ActionRename, ParCod_OthHie,Ctr->HieCod, Names, - ICanEdit); // Put form? + ICanEdit == Usr_I_CAN ? Frm_PUT_FORM : + Frm_DONT_PUT_FORM); /* Center WWW */ HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); - if (ICanEdit) + if (ICanEdit == Usr_I_CAN) { Frm_BeginForm (ActChgCtrWWW); ParCod_PutPar (ParCod_OthHie,Ctr->HieCod); @@ -903,11 +902,12 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places) /************** Check if I can edit, remove, etc. a center *******************/ /*****************************************************************************/ -static bool Ctr_CheckIfICanEditACenter (struct Hie_Node *Ctr) +static Usr_ICan_t Ctr_CheckIfICanEditACenter (struct Hie_Node *Ctr) { - return Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM || // I am an institution administrator or higher + return (Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM || // I am an institution administrator or higher ((Ctr->Status & Hie_STATUS_BIT_PENDING) != 0 && // Center is not yet activated - Gbl.Usrs.Me.UsrDat.UsrCod == Ctr->RequesterUsrCod); // I am the requester + Gbl.Usrs.Me.UsrDat.UsrCod == Ctr->RequesterUsrCod)) ? Usr_I_CAN : // I am the requester + Usr_I_CAN_NOT; } /*****************************************************************************/ diff --git a/swad_changelog.h b/swad_changelog.h index 77c3f36c3..5fbca0061 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -633,10 +633,12 @@ 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.71.3 (2024-03-22)" +#define Log_PLATFORM_VERSION "SWAD 23.72 (2024-04-01)" #define CSS_FILE "swad23.67.2.css" #define JS_FILE "swad23.53.6.js" /* + Version 23.72: Apr 01, 2024 New type Usr_ICan_t. (334879 lines) + Version 23.71.4: Mar 22, 2024 Code refactoring. (334860 lines) Version 23.71.3: Mar 22, 2024 Code refactoring. (334827 lines) Version 23.71.2: Mar 20, 2024 Code refactoring in actions. (334866 lines) Version 23.71.1: Mar 20, 2024 Some functions renamed. (334869 lines) diff --git a/swad_country.c b/swad_country.c index 4b19f2907..e5d89b03b 100644 --- a/swad_country.c +++ b/swad_country.c @@ -463,7 +463,7 @@ static void Cty_ListOneCountryForSeeing (struct Hie_Node *Cty,unsigned NumCty) static void Cty_PutIconsListingCountries (__attribute__((unused)) void *Args) { /***** Put icon to edit countries *****/ - if (Cty_CheckIfICanEditCountries ()) + if (Cty_CheckIfICanEditCountries () == Usr_I_CAN) Cty_PutIconToEditCountries (); /***** Put icon to show a figure *****/ @@ -474,9 +474,10 @@ static void Cty_PutIconsListingCountries (__attribute__((unused)) void *Args) /********************** Check if I can edit countries ************************/ /*****************************************************************************/ -bool Cty_CheckIfICanEditCountries (void) +Usr_ICan_t Cty_CheckIfICanEditCountries (void) { - return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; + return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -485,8 +486,7 @@ bool Cty_CheckIfICanEditCountries (void) static void Cty_PutIconToEditCountries (void) { - Ico_PutContextualIconToEdit (ActEdiCty,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiCty,NULL,NULL,NULL); } /*****************************************************************************/ @@ -692,8 +692,7 @@ static void Cty_EditCountriesInternal (void) static void Cty_PutIconsEditingCountries (__attribute__((unused)) void *Args) { /***** Put icon to view countries *****/ - Ico_PutContextualIconToView (ActSeeCty,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeCty,NULL,NULL,NULL); /***** Put icon to show a figure *****/ Fig_PutIconToShowFigure (Fig_HIERARCHY); diff --git a/swad_country.h b/swad_country.h index bdb248e54..891ac5a68 100644 --- a/swad_country.h +++ b/swad_country.h @@ -35,6 +35,7 @@ #include "swad_institution.h" #include "swad_language.h" #include "swad_role_type.h" +#include "swad_user.h" /*****************************************************************************/ /************************** Public types and constants ***********************/ @@ -53,7 +54,7 @@ void Cty_ListCountries (void); void Cty_ListCountries1 (void); void Cty_ListCountries2 (void); -bool Cty_CheckIfICanEditCountries (void); +Usr_ICan_t Cty_CheckIfICanEditCountries (void); void Cty_DrawCountryMapAndNameWithLink (struct Hie_Node *Cty,Act_Action_t Action, const char *ClassContainer, diff --git a/swad_country_config.c b/swad_country_config.c index 9083277a8..09e09e355 100644 --- a/swad_country_config.c +++ b/swad_country_config.c @@ -341,7 +341,7 @@ static void CtyCfg_MapImage (Vie_ViewType_t ViewType,Hie_PutLink_t PutLink) HTM_DIV_End (); /***** Map attribution *****/ - if (ViewType == Vie_VIEW && Cty_CheckIfICanEditCountries ()) + if (ViewType == Vie_VIEW && Cty_CheckIfICanEditCountries () == Usr_I_CAN) { HTM_DIV_Begin ("class=\"CM\""); Frm_BeginForm (ActChgCtyMapAtt); diff --git a/swad_course.c b/swad_course.c index 6e2563178..b68767cd7 100644 --- a/swad_course.c +++ b/swad_course.c @@ -100,7 +100,7 @@ static void Crs_EditCoursesInternal (void); static void Crs_PutIconsEditingCourses (__attribute__((unused)) void *Args); static void Crs_ListCoursesForEdition (void); static void Crs_ListCoursesOfAYearForEdition (unsigned Year); -static bool Crs_CheckIfICanEdit (struct Hie_Node *Crs); +static Usr_ICan_t Crs_CheckIfICanEdit (struct Hie_Node *Crs); static void Crs_PutFormToCreateCourse (void); static void Crs_PutHeadCoursesForSeeing (void); static void Crs_PutHeadCoursesForEdition (void); @@ -423,7 +423,7 @@ static void Crs_ListCourses (void) static void Crs_PutIconsListCourses (__attribute__((unused)) void *Args) { /***** Put icon to edit courses *****/ - if (Hie_CheckIfICanEdit ()) + if (Hie_CheckIfICanEdit () == Usr_I_CAN) Crs_PutIconToEditCourses (); /***** Put icon to show a figure *****/ @@ -436,8 +436,7 @@ static void Crs_PutIconsListCourses (__attribute__((unused)) void *Args) static void Crs_PutIconToEditCourses (void) { - Ico_PutContextualIconToEdit (ActEdiCrs,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiCrs,NULL,NULL,NULL); } /*****************************************************************************/ @@ -613,8 +612,7 @@ static void Crs_EditCoursesInternal (void) static void Crs_PutIconsEditingCourses (__attribute__((unused)) void *Args) { /***** Put icon to view courses *****/ - Ico_PutContextualIconToView (ActSeeCrs,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeCrs,NULL,NULL,NULL); /***** Put icon to show a figure *****/ Fig_PutIconToShowFigure (Fig_HIERARCHY); @@ -662,7 +660,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year) unsigned YearAux; unsigned NumCrs; struct Usr_Data UsrDat; - bool ICanEdit; + Usr_ICan_t ICanEdit; unsigned NumUsrs[Rol_NUM_ROLES]; const char *Names[Nam_NUM_SHRT_FULL_NAMES]; @@ -693,9 +691,9 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year) /* Put icon to remove course */ HTM_TD_Begin ("class=\"BT\""); if (NumUsrs[Rol_UNK] || // Course has users ==> deletion forbidden - !ICanEdit) + ICanEdit == Usr_I_CAN_NOT) Ico_PutIconRemovalNotAllowed (); - else // Crs->NumUsrs == 0 && ICanEdit + else // Crs->NumUsrs == 0 && ICanEdit == Usr_I_CAN Ico_PutContextualIconToRemove (ActRemCrs,NULL, Hie_PutParOtherHieCod,&Crs->HieCod); HTM_TD_End (); @@ -707,7 +705,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year) /* Course year */ HTM_TD_Begin ("class=\"CT DAT_%s\"",The_GetSuffix ()); - if (ICanEdit) + if (ICanEdit == Usr_I_CAN) { Frm_BeginForm (ActChgCrsYea); ParCod_PutPar (ParCod_OthHie,Crs->HieCod); @@ -734,7 +732,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year) /* Institutional code of the course */ HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); - if (ICanEdit) + if (ICanEdit == Usr_I_CAN) { Frm_BeginForm (ActChgInsCrsCod); ParCod_PutPar (ParCod_OthHie,Crs->HieCod); @@ -754,7 +752,8 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year) Nam_ExistingShortAndFullNames (ActionRename, ParCod_OthHie,Crs->HieCod, Names, - ICanEdit); // Put form? + ICanEdit == Usr_I_CAN ? Frm_PUT_FORM : + Frm_DONT_PUT_FORM); /* Current number of teachers in this course */ HTM_TD_Unsigned (NumUsrs[Rol_TCH] + @@ -790,11 +789,12 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year) /************** Check if I can edit, remove, etc. a course *******************/ /*****************************************************************************/ -static bool Crs_CheckIfICanEdit (struct Hie_Node *Crs) +static Usr_ICan_t Crs_CheckIfICanEdit (struct Hie_Node *Crs) { - return Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM || // I am a degree administrator or higher - ((Crs->Status & Hie_STATUS_BIT_PENDING) != 0 && // Course is not yet activated - Gbl.Usrs.Me.UsrDat.UsrCod == Crs->RequesterUsrCod); // I am the requester + return (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM || // I am a degree administrator or higher + ((Crs->Status & Hie_STATUS_BIT_PENDING) != 0 && // Course is not yet activated + Gbl.Usrs.Me.UsrDat.UsrCod == Crs->RequesterUsrCod)) ? Usr_I_CAN : // I am the requester + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -1052,7 +1052,7 @@ void Crs_RemoveCourse (void) /***** Get data of the course from database *****/ Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs); - if (!Crs_CheckIfICanEdit (Crs_EditingCrs)) + if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Check if this course has users *****/ @@ -1295,7 +1295,7 @@ void Crs_ChangeInsCrsCod (void) /* Get data of the course */ Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs); - if (!Crs_CheckIfICanEdit (Crs_EditingCrs)) + if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Change the institutional course code *****/ @@ -1340,7 +1340,7 @@ void Crs_ChangeCrsYear (void) /* Get data of the course */ Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs); - if (!Crs_CheckIfICanEdit (Crs_EditingCrs)) + if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT) Err_NoPermissionExit (); if (NewYear <= Deg_MAX_YEARS_PER_DEGREE) // If year is valid @@ -1445,7 +1445,7 @@ void Crs_RenameCourse (struct Hie_Node *Crs,Nam_ShrtOrFullName_t ShrtOrFull) /***** Get from the database the data of the degree *****/ Hie_GetDataByCod[Hie_CRS] (Crs); - if (!Crs_CheckIfICanEdit (Crs)) + if (Crs_CheckIfICanEdit (Crs) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Check if new name is empty *****/ diff --git a/swad_degree.c b/swad_degree.c index c93bec68b..faf804c35 100644 --- a/swad_degree.c +++ b/swad_degree.c @@ -84,7 +84,7 @@ static struct Hie_Node *Deg_EditingDeg = NULL; // Static variable to keep the de /*****************************************************************************/ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes); -static bool Deg_CheckIfICanEditADegree (struct Hie_Node *Deg); +static Usr_ICan_t Deg_CheckIfICanEditADegree (struct Hie_Node *Deg); static void Deg_PutFormToCreateDegree (const struct DegTyp_DegTypes *DegTypes); static void Deg_PutHeadDegreesForSeeing (void); static void Deg_PutHeadDegreesForEdition (void); @@ -325,7 +325,7 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes) struct DegTyp_DegreeType *DegTyp; char WWW[Cns_MAX_BYTES_WWW + 1]; struct Usr_Data UsrDat; - bool ICanEdit; + Usr_ICan_t ICanEdit; unsigned NumCrss; unsigned NumUsrsInCrssOfDeg; const char *Names[Nam_NUM_SHRT_FULL_NAMES]; @@ -359,7 +359,7 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes) /* Put icon to remove degree */ HTM_TD_Begin ("class=\"BT\""); - if (!ICanEdit || + if (ICanEdit == Usr_I_CAN_NOT || NumCrss || // Degree has courses ==> deletion forbidden NumUsrsInCrssOfDeg) Ico_PutIconRemovalNotAllowed (); @@ -384,11 +384,12 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes) Nam_ExistingShortAndFullNames (ActionRename, ParCod_OthHie,Deg->HieCod, Names, - ICanEdit); // Put form? + ICanEdit == Usr_I_CAN ? Frm_PUT_FORM : + Frm_DONT_PUT_FORM); /* Degree type */ HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); - if (ICanEdit) + if (ICanEdit == Usr_I_CAN) { Frm_BeginForm (ActChgDegTyp); ParCod_PutPar (ParCod_OthHie,Deg->HieCod); @@ -423,7 +424,7 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes) /* Degree WWW */ HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); - if (ICanEdit) + if (ICanEdit == Usr_I_CAN) { Frm_BeginForm (ActChgDegWWW); ParCod_PutPar (ParCod_OthHie,Deg->HieCod); @@ -483,11 +484,12 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes) /************** Check if I can edit, remove, etc. a degree *******************/ /*****************************************************************************/ -static bool Deg_CheckIfICanEditADegree (struct Hie_Node *Deg) +static Usr_ICan_t Deg_CheckIfICanEditADegree (struct Hie_Node *Deg) { - return Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM || // I am a center administrator or higher - ((Deg->Status & Hie_STATUS_BIT_PENDING) != 0 && // Degree is not yet activated - Gbl.Usrs.Me.UsrDat.UsrCod == Deg->RequesterUsrCod); // I am the requester + return (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM || // I am a center administrator or higher + ((Deg->Status & Hie_STATUS_BIT_PENDING) != 0 && // Degree is not yet activated + Gbl.Usrs.Me.UsrDat.UsrCod == Deg->RequesterUsrCod)) ? Usr_I_CAN : // I am the requester + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -719,7 +721,7 @@ static void Deg_ListDegrees (void) static void Deg_PutIconsListingDegrees (__attribute__((unused)) void *Args) { /***** Put icon to edit degrees *****/ - if (Hie_CheckIfICanEdit ()) + if (Hie_CheckIfICanEdit () == Usr_I_CAN) Deg_PutIconToEditDegrees (); /***** Put icon to view degree types *****/ @@ -735,8 +737,7 @@ static void Deg_PutIconsListingDegrees (__attribute__((unused)) void *Args) static void Deg_PutIconToEditDegrees (void) { - Ico_PutContextualIconToEdit (ActEdiDeg,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiDeg,NULL,NULL,NULL); } /*****************************************************************************/ @@ -882,7 +883,7 @@ static void Deg_EditDegreesInternal (void) Ale_ShowAlert (Ale_WARNING,Txt_No_types_of_degree); /***** Form to create the first degree type *****/ - if (DegTyp_CheckIfICanCreateDegreeTypes ()) + if (DegTyp_CheckIfICanCreateDegreeTypes () == Usr_I_CAN) DegTyp_EditDegreeTypes (&DegTypes); } @@ -900,8 +901,7 @@ static void Deg_EditDegreesInternal (void) static void Deg_PutIconsEditingDegrees (__attribute__((unused)) void *Args) { /***** Put icon to view degrees *****/ - Ico_PutContextualIconToView (ActSeeDeg,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeDeg,NULL,NULL,NULL); /***** Put icon to view types of degree *****/ DegTyp_PutIconToViewDegreeTypes (); @@ -916,8 +916,7 @@ static void Deg_PutIconsEditingDegrees (__attribute__((unused)) void *Args) void Deg_PutIconToViewDegrees (void) { - Lay_PutContextualLinkOnlyIcon (ActSeeDeg,NULL, - NULL,NULL, + Lay_PutContextualLinkOnlyIcon (ActSeeDeg,NULL,NULL,NULL, "graduation-cap.svg",Ico_BLACK); } diff --git a/swad_degree_type.c b/swad_degree_type.c index fb4aedd70..195e7ab0d 100644 --- a/swad_degree_type.c +++ b/swad_degree_type.c @@ -287,8 +287,7 @@ static void DegTyp_EditDegreeTypesInternal (const struct DegTyp_DegTypes *DegTyp static void DegTyp_PutIconsEditingDegreeTypes (__attribute__((unused)) void *Args) { /***** Put icon to view degree types *****/ - Ico_PutContextualIconToView (ActSeeDegTyp,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeDegTyp,NULL,NULL,NULL); /***** Put icon to view degrees *****/ Deg_PutIconToViewDegrees (); @@ -303,8 +302,7 @@ static void DegTyp_PutIconsEditingDegreeTypes (__attribute__((unused)) void *Arg void DegTyp_PutIconToViewDegreeTypes (void) { - Lay_PutContextualLinkOnlyIcon (ActSeeDegTyp,NULL, - NULL,NULL, + Lay_PutContextualLinkOnlyIcon (ActSeeDegTyp,NULL,NULL,NULL, "sitemap.svg",Ico_BLACK); } @@ -375,9 +373,8 @@ static void DegTyp_PutIconsListingDegTypes (__attribute__((unused)) void *Args) static void DegTyp_PutIconToEditDegTypes (__attribute__((unused)) void *Args) { if (Gbl.Hierarchy.Level == Hie_CTR && // Only editable if center tab is visible - DegTyp_CheckIfICanCreateDegreeTypes ()) - Ico_PutContextualIconToEdit (ActEdiDegTyp,NULL, - NULL,NULL); + DegTyp_CheckIfICanCreateDegreeTypes () == Usr_I_CAN) + Ico_PutContextualIconToEdit (ActEdiDegTyp,NULL,NULL,NULL); } /*****************************************************************************/ @@ -445,9 +442,10 @@ static void DegTyp_ListDegreeTypesForEdition (const struct DegTyp_DegTypes *DegT /******************** Check if I can create degree types *********************/ /*****************************************************************************/ -bool DegTyp_CheckIfICanCreateDegreeTypes (void) +Usr_ICan_t DegTyp_CheckIfICanCreateDegreeTypes (void) { - return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); + return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ diff --git a/swad_degree_type.h b/swad_degree_type.h index df6470529..44c0acd6c 100644 --- a/swad_degree_type.h +++ b/swad_degree_type.h @@ -73,7 +73,7 @@ void DegTyp_EditDegreeTypes (const struct DegTyp_DegTypes *DegTypes); void DegTyp_PutIconToViewDegreeTypes (void); -bool DegTyp_CheckIfICanCreateDegreeTypes (void); +Usr_ICan_t DegTyp_CheckIfICanCreateDegreeTypes (void); void DegTyp_GetListDegreeTypes (struct DegTyp_DegTypes *DegTypes, Hie_Level_t Level,DegTyp_Order_t Order); diff --git a/swad_department.c b/swad_department.c index 6615e87af..f966f0278 100644 --- a/swad_department.c +++ b/swad_department.c @@ -53,7 +53,7 @@ /****************************** Private constants ****************************/ /*****************************************************************************/ -static const bool Dpt_ICanEditDpts[Rol_NUM_ROLES] = +static bool Dpt_ICanEditDpts[Rol_NUM_ROLES] = { /* Users who can edit */ [Rol_INS_ADM] = true, @@ -244,8 +244,7 @@ static Dpt_Order_t Dpt_GetParDptOrder (void) static void Dpt_PutIconToEditDpts (__attribute__((unused)) void *Args) { if (Dpt_ICanEditDpts[Gbl.Usrs.Me.Role.Logged]) - Ico_PutContextualIconToEdit (ActEdiDpt,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiDpt,NULL,NULL,NULL); } /*****************************************************************************/ @@ -254,8 +253,7 @@ static void Dpt_PutIconToEditDpts (__attribute__((unused)) void *Args) static void Dpt_PutIconToViewDpts (__attribute__((unused)) void *Args) { - Ico_PutContextualIconToView (ActSeeDpt,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeDpt,NULL,NULL,NULL); } /*****************************************************************************/ @@ -515,7 +513,7 @@ static void Dpt_ListDepartmentsForEdition (const struct Dpt_Departments *Departm Nam_ExistingShortAndFullNames (ActionRename, ParCod_Dpt,Dpt->DptCod, Names, - true); // Put form + Frm_PUT_FORM); /* Department WWW */ HTM_TD_Begin ("class=\"LM\""); diff --git a/swad_duplicate.c b/swad_duplicate.c index aa99978f3..f218b1b15 100644 --- a/swad_duplicate.c +++ b/swad_duplicate.c @@ -311,7 +311,7 @@ static void Dup_ListSimilarUsrs (void) Usr_NUM_MAIN_FIELDS_DATA_USR-2, The_GetColorRows ()); /* Button to remove this user */ - if (Acc_CheckIfICanEliminateAccount (UsrDat.UsrCod)) + if (Acc_CheckIfICanEliminateAccount (UsrDat.UsrCod) == Usr_I_CAN) Dup_PutButtonToEliminateUsrAccount (&UsrDat); /* Button to remove from list of possible duplicate users */ if (Dup_DB_CheckIfUsrIsDup (UsrDat.UsrCod)) diff --git a/swad_enrolment.c b/swad_enrolment.c index 4b0792a7d..16030a1a1 100644 --- a/swad_enrolment.c +++ b/swad_enrolment.c @@ -145,7 +145,7 @@ static void Enr_AskIfRegRemUsr (struct Usr_ListUsrCods *ListUsrCods,Rol_Role_t R static void Enr_ShowFormToEditOtherUsr (void); -static bool Enr_CheckIfICanRemUsrFromCrs (void); +static Usr_ICan_t Enr_CheckIfICanRemUsrFromCrs (void); static void Enr_AskIfRemoveUsrFromCrs (struct Usr_Data *UsrDat); static void Enr_EffectivelyRemUsrFromCrs (struct Usr_Data *UsrDat, @@ -1428,7 +1428,7 @@ bool Enr_PutActionsRegRemOneUsr (Usr_MeOrOther_t MeOrOther) } /***** Eliminate user completely from platform *****/ - if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod)) + if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_I_CAN) { Enr_PutActionRemUsrAcc (&OptionChecked,MeOrOther); OptionsShown = true; @@ -2369,16 +2369,18 @@ static void Enr_RemUsrEnrolmentRequestInCrs (long UsrCod,long CrsCod) void Enr_PutLinkToAdminOneUsr (Act_Action_t NextAction) { - extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES]; extern const char *Txt_Administer_me; extern const char *Txt_Administer_one_user; - const char *TitleText = Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged] ? Txt_Administer_one_user : - Txt_Administer_me; + static const char **TitleText[] = + { + [Usr_I_CAN_NOT] = &Txt_Administer_me, + [Usr_I_CAN ] = &Txt_Administer_one_user, + }; Lay_PutContextualLinkIconText (NextAction,NULL, NULL,NULL, "user-cog.svg",Ico_BLACK, - TitleText,NULL); + *TitleText[Adm_CheckIfICanAdminOtherUsrs ()],NULL); } /*****************************************************************************/ @@ -2421,10 +2423,8 @@ void Enr_ReqRegRemOth (void) void Enr_ReqRegRemStd (void) { - extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES]; - /***** Contextual menu *****/ - if (Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged]) + if (Adm_CheckIfICanAdminOtherUsrs () == Usr_I_CAN) { Mnu_ContextMenuBegin (); Enr_PutLinkToAdminSeveralUsrs (Rol_STD); // Admin several students @@ -2443,9 +2443,7 @@ void Enr_ReqRegRemTch (void) static void Enr_ReqRegRemUsr (Rol_Role_t Role) { - extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES]; - - if (Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged]) + if (Adm_CheckIfICanAdminOtherUsrs () == Usr_I_CAN) /***** Form to request the user's ID of another user *****/ Enr_ReqAnotherUsrIDToRegisterRemove (Role); else @@ -2675,7 +2673,7 @@ void Enr_ReqRemUsrFromCrs (void) /***** Get user to be removed *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Enr_CheckIfICanRemUsrFromCrs ()) + if (Enr_CheckIfICanRemUsrFromCrs () == Usr_I_CAN) Enr_AskIfRemoveUsrFromCrs (&Gbl.Usrs.Other.UsrDat); else Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); @@ -2695,7 +2693,7 @@ void Enr_RemUsrFromCrs1 (void) /***** Get user to be removed *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Enr_CheckIfICanRemUsrFromCrs ()) + if (Enr_CheckIfICanRemUsrFromCrs () == Usr_I_CAN) Enr_EffectivelyRemUsrFromCrs (&Gbl.Usrs.Other.UsrDat,&Gbl.Hierarchy.Node[Hie_CRS], Enr_DO_NOT_REMOVE_USR_PRODUCTION, Cns_VERBOSE); @@ -2720,23 +2718,24 @@ void Enr_RemUsrFromCrs2 (void) /*********** Check if I can remove another user in current course ************/ /*****************************************************************************/ -static bool Enr_CheckIfICanRemUsrFromCrs (void) +static Usr_ICan_t Enr_CheckIfICanRemUsrFromCrs (void) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: case Rol_NET: // A student or non-editing teacher can remove herself/himself - return Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME; + return (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Rol_TCH: case Rol_DEG_ADM: case Rol_CTR_ADM: case Rol_INS_ADM: case Rol_SYS_ADM: // A teacher or administrator can remove anyone - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -2902,7 +2901,7 @@ void Enr_ModifyUsr1 (void) if (MeOrOther == Usr_ME || Gbl.Usrs.Me.Role.Logged >= Rol_TCH) { /***** Get user's name from record form *****/ - if (Usr_ICanChangeOtherUsrData (&Gbl.Usrs.Other.UsrDat)) + if (Usr_ICanChangeOtherUsrData (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) Rec_GetUsrNameFromRecordForm (&Gbl.Usrs.Other.UsrDat); /***** Update user's data in database *****/ @@ -3008,7 +3007,7 @@ void Enr_ModifyUsr1 (void) Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); break; case Enr_ELIMINATE_ONE_USR_FROM_PLATFORM: - if (!Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod)) + if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_I_CAN_NOT) Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); break; default: diff --git a/swad_exam.c b/swad_exam.c index b6ed6ebaf..eb9afdab2 100644 --- a/swad_exam.c +++ b/swad_exam.c @@ -315,12 +315,12 @@ void Exa_ListAllExams (struct Exa_Exams *Exams) /************************ Check if I can edit exams **************************/ /*****************************************************************************/ -bool Exa_CheckIfICanEditExams (void) +Usr_ICan_t Exa_CheckIfICanEditExams (void) { - static const bool ICanEditExams[Rol_NUM_ROLES] = + static Usr_ICan_t ICanEditExams[Rol_NUM_ROLES] = { - [Rol_TCH ] = true, - [Rol_SYS_ADM] = true, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanEditExams[Gbl.Usrs.Me.Role.Logged]; @@ -343,7 +343,7 @@ static void Exa_PutIconsListExams (void *Exams) if (Exams) { /***** Put icon to create a new exam *****/ - if (Exa_CheckIfICanEditExams ()) + if (Exa_CheckIfICanEditExams () == Usr_I_CAN) Exa_PutIconToCreateNewExam ((struct Exa_Exams *) Exams); /***** Put icon to view sessions results *****/ @@ -352,9 +352,8 @@ static void Exa_PutIconsListExams (void *Exams) NULL,NULL); /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) - Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL, - Exa_PutPars,Exams); + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) + Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL,Exa_PutPars,Exams); /***** Put icon to show a figure *****/ Fig_PutIconToShowFigure (Fig_EXAMS); @@ -629,8 +628,7 @@ static void Exa_PutIconsEditingOneExam (void *Exams) { if (Exams) /***** Icon to view exam *****/ - Ico_PutContextualIconToView (ActSeeOneExa,NULL, - Exa_PutPars,Exams); + Ico_PutContextualIconToView (ActSeeOneExa,NULL,Exa_PutPars,Exams); } /*****************************************************************************/ @@ -671,7 +669,7 @@ static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams, [Rol_SYS_ADM] = ActSeeUsrExaResExa, }; - if (Exa_CheckIfICanEditExams ()) + if (Exa_CheckIfICanEditExams () == Usr_I_CAN) { /***** Icon to remove exam *****/ Ico_PutContextualIconToRemove (ActReqRemExa,NULL, @@ -683,8 +681,7 @@ static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams, Exams->Exam.HiddenOrVisible); /***** Icon to edit exam *****/ - Ico_PutContextualIconToEdit (ActEdiOneExa,NULL, - Exa_PutPars,Exams); + Ico_PutContextualIconToEdit (ActEdiOneExa,NULL,Exa_PutPars,Exams); } /***** Put icon to view results of sessions in exam *****/ @@ -693,9 +690,8 @@ static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams, Exa_PutPars,Exams); /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) - Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL, - Exa_PutPars,Exams); + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) + Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL,Exa_PutPars,Exams); } /*****************************************************************************/ @@ -973,7 +969,7 @@ void Exa_AskRemExam (void) struct Exa_Exams Exams; /***** Check if I can edit exams *****/ - if (!Exa_CheckIfICanEditExams ()) + if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Reset exams context *****/ @@ -1006,7 +1002,7 @@ void Exa_RemoveExam (void) struct Exa_Exams Exams; /***** Check if I can edit exams *****/ - if (!Exa_CheckIfICanEditExams ()) + if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Reset exams context *****/ @@ -1186,7 +1182,7 @@ static void Exa_HideUnhideExam (HidVis_HiddenOrVisible_t HiddenOrVisible) struct Exa_Exams Exams; /***** Check if I can edit exams *****/ - if (!Exa_CheckIfICanEditExams ()) + if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Reset exams context *****/ @@ -1216,7 +1212,7 @@ void Exa_ReqCreatOrEditExam (void) Exa_ExistingNewExam_t ExistingNewExam; /***** Check if I can edit exams *****/ - if (!Exa_CheckIfICanEditExams ()) + if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Reset exams context *****/ @@ -1427,7 +1423,7 @@ void Exa_ReceiveExam (void) char Txt[Cns_MAX_BYTES_TEXT + 1]; /***** Check if I can edit exams *****/ - if (!Exa_CheckIfICanEditExams ()) + if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Reset exams context *****/ @@ -1553,20 +1549,6 @@ static void Exa_UpdateExam (struct Exa_Exam *Exam,const char *Txt) Ale_ShowAlert (Ale_SUCCESS,Txt_The_exam_has_been_modified); } -/*****************************************************************************/ -/********** Get number of sessions and check is edition is possible **********/ -/*****************************************************************************/ -// Before calling this function, number of sessions must be calculated - -bool Exa_CheckIfEditable (const struct Exa_Exam *Exam) - { - if (Exa_CheckIfICanEditExams ()) - /***** Questions are editable only if exam has no sessions *****/ - return Exam->NumSess == 0; // Exams with sessions should not be edited - else - return false; // Questions are not editable - } - /*****************************************************************************/ /*************************** Show stats about exams **************************/ /*****************************************************************************/ diff --git a/swad_exam.h b/swad_exam.h index c75bc4223..2258a43ca 100644 --- a/swad_exam.h +++ b/swad_exam.h @@ -28,6 +28,7 @@ /*****************************************************************************/ #include "swad_exam_type.h" +#include "swad_user.h" /*****************************************************************************/ /***************************** Public prototypes *****************************/ @@ -39,7 +40,7 @@ void Exa_ResetExam (struct Exa_Exam *Exam); void Exa_SeeAllExams (void); void Exa_ListAllExams (struct Exa_Exams *Exams); -bool Exa_CheckIfICanEditExams (void); +Usr_ICan_t Exa_CheckIfICanEditExams (void); void Exa_SeeOneExam (void); void Exa_ShowOnlyOneExam (struct Exa_Exams *Exams,Frm_PutForm_t PutFormSession); @@ -70,8 +71,6 @@ void Exa_PutFormsOneExam (struct Exa_Exams *Exams, void Exa_ReceiveExam (void); -bool Exa_CheckIfEditable (const struct Exa_Exam *Exam); - //-------------------------------- Figures ------------------------------------ void Exa_GetAndShowExamsStats (void); diff --git a/swad_exam_database.c b/swad_exam_database.c index db09ef4ce..e2b504bfe 100644 --- a/swad_exam_database.c +++ b/swad_exam_database.c @@ -1668,7 +1668,7 @@ unsigned Exa_DB_GetGrpsAssociatedToSes (MYSQL_RES **mysql_res,long SesCod) /*** Check if I belong to any of the groups associated to the exam session ***/ /*****************************************************************************/ -bool Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod) +Usr_ICan_t Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod) { return DB_QueryEXISTS ("can not check if I can play an exam session", @@ -1686,7 +1686,8 @@ bool Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod) " WHERE grp_users.UsrCod=%ld" " AND grp_users.GrpCod=exa_groups.GrpCod)))", SesCod, - Gbl.Usrs.Me.UsrDat.UsrCod); + Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -2150,6 +2151,12 @@ bool Exa_DB_CheckIfUserAgentIsTheSameAsTheLast (long PrnCod,const char *UserAgen void Exa_DB_LogAccess (long LogCod,long PrnCod,ExaLog_Action_t Action) { + static char YN[Usr_NUM_I_CAN] = + { + [Usr_I_CAN_NOT] = 'N', + [Usr_I_CAN ] = 'Y', + }; + /* Log access in exam log. Redundant data (also present in log table) are stored for speed */ DB_QueryINSERT ("can not log exam access", @@ -2161,8 +2168,7 @@ void Exa_DB_LogAccess (long LogCod,long PrnCod,ExaLog_Action_t Action) PrnCod, (unsigned) Action, ExaLog_GetQstInd (), - ExaLog_GetIfCanAnswer () ? 'Y' : - 'N', + YN[ExaLog_GetIfCanAnswer ()], // NOW() Redundant, for speed Par_GetIP ()); // Redundant, for speed } diff --git a/swad_exam_database.h b/swad_exam_database.h index 8a7091b6a..d07b90132 100644 --- a/swad_exam_database.h +++ b/swad_exam_database.h @@ -128,7 +128,7 @@ void Exa_DB_RemoveUsrFromSessionTablesInCrs (long UsrCod,long CrsCod); //--------------------------------- Groups ------------------------------------ void Exa_DB_CreateGrpAssociatedToSes (long SesCod,long GrpCod); unsigned Exa_DB_GetGrpsAssociatedToSes (MYSQL_RES **mysql_res,long SesCod); -bool Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod); +Usr_ICan_t Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod); void Exa_DB_RemoveAllGrpsFromExa (long ExaCod); void Exa_DB_RemoveAllGrpsFromCrs (long CrsCod); void Exa_DB_RemoveAllGrpsFromSes (long SesCod); diff --git a/swad_exam_log.c b/swad_exam_log.c index 37ef8787f..cb172d944 100644 --- a/swad_exam_log.c +++ b/swad_exam_log.c @@ -54,7 +54,7 @@ static struct long PrnCod; // Exam print code int QstInd; // Exam print question index ExaLog_Action_t Action; // Action performed by user - bool ICanAnswer; // Exam print is open and accesible to answer by the user + Usr_ICan_t ICanAnswer; // Exam print is open and accesible to answer by the user } ExaLog_Log = { .PrnCod = -1L, // -1 means no print code set @@ -116,12 +116,12 @@ int ExaLog_GetQstInd (void) /************* Set and get if exam print is open and accessible **************/ /*****************************************************************************/ -void ExaLog_SetIfCanAnswer (bool ICanAnswer) +void ExaLog_SetIfCanAnswer (Usr_ICan_t ICanAnswer) { ExaLog_Log.ICanAnswer = ICanAnswer; } -bool ExaLog_GetIfCanAnswer (void) +Usr_ICan_t ExaLog_GetIfCanAnswer (void) { return ExaLog_Log.ICanAnswer; } diff --git a/swad_exam_log.h b/swad_exam_log.h index ef03a0caf..a6278eaf0 100644 --- a/swad_exam_log.h +++ b/swad_exam_log.h @@ -54,8 +54,8 @@ void ExaLog_SetAction (ExaLog_Action_t Action); ExaLog_Action_t ExaLog_GetAction (void); void ExaLog_SetQstInd (unsigned QstInd); int ExaLog_GetQstInd (void); -void ExaLog_SetIfCanAnswer (bool CanBeAnswered); -bool ExaLog_GetIfCanAnswer (void); +void ExaLog_SetIfCanAnswer (Usr_ICan_t CanBeAnswered); +Usr_ICan_t ExaLog_GetIfCanAnswer (void); void ExaLog_LogAccess (long LogCod); diff --git a/swad_exam_print.c b/swad_exam_print.c index 260719460..263cf8d0e 100644 --- a/swad_exam_print.c +++ b/swad_exam_print.c @@ -178,7 +178,7 @@ void ExaPrn_ShowExamPrint (void) ExaSes_GetAndCheckPars (&Exams,&Session); /***** Check if I can access to this session *****/ - if (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session)) + if (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session) == Usr_I_CAN) { /***** Set basic data of exam print *****/ Print.SesCod = Session.SesCod; @@ -996,7 +996,7 @@ void ExaPrn_ReceivePrintAnswer (void) ExaLog_SetQstInd (QstInd); /***** Check if session if visible and open *****/ - if (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session)) + if (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session) == Usr_I_CAN) { /***** Set log open to true ****/ ExaLog_SetIfCanAnswer (true); diff --git a/swad_exam_result.c b/swad_exam_result.c index 79358eeb7..569b7b9a8 100644 --- a/swad_exam_result.c +++ b/swad_exam_result.c @@ -69,8 +69,8 @@ extern struct Globals Gbl; struct ExaRes_ICanView { - bool Result; - bool Score; + Usr_ICan_t Result; + Usr_ICan_t Score; }; /*****************************************************************************/ @@ -292,7 +292,7 @@ static void ExaRes_PutFormToSelUsrsToViewResults (__attribute__((unused)) void * Txt_Results, Hlp_ASSESSMENT_Exams_results, Txt_View_results, - false); // Do not put form with date range + Frm_DONT_PUT_FORM); // Do not put form with date range } /*****************************************************************************/ @@ -358,7 +358,7 @@ static void ExaRes_ListAllResultsInSelectedExams (struct Exa_Exams *Exams) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Show sessions results *****/ Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); @@ -424,7 +424,7 @@ static void ExaRes_ListAllResultsInExa (struct Exa_Exams *Exams) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Show sessions results *****/ Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); @@ -495,7 +495,7 @@ static void ExaRes_ListAllResultsInSes (struct Exa_Exams *Exams,long SesCod) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Show sessions results *****/ Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); @@ -831,7 +831,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_End (); /* Get and accumulate questions and score */ - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { /* Get questions and user's answers of exam print from database */ ExaPrn_GetPrintQuestionsFromDB (&Print); @@ -852,7 +852,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) HTM_Unsigned (Print.NumQsts.All); else Ico_PutIconNotVisible (); @@ -862,7 +862,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_GREEN_%s %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { if (Print.NumQsts.Valid.Total) HTM_Unsigned (Print.NumQsts.Valid.Total); @@ -877,7 +877,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_RED_%s %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { NumQstsInvalid = Print.NumQsts.All - Print.NumQsts.Valid.Total; if (NumQstsInvalid) @@ -893,7 +893,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { if (Print.NumQsts.Valid.Correct) HTM_Unsigned (Print.NumQsts.Valid.Correct); @@ -908,7 +908,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_%s %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { if (Print.NumQsts.Valid.Wrong.Negative) HTM_Unsigned (Print.NumQsts.Valid.Wrong.Negative); @@ -922,7 +922,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_%s %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { if (Print.NumQsts.Valid.Wrong.Zero) HTM_Unsigned (Print.NumQsts.Valid.Wrong.Zero); @@ -936,7 +936,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_%s %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { if (Print.NumQsts.Valid.Wrong.Positive) HTM_Unsigned (Print.NumQsts.Valid.Wrong.Positive); @@ -951,7 +951,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_%s %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { if (Print.NumQsts.Valid.Blank) HTM_Unsigned (Print.NumQsts.Valid.Blank); @@ -966,7 +966,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { HTM_Double2Decimals (Print.Score.Valid); HTM_Txt ("/"); @@ -980,7 +980,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_%s %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) HTM_Double2Decimals (Print.NumQsts.Valid.Total ? Print.Score.Valid / (double) Print.NumQsts.Valid.Total : 0.0); @@ -992,7 +992,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid.Total,Print.Score.Valid,Exam.MaxGrade); TstPrn_ShowGrade (Grade,Exam.MaxGrade); @@ -1005,7 +1005,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams, /* Link to show this result */ HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"", The_GetColorRows ()); - if (ICanView.Result) + if (ICanView.Result == Usr_I_CAN) { Exams->Exam.ExaCod = Session.ExaCod; Exams->SesCod = Session.SesCod; @@ -1218,8 +1218,8 @@ void ExaRes_ShowExaResultAfterFinish (void) struct ExaPrn_Print Print; struct ExaRes_ICanView ICanView = { - .Result = true, // I have just finish answering, so show result... - .Score = false, // ...but not score + .Result = Usr_I_CAN, // I have just finish answering, so show result... + .Score = Usr_I_CAN_NOT, // ...but not score }; unsigned Visibility = 1 << TstVis_VISIBLE_QST_ANS_TXT; // Show only questions and answers text @@ -1346,7 +1346,7 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam, Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) Err_WrongUserExit (); - if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (UsrDat) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Begin table *****/ @@ -1371,7 +1371,7 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam, ExaRes_ShowExamResultGrade (Exam,Print,ICanView); /* Answers and solutions */ - if (ICanView->Result) + if (ICanView->Result == Usr_I_CAN) ExaRes_ShowExamAnswers (UsrDat,Print,Visibility); /***** End table *****/ @@ -1398,15 +1398,17 @@ static void ExaRes_CheckIfICanViewResult (const struct Exa_Exam *Exam, ICanView->Result = (Usr_ItsMe (UsrCod) == Usr_ME && // The result is mine Exam->HiddenOrVisible == HidVis_VISIBLE && // The exam is visible Session->HiddenOrVisible == HidVis_VISIBLE && // The session is visible - Session->ShowUsrResults); // The results of the session are visible to users + Session->ShowUsrResults) ? Usr_I_CAN : // The results of the session are visible to users + Usr_I_CAN_NOT; // Whether I belong or not to groups of session is not checked here... // ...because I should be able to see old exams made in old groups to which I belonged - if (ICanView->Result) + if (ICanView->Result == Usr_I_CAN) // Depends on 5 visibility icons associated to exam - ICanView->Score = TstVis_IsVisibleTotalScore (Exam->Visibility); + ICanView->Score = TstVis_IsVisibleTotalScore (Exam->Visibility) ? Usr_I_CAN : + Usr_I_CAN_NOT; else - ICanView->Score = false; + ICanView->Score = Usr_I_CAN_NOT; break; case Rol_NET: case Rol_TCH: @@ -1415,11 +1417,11 @@ static void ExaRes_CheckIfICanViewResult (const struct Exa_Exam *Exam, case Rol_INS_ADM: case Rol_SYS_ADM: ICanView->Result = - ICanView->Score = true; + ICanView->Score = Usr_I_CAN; break; default: ICanView->Result = - ICanView->Score = false; + ICanView->Score = Usr_I_CAN_NOT; break; } } @@ -1600,7 +1602,7 @@ static void ExaRes_ShowExamResultNumQsts (struct ExaPrn_Print *Print, /***** Number of questions *****/ HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); - if (ICanView->Result) + if (ICanView->Result == Usr_I_CAN) { HTM_TxtF ("%u",Print->NumQsts.All); if (Print->NumQsts.All != Print->NumQsts.Valid.Total) @@ -1654,7 +1656,7 @@ static void ExaRes_ShowExamResultNumAnss (struct ExaPrn_Print *Print, /***** Number of answers *****/ HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); - if (ICanView->Score) + if (ICanView->Score == Usr_I_CAN) HTM_TxtF ("%s(pi=1): %u; " "%s(-1≤pi<0): %u; " "%s(pi=0): %u; " @@ -1693,7 +1695,7 @@ static void ExaRes_ShowExamResultScore (struct ExaPrn_Print *Print, /***** Score *****/ HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); - if (ICanView->Score) + if (ICanView->Score == Usr_I_CAN) { /* Score counting all questions */ if (Print->NumQsts.All == Print->NumQsts.Valid.Total) @@ -1745,7 +1747,7 @@ static void ExaRes_ShowExamResultGrade (const struct Exa_Exam *Exam, /***** Grade *****/ HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); - if (ICanView->Score) + if (ICanView->Score == Usr_I_CAN) { /* Grade counting all questions */ if (Print->NumQsts.All == Print->NumQsts.Valid.Total) @@ -1814,7 +1816,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat, { extern const char *Txt_Score; extern const char *Txt_Invalid_question; - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY]; + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY]; static const char *ClassNumQst[Qst_NUM_VALIDITIES] = { [Qst_INVALID_QUESTION] = "BIG_INDEX_RED", @@ -1840,10 +1842,14 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat, switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: - ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility); - ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility); - ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility); - ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility); + ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility) ? Usr_I_CAN: + Usr_I_CAN_NOT; + ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility) ? Usr_I_CAN: + Usr_I_CAN_NOT; + ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility) ? Usr_I_CAN: + Usr_I_CAN_NOT; + ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility) ? Usr_I_CAN: + Usr_I_CAN_NOT; break; case Rol_NET: case Rol_TCH: @@ -1854,13 +1860,13 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat, ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = - ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = true; + ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN; break; default: ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = - ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = false; + ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN_NOT; break; } @@ -1879,10 +1885,10 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat, /* Stem */ Qst_WriteQstStem (Question->Stem,ClassTxt[Question->Validity], - ICanView[TstVis_VISIBLE_QST_ANS_TXT]); + ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN); /* Media */ - if (ICanView[TstVis_VISIBLE_QST_ANS_TXT]) + if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN) Med_ShowMedia (&Question->Media, "Tst_MED_SHOW_CONT", "Tst_MED_SHOW"); @@ -1895,7 +1901,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat, ClassFeedback[Question->Validity]); /* Write score retrieved from database */ - if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE]) + if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE] == Usr_I_CAN) { HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"", The_GetSuffix ()); @@ -1914,7 +1920,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat, } /* Question feedback */ - if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT]) + if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN) Qst_WriteQstFeedback (Question->Feedback, ClassFeedback[Question->Validity]); diff --git a/swad_exam_session.c b/swad_exam_session.c index 6096eb694..b2ffb50a4 100644 --- a/swad_exam_session.c +++ b/swad_exam_session.c @@ -72,10 +72,10 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams, Frm_PutForm_t PutFormSession, unsigned NumSessions, MYSQL_RES *mysql_res); -static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions); -static bool ExaSes_CheckIfICanEditSessions (void); -static bool ExaSes_CheckIfICanEditThisSession (long UsrCod); -static bool ExaSes_CheckIfVisibilityOfResultsCanBeChanged (const struct ExaSes_Session *Session); +static void ExaSes_ListOneOrMoreSessionsHeading (Usr_ICan_t ICanEditSessions); +static Usr_ICan_t ExaSes_CheckIfICanEditSessions (void); +static Usr_ICan_t ExaSes_CheckIfICanEditThisSession (long UsrCod); +static Usr_ICan_t ExaSes_CheckIfICanChangeVisibilityOfResults (const struct ExaSes_Session *Session); static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams, const struct ExaSes_Session *Session, const char *Anchor); @@ -151,7 +151,8 @@ void ExaSes_ListSessions (struct Exa_Exams *Exams, Hlp_ASSESSMENT_Exams_sessions,Box_NOT_CLOSABLE); /***** Select whether show only my groups or all groups *****/ - if (Gbl.Crs.Grps.NumGrps && ExaSes_CheckIfICanEditSessions ()) + if (Gbl.Crs.Grps.NumGrps && + ExaSes_CheckIfICanEditSessions () == Usr_I_CAN) { Set_BeginSettingsHead (); Grp_ShowFormToSelWhichGrps (ActSeeOneExa,Exa_PutPars,Exams); @@ -203,15 +204,10 @@ void ExaSes_GetSessionDataByCod (struct ExaSes_Session *Session) static void ExaSes_PutIconsInListOfSessions (void *Exams) { - bool ICanEditSessions; - if (Exams) - { - /***** Put icon to create a new exam session in current exam *****/ - ICanEditSessions = ExaSes_CheckIfICanEditSessions (); - if (ICanEditSessions) + if (ExaSes_CheckIfICanEditSessions () == Usr_I_CAN) + /***** Put icon to create a new exam session in current exam *****/ ExaSes_PutIconToCreateNewSession ((struct Exa_Exams *) Exams); - } } /*****************************************************************************/ @@ -237,7 +233,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams, unsigned UniqueId; struct ExaSes_Session Session; char *Anchor; - bool ICanEditSessions = ExaSes_CheckIfICanEditSessions (); + Usr_ICan_t ICanEditSessions = ExaSes_CheckIfICanEditSessions (); long SesCodToBeEdited = PutFormSession == Frm_PUT_FORM && Exams->SesCod > 0 ? Exams->SesCod : -1L; @@ -260,7 +256,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams, /***** Get exam session data from row *****/ ExaSes_GetSessionDataFromRow (mysql_res,&Session); - if (ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session.SesCod)) + if (ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session.SesCod) == Usr_I_CAN) { /***** Build anchor string *****/ if (asprintf (&Anchor,"evt_%ld_%ld",Exams->Exam.ExaCod,Session.SesCod) < 0) @@ -333,7 +329,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams, /************* Put a column for exam session start and end times *************/ /*****************************************************************************/ -static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions) +static void ExaSes_ListOneOrMoreSessionsHeading (Usr_ICan_t ICanEditSessions) { extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; extern const char *Txt_Session; @@ -343,14 +339,14 @@ static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions) HTM_TR_Begin (NULL); /***** Column for icons *****/ - if (ICanEditSessions) + if (ICanEditSessions == Usr_I_CAN) HTM_TH_Empty (1); /***** The rest of columns *****/ - HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_START_DATE] ,HTM_HEAD_LEFT ); - HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_END_DATE ] ,HTM_HEAD_LEFT ); - HTM_TH (Txt_Session ,HTM_HEAD_LEFT ); - HTM_TH (Txt_Results ,HTM_HEAD_CENTER); + HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_START_DATE],HTM_HEAD_LEFT ); + HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_END_DATE ],HTM_HEAD_LEFT ); + HTM_TH (Txt_Session ,HTM_HEAD_LEFT ); + HTM_TH (Txt_Results ,HTM_HEAD_CENTER); /***** End row *****/ HTM_TR_End (); @@ -360,13 +356,13 @@ static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions) /********************** Check if I can edit sessions *************************/ /*****************************************************************************/ -static bool ExaSes_CheckIfICanEditSessions (void) +static Usr_ICan_t ExaSes_CheckIfICanEditSessions (void) { - static const bool ICanEditSessions[Rol_NUM_ROLES] = + static Usr_ICan_t ICanEditSessions[Rol_NUM_ROLES] = { - [Rol_NET ] = true, - [Rol_TCH ] = true, - [Rol_SYS_ADM] = true, + [Rol_NET ] = Usr_I_CAN, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanEditSessions[Gbl.Usrs.Me.Role.Logged]; @@ -376,17 +372,18 @@ static bool ExaSes_CheckIfICanEditSessions (void) /************ Check if I can edit (remove/resume) an exam session ************/ /*****************************************************************************/ -static bool ExaSes_CheckIfICanEditThisSession (long UsrCod) +static Usr_ICan_t ExaSes_CheckIfICanEditThisSession (long UsrCod) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_NET: - return (UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod); // Only if I am the creator + return (UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN : // Only if I am the creator + Usr_I_CAN_NOT; case Rol_TCH: case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -394,14 +391,13 @@ static bool ExaSes_CheckIfICanEditThisSession (long UsrCod) /********** Check if visibility of session results can be changed ************/ /*****************************************************************************/ -static bool ExaSes_CheckIfVisibilityOfResultsCanBeChanged (const struct ExaSes_Session *Session) +static Usr_ICan_t ExaSes_CheckIfICanChangeVisibilityOfResults (const struct ExaSes_Session *Session) { if (Session->ShowUsrResults || // Results are currently visible Session->TimeUTC[Dat_END_TIME] < Dat_GetStartExecutionTimeUTC ()) // End of time is in the past - if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod)) - return true; + return ExaSes_CheckIfICanEditThisSession (Session->UsrCod); - return false; + return Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -424,7 +420,7 @@ static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams, /***** Begin cell *****/ HTM_TD_Begin ("rowspan=\"2\" class=\"BT %s\"",The_GetColorRows ()); - if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod)) + if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod) == Usr_I_CAN) { /***** Icon to remove the exam session *****/ Ico_PutContextualIconToRemove (ActReqRemExaSes,NULL, @@ -504,7 +500,7 @@ static void ExaSes_ListOneOrMoreSessionsTitleGrps (struct Exa_Exams *Exams, /***** Session title *****/ HTM_ARTICLE_Begin (Anchor); - if (ExaSes_CheckIfICanAnswerThisSession (&Exams->Exam,Session)) + if (ExaSes_CheckIfICanAnswerThisSession (&Exams->Exam,Session) == Usr_I_CAN) { Frm_BeginForm (ActSeeExaPrn); Exa_PutPars (Exams); @@ -648,13 +644,13 @@ static void ExaSes_ListOneOrMoreSessionsResultTch (struct Exa_Exams *Exams, Exams->SesCod = Session->SesCod; /***** Show exam session results *****/ - if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod)) + if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod) == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (ActSeeUsrExaResSes,ExaRes_RESULTS_BOX_ID, ExaSes_PutParsEdit,Exams, "trophy.svg",Ico_BLACK); /***** Check if visibility of session results can be changed *****/ - if (ExaSes_CheckIfVisibilityOfResultsCanBeChanged (Session)) + if (ExaSes_CheckIfICanChangeVisibilityOfResults (Session) == Usr_I_CAN) { /***** Put form to change visibility of session results *****/ if (Session->ShowUsrResults) @@ -694,7 +690,7 @@ void ExaSes_ToggleVisResultsSesUsr (void) ExaSes_GetAndCheckPars (&Exams,&Session); /***** Check if visibility of session results can be changed *****/ - if (!ExaSes_CheckIfVisibilityOfResultsCanBeChanged (&Session)) + if (ExaSes_CheckIfICanChangeVisibilityOfResults (&Session) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Toggle visibility of exam session results *****/ @@ -812,7 +808,7 @@ void ExaSes_RemoveSession (void) ExaSes_GetAndCheckPars (&Exams,&Session); /***** Check if I can remove this exam session *****/ - if (!ExaSes_CheckIfICanEditThisSession (Session.UsrCod)) + if (ExaSes_CheckIfICanEditThisSession (Session.UsrCod) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Remove questions of exams prints, and exam prints, in this session *****/ @@ -866,7 +862,7 @@ static void ExaSes_HideUnhideSession (HidVis_HiddenOrVisible_t HiddenOrVisible) ExaSes_GetAndCheckPars (&Exams,&Session); /***** Check if I can remove this exam session *****/ - if (!ExaSes_CheckIfICanEditThisSession (Session.UsrCod)) + if (ExaSes_CheckIfICanEditThisSession (Session.UsrCod) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Hide session *****/ @@ -1211,22 +1207,22 @@ static void ExaSes_CreateGrpsAssociatedToExamSession (long SesCod, /******** Check if I belong to any of the groups of an exam session **********/ /*****************************************************************************/ -bool ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam, - const struct ExaSes_Session *Session) +Usr_ICan_t ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam, + const struct ExaSes_Session *Session) { /***** 1. Sessions in hidden exams are not accesible 2. Hidden or closed sessions are not accesible *****/ if (Exam->HiddenOrVisible == HidVis_HIDDEN || Session->HiddenOrVisible == HidVis_HIDDEN || !Session->Open) - return false; + return Usr_I_CAN_NOT; /***** Exam is visible, session is visible and open ==> ==> I can answer this session if I can list it based on groups *****/ return ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session->SesCod); } -bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod) +Usr_ICan_t ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod) { switch (Gbl.Usrs.Me.Role.Logged) { @@ -1237,8 +1233,8 @@ bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod) case Rol_NET: case Rol_TCH: case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } diff --git a/swad_exam_session.h b/swad_exam_session.h index 27916de79..ecd2e1d89 100644 --- a/swad_exam_session.h +++ b/swad_exam_session.h @@ -69,8 +69,8 @@ void ExaSes_GetAndCheckPars (struct Exa_Exams *Exams, void ExaSes_ReqCreatOrEditSes (void); void ExaSes_ReceiveSession (void); -bool ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam, - const struct ExaSes_Session *Session); -bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod); +Usr_ICan_t ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam, + const struct ExaSes_Session *Session); +Usr_ICan_t ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod); #endif diff --git a/swad_exam_set.c b/swad_exam_set.c index 7236e7b2c..702f2e23e 100644 --- a/swad_exam_set.c +++ b/swad_exam_set.c @@ -91,13 +91,13 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams, unsigned MaxSetInd, unsigned NumSets, MYSQL_RES *mysql_res, - bool ICanEditSets); + Usr_ICan_t ICanEditSets); static void ExaSet_PutTableHeadingForSets (void); static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams, unsigned NumQsts, MYSQL_RES *mysql_res, - bool ICanEditQuestions); + Usr_ICan_t ICanEditQuestions); static void ExaSet_ListQuestionForEdition (struct Qst_Question *Question, unsigned QstInd,const char *Anchor); @@ -106,6 +106,8 @@ static void ExaSet_FreeListsSelectedQuestions (struct Exa_Exams *Exams); static void ExaSet_CopyQstFromBankToExamSet (const struct ExaSet_Set *Set,long QstCod); +static Usr_ICan_t ExaSet_CheckIfICanEditExamSets (const struct Exa_Exam *Exam); + static void ExaSet_RemoveMediaFromStemOfQst (long QstCod,long SetCod); static void ExaSet_RemoveMediaFromAllAnsOfQst (long QstCod,long SetCod); @@ -251,7 +253,7 @@ void ExaSet_ReceiveSet (void) Exa_GetExamDataByCod (&Exams.Exam); /***** Check if exam is editable *****/ - if (!Exa_CheckIfEditable (&Exams.Exam)) + if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** If I can edit exams ==> receive set from form *****/ @@ -318,7 +320,7 @@ void ExaSet_ChangeSetTitle (void) char NewTitle[ExaSet_MAX_BYTES_TITLE + 1]; /***** Check if I can edit exams *****/ - if (!Exa_CheckIfICanEditExams ()) + if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Reset exams context *****/ @@ -330,7 +332,7 @@ void ExaSet_ChangeSetTitle (void) ExaSet_GetAndCheckPars (&Exams,&Set); /***** Check if exam is editable *****/ - if (!Exa_CheckIfEditable (&Exams.Exam)) + if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Receive new title from form *****/ @@ -361,7 +363,7 @@ void ExaSet_ChangeNumQstsToExam (void) unsigned NumQstsToPrint; /***** Check if I can edit exams *****/ - if (!Exa_CheckIfICanEditExams ()) + if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Reset exams context *****/ @@ -373,7 +375,7 @@ void ExaSet_ChangeNumQstsToExam (void) ExaSet_GetAndCheckPars (&Exams,&Set); /***** Check if exam is editable *****/ - if (!Exa_CheckIfEditable (&Exams.Exam)) + if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get number of questions in set to appear in exam print *****/ @@ -480,7 +482,7 @@ void ExaSet_ListExamSets (struct Exa_Exams *Exams) MYSQL_RES *mysql_res; unsigned MaxSetInd; unsigned NumSets; - bool ICanEditSets = Exa_CheckIfEditable (&Exams->Exam); + Usr_ICan_t ICanEditSets = ExaSet_CheckIfICanEditExamSets (&Exams->Exam); /***** Get maximum set index *****/ MaxSetInd = Exa_DB_GetMaxSetIndexInExam (Exams->Exam.ExaCod); @@ -516,14 +518,14 @@ static void ExaSet_ListSetQuestions (struct Exa_Exams *Exams, extern const char *Txt_Questions; MYSQL_RES *mysql_res; unsigned NumQsts; - bool ICanEditQuestions = Exa_CheckIfEditable (&Exams->Exam); + Usr_ICan_t ICanEditQuestions = ExaSet_CheckIfICanEditExamSets (&Exams->Exam); /***** Begin box *****/ Box_BoxBegin (Txt_Questions, - ICanEditQuestions ? ExaSet_PutIconToAddNewQuestions : - NULL, - ICanEditQuestions ? Exams : - NULL, + ICanEditQuestions == Usr_I_CAN ? ExaSet_PutIconToAddNewQuestions : + NULL, + ICanEditQuestions == Usr_I_CAN ? Exams : + NULL, Hlp_ASSESSMENT_Exams_questions,Box_NOT_CLOSABLE); /***** Show table with questions *****/ @@ -546,7 +548,7 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams, unsigned MaxSetInd, unsigned NumSets, MYSQL_RES *mysql_res, - bool ICanEditSets) + Usr_ICan_t ICanEditSets) { extern const char *Txt_Movement_not_allowed; unsigned NumSet; @@ -586,14 +588,14 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams, The_GetColorRows ()); /* Put icon to remove the set */ - if (ICanEditSets) + if (ICanEditSets == Usr_I_CAN) Ico_PutContextualIconToRemove (ActReqRemExaSet,NULL, ExaSet_PutParsOneSet,Exams); else Ico_PutIconRemovalNotAllowed (); /* Put icon to move up the question */ - if (ICanEditSets && Set.SetInd > 1) + if (ICanEditSets == Usr_I_CAN && Set.SetInd > 1) Lay_PutContextualLinkOnlyIcon (ActUp_ExaSet,Anchor, ExaSet_PutParsOneSet,Exams, "arrow-up.svg",Ico_BLACK); @@ -785,7 +787,7 @@ void ExaSet_GetSetDataFromRow (MYSQL_RES *mysql_res,struct ExaSet_Set *Set) static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams, unsigned NumQsts, MYSQL_RES *mysql_res, - bool ICanEditQuestions) + Usr_ICan_t ICanEditQuestions) { extern const char *Txt_Questions; extern const char *Txt_No_INDEX; @@ -839,7 +841,7 @@ static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams, HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ()); /* Put icon to remove the question */ - if (ICanEditQuestions) + if (ICanEditQuestions == Usr_I_CAN) Ico_PutContextualIconToRemove (ActReqRemSetQst,NULL, ExaSet_PutParsOneQst,Exams); else @@ -1250,7 +1252,7 @@ void ExaSet_ReqRemSet (void) ExaSet_GetAndCheckPars (&Exams,&Set); /***** Check if exam is editable *****/ - if (!Exa_CheckIfEditable (&Exams.Exam)) + if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Show question and button to remove question *****/ @@ -1282,7 +1284,7 @@ void ExaSet_RemoveSet (void) ExaSet_GetAndCheckPars (&Exams,&Set); /***** Check if exam is editable *****/ - if (!Exa_CheckIfEditable (&Exams.Exam)) + if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Remove the set from all tables *****/ @@ -1323,7 +1325,7 @@ void ExaSet_MoveUpSet (void) ExaSet_GetAndCheckPars (&Exams,&Set); /***** Check if exam is editable *****/ - if (!Exa_CheckIfEditable (&Exams.Exam)) + if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get set index *****/ @@ -1369,7 +1371,7 @@ void ExaSet_MoveDownSet (void) ExaSet_GetAndCheckPars (&Exams,&Set); /***** Check if exam is editable *****/ - if (!Exa_CheckIfEditable (&Exams.Exam)) + if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get set index *****/ @@ -1396,6 +1398,21 @@ void ExaSet_MoveDownSet (void) Exa_PutFormsOneExam (&Exams,Exa_EXISTING_EXAM); } +/*****************************************************************************/ +/**************** Check is edition of exam sets is possible ******************/ +/*****************************************************************************/ +// Before calling this function, number of sessions must be calculated + +static Usr_ICan_t ExaSet_CheckIfICanEditExamSets (const struct Exa_Exam *Exam) + { + if (Exa_CheckIfICanEditExams () == Usr_I_CAN) + /***** Questions are editable only if exam has no sessions *****/ + return (Exam->NumSess == 0) ? Usr_I_CAN : // Exams with sessions should not be edited + Usr_I_CAN_NOT; + else + return Usr_I_CAN_NOT; // Sets of questions are not editable + } + /*****************************************************************************/ /********************** Request the removal of a question ********************/ /*****************************************************************************/ diff --git a/swad_follow.c b/swad_follow.c index fbb9598c6..7609ade10 100644 --- a/swad_follow.c +++ b/swad_follow.c @@ -572,13 +572,13 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat) [PhoSha_SHAPE_OVAL ] = "PHOTOO60x80", [PhoSha_SHAPE_RECTANGLE] = "PHOTOR60x80", }; - bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat); + Usr_ICan_t ICanView = Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat); HTM_DIV_Begin ("class=\"FOLLOW_USR\""); /***** Show user's photo *****/ HTM_DIV_Begin ("class=\"FOLLOW_PHOTO\""); - if (Visible) + if (ICanView == Usr_I_CAN) Pho_ShowUsrPhotoIfAllowed (UsrDat, ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM); HTM_DIV_End (); @@ -586,7 +586,7 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat) /***** Show user's name and icon to follow/unfollow *****/ HTM_DIV_Begin ("class=\"FOLLOW_TXT\""); - if (Visible) + if (ICanView == Usr_I_CAN) { /* Put form to go to public profile */ Frm_BeginForm (ActSeeOthPubPrf); @@ -612,7 +612,7 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat) UsrDat->UsrCod)) // I follow user /* Form to unfollow */ Fol_PutIconToUnfollow (UsrDat->EnUsrCod); - else if (Visible) // I do not follow this user and I can follow + else if (ICanView == Usr_I_CAN) // I do not follow this user and I can follow /* Form to follow */ Fol_PutIconToFollow (UsrDat->EnUsrCod); } @@ -636,13 +636,13 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat) [PhoSha_SHAPE_OVAL ] = "PHOTOO21x28", [PhoSha_SHAPE_RECTANGLE] = "PHOTOR21x28", }; - bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat); + Usr_ICan_t ICanView = Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat); /***** Show user's photo *****/ HTM_TR_Begin (NULL); HTM_TD_Begin ("class=\"CON_PHOTO %s\"",The_GetColorRows ()); - if (Visible) + if (ICanView == Usr_I_CAN) Pho_ShowUsrPhotoIfAllowed (UsrDat, ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM); HTM_TD_End (); @@ -650,7 +650,7 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat) /***** User's name *****/ HTM_TD_Begin ("class=\"CON_NAME_FOLLOW %s\"", The_GetColorRows ()); - if (Visible) + if (ICanView == Usr_I_CAN) { /* Put form to go to public profile */ Frm_BeginForm (ActSeeOthPubPrf); @@ -679,7 +679,7 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat) UsrDat->UsrCod)) // I follow user /* Form to unfollow */ Fol_PutIconToUnfollow (UsrDat->EnUsrCod); - else if (Visible) // I do not follow this user and I can follow + else if (ICanView == Usr_I_CAN) // I do not follow this user and I can follow /* Form to follow */ Fol_PutIconToFollow (UsrDat->EnUsrCod); } diff --git a/swad_forum.c b/swad_forum.c index 0444eda9f..bae5ffb47 100644 --- a/swad_forum.c +++ b/swad_forum.c @@ -379,7 +379,7 @@ static void For_WriteFormForumPst (struct For_Forums *Forums, static void For_PutParsRemThread (void *Forums); -static bool For_CheckIfICanMoveThreads (void); +static Usr_ICan_t For_CheckIfICanMoveThreads (void); static void For_InsertThrInClipboard (long ThrCod); static void For_ShowStatOfAForumType (For_ForumType_t ForumType, @@ -720,7 +720,7 @@ void For_ShowPostsOfAThread (struct For_Forums *Forums, For_GetThreadData (&Thread); /***** Get if there is a thread ready to be moved *****/ - if (For_CheckIfICanMoveThreads ()) + if (For_CheckIfICanMoveThreads () == Usr_I_CAN) Forums->Thread.ToMove = For_DB_GetThrInMyClipboard (); /***** Get thread read time for the current user *****/ @@ -871,7 +871,7 @@ static void For_PutIconsOneThread (void *Forums) /***** Put icon to get resource link *****/ if (((struct For_Forums *) Forums)->Forum.Type == For_FORUM_COURSE_USRS && - Rsc_CheckIfICanGetLink ()) + Rsc_CheckIfICanGetLink () == Usr_I_CAN) Ico_PutContextualIconToGetLink (ActReqLnkForCrsUsr,NULL, For_PutParsNewPost,Forums); } @@ -1233,7 +1233,7 @@ void For_ShowForumList (struct For_Forums *Forums) bool ICanSeeDegForum; /***** Get if there is a thread ready to be moved *****/ - if (For_CheckIfICanMoveThreads ()) + if (For_CheckIfICanMoveThreads () == Usr_I_CAN) Forums->Thread.ToMove = For_DB_GetThrInMyClipboard (); /***** Fill the list with the institutions I belong to *****/ @@ -2182,7 +2182,7 @@ static void For_PutIconsThreads (void *Forums) /***** Put icon to get resource link *****/ if (((struct For_Forums *) Forums)->Forum.Type == For_FORUM_COURSE_USRS && - Rsc_CheckIfICanGetLink ()) + Rsc_CheckIfICanGetLink () == Usr_I_CAN) Ico_PutContextualIconToGetLink (ActReqLnkForCrsUsr,NULL, For_PutParsNewPost,Forums); } @@ -2232,10 +2232,10 @@ static void For_ListForumThrs (struct For_Forums *Forums, long ThreadInMyClipboard = -1L; unsigned Column; const char *BgColor; - bool ICanMoveThreads; + Usr_ICan_t ICanMoveThreads = For_CheckIfICanMoveThreads (); /***** Get if there is a thread ready to be moved *****/ - if ((ICanMoveThreads = For_CheckIfICanMoveThreads ())) + if (ICanMoveThreads == Usr_I_CAN) ThreadInMyClipboard = For_DB_GetThrInMyClipboard (); /***** Initialize structure with user's data *****/ @@ -2288,7 +2288,7 @@ static void For_ListForumThrs (struct For_Forums *Forums, } /***** Put button to cut the thread for moving it to another forum *****/ - if (ICanMoveThreads) + if (ICanMoveThreads == Usr_I_CAN) { HTM_BR (); Frm_BeginFormAnchor (For_ActionsCutThrFor[Forums->Forum.Type], @@ -3238,9 +3238,10 @@ void For_PasteThread (void) /*********************** Check if I can move threads *************************/ /*****************************************************************************/ -static bool For_CheckIfICanMoveThreads (void) +static Usr_ICan_t For_CheckIfICanMoveThreads (void) { - return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); // If I have permission to move threads... + return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN : // If I have permission to move threads... + Usr_I_CAN_NOT; } /*****************************************************************************/ diff --git a/swad_game.c b/swad_game.c index e7d1c45ae..5c9d5710a 100644 --- a/swad_game.c +++ b/swad_game.c @@ -113,8 +113,8 @@ extern struct Globals Gbl; static void Gam_ListAllGamesHeading (const struct Gam_Games *Games); -static bool Gam_CheckIfICanEditGames (void); -static bool Gam_CheckIfICanListGameQuestions (void); +static Usr_ICan_t Gam_CheckIfICanEditGames (void); +static Usr_ICan_t Gam_CheckIfICanListGameQuestions (void); static void Gam_PutIconsListingGames (void *Games); static void Gam_PutIconToCreateNewGame (struct Gam_Games *Games); static void Gam_PutParsToCreateNewGame (void *Games); @@ -153,7 +153,7 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games); static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games, unsigned NumQsts, MYSQL_RES *mysql_res, - bool ICanEditQuestions); + Usr_ICan_t ICanEditQuestions); static void Gam_PutIconToAddNewQuestions (void *Games); @@ -163,7 +163,7 @@ static void Gam_FreeListsSelectedQuestions (struct Gam_Games *Games); static void Gam_ExchangeQuestions (long GamCod, unsigned QstIndTop,unsigned QstIndBottom); -static bool Gam_CheckIfEditable (const struct Gam_Game *Game); +static Usr_ICan_t Gam_CheckIfICanEditGame (const struct Gam_Game *Game); /*****************************************************************************/ /*************************** Reset games context *****************************/ @@ -346,9 +346,9 @@ static void Gam_ListAllGamesHeading (const struct Gam_Games *Games) /************************ Check if I can edit games **************************/ /*****************************************************************************/ -static bool Gam_CheckIfICanEditGames (void) +static Usr_ICan_t Gam_CheckIfICanEditGames (void) { - static const bool ICanEditGames[Rol_NUM_ROLES] = + static bool ICanEditGames[Rol_NUM_ROLES] = { [Rol_TCH ] = true, [Rol_SYS_ADM] = true, @@ -361,13 +361,13 @@ static bool Gam_CheckIfICanEditGames (void) /**************** Check if I can list questions in games *********************/ /*****************************************************************************/ -static bool Gam_CheckIfICanListGameQuestions (void) +static Usr_ICan_t Gam_CheckIfICanListGameQuestions (void) { - static const bool ICanListGameQuestions[Rol_NUM_ROLES] = + static Usr_ICan_t ICanListGameQuestions[Rol_NUM_ROLES] = { - [Rol_NET ] = true, - [Rol_TCH ] = true, - [Rol_SYS_ADM] = true, + [Rol_NET ] = Usr_I_CAN, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanListGameQuestions[Gbl.Usrs.Me.Role.Logged]; @@ -390,7 +390,7 @@ static void Gam_PutIconsListingGames (void *Games) if (Games) { /***** Put icon to create a new game *****/ - if (Gam_CheckIfICanEditGames ()) + if (Gam_CheckIfICanEditGames () == Usr_I_CAN) Gam_PutIconToCreateNewGame ((struct Gam_Games *) Games); /***** Put icon to view matches results *****/ @@ -399,9 +399,8 @@ static void Gam_PutIconsListingGames (void *Games) NULL,NULL); /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) - Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL, - Gam_PutPars,Games); + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) + Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL,Gam_PutPars,Games); /***** Put icon to show a figure *****/ Fig_PutIconToShowFigure (Fig_GAMES); @@ -687,8 +686,7 @@ static void Gam_PutIconsEditingOneGame (void *Games) { if (Games) /***** Icon to view game *****/ - Ico_PutContextualIconToView (ActLstOneGam,NULL, - Gam_PutPars,Games); + Ico_PutContextualIconToView (ActLstOneGam,NULL,Gam_PutPars,Games); } /*****************************************************************************/ @@ -729,7 +727,7 @@ static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games, [Rol_SYS_ADM] = ActSeeUsrMchResGam, }; - if (Gam_CheckIfICanEditGames ()) + if (Gam_CheckIfICanEditGames () == Usr_I_CAN) { /***** Icon to remove game *****/ Ico_PutContextualIconToRemove (ActReqRemGam,NULL, @@ -741,14 +739,12 @@ static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games, Games->Game.HiddenOrVisible); /***** Icon to edit game *****/ - Ico_PutContextualIconToEdit (ActEdiOneGam,NULL, - Gam_PutPars,Games); + Ico_PutContextualIconToEdit (ActEdiOneGam,NULL,Gam_PutPars,Games); } - if (Gam_CheckIfICanListGameQuestions ()) + if (Gam_CheckIfICanListGameQuestions () == Usr_I_CAN) /***** Icon to view game listing its questions *****/ - Ico_PutContextualIconToView (ActLstOneGam,NULL, - Gam_PutPars,Games); + Ico_PutContextualIconToView (ActLstOneGam,NULL,Gam_PutPars,Games); /***** Put icon to view matches results *****/ if (ActionShowResults[Gbl.Usrs.Me.Role.Logged]) @@ -756,9 +752,8 @@ static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games, Gam_PutPars,Games); /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) - Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL, - Gam_PutPars,Games); + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) + Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL,Gam_PutPars,Games); } @@ -1054,7 +1049,7 @@ void Gam_AskRemGame (void) /***** Get data of the game from database *****/ Gam_GetGameDataByCod (&Games.Game); - if (!Gam_CheckIfICanEditGames ()) + if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Show question and button to remove game *****/ @@ -1087,7 +1082,7 @@ void Gam_RemoveGame (void) /***** Get data of the game from database *****/ Gam_GetGameDataByCod (&Games.Game); - if (!Gam_CheckIfICanEditGames ()) + if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Remove game from all tables *****/ @@ -1163,7 +1158,7 @@ static void Gam_HideUnhideGame (HidVis_HiddenOrVisible_t HiddenOrVisible) /***** Get data of the game from database *****/ Gam_GetGameDataByCod (&Games.Game); - if (!Gam_CheckIfICanEditGames ()) + if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Unhide game *****/ @@ -1189,7 +1184,7 @@ void Gam_ListGame (void) Gam_ResetGame (&Games.Game); /***** Check if I can list game questions *****/ - if (!Gam_CheckIfICanListGameQuestions ()) + if (Gam_CheckIfICanListGameQuestions () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get parameters *****/ @@ -1223,7 +1218,7 @@ void Gam_ReqCreatOrEditGame (void) Gam_ResetGame (&Games.Game); /***** Check if I can edit games *****/ - if (!Gam_CheckIfICanEditGames ()) + if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get parameters *****/ @@ -1439,7 +1434,7 @@ void Gam_ReceiveGame (void) Gam_ResetGame (&Games.Game); /***** Check if I can edit games *****/ - if (!Gam_CheckIfICanEditGames ()) + if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get parameters *****/ @@ -1568,7 +1563,7 @@ void Gam_ReqSelectQstsToAddToGame (void) Gam_GetGameDataByCod (&Games.Game); /***** Check if game has matches *****/ - if (!Gam_CheckIfEditable (&Games.Game)) + if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Show form to create a new question in this game *****/ @@ -1600,7 +1595,7 @@ void Gam_ListQstsToAddToGame (void) Gam_GetGameDataByCod (&Games.Game); /***** Check if game has matches *****/ - if (!Gam_CheckIfEditable (&Games.Game)) + if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** List several test questions for selection *****/ @@ -1640,17 +1635,17 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games) extern const char *Txt_Questions; MYSQL_RES *mysql_res; unsigned NumQsts; - bool ICanEditQuestions = Gam_CheckIfEditable (&Games->Game); + Usr_ICan_t ICanEditQuestions = Gam_CheckIfICanEditGame (&Games->Game); /***** Get data of questions from database *****/ NumQsts = Gam_DB_GetGameQuestionsBasic (&mysql_res,Games->Game.GamCod); /***** Begin box *****/ Box_BoxBegin (Txt_Questions, - ICanEditQuestions ? Gam_PutIconToAddNewQuestions : - NULL, - ICanEditQuestions ? Games : - NULL, + ICanEditQuestions == Usr_I_CAN ? Gam_PutIconToAddNewQuestions : + NULL, + ICanEditQuestions == Usr_I_CAN ? Games : + NULL, Hlp_ASSESSMENT_Games_questions,Box_NOT_CLOSABLE); /***** Show table with questions *****/ @@ -1672,7 +1667,7 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games) static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games, unsigned NumQsts, MYSQL_RES *mysql_res, - bool ICanEditQuestions) + Usr_ICan_t ICanEditQuestions) { extern const char *Txt_Questions; extern const char *Txt_No_INDEX; @@ -1741,14 +1736,14 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games, HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ()); /* Put icon to remove the question */ - if (ICanEditQuestions) + if (ICanEditQuestions == Usr_I_CAN) Ico_PutContextualIconToRemove (ActReqRemGamQst,NULL, Gam_PutParsOneQst,Games); else Ico_PutIconRemovalNotAllowed (); /* Put icon to move up the question */ - if (ICanEditQuestions && QstInd > 1) + if (ICanEditQuestions == Usr_I_CAN && QstInd > 1) Lay_PutContextualLinkOnlyIcon (ActUp_GamQst,Anchor, Gam_PutParsOneQst,Games, "arrow-up.svg",Ico_BLACK); @@ -1757,7 +1752,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games, Txt_Movement_not_allowed); /* Put icon to move down the question */ - if (ICanEditQuestions && QstInd < MaxQstInd) + if (ICanEditQuestions == Usr_I_CAN && QstInd < MaxQstInd) Lay_PutContextualLinkOnlyIcon (ActDwnGamQst,Anchor, Gam_PutParsOneQst,Games, "arrow-down.svg",Ico_BLACK); @@ -1766,7 +1761,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games, Txt_Movement_not_allowed); /* Put icon to edit the question */ - if (ICanEditQuestions) + if (ICanEditQuestions == Usr_I_CAN) Ico_PutContextualIconToEdit (ActEdiOneTstQst,NULL, Qst_PutParQstCod,&Question.QstCod); @@ -1827,7 +1822,7 @@ void Gam_AddQstsToGame (void) Gam_GetGameDataByCod (&Games.Game); /***** Check if game has matches *****/ - if (!Gam_CheckIfEditable (&Games.Game)) + if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get selected questions *****/ @@ -1935,7 +1930,7 @@ void Gam_ReqRemQstFromGame (void) Gam_GetGameDataByCod (&Games.Game); /***** Check if game has matches *****/ - if (!Gam_CheckIfEditable (&Games.Game)) + if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get question index *****/ @@ -1977,7 +1972,7 @@ void Gam_RemoveQstFromGame (void) Gam_GetGameDataByCod (&Games.Game); /***** Check if game has matches *****/ - if (!Gam_CheckIfEditable (&Games.Game)) + if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get question index *****/ @@ -2026,7 +2021,7 @@ void Gam_MoveUpQst (void) Gam_GetGameDataByCod (&Games.Game); /***** Check if game has matches *****/ - if (!Gam_CheckIfEditable (&Games.Game)) + if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get question index *****/ @@ -2076,7 +2071,7 @@ void Gam_MoveDownQst (void) Gam_GetGameDataByCod (&Games.Game); /***** Check if game has matches *****/ - if (!Gam_CheckIfEditable (&Games.Game)) + if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get question index *****/ @@ -2155,13 +2150,14 @@ static void Gam_ExchangeQuestions (long GamCod, /*****************************************************************************/ // Before calling this function, number of matches must be calculated -static bool Gam_CheckIfEditable (const struct Gam_Game *Game) +static Usr_ICan_t Gam_CheckIfICanEditGame (const struct Gam_Game *Game) { - if (Gam_CheckIfICanEditGames ()) + if (Gam_CheckIfICanEditGames () == Usr_I_CAN) /***** Questions are editable only if game has no matches *****/ - return Game->NumMchs == 0; // Games with matches should not be edited + return Game->NumMchs == 0 ? Usr_I_CAN : // Games with matches should not be edited + Usr_I_CAN_NOT; else - return false; // Questions are not editable + return Usr_I_CAN_NOT; // Questions are not editable } /*****************************************************************************/ diff --git a/swad_group.c b/swad_group.c index 5ccddc502..f26d19044 100644 --- a/swad_group.c +++ b/swad_group.c @@ -66,20 +66,6 @@ #define Grp_GROUPS_SECTION_ID "grps" #define Grp_NEW_GROUP_SECTION_ID "new_grp" -static const bool Grp_ICanChangeGrps[Rol_NUM_ROLES] = - { - [Rol_UNK ] = false, - [Rol_GST ] = false, - [Rol_USR ] = false, - [Rol_STD ] = true, - [Rol_NET ] = false, - [Rol_TCH ] = true, - [Rol_DEG_ADM] = false, - [Rol_CTR_ADM] = false, - [Rol_INS_ADM] = false, - [Rol_SYS_ADM] = true, - }; - /*****************************************************************************/ /************* External global variables from others modules *****************/ /*****************************************************************************/ @@ -90,6 +76,8 @@ extern struct Globals Gbl; /***************************** Private prototypes ****************************/ /*****************************************************************************/ +static Usr_ICan_t Grp_CheckIfICanChangeGrps (void); + static void Grp_ReqEditGroupsInternal (Ale_AlertType_t AlertTypeGroupTypes,const char *AlertTextGroupTypes, Ale_AlertType_t AlertTypeGroups,const char *AlertTextGroups); static void Grp_ReqEditGroupsInternal0 (void); @@ -143,6 +131,22 @@ static void Grp_WriteMaxStds (char Str[Cns_MAX_DECIMAL_DIGITS_UINT + 1],unsigned static void Grp_PutParGrpTypCod (void *GrpTypCod); static void Grp_PutParGrpCod (void *GrpCod); +/*****************************************************************************/ +/************************ Check if I can change groups ***********************/ +/*****************************************************************************/ + +static Usr_ICan_t Grp_CheckIfICanChangeGrps (void) + { + static Usr_ICan_t Grp_ICanChangeGrps[Rol_NUM_ROLES] = + { + [Rol_STD ] = Usr_I_CAN, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, + }; + + return Grp_ICanChangeGrps[Gbl.Usrs.Me.Role.Logged]; + } + /*****************************************************************************/ /******************* Write the names of the selected groups ******************/ /*****************************************************************************/ @@ -624,7 +628,7 @@ void Grp_ChangeMyGrps (Cns_QuietOrVerbose_t QuietOrVerbose) bool ChangesMade; /***** Can I change my groups? *****/ - if (Grp_ICanChangeGrps[Gbl.Usrs.Me.Role.Logged]) + if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN) { /***** Get list of groups types and groups in this course *****/ Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS); @@ -683,7 +687,7 @@ void Grp_ChangeOtherUsrGrps (void) bool SelectionIsValid; /***** Can I change another user's groups? *****/ - if (Grp_ICanChangeGrps[Gbl.Usrs.Me.Role.Logged]) + if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN) { /***** Get list of groups types and groups in current course *****/ Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS); @@ -1340,8 +1344,7 @@ static void Grp_PutIconsEditingGroupTypes (__attribute__((unused)) void *Args) static void Grp_PutIconToViewGroups (void) { - Ico_PutContextualIconToView (ActReqSelGrp,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActReqSelGrp,NULL,NULL,NULL); } /*****************************************************************************/ @@ -1773,8 +1776,7 @@ void Grp_ShowLstGrpsToChgMyGrps (void) static void Grp_PutIconToEditGroups (__attribute__((unused)) void *Args) { - Ico_PutContextualIconToEdit (ActReqEdiGrp,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActReqEdiGrp,NULL,NULL,NULL); } /*****************************************************************************/ diff --git a/swad_hierarchy.c b/swad_hierarchy.c index c483b91c5..3507cd2ab 100644 --- a/swad_hierarchy.c +++ b/swad_hierarchy.c @@ -707,23 +707,23 @@ void Hie_GetAndWriteInsCtrDegAdminBy (long UsrCod,unsigned ColSpan) /****************** Check if I can edit hierarchy elements *******************/ /*****************************************************************************/ -bool Hie_CheckIfICanEdit (void) +Usr_ICan_t Hie_CheckIfICanEdit (void) { // Some admins can edit all hierarchy elements. // Any user can edit the elements he/she has created... // ...as long as they are in pending status. - static const bool ICanEdit[Rol_NUM_ROLES] = + static Usr_ICan_t ICanEdit[Rol_NUM_ROLES] = { /* Users who can edit */ - [Rol_GST ] = true, - [Rol_USR ] = true, - [Rol_STD ] = true, - [Rol_NET ] = true, - [Rol_TCH ] = true, - [Rol_DEG_ADM] = true, - [Rol_CTR_ADM] = true, - [Rol_INS_ADM] = true, - [Rol_SYS_ADM] = true, + [Rol_GST ] = Usr_I_CAN, + [Rol_USR ] = Usr_I_CAN, + [Rol_STD ] = Usr_I_CAN, + [Rol_NET ] = Usr_I_CAN, + [Rol_TCH ] = Usr_I_CAN, + [Rol_DEG_ADM] = Usr_I_CAN, + [Rol_CTR_ADM] = Usr_I_CAN, + [Rol_INS_ADM] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanEdit[Gbl.Usrs.Me.Role.Logged]; diff --git a/swad_hierarchy.h b/swad_hierarchy.h index fae184777..2e1d1e91a 100644 --- a/swad_hierarchy.h +++ b/swad_hierarchy.h @@ -49,7 +49,7 @@ void Hie_ResetHierarchy (void); void Hie_GetAndWriteInsCtrDegAdminBy (long UsrCod,unsigned ColSpan); -bool Hie_CheckIfICanEdit (void); +Usr_ICan_t Hie_CheckIfICanEdit (void); void Hie_WriteStatusCell (Hie_Status_t Status, const char *Class,const char *BgColor, diff --git a/swad_holiday.c b/swad_holiday.c index 71895a8d1..1222c0816 100644 --- a/swad_holiday.c +++ b/swad_holiday.c @@ -44,17 +44,6 @@ #include "swad_parameter.h" #include "swad_parameter_code.h" -/*****************************************************************************/ -/****************************** Private constants ****************************/ -/*****************************************************************************/ - -static const bool Hld_ICanEditHlds[Rol_NUM_ROLES] = - { - /* Users who can edit */ - [Rol_INS_ADM] = true, - [Rol_SYS_ADM] = true, - }; - /*****************************************************************************/ /************** External global variables from others modules ****************/ /*****************************************************************************/ @@ -71,6 +60,8 @@ static struct Hld_Holiday *Hld_EditingHld = NULL; // Static variable to keep the /***************************** Private prototypes ****************************/ /*****************************************************************************/ +static Usr_ICan_t Hld_CheckIfICanEditHlds (void); + static Hld_Order_t Hld_GetParHldOrder (void); static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args); static void Hld_PutIconsEditHolidays (__attribute__((unused)) void *Args); @@ -93,6 +84,22 @@ static void Hld_PutHeadHolidays (void); static void Hld_EditingHolidayConstructor (void); static void Hld_EditingHolidayDestructor (void); +/*****************************************************************************/ +/************************ Check if I can edit holidays ***********************/ +/*****************************************************************************/ + +static Usr_ICan_t Hld_CheckIfICanEditHlds (void) + { + static Usr_ICan_t Hld_ICanEditHlds[Rol_NUM_ROLES] = + { + /* Users who can edit */ + [Rol_INS_ADM] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, + }; + + return Hld_ICanEditHlds[Gbl.Usrs.Me.Role.Logged]; + } + /*****************************************************************************/ /************************* Reset departments context *************************/ /*****************************************************************************/ @@ -234,9 +241,8 @@ static Hld_Order_t Hld_GetParHldOrder (void) static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args) { /***** Edit holidays *****/ - if (Hld_ICanEditHlds[Gbl.Usrs.Me.Role.Logged]) - Ico_PutContextualIconToEdit (ActEdiHld,NULL, - NULL,NULL); + if (Hld_CheckIfICanEditHlds () == Usr_I_CAN) + Ico_PutContextualIconToEdit (ActEdiHld,NULL,NULL,NULL); /***** View calendar *****/ Cal_PutIconToSeeCalendar (); @@ -245,8 +251,7 @@ static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args) static void Hld_PutIconsEditHolidays (__attribute__((unused)) void *Args) { /***** Put icon to view holidays *****/ - Ico_PutContextualIconToView (ActSeeHld,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeHld,NULL,NULL,NULL); /***** View calendar *****/ Cal_PutIconToSeeCalendar (); diff --git a/swad_institution.c b/swad_institution.c index 3fba411f5..5234ce597 100644 --- a/swad_institution.c +++ b/swad_institution.c @@ -89,7 +89,7 @@ static void Ins_GetInstitDataFromRow (MYSQL_RES *mysql_res, bool GetNumUsrsWhoClaimToBelongToIns); static void Ins_ListInstitutionsForEdition (void); -static bool Ins_CheckIfICanEdit (struct Hie_Node *Ins); +static Usr_ICan_t Ins_CheckIfICanEdit (struct Hie_Node *Ins); static void Ins_UpdateInsNameDB (long InsCod,const char *FldName,const char *NewName); @@ -331,7 +331,7 @@ static void Ins_ListInstitutions (void) static void Ins_PutIconsListingInstitutions (__attribute__((unused)) void *Args) { /***** Put icon to edit institutions *****/ - if (Hie_CheckIfICanEdit ()) + if (Hie_CheckIfICanEdit () == Usr_I_CAN) Ins_PutIconToEditInstitutions (); /***** Put icon to show a figure *****/ @@ -344,8 +344,7 @@ static void Ins_PutIconsListingInstitutions (__attribute__((unused)) void *Args) static void Ins_PutIconToEditInstitutions (void) { - Ico_PutContextualIconToEdit (ActEdiIns,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiIns,NULL,NULL,NULL); } /*****************************************************************************/ @@ -556,8 +555,7 @@ static void Ins_EditInstitutionsInternal (void) static void Ins_PutIconsEditingInstitutions (__attribute__((unused)) void *Args) { /***** Put icon to view institutions *****/ - Ico_PutContextualIconToView (ActSeeIns,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeIns,NULL,NULL,NULL); /***** Put icon to show a figure *****/ Fig_PutIconToShowFigure (Fig_INSTITS); @@ -884,7 +882,7 @@ static void Ins_ListInstitutionsForEdition (void) struct Hie_Node *Ins; char WWW[Cns_MAX_BYTES_WWW + 1]; struct Usr_Data UsrDat; - bool ICanEdit; + Usr_ICan_t ICanEdit; unsigned NumCtrs; unsigned NumUsrsIns; unsigned NumUsrsInCrssOfIns; @@ -920,7 +918,7 @@ static void Ins_ListInstitutionsForEdition (void) /* Put icon to remove institution */ HTM_TD_Begin ("class=\"BT\""); - if (!ICanEdit || + if (ICanEdit == Usr_I_CAN_NOT || NumCtrs || // Institution has centers NumUsrsIns || // Institution has users NumUsrsInCrssOfIns) // Institution has users @@ -947,11 +945,12 @@ static void Ins_ListInstitutionsForEdition (void) Nam_ExistingShortAndFullNames (ActionRename, ParCod_OthHie,Ins->HieCod, Names, - ICanEdit); // Put form? + ICanEdit == Usr_I_CAN ? Frm_PUT_FORM : + Frm_DONT_PUT_FORM); /* Institution WWW */ HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); - if (ICanEdit) + if (ICanEdit == Usr_I_CAN) { Frm_BeginForm (ActChgInsWWW); ParCod_PutPar (ParCod_OthHie,Ins->HieCod); @@ -1014,11 +1013,12 @@ static void Ins_ListInstitutionsForEdition (void) /************ Check if I can edit, remove, etc. an institution ***************/ /*****************************************************************************/ -static bool Ins_CheckIfICanEdit (struct Hie_Node *Ins) +static Usr_ICan_t Ins_CheckIfICanEdit (struct Hie_Node *Ins) { - return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM || // I am a superuser - ((Ins->Status & Hie_STATUS_BIT_PENDING) != 0 && // Institution is not yet activated - Gbl.Usrs.Me.UsrDat.UsrCod == Ins->RequesterUsrCod); // I am the requester + return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM || // I am a superuser + ((Ins->Status & Hie_STATUS_BIT_PENDING) != 0 && // Institution is not yet activated + Gbl.Usrs.Me.UsrDat.UsrCod == Ins->RequesterUsrCod)) ? Usr_I_CAN : // I am the requester + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -1041,12 +1041,14 @@ void Ins_RemoveInstitution (void) /***** Get data of the institution from database *****/ Hie_GetDataByCod[Hie_INS] (Ins_EditingIns); - /***** Check if this institution has users *****/ - if (!Ins_CheckIfICanEdit (Ins_EditingIns)) + /***** Check if I can edit this institution *****/ + if (Ins_CheckIfICanEdit (Ins_EditingIns) == Usr_I_CAN_NOT) Err_NoPermissionExit (); - else if (Hie_GetNumNodesInHieLvl (Hie_CTR, // Number of centers... - Hie_INS, // ...in institution - Ins_EditingIns->HieCod)) + + /***** Check if this institution has centers or users *****/ + if (Hie_GetNumNodesInHieLvl (Hie_CTR, // Number of centers... + Hie_INS, // ...in institution + Ins_EditingIns->HieCod)) // Institution has centers ==> don't remove Ale_CreateAlert (Ale_WARNING,NULL, Txt_To_remove_an_institution_you_must_first_remove_all_centers_and_users_in_the_institution); diff --git a/swad_link.c b/swad_link.c index 864246ae4..9ae5698f4 100644 --- a/swad_link.c +++ b/swad_link.c @@ -45,16 +45,6 @@ #include "swad_parameter.h" #include "swad_parameter_code.h" -/*****************************************************************************/ -/****************************** Private constants ****************************/ -/*****************************************************************************/ - -static const bool Lnk_ICanEditLinks[Rol_NUM_ROLES] = - { - /* Users who can edit */ - [Rol_SYS_ADM] = true, - }; - /*****************************************************************************/ /************** External global variables from others modules ****************/ /*****************************************************************************/ @@ -81,6 +71,8 @@ static struct Lnk_Link *Lnk_EditingLnk = NULL; // Static variable to keep the li /***************************** Private prototypes ****************************/ /*****************************************************************************/ +static Usr_ICan_t Lnk_CheckIfICanEditLinks (void); + static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args); static void Lnk_PutIconToEditLinks (void); static void Lnk_WriteListOfLinks (const struct Lnk_Links *Links,const char *Class); @@ -104,6 +96,21 @@ static void Lnk_PutHeadLinks (void); static void Lnk_EditingLinkConstructor (void); static void Lnk_EditingLinkDestructor (void); +/*****************************************************************************/ +/************************* Check if I can edit links *************************/ +/*****************************************************************************/ + +static Usr_ICan_t Lnk_CheckIfICanEditLinks (void) + { + static bool Lnk_ICanEditLinks[Rol_NUM_ROLES] = + { + /* Users who can edit */ + [Rol_SYS_ADM] = Usr_I_CAN, + }; + + return Lnk_ICanEditLinks[Gbl.Usrs.Me.Role.Logged]; + } + /*****************************************************************************/ /****************************** List all links *******************************/ /*****************************************************************************/ @@ -142,7 +149,7 @@ void Lnk_SeeLinks (void) static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args) { /***** Put icon to edit links *****/ - if (Lnk_ICanEditLinks[Gbl.Usrs.Me.Role.Logged]) + if (Lnk_CheckIfICanEditLinks () == Usr_I_CAN) Lnk_PutIconToEditLinks (); /***** Put icon to view banners *****/ @@ -155,8 +162,7 @@ static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args) static void Lnk_PutIconToEditLinks (void) { - Ico_PutContextualIconToEdit (ActEdiLnk,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiLnk,NULL,NULL,NULL); } /*****************************************************************************/ @@ -269,8 +275,7 @@ static void Lnk_EditLinksInternal (void) static void Lnk_PutIconsEditingLinks (__attribute__((unused)) void *Args) { /***** Put icon to view links *****/ - Ico_PutContextualIconToView (ActSeeLnk,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeLnk,NULL,NULL,NULL); /***** Put icon to view banners *****/ Ban_PutIconToViewBanners (); @@ -436,7 +441,7 @@ static void Lnk_ListLinksForEdition (const struct Lnk_Links *Links) Nam_ExistingShortAndFullNames (ActionRename, ParCod_Lnk,Lnk->LnkCod, Names, - true); // Put form + Frm_PUT_FORM); /* Link WWW */ HTM_TD_Begin ("class=\"LM\""); diff --git a/swad_mail.c b/swad_mail.c index 57abab1a1..b28e29af9 100644 --- a/swad_mail.c +++ b/swad_mail.c @@ -217,8 +217,7 @@ static Mai_DomainsOrder_t Mai_GetParMaiOrder (void) static void Mai_PutIconToEditMailDomains (__attribute__((unused)) void *Args) { - Ico_PutContextualIconToEdit (ActEdiMai,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiMai,NULL,NULL,NULL); } /*****************************************************************************/ @@ -793,7 +792,7 @@ static void Mai_PutFormToSelectUsrsToListEmails (__attribute__((unused)) void *A Txt_Email, Hlp_COMMUNICATION_Email, Txt_View_email_addresses, - false); // Do not put form with date range + Frm_DONT_PUT_FORM); // Do not put form with date range } /*****************************************************************************/ @@ -1298,7 +1297,7 @@ void Mai_RemoveOtherUsrEmail (void) /***** Get other user's code from form and get user's data *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Remove user's email *****/ Mai_RemoveEmail (&Gbl.Usrs.Other.UsrDat); @@ -1322,7 +1321,7 @@ static void Mai_RemoveEmail (struct Usr_Data *UsrDat) extern const char *Txt_Email_X_removed; char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]; - if (Usr_ICanEditOtherUsr (UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN) { /***** Get new email from form *****/ Par_GetParText ("Email",Email,Cns_MAX_BYTES_EMAIL_ADDRESS); @@ -1364,7 +1363,7 @@ void Mai_ChangeOtherUsrEmail (void) /***** Get other user's code from form and get user's data *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Change user's ID *****/ Mai_ChangeUsrEmail (&Gbl.Usrs.Other.UsrDat, @@ -1392,7 +1391,7 @@ static void Mai_ChangeUsrEmail (struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOthe extern const char *Txt_The_email_address_entered_X_is_not_valid; char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]; - if (Usr_ICanEditOtherUsr (UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN) { /***** Get new email from form *****/ Par_GetParText ("NewEmail",NewEmail,Cns_MAX_BYTES_EMAIL_ADDRESS); diff --git a/swad_match.c b/swad_match.c index 1632d210c..7f44e71d4 100644 --- a/swad_match.c +++ b/swad_match.c @@ -103,10 +103,10 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games, Frm_PutForm_t PutFormMatch, unsigned NumMatches, MYSQL_RES *mysql_res); -static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches); -static bool Mch_CheckIfICanEditMatches (void); -static bool Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match); -static bool Mch_CheckIfVisibilityOfResultsCanBeChanged (const struct Mch_Match *Match); +static void Mch_ListOneOrMoreMatchesHeading (Usr_ICan_t ICanEditMatches); +static Usr_ICan_t Mch_CheckIfICanEditMatches (void); +static Usr_ICan_t Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match); +static Usr_ICan_t Mch_CheckIfICanChangeVisibilityOfResults (const struct Mch_Match *Match); static void Mch_ListOneOrMoreMatchesIcons (struct Gam_Games *Games, const struct Mch_Match *Match, const char *Anchor); @@ -284,7 +284,7 @@ void Mch_ListMatches (struct Gam_Games *Games, Hlp_ASSESSMENT_Games_matches,Box_NOT_CLOSABLE); /***** Select whether show only my groups or all groups *****/ - if (Gbl.Crs.Grps.NumGrps && Mch_CheckIfICanEditMatches ()) + if (Gbl.Crs.Grps.NumGrps && Mch_CheckIfICanEditMatches () == Usr_I_CAN) { Set_BeginSettingsHead (); Grp_ShowFormToSelWhichGrps (ActSeeOneGam,Gam_PutPars,Games); @@ -328,15 +328,10 @@ void Mch_GetMatchDataByCod (struct Mch_Match *Match) static void Mch_PutIconsInListOfMatches (void *Games) { - bool ICanEditMatches; - if (Games) - { - /***** Put icon to create a new match in current game *****/ - ICanEditMatches = Mch_CheckIfICanEditMatches (); - if (ICanEditMatches) + if (Mch_CheckIfICanEditMatches () == Usr_I_CAN) + /***** Put icon to create a new match in current game *****/ Mch_PutIconToCreateNewMatch ((struct Gam_Games *) Games); - } } /*****************************************************************************/ @@ -362,7 +357,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games, unsigned UniqueId; struct Mch_Match Match; char *Anchor; - bool ICanEditMatches = Mch_CheckIfICanEditMatches (); + Usr_ICan_t ICanEditMatches = Mch_CheckIfICanEditMatches (); long MchCodToBeEdited = PutFormMatch == Frm_PUT_FORM && Games->MchCod > 0 ? Games->MchCod : -1L; @@ -385,7 +380,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games, /***** Get match data from row *****/ Mch_GetMatchDataFromRow (mysql_res,&Match); - if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match)) + if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match) == Usr_I_CAN) { /***** Build anchor string *****/ if (asprintf (&Anchor,"mch_%ld",Match.MchCod) < 0) @@ -395,7 +390,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games, HTM_TR_Begin (NULL); /* Icons */ - if (ICanEditMatches) + if (ICanEditMatches == Usr_I_CAN) Mch_ListOneOrMoreMatchesIcons (Games,&Match,Anchor); /* Start/end date/time */ @@ -421,10 +416,11 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games, HTM_TR_End (); /***** Third row for this match used for edition ****/ - if (ICanEditMatches && PutFormMatch == Frm_PUT_FORM && // Editing... - Match.MchCod == MchCodToBeEdited) // ...this match + if (ICanEditMatches == Usr_I_CAN && + PutFormMatch == Frm_PUT_FORM && // Editing... + Match.MchCod == MchCodToBeEdited) // ...this match /***** Check if I can edit this match *****/ - if (Mch_CheckIfICanEditThisMatch (&Match)) + if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN) { HTM_TR_Begin (NULL); HTM_TD_Begin ("colspan=\"7\" class=\"LT %s\"", @@ -440,7 +436,8 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games, } /***** Put button to play a new match in this game *****/ - if (ICanEditMatches && PutFormMatch == Frm_PUT_FORM && + if (ICanEditMatches == Usr_I_CAN && + PutFormMatch == Frm_PUT_FORM && MchCodToBeEdited <= 0) { /* Reset match */ @@ -464,7 +461,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games, /***************** Put a column for match start and end times ****************/ /*****************************************************************************/ -static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches) +static void Mch_ListOneOrMoreMatchesHeading (Usr_ICan_t ICanEditMatches) { extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; extern const char *Txt_Match; @@ -476,7 +473,7 @@ static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches) HTM_TR_Begin (NULL); /***** Column for icons *****/ - if (ICanEditMatches) + if (ICanEditMatches == Usr_I_CAN) HTM_TH_Empty (1); /***** The rest of columns *****/ @@ -497,13 +494,13 @@ static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches) /*********************** Check if I can edit matches *************************/ /*****************************************************************************/ -static bool Mch_CheckIfICanEditMatches (void) +static Usr_ICan_t Mch_CheckIfICanEditMatches (void) { - static const bool ICanEditMatches[Rol_NUM_ROLES] = + static Usr_ICan_t ICanEditMatches[Rol_NUM_ROLES] = { - [Rol_NET ] = true, - [Rol_TCH ] = true, - [Rol_SYS_ADM] = true, + [Rol_NET ] = Usr_I_CAN, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanEditMatches[Gbl.Usrs.Me.Role.Logged]; @@ -513,20 +510,21 @@ static bool Mch_CheckIfICanEditMatches (void) /***************** Check if I can edit (remove/resume) a match ***************/ /*****************************************************************************/ -static bool Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match) +static Usr_ICan_t Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match) { if (Match->MchCod <= 0) - return true; + return Usr_I_CAN; switch (Gbl.Usrs.Me.Role.Logged) { case Rol_NET: - return (Match->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod); // Only if I am the creator + return (Match->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN : // Only if I am the creator + Usr_I_CAN_NOT; case Rol_TCH: case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -534,14 +532,13 @@ static bool Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match) /*********** Check if visibility of match results can be changed *************/ /*****************************************************************************/ -static bool Mch_CheckIfVisibilityOfResultsCanBeChanged (const struct Mch_Match *Match) +static Usr_ICan_t Mch_CheckIfICanChangeVisibilityOfResults (const struct Mch_Match *Match) { if (Match->Status.ShowUsrResults || // Results are currently visible Match->Status.Showing == Mch_END) // Match has finished - if (Mch_CheckIfICanEditThisMatch (Match)) - return true; + return Mch_CheckIfICanEditThisMatch (Match); - return false; + return Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -554,17 +551,15 @@ static void Mch_ListOneOrMoreMatchesIcons (struct Gam_Games *Games, { HTM_TD_Begin ("rowspan=\"2\" class=\"BT %s\"",The_GetColorRows ()); - if (Mch_CheckIfICanEditThisMatch (Match)) + if (Mch_CheckIfICanEditThisMatch (Match) == Usr_I_CAN) { Games->MchCod = Match->MchCod; /***** Put icon to remove the match *****/ - Ico_PutContextualIconToRemove (ActReqRemMch,NULL, - Mch_PutParsEdit,Games); + Ico_PutContextualIconToRemove (ActReqRemMch,NULL,Mch_PutParsEdit,Games); /***** Put icon to edit the match *****/ - Ico_PutContextualIconToEdit (ActReqChgMch,Anchor, - Mch_PutParsEdit,Games); + Ico_PutContextualIconToEdit (ActReqChgMch,Anchor,Mch_PutParsEdit,Games); } else Ico_PutIconRemovalNotAllowed (); @@ -834,13 +829,13 @@ static void Mch_ListOneOrMoreMatchesResultTch (struct Gam_Games *Games, Games->MchCod = Match->MchCod; /***** Show match results *****/ - if (Mch_CheckIfICanEditThisMatch (Match)) + if (Mch_CheckIfICanEditThisMatch (Match) == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (ActSeeUsrMchResMch,MchRes_RESULTS_BOX_ID, Mch_PutParsEdit,Games, "trophy.svg",Ico_BLACK); /***** Check if visibility of session results can be changed *****/ - if (Mch_CheckIfVisibilityOfResultsCanBeChanged (Match)) + if (Mch_CheckIfICanChangeVisibilityOfResults (Match) == Usr_I_CAN) { /* I can edit visibility */ if (Match->Status.ShowUsrResults) @@ -880,7 +875,7 @@ void Mch_ToggleVisResultsMchUsr (void) Mch_GetAndCheckPars (&Games,&Match); /***** Check if visibility of match results can be changed *****/ - if (!Mch_CheckIfVisibilityOfResultsCanBeChanged (&Match)) + if (Mch_CheckIfICanChangeVisibilityOfResults (&Match) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Toggle visibility of match results *****/ @@ -1028,7 +1023,7 @@ void Mch_RemoveMatch (void) Mch_GetAndCheckPars (&Games,&Match); /***** Check if I can remove this match *****/ - if (!Mch_CheckIfICanEditThisMatch (&Match)) + if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Remove the match from all database tables *****/ @@ -1124,7 +1119,7 @@ void Mch_ReqCreatOrEditMatch (void) Mch_GetAndCheckPars (&Games,&Match); /***** Check if I can edit this match *****/ - if (!Mch_CheckIfICanEditThisMatch (&Match)) + if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Show game *****/ @@ -1332,7 +1327,7 @@ void Mch_ChangeMatch (void) Mch_GetAndCheckPars (&Games,&Match); /***** Check if I can update this match *****/ - if (!Mch_CheckIfICanEditThisMatch (&Match)) + if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get match title and groups *****/ @@ -1390,7 +1385,7 @@ void Mch_ResumeMatch (void) Mch_GetMatchDataByCod (&Match); /***** Check if I have permission to resume match *****/ - if (!Mch_CheckIfICanEditThisMatch (&Match)) + if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Update match status in database *****/ @@ -1987,7 +1982,7 @@ static void Mch_ShowMatchStatusForStd (struct Mch_Match *Match,Mch_Update_t Upda struct Mch_UsrAnswer UsrAnswer; /***** Can I play this match? *****/ - if (!Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match)) + if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get student's answer to this question @@ -2008,7 +2003,7 @@ static void Mch_ShowMatchStatusForStd (struct Mch_Match *Match,Mch_Update_t Upda /************ Check if I belong to any of the groups of a match **************/ /*****************************************************************************/ -bool Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match) +Usr_ICan_t Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match) { switch (Gbl.Usrs.Me.Role.Logged) { @@ -2018,12 +2013,13 @@ bool Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match) return Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (Match->MchCod); case Rol_NET: /***** Only if I am the creator *****/ - return (Match->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod); + return (Match->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Rol_TCH: case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } diff --git a/swad_match.h b/swad_match.h index d9562c719..744e96a6f 100644 --- a/swad_match.h +++ b/swad_match.h @@ -126,7 +126,7 @@ void Mch_ToggleVisResultsMchQst (void); void Mch_BackMatch (void); void Mch_ForwardMatch (void); -bool Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match); +Usr_ICan_t Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match); bool Mch_RegisterMeAsPlayerInMatch (struct Mch_Match *Match); diff --git a/swad_match_database.c b/swad_match_database.c index fa20e0535..92ceac5e9 100644 --- a/swad_match_database.c +++ b/swad_match_database.c @@ -569,7 +569,7 @@ unsigned Mch_DB_GetGrpNamesAssociatedToMatch (MYSQL_RES **mysql_res,long MchCod) /************ Check if I belong to any of the groups of a match **************/ /*****************************************************************************/ -bool Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (long MchCod) +Usr_ICan_t Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (long MchCod) { return DB_QueryEXISTS ("can not check if I can play a match", @@ -588,7 +588,8 @@ bool Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (long MchCod) " WHERE grp_users.UsrCod=%ld" " AND grp_users.GrpCod=mch_groups.GrpCod)))", MchCod, - Gbl.Usrs.Me.UsrDat.UsrCod); + Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ diff --git a/swad_match_database.h b/swad_match_database.h index 32db3942b..9a6312b91 100644 --- a/swad_match_database.h +++ b/swad_match_database.h @@ -66,7 +66,7 @@ void Mch_DB_AssociateGroupToMatch (long MchCod,long GrpCod); unsigned Mch_DB_GetGrpCodsAssociatedToMatch (MYSQL_RES **mysql_res,long MchCod); unsigned Mch_DB_GetGrpNamesAssociatedToMatch (MYSQL_RES **mysql_res,long MchCod); -bool Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (long MchCod); +Usr_ICan_t Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (long MchCod); void Mch_DB_RemoveGroup (long GrpCod); void Mch_DB_RemoveGroupsOfType (long GrpTypCod); diff --git a/swad_match_result.c b/swad_match_result.c index 6d3f643ab..940d0cd5d 100644 --- a/swad_match_result.c +++ b/swad_match_result.c @@ -63,8 +63,8 @@ extern struct Globals Gbl; struct MchRes_ICanView { - bool Result; - bool Score; + Usr_ICan_t Result; + Usr_ICan_t Score; }; /*****************************************************************************/ @@ -304,7 +304,7 @@ static void MchRes_ListAllMchResultsInSelectedGames (struct Gam_Games *Games) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, Usr_DONT_GET_PREFS, Usr_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Show matches results *****/ Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); @@ -335,7 +335,7 @@ static void MchRes_PutFormToSelUsrsToViewMchResults (__attribute__((unused)) voi Txt_Results, Hlp_ASSESSMENT_Games_results, Txt_View_results, - false); // Do not put form with date range + Frm_DONT_PUT_FORM); // Do not put form with date range } /*****************************************************************************/ @@ -395,7 +395,7 @@ static void MchRes_ListAllMchResultsInGam (struct Gam_Games *Games) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, Usr_DONT_GET_PREFS, Usr_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Show matches results *****/ Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); @@ -467,7 +467,7 @@ static void MchRes_ListAllMchResultsInMch (struct Gam_Games *Games,long MchCod) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, Usr_DONT_GET_PREFS, Usr_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Show matches results *****/ Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); @@ -778,7 +778,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games, HTM_TD_End (); /* Accumulate questions and score */ - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { NumTotalQsts.All += Print.NumQsts.All; NumTotalQsts.NotBlank += Print.NumQsts.NotBlank; @@ -789,7 +789,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games, HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) HTM_Unsigned (Print.NumQsts.All); else Ico_PutIconNotVisible (); @@ -799,7 +799,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games, HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { if (Print.NumQsts.NotBlank) HTM_Unsigned (Print.NumQsts.NotBlank); @@ -815,7 +815,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games, The_GetSuffix (), The_GetColorRows ()); NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank; - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { if (NumQstsBlank) HTM_Unsigned (NumQstsBlank); @@ -830,7 +830,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games, HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { HTM_Double2Decimals (Print.Score); HTM_Txt ("/"); @@ -844,7 +844,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games, HTM_TD_Begin ("class=\"RT DAT_%s %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) HTM_Double2Decimals (Print.NumQsts.All ? Print.Score / (double) Print.NumQsts.All : 0.0); @@ -856,7 +856,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games, HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { Grade = TstPrn_ComputeGrade (Print.NumQsts.All,Print.Score,Games->Game.MaxGrade); TstPrn_ShowGrade (Grade,Games->Game.MaxGrade); @@ -869,7 +869,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games, /* Link to show this result */ HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"", The_GetColorRows ()); - if (ICanView.Result) + if (ICanView.Result == Usr_I_CAN) { Games->Game.GamCod = Match.GamCod; Games->MchCod = Match.MchCod; @@ -1084,7 +1084,7 @@ void MchRes_ShowOneMchResult (void) /***** Check if I can view this match result and score *****/ MchRes_CheckIfICanViewMatchResult (&Games.Game,&Match,UsrDat->UsrCod,&ICanView); - if (!ICanView.Result) + if (ICanView.Result == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get questions and user's answers of the match result from database *****/ @@ -1104,7 +1104,7 @@ void MchRes_ShowOneMchResult (void) Usr_DONT_GET_PREFS, Usr_GET_ROLE_IN_CRS)) Err_WrongUserExit (); - if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (UsrDat) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /* Get if user has accepted enrolment */ @@ -1201,7 +1201,7 @@ void MchRes_ShowOneMchResult (void) HTM_TD_Begin ("class=\"LB DAT_%s\"", The_GetSuffix ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { HTM_STRONG_Begin (); HTM_Double2Decimals (Print.Score); @@ -1225,7 +1225,7 @@ void MchRes_ShowOneMchResult (void) HTM_TD_Begin ("class=\"LB DAT_%s\"", The_GetSuffix ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { HTM_STRONG_Begin (); TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Games.Game.MaxGrade); @@ -1282,15 +1282,17 @@ static void MchRes_CheckIfICanViewMatchResult (const struct Gam_Game *Game, // Depends on visibility of game and result (eye icons) ICanView->Result = (Game->HiddenOrVisible == HidVis_VISIBLE && // The game is visible Match->Status.ShowUsrResults && // The results of the match are visible to users - Usr_ItsMe (UsrCod) == Usr_ME); // The result is mine + Usr_ItsMe (UsrCod) == Usr_ME) ? Usr_I_CAN : // The result is mine + Usr_I_CAN_NOT; // Whether I belong or not to groups of match is not checked here... // ...because I should be able to see old matches made in old groups to which I belonged - if (ICanView->Result) + if (ICanView->Result == Usr_I_CAN) // Depends on 5 visibility icons associated to game - ICanView->Score = TstVis_IsVisibleTotalScore (Game->Visibility); + ICanView->Score = TstVis_IsVisibleTotalScore (Game->Visibility) ? Usr_I_CAN : + Usr_I_CAN_NOT; else - ICanView->Score = false; + ICanView->Score = Usr_I_CAN_NOT; break; case Rol_NET: case Rol_TCH: @@ -1299,11 +1301,11 @@ static void MchRes_CheckIfICanViewMatchResult (const struct Gam_Game *Game, case Rol_INS_ADM: case Rol_SYS_ADM: ICanView->Result = - ICanView->Score = true; + ICanView->Score = Usr_I_CAN; break; default: ICanView->Result = - ICanView->Score = false; + ICanView->Score = Usr_I_CAN_NOT; break; } } diff --git a/swad_nickname.c b/swad_nickname.c index e83341ece..514309ec6 100644 --- a/swad_nickname.c +++ b/swad_nickname.c @@ -424,7 +424,7 @@ void Nck_RemoveOtherUsrNick (void) /***** Get user whose nick must be removed *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Get nickname from form *****/ Par_GetParText ("Nick",NickWithoutArr, @@ -470,7 +470,7 @@ void Nck_ChangeOtherUsrNick (void) /***** Get user whose nick must be changed *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Update user's nickname *****/ Nck_ChangeUsrNick (&Gbl.Usrs.Other.UsrDat); diff --git a/swad_notice.c b/swad_notice.c index 135e17ab4..224a6e0b1 100644 --- a/swad_notice.c +++ b/swad_notice.c @@ -78,7 +78,7 @@ static unsigned Not_MaxCharsURLOnScreen[Not_NUM_TYPES_LISTING] = static void Not_PutLinkToRSSFile (void); -static bool Not_CheckIfICanEditNotices (void); +static Usr_ICan_t Not_CheckIfICanEditNotices (void); static void Not_PutIconsListNotices (__attribute__((unused)) void *Args); static void Not_PutIconToAddNewNotice (void); static void Not_GetDataAndShowNotice (long NotCod); @@ -401,10 +401,11 @@ static void Not_PutLinkToRSSFile (void) /*********************** Check if I can edit notices *************************/ /*****************************************************************************/ -static bool Not_CheckIfICanEditNotices (void) +static Usr_ICan_t Not_CheckIfICanEditNotices (void) { - return Gbl.Usrs.Me.Role.Logged == Rol_TCH || - Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; + return (Gbl.Usrs.Me.Role.Logged == Rol_TCH || + Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -414,7 +415,7 @@ static bool Not_CheckIfICanEditNotices (void) static void Not_PutIconsListNotices (__attribute__((unused)) void *Args) { /***** Put icon to add a new notice *****/ - if (Not_CheckIfICanEditNotices ()) + if (Not_CheckIfICanEditNotices () == Usr_I_CAN) Not_PutIconToAddNewNotice (); /***** Put icon to show a figure *****/ @@ -551,7 +552,7 @@ static void Not_DrawANotice (Not_Listing_t TypeNoticesListing, /***** Write the date in the top part of the yellow note *****/ /* Write symbol to indicate if notice is obsolete or active */ if (TypeNoticesListing == Not_LIST_FULL_NOTICES) - if (Not_CheckIfICanEditNotices ()) + if (Not_CheckIfICanEditNotices () == Usr_I_CAN) { /***** Icon to remove announcement *****/ Ico_PutContextualIconToRemove (ActReqRemNot,NULL, diff --git a/swad_password.c b/swad_password.c index 83ab3e096..c3ecd5239 100644 --- a/swad_password.c +++ b/swad_password.c @@ -177,7 +177,7 @@ void Pwd_UpdateOtherUsrPwd (void) /***** Get other user's code from form and get user's data *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) /***** Check and update password *****/ Pwd_CheckAndUpdateNewPwd (&Gbl.Usrs.Other.UsrDat); else diff --git a/swad_photo.c b/swad_photo.c index 0cf8c57f8..071ad6d00 100644 --- a/swad_photo.c +++ b/swad_photo.c @@ -141,11 +141,11 @@ static void Pho_ComputePhotoSize (const struct Pho_DegPhotos *DegPhotos, /************** Check if I can change the photo of another user **************/ /*****************************************************************************/ -bool Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat) +Usr_ICan_t Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat) { /***** I can change my photo *****/ if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - return true; + return Usr_I_CAN; /***** Check if I have permission to change user's photo *****/ switch (Gbl.Usrs.Me.Role.Logged) @@ -153,18 +153,19 @@ bool Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat) case Rol_TCH: /* A teacher can change the photo of confirmed students */ if (UsrDat->Roles.InCurrentCrs != Rol_STD) // Not a student - return false; + return Usr_I_CAN_NOT; /* It's a student in this course, check if he/she has accepted registration */ - return (UsrDat->Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (UsrDat)); + return (UsrDat->Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (UsrDat)) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Rol_DEG_ADM: case Rol_CTR_ADM: case Rol_INS_ADM: case Rol_SYS_ADM: - return Usr_ICanEditOtherUsr (UsrDat); + return Usr_CheckIfICanEditOtherUsr (UsrDat); default: - return false; + return Usr_I_CAN_NOT; } } @@ -198,7 +199,7 @@ void Pho_PutIconToChangeUsrPhoto (struct Usr_Data *UsrDat) break; case Usr_OTHER: default: - if (Pho_ICanChangeOtherUsrPhoto (UsrDat)) + if (Pho_ICanChangeOtherUsrPhoto (UsrDat) == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL, Rec_PutParUsrCodEncrypted,NULL, "camera.svg",Ico_BLACK); @@ -354,7 +355,7 @@ void Pho_SendPhotoUsr (void) } /***** Check if I have permission to change user's photo *****/ - if (!Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat)) + if (Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN_NOT) { Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); return; @@ -521,7 +522,7 @@ void Pho_ReqRemUsrPhoto (void) Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) { - if (Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat)) + if (Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Show current photo and help message *****/ if (Pho_BuildLinkToPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL)) @@ -991,14 +992,9 @@ void Pho_ShowUsrPhotoIfAllowed (struct Usr_Data *UsrDat, bool Pho_ShowingUsrPhotoIsAllowed (struct Usr_Data *UsrDat, char PhotoURL[Cns_MAX_BYTES_WWW + 1]) { - bool ICanSeePhoto; - - /***** Check if I can see the other's photo *****/ - ICanSeePhoto = Pri_ShowingIsAllowed (UsrDat->PhotoVisibility,UsrDat); - /***** Photo is shown if I can see it, and it exists *****/ - return ICanSeePhoto ? Pho_BuildLinkToPhoto (UsrDat,PhotoURL) : - false; + return (Pri_CheckIfICanView (UsrDat->PhotoVisibility,UsrDat) == Usr_I_CAN) ? Pho_BuildLinkToPhoto (UsrDat,PhotoURL) : + false; } /*****************************************************************************/ diff --git a/swad_photo.h b/swad_photo.h index 208027ea3..79e7594d8 100644 --- a/swad_photo.h +++ b/swad_photo.h @@ -95,7 +95,7 @@ struct Pho_DegPhotos /***************************** Public prototypes *****************************/ /*****************************************************************************/ -bool Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat); +Usr_ICan_t Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat); void Pho_PutIconToChangeUsrPhoto (struct Usr_Data *UsrDat); void Pho_ReqMyPhoto (void); void Pho_SendPhotoUsr (void); diff --git a/swad_place.c b/swad_place.c index f75ff5454..c8aec25fa 100644 --- a/swad_place.c +++ b/swad_place.c @@ -45,17 +45,6 @@ #include "swad_place.h" #include "swad_place_database.h" -/*****************************************************************************/ -/****************************** Private constants ****************************/ -/*****************************************************************************/ - -static const bool Plc_ICanEditPlaces[Rol_NUM_ROLES] = - { - /* Users who can edit */ - [Rol_INS_ADM] = true, - [Rol_SYS_ADM] = true, - }; - /*****************************************************************************/ /************** External global variables from others modules ****************/ /*****************************************************************************/ @@ -72,6 +61,8 @@ static struct Plc_Place *Plc_EditingPlc = NULL; // Static variable to keep the p /***************************** Private prototypes ****************************/ /*****************************************************************************/ +static bool Plc_CheckIfICanEditPlaces (void); + static Plc_Order_t Plc_GetParPlcOrder (void); static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args); static void Plc_PutIconToEditPlaces (void); @@ -91,6 +82,22 @@ static void Plc_PutHeadPlaces (void); static void Plc_EditingPlaceConstructor (void); static void Plc_EditingPlaceDestructor (void); +/*****************************************************************************/ +/************************* Check if I can edit places ************************/ +/*****************************************************************************/ + +static bool Plc_CheckIfICanEditPlaces (void) + { + static bool Plc_ICanEditPlaces[Rol_NUM_ROLES] = + { + /* Users who can edit */ + [Rol_INS_ADM] = true, + [Rol_SYS_ADM] = true, + }; + + return Plc_ICanEditPlaces[Gbl.Usrs.Me.Role.Logged]; + } + /*****************************************************************************/ /**************************** Reset places context ***************************/ /*****************************************************************************/ @@ -231,7 +238,7 @@ static Plc_Order_t Plc_GetParPlcOrder (void) static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args) { /***** Put icon to edit places *****/ - if (Plc_ICanEditPlaces[Gbl.Usrs.Me.Role.Logged]) + if (Plc_CheckIfICanEditPlaces ()) Plc_PutIconToEditPlaces (); } @@ -241,8 +248,7 @@ static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args) static void Plc_PutIconToEditPlaces (void) { - Ico_PutContextualIconToEdit (ActEdiPlc,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiPlc,NULL,NULL,NULL); } /*****************************************************************************/ @@ -298,8 +304,7 @@ static void Plc_EditPlacesInternal (void) static void Plc_PutIconsEditingPlaces (__attribute__((unused)) void *Args) { /***** Put icon to view places *****/ - Ico_PutContextualIconToView (ActSeePlc,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeePlc,NULL,NULL,NULL); } /*****************************************************************************/ @@ -467,7 +472,7 @@ static void Plc_ListPlacesForEdition (const struct Plc_Places *Places) Nam_ExistingShortAndFullNames (ActionRename, ParCod_Plc,Plc->PlcCod, Names, - true); // Put form + Frm_PUT_FORM); /* Number of centers */ HTM_TD_Unsigned (Plc->NumCtrs); diff --git a/swad_plugin.c b/swad_plugin.c index 2a174c6b6..d3200dfe5 100644 --- a/swad_plugin.c +++ b/swad_plugin.c @@ -184,8 +184,7 @@ void Plg_ListPlugins (void) static void Plg_PutIconToEditPlugins (__attribute__((unused)) void *Args) { - Ico_PutContextualIconToEdit (ActEdiPlg,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiPlg,NULL,NULL,NULL); } /*****************************************************************************/ @@ -194,8 +193,7 @@ static void Plg_PutIconToEditPlugins (__attribute__((unused)) void *Args) static void Plg_PutIconToViewPlugins (__attribute__((unused)) void *Args) { - Ico_PutContextualIconToView (ActSeePlg,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeePlg,NULL,NULL,NULL); } /*****************************************************************************/ diff --git a/swad_privacy.c b/swad_privacy.c index 1ce598914..d9fbd31aa 100644 --- a/swad_privacy.c +++ b/swad_privacy.c @@ -246,40 +246,43 @@ Pri_Visibility_t Pri_GetParVisibility (const char *ParName, } /*****************************************************************************/ -/*********** Check if user's photo of public profile can be shown ************/ +/*********** Check if user's photo or public profile can be shown ************/ /*****************************************************************************/ -// Returns true if it can be shown and false if not. -bool Pri_ShowingIsAllowed (Pri_Visibility_t Visibility,struct Usr_Data *UsrDat) +Usr_ICan_t Pri_CheckIfICanView (Pri_Visibility_t Visibility, + struct Usr_Data *UsrDat) { /***** I always can see my things *****/ if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - return true; + return Usr_I_CAN; /***** System admins always can see others' profiles *****/ if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) - return true; + return Usr_I_CAN; /***** Check if I can see the other's photo *****/ switch (Visibility) { case Pri_VISIBILITY_UNKNOWN: - return false; // It's not me + return Usr_I_CAN_NOT; // It's not me case Pri_VISIBILITY_USER: // Only visible // by me and my teachers if I am a student // or me and my students if I am a teacher // Do both users share the same course but whit different role? - return Enr_DB_CheckIfUsrSharesAnyOfMyCrsWithDifferentRole (UsrDat->UsrCod); + return Enr_DB_CheckIfUsrSharesAnyOfMyCrsWithDifferentRole (UsrDat->UsrCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Pri_VISIBILITY_COURSE: // Visible by users sharing courses with me // Do both users share the same course? - return Enr_CheckIfUsrSharesAnyOfMyCrs (UsrDat); + return Enr_CheckIfUsrSharesAnyOfMyCrs (UsrDat) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Pri_VISIBILITY_SYSTEM: // Visible by any user logged in platform - return Gbl.Usrs.Me.Logged; + return Gbl.Usrs.Me.Logged ? Usr_I_CAN : + Usr_I_CAN_NOT; case Pri_VISIBILITY_WORLD: // Public, visible by everyone, even unlogged visitors - return true; + return Usr_I_CAN; } - return false; // Never reached. To avoid warning + return Usr_I_CAN_NOT; // Never reached. To avoid warning } /*****************************************************************************/ diff --git a/swad_privacy.h b/swad_privacy.h index 06c7de9c5..9432ede05 100644 --- a/swad_privacy.h +++ b/swad_privacy.h @@ -65,7 +65,7 @@ Pri_Visibility_t Pri_GetVisibilityFromStr (const char *Str); Pri_Visibility_t Pri_GetParVisibility (const char *ParName, unsigned MaskAllowedVisibility); -bool Pri_ShowingIsAllowed (Pri_Visibility_t Visibility,struct Usr_Data *UsrDat); +Usr_ICan_t Pri_CheckIfICanView (Pri_Visibility_t Visibility,struct Usr_Data *UsrDat); //-------------------------------- Figures ------------------------------------ void Pri_GetAndShowNumUsrsPerPrivacy (void); diff --git a/swad_profile.c b/swad_profile.c index 8bf939e48..ddb16e039 100644 --- a/swad_profile.c +++ b/swad_profile.c @@ -289,7 +289,7 @@ bool Prf_ShowUsrProfile (struct Usr_Data *UsrDat) Usr_MeOrOther_t MeOrOther = Usr_ItsMe (UsrDat->UsrCod); /***** Check if I can see the public profile *****/ - if (Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat)) + if (Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat) == Usr_I_CAN) { if (Gbl.Usrs.Me.Logged) { @@ -314,7 +314,7 @@ bool Prf_ShowUsrProfile (struct Usr_Data *UsrDat) Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_PUBLIC,UsrDat,NULL); /***** Extended profile *****/ - if (Pri_ShowingIsAllowed (UsrDat->ExPrfVisibility,UsrDat)) + if (Pri_CheckIfICanView (UsrDat->ExPrfVisibility,UsrDat) == Usr_I_CAN) { /***** Show details of user's profile *****/ Prf_ShowDetailsUserProfile (UsrDat); @@ -1337,7 +1337,7 @@ static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank, [PhoSha_SHAPE_OVAL ] = "PHOTOO30x40", [PhoSha_SHAPE_RECTANGLE] = "PHOTOR30x40", }; - bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat); + bool Visible = (Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat) == Usr_I_CAN); HTM_TD_Begin ("class=\"RM %s_%s %s\"", Class[MeOrOther], diff --git a/swad_program.c b/swad_program.c index 0a6434087..be10b6fa9 100644 --- a/swad_program.c +++ b/swad_program.c @@ -323,10 +323,11 @@ void Prg_ShowAllItems (Prg_ListingType_t ListingType, /******************* Check if I can create program items *********************/ /*****************************************************************************/ -bool Prg_CheckIfICanEditProgram (void) +Usr_ICan_t Prg_CheckIfICanEditProgram (void) { - return Gbl.Usrs.Me.Role.Logged == Rol_TCH || - Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; + return (Gbl.Usrs.Me.Role.Logged == Rol_TCH || + Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -336,7 +337,7 @@ bool Prg_CheckIfICanEditProgram (void) static void Prg_PutIconsListItems (__attribute__((unused)) void *Args) { /***** Put icon to edit program *****/ - if (Prg_CheckIfICanEditProgram ()) + if (Prg_CheckIfICanEditProgram () == Usr_I_CAN) Prg_PutIconToEditProgram (); /***** Put icon to show a figure *****/ @@ -352,7 +353,7 @@ static void Prg_PutIconsEditItems (__attribute__((unused)) void *Args) /***** Put icon to view program *****/ Prg_PutIconToViewProgram (); - if (Prg_CheckIfICanEditProgram ()) + if (Prg_CheckIfICanEditProgram () == Usr_I_CAN) { /***** Put icon to create a new program item *****/ Prg_PutIconToCreateNewItem (); @@ -371,8 +372,7 @@ static void Prg_PutIconsEditItems (__attribute__((unused)) void *Args) static void Prg_PutIconToEditProgram (void) { - Ico_PutContextualIconToEdit (ActEdiPrg,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiPrg,NULL,NULL,NULL); } /*****************************************************************************/ @@ -381,8 +381,7 @@ static void Prg_PutIconToEditProgram (void) static void Prg_PutIconToViewProgram (void) { - Ico_PutContextualIconToView (ActSeePrg,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeePrg,NULL,NULL,NULL); } /*****************************************************************************/ @@ -403,8 +402,7 @@ static void Prg_PutIconToCreateNewItem (void) static void Prg_PutIconToViewResourceClipboard (void) { - Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InPrg,NULL, - NULL,NULL); + Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InPrg,NULL,NULL,NULL); } /*****************************************************************************/ diff --git a/swad_program.h b/swad_program.h index 9d8fdc627..f62301abc 100644 --- a/swad_program.h +++ b/swad_program.h @@ -121,7 +121,7 @@ void Prg_EditCourseProgram (void); void Prg_ShowAllItems (Prg_ListingType_t ListingType, long SelectedItmCod,long SelectedRscCod); -bool Prg_CheckIfICanEditProgram (void); +Usr_ICan_t Prg_CheckIfICanEditProgram (void); void Prg_PutParItmCod (void *ItmCod); void Prg_GetPars (struct Prg_Item *Item); diff --git a/swad_program_resource.c b/swad_program_resource.c index 5ff161077..e326738b2 100644 --- a/swad_program_resource.c +++ b/swad_program_resource.c @@ -305,7 +305,7 @@ static void PrgRsc_PutIconsViewResources (void *ItmCod) /***** Put icon to create a new item resource *****/ if (ItmCod) if (*(long *) ItmCod > 0) - if (Prg_CheckIfICanEditProgram ()) + if (Prg_CheckIfICanEditProgram () == Usr_I_CAN) Ico_PutContextualIconToView (ActFrmSeePrgRsc,PrgRsc_RESOURCE_SECTION_ID, Prg_PutParItmCod,ItmCod); } @@ -315,7 +315,7 @@ static void PrgRsc_PutIconsEditResources (void *ItmCod) /***** Put icon to create a new item resource *****/ if (ItmCod) if (*(long *) ItmCod > 0) - if (Prg_CheckIfICanEditProgram ()) + if (Prg_CheckIfICanEditProgram () == Usr_I_CAN) Ico_PutContextualIconToEdit (ActFrmEdiPrgRsc,PrgRsc_RESOURCE_SECTION_ID, Prg_PutParItmCod,ItmCod); } @@ -895,7 +895,7 @@ static void PrgRsc_ShowClipboard (void) static void PrgRsc_PutIconsClipboard (__attribute__((unused)) void *Args) { /***** Put icon to remove resource clipboard in program *****/ - if (Prg_CheckIfICanEditProgram ()) + if (Prg_CheckIfICanEditProgram () == Usr_I_CAN) if (Rsc_DB_GetNumResourcesInClipboard ()) // Only if there are resources Ico_PutContextualIconToRemove (ActRemRscCli_InPrg,NULL, NULL,NULL); diff --git a/swad_project.c b/swad_project.c index 128f53642..46a375063 100644 --- a/swad_project.c +++ b/swad_project.c @@ -189,7 +189,7 @@ static void Prj_ShowFormToFilterByWarning (const struct Prj_Projects *Projects); static void Prj_ShowFormToFilterByReview (const struct Prj_Projects *Projects); static void Prj_ShowFormToFilterByDpt (const struct Prj_Projects *Projects); -static bool Prj_CheckIfICanViewProjectFiles (long PrjCod); +static Usr_ICan_t Prj_CheckIfICanViewProjectFiles (long PrjCod); static void Prj_PutParAssign (unsigned Assign); static void Prj_PutParHidden (unsigned Hidden); @@ -205,7 +205,7 @@ static Usr_Who_t Prj_GetParWho (void); static void Prj_ShowProjectsHead (struct Prj_Projects *Projects); static void Prj_ShowTableAllProjectsHead (void); -static bool Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects); +static Usr_ICan_t Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects); static void Prj_PutIconToCreateNewPrj (struct Prj_Projects *Projects); static void Prj_PutIconToShowAllData (struct Prj_Projects *Projects); @@ -226,7 +226,7 @@ static void Prj_ShowReviewStatus (struct Prj_Projects *Projects, const struct Prj_Faults *Faults, const char *Anchor); static void Prj_PutSelectorReviewStatus (struct Prj_Projects *Projects); -static bool Prj_CheckIfICanReviewProjects (void); +static Usr_ICan_t Prj_CheckIfICanReviewProjects (void); static void Prj_ShowAssigned (const struct Prj_Projects *Projects, const char *ClassLabel, const char *ClassData, @@ -288,7 +288,7 @@ static Prj_Order_t Prj_GetParPrjOrder (void); static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects, const char *Anchor); -static bool Prj_CheckIfICanEditProject (const struct Prj_Project *Prj); +static Usr_ICan_t Prj_CheckIfICanEditProject (const struct Prj_Project *Prj); static void Prj_GetListProjects (struct Prj_Projects *Projects); @@ -317,8 +317,8 @@ static Prj_ReviewStatus_t Prj_GetParReviewStatus (void); static void Prj_ShowRubrics (struct Prj_Projects *Projects); static void Prj_ShowRubricsOfType (struct Prj_Projects *Projects, PrjCfg_RubricType_t RubricType); -static bool Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric); -static bool Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric); +static Usr_ICan_t Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric); +static Usr_ICan_t Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric); /*****************************************************************************/ /******* Set/get project code (used to pass parameter to file browser) *******/ @@ -396,7 +396,7 @@ static void Prj_ReqUsrsToSelect (void *Projects) Txt_Projects, Hlp_ASSESSMENT_Projects, Txt_View_projects, - false); // Do not put form with date range + Frm_DONT_PUT_FORM); // Do not put form with date range } /*****************************************************************************/ @@ -864,18 +864,19 @@ static void Prj_ShowFormToFilterByDpt (const struct Prj_Projects *Projects) /******************** Can I view files of a given project? *******************/ /*****************************************************************************/ -static bool Prj_CheckIfICanViewProjectFiles (long PrjCod) +static Usr_ICan_t Prj_CheckIfICanViewProjectFiles (long PrjCod) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: case Rol_NET: - return (Prj_GetMyRolesInProject (PrjCod) != 0); // Am I a member? + return (Prj_GetMyRolesInProject (PrjCod) != 0) ? Usr_I_CAN : // Am I a member? + Usr_I_CAN_NOT; case Rol_TCH: // Editing teachers in a course can access to all files case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -883,41 +884,41 @@ static bool Prj_CheckIfICanViewProjectFiles (long PrjCod) /******** Check if I have permission to view project documents zone **********/ /*****************************************************************************/ -bool Prj_CheckIfICanViewProjectDocuments (long PrjCod) +Usr_ICan_t Prj_CheckIfICanViewProjectDocuments (long PrjCod) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: case Rol_NET: - return (Prj_GetMyRolesInProject (PrjCod) != 0); // Am I a member? + return (Prj_GetMyRolesInProject (PrjCod) != 0) ? Usr_I_CAN : // Am I a member? + Usr_I_CAN_NOT; case Rol_TCH: // Editing teachers in a course can access to all files case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } - return false; } /*****************************************************************************/ /******** Check if I have permission to view project assessment zone *********/ /*****************************************************************************/ -bool Prj_CheckIfICanViewProjectAssessment (long PrjCod) +Usr_ICan_t Prj_CheckIfICanViewProjectAssessment (long PrjCod) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: case Rol_NET: - return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // Tutor... - 1 << Prj_ROLE_EVL)) != 0); // ...or evaluator + return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // Tutor... + 1 << Prj_ROLE_EVL)) != 0) ? Usr_I_CAN : // ...or evaluator + Usr_I_CAN_NOT; case Rol_TCH: // Editing teachers in a course can access to all files case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } - return false; } /*****************************************************************************/ @@ -1228,17 +1229,18 @@ static void Prj_ShowTableAllProjectsHead (void) /********************** Check if I can create projects ***********************/ /*****************************************************************************/ -static bool Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects) +static Usr_ICan_t Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_NET: - return Projects->Config.NETCanCreate; + return Projects->Config.NETCanCreate ? Usr_I_CAN : + Usr_I_CAN_NOT; case Rol_TCH: case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -1248,14 +1250,14 @@ static bool Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects) void Prj_PutIconsListProjects (void *Projects) { - bool ICanConfigAllProjects; + Usr_ICan_t ICanConfigAllProjects; if (Projects) { ICanConfigAllProjects = PrjCfg_CheckIfICanConfig (); /***** Put icon to create a new project *****/ - if (Prj_CheckIfICanCreateProjects ((struct Prj_Projects *) Projects)) + if (Prj_CheckIfICanCreateProjects ((struct Prj_Projects *) Projects) == Usr_I_CAN) Prj_PutIconToCreateNewPrj ((struct Prj_Projects *) Projects); if (((struct Prj_Projects *) Projects)->Num) @@ -1263,19 +1265,19 @@ void Prj_PutIconsListProjects (void *Projects) /***** Put icon to show all data in a table *****/ Prj_PutIconToShowAllData ((struct Prj_Projects *) Projects); - if (ICanConfigAllProjects) + if (ICanConfigAllProjects == Usr_I_CAN) /****** Put icons to request locking/unlocking edition of all selected projects *******/ Prj_PutIconsToLockUnlockAllProjects ((struct Prj_Projects *) Projects); } /***** Put form to go to configuration of projects *****/ - if (ICanConfigAllProjects) + if (ICanConfigAllProjects == Usr_I_CAN) Ico_PutContextualIconToConfigure (ActCfgPrj,NULL, NULL,NULL); /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) Ico_PutContextualIconToGetLink (ActReqLnkPrj,NULL, Prj_PutCurrentPars,Projects); @@ -1360,7 +1362,7 @@ void Prj_ShowBoxWithOneProject (struct Prj_Projects *Projects) HTM_FIELDSET_End (); /***** Show project file browsers *****/ - if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod)) + if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod) == Usr_I_CAN) Brw_ShowFileBrowserProject (Projects->Prj.PrjCod); /***** Show project rubrics *****/ @@ -1516,8 +1518,13 @@ static void Prj_ShowFirstRow (struct Prj_Projects *Projects, extern const char *HidVis_DateBlueClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *Txt_Actions[ActLst_NUM_ACTIONS]; - char *Id; + static Act_Action_t NextActions[Usr_NUM_I_CAN] = + { + [Usr_I_CAN_NOT] = ActSeeOnePrj, + [Usr_I_CAN ] = ActAdmDocPrj, + }; Act_Action_t NextAction; + char *Id; /***** Write first row of data of this project *****/ HTM_TR_Begin (NULL); @@ -1614,8 +1621,7 @@ static void Prj_ShowFirstRow (struct Prj_Projects *Projects, HTM_ARTICLE_Begin (Anchor); if (Projects->Prj.Title[0]) { - NextAction = Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod) ? ActAdmDocPrj : - ActSeeOnePrj; + NextAction = NextActions[Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod)]; Frm_BeginForm (NextAction); Prj_PutCurrentPars (Projects); HTM_BUTTON_Submit_Begin (Txt_Actions[NextAction], @@ -1703,8 +1709,8 @@ static void Prj_ShowReviewStatus (struct Prj_Projects *Projects, PutForm = Frm_DONT_PUT_FORM; break; default: - PutForm = Prj_CheckIfICanReviewProjects () ? Frm_PUT_FORM : - Frm_DONT_PUT_FORM; + PutForm = (Prj_CheckIfICanReviewProjects () == Usr_I_CAN) ? Frm_PUT_FORM : + Frm_DONT_PUT_FORM; break; } @@ -1869,12 +1875,12 @@ static void Prj_PutSelectorReviewStatus (struct Prj_Projects *Projects) /**************************** Can I review projects? *************************/ /*****************************************************************************/ -static bool Prj_CheckIfICanReviewProjects (void) +static Usr_ICan_t Prj_CheckIfICanReviewProjects (void) { - static bool ICanReviewProjects[Rol_NUM_ROLES] = + static Usr_ICan_t ICanReviewProjects[Rol_NUM_ROLES] = { - [Rol_TCH ] = true, - [Rol_SYS_ADM] = true, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanReviewProjects[Gbl.Usrs.Me.Role.Logged]; @@ -2877,7 +2883,7 @@ static void Prj_FormToSelectUsrs (struct Prj_Projects *Projects, TxtButton, Hlp_ASSESSMENT_Projects_add_user, TxtButton, - false); // Do not put form with date range + Frm_DONT_PUT_FORM); // Do not put form with date range free (TxtButton); /***** Put a form to create/edit project *****/ @@ -3045,7 +3051,7 @@ static void Prj_ReqRemUsrFromPrj (struct Prj_Projects *Projects, /***** Get user to be removed *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Prj_CheckIfICanEditProject (&Projects->Prj)) + if (Prj_CheckIfICanEditProject (&Projects->Prj) == Usr_I_CAN) { /***** Show question and button to remove user as a role from project *****/ /* Begin alert */ @@ -3123,7 +3129,7 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInPrj) /***** Get user to be removed *****/ if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) { - if (Prj_CheckIfICanEditProject (&Projects.Prj)) + if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN) { /***** Remove user from the table of project-users *****/ Prj_DB_RemoveUsrFromPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod); @@ -3177,7 +3183,7 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects, [HidVis_VISIBLE] = ActHidPrj, // Visible ==> action to hide }; - if (Prj_CheckIfICanEditProject (&Projects->Prj)) + if (Prj_CheckIfICanEditProject (&Projects->Prj) == Usr_I_CAN) { /***** Icon to remove project *****/ Ico_PutContextualIconToRemove (ActReqRemPrj,NULL, @@ -3190,11 +3196,11 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects, /***** Icon to edit project *****/ Ico_PutContextualIconToEdit (ActEdiOnePrj,NULL, - Prj_PutCurrentPars,Projects); + Prj_PutCurrentPars,Projects); } /***** Icon to admin project documents *****/ - if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod)) + if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod) == Usr_I_CAN) Ico_PutContextualIconToViewFiles (ActAdmDocPrj, Prj_PutCurrentPars,Projects); @@ -3202,7 +3208,7 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects, Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutCurrentPars,Projects); /***** Locked/unlocked project edition *****/ - if (PrjCfg_CheckIfICanConfig ()) + if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN) { /* Icon to lock/unlock project edition */ HTM_DIV_Begin ("id=\"prj_lck_%ld\" class=\"PRJ_LOCK\"", @@ -3215,7 +3221,7 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects, Prj_PutIconOffLockedUnlocked (&Projects->Prj); /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) Ico_PutContextualIconToGetLink (ActReqLnkPrj,NULL, Prj_PutCurrentPars,Projects); } @@ -3224,20 +3230,21 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects, /************************ Can I edit a given project? ************************/ /*****************************************************************************/ -static bool Prj_CheckIfICanEditProject (const struct Prj_Project *Prj) +static Usr_ICan_t Prj_CheckIfICanEditProject (const struct Prj_Project *Prj) { switch (Gbl.Usrs.Me.Role.Logged) { case Rol_NET: - if (Prj->Locked == Prj_LOCKED) // Locked edition - return false; - return (Prj_GetMyRolesInProject (Prj->PrjCod) & - (1 << Prj_ROLE_TUT)) != 0; // Am I a tutor? + if (Prj->Locked == Prj_LOCKED) // Locked edition + return Usr_I_CAN_NOT; + return ((Prj_GetMyRolesInProject (Prj->PrjCod) & + (1 << Prj_ROLE_TUT)) != 0) ? Usr_I_CAN : // Am I a tutor? + Usr_I_CAN_NOT; case Rol_TCH: case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -3502,7 +3509,7 @@ void Prj_ReqRemProject (void) Prj_GetProjectDataByCod (&Projects.Prj); /***** Check if I can edit this project *****/ - if (!Prj_CheckIfICanEditProject (&Projects.Prj)) + if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Show question and button to remove the project *****/ @@ -3542,7 +3549,7 @@ void Prj_RemoveProject (void) Prj_GetProjectDataByCod (&Projects.Prj); // Inside this function, the course is checked to be the current one /***** Check if I can edit this project *****/ - if (!Prj_CheckIfICanEditProject (&Projects.Prj)) + if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Remove users in project *****/ @@ -3606,7 +3613,7 @@ static void Prj_HideUnhideProject (HidVis_HiddenOrVisible_t HiddenOrVisible) Prj_GetProjectDataByCod (&Projects.Prj); /***** Check if I can edit this project *****/ - if (!Prj_CheckIfICanEditProject (&Projects.Prj)) + if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Hide/unhide project *****/ @@ -3631,7 +3638,7 @@ void Prj_ReqCreatePrj (void) Prj_ResetPrjsAndReadConfig (&Projects); /***** Check if I can create new projects *****/ - if (!Prj_CheckIfICanCreateProjects (&Projects)) + if (Prj_CheckIfICanCreateProjects (&Projects) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get parameters *****/ @@ -3996,7 +4003,7 @@ void Prj_ReceiveProject (void) extern const char *Txt_The_project_has_been_modified; struct Prj_Projects Projects; bool ItsANewProject; - bool ICanEditProject; + Usr_ICan_t ICanEditProject; bool NewProjectIsCorrect = true; /***** Reset projects *****/ @@ -4025,7 +4032,7 @@ void Prj_ReceiveProject (void) } /* Check if I can create/edit project */ - if (!ICanEditProject) + if (ICanEditProject == Usr_I_CAN_NOT) Err_NoPermissionExit (); /* Get project title */ @@ -4163,7 +4170,7 @@ void Prj_ReqLockSelectedPrjsEdition (void) Prj_ResetPrjsAndReadConfig (&Projects); /***** Check if I can configure projects *****/ - if (!PrjCfg_CheckIfICanConfig ()) + if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get parameters *****/ @@ -4201,7 +4208,7 @@ void Prj_ReqUnloSelectedPrjsEdition (void) Prj_ResetPrjsAndReadConfig (&Projects); /***** Check if I can configure projects *****/ - if (!PrjCfg_CheckIfICanConfig ()) + if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get parameters *****/ @@ -4242,7 +4249,7 @@ void Prj_LockSelectedPrjsEdition (void) Prj_ResetPrjsAndReadConfig (&Projects); /***** Check if I can configure projects *****/ - if (!PrjCfg_CheckIfICanConfig ()) + if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get parameters *****/ @@ -4278,7 +4285,7 @@ void Prj_UnloSelectedPrjsEdition (void) Prj_ResetPrjsAndReadConfig (&Projects); /***** Check if I can configure projects *****/ - if (!PrjCfg_CheckIfICanConfig ()) + if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Get parameters *****/ @@ -4368,7 +4375,7 @@ void Prj_LockProjectEdition (void) Prj_ResetPrjsAndReadConfig (&Projects); /***** Check if I can configure projects *****/ - if (!PrjCfg_CheckIfICanConfig ()) + if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Allocate memory for the project *****/ @@ -4404,7 +4411,7 @@ void Prj_UnloProjectEdition (void) Prj_ResetPrjsAndReadConfig (&Projects); /***** Check if I can configure projects *****/ - if (!PrjCfg_CheckIfICanConfig ()) + if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Allocate memory for the project *****/ @@ -4440,7 +4447,7 @@ void Prj_ChangeReviewStatus (void) Prj_ResetPrjsAndReadConfig (&Projects); /***** Check if I can review projects *****/ - if (!Prj_CheckIfICanReviewProjects ()) + if (Prj_CheckIfICanReviewProjects () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Allocate memory for the project *****/ @@ -4499,7 +4506,7 @@ static void Prj_ShowRubrics (struct Prj_Projects *Projects) for (RubricType = (PrjCfg_RubricType_t) 1; RubricType <= (PrjCfg_RubricType_t) (PrjCfg_NUM_RUBRIC_TYPES - 1); RubricType++) - if (Prj_CheckIfICanViewRubric (Projects->Prj.PrjCod,RubricType)) + if (Prj_CheckIfICanViewRubric (Projects->Prj.PrjCod,RubricType) == Usr_I_CAN) Prj_ShowRubricsOfType (Projects,RubricType); /***** End table *****/ @@ -4521,7 +4528,7 @@ static void Prj_ShowRubricsOfType (struct Prj_Projects *Projects, unsigned NumRubricsThisType; unsigned NumRubThisType; struct Rub_Rubric Rubric; - bool ICanFill = Prj_CheckIfICanFillRubric (Projects->Prj.PrjCod,RubricType); + Usr_ICan_t ICanFill = Prj_CheckIfICanFillRubric (Projects->Prj.PrjCod,RubricType); /***** Get project rubrics for current course from database *****/ NumRubricsThisType = Prj_DB_GetRubricsOfType (&mysql_res,RubricType); @@ -4587,7 +4594,7 @@ static void Prj_ShowRubricsOfType (struct Prj_Projects *Projects, /************************* Who can view/fill rubrics *************************/ /*****************************************************************************/ -static bool Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric) +static Usr_ICan_t Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric) { switch (Gbl.Usrs.Me.Role.Logged) { @@ -4596,25 +4603,26 @@ static bool Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubr switch (WhichRubric) { case PrjCfg_RUBRIC_ERR: - return false; + return Usr_I_CAN_NOT; case PrjCfg_RUBRIC_TUT: case PrjCfg_RUBRIC_EVL: - return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // I am a tutor - 1 << Prj_ROLE_EVL)) != 0); // or an evaluator + return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // I am a tutor... + 1 << Prj_ROLE_EVL)) != 0) ? Usr_I_CAN : // ...or an evaluator + Usr_I_CAN_NOT; case PrjCfg_RUBRIC_GBL: - return (Prj_GetMyRolesInProject (PrjCod) != 0); // I am a member + return (Prj_GetMyRolesInProject (PrjCod) != 0) ? Usr_I_CAN : // I am a member + Usr_I_CAN_NOT; } - return false; + return Usr_I_CAN_NOT; case Rol_TCH: // Editing teachers in a course can view all rubrics case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } - return false; } -static bool Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric) +static Usr_ICan_t Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric) { switch (Gbl.Usrs.Me.Role.Logged) { @@ -4623,20 +4631,22 @@ static bool Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubr switch (WhichRubric) { case PrjCfg_RUBRIC_ERR: - return false; + return Usr_I_CAN_NOT; case PrjCfg_RUBRIC_TUT: - return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT)) != 0); // I am a tutor + return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT)) != 0) ? Usr_I_CAN : // I am a tutor + Usr_I_CAN_NOT; case PrjCfg_RUBRIC_EVL: - return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_EVL)) != 0); // Am I an evaluator + return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_EVL)) != 0) ? Usr_I_CAN : // Am I an evaluator + Usr_I_CAN_NOT; case PrjCfg_RUBRIC_GBL: - return false; + return Usr_I_CAN_NOT; } - return false; + return Usr_I_CAN_NOT; case Rol_TCH: // Editing teachers in a course can fill all rubrics case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -4670,7 +4680,7 @@ void Prj_ChangeCriterionScore (void) Err_WrongRubricExit (); /***** Update review *****/ - if (Prj_CheckIfICanFillRubric (Prj.PrjCod,WhichRubric)) + if (Prj_CheckIfICanFillRubric (Prj.PrjCod,WhichRubric) == Usr_I_CAN) Rub_DB_UpdateScore (Rsc_PROJECT,Prj.PrjCod,-1L,CriCod,Score); else Err_NoPermission (); diff --git a/swad_project.h b/swad_project.h index 3cfbaa2e0..36d9cdf7c 100644 --- a/swad_project.h +++ b/swad_project.h @@ -205,8 +205,8 @@ void Prj_SeeAllProjects (void); void Prj_ShowProjects (struct Prj_Projects *Projects); void Prj_ShowTableSelectedPrjs (void); -bool Prj_CheckIfICanViewProjectDocuments (long PrjCod); -bool Prj_CheckIfICanViewProjectAssessment (long PrjCod); +Usr_ICan_t Prj_CheckIfICanViewProjectDocuments (long PrjCod); +Usr_ICan_t Prj_CheckIfICanViewProjectAssessment (long PrjCod); void Prj_PutCurrentPars (void *Projects); void Prj_PutPars (struct Prj_Filter *Filter, diff --git a/swad_project_config.c b/swad_project_config.c index ae39284b4..03fb93ad8 100644 --- a/swad_project_config.c +++ b/swad_project_config.c @@ -82,12 +82,12 @@ void PrjCfg_GetConfig (struct PrjCfg_Config *Config) /************************ Can I configure all projects? **********************/ /*****************************************************************************/ -bool PrjCfg_CheckIfICanConfig (void) +Usr_ICan_t PrjCfg_CheckIfICanConfig (void) { - static const bool ICanConfigAllProjects[Rol_NUM_ROLES] = + static Usr_ICan_t ICanConfigAllProjects[Rol_NUM_ROLES] = { - [Rol_TCH ] = true, - [Rol_SYS_ADM] = true, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanConfigAllProjects[Gbl.Usrs.Me.Role.Logged]; diff --git a/swad_project_config.h b/swad_project_config.h index 1032bd57d..a281b24a7 100644 --- a/swad_project_config.h +++ b/swad_project_config.h @@ -61,7 +61,7 @@ struct PrgCfg_ListRubCods void PrjCfg_GetConfig (struct PrjCfg_Config *Config); -bool PrjCfg_CheckIfICanConfig (void); +Usr_ICan_t PrjCfg_CheckIfICanConfig (void); void PrjCfg_ShowFormConfig (void); PrjCfg_RubricType_t PrjCfg_GetRubricFromString (const char *Str); void PrjCfg_ChangeNETCanCreate (void); diff --git a/swad_question.c b/swad_question.c index f8bb5c325..a2519d968 100644 --- a/swad_question.c +++ b/swad_question.c @@ -427,16 +427,6 @@ void Qst_ShowFormRequestSelectQstsForGame (struct Gam_Games *Games, DB_FreeMySQLResult (&mysql_res); } -/*****************************************************************************/ -/*********************** Check if I can edit questions ***********************/ -/*****************************************************************************/ - -bool Qst_CheckIfICanEditQsts (void) - { - return Gbl.Usrs.Me.Role.Logged == Rol_TCH || - Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; - } - /*****************************************************************************/ /********************* Put contextual icons in tests *************************/ /*****************************************************************************/ diff --git a/swad_question.h b/swad_question.h index 4d10d9ab2..13bd5264d 100644 --- a/swad_question.h +++ b/swad_question.h @@ -141,7 +141,6 @@ void Qst_ShowFormRequestSelectQstsForExamSet (struct Exa_Exams *Exams, void Qst_ShowFormRequestSelectQstsForGame (struct Gam_Games *Games, struct Qst_Questions *Questions); -bool Qst_CheckIfICanEditQsts (void); void Qst_PutIconsRequestBankQsts (__attribute__((unused)) void *Args); void Qst_PutIconsEditBankQsts (void *Questions); diff --git a/swad_record.c b/swad_record.c index 09573f2ca..e55192dc9 100644 --- a/swad_record.c +++ b/swad_record.c @@ -37,6 +37,7 @@ #include "swad_action.h" #include "swad_action_list.h" #include "swad_alert.h" +#include "swad_agenda.h" #include "swad_box.h" #include "swad_config.h" #include "swad_database.h" @@ -128,7 +129,7 @@ static bool Rec_GetParShowOfficeHours (void); static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView, struct Usr_Data *UsrDat,const char *Anchor); static void Rec_ShowMyCrsRecordUpdated (void); -static bool Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility); +static Usr_ICan_t Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility); static void Rec_PutIconsCommands (__attribute__((unused)) void *Args); static void Rec_PutParsMyResults (__attribute__((unused)) void *Args); @@ -961,7 +962,7 @@ void Rec_GetUsrAndShowRecOneStdCrs (void) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, // Get student's data from database Usr_DONT_GET_PREFS, Usr_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) Rec_ShowRecordOneStdCrs (); } @@ -1184,7 +1185,7 @@ void Rec_GetUsrAndShowRecOneTchCrs (void) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, // Get teacher's data from database Usr_DONT_GET_PREFS, Usr_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) Rec_ShowRecordOneTchCrs (); } @@ -1789,7 +1790,7 @@ void Rec_GetFieldsCrsRecordFromForm (void) for (NumField = 0; NumField < Gbl.Crs.Records.LstFields.Num; NumField++) - if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility)) + if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility) == Usr_I_CAN) { /* Get text from the form */ snprintf (FieldParName,sizeof (FieldParName),"Field%ld", @@ -1811,7 +1812,7 @@ void Rec_UpdateCrsRecord (long UsrCod) for (NumField = 0; NumField < Gbl.Crs.Records.LstFields.Num; NumField++) - if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility)) + if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility) == Usr_I_CAN) { /***** Check if already exists this field for this user in database *****/ FieldAlreadyExists = (Rec_DB_GetFieldTxtFromUsrRecord (&mysql_res, @@ -1867,7 +1868,7 @@ void Rec_AllocMemFieldsRecordsCrs (void) for (NumField = 0; NumField < Gbl.Crs.Records.LstFields.Num; NumField++) - if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility)) + if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility) == Usr_I_CAN) /* Allocate memory for the texts of the fields */ if ((Gbl.Crs.Records.LstFields.Lst[NumField].Text = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) Err_NotEnoughMemoryExit (); @@ -1884,7 +1885,7 @@ void Rec_FreeMemFieldsRecordsCrs (void) for (NumField = 0; NumField < Gbl.Crs.Records.LstFields.Num; NumField++) - if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility)) + if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility) == Usr_I_CAN) /* Free memory of the text of the field */ if (Gbl.Crs.Records.LstFields.Lst[NumField].Text) { @@ -1897,13 +1898,14 @@ void Rec_FreeMemFieldsRecordsCrs (void) /* Check if I can edit a field depending on my role and the field visibility */ /*****************************************************************************/ -static bool Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility) +static Usr_ICan_t Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility) { // Non-editing teachers can not edit fields - return Gbl.Usrs.Me.Role.Logged == Rol_TCH || - Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM || - (Gbl.Usrs.Me.Role.Logged == Rol_STD && - Visibility == Rec_EDITABLE_FIELD); + return ( Gbl.Usrs.Me.Role.Logged == Rol_TCH || + Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM || + (Gbl.Usrs.Me.Role.Logged == Rol_STD && + Visibility == Rec_EDITABLE_FIELD)) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -2064,8 +2066,8 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView, ViewType = Vie_EDIT; break; case Rec_SHA_OTHER_EXISTING_USR_FORM: - ViewType = Usr_ICanChangeOtherUsrData (UsrDat) ? Vie_EDIT : - Vie_VIEW; + ViewType = (Usr_ICanChangeOtherUsrData (UsrDat) == Usr_I_CAN) ? Vie_EDIT : + Vie_VIEW; break; default: // In other options, I can not edit user's data ViewType = Vie_VIEW; @@ -2280,7 +2282,7 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView, static void Rec_PutIconsCommands (__attribute__((unused)) void *Args) { Usr_MeOrOther_t MeOrOther = Usr_ItsMe (Rec_Record.UsrDat->UsrCod); - bool ICanViewUsrProfile; + Usr_ICan_t ICanViewUsrProfile; bool RecipientHasBannedMe; static Act_Action_t NextAction[Rol_NUM_ROLES] = { @@ -2350,8 +2352,8 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args) Act_GetBrowserTab (Gbl.Action.Act) == Act_1ST_TAB && // Only in main browser tab Gbl.Usrs.Me.Logged) // Only if I am logged { - ICanViewUsrProfile = Pri_ShowingIsAllowed (Rec_Record.UsrDat->BaPrfVisibility, - Rec_Record.UsrDat); + ICanViewUsrProfile = Pri_CheckIfICanView (Rec_Record.UsrDat->BaPrfVisibility, + Rec_Record.UsrDat); /***** Begin container *****/ HTM_DIV_Begin ("class=\"FRAME_ICO\""); @@ -2363,25 +2365,25 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args) "pen.svg",Ico_BLACK); /***** Button to view user's profile *****/ - if (ICanViewUsrProfile) + if (ICanViewUsrProfile == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (ActSeeOthPubPrf,NULL, Rec_PutParUsrCodEncrypted,NULL, "user.svg",Ico_BLACK); /***** Button to view user's record card *****/ - if (Usr_CheckIfICanViewRecordStd (Rec_Record.UsrDat)) + if (Usr_CheckIfICanViewRecordStd (Rec_Record.UsrDat) == Usr_I_CAN) /* View student's records: common record card and course record card */ Lay_PutContextualLinkOnlyIcon (ActSeeRecOneStd,NULL, Rec_PutParUsrCodEncrypted,NULL, "address-card.svg",Ico_BLACK); - else if (Usr_CheckIfICanViewRecordTch (Rec_Record.UsrDat)) + else if (Usr_CheckIfICanViewRecordTch (Rec_Record.UsrDat) == Usr_I_CAN) /* View teacher's record card and timetable */ Lay_PutContextualLinkOnlyIcon (ActSeeRecOneTch,NULL, Rec_PutParUsrCodEncrypted,NULL, "address-card.svg",Ico_BLACK); /***** Button to view user's agenda *****/ - if (Usr_CheckIfICanViewUsrAgenda (Rec_Record.UsrDat)) + if (Agd_CheckIfICanViewUsrAgenda (Rec_Record.UsrDat) == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (ActSeeAgd[MeOrOther],NULL, FuncPutParsAgd[MeOrOther],NULL, "calendar.svg",Ico_BLACK); @@ -2402,7 +2404,7 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args) if (Rec_Record.UsrDat->Roles.InCurrentCrs == Rol_STD) // He/she is a student in current course { /***** Buttons to view student's test, exam and match results *****/ - if (Usr_CheckIfICanViewTstExaMchResult (Rec_Record.UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (Rec_Record.UsrDat) == Usr_I_CAN) { /* Test results in course */ Lay_PutContextualLinkOnlyIcon (ActSeeTstResCrs[MeOrOther],NULL, @@ -2419,13 +2421,13 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args) } /***** Button to view student's assignments and works *****/ - if (Usr_CheckIfICanViewAsgWrk (Rec_Record.UsrDat)) + if (Usr_CheckIfICanViewAsgWrk (Rec_Record.UsrDat) == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (ActAdmAsgWrk[MeOrOther],NULL, FuncPutParsAdmAsgWrk[MeOrOther],NULL, "folder-open.svg",Ico_BLACK); /***** Button to view student's attendance *****/ - if (Usr_CheckIfICanViewAtt (Rec_Record.UsrDat)) + if (Usr_CheckIfICanViewAtt (Rec_Record.UsrDat) == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (ActSeeLstAtt[MeOrOther],NULL, FuncPutParsSeeLstAtt[MeOrOther],NULL, "calendar-check.svg",Ico_BLACK); @@ -2453,7 +2455,7 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args) Lay_PutContextualLinkOnlyIcon (ActUnfUsr,NULL, Rec_PutParUsrCodEncrypted,NULL, "user-check.svg",Ico_BLACK); // Put button to unfollow, even if I can not view user's profile - else if (ICanViewUsrProfile) + else if (ICanViewUsrProfile == Usr_I_CAN) Lay_PutContextualLinkOnlyIcon (ActFolUsr,NULL, Rec_PutParUsrCodEncrypted,NULL, "user-plus.svg",Ico_BLACK); // Put button to follow diff --git a/swad_resource.c b/swad_resource.c index 2237f2c19..acdbbae7b 100644 --- a/swad_resource.c +++ b/swad_resource.c @@ -472,12 +472,12 @@ bool Rsc_GetParLink (struct Rsc_Link *Link) /************************** Check if I can get link **************************/ /*****************************************************************************/ -bool Rsc_CheckIfICanGetLink (void) +Usr_ICan_t Rsc_CheckIfICanGetLink (void) { - static const bool ICanGetLink[Rol_NUM_ROLES] = + static Usr_ICan_t ICanGetLink[Rol_NUM_ROLES] = { - [Rol_TCH ] = true, - [Rol_SYS_ADM] = true, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanGetLink[Gbl.Usrs.Me.Role.Logged]; diff --git a/swad_resource.h b/swad_resource.h index c5f9b684b..67f965947 100644 --- a/swad_resource.h +++ b/swad_resource.h @@ -32,6 +32,7 @@ #include "swad_form.h" #include "swad_HTML.h" #include "swad_string.h" +#include "swad_user.h" /*****************************************************************************/ /************************** Public types and constants ***********************/ @@ -88,6 +89,6 @@ Rsc_Type_t Rsc_GetTypeFromString (const char *Str); bool Rsc_GetParLink (struct Rsc_Link *Link); -bool Rsc_CheckIfICanGetLink (void); +Usr_ICan_t Rsc_CheckIfICanGetLink (void); #endif diff --git a/swad_room.c b/swad_room.c index 7c6354a87..27e906d07 100644 --- a/swad_room.c +++ b/swad_room.c @@ -97,7 +97,7 @@ static void Roo_GetAndListMACAddresses (long RooCod); static void Roo_GetAndEditMACAddresses (long RooCod,const char *Anchor); static Roo_Order_t Roo_GetParRoomOrder (void); -static bool Roo_CheckIfICanCreateRooms (void); +static Usr_ICan_t Roo_CheckIfICanCreateRooms (void); static void Roo_PutIconsListingRooms (__attribute__((unused)) void *Args); static void Roo_PutIconToEditRooms (void); static void Roo_PutIconsEditingRooms (__attribute__((unused)) void *Args); @@ -377,9 +377,10 @@ static Roo_Order_t Roo_GetParRoomOrder (void) /*********************** Check if I can create rooms *************************/ /*****************************************************************************/ -static bool Roo_CheckIfICanCreateRooms (void) +static Usr_ICan_t Roo_CheckIfICanCreateRooms (void) { - return Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM; + return (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ @@ -389,7 +390,7 @@ static bool Roo_CheckIfICanCreateRooms (void) static void Roo_PutIconsListingRooms (__attribute__((unused)) void *Args) { /***** Put icon to edit rooms *****/ - if (Roo_CheckIfICanCreateRooms ()) + if (Roo_CheckIfICanCreateRooms () == Usr_I_CAN) Roo_PutIconToEditRooms (); } @@ -399,8 +400,7 @@ static void Roo_PutIconsListingRooms (__attribute__((unused)) void *Args) static void Roo_PutIconToEditRooms (void) { - Ico_PutContextualIconToEdit (ActEdiRoo,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiRoo,NULL,NULL,NULL); } /*****************************************************************************/ @@ -460,8 +460,7 @@ static void Roo_EditRoomsInternal (void) static void Roo_PutIconsEditingRooms (__attribute__((unused)) void *Args) { /***** Put icon to view rooms *****/ - Ico_PutContextualIconToView (ActSeeRoo,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeRoo,NULL,NULL,NULL); } /*****************************************************************************/ @@ -702,7 +701,7 @@ static void Roo_ListRoomsForEdition (const struct Bld_Buildings *Buildings, Nam_ExistingShortAndFullNames (ActionRename, ParCod_Roo,Room->RooCod, Names, - true); // Put form + Frm_PUT_FORM); /* Seating capacity */ HTM_TD_Begin ("class=\"LT\""); diff --git a/swad_room_database.c b/swad_room_database.c index da329b92c..adf4ee57c 100644 --- a/swad_room_database.c +++ b/swad_room_database.c @@ -396,7 +396,7 @@ long Roo_DB_CheckIn (long RooCod) /********************** Check if I can see user's location *******************/ /*****************************************************************************/ -bool Roo_DB_CheckIfICanSeeUsrLocation (long UsrCod) +Usr_ICan_t Roo_DB_CheckIfICanSeeUsrLocation (long UsrCod) { /* I can only consult the location of another user @@ -426,7 +426,8 @@ bool Roo_DB_CheckIfICanSeeUsrLocation (long UsrCod) " AND crs_courses.DegCod=deg_degrees.DegCod) AS C2" // centers of user's courses " WHERE C1.CtrCod=C2.CtrCod)", Gbl.Usrs.Me.UsrDat.UsrCod, - UsrCod); + UsrCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ diff --git a/swad_room_database.h b/swad_room_database.h index 62db96988..e18c323d7 100644 --- a/swad_room_database.h +++ b/swad_room_database.h @@ -55,7 +55,7 @@ void Roo_DB_RemoveAllRoomsInCtr (long CtrCod); //--------------------------------- Check in ---------------------------------- long Roo_DB_CheckIn (long RooCod); -bool Roo_DB_CheckIfICanSeeUsrLocation (long UsrCod); +Usr_ICan_t Roo_DB_CheckIfICanSeeUsrLocation (long UsrCod); unsigned Roo_DB_GetUsrLastLocation (MYSQL_RES **mysql_res,long UsrCod); unsigned Roo_DB_GetLocationByMAC (MYSQL_RES **mysql_res,unsigned long long MACnum); diff --git a/swad_rubric.c b/swad_rubric.c index dcd0b7ebb..a41c6f9eb 100644 --- a/swad_rubric.c +++ b/swad_rubric.c @@ -228,12 +228,12 @@ void Rub_ListAllRubrics (struct Rub_Rubrics *Rubrics) /************************ Check if I can edit rubrics ************************/ /*****************************************************************************/ -bool Rub_CheckIfICanEditRubrics (void) +Usr_ICan_t Rub_CheckIfICanEditRubrics (void) { - static const bool ICanEditRubrics[Rol_NUM_ROLES] = + static Usr_ICan_t ICanEditRubrics[Rol_NUM_ROLES] = { - [Rol_TCH ] = true, - [Rol_SYS_ADM] = true, + [Rol_TCH ] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanEditRubrics[Gbl.Usrs.Me.Role.Logged]; @@ -245,7 +245,7 @@ bool Rub_CheckIfICanEditRubrics (void) bool Rub_CheckIfEditable (void) { - if (Rub_CheckIfICanEditRubrics ()) + if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN) /***** Rubric is editable only if ... *****/ // TODO: Change to control that a rubric is not edited in some circunstances? /* @@ -265,7 +265,7 @@ static void Rub_PutIconsListRubrics (void *Rubrics) { if (Rubrics) { - if (Rub_CheckIfICanEditRubrics ()) + if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN) { /***** Put icon to create a new rubric *****/ Rub_PutIconToCreateNewRubric ((struct Rub_Rubrics *) Rubrics); @@ -275,9 +275,8 @@ static void Rub_PutIconsListRubrics (void *Rubrics) } /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) - Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL, - Rub_PutPars,Rubrics); + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) + Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL,Rub_PutPars,Rubrics); /***** Put icon to show a figure *****/ Fig_PutIconToShowFigure (Fig_RUBRICS); @@ -300,8 +299,7 @@ static void Rub_PutIconToCreateNewRubric (struct Rub_Rubrics *Rubrics) static void Prg_PutIconToViewResourceClipboard (void) { - Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InRub,NULL, - NULL,NULL); + Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InRub,NULL,NULL,NULL); } /*****************************************************************************/ @@ -472,26 +470,22 @@ static void Rub_PutIconsEditingOneRubric (void *Rubrics) { if (Rubrics) /***** Icon to view rubric *****/ - Ico_PutContextualIconToView (ActSeeOneRub,NULL, - Rub_PutPars,Rubrics); + Ico_PutContextualIconToView (ActSeeOneRub,NULL,Rub_PutPars,Rubrics); } static void Rub_PutIconsToRemEditOneRubric (struct Rub_Rubrics *Rubrics) { - if (Rub_CheckIfICanEditRubrics ()) + if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN) { /***** Icon to remove rubric *****/ - Ico_PutContextualIconToRemove (ActReqRemRub,NULL, - Rub_PutPars,Rubrics); + Ico_PutContextualIconToRemove (ActReqRemRub,NULL,Rub_PutPars,Rubrics); /***** Icon to edit rubric *****/ - Ico_PutContextualIconToEdit (ActEdiOneRub,NULL, - Rub_PutPars,Rubrics); + Ico_PutContextualIconToEdit (ActEdiOneRub,NULL,Rub_PutPars,Rubrics); /***** Link to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) - Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL, - Rub_PutPars,Rubrics); + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) + Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL,Rub_PutPars,Rubrics); } } @@ -652,7 +646,7 @@ void Rub_AskRemRubric (void) /***** Get data of the rubric from database *****/ Rub_GetRubricDataByCod (&Rubrics.Rubric); - if (!Rub_CheckIfICanEditRubrics ()) + if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Show criterion and button to remove rubric *****/ @@ -686,7 +680,7 @@ void Rub_RemoveRubric (void) /***** Get data of the rubric from database *****/ Rub_GetRubricDataByCod (&Rubrics.Rubric); - if (!Rub_CheckIfICanEditRubrics ()) + if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Remove rubric from all tables *****/ @@ -738,7 +732,7 @@ void Rub_ReqCreatOrEditRubric (void) Rub_ExistingNewRubric_t ExistingNewRubric; /***** Check if I can edit rubrics *****/ - if (!Rub_CheckIfICanEditRubrics ()) + if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Reset rubrics context *****/ @@ -910,7 +904,7 @@ void Rub_ReceiveRubric (void) Rub_ExistingNewRubric_t ExistingNewRubric; /***** Check if I can edit rubrics *****/ - if (!Rub_CheckIfICanEditRubrics ()) + if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /***** Reset rubrics context *****/ diff --git a/swad_rubric.h b/swad_rubric.h index ed31cc375..42e5181a6 100644 --- a/swad_rubric.h +++ b/swad_rubric.h @@ -54,7 +54,7 @@ void Rub_RubricDestructor (struct Rub_Rubric *Rubric); void Rub_SeeAllRubrics (void); void Rub_ListAllRubrics (struct Rub_Rubrics *Rubrics); -bool Rub_CheckIfICanEditRubrics (void); +Usr_ICan_t Rub_CheckIfICanEditRubrics (void); bool Rub_CheckIfEditable (void); void Rub_SeeOneRubric (void); void Rub_ShowOnlyOneRubric (struct Rub_Rubrics *Rubrics); diff --git a/swad_rubric_criteria.c b/swad_rubric_criteria.c index 26135620c..59ec06f95 100644 --- a/swad_rubric_criteria.c +++ b/swad_rubric_criteria.c @@ -561,7 +561,7 @@ void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics) /*****************************************************************************/ void RubCri_ListCriteriaInProject (struct Prj_Projects *Projects,long RubCod, - bool ICanFill) + Usr_ICan_t ICanFill) { MYSQL_RES *mysql_res; unsigned NumCriteria; diff --git a/swad_rubric_criteria.h b/swad_rubric_criteria.h index 7409b0af1..77bd55673 100644 --- a/swad_rubric_criteria.h +++ b/swad_rubric_criteria.h @@ -45,7 +45,7 @@ void RubCri_ChangeWeight (void); void RubCri_ListCriteriaForSeeing (const struct Rub_Rubrics *Rubrics); void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics); void RubCri_ListCriteriaInProject (struct Prj_Projects *Projects,long RubCod, - bool ICanFill); + Usr_ICan_t ICanFill); void Rub_PushRubCod (struct Rub_Node **TOS,long RubCod); void Rub_PopRubCod (struct Rub_Node **TOS); diff --git a/swad_rubric_resource.c b/swad_rubric_resource.c index 35fb91766..1b85b8911 100644 --- a/swad_rubric_resource.c +++ b/swad_rubric_resource.c @@ -114,7 +114,7 @@ static void RubRsc_ShowClipboard (void) static void RubRsc_PutIconsClipboard (__attribute__((unused)) void *Args) { /***** Put icon to remove resource clipboard in rubrics *****/ - if (Rub_CheckIfICanEditRubrics ()) + if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN) if (Rsc_DB_GetNumResourcesInClipboard ()) // Only if there are resources Ico_PutContextualIconToRemove (ActRemRscCli_InRub,NULL, NULL,NULL); diff --git a/swad_survey.c b/swad_survey.c index b46e41944..0ff370c55 100644 --- a/swad_survey.c +++ b/swad_survey.c @@ -75,7 +75,7 @@ extern struct Globals Gbl; /***************************** Private prototypes ****************************/ /*****************************************************************************/ -static bool Svy_CheckIfICanCreateSvy (void); +static Usr_ICan_t Svy_CheckIfICanCreateSvy (void); static void Svy_PutIconsListSurveys (void *Surveys); static void Svy_PutIconToCreateNewSvy (struct Svy_Surveys *Surveys); static void Svy_PutParsToCreateNewSvy (void *Surveys); @@ -224,7 +224,7 @@ void Svy_ListAllSurveys (struct Svy_Surveys *Surveys) HTM_TR_Begin (NULL); if (Surveys->Svy.Status.ICanEdit || - Rsc_CheckIfICanGetLink ()) + Rsc_CheckIfICanGetLink () == Usr_I_CAN) HTM_TH_Span (NULL,HTM_HEAD_CENTER,1,1,"CONTEXT_COL"); // Column for contextual icons for (Order = (Dat_StartEndTime_t) 0; @@ -287,15 +287,15 @@ void Svy_ListAllSurveys (struct Svy_Surveys *Surveys) /******************* Check if I can create a new survey **********************/ /*****************************************************************************/ -static bool Svy_CheckIfICanCreateSvy (void) +static Usr_ICan_t Svy_CheckIfICanCreateSvy (void) { - static const bool ICanCreateSvy[Rol_NUM_ROLES] = + static Usr_ICan_t ICanCreateSvy[Rol_NUM_ROLES] = { - [Rol_TCH ] = true, - [Rol_DEG_ADM] = true, - [Rol_CTR_ADM] = true, - [Rol_INS_ADM] = true, - [Rol_SYS_ADM] = true, + [Rol_TCH ] = Usr_I_CAN, + [Rol_DEG_ADM] = Usr_I_CAN, + [Rol_CTR_ADM] = Usr_I_CAN, + [Rol_INS_ADM] = Usr_I_CAN, + [Rol_SYS_ADM] = Usr_I_CAN, }; return ICanCreateSvy[Gbl.Usrs.Me.Role.Logged]; @@ -308,13 +308,12 @@ static bool Svy_CheckIfICanCreateSvy (void) static void Svy_PutIconsListSurveys (void *Surveys) { /***** Put icon to create a new survey *****/ - if (Svy_CheckIfICanCreateSvy ()) + if (Svy_CheckIfICanCreateSvy () == Usr_I_CAN) Svy_PutIconToCreateNewSvy ((struct Svy_Surveys *) Surveys); /***** Put icon to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) - Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL, - Svy_PutPars,Surveys); + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) + Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL,Svy_PutPars,Surveys); /***** Put icon to show a figure *****/ Fig_PutIconToShowFigure (Fig_SURVEYS); @@ -439,7 +438,7 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys, HTM_TD_Begin ("rowspan=\"2\" class=\"CONTEXT_COL %s\"", The_GetColorRows ()); if (Surveys->Svy.Status.ICanEdit || - Rsc_CheckIfICanGetLink ()) + Rsc_CheckIfICanGetLink () == Usr_I_CAN) Svy_PutFormsToRemEditOneSvy (Surveys,Anchor); HTM_TD_End (); } @@ -846,12 +845,10 @@ static void Svy_PutFormsToRemEditOneSvy (struct Svy_Surveys *Surveys, if (Surveys->Svy.Status.ICanEdit) { /***** Icon to remove survey *****/ - Ico_PutContextualIconToRemove (ActReqRemSvy,NULL, - Svy_PutPars,Surveys); + Ico_PutContextualIconToRemove (ActReqRemSvy,NULL,Svy_PutPars,Surveys); /***** Icon to reset survey *****/ - Ico_PutContextualIconToReset (ActReqRstSvy,NULL, - Svy_PutPars,Surveys); + Ico_PutContextualIconToReset (ActReqRstSvy,NULL,Svy_PutPars,Surveys); /***** Icon to hide/unhide survey *****/ Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor, @@ -859,14 +856,12 @@ static void Svy_PutFormsToRemEditOneSvy (struct Svy_Surveys *Surveys, Surveys->Svy.Status.HiddenOrVisible); /***** Icon to edit survey *****/ - Ico_PutContextualIconToEdit (ActEdiOneSvy,NULL, - Svy_PutPars,Surveys); + Ico_PutContextualIconToEdit (ActEdiOneSvy,NULL,Svy_PutPars,Surveys); } /***** Icon to get resource link *****/ - if (Rsc_CheckIfICanGetLink ()) - Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL, - Svy_PutPars,Surveys); + if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) + Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL,Svy_PutPars,Surveys); } /*****************************************************************************/ @@ -1165,7 +1160,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy) break; case Hie_CRS: // Course Svy->Status.IBelongToScope = Hie_CheckIfIBelongTo (Svy->Level,Svy->HieCod) && - Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (Svy->SvyCod); + Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (Svy->SvyCod) == Usr_I_CAN; break; default: // Unknown Err_WrongHierarchyLevelExit (); @@ -1596,7 +1591,7 @@ void Svy_ReqCreatOrEditSvy (void) if (ItsANewSurvey) { /***** Put link (form) to create new survey *****/ - if (!Svy_CheckIfICanCreateSvy ()) + if (Svy_CheckIfICanCreateSvy () == Usr_I_CAN_NOT) Err_NoPermissionExit (); /* Initialize to empty survey */ diff --git a/swad_survey_database.c b/swad_survey_database.c index defc0cd7d..a8e912dcf 100644 --- a/swad_survey_database.c +++ b/swad_survey_database.c @@ -743,7 +743,7 @@ unsigned Svy_DB_GetGrpNamesAssociatedToSvy (MYSQL_RES **mysql_res,long SvyCod) /************ Check if I belong to any of the groups of a survey *************/ /*****************************************************************************/ -bool Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod) +Usr_ICan_t Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod) { return DB_QueryEXISTS ("can not check if I can do a survey", @@ -762,7 +762,8 @@ bool Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod) " WHERE grp_users.UsrCod=%ld" " AND grp_users.GrpCod=svy_groups.GrpCod)))", SvyCod, - Gbl.Usrs.Me.UsrDat.UsrCod); + Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ diff --git a/swad_survey_database.h b/swad_survey_database.h index 3f13d58ed..9abeec3d8 100644 --- a/swad_survey_database.h +++ b/swad_survey_database.h @@ -66,7 +66,7 @@ void Svy_DB_RemoveSvysIn (Hie_Level_t Level,long HieCod); void Svy_DB_CreateGrp (long SvyCod,long GrpCod); unsigned Svy_DB_GetGrpNamesAssociatedToSvy (MYSQL_RES **mysql_res,long SvyCod); -bool Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod); +Usr_ICan_t Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod); void Svy_DB_RemoveGroupsOfType (long GrpTypCod); void Svy_DB_RemoveGroup (long GrpCod); diff --git a/swad_tab.c b/swad_tab.c index d7578a883..7bbb080cc 100644 --- a/swad_tab.c +++ b/swad_tab.c @@ -43,7 +43,7 @@ extern struct Globals Gbl; /***************************** Private prototypes ****************************/ /*****************************************************************************/ -static bool Tab_CheckIfICanViewTab (Tab_Tab_t Tab); +static Usr_ICan_t Tab_CheckIfICanViewTab (Tab_Tab_t Tab); static const char *Tab_GetIcon (Tab_Tab_t Tab); /*****************************************************************************/ @@ -55,7 +55,6 @@ void Tab_DrawTabs (void) extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS]; Tab_Tab_t NumTab; const char *TabTxt; - bool ICanViewTab; char URLIconSet[PATH_MAX + 1]; static const char *ClassIcoTab[Ico_NUM_ICON_SETS] = { @@ -73,8 +72,6 @@ void Tab_DrawTabs (void) NumTab <= (Tab_Tab_t) (Tab_NUM_TABS - 1); NumTab++) { - ICanViewTab = Tab_CheckIfICanViewTab (NumTab); - /* If current tab is unknown, then activate the first one with access allowed */ if (Gbl.Action.Tab == TabUnk) { @@ -82,7 +79,7 @@ void Tab_DrawTabs (void) Tab_DisableIncompatibleTabs (); } - if (ICanViewTab) // Don't show the first hidden tabs + if (Tab_CheckIfICanViewTab (NumTab) == Usr_I_CAN) // Don't show the first hidden tabs { TabTxt = Tab_GetTxt (NumTab); @@ -133,32 +130,40 @@ void Tab_DrawTabs (void) /************************* Check if I can view a tab *************************/ /*****************************************************************************/ -static bool Tab_CheckIfICanViewTab (Tab_Tab_t Tab) +static Usr_ICan_t Tab_CheckIfICanViewTab (Tab_Tab_t Tab) { switch (Tab) { case TabUnk: - return false; + return Usr_I_CAN_NOT; case TabSys: - return (Gbl.Hierarchy.Level == Hie_SYS); // Institution selected + return (Gbl.Hierarchy.Level == Hie_SYS) ? Usr_I_CAN : // Institution selected + Usr_I_CAN_NOT; case TabCty: - return (Gbl.Hierarchy.Level == Hie_CTY); // Institution selected + return (Gbl.Hierarchy.Level == Hie_CTY) ? Usr_I_CAN : // Institution selected + Usr_I_CAN_NOT; case TabIns: - return (Gbl.Hierarchy.Level == Hie_INS); // Institution selected + return (Gbl.Hierarchy.Level == Hie_INS) ? Usr_I_CAN : // Institution selected + Usr_I_CAN_NOT; case TabCtr: - return (Gbl.Hierarchy.Level == Hie_CTR); // Center selected + return (Gbl.Hierarchy.Level == Hie_CTR) ? Usr_I_CAN : // Center selected + Usr_I_CAN_NOT; case TabDeg: - return (Gbl.Hierarchy.Level == Hie_DEG); // Degree selected + return (Gbl.Hierarchy.Level == Hie_DEG) ? Usr_I_CAN : // Degree selected + Usr_I_CAN_NOT; case TabCrs: - return (Gbl.Hierarchy.Level == Hie_CRS); // Course selected + return (Gbl.Hierarchy.Level == Hie_CRS) ? Usr_I_CAN : // Course selected + Usr_I_CAN_NOT; case TabAss: - return (Gbl.Hierarchy.Level == Hie_CRS && // Course selected - Gbl.Usrs.Me.Role.Logged >= Rol_STD); // I belong to course or I am an admin + return (Gbl.Hierarchy.Level == Hie_CRS && // Course selected + Gbl.Usrs.Me.Role.Logged >= Rol_STD) ? Usr_I_CAN : // I belong to course or I am an admin + Usr_I_CAN_NOT; case TabFil: return (Gbl.Hierarchy.Node[Hie_INS].HieCod > 0 || // Institution selected - Gbl.Usrs.Me.Logged); // I'm logged + Gbl.Usrs.Me.Logged) ? Usr_I_CAN : // I'm logged + Usr_I_CAN_NOT; default: - return true; + return Usr_I_CAN; } } diff --git a/swad_test_print.c b/swad_test_print.c index 4cbdb1549..eddf53c3f 100644 --- a/swad_test_print.c +++ b/swad_test_print.c @@ -126,31 +126,31 @@ static void TstPrn_GetCorrectAndComputeTxtAnsScore (struct TstPrn_PrintedQuestio static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], __attribute__((unused)) const char *ClassTxt, __attribute__((unused)) const char *ClassFeedback); static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], __attribute__((unused)) const char *ClassTxt, __attribute__((unused)) const char *ClassFeedback); static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], __attribute__((unused)) const char *ClassTxt, __attribute__((unused)) const char *ClassFeedback); static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], const char *ClassTxt, const char *ClassFeedback); static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], __attribute__((unused)) const char *ClassTxt, __attribute__((unused)) const char *ClassFeedback); //----------------------------------------------------------------------------- @@ -605,16 +605,20 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat, extern const char *Txt_Question_removed; extern const char *Txt_Question_modified; bool QuestionUneditedAfterExam = false; - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY]; + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY]; /***** Check if I can view each part of the question *****/ switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: - ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility); - ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility); - ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility); - ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility); + ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility) ? Usr_I_CAN : + Usr_I_CAN_NOT; + ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility) ? Usr_I_CAN : + Usr_I_CAN_NOT; + ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility) ? Usr_I_CAN : + Usr_I_CAN_NOT; + ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility) ? Usr_I_CAN : + Usr_I_CAN_NOT; break; case Rol_NET: case Rol_TCH: @@ -625,13 +629,13 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat, ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = - ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = true; + ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN; break; default: ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = - ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = false; + ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN_NOT; break; } @@ -663,7 +667,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat, ICanView[TstVis_VISIBLE_QST_ANS_TXT]); /* Media */ - if (ICanView[TstVis_VISIBLE_QST_ANS_TXT]) + if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN) Med_ShowMedia (&Question->Media, "Tst_MED_SHOW_CONT", "Tst_MED_SHOW"); @@ -674,7 +678,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat, ICanView,"Qst_TXT","Qst_TXT_LIGHT"); /* Write score retrieved from database */ - if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE]) + if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE] == Usr_I_CAN) { HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"", The_GetSuffix ()); @@ -698,7 +702,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat, /* Question feedback */ if (QuestionUneditedAfterExam) - if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT]) + if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN) Qst_WriteQstFeedback (Question->Feedback,"Qst_TXT_LIGHT"); HTM_TD_End (); @@ -1169,14 +1173,14 @@ void TstPrn_ShowGrade (double Grade,double MaxGrade) void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], const char *ClassTxt, const char *ClassFeedback) { void (*TstPrn_WriteAnsExam[Qst_NUM_ANS_TYPES]) (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], const char *ClassTxt, const char *ClassFeedback) = { @@ -1200,7 +1204,7 @@ void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat, static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], __attribute__((unused)) const char *ClassTxt, __attribute__((unused)) const char *ClassFeedback) { @@ -1225,7 +1229,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat, if (sscanf (PrintedQuestion->StrAnswers,"%ld",&IntAnswerUsr) == 1) { HTM_TD_Begin ("class=\"CM %s_%s\"", - ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ? + ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN ? (IntAnswerUsr == Question->Answer.Integer ? "Qst_ANS_OK" : // Correct "Qst_ANS_BAD") : // Wrong "Qst_ANS_0", // Blank answer @@ -1246,7 +1250,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat, /***** Write the correct answer *****/ HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ()); - if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER]) + if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) HTM_Long (Question->Answer.Integer); else Ico_PutIconNotVisible (); @@ -1264,7 +1268,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], __attribute__((unused)) const char *ClassTxt, __attribute__((unused)) const char *ClassFeedback) { @@ -1290,7 +1294,7 @@ static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat, FloatAnsUsr = Str_GetDoubleFromStr (PrintedQuestion->StrAnswers); // A bad formatted floating point answer will interpreted as 0.0 HTM_TD_Begin ("class=\"CM %s_%s\"", - ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ? + ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN ? ((FloatAnsUsr >= Question->Answer.FloatingPoint[0] && FloatAnsUsr <= Question->Answer.FloatingPoint[1]) ? "Qst_ANS_OK" : // Correct "Qst_ANS_BAD") : // Wrong @@ -1304,7 +1308,7 @@ static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat, /***** Write the correct answer *****/ HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ()); - if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER]) + if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) { HTM_Txt ("["); HTM_Double (Question->Answer.FloatingPoint[0]); @@ -1328,7 +1332,7 @@ static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], __attribute__((unused)) const char *ClassTxt, __attribute__((unused)) const char *ClassFeedback) { @@ -1352,7 +1356,7 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat, /***** Write the user answer *****/ HTM_TD_Begin ("class=\"CM %s_%s\"", - ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ? + ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN ? (AnsTFUsr == Question->Answer.TF ? "Qst_ANS_OK" : // Correct "Qst_ANS_BAD") : // Wrong "Qst_ANS_0", // Blank answer @@ -1362,7 +1366,7 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat, /***** Write the correct answer *****/ HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ()); - if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER]) + if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) Qst_WriteAnsTF (Question->Answer.TF); else Ico_PutIconNotVisible (); @@ -1380,7 +1384,7 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], const char *ClassTxt, const char *ClassFeedback) { @@ -1399,7 +1403,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat, Qst_ChangeFormatAnswersText (Question); /***** Change format of answers feedback *****/ - if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT]) + if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN) Qst_ChangeFormatAnswersFeedback (Question); /***** Get indexes for this question from string *****/ @@ -1426,7 +1430,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat, /* Draw icon depending on user's answer */ if (UsrAnswers[Indexes[NumOpt]]) // This answer has been selected by the user { - if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER]) + if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) { if (Question->Answer.Options[Indexes[NumOpt]].Correct) { @@ -1455,7 +1459,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat, HTM_TD_Empty (1); /* Draw icon that indicates whether the answer is correct */ - if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER]) + if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) { if (Question->Answer.Options[Indexes[NumOpt]].Correct) { @@ -1487,7 +1491,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat, HTM_DIV_Begin ("class=\"%s_%s\"", ClassTxt,The_GetSuffix ()); - if (ICanView[TstVis_VISIBLE_QST_ANS_TXT]) + if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN) { HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text); Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media, @@ -1498,7 +1502,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat, Ico_PutIconNotVisible (); HTM_DIV_End (); - if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER]) + if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) if (Question->Answer.Options[Indexes[NumOpt]].Feedback) if (Question->Answer.Options[Indexes[NumOpt]].Feedback[0]) { @@ -1524,7 +1528,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], __attribute__((unused)) const char *ClassTxt, __attribute__((unused)) const char *ClassFeedback) { @@ -1537,7 +1541,7 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat, Qst_ChangeFormatAnswersText (Question); /***** Change format of answers feedback *****/ - if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT]) + if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN) Qst_ChangeFormatAnswersFeedback (Question); /***** Begin table *****/ @@ -1578,9 +1582,9 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat, } } HTM_TD_Begin ("class=\"CT %s_%s\"", - ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ? (Correct ? "Qst_ANS_OK" : // Correct - "Qst_ANS_BAD") : // Wrong - "Qst_ANS_0", // Blank answer + ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN ? (Correct ? "Qst_ANS_OK" : // Correct + "Qst_ANS_BAD") : // Wrong + "Qst_ANS_0", // Blank answer The_GetSuffix ()); HTM_Txt (PrintedQuestion->StrAnswers); HTM_TD_End (); @@ -1589,7 +1593,7 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat, HTM_TD_Empty (1); /***** Write the correct answers *****/ - if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER]) + if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) { HTM_TD_Begin ("class=\"CT\""); HTM_TABLE_BeginPadding (2); @@ -1614,7 +1618,7 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat, HTM_Txt (Question->Answer.Options[NumOpt].Text); HTM_DIV_End (); - if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT]) + if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN) if (Question->Answer.Options[NumOpt].Feedback) if (Question->Answer.Options[NumOpt].Feedback[0]) { @@ -1682,7 +1686,7 @@ static void TstPrn_PutFormToSelectUsrsToViewUsrsPrints (__attribute__((unused)) Act_GetActionText (ActSeeUsrTstResCrs), Hlp_ASSESSMENT_Tests_results, Txt_View_results, - true); // Put form with date range + Frm_PUT_FORM); // Put form with date range } /*****************************************************************************/ @@ -1784,7 +1788,7 @@ static void TstPrn_ShowUsrsPrints (__attribute__((unused)) void *Args) if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) - if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) { /***** Show tests *****/ Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); @@ -1920,7 +1924,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat) } /* Accumulate questions and score */ - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { NumTotalQsts.All += Print.NumQsts.All; NumTotalQsts.NotBlank += Print.NumQsts.NotBlank; @@ -1931,7 +1935,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat) HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", ClassDat,The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Result) + if (ICanView.Result == Usr_I_CAN) HTM_Unsigned (Print.NumQsts.All); else Ico_PutIconNotVisible (); @@ -1941,7 +1945,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat) HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", ClassDat,The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Result) + if (ICanView.Result == Usr_I_CAN) { if (Print.NumQsts.NotBlank) HTM_Unsigned (Print.NumQsts.NotBlank); @@ -1956,7 +1960,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat) HTM_TD_Begin ("class=\"RT %s_%s %s\"", ClassDat,The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Result) + if (ICanView.Result == Usr_I_CAN) { NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank; if (NumQstsBlank) @@ -1972,7 +1976,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat) HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", ClassDat,The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { HTM_Double2Decimals (Print.Score); HTM_Txt ("/"); @@ -1986,7 +1990,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat) HTM_TD_Begin ("class=\"RT %s_%s %s\"", ClassDat,The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) HTM_Double2Decimals (Print.NumQsts.All ? Print.Score / (double) Print.NumQsts.All : 0.0); @@ -1998,7 +2002,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat) HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", ClassDat,The_GetSuffix (), The_GetColorRows ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX); else Ico_PutIconNotVisible (); @@ -2007,7 +2011,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat) /* Link to show this test */ HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"", The_GetColorRows ()); - if (ICanView.Result) + if (ICanView.Result == Usr_I_CAN) { Frm_BeginForm (Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe : ActSeeOneTstResOth); @@ -2220,7 +2224,7 @@ void TstPrn_ShowOnePrint (void) if (Gbl.Usrs.Me.Role.Logged == Rol_STD) TstCfg_GetConfig (); // To get visibility TstRes_CheckIfICanSeePrintResult (&Print,Gbl.Usrs.Other.UsrDat.UsrCod,&ICanView); - if (!ICanView.Result) // I am not allowed to view this test + if (ICanView.Result == Usr_I_CAN_NOT) // I am not allowed to view this test Err_NoPermissionExit (); /***** Get questions and user's answers of the test from database *****/ @@ -2241,7 +2245,7 @@ void TstPrn_ShowOnePrint (void) Usr_DONT_GET_PREFS, Usr_DONT_GET_ROLE_IN_CRS)) Err_WrongUserExit (); - if (!Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) + if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN_NOT) Err_NoPermissionExit (); /* User */ @@ -2333,7 +2337,7 @@ void TstPrn_ShowOnePrint (void) HTM_TD_Begin ("class=\"LB DAT_%s\"", The_GetSuffix ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { HTM_STRONG_Begin (); HTM_Double2Decimals (Print.Score); @@ -2357,7 +2361,7 @@ void TstPrn_ShowOnePrint (void) HTM_TD_Begin ("class=\"LB DAT_%s\"", The_GetSuffix ()); - if (ICanView.Score) + if (ICanView.Score == Usr_I_CAN) { HTM_STRONG_Begin (); TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX); @@ -2412,13 +2416,14 @@ static void TstRes_CheckIfICanSeePrintResult (const struct TstPrn_Print *Print, case Rol_STD: // Depends on whether the print is sent or not // if the print is not sent ==> I can not view results - ICanView->Result = Print->Sent && Usr_ItsMe (UsrCod) == Usr_ME; - - if (ICanView->Result) + ICanView->Result = (Print->Sent && Usr_ItsMe (UsrCod) == Usr_ME) ? Usr_I_CAN : + Usr_I_CAN_NOT; + if (ICanView->Result == Usr_I_CAN) // Depends on 5 visibility icons associated to tests - ICanView->Score = TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ()); + ICanView->Score = TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ()) ? Usr_I_CAN : + Usr_I_CAN_NOT; else - ICanView->Score = false; + ICanView->Score = Usr_I_CAN_NOT; break; case Rol_NET: case Rol_TCH: @@ -2430,15 +2435,16 @@ static void TstRes_CheckIfICanSeePrintResult (const struct TstPrn_Print *Print, // if teachers are not allowed ==> I can not view results (except if the print is mine) ICanView->Result = ICanView->Score = Print->Sent && - (Print->AllowTeachers || Usr_ItsMe (UsrCod) == Usr_ME); + (Print->AllowTeachers || Usr_ItsMe (UsrCod) == Usr_ME) ? Usr_I_CAN : + Usr_I_CAN_NOT; break; case Rol_SYS_ADM: ICanView->Result = - ICanView->Score = true; + ICanView->Score = Usr_I_CAN; break; default: ICanView->Result = - ICanView->Score = false; + ICanView->Score = Usr_I_CAN_NOT; break; } } diff --git a/swad_test_print.h b/swad_test_print.h index 457388b31..078410061 100644 --- a/swad_test_print.h +++ b/swad_test_print.h @@ -131,7 +131,7 @@ void TstPrn_ShowGrade (double Grade,double MaxGrade); void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat, const struct TstPrn_PrintedQuestion *PrintedQuestion, struct Qst_Question *Question, - bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], + Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY], const char *ClassTxt, const char *ClassFeedback); diff --git a/swad_timeline_comment.c b/swad_timeline_comment.c index c81ae7e48..039c8ca08 100644 --- a/swad_timeline_comment.c +++ b/swad_timeline_comment.c @@ -877,7 +877,7 @@ static void TmlCom_ReqRemComm (struct Tml_Timeline *Timeline) TmlCom_GetCommDataByCod (&Com); /***** Do some checks *****/ - if (!TmlUsr_CheckIfICanRemove (Com.PubCod,Com.UsrCod)) + if (TmlUsr_CheckIfICanRemove (Com.PubCod,Com.UsrCod) == Usr_I_CAN_NOT) { Med_MediaDestructor (&Com.Content.Media); return; diff --git a/swad_timeline_favourite.c b/swad_timeline_favourite.c index 68c6ee4f6..28a6c4d0c 100644 --- a/swad_timeline_favourite.c +++ b/swad_timeline_favourite.c @@ -135,7 +135,7 @@ static void TmlFav_FavNote (struct TmlNot_Note *Not) TmlNot_GetNoteDataByCod (Not); /***** Do some checks *****/ - if (!TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod)) + if (TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod) == Usr_I_CAN_NOT) return; /***** Trivial check: Have I faved this note? *****/ @@ -165,7 +165,7 @@ static void TmlFav_UnfNote (struct TmlNot_Note *Not) TmlNot_GetNoteDataByCod (Not); /***** Do some checks *****/ - if (!TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod)) + if (TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod) == Usr_I_CAN_NOT) return; /***** Trivial check: Have I faved this note? *****/ @@ -272,7 +272,7 @@ static void TmlFav_FavComm (struct TmlCom_Comment *Com) TmlCom_GetCommDataByCod (Com); /***** Do some checks *****/ - if (!TmlUsr_CheckIfICanFavSha (Com->PubCod,Com->UsrCod)) + if (TmlUsr_CheckIfICanFavSha (Com->PubCod,Com->UsrCod) == Usr_I_CAN_NOT) { Med_MediaDestructor (&Com->Content.Media); return; @@ -311,7 +311,7 @@ static void TmlFav_UnfComm (struct TmlCom_Comment *Com) TmlCom_GetCommDataByCod (Com); /***** Do some checks *****/ - if (!TmlUsr_CheckIfICanFavSha (Com->PubCod,Com->UsrCod)) + if (TmlUsr_CheckIfICanFavSha (Com->PubCod,Com->UsrCod) == Usr_I_CAN_NOT) { Med_MediaDestructor (&Com->Content.Media); return; diff --git a/swad_timeline_note.c b/swad_timeline_note.c index 50069d12a..19c5983e4 100644 --- a/swad_timeline_note.c +++ b/swad_timeline_note.c @@ -1010,7 +1010,7 @@ static void TmlNot_ReqRemNote (struct Tml_Timeline *Timeline) TmlNot_GetNoteDataByCod (&Not); /***** Do some checks *****/ - if (!TmlUsr_CheckIfICanRemove (Not.NotCod,Not.UsrCod)) + if (TmlUsr_CheckIfICanRemove (Not.NotCod,Not.UsrCod) == Usr_I_CAN_NOT) return; /***** Show question and button to remove note *****/ diff --git a/swad_timeline_share.c b/swad_timeline_share.c index 571d2ba3d..f36ff861c 100644 --- a/swad_timeline_share.c +++ b/swad_timeline_share.c @@ -111,7 +111,7 @@ static void TmlSha_ShaNote (struct TmlNot_Note *Not) TmlNot_GetNoteDataByCod (Not); /***** Do some checks *****/ - if (!TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod)) + if (TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod) == Usr_I_CAN_NOT) return; /***** Trivial check: Is note already shared by me? *****/ @@ -169,7 +169,7 @@ static void TmlSha_UnsNote (struct TmlNot_Note *Not) TmlNot_GetNoteDataByCod (Not); /***** Do some checks *****/ - if (!TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod)) + if (TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod) == Usr_I_CAN_NOT) return; /***** Delete publication from database *****/ diff --git a/swad_timeline_user.c b/swad_timeline_user.c index c3e3cd728..865162a1c 100644 --- a/swad_timeline_user.c +++ b/swad_timeline_user.c @@ -378,7 +378,7 @@ static void TmlUsr_PutDisabledIconFavSha (TmlUsr_FavSha_t FavSha, /***************** Check if I can fav/share a note/comment *******************/ /*****************************************************************************/ -bool TmlUsr_CheckIfICanFavSha (long Cod,long UsrCod) +Usr_ICan_t TmlUsr_CheckIfICanFavSha (long Cod,long UsrCod) { extern const char *Txt_The_post_no_longer_exists; @@ -386,7 +386,7 @@ bool TmlUsr_CheckIfICanFavSha (long Cod,long UsrCod) if (Cod <= 0) { Ale_ShowAlert (Ale_WARNING,Txt_The_post_no_longer_exists); - return false; + return Usr_I_CAN_NOT; } /***** Trivial check 2: I must be logged @@ -394,17 +394,17 @@ bool TmlUsr_CheckIfICanFavSha (long Cod,long UsrCod) if (!Gbl.Usrs.Me.Logged || Usr_ItsMe (UsrCod) == Usr_ME) { Err_NoPermission (); - return false; + return Usr_I_CAN_NOT; } - return true; + return Usr_I_CAN; } /*****************************************************************************/ /***************** Check if I can fav/share a note/comment *******************/ /*****************************************************************************/ -bool TmlUsr_CheckIfICanRemove (long Cod,long UsrCod) +Usr_ICan_t TmlUsr_CheckIfICanRemove (long Cod,long UsrCod) { extern const char *Txt_The_post_no_longer_exists; @@ -412,7 +412,7 @@ bool TmlUsr_CheckIfICanRemove (long Cod,long UsrCod) if (Cod <= 0) { Ale_ShowAlert (Ale_WARNING,Txt_The_post_no_longer_exists); - return false; + return Usr_I_CAN_NOT; } /***** Trivial check 2: I must be logged @@ -420,8 +420,8 @@ bool TmlUsr_CheckIfICanRemove (long Cod,long UsrCod) if (!Gbl.Usrs.Me.Logged || Usr_ItsMe (UsrCod) == Usr_OTHER) { Err_NoPermission (); - return false; + return Usr_I_CAN_NOT; } - return true; + return Usr_I_CAN; } diff --git a/swad_timeline_user.h b/swad_timeline_user.h index f88ee971c..d725fd6bf 100644 --- a/swad_timeline_user.h +++ b/swad_timeline_user.h @@ -75,7 +75,7 @@ void TmlUsr_PutIconFavSha (TmlUsr_FavSha_t FavSha, long Cod,long UsrCod,unsigned NumUsrs, TmlUsr_HowManyUsrs_t HowManyUsrs); -bool TmlUsr_CheckIfICanFavSha (long Cod,long UsrCod); -bool TmlUsr_CheckIfICanRemove (long Cod,long UsrCod); +Usr_ICan_t TmlUsr_CheckIfICanFavSha (long Cod,long UsrCod); +Usr_ICan_t TmlUsr_CheckIfICanRemove (long Cod,long UsrCod); #endif diff --git a/swad_timetable.c b/swad_timetable.c index e9df15455..bdb8c496f 100644 --- a/swad_timetable.c +++ b/swad_timetable.c @@ -426,8 +426,7 @@ static void Tmt_PutContextualIcons (void *Timetable) Grp_PutParWhichGroups,&WhichGroups); if (((struct Tmt_Timetable *) Timetable)->ContextualIcons.PutIconEditOfficeHours) - Ico_PutContextualIconToEdit (ActEdiTut,NULL, - NULL,NULL); + Ico_PutContextualIconToEdit (ActEdiTut,NULL,NULL,NULL); if (((struct Tmt_Timetable *) Timetable)->ContextualIcons.PutIconPrint) Ico_PutContextualIconToPrint (((struct Tmt_Timetable *) Timetable)->Type == Tmt_COURSE_TIMETABLE ? ActPrnCrsTT : @@ -497,8 +496,7 @@ void Tmt_EditMyTutTimeTable (void) static void Tmt_PutIconToViewCrsTT (__attribute__((unused)) void *Args) { - Ico_PutContextualIconToView (ActSeeCrsTT,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeCrsTT,NULL,NULL,NULL); } /*****************************************************************************/ @@ -507,8 +505,7 @@ static void Tmt_PutIconToViewCrsTT (__attribute__((unused)) void *Args) static void Tmt_PutIconToViewMyTT (__attribute__((unused)) void *Args) { - Ico_PutContextualIconToView (ActSeeMyTT,NULL, - NULL,NULL); + Ico_PutContextualIconToView (ActSeeMyTT,NULL,NULL,NULL); } /*****************************************************************************/ diff --git a/swad_user.c b/swad_user.c index 87e360a28..304b2b04a 100644 --- a/swad_user.c +++ b/swad_user.c @@ -774,11 +774,11 @@ bool Usr_CheckIfUsrIsSuperuser (long UsrCod) /**************** Check if I can change another user's data ******************/ /*****************************************************************************/ -bool Usr_ICanChangeOtherUsrData (const struct Usr_Data *UsrDat) +Usr_ICan_t Usr_ICanChangeOtherUsrData (const struct Usr_Data *UsrDat) { /***** I can change my data *****/ if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - return true; + return Usr_I_CAN; /***** Check if I have permission to see another user's IDs *****/ switch (Gbl.Usrs.Me.Role.Logged) @@ -786,20 +786,20 @@ bool Usr_ICanChangeOtherUsrData (const struct Usr_Data *UsrDat) case Rol_TCH: /* Check 1: I can change data of users who do not exist in database */ if (UsrDat->UsrCod <= 0) // User does not exist (when creating a new user) - return true; + return Usr_I_CAN; /* Check 2: I change data of users without password */ if (!UsrDat->Password[0]) // User has no password (never logged) - return true; + return Usr_I_CAN; - return false; + return Usr_I_CAN_NOT; case Rol_DEG_ADM: case Rol_CTR_ADM: case Rol_INS_ADM: case Rol_SYS_ADM: - return Usr_ICanEditOtherUsr (UsrDat); + return Usr_CheckIfICanEditOtherUsr (UsrDat); default: - return false; + return Usr_I_CAN_NOT; } } @@ -807,11 +807,11 @@ bool Usr_ICanChangeOtherUsrData (const struct Usr_Data *UsrDat) /***************** Check if I can edit another user's data *******************/ /*****************************************************************************/ -bool Usr_ICanEditOtherUsr (const struct Usr_Data *UsrDat) +Usr_ICan_t Usr_CheckIfICanEditOtherUsr (const struct Usr_Data *UsrDat) { /***** I can edit me *****/ if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - return true; + return Usr_I_CAN; switch (Gbl.Usrs.Me.Role.Logged) { @@ -823,8 +823,8 @@ bool Usr_ICanEditOtherUsr (const struct Usr_Data *UsrDat) true)) // count only accepted courses // Degree admins can't edit superusers' data if (!Usr_CheckIfUsrIsSuperuser (UsrDat->UsrCod)) - return true; - return false; + return Usr_I_CAN; + return Usr_I_CAN_NOT; case Rol_CTR_ADM: /* If I am an administrator of current center, I only can edit from current center who have accepted */ @@ -833,8 +833,8 @@ bool Usr_ICanEditOtherUsr (const struct Usr_Data *UsrDat) true)) // count only accepted courses // Center admins can't edit superusers' data if (!Usr_CheckIfUsrIsSuperuser (UsrDat->UsrCod)) - return true; - return false; + return Usr_I_CAN; + return Usr_I_CAN_NOT; case Rol_INS_ADM: /* If I am an administrator of current institution, I only can edit from current institution who have accepted */ @@ -843,12 +843,12 @@ bool Usr_ICanEditOtherUsr (const struct Usr_Data *UsrDat) true)) // count only accepted courses // Institution admins can't edit superusers' data if (!Usr_CheckIfUsrIsSuperuser (UsrDat->UsrCod)) - return true; - return false; + return Usr_I_CAN; + return Usr_I_CAN_NOT; case Rol_SYS_ADM: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -856,50 +856,51 @@ bool Usr_ICanEditOtherUsr (const struct Usr_Data *UsrDat) /************ Check if I can view the record card of a student ***************/ /*****************************************************************************/ -bool Usr_CheckIfICanViewRecordStd (const struct Usr_Data *UsrDat) +Usr_ICan_t Usr_CheckIfICanViewRecordStd (const struct Usr_Data *UsrDat) { /***** 1. Fast check: Am I logged? *****/ if (!Gbl.Usrs.Me.Logged) - return false; + return Usr_I_CAN_NOT; /***** 2. Fast check: Is it a valid user code? *****/ if (UsrDat->UsrCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** 3. Fast check: Is it a course selected? *****/ if (Gbl.Hierarchy.Node[Hie_CRS].HieCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** 4. Fast check: Is he/she a student? *****/ if (UsrDat->Roles.InCurrentCrs != Rol_STD) - return false; + return Usr_I_CAN_NOT; /***** 5. Fast check: Am I a system admin? *****/ if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) - return true; + return Usr_I_CAN; /***** 6. Fast check: Do I belong to the current course? *****/ if (!Gbl.Usrs.Me.IBelongToCurrent[Hie_CRS]) - return false; + return Usr_I_CAN_NOT; /***** 7. Fast check: It's me? *****/ if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - return true; + return Usr_I_CAN; /***** 8. Fast / slow check: Does he/she belong to the current course? *****/ if (!Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) - return false; + return Usr_I_CAN_NOT; /***** 9. Fast / slow check depending on roles *****/ switch (Gbl.Usrs.Me.Role.Logged) { case Rol_STD: case Rol_NET: - return Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (UsrDat); + return Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (UsrDat) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Rol_TCH: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -910,68 +911,70 @@ bool Usr_CheckIfICanViewRecordStd (const struct Usr_Data *UsrDat) // - a non-editing teacher // - or a teacher -bool Usr_CheckIfICanViewRecordTch (struct Usr_Data *UsrDat) +Usr_ICan_t Usr_CheckIfICanViewRecordTch (struct Usr_Data *UsrDat) { /***** 1. Fast check: Am I logged? *****/ if (!Gbl.Usrs.Me.Logged) - return false; + return Usr_I_CAN_NOT; /***** 2. Fast check: Is it a valid user code? *****/ if (UsrDat->UsrCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** 3. Fast check: Is it a course selected? *****/ if (Gbl.Hierarchy.Node[Hie_CRS].HieCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** 4. Fast check: Is he/she a non-editing teacher or a teacher? *****/ return (UsrDat->Roles.InCurrentCrs == Rol_NET || - UsrDat->Roles.InCurrentCrs == Rol_TCH); + UsrDat->Roles.InCurrentCrs == Rol_TCH) ? Usr_I_CAN : + Usr_I_CAN_NOT; } /*****************************************************************************/ /********* Check if I can view test/exam/match result of another user ********/ /*****************************************************************************/ -bool Usr_CheckIfICanViewTstExaMchResult (const struct Usr_Data *UsrDat) +Usr_ICan_t Usr_CheckIfICanViewTstExaMchResult (const struct Usr_Data *UsrDat) { /***** 1. Fast check: Am I logged? *****/ if (!Gbl.Usrs.Me.Logged) - return false; + return Usr_I_CAN_NOT; /***** 2. Fast check: Is it a valid user code? *****/ if (UsrDat->UsrCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** 3. Fast check: Is it a course selected? *****/ if (Gbl.Hierarchy.Node[Hie_CRS].HieCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** 4. Fast check: Am I a system admin? *****/ if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) - return true; + return Usr_I_CAN; /***** 5. Fast check: Do I belong to the current course? *****/ if (!Gbl.Usrs.Me.IBelongToCurrent[Hie_CRS]) - return false; + return Usr_I_CAN_NOT; /***** 6. Fast check: It's me? *****/ if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - return true; + return Usr_I_CAN; /***** 7. Fast check: Does he/she belong to the current course? *****/ if (!Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) - return false; + return Usr_I_CAN_NOT; /***** 8. Fast / slow check depending on roles *****/ switch (Gbl.Usrs.Me.Role.Logged) { case Rol_NET: - return Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (UsrDat); + return Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (UsrDat) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Rol_TCH: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -979,46 +982,47 @@ bool Usr_CheckIfICanViewTstExaMchResult (const struct Usr_Data *UsrDat) /********** Check if I can view assigments / works of another user ***********/ /*****************************************************************************/ -bool Usr_CheckIfICanViewAsgWrk (const struct Usr_Data *UsrDat) +Usr_ICan_t Usr_CheckIfICanViewAsgWrk (const struct Usr_Data *UsrDat) { /***** 1. Fast check: Am I logged? *****/ if (!Gbl.Usrs.Me.Logged) - return false; + return Usr_I_CAN_NOT; /***** 2. Fast check: Is it a valid user code? *****/ if (UsrDat->UsrCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** 3. Fast check: Is it a course selected? *****/ if (Gbl.Hierarchy.Node[Hie_CRS].HieCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** 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)) - return false; + return Usr_I_CAN_NOT; /***** 5. Fast check: Am I a system admin? *****/ if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) - return true; + return Usr_I_CAN; /***** 6. Fast check: Do I belong to the current course? *****/ if (!Gbl.Usrs.Me.IBelongToCurrent[Hie_CRS]) - return false; + return Usr_I_CAN_NOT; /***** 7. Fast check: It's me? *****/ if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - return true; + return Usr_I_CAN; /***** 8. Fast / slow check depending on roles *****/ switch (Gbl.Usrs.Me.Role.Logged) { case Rol_NET: - return Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (UsrDat); + return Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (UsrDat) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Rol_TCH: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } @@ -1026,66 +1030,45 @@ bool Usr_CheckIfICanViewAsgWrk (const struct Usr_Data *UsrDat) /************** Check if I can view attendance of another user ***************/ /*****************************************************************************/ -bool Usr_CheckIfICanViewAtt (const struct Usr_Data *UsrDat) +Usr_ICan_t Usr_CheckIfICanViewAtt (const struct Usr_Data *UsrDat) { /***** 1. Fast check: Am I logged? *****/ if (!Gbl.Usrs.Me.Logged) - return false; + return Usr_I_CAN_NOT; /***** 2. Fast check: Is it a valid user code? *****/ if (UsrDat->UsrCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** 3. Fast check: Is it a course selected? *****/ if (Gbl.Hierarchy.Node[Hie_CRS].HieCod <= 0) - return false; + return Usr_I_CAN_NOT; /***** 4. Fast check: Am I a system admin? *****/ if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) - return true; + return Usr_I_CAN; /***** 5. Fast check: Do I belong to the current course? *****/ if (!Gbl.Usrs.Me.IBelongToCurrent[Hie_CRS]) - return false; + return Usr_I_CAN_NOT; /***** 6. Fast check: It's me? *****/ if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - return true; + return Usr_I_CAN; /***** 7. Fast / slow check depending on roles *****/ switch (Gbl.Usrs.Me.Role.Logged) { case Rol_NET: - return Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (UsrDat); + return Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (UsrDat) ? Usr_I_CAN : + Usr_I_CAN_NOT; case Rol_TCH: - return true; + return Usr_I_CAN; default: - return false; + return Usr_I_CAN_NOT; } } -/*****************************************************************************/ -/******************* Check if I can view a user's agenda *********************/ -/*****************************************************************************/ - -bool Usr_CheckIfICanViewUsrAgenda (struct Usr_Data *UsrDat) - { - /***** 1. Fast check: Am I logged? *****/ - if (!Gbl.Usrs.Me.Logged) - return false; - - /***** 2. Fast check: It's me? *****/ - if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) - return true; - - /***** 3. Fast check: Am I logged as system admin? *****/ - if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) - return true; - - /***** 4. Slow check: Get if user shares any course with me from database *****/ - return Enr_CheckIfUsrSharesAnyOfMyCrs (UsrDat); - } - /*****************************************************************************/ /***************************** Write landing page ****************************/ /*****************************************************************************/ diff --git a/swad_user.h b/swad_user.h index b3762f83e..d77d850e7 100644 --- a/swad_user.h +++ b/swad_user.h @@ -32,7 +32,6 @@ #include "swad_action.h" #include "swad_constant.h" #include "swad_cookie.h" -#include "swad_country.h" #include "swad_cryptography.h" #include "swad_date.h" #include "swad_degree.h" @@ -138,6 +137,13 @@ typedef enum } Usr_ListUsrsOption_t; #define Usr_LIST_USRS_DEFAULT_OPTION Usr_OPTION_RECORDS +#define Usr_NUM_I_CAN 2 +typedef enum + { + Usr_I_CAN_NOT, + Usr_I_CAN, + } Usr_ICan_t; + #define Usr_NUM_ME_OR_OTHER 2 typedef enum { @@ -304,15 +310,14 @@ void Usr_FlushCachesUsr (void); void Usr_FlushCacheUsrIsSuperuser (void); bool Usr_CheckIfUsrIsSuperuser (long UsrCod); -bool Usr_ICanChangeOtherUsrData (const struct Usr_Data *UsrDat); -bool Usr_ICanEditOtherUsr (const struct Usr_Data *UsrDat); +Usr_ICan_t Usr_ICanChangeOtherUsrData (const struct Usr_Data *UsrDat); +Usr_ICan_t Usr_CheckIfICanEditOtherUsr (const struct Usr_Data *UsrDat); -bool Usr_CheckIfICanViewRecordStd (const struct Usr_Data *UsrDat); -bool Usr_CheckIfICanViewRecordTch (struct Usr_Data *UsrDat); -bool Usr_CheckIfICanViewTstExaMchResult (const struct Usr_Data *UsrDat); -bool Usr_CheckIfICanViewAsgWrk (const struct Usr_Data *UsrDat); -bool Usr_CheckIfICanViewAtt (const struct Usr_Data *UsrDat); -bool Usr_CheckIfICanViewUsrAgenda (struct Usr_Data *UsrDat); +Usr_ICan_t Usr_CheckIfICanViewRecordStd (const struct Usr_Data *UsrDat); +Usr_ICan_t Usr_CheckIfICanViewRecordTch (struct Usr_Data *UsrDat); +Usr_ICan_t Usr_CheckIfICanViewTstExaMchResult (const struct Usr_Data *UsrDat); +Usr_ICan_t Usr_CheckIfICanViewAsgWrk (const struct Usr_Data *UsrDat); +Usr_ICan_t Usr_CheckIfICanViewAtt (const struct Usr_Data *UsrDat); void Usr_WriteLandingPage (void); void Usr_WriteFormLogout (void);