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);