Version 23.72: Apr 01, 2024 New type Usr_ICan_t.

This commit is contained in:
acanas 2024-04-01 17:59:51 +02:00
parent 566cbc95a4
commit 665eb5e4ce
106 changed files with 1329 additions and 1272 deletions

View File

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

View File

@ -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;
}

View File

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

View File

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

View File

@ -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,

View File

@ -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 ****/
/*****************************************************************************/

View File

@ -35,6 +35,8 @@
/****************************** Public prototypes ****************************/
/*****************************************************************************/
Usr_ICan_t Adm_CheckIfICanAdminOtherUsrs (void);
void Adm_ReqAddAdm (Hie_Level_t Level);
void Adm_AddAdmToIns (void);

View File

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

View File

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

View File

@ -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 ();
}

View File

@ -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;
}
}

View File

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

View File

@ -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;
}
/*****************************************************************************/

View File

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

View File

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

View File

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

View File

@ -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\"");

View File

@ -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;
}
/*****************************************************************************/

View File

@ -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\"");

View File

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

View File

@ -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];

View File

@ -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,

View File

@ -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

View File

@ -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;
}
/*****************************************************************************/

View File

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

View File

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

View File

@ -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,

View File

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

View File

@ -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 *****/

View File

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

View File

@ -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;
}
/*****************************************************************************/

View File

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

View File

@ -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\"");

View File

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

View File

@ -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:

View File

@ -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 **************************/
/*****************************************************************************/

View File

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

View File

@ -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
}

View File

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

View File

@ -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;
}

View File

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

View File

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

View File

@ -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(<em>p<sub>i</sub></em>=1):&nbsp;%u; "
"%s(-1&le;<em>p<sub>i</sub></em>&lt;0):&nbsp;%u; "
"%s(<em>p<sub>i</sub></em>=0):&nbsp;%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]);

View File

@ -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;
}
}

View File

@ -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

View File

@ -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 ********************/
/*****************************************************************************/

View File

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

View File

@ -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;
}
/*****************************************************************************/

View File

@ -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
}
/*****************************************************************************/

View File

@ -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);
}
/*****************************************************************************/

View File

@ -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];

View File

@ -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,

View File

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

View File

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

View File

@ -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\"");

View File

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

View File

@ -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;
}
}

View File

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

View File

@ -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;
}
/*****************************************************************************/

View File

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

View File

@ -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;
}
}

View File

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

View File

@ -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,

View File

@ -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

View File

@ -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;
}
/*****************************************************************************/

View File

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

View File

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

View File

@ -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);
}
/*****************************************************************************/

View File

@ -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
}
/*****************************************************************************/

View File

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

View File

@ -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],

View File

@ -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);
}
/*****************************************************************************/

View File

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

View File

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

View File

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

View File

@ -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,

View File

@ -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];

View File

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

View File

@ -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 *************************/
/*****************************************************************************/

View File

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

View File

@ -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

View File

@ -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];

View File

@ -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

View File

@ -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\"");

View File

@ -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;
}
/*****************************************************************************/

View File

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

View File

@ -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 *****/

View File

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

View File

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

View File

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

View File

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

View File

@ -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 */

View File

@ -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;
}
/*****************************************************************************/

View File

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

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

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

View File

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

View File

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

View File

@ -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 *****/

Some files were not shown because too many files have changed in this diff Show More