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 */ /* Get list of user's IDs */
ID_GetListIDsFromUsrCod (&UsrDat); ID_GetListIDsFromUsrCod (&UsrDat);
ICanSeeUsrID = ID_ICanSeeOtherUsrIDs (&UsrDat); ICanSeeUsrID = (ID_ICanSeeOtherUsrIDs (&UsrDat) == Usr_I_CAN);
/* Get nickname */ /* Get nickname */
Nck_DB_GetNicknameFromUsrCod (UsrDat.UsrCod,UsrDat.Nickname); Nck_DB_GetNicknameFromUsrCod (UsrDat.UsrCod,UsrDat.Nickname);
@ -4326,7 +4326,6 @@ int swad__getMatchStatus (struct soap *soap,
int ReturnCode; int ReturnCode;
struct Gam_Game Game; struct Gam_Game Game;
struct Mch_Match Match; struct Mch_Match Match;
bool ICanPlayThisMatchBasedOnGrps;
struct Mch_UsrAnswer UsrAnswer; struct Mch_UsrAnswer UsrAnswer;
/***** Reset game and match *****/ /***** Reset game and match *****/
@ -4395,8 +4394,7 @@ int swad__getMatchStatus (struct soap *soap,
"Requester must be a student in the course"); "Requester must be a student in the course");
/***** Can I play this match? *****/ /***** Can I play this match? *****/
ICanPlayThisMatchBasedOnGrps = Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match); if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match) == Usr_I_CAN_NOT)
if (!ICanPlayThisMatchBasedOnGrps)
return soap_receiver_fault (soap, return soap_receiver_fault (soap,
"Request forbidden", "Request forbidden",
"Requester can not join this match"); "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, The other user does not have to share any course with me,
but at least some course of each one has to share center. 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 *****/ /***** Get list of locations *****/
NumLocs = Roo_DB_GetUsrLastLocation (&mysql_res,(long) userCode); 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) void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor)
{ {
unsigned NumID; unsigned NumID;
bool ICanSeeUsrID = ID_ICanSeeOtherUsrIDs (UsrDat); bool ICanSeeUsrID = (ID_ICanSeeOtherUsrIDs (UsrDat) == Usr_I_CAN);
bool ICanConfirmUsrID = ICanSeeUsrID && bool ICanConfirmUsrID = ICanSeeUsrID &&
Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER && // Not me Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER && // Not me
!Frm_CheckIfInside () && // Not inside another form !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 *********************/ /***************** 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? *****/ /***** Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_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 *****/ /***** Check if I have permission to see another user's IDs *****/
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
@ -356,12 +356,12 @@ bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat)
case Rol_TCH: case Rol_TCH:
/* Check 1: I can see the IDs of users who do not exist in database */ /* 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) 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 */ /* Check 2: I can see the IDs of confirmed students */
if (UsrDat->Roles.InCurrentCrs == Rol_STD && // A student if (UsrDat->Roles.InCurrentCrs == Rol_STD && // A student
UsrDat->Accepted) // who accepted registration 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 */ /* Check 3: I can see the IDs of users with user's data empty */
// This check is made to not view simultaneously: // 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->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->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) !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_DEG_ADM:
case Rol_CTR_ADM: case Rol_CTR_ADM:
case Rol_INS_ADM: case Rol_INS_ADM:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return Usr_ICanEditOtherUsr (UsrDat); return Usr_CheckIfICanEditOtherUsr (UsrDat);
default: 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 *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Remove user's ID *****/ /***** Remove user's ID *****/
ID_RemoveUsrID (&Gbl.Usrs.Other.UsrDat, 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]; char UsrID[ID_MAX_BYTES_USR_ID + 1];
bool ICanRemove; bool ICanRemove;
if (Usr_ICanEditOtherUsr (UsrDat)) if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
{ {
/***** Get user's ID from form *****/ /***** Get user's ID from form *****/
Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID); 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 *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Change user's ID *****/ /***** Change user's ID *****/
ID_ChangeUsrID (&Gbl.Usrs.Other.UsrDat, 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; bool AlreadyExists;
unsigned NumIDFound = 0; // Initialized to avoid warning 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 *****/ /***** Get new user's ID from form *****/
Par_GetParText ("NewID",NewID,ID_MAX_BYTES_USR_ID); 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) if (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs == Rol_STD)
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); 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; ICanConfirm = true;
} }

View File

@ -70,7 +70,7 @@ bool ID_CheckIfUsrIDIsValid (const char *UsrID);
bool ID_CheckIfUsrIDSeemsAValidID (const char *UsrID); bool ID_CheckIfUsrIDSeemsAValidID (const char *UsrID);
void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor); 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_ShowFormChangeMyID (bool IShouldFillInID);
void ID_ShowFormChangeOtherUsrID (void); void ID_ShowFormChangeOtherUsrID (void);

View File

@ -488,7 +488,7 @@ void Acc_ShowFormChgOtherUsrAccount (void)
/***** Get user whose account must be changed *****/ /***** Get user whose account must be changed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) 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 /***** Get user's nickname and email address
It's necessary because nickname or email could be just updated *****/ 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) 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, Lay_PutContextualLinkOnlyIcon (ActReqRemMyAcc,NULL,
Acc_PutParsToRemoveMyAccount,Gbl.Usrs.Me.UsrDat.EnUsrCod, Acc_PutParsToRemoveMyAccount,Gbl.Usrs.Me.UsrDat.EnUsrCod,
"trash.svg",Ico_RED); "trash.svg",Ico_RED);
@ -771,7 +771,7 @@ void Acc_GetUsrCodAndRemUsrGbl (void)
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) 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); Acc_ReqRemAccountOrRemAccount (Acc_REMOVE_USR);
else else
Error = true; Error = true;
@ -814,7 +814,7 @@ void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove)
/******** Check if I can eliminate completely another user's account *********/ /******** 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); Usr_MeOrOther_t MeOrOther = Usr_ItsMe (UsrCod);
@ -823,10 +823,14 @@ bool Acc_CheckIfICanEliminateAccount (long UsrCod)
switch (MeOrOther) switch (MeOrOther)
{ {
case Usr_ME: 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: case Usr_OTHER:
default: 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; break;
case Usr_OTHER: case Usr_OTHER:
default: default:
if (Usr_ICanEditOtherUsr (UsrDat)) if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL, Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
"at.svg",Ico_BLACK); "at.svg",Ico_BLACK);

View File

@ -62,7 +62,7 @@ void Acc_AfterCreationNewAccount (void);
void Acc_GetUsrCodAndRemUsrGbl (void); void Acc_GetUsrCodAndRemUsrGbl (void);
void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove); 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_AskIfRemoveMyAccount (void);
void Acc_RemoveMyAccount (void); void Acc_RemoveMyAccount (void);
void Acc_CompletelyEliminateAccount (struct Usr_Data *UsrDat, void Acc_CompletelyEliminateAccount (struct Usr_Data *UsrDat,

View File

@ -34,20 +34,6 @@
#include "swad_global.h" #include "swad_global.h"
#include "swad_user_database.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 ****************/ /************** 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_AskIfRemAdm (Usr_MeOrOther_t MeOrOther,Hie_Level_t Level);
static void Adm_EffectivelyRemAdm (struct Usr_Data *UsrDat,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 ****/ /**** Ask if really wanted to add an administrator to current institution ****/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -35,6 +35,8 @@
/****************************** Public prototypes ****************************/ /****************************** Public prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
Usr_ICan_t Adm_CheckIfICanAdminOtherUsrs (void);
void Adm_ReqAddAdm (Hie_Level_t Level); void Adm_ReqAddAdm (Hie_Level_t Level);
void Adm_AddAdmToIns (void); 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); 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 ****************************/ /*************************** Reset agenda context ****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -386,7 +409,7 @@ void Agd_ShowUsrAgenda (void)
/***** Get user *****/ /***** Get user *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
if (Usr_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat)) if (Agd_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
Error = false; Error = false;
@ -695,8 +718,7 @@ static void Agd_PutIconToCreateNewEvent (void *Agenda)
static void Agd_PutIconToViewEditMyFullAgenda (void *EncryptedUsrCod) static void Agd_PutIconToViewEditMyFullAgenda (void *EncryptedUsrCod)
{ {
Ico_PutContextualIconToEdit (ActSeeMyAgd,NULL, Ico_PutContextualIconToEdit (ActSeeMyAgd,NULL,NULL,EncryptedUsrCod);
NULL,EncryptedUsrCod);
} }
static void Agd_PutIconToShowQR (void) static void Agd_PutIconToShowQR (void)
@ -714,19 +736,19 @@ static void Agd_PutIconToShowQR (void)
static void Agd_PutIconsOtherPublicAgenda (void *EncryptedUsrCod) static void Agd_PutIconsOtherPublicAgenda (void *EncryptedUsrCod)
{ {
/***** Button to view user's public profile *****/ /***** Button to view user's public profile *****/
if (Pri_ShowingIsAllowed (Gbl.Usrs.Other.UsrDat.BaPrfVisibility, if (Pri_CheckIfICanView (Gbl.Usrs.Other.UsrDat.BaPrfVisibility,
&Gbl.Usrs.Other.UsrDat)) &Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
Lay_PutContextualLinkOnlyIcon (ActSeeOthPubPrf,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeOthPubPrf,NULL,
Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod, Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod,
"user.svg",Ico_BLACK); "user.svg",Ico_BLACK);
/***** Button to view user's record card *****/ /***** 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 */ /* View student's records: common record card and course record card */
Lay_PutContextualLinkOnlyIcon (ActSeeRecOneStd,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeRecOneStd,NULL,
Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod, Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod,
"address-card.svg",Ico_BLACK); "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, Lay_PutContextualLinkOnlyIcon (ActSeeRecOneTch,NULL,
Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod, Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod,
"address-card.svg",Ico_BLACK); "address-card.svg",Ico_BLACK);

View File

@ -101,6 +101,8 @@ typedef enum
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
Usr_ICan_t Agd_CheckIfICanViewUsrAgenda (struct Usr_Data *UsrDat);
void Agd_PutFormLogInToShowUsrAgenda (void); void Agd_PutFormLogInToShowUsrAgenda (void);
void Agd_PutParAgd (void); void Agd_PutParAgd (void);

View File

@ -34,6 +34,7 @@
#include "swad_action_list.h" #include "swad_action_list.h"
#include "swad_alert.h" #include "swad_alert.h"
#include "swad_box.h"
#include "swad_error.h" #include "swad_error.h"
#include "swad_form.h" #include "swad_form.h"
#include "swad_global.h" #include "swad_global.h"
@ -398,15 +399,15 @@ static void Ale_ShowFixAlertAndButtonBegin (Ale_AlertType_t AlertType,const char
{ {
extern const char *Txt_Close; extern const char *Txt_Close;
char IdAlert[Frm_MAX_BYTES_ID + 1]; 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_NONE ] = Box_NOT_CLOSABLE,
[Ale_CLIPBOARD] = true, [Ale_CLIPBOARD] = Box_CLOSABLE,
[Ale_INFO ] = true, [Ale_INFO ] = Box_CLOSABLE,
[Ale_SUCCESS ] = true, [Ale_SUCCESS ] = Box_CLOSABLE,
[Ale_QUESTION ] = true, [Ale_QUESTION ] = Box_CLOSABLE,
[Ale_WARNING ] = true, [Ale_WARNING ] = Box_CLOSABLE,
[Ale_ERROR ] = true, [Ale_ERROR ] = Box_CLOSABLE,
}; };
static const char *Ale_AlertIcons[Ale_NUM_ALERT_TYPES] = 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 (); Lay_WriteStartOfPage ();
/***** Begin container *****/ /***** Begin container *****/
if (AlertClosable[AlertType]) switch (AlertClosable[AlertType])
{ {
/* Create unique id for alert */ case Box_NOT_CLOSABLE:
Frm_SetUniqueId (IdAlert); HTM_DIV_Begin ("class=\"CM\"");
HTM_DIV_Begin ("id=\"%s\" class=\"CM\"",IdAlert); 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 *****/ /***** Begin box *****/
HTM_DIV_Begin ("class=\"ALERT ALERT_BG_%s\"",The_GetSuffix ()); HTM_DIV_Begin ("class=\"ALERT ALERT_BG_%s\"",The_GetSuffix ());
/***** Icon to close the alert *****/ /***** Icon to close the alert *****/
if (AlertClosable[AlertType]) switch (AlertClosable[AlertType])
{ {
HTM_DIV_Begin ("class=\"ALERT_CLOSE\""); case Box_NOT_CLOSABLE:
HTM_A_Begin ("href=\"\" onclick=\"toggleDisplay('%s');return false;\" /", break;
IdAlert); case Box_CLOSABLE:
Ico_PutIcon ("times.svg",Ico_BLACK,Txt_Close,"ICO16x16"); HTM_DIV_Begin ("class=\"ALERT_CLOSE\"");
HTM_A_End (); HTM_A_Begin ("href=\"\" onclick=\"toggleDisplay('%s');return false;\" /",
HTM_DIV_End (); IdAlert);
Ico_PutIcon ("times.svg",Ico_BLACK,Txt_Close,"ICO16x16");
HTM_A_End ();
HTM_DIV_End ();
break;
} }
/***** Write message *****/ /***** Write message *****/
if (AlertType == Ale_NONE) switch (AlertType)
HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\"", {
The_GetSuffix ()); case Ale_NONE:
else HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\"",The_GetSuffix ());
HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\"" break;
" style=\"background-image:url('%s/%s');\"", default:
The_GetSuffix (), HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\""
Cfg_URL_ICON_PUBLIC,Ale_AlertIcons[AlertType]); " style=\"background-image:url('%s/%s');\"",
The_GetSuffix (),
Cfg_URL_ICON_PUBLIC,Ale_AlertIcons[AlertType]);
break;
}
HTM_Txt (Txt); HTM_Txt (Txt);
HTM_DIV_End (); HTM_DIV_End ();
} }

View File

@ -56,6 +56,16 @@
#include "swad_setting.h" #include "swad_setting.h"
#include "swad_string.h" #include "swad_string.h"
/*****************************************************************************/
/******************************* Private types *******************************/
/*****************************************************************************/
typedef enum
{
Asg_ONE_ASSIGMENT,
Asg_MULTIPLE_ASSIGMENTS
} Asg_OneOrMultiple_t;
/*****************************************************************************/ /*****************************************************************************/
/************** External global variables from others modules ****************/ /************** External global variables from others modules ****************/
/*****************************************************************************/ /*****************************************************************************/
@ -67,14 +77,15 @@ extern struct Globals Gbl;
/*****************************************************************************/ /*****************************************************************************/
static void Asg_PutHead (struct Asg_Assignments *Assignments, static void Asg_PutHead (struct Asg_Assignments *Assignments,
bool OnlyOneAssignment,Vie_ViewType_t ViewType); Asg_OneOrMultiple_t OneOrMultiple,
static bool Asg_CheckIfICanCreateAssignments (void); Vie_ViewType_t ViewType);
static Usr_ICan_t Asg_CheckIfICanCreateAssignments (void);
static void Asg_PutIconsListAssignments (void *Assignments); static void Asg_PutIconsListAssignments (void *Assignments);
static void Asg_PutIconToCreateNewAsg (void *Assignments); static void Asg_PutIconToCreateNewAsg (void *Assignments);
static void Asg_ParsWhichGroupsToShow (void *Assignments); static void Asg_ParsWhichGroupsToShow (void *Assignments);
static void Asg_PutIconsOneAsg (void *Assignments); static void Asg_PutIconsOneAsg (void *Assignments);
static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments, static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
bool OnlyOneAssignment, Asg_OneOrMultiple_t OneOrMultiple,
Vie_ViewType_t ViewType); Vie_ViewType_t ViewType);
static void Asg_WriteAsgAuthor (struct Asg_Assignment *Asg); static void Asg_WriteAsgAuthor (struct Asg_Assignment *Asg);
static void Asg_WriteAssignmentFolder (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"); HTM_TABLE_Begin ("TBL_SCROLL");
/***** Table head *****/ /***** Table head *****/
Asg_PutHead (Assignments, Asg_PutHead (Assignments,Asg_MULTIPLE_ASSIGMENTS,Vie_VIEW);
false, // Not only this assignment in table
Vie_VIEW); // Not print view
/***** Write all assignments *****/ /***** Write all assignments *****/
for (NumAsg = Pagination.FirstItemVisible, The_ResetRowColor (); for (NumAsg = Pagination.FirstItemVisible, The_ResetRowColor ();
@ -187,9 +196,7 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments)
{ {
Assignments->Asg.AsgCod = Assignments->LstAsgCods[NumAsg - 1]; Assignments->Asg.AsgCod = Assignments->LstAsgCods[NumAsg - 1];
Asg_GetAssignmentDataByCod (&Assignments->Asg); Asg_GetAssignmentDataByCod (&Assignments->Asg);
Asg_ShowAssignmentRow (Assignments, Asg_ShowAssignmentRow (Assignments,Asg_MULTIPLE_ASSIGMENTS,Vie_VIEW);
false, // Not only this assignment in table
Vie_VIEW); // Not print view
} }
/***** End table *****/ /***** End table *****/
@ -214,7 +221,8 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments)
/*****************************************************************************/ /*****************************************************************************/
static void Asg_PutHead (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_HELP[Dat_NUM_START_END_TIME];
extern const char *Txt_START_END_TIME[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); 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 HTM_TH_Span (NULL,HTM_HEAD_CENTER,1,1,"CONTEXT_COL"); // Column for contextual icons
for (Order = (Dat_StartEndTime_t) 0; for (Order = (Dat_StartEndTime_t) 0;
@ -279,10 +287,11 @@ static void Asg_PutHead (struct Asg_Assignments *Assignments,
/******************** Check if I can create 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 || return (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; 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 *****/ /***** Put icon to create a new assignment *****/
if (Assignments) if (Assignments)
{ {
if (Asg_CheckIfICanCreateAssignments ()) if (Asg_CheckIfICanCreateAssignments () == Usr_I_CAN)
Asg_PutIconToCreateNewAsg (Assignments); Asg_PutIconToCreateNewAsg (Assignments);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
{ {
((struct Asg_Assignments *) Assignments)->Asg.AsgCod = -1L; ((struct Asg_Assignments *) Assignments)->Asg.AsgCod = -1L;
Ico_PutContextualIconToGetLink (ActReqLnkAsg,NULL, Ico_PutContextualIconToGetLink (ActReqLnkAsg,NULL,
@ -393,14 +402,10 @@ void Asg_PrintOneAssignment (void)
HTM_TABLE_BeginWideMarginPadding (2); HTM_TABLE_BeginWideMarginPadding (2);
/***** Table head *****/ /***** Table head *****/
Asg_PutHead (&Assignments, Asg_PutHead (&Assignments,Asg_ONE_ASSIGMENT,Vie_PRINT);
true, // Only this assignment in table
Vie_PRINT); // Print view
/***** Write assignment *****/ /***** Write assignment *****/
Asg_ShowAssignmentRow (&Assignments, Asg_ShowAssignmentRow (&Assignments,Asg_ONE_ASSIGMENT,Vie_PRINT);
true, // Only this assignment in table
Vie_PRINT); // Print view
/***** End table *****/ /***** End table *****/
HTM_TABLE_End (); HTM_TABLE_End ();
@ -425,14 +430,10 @@ void Asg_ShowOneAssignmentInBox (struct Asg_Assignments *Assignments)
HTM_TABLE_Begin ("TBL_SCROLL"); HTM_TABLE_Begin ("TBL_SCROLL");
/***** Table head *****/ /***** Table head *****/
Asg_PutHead (Assignments, Asg_PutHead (Assignments,Asg_ONE_ASSIGMENT,Vie_VIEW);
true, // Only this assignment in table
Vie_VIEW); // Not print view
/***** Write assignment *****/ /***** Write assignment *****/
Asg_ShowAssignmentRow (Assignments, Asg_ShowAssignmentRow (Assignments,Asg_ONE_ASSIGMENT,Vie_VIEW);
true, // Only this assignment in table
Vie_VIEW); // Not print view
/***** End table *****/ /***** End table *****/
HTM_TABLE_End (); HTM_TABLE_End ();
@ -467,7 +468,7 @@ static void Asg_PutIconsOneAsg (void *Assignments)
/*****************************************************************************/ /*****************************************************************************/
static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments, static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
bool OnlyOneAssignment, Asg_OneOrMultiple_t OneOrMultiple,
Vie_ViewType_t ViewType) Vie_ViewType_t ViewType)
{ {
extern const char *Txt_Actions[ActLst_NUM_ACTIONS]; extern const char *Txt_Actions[ActLst_NUM_ACTIONS];
@ -488,7 +489,7 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/* Forms to remove/edit this assignment */ /* Forms to remove/edit this assignment */
if (!OnlyOneAssignment) if (OneOrMultiple == Asg_MULTIPLE_ASSIGMENTS)
{ {
HTM_TD_Begin ("rowspan=\"2\" class=\"CONTEXT_COL %s\"", HTM_TD_Begin ("rowspan=\"2\" class=\"CONTEXT_COL %s\"",
The_GetColorRows ()); The_GetColorRows ());
@ -768,7 +769,7 @@ static void Asg_PutIconsToRemEditOneAsg (struct Asg_Assignments *Assignments,
Asg_PutPars,Assignments); Asg_PutPars,Assignments);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkAsg,NULL, Ico_PutContextualIconToGetLink (ActReqLnkAsg,NULL,
Asg_PutPars,Assignments); Asg_PutPars,Assignments);
/* falls through */ /* falls through */
@ -1640,7 +1641,7 @@ static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod)
case Rol_TCH: case Rol_TCH:
// Students and teachers can do assignments depending on groups // Students and teachers can do assignments depending on groups
/***** Get if I can do an assignment from database *****/ /***** 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: case Rol_SYS_ADM:
return true; return true;
default: 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 **/ /* 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 *****/ /***** Trivial check 1: assignment is valid *****/
if (Asg->AsgCod <= 0) if (Asg->AsgCod <= 0)
return false; return Usr_I_CAN_NOT;
/***** Check 2: Do not create anything in hidden assigments *****/ /***** Check 2: Do not create anything in hidden assigments *****/
if (Asg->HiddenOrVisible == HidVis_HIDDEN) 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, /***** Check 3: If I do not belong to course / groups of this assignment,
I can not create anything inside this assignment *****/ I can not create anything inside this assignment *****/
if (!Asg->IBelongToCrsOrGrps) if (!Asg->IBelongToCrsOrGrps)
return false; return Usr_I_CAN_NOT;
/***** Check 4: Depending on my role in this course... *****/ /***** Check 4: Depending on my role in this course... *****/
switch (Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs) switch (Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs)
{ {
case Rol_STD: // Students... case Rol_STD: // Students...
case Rol_NET: // ...and non-editing teachers... case Rol_NET: // ...and non-editing teachers...
return Asg->Open; // ...can create inside open assignments return Asg->Open ? Usr_I_CAN : // ...can create inside open assignments
case Rol_TCH: // Teachers... Usr_I_CAN_NOT;
return true; // ...can create inside open or closed assignments case Rol_TCH: // Teachers...
return Usr_I_CAN; // ...can create inside open or closed assignments
default: 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_RemoveCrsAssignments (long CrsCod);
void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg); 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); void Asg_SetFolder (struct Asg_Assignment *Asg,unsigned Level);
unsigned Asg_GetNumAssignments (Hie_Level_t Level,unsigned *NumNotif); 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 ***********************/ /********************* 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 // Students and teachers can do assignments depending on groups
return return
@ -355,7 +355,8 @@ bool Asg_DB_CheckIfICanDoAssignment (long AsgCod)
" AND asg_groups.GrpCod=grp_users.GrpCod)" " AND asg_groups.GrpCod=grp_users.GrpCod)"
"))", "))",
AsgCod, 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); 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); unsigned Asg_DB_GetGrps (MYSQL_RES **mysql_res,long AsgCod);
void Asg_DB_CreateGroup (long AsgCod,long GrpCod); 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); Usr_PutParMyUsrCodEncrypted,Gbl.Usrs.Me.UsrDat.EnUsrCod);
/***** Put icon to get resource link *****/ /***** Put icon to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkAtt,NULL, Ico_PutContextualIconToGetLink (ActReqLnkAtt,NULL,
Att_PutPars,Events); Att_PutPars,Events);
} }
@ -579,7 +579,7 @@ static void Att_PutFormsToRemEditOneEvent (struct Att_Events *Events,
[HidVis_VISIBLE] = ActHidAtt, // Visible ==> action to hide [HidVis_VISIBLE] = ActHidAtt, // Visible ==> action to hide
}; };
if (Att_CheckIfICanEditEvents ()) if (Att_CheckIfICanEditEvents () == Usr_I_CAN)
{ {
/***** Icon to remove attendance event *****/ /***** Icon to remove attendance event *****/
Ico_PutContextualIconToRemove (ActReqRemAtt,NULL, Ico_PutContextualIconToRemove (ActReqRemAtt,NULL,
@ -591,27 +591,24 @@ static void Att_PutFormsToRemEditOneEvent (struct Att_Events *Events,
Events->Event.HiddenOrVisible); Events->Event.HiddenOrVisible);
/***** Icon to edit attendance event *****/ /***** Icon to edit attendance event *****/
Ico_PutContextualIconToEdit (ActEdiOneAtt,NULL, Ico_PutContextualIconToEdit (ActEdiOneAtt,NULL,Att_PutPars,Events);
Att_PutPars,Events);
} }
/***** Icon to get resource link *****/ /***** Icon to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkAtt,NULL, Ico_PutContextualIconToGetLink (ActReqLnkAtt,NULL,Att_PutPars,Events);
Att_PutPars,Events);
} }
/*****************************************************************************/ /*****************************************************************************/
/******************* Check if I can edit calls for exams *********************/ /******************* 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_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanEditAttEvents[Gbl.Usrs.Me.Role.Logged]; return ICanEditAttEvents[Gbl.Usrs.Me.Role.Logged];
@ -2181,7 +2178,7 @@ static void Att_ReqListOrPrintUsrsAttendanceCrs (__attribute__((unused)) void *A
Txt_Attendance_list, Txt_Attendance_list,
Hlp_USERS_Attendance_attendance_list, Hlp_USERS_Attendance_attendance_list,
Txt_View_attendance, 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 *****/ /***** Free list of attendance events *****/
Att_FreeListEvents (&Events); Att_FreeListEvents (&Events);
@ -2722,8 +2719,7 @@ static void Att_ListEventsToSelect (struct Att_Events *Events,
static void Att_PutIconToViewAttEvents (__attribute__((unused)) void *Args) static void Att_PutIconToViewAttEvents (__attribute__((unused)) void *Args)
{ {
Ico_PutContextualIconToView (ActSeeAllAtt,NULL, Ico_PutContextualIconToView (ActSeeAllAtt,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2732,8 +2728,7 @@ static void Att_PutIconToViewAttEvents (__attribute__((unused)) void *Args)
static void Att_PutIconToEditAttEvents (__attribute__((unused)) void *Args) static void Att_PutIconToEditAttEvents (__attribute__((unused)) void *Args)
{ {
Ico_PutContextualIconToEdit (ActSeeAllAtt,NULL, Ico_PutContextualIconToEdit (ActSeeAllAtt,NULL,NULL,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 if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get from the database the data of the student
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS)) Usr_DONT_GET_ROLE_IN_CRS))
if (Usr_CheckIfICanViewAtt (&UsrDat)) if (Usr_CheckIfICanViewAtt (&UsrDat) == Usr_I_CAN)
{ {
UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&UsrDat); UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&UsrDat);
Att_WriteRowUsrSeveralAttEvents (Events,NumUsr,&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 if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get from the database the data of the student
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS)) Usr_DONT_GET_ROLE_IN_CRS))
if (Usr_CheckIfICanViewAtt (&UsrDat)) if (Usr_CheckIfICanViewAtt (&UsrDat) == Usr_I_CAN)
{ {
UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&UsrDat); UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&UsrDat);
Att_ListAttEventsForAStd (Events,NumUsr,&UsrDat); Att_ListAttEventsForAStd (Events,NumUsr,&UsrDat);

View File

@ -85,7 +85,7 @@ struct Att_Events
void Att_SeeEvents (void); void Att_SeeEvents (void);
bool Att_CheckIfICanEditEvents (void); Usr_ICan_t Att_CheckIfICanEditEvents (void);
void Att_ReqCreatOrEditEvent (void); void Att_ReqCreatOrEditEvent (void);
bool Att_GetEventDataByCod (struct Att_Event *Event); 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) static void Ban_PutIconToEditBanners (void)
{ {
Ico_PutContextualIconToEdit (ActEdiBan,NULL, Ico_PutContextualIconToEdit (ActEdiBan,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -357,8 +356,7 @@ static void Ban_GetBannerDataFromRow (MYSQL_RES *mysql_res,
static void Ban_PutIconsEditingBanners (__attribute__((unused)) void *Args) static void Ban_PutIconsEditingBanners (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view banners *****/ /***** Put icon to view banners *****/
Ico_PutContextualIconToView (ActSeeBan,NULL, Ico_PutContextualIconToView (ActSeeBan,NULL,NULL,NULL);
NULL,NULL);
/***** Put icon to view links *****/ /***** Put icon to view links *****/
Lnk_PutIconToViewLinks (); Lnk_PutIconToViewLinks ();
@ -370,9 +368,7 @@ static void Ban_PutIconsEditingBanners (__attribute__((unused)) void *Args)
void Ban_PutIconToViewBanners (void) void Ban_PutIconToViewBanners (void)
{ {
Lay_PutContextualLinkOnlyIcon (ActSeeBan,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeBan,NULL,NULL,NULL,"flag.svg",Ico_BLACK);
NULL,NULL,
"flag.svg",Ico_BLACK);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -447,7 +443,7 @@ static void Ban_ListBannersForEdition (struct Ban_Banners *Banners)
Nam_ExistingShortAndFullNames (ActionRename, Nam_ExistingShortAndFullNames (ActionRename,
ParCod_Ban,Banners->BanCodToEdit, ParCod_Ban,Banners->BanCodToEdit,
Names, Names,
true); // Put form Frm_PUT_FORM);
/* Banner image */ /* Banner image */
HTM_TD_Begin ("class=\"LM\""); HTM_TD_Begin ("class=\"LM\"");

View File

@ -1097,7 +1097,7 @@ static Act_Action_t Brw_ActZIPFolder[Brw_NUM_TYPES_FILE_BROWSER] =
/***************************** Private variables *****************************/ /***************************** 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 *****************************/ /**************************** Private prototypes *****************************/
@ -1213,7 +1213,7 @@ static bool Brw_CheckIfUploadIsAllowed (const char *FileType);
static void Brw_PutIconToGetLinkToFile (void *FileMetadata); static void Brw_PutIconToGetLinkToFile (void *FileMetadata);
static void Brw_PutParsToGetLinkToFile (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 bool Brw_CheckIfIAmOwnerOfFile (long PublisherUsrCod);
static void Brw_WriteBigLinkToDownloadFile (const char *URL, static void Brw_WriteBigLinkToDownloadFile (const char *URL,
struct Brw_FileMetadata *FileMetadata, 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_RemoveOneFileOrFolderFromDB (const char Path[PATH_MAX + 1]);
static void Brw_RemoveChildrenOfFolderFromDB (const char Path[PATH_MAX + 1]); static void Brw_RemoveChildrenOfFolderFromDB (const char Path[PATH_MAX + 1]);
static void Brw_SetIfICanEditFileOrFolder (bool Value); static void Brw_SetIfICanEditFileOrFolder (Usr_ICan_t Value);
static bool Brw_GetIfICanEditFileOrFolder (void); static Usr_ICan_t Brw_GetIfICanEditFileOrFolder (void);
static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level); static Usr_ICan_t Brw_CheckIfICanEditFileOrFolder (unsigned Level);
static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level); static Usr_ICan_t Brw_CheckIfICanCreateIntoFolder (unsigned Level);
static bool Brw_CheckIfICanModifySharedFileOrFolder (void); static Usr_ICan_t Brw_CheckIfICanModifySharedFileOrFolder (void);
static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void); static Usr_ICan_t Brw_CheckIfICanModifyPrivateFileOrFolder (void);
static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void); static Usr_ICan_t Brw_CheckIfICanModifyPrjDocFileOrFolder (void);
static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void); static Usr_ICan_t Brw_CheckIfICanModifyPrjAssFileOrFolder (void);
static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row); 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, Txt_Assignments_and_other_works,
Hlp_FILES_Homework_for_teachers, Hlp_FILES_Homework_for_teachers,
Txt_View_homework, 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 (); Brw_WriteTopBeforeShowingFileBrowser ();
if (Prj_CheckIfICanViewProjectDocuments (PrjCod)) if (Prj_CheckIfICanViewProjectDocuments (PrjCod) == Usr_I_CAN)
{ {
/***** Show the tree with the project documents *****/ /***** Show the tree with the project documents *****/
Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ; Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ;
@ -2752,7 +2752,7 @@ void Brw_ShowFileBrowserProject (long PrjCod)
Brw_ShowFileBrowser (); Brw_ShowFileBrowser ();
} }
if (Prj_CheckIfICanViewProjectAssessment (PrjCod)) if (Prj_CheckIfICanViewProjectAssessment (PrjCod) == Usr_I_CAN)
{ {
/***** Show the tree with the project assessment *****/ /***** Show the tree with the project assessment *****/
Gbl.FileBrowser.Type = Brw_ADMI_ASS_PRJ; Gbl.FileBrowser.Type = Brw_ADMI_ASS_PRJ;
@ -2798,7 +2798,7 @@ static void Brw_ShowFileBrowsersAsgWrkCrs (void)
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_GET_ROLE_IN_CRS)) 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 = Gbl.Usrs.Other.UsrDat.Accepted =
Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
@ -3333,7 +3333,7 @@ static void Brw_PutIconsFileBrowser (__attribute__((unused)) void *Args)
/***** Put icon to get resource link *****/ /***** Put icon to get resource link *****/
if (Brw_ActReqLnk[Gbl.FileBrowser.Type] != ActUnk && if (Brw_ActReqLnk[Gbl.FileBrowser.Type] != ActUnk &&
Rsc_CheckIfICanGetLink ()) Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (Brw_ActReqLnk[Gbl.FileBrowser.Type],NULL, Ico_PutContextualIconToGetLink (Brw_ActReqLnk[Gbl.FileBrowser.Type],NULL,
NULL,NULL); NULL,NULL);
@ -3997,7 +3997,7 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
} }
/****** If current action allows file administration... ******/ /****** If current action allows file administration... ******/
Brw_SetIfICanEditFileOrFolder (false); Brw_SetIfICanEditFileOrFolder (Usr_I_CAN_NOT);
if (Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type) && if (Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type) &&
!Gbl.FileBrowser.ShowOnlyPublicFiles) !Gbl.FileBrowser.ShowOnlyPublicFiles)
{ {
@ -4155,7 +4155,7 @@ static bool Brw_CheckIfCanPasteIn (unsigned Level)
return false; return false;
/**** If I can not create elements into this folder... *****/ /**** 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 return false; // Pasting into top level of assignments is forbidden
/**** If we are in the same tree of the clipboard... *****/ /**** 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 ()); 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) switch (Gbl.FileBrowser.FilFolLnk.Type)
{ {
case Brw_IS_FILE: case Brw_IS_FILE:
@ -4459,13 +4459,11 @@ static void Brw_PutIconFolder (unsigned Level,
const char *FileBrowserId,const char *RowId, const char *FileBrowserId,const char *RowId,
Brw_IconTree_t IconSubtree) Brw_IconTree_t IconSubtree)
{ {
bool ICanCreate;
/***** Begin cell *****/ /***** Begin cell *****/
HTM_TD_Begin ("class=\"BM %s\"",The_GetColorRows ()); HTM_TD_Begin ("class=\"BM %s\"",The_GetColorRows ());
/***** Put icon to create a new file or folder *****/ /***** 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) if (IconSubtree == Brw_ICON_TREE_EXPAND)
{ {
@ -4721,7 +4719,7 @@ static void Brw_WriteFileName (unsigned Level,bool IsPublic,
HTM_NBSP (); 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 *****/ /***** Form to rename folder *****/
Frm_BeginForm (Brw_ActRenameFolder[Gbl.FileBrowser.Type]); Frm_BeginForm (Brw_ActRenameFolder[Gbl.FileBrowser.Type]);
@ -4935,7 +4933,7 @@ void Brw_AskRemFileFromTree (void)
Brw_GetParAndInitFileBrowser (); Brw_GetParAndInitFileBrowser ();
/***** Button of confirmation of removing *****/ /***** 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 *****/ /***** Show question and button to remove file/link *****/
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
@ -4970,7 +4968,7 @@ void Brw_RemFileFromTree (void)
/***** Get parameters related to file browser *****/ /***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser (); 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", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Path.AboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
@ -5023,7 +5021,7 @@ void Brw_RemFolderFromTree (void)
/***** Get parameters related to file browser *****/ /***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser (); 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", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Path.AboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
@ -5089,7 +5087,7 @@ void Brw_RemSubtreeInFileBrowser (void)
/***** Get parameters related to file browser *****/ /***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser (); 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", snprintf (Path,sizeof (Path),"%s/%s",
Gbl.FileBrowser.Path.AboveRootFolder, Gbl.FileBrowser.Path.AboveRootFolder,
@ -6191,7 +6189,7 @@ void Brw_ShowFormFileBrowser (void)
Brw_GetParAndInitFileBrowser (); Brw_GetParAndInitFileBrowser ();
/***** Check if creating a new folder or file is allowed *****/ /***** 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 ****/ /***** Name of the folder to be shown ****/
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type, Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
@ -6487,7 +6485,7 @@ void Brw_RecFolderFileBrowser (void)
Brw_GetParAndInitFileBrowser (); Brw_GetParAndInitFileBrowser ();
/***** Check if creating a new folder is allowed *****/ /***** 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)) if (Str_ConvertFilFolLnkNameToValid (Gbl.FileBrowser.NewFilFolLnkName))
{ {
@ -6587,7 +6585,7 @@ void Brw_RenFolderFileBrowser (void)
/***** Get parameters related to file browser *****/ /***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser (); 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)) if (Str_ConvertFilFolLnkNameToValid (Gbl.FileBrowser.NewFilFolLnkName))
{ {
@ -6758,7 +6756,7 @@ static bool Brw_RcvFileInFileBrw (struct BrwSiz_BrowserSize *Size,
Brw_GetParAndInitFileBrowser (); Brw_GetParAndInitFileBrowser ();
/***** Check if creating a new file is allowed *****/ /***** 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 *****/ /***** First, we save in disk the file received *****/
Par = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG, Par = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG,
@ -6938,7 +6936,7 @@ void Brw_RecLinkFileBrowser (void)
Brw_GetParAndInitFileBrowser (); Brw_GetParAndInitFileBrowser ();
/***** Check if creating a new link is allowed *****/ /***** 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 ****/ /***** Create a new file to store URL ****/
Par_GetParText ("NewLinkURL",URL,PATH_MAX); Par_GetParText ("NewLinkURL",URL,PATH_MAX);
@ -7259,9 +7257,9 @@ void Brw_ShowFileMetadata (void)
char URL[PATH_MAX + 1]; char URL[PATH_MAX + 1];
char FileSizeStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1]; char FileSizeStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1];
bool Found; bool Found;
bool ICanView = false; Usr_ICan_t ICanView = Usr_I_CAN_NOT;
bool IAmTheOwner; bool IAmTheOwner;
bool ICanEdit; Usr_ICan_t ICanEdit;
bool ICanChangePublic = false; bool ICanChangePublic = false;
bool FileHasPublisher; bool FileHasPublisher;
Brw_License_t License; Brw_License_t License;
@ -7285,32 +7283,36 @@ void Brw_ShowFileMetadata (void)
/***** Check if I can view this file. /***** Check if I can view this file.
It could be marked as hidden or in a hidden folder *****/ It could be marked as hidden or in a hidden folder *****/
ICanView = true; ICanView = Usr_I_CAN;
switch (Gbl.FileBrowser.Type) switch (Gbl.FileBrowser.Type)
{ {
case Brw_SHOW_DOC_INS: case Brw_SHOW_DOC_INS:
if (Gbl.Usrs.Me.Role.Logged < Rol_INS_ADM) 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; break;
case Brw_SHOW_DOC_CTR: case Brw_SHOW_DOC_CTR:
if (Gbl.Usrs.Me.Role.Logged < Rol_CTR_ADM) 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; break;
case Brw_SHOW_DOC_DEG: case Brw_SHOW_DOC_DEG:
if (Gbl.Usrs.Me.Role.Logged < Rol_DEG_ADM) 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; break;
case Brw_SHOW_DOC_CRS: case Brw_SHOW_DOC_CRS:
case Brw_SHOW_DOC_GRP: case Brw_SHOW_DOC_GRP:
if (Gbl.Usrs.Me.Role.Logged < Rol_TCH) 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; break;
default: default:
break; break;
} }
} }
if (ICanView) if (ICanView == Usr_I_CAN)
{ {
if (FileMetadata.FilFolLnk.Type == Brw_IS_FILE || if (FileMetadata.FilFolLnk.Type == Brw_IS_FILE ||
FileMetadata.FilFolLnk.Type == Brw_IS_LINK) FileMetadata.FilFolLnk.Type == Brw_IS_LINK)
@ -7354,7 +7356,7 @@ void Brw_ShowFileMetadata (void)
if (Brw_ActReqLnk[Gbl.FileBrowser.Type] != ActUnk && if (Brw_ActReqLnk[Gbl.FileBrowser.Type] != ActUnk &&
(FileMetadata.FilFolLnk.Type == Brw_IS_FILE || // Only files or links (FileMetadata.FilFolLnk.Type == Brw_IS_FILE || // Only files or links
FileMetadata.FilFolLnk.Type == Brw_IS_LINK) && FileMetadata.FilFolLnk.Type == Brw_IS_LINK) &&
Rsc_CheckIfICanGetLink ()) Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Box_BoxShadowBegin (NULL,Brw_PutIconToGetLinkToFile,&FileMetadata, Box_BoxShadowBegin (NULL,Brw_PutIconToGetLinkToFile,&FileMetadata,
NULL); NULL);
else else
@ -7363,7 +7365,7 @@ void Brw_ShowFileMetadata (void)
/***** Begin form to update the metadata of a file *****/ /***** 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? */ /* Can the file be public? */
switch (Gbl.FileBrowser.Type) switch (Gbl.FileBrowser.Type)
@ -7507,14 +7509,14 @@ void Brw_ShowFileMetadata (void)
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/* Label */ /* Label */
Frm_LabelColumn ("RT",ICanEdit ? "License" : Frm_LabelColumn ("RT",ICanEdit == Usr_I_CAN ? "License" :
NULL, NULL,
Txt_License); Txt_License);
/* Data */ /* Data */
HTM_TD_Begin ("class=\"LT DAT_STRONG_%s\"", HTM_TD_Begin ("class=\"LT DAT_STRONG_%s\"",
The_GetSuffix ()); 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, HTM_SELECT_Begin (HTM_DONT_SUBMIT_ON_CHANGE,NULL,
"id=\"License\" name=\"License\" class=\"LICENSE\""); "id=\"License\" name=\"License\" class=\"LICENSE\"");
@ -7584,7 +7586,7 @@ void Brw_ShowFileMetadata (void)
HTM_TABLE_End (); HTM_TABLE_End ();
/***** End form *****/ /***** 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); Btn_PutButton (Btn_CONFIRM_BUTTON,Txt_Save_file_properties);
Frm_EndForm (); Frm_EndForm ();
@ -7628,7 +7630,7 @@ void Brw_ShowFileMetadata (void)
/***** Add paths until file to table of expanded folders *****/ /***** Add paths until file to table of expanded folders *****/
Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders (Gbl.FileBrowser.FilFolLnk.Path); Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders (Gbl.FileBrowser.FilFolLnk.Path);
} }
else // !ICanView else // ICanView == Usr_I_CAN_NOT
{ {
/***** Mark possible notifications about non visible file as removed *****/ /***** Mark possible notifications about non visible file as removed *****/
switch (Gbl.FileBrowser.Type) switch (Gbl.FileBrowser.Type)
@ -7741,7 +7743,7 @@ void Brw_DownloadFile (void)
struct Brw_FileMetadata FileMetadata; struct Brw_FileMetadata FileMetadata;
char URL[PATH_MAX + 1]; char URL[PATH_MAX + 1];
bool Found; bool Found;
bool ICanView = false; Usr_ICan_t ICanView = Usr_I_CAN_NOT;
/***** Get parameters related to file browser *****/ /***** Get parameters related to file browser *****/
Brw_GetParAndInitFileBrowser (); Brw_GetParAndInitFileBrowser ();
@ -7760,32 +7762,36 @@ void Brw_DownloadFile (void)
/***** Check if I can view this file. /***** Check if I can view this file.
It could be marked as hidden or in a hidden folder *****/ It could be marked as hidden or in a hidden folder *****/
ICanView = true; ICanView = Usr_I_CAN;
switch (Gbl.FileBrowser.Type) switch (Gbl.FileBrowser.Type)
{ {
case Brw_SHOW_DOC_INS: case Brw_SHOW_DOC_INS:
if (Gbl.Usrs.Me.Role.Logged < Rol_INS_ADM) 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; break;
case Brw_SHOW_DOC_CTR: case Brw_SHOW_DOC_CTR:
if (Gbl.Usrs.Me.Role.Logged < Rol_CTR_ADM) 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; break;
case Brw_SHOW_DOC_DEG: case Brw_SHOW_DOC_DEG:
if (Gbl.Usrs.Me.Role.Logged < Rol_DEG_ADM) 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; break;
case Brw_SHOW_DOC_CRS: case Brw_SHOW_DOC_CRS:
case Brw_SHOW_DOC_GRP: case Brw_SHOW_DOC_GRP:
if (Gbl.Usrs.Me.Role.Logged < Rol_TCH) 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; break;
default: default:
break; break;
} }
} }
if (ICanView) if (ICanView == Usr_I_CAN)
{ {
if (FileMetadata.FilFolLnk.Type == Brw_IS_FILE || if (FileMetadata.FilFolLnk.Type == Brw_IS_FILE ||
FileMetadata.FilFolLnk.Type == Brw_IS_LINK) FileMetadata.FilFolLnk.Type == Brw_IS_LINK)
@ -7845,7 +7851,7 @@ void Brw_DownloadFile (void)
Gbl.Layout.DivsEndWritten = Gbl.Layout.DivsEndWritten =
Gbl.Layout.HTMLEndWritten = true; // Don't write HTML at all 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 *****/ /***** Mark possible notifications about non visible file as removed *****/
switch (Gbl.FileBrowser.Type) switch (Gbl.FileBrowser.Type)
@ -7889,7 +7895,7 @@ void Brw_DownloadFile (void)
/*********** Check if I have permission to change file metadata **************/ /*********** 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 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 ActReqDatWrkUsr: case ActChgDatWrkUsr:
case ActReqDatBrf: case ActChgDatBrf: case ActReqDatBrf: case ActChgDatBrf:
return IAmTheOwner; return IAmTheOwner ? Usr_I_CAN :
Usr_I_CAN_NOT;
default: default:
return false; return Usr_I_CAN_NOT;
} }
} }
@ -8089,7 +8096,7 @@ void Brw_ChgFileMetadata (void)
{ {
/***** Check if I can change file metadata *****/ /***** Check if I can change file metadata *****/
IAmTheOwner = Brw_CheckIfIAmOwnerOfFile (FileMetadata.PublisherUsrCod); IAmTheOwner = Brw_CheckIfIAmOwnerOfFile (FileMetadata.PublisherUsrCod);
if (!Brw_CheckIfICanEditFileMetadata (IAmTheOwner)) if (Brw_CheckIfICanEditFileMetadata (IAmTheOwner) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Check if the file was public before the edition *****/ /***** 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 ************/ /********** 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; Brw_ICanEditFileOrFolder = Value;
} }
static bool Brw_GetIfICanEditFileOrFolder (void) static Usr_ICan_t Brw_GetIfICanEditFileOrFolder (void)
{ {
return Brw_ICanEditFileOrFolder; 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 *****/ /***** Level 0 (root folder) can not be removed/renamed *****/
if (Level == 0) if (Level == 0)
return false; return Usr_I_CAN_NOT;
/***** I must be student or a superior role to edit *****/ /***** I must be student or a superior role to edit *****/
if (Gbl.Usrs.Me.Role.Max < Rol_STD) if (Gbl.Usrs.Me.Role.Max < Rol_STD)
return false; return Usr_I_CAN_NOT;
/***** Set depending on browser, level, logged role... *****/ /***** Set depending on browser, level, logged role... *****/
switch (Gbl.FileBrowser.Type) switch (Gbl.FileBrowser.Type)
{ {
case Brw_ADMI_DOC_CRS: 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: case Brw_ADMI_DOC_GRP:
if (Gbl.Usrs.Me.Role.Logged == Rol_TCH) // A teacher... if (Gbl.Usrs.Me.Role.Logged == Rol_TCH) // A teacher...
// ...can edit only if he/she belongs to group // ...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 // 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_CRS:
case Brw_ADMI_TCH_GRP: case Brw_ADMI_TCH_GRP:
// Check if I am the publisher of the file/folder // 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: case Brw_ADMI_ASG_CRS:
if (Gbl.FileBrowser.FilFolLnk.Type == Brw_IS_FOLDER && // The main folder of an assignment if (Gbl.FileBrowser.FilFolLnk.Type == Brw_IS_FOLDER && // The main folder of an assignment
Level == 1) 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); return Asg_CheckIfICanCreateIntoAssigment (&Gbl.FileBrowser.Asg);
case Brw_ADMI_DOC_PRJ: case Brw_ADMI_DOC_PRJ:
@ -8709,7 +8719,8 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level)
case Brw_ADMI_ASS_PRJ: case Brw_ADMI_ASS_PRJ:
return Brw_CheckIfICanModifyPrjAssFileOrFolder (); return Brw_CheckIfICanModifyPrjAssFileOrFolder ();
default: default:
return Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type); return Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type) ? Usr_I_CAN :
Usr_I_CAN_NOT;
} }
return false; 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 ****/ /**** 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 not in a folder... *****/
if (Gbl.FileBrowser.FilFolLnk.Type != Brw_IS_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 *****/ /***** I must be student, teacher, admin or superuser to edit *****/
if (Gbl.Usrs.Me.Role.Max < Rol_STD) 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 maximum level is reached, I can not create/paste *****/
if (Level >= BrwSiz_MAX_DIR_LEVELS) 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? *****/ /***** Have I permission to create/paste a new file or folder into the folder? *****/
switch (Gbl.FileBrowser.Type) switch (Gbl.FileBrowser.Type)
{ {
case Brw_ADMI_DOC_CRS: 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: case Brw_ADMI_DOC_GRP:
if (Gbl.Usrs.Me.Role.Logged == Rol_TCH) // A teacher if (Gbl.Usrs.Me.Role.Logged == Rol_TCH) // A teacher
// ...can create/paste only if he/she belongs to group // ...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 // 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: 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: case Brw_ADMI_TCH_GRP:
if (Gbl.Usrs.Me.Role.Logged == Rol_NET || // A non-editing teacher... if (Gbl.Usrs.Me.Role.Logged == Rol_NET || // A non-editing teacher...
Gbl.Usrs.Me.Role.Logged == Rol_TCH) // ...or a teacher Gbl.Usrs.Me.Role.Logged == Rol_TCH) // ...or a teacher
// ...can create/paste only if he/she belongs to group // ...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 // 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: 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: case Brw_ADMI_SHR_GRP:
if (Gbl.Usrs.Me.Role.Logged >= Rol_STD && // A student, non-editing teacher... if (Gbl.Usrs.Me.Role.Logged >= Rol_STD && // A student, non-editing teacher...
Gbl.Usrs.Me.Role.Logged <= Rol_TCH) // ...or a teacher Gbl.Usrs.Me.Role.Logged <= Rol_TCH) // ...or a teacher
// ...can create/paste only if he/she belongs to group // ...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 // 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_USR:
case Brw_ADMI_ASG_CRS: case Brw_ADMI_ASG_CRS:
if (Level == 0) // If root folder if (Level == 0) // If root folder
return false; // Folders of assigments (level 1) return Usr_I_CAN_NOT; // Folders of assigments (level 1)
// can only be created automatically // can only be created automatically
return Asg_CheckIfICanCreateIntoAssigment (&Gbl.FileBrowser.Asg); return Asg_CheckIfICanCreateIntoAssigment (&Gbl.FileBrowser.Asg);
default: 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) 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_UNKNOWN ] = false,
[Brw_SHOW_DOC_CRS] = 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 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 // 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: // If I am a student or a non-editing teacher... 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 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_TCH:
case Rol_DEG_ADM: case Rol_DEG_ADM:
case Rol_CTR_ADM: case Rol_CTR_ADM:
case Rol_INS_ADM: case Rol_INS_ADM:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_NET: // If I am a student or a non-editing teacher... case Rol_NET: // If I am a student or a non-editing teacher...
// ...I can modify the file/folder if I am the publisher // ...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_TCH:
case Rol_DEG_ADM: case Rol_DEG_ADM:
case Rol_CTR_ADM: case Rol_CTR_ADM:
case Rol_INS_ADM: case Rol_INS_ADM:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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 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 // 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
case Rol_NET: case Rol_NET:
if (Prj_GetMyRolesInProject (Prj_GetPrjCod ())) // I am a member 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 (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN :
return false; 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_TCH: // Editing teachers in a course can access to all files
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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 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 // 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
@ -8903,15 +8923,15 @@ static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void)
case Rol_NET: case Rol_NET:
if ((Prj_GetMyRolesInProject (Prj_GetPrjCod ()) & (1 << Prj_ROLE_TUT | // Tutor... if ((Prj_GetMyRolesInProject (Prj_GetPrjCod ()) & (1 << Prj_ROLE_TUT | // Tutor...
1 << Prj_ROLE_EVL))) // ...or evaluator 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 (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN :
return false; 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_TCH: // Editing teachers in a course can access to all files
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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 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_PutIconsListingBuildings (__attribute__((unused)) void *Args);
static void Bld_PutIconToEditBuildings (void); static void Bld_PutIconToEditBuildings (void);
static void Bld_PutIconsEditingBuildings (__attribute__((unused)) void *Args); 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 ***********************/ /********************* 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) static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args)
{ {
/***** Put icon to edit buildings *****/ /***** Put icon to edit buildings *****/
if (Bld_CheckIfICanCreateBuildings ()) if (Bld_CheckIfICanCreateBuildings () == Usr_I_CAN)
Bld_PutIconToEditBuildings (); Bld_PutIconToEditBuildings ();
} }
@ -218,8 +219,7 @@ static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args)
static void Bld_PutIconToEditBuildings (void) static void Bld_PutIconToEditBuildings (void)
{ {
Ico_PutContextualIconToEdit (ActEdiBld,NULL, Ico_PutContextualIconToEdit (ActEdiBld,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -275,8 +275,7 @@ static void Bld_EditBuildingsInternal (void)
static void Bld_PutIconsEditingBuildings (__attribute__((unused)) void *Args) static void Bld_PutIconsEditingBuildings (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view buildings *****/ /***** Put icon to view buildings *****/
Ico_PutContextualIconToView (ActSeeBld,NULL, Ico_PutContextualIconToView (ActSeeBld,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -435,7 +434,7 @@ static void Bld_ListBuildingsForEdition (const struct Bld_Buildings *Buildings)
Nam_ExistingShortAndFullNames (ActionRename, Nam_ExistingShortAndFullNames (ActionRename,
ParCod_Bld,Building->BldCod, ParCod_Bld,Building->BldCod,
Names, Names,
true); // Put form Frm_PUT_FORM);
/* Building location */ /* Building location */
HTM_TD_Begin ("class=\"LM\""); HTM_TD_Begin ("class=\"LM\"");

View File

@ -56,7 +56,7 @@ extern struct Globals Gbl;
/***************************** Public constants ******************************/ /***************************** Public constants ******************************/
/*****************************************************************************/ /*****************************************************************************/
const bool Cal_DayIsValidAsFirstDayOfWeek[7] = bool Cal_DayIsValidAsFirstDayOfWeek[7] =
{ {
[0] = true, // monday [0] = true, // monday
[1] = false, // tuesday [1] = false, // tuesday
@ -332,7 +332,7 @@ void Cal_PutIconToSeeCalendar (void)
void Cal_GetAndShowNumUsrsPerFirstDayOfWeek (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 *Hlp_ANALYTICS_Figures_calendar;
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES]; extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
extern const char *Txt_Calendar; 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) static void Cfe_PutIconsCallsForExams (__attribute__((unused)) void *Args)
{ {
/***** Icon to create a new call for exam *****/ /***** Icon to create a new call for exam *****/
if (Cfe_CheckIfICanEditCallsForExams ()) if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN)
Ico_PutContextualIconToAdd (ActEdiCfe,NULL,NULL,NULL); Ico_PutContextualIconToAdd (ActEdiCfe,NULL,NULL,NULL);
/***** Icon to get resource link *****/ /***** Icon to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL, Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1465,7 +1464,7 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams)
if (CallsForExams) if (CallsForExams)
{ {
if (Cfe_CheckIfICanEditCallsForExams ()) if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN)
{ {
/***** Icon to remove call for exam *****/ /***** Icon to remove call for exam *****/
Ico_PutContextualIconToRemove (ActReqRemCfe,NULL, Ico_PutContextualIconToRemove (ActReqRemCfe,NULL,
@ -1499,7 +1498,7 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams)
&((struct Cfe_CallsForExams *) CallsForExams)->ExaCod); &((struct Cfe_CallsForExams *) CallsForExams)->ExaCod);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL, Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL,
Cfe_PutParExaCod, Cfe_PutParExaCod,
&((struct Cfe_CallsForExams *) CallsForExams)->ExaCod); &((struct Cfe_CallsForExams *) CallsForExams)->ExaCod);
@ -1510,12 +1509,12 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams)
/******************* Check if I can edit calls for exams *********************/ /******************* 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_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanEditCallsForExams[Gbl.Usrs.Me.Role.Logged]; return ICanEditCallsForExams[Gbl.Usrs.Me.Role.Logged];

View File

@ -129,7 +129,7 @@ void Cfe_ListCallsForExamsDay (void);
void Cfe_CreateListCallsForExams (struct Cfe_CallsForExams *CallsForExams); 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], void Cfe_GetSummaryAndContentCallForExam (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
char **ContentStr, char **ContentStr,

View File

@ -85,7 +85,7 @@ unsigned Cfe_DB_GetCallsForExamsInCurrentCrs (MYSQL_RES **mysql_res)
char SubQueryStatus[64]; char SubQueryStatus[64];
/***** Build subquery about status depending on my role *****/ /***** Build subquery about status depending on my role *****/
if (Cfe_CheckIfICanEditCallsForExams ()) if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN)
sprintf (SubQueryStatus,"Status<>%u", sprintf (SubQueryStatus,"Status<>%u",
(unsigned) Cfe_DELETED_CALL_FOR_EXAM); (unsigned) Cfe_DELETED_CALL_FOR_EXAM);
else else

View File

@ -89,7 +89,7 @@ static void Ctr_GetCoordFromRow (MYSQL_RES *mysql_res,
struct Map_Coordinates *Coord); struct Map_Coordinates *Coord);
static void Ctr_ListCentersForEdition (const struct Plc_Places *Places); 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); static void Ctr_ShowAlertAndButtonToGoToCtr (void);
@ -289,7 +289,7 @@ static void Ctr_ListCenters (void)
static void Ctr_PutIconsListingCenters (__attribute__((unused)) void *Args) static void Ctr_PutIconsListingCenters (__attribute__((unused)) void *Args)
{ {
/***** Put icon to edit centers *****/ /***** Put icon to edit centers *****/
if (Hie_CheckIfICanEdit ()) if (Hie_CheckIfICanEdit () == Usr_I_CAN)
Ctr_PutIconToEditCenters (); Ctr_PutIconToEditCenters ();
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
@ -302,8 +302,7 @@ static void Ctr_PutIconsListingCenters (__attribute__((unused)) void *Args)
static void Ctr_PutIconToEditCenters (void) static void Ctr_PutIconToEditCenters (void)
{ {
Ico_PutContextualIconToEdit (ActEdiCtr,NULL, Ico_PutContextualIconToEdit (ActEdiCtr,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -460,8 +459,7 @@ static void Ctr_EditCentersInternal (void)
static void Ctr_PutIconsEditingCenters (__attribute__((unused)) void *Args) static void Ctr_PutIconsEditingCenters (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view centers *****/ /***** Put icon to view centers *****/
Ico_PutContextualIconToView (ActSeeCtr,NULL, Ico_PutContextualIconToView (ActSeeCtr,NULL,NULL,NULL);
NULL,NULL);
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
Fig_PutIconToShowFigure (Fig_HIERARCHY); Fig_PutIconToShowFigure (Fig_HIERARCHY);
@ -737,7 +735,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
const struct Plc_Place *Plc; const struct Plc_Place *Plc;
char WWW[Cns_MAX_BYTES_WWW + 1]; char WWW[Cns_MAX_BYTES_WWW + 1];
struct Usr_Data UsrDat; struct Usr_Data UsrDat;
bool ICanEdit; Usr_ICan_t ICanEdit;
unsigned NumDegs; unsigned NumDegs;
unsigned NumUsrsCtr; unsigned NumUsrsCtr;
unsigned NumUsrsInCrssOfCtr; unsigned NumUsrsInCrssOfCtr;
@ -773,7 +771,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
/* Put icon to remove center */ /* Put icon to remove center */
HTM_TD_Begin ("class=\"BT\""); HTM_TD_Begin ("class=\"BT\"");
if (!ICanEdit || // I cannot edit if (ICanEdit == Usr_I_CAN_NOT || // I cannot edit
NumDegs || // Center has degrees NumDegs || // Center has degrees
NumUsrsCtr || // Center has users who claim to belong to it NumUsrsCtr || // Center has users who claim to belong to it
NumUsrsInCrssOfCtr) // Center has users NumUsrsInCrssOfCtr) // Center has users
@ -795,7 +793,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
/* Place */ /* Place */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit) if (ICanEdit == Usr_I_CAN)
{ {
Frm_BeginForm (ActChgCtrPlc); Frm_BeginForm (ActChgCtrPlc);
ParCod_PutPar (ParCod_OthHie,Ctr->HieCod); ParCod_PutPar (ParCod_OthHie,Ctr->HieCod);
@ -836,11 +834,12 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
Nam_ExistingShortAndFullNames (ActionRename, Nam_ExistingShortAndFullNames (ActionRename,
ParCod_OthHie,Ctr->HieCod, ParCod_OthHie,Ctr->HieCod,
Names, Names,
ICanEdit); // Put form? ICanEdit == Usr_I_CAN ? Frm_PUT_FORM :
Frm_DONT_PUT_FORM);
/* Center WWW */ /* Center WWW */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit) if (ICanEdit == Usr_I_CAN)
{ {
Frm_BeginForm (ActChgCtrWWW); Frm_BeginForm (ActChgCtrWWW);
ParCod_PutPar (ParCod_OthHie,Ctr->HieCod); 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 *******************/ /************** 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 ((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') "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 CSS_FILE "swad23.67.2.css"
#define JS_FILE "swad23.53.6.js" #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.3: Mar 22, 2024 Code refactoring. (334827 lines)
Version 23.71.2: Mar 20, 2024 Code refactoring in actions. (334866 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) 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) static void Cty_PutIconsListingCountries (__attribute__((unused)) void *Args)
{ {
/***** Put icon to edit countries *****/ /***** Put icon to edit countries *****/
if (Cty_CheckIfICanEditCountries ()) if (Cty_CheckIfICanEditCountries () == Usr_I_CAN)
Cty_PutIconToEditCountries (); Cty_PutIconToEditCountries ();
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
@ -474,9 +474,10 @@ static void Cty_PutIconsListingCountries (__attribute__((unused)) void *Args)
/********************** Check if I can edit countries ************************/ /********************** 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) static void Cty_PutIconToEditCountries (void)
{ {
Ico_PutContextualIconToEdit (ActEdiCty,NULL, Ico_PutContextualIconToEdit (ActEdiCty,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -692,8 +692,7 @@ static void Cty_EditCountriesInternal (void)
static void Cty_PutIconsEditingCountries (__attribute__((unused)) void *Args) static void Cty_PutIconsEditingCountries (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view countries *****/ /***** Put icon to view countries *****/
Ico_PutContextualIconToView (ActSeeCty,NULL, Ico_PutContextualIconToView (ActSeeCty,NULL,NULL,NULL);
NULL,NULL);
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
Fig_PutIconToShowFigure (Fig_HIERARCHY); Fig_PutIconToShowFigure (Fig_HIERARCHY);

View File

@ -35,6 +35,7 @@
#include "swad_institution.h" #include "swad_institution.h"
#include "swad_language.h" #include "swad_language.h"
#include "swad_role_type.h" #include "swad_role_type.h"
#include "swad_user.h"
/*****************************************************************************/ /*****************************************************************************/
/************************** Public types and constants ***********************/ /************************** Public types and constants ***********************/
@ -53,7 +54,7 @@ void Cty_ListCountries (void);
void Cty_ListCountries1 (void); void Cty_ListCountries1 (void);
void Cty_ListCountries2 (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, void Cty_DrawCountryMapAndNameWithLink (struct Hie_Node *Cty,Act_Action_t Action,
const char *ClassContainer, const char *ClassContainer,

View File

@ -341,7 +341,7 @@ static void CtyCfg_MapImage (Vie_ViewType_t ViewType,Hie_PutLink_t PutLink)
HTM_DIV_End (); HTM_DIV_End ();
/***** Map attribution *****/ /***** Map attribution *****/
if (ViewType == Vie_VIEW && Cty_CheckIfICanEditCountries ()) if (ViewType == Vie_VIEW && Cty_CheckIfICanEditCountries () == Usr_I_CAN)
{ {
HTM_DIV_Begin ("class=\"CM\""); HTM_DIV_Begin ("class=\"CM\"");
Frm_BeginForm (ActChgCtyMapAtt); 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_PutIconsEditingCourses (__attribute__((unused)) void *Args);
static void Crs_ListCoursesForEdition (void); static void Crs_ListCoursesForEdition (void);
static void Crs_ListCoursesOfAYearForEdition (unsigned Year); 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_PutFormToCreateCourse (void);
static void Crs_PutHeadCoursesForSeeing (void); static void Crs_PutHeadCoursesForSeeing (void);
static void Crs_PutHeadCoursesForEdition (void); static void Crs_PutHeadCoursesForEdition (void);
@ -423,7 +423,7 @@ static void Crs_ListCourses (void)
static void Crs_PutIconsListCourses (__attribute__((unused)) void *Args) static void Crs_PutIconsListCourses (__attribute__((unused)) void *Args)
{ {
/***** Put icon to edit courses *****/ /***** Put icon to edit courses *****/
if (Hie_CheckIfICanEdit ()) if (Hie_CheckIfICanEdit () == Usr_I_CAN)
Crs_PutIconToEditCourses (); Crs_PutIconToEditCourses ();
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
@ -436,8 +436,7 @@ static void Crs_PutIconsListCourses (__attribute__((unused)) void *Args)
static void Crs_PutIconToEditCourses (void) static void Crs_PutIconToEditCourses (void)
{ {
Ico_PutContextualIconToEdit (ActEdiCrs,NULL, Ico_PutContextualIconToEdit (ActEdiCrs,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -613,8 +612,7 @@ static void Crs_EditCoursesInternal (void)
static void Crs_PutIconsEditingCourses (__attribute__((unused)) void *Args) static void Crs_PutIconsEditingCourses (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view courses *****/ /***** Put icon to view courses *****/
Ico_PutContextualIconToView (ActSeeCrs,NULL, Ico_PutContextualIconToView (ActSeeCrs,NULL,NULL,NULL);
NULL,NULL);
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
Fig_PutIconToShowFigure (Fig_HIERARCHY); Fig_PutIconToShowFigure (Fig_HIERARCHY);
@ -662,7 +660,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
unsigned YearAux; unsigned YearAux;
unsigned NumCrs; unsigned NumCrs;
struct Usr_Data UsrDat; struct Usr_Data UsrDat;
bool ICanEdit; Usr_ICan_t ICanEdit;
unsigned NumUsrs[Rol_NUM_ROLES]; unsigned NumUsrs[Rol_NUM_ROLES];
const char *Names[Nam_NUM_SHRT_FULL_NAMES]; const char *Names[Nam_NUM_SHRT_FULL_NAMES];
@ -693,9 +691,9 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
/* Put icon to remove course */ /* Put icon to remove course */
HTM_TD_Begin ("class=\"BT\""); HTM_TD_Begin ("class=\"BT\"");
if (NumUsrs[Rol_UNK] || // Course has users ==> deletion forbidden if (NumUsrs[Rol_UNK] || // Course has users ==> deletion forbidden
!ICanEdit) ICanEdit == Usr_I_CAN_NOT)
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
else // Crs->NumUsrs == 0 && ICanEdit else // Crs->NumUsrs == 0 && ICanEdit == Usr_I_CAN
Ico_PutContextualIconToRemove (ActRemCrs,NULL, Ico_PutContextualIconToRemove (ActRemCrs,NULL,
Hie_PutParOtherHieCod,&Crs->HieCod); Hie_PutParOtherHieCod,&Crs->HieCod);
HTM_TD_End (); HTM_TD_End ();
@ -707,7 +705,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
/* Course year */ /* Course year */
HTM_TD_Begin ("class=\"CT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"CT DAT_%s\"",The_GetSuffix ());
if (ICanEdit) if (ICanEdit == Usr_I_CAN)
{ {
Frm_BeginForm (ActChgCrsYea); Frm_BeginForm (ActChgCrsYea);
ParCod_PutPar (ParCod_OthHie,Crs->HieCod); ParCod_PutPar (ParCod_OthHie,Crs->HieCod);
@ -734,7 +732,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
/* Institutional code of the course */ /* Institutional code of the course */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit) if (ICanEdit == Usr_I_CAN)
{ {
Frm_BeginForm (ActChgInsCrsCod); Frm_BeginForm (ActChgInsCrsCod);
ParCod_PutPar (ParCod_OthHie,Crs->HieCod); ParCod_PutPar (ParCod_OthHie,Crs->HieCod);
@ -754,7 +752,8 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
Nam_ExistingShortAndFullNames (ActionRename, Nam_ExistingShortAndFullNames (ActionRename,
ParCod_OthHie,Crs->HieCod, ParCod_OthHie,Crs->HieCod,
Names, Names,
ICanEdit); // Put form? ICanEdit == Usr_I_CAN ? Frm_PUT_FORM :
Frm_DONT_PUT_FORM);
/* Current number of teachers in this course */ /* Current number of teachers in this course */
HTM_TD_Unsigned (NumUsrs[Rol_TCH] + 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 *******************/ /************** 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 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 ((Crs->Status & Hie_STATUS_BIT_PENDING) != 0 && // Course is not yet activated
Gbl.Usrs.Me.UsrDat.UsrCod == Crs->RequesterUsrCod); // I am the requester 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 *****/ /***** Get data of the course from database *****/
Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs); Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs);
if (!Crs_CheckIfICanEdit (Crs_EditingCrs)) if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Check if this course has users *****/ /***** Check if this course has users *****/
@ -1295,7 +1295,7 @@ void Crs_ChangeInsCrsCod (void)
/* Get data of the course */ /* Get data of the course */
Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs); Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs);
if (!Crs_CheckIfICanEdit (Crs_EditingCrs)) if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Change the institutional course code *****/ /***** Change the institutional course code *****/
@ -1340,7 +1340,7 @@ void Crs_ChangeCrsYear (void)
/* Get data of the course */ /* Get data of the course */
Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs); Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs);
if (!Crs_CheckIfICanEdit (Crs_EditingCrs)) if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
if (NewYear <= Deg_MAX_YEARS_PER_DEGREE) // If year is valid 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 *****/ /***** Get from the database the data of the degree *****/
Hie_GetDataByCod[Hie_CRS] (Crs); Hie_GetDataByCod[Hie_CRS] (Crs);
if (!Crs_CheckIfICanEdit (Crs)) if (Crs_CheckIfICanEdit (Crs) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Check if new name is empty *****/ /***** 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 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_PutFormToCreateDegree (const struct DegTyp_DegTypes *DegTypes);
static void Deg_PutHeadDegreesForSeeing (void); static void Deg_PutHeadDegreesForSeeing (void);
static void Deg_PutHeadDegreesForEdition (void); static void Deg_PutHeadDegreesForEdition (void);
@ -325,7 +325,7 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
struct DegTyp_DegreeType *DegTyp; struct DegTyp_DegreeType *DegTyp;
char WWW[Cns_MAX_BYTES_WWW + 1]; char WWW[Cns_MAX_BYTES_WWW + 1];
struct Usr_Data UsrDat; struct Usr_Data UsrDat;
bool ICanEdit; Usr_ICan_t ICanEdit;
unsigned NumCrss; unsigned NumCrss;
unsigned NumUsrsInCrssOfDeg; unsigned NumUsrsInCrssOfDeg;
const char *Names[Nam_NUM_SHRT_FULL_NAMES]; 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 */ /* Put icon to remove degree */
HTM_TD_Begin ("class=\"BT\""); HTM_TD_Begin ("class=\"BT\"");
if (!ICanEdit || if (ICanEdit == Usr_I_CAN_NOT ||
NumCrss || // Degree has courses ==> deletion forbidden NumCrss || // Degree has courses ==> deletion forbidden
NumUsrsInCrssOfDeg) NumUsrsInCrssOfDeg)
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
@ -384,11 +384,12 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
Nam_ExistingShortAndFullNames (ActionRename, Nam_ExistingShortAndFullNames (ActionRename,
ParCod_OthHie,Deg->HieCod, ParCod_OthHie,Deg->HieCod,
Names, Names,
ICanEdit); // Put form? ICanEdit == Usr_I_CAN ? Frm_PUT_FORM :
Frm_DONT_PUT_FORM);
/* Degree type */ /* Degree type */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit) if (ICanEdit == Usr_I_CAN)
{ {
Frm_BeginForm (ActChgDegTyp); Frm_BeginForm (ActChgDegTyp);
ParCod_PutPar (ParCod_OthHie,Deg->HieCod); ParCod_PutPar (ParCod_OthHie,Deg->HieCod);
@ -423,7 +424,7 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
/* Degree WWW */ /* Degree WWW */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit) if (ICanEdit == Usr_I_CAN)
{ {
Frm_BeginForm (ActChgDegWWW); Frm_BeginForm (ActChgDegWWW);
ParCod_PutPar (ParCod_OthHie,Deg->HieCod); 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 *******************/ /************** 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 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 ((Deg->Status & Hie_STATUS_BIT_PENDING) != 0 && // Degree is not yet activated
Gbl.Usrs.Me.UsrDat.UsrCod == Deg->RequesterUsrCod); // I am the requester 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) static void Deg_PutIconsListingDegrees (__attribute__((unused)) void *Args)
{ {
/***** Put icon to edit degrees *****/ /***** Put icon to edit degrees *****/
if (Hie_CheckIfICanEdit ()) if (Hie_CheckIfICanEdit () == Usr_I_CAN)
Deg_PutIconToEditDegrees (); Deg_PutIconToEditDegrees ();
/***** Put icon to view degree types *****/ /***** Put icon to view degree types *****/
@ -735,8 +737,7 @@ static void Deg_PutIconsListingDegrees (__attribute__((unused)) void *Args)
static void Deg_PutIconToEditDegrees (void) static void Deg_PutIconToEditDegrees (void)
{ {
Ico_PutContextualIconToEdit (ActEdiDeg,NULL, Ico_PutContextualIconToEdit (ActEdiDeg,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -882,7 +883,7 @@ static void Deg_EditDegreesInternal (void)
Ale_ShowAlert (Ale_WARNING,Txt_No_types_of_degree); Ale_ShowAlert (Ale_WARNING,Txt_No_types_of_degree);
/***** Form to create the first degree type *****/ /***** Form to create the first degree type *****/
if (DegTyp_CheckIfICanCreateDegreeTypes ()) if (DegTyp_CheckIfICanCreateDegreeTypes () == Usr_I_CAN)
DegTyp_EditDegreeTypes (&DegTypes); DegTyp_EditDegreeTypes (&DegTypes);
} }
@ -900,8 +901,7 @@ static void Deg_EditDegreesInternal (void)
static void Deg_PutIconsEditingDegrees (__attribute__((unused)) void *Args) static void Deg_PutIconsEditingDegrees (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view degrees *****/ /***** Put icon to view degrees *****/
Ico_PutContextualIconToView (ActSeeDeg,NULL, Ico_PutContextualIconToView (ActSeeDeg,NULL,NULL,NULL);
NULL,NULL);
/***** Put icon to view types of degree *****/ /***** Put icon to view types of degree *****/
DegTyp_PutIconToViewDegreeTypes (); DegTyp_PutIconToViewDegreeTypes ();
@ -916,8 +916,7 @@ static void Deg_PutIconsEditingDegrees (__attribute__((unused)) void *Args)
void Deg_PutIconToViewDegrees (void) void Deg_PutIconToViewDegrees (void)
{ {
Lay_PutContextualLinkOnlyIcon (ActSeeDeg,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeDeg,NULL,NULL,NULL,
NULL,NULL,
"graduation-cap.svg",Ico_BLACK); "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) static void DegTyp_PutIconsEditingDegreeTypes (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view degree types *****/ /***** Put icon to view degree types *****/
Ico_PutContextualIconToView (ActSeeDegTyp,NULL, Ico_PutContextualIconToView (ActSeeDegTyp,NULL,NULL,NULL);
NULL,NULL);
/***** Put icon to view degrees *****/ /***** Put icon to view degrees *****/
Deg_PutIconToViewDegrees (); Deg_PutIconToViewDegrees ();
@ -303,8 +302,7 @@ static void DegTyp_PutIconsEditingDegreeTypes (__attribute__((unused)) void *Arg
void DegTyp_PutIconToViewDegreeTypes (void) void DegTyp_PutIconToViewDegreeTypes (void)
{ {
Lay_PutContextualLinkOnlyIcon (ActSeeDegTyp,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeDegTyp,NULL,NULL,NULL,
NULL,NULL,
"sitemap.svg",Ico_BLACK); "sitemap.svg",Ico_BLACK);
} }
@ -375,9 +373,8 @@ static void DegTyp_PutIconsListingDegTypes (__attribute__((unused)) void *Args)
static void DegTyp_PutIconToEditDegTypes (__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 if (Gbl.Hierarchy.Level == Hie_CTR && // Only editable if center tab is visible
DegTyp_CheckIfICanCreateDegreeTypes ()) DegTyp_CheckIfICanCreateDegreeTypes () == Usr_I_CAN)
Ico_PutContextualIconToEdit (ActEdiDegTyp,NULL, Ico_PutContextualIconToEdit (ActEdiDegTyp,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -445,9 +442,10 @@ static void DegTyp_ListDegreeTypesForEdition (const struct DegTyp_DegTypes *DegT
/******************** Check if I can create degree types *********************/ /******************** 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); void DegTyp_PutIconToViewDegreeTypes (void);
bool DegTyp_CheckIfICanCreateDegreeTypes (void); Usr_ICan_t DegTyp_CheckIfICanCreateDegreeTypes (void);
void DegTyp_GetListDegreeTypes (struct DegTyp_DegTypes *DegTypes, void DegTyp_GetListDegreeTypes (struct DegTyp_DegTypes *DegTypes,
Hie_Level_t Level,DegTyp_Order_t Order); Hie_Level_t Level,DegTyp_Order_t Order);

View File

@ -53,7 +53,7 @@
/****************************** Private constants ****************************/ /****************************** Private constants ****************************/
/*****************************************************************************/ /*****************************************************************************/
static const bool Dpt_ICanEditDpts[Rol_NUM_ROLES] = static bool Dpt_ICanEditDpts[Rol_NUM_ROLES] =
{ {
/* Users who can edit */ /* Users who can edit */
[Rol_INS_ADM] = true, [Rol_INS_ADM] = true,
@ -244,8 +244,7 @@ static Dpt_Order_t Dpt_GetParDptOrder (void)
static void Dpt_PutIconToEditDpts (__attribute__((unused)) void *Args) static void Dpt_PutIconToEditDpts (__attribute__((unused)) void *Args)
{ {
if (Dpt_ICanEditDpts[Gbl.Usrs.Me.Role.Logged]) if (Dpt_ICanEditDpts[Gbl.Usrs.Me.Role.Logged])
Ico_PutContextualIconToEdit (ActEdiDpt,NULL, Ico_PutContextualIconToEdit (ActEdiDpt,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -254,8 +253,7 @@ static void Dpt_PutIconToEditDpts (__attribute__((unused)) void *Args)
static void Dpt_PutIconToViewDpts (__attribute__((unused)) void *Args) static void Dpt_PutIconToViewDpts (__attribute__((unused)) void *Args)
{ {
Ico_PutContextualIconToView (ActSeeDpt,NULL, Ico_PutContextualIconToView (ActSeeDpt,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -515,7 +513,7 @@ static void Dpt_ListDepartmentsForEdition (const struct Dpt_Departments *Departm
Nam_ExistingShortAndFullNames (ActionRename, Nam_ExistingShortAndFullNames (ActionRename,
ParCod_Dpt,Dpt->DptCod, ParCod_Dpt,Dpt->DptCod,
Names, Names,
true); // Put form Frm_PUT_FORM);
/* Department WWW */ /* Department WWW */
HTM_TD_Begin ("class=\"LM\""); HTM_TD_Begin ("class=\"LM\"");

View File

@ -311,7 +311,7 @@ static void Dup_ListSimilarUsrs (void)
Usr_NUM_MAIN_FIELDS_DATA_USR-2, Usr_NUM_MAIN_FIELDS_DATA_USR-2,
The_GetColorRows ()); The_GetColorRows ());
/* Button to remove this user */ /* Button to remove this user */
if (Acc_CheckIfICanEliminateAccount (UsrDat.UsrCod)) if (Acc_CheckIfICanEliminateAccount (UsrDat.UsrCod) == Usr_I_CAN)
Dup_PutButtonToEliminateUsrAccount (&UsrDat); Dup_PutButtonToEliminateUsrAccount (&UsrDat);
/* Button to remove from list of possible duplicate users */ /* Button to remove from list of possible duplicate users */
if (Dup_DB_CheckIfUsrIsDup (UsrDat.UsrCod)) 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 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_AskIfRemoveUsrFromCrs (struct Usr_Data *UsrDat);
static void Enr_EffectivelyRemUsrFromCrs (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 *****/ /***** 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); Enr_PutActionRemUsrAcc (&OptionChecked,MeOrOther);
OptionsShown = true; OptionsShown = true;
@ -2369,16 +2369,18 @@ static void Enr_RemUsrEnrolmentRequestInCrs (long UsrCod,long CrsCod)
void Enr_PutLinkToAdminOneUsr (Act_Action_t NextAction) 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_me;
extern const char *Txt_Administer_one_user; extern const char *Txt_Administer_one_user;
const char *TitleText = Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged] ? Txt_Administer_one_user : static const char **TitleText[] =
Txt_Administer_me; {
[Usr_I_CAN_NOT] = &Txt_Administer_me,
[Usr_I_CAN ] = &Txt_Administer_one_user,
};
Lay_PutContextualLinkIconText (NextAction,NULL, Lay_PutContextualLinkIconText (NextAction,NULL,
NULL,NULL, NULL,NULL,
"user-cog.svg",Ico_BLACK, "user-cog.svg",Ico_BLACK,
TitleText,NULL); *TitleText[Adm_CheckIfICanAdminOtherUsrs ()],NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2421,10 +2423,8 @@ void Enr_ReqRegRemOth (void)
void Enr_ReqRegRemStd (void) void Enr_ReqRegRemStd (void)
{ {
extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES];
/***** Contextual menu *****/ /***** Contextual menu *****/
if (Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged]) if (Adm_CheckIfICanAdminOtherUsrs () == Usr_I_CAN)
{ {
Mnu_ContextMenuBegin (); Mnu_ContextMenuBegin ();
Enr_PutLinkToAdminSeveralUsrs (Rol_STD); // Admin several students Enr_PutLinkToAdminSeveralUsrs (Rol_STD); // Admin several students
@ -2443,9 +2443,7 @@ void Enr_ReqRegRemTch (void)
static void Enr_ReqRegRemUsr (Rol_Role_t Role) static void Enr_ReqRegRemUsr (Rol_Role_t Role)
{ {
extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES]; if (Adm_CheckIfICanAdminOtherUsrs () == Usr_I_CAN)
if (Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged])
/***** Form to request the user's ID of another user *****/ /***** Form to request the user's ID of another user *****/
Enr_ReqAnotherUsrIDToRegisterRemove (Role); Enr_ReqAnotherUsrIDToRegisterRemove (Role);
else else
@ -2675,7 +2673,7 @@ void Enr_ReqRemUsrFromCrs (void)
/***** Get user to be removed *****/ /***** Get user to be removed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Enr_CheckIfICanRemUsrFromCrs ()) if (Enr_CheckIfICanRemUsrFromCrs () == Usr_I_CAN)
Enr_AskIfRemoveUsrFromCrs (&Gbl.Usrs.Other.UsrDat); Enr_AskIfRemoveUsrFromCrs (&Gbl.Usrs.Other.UsrDat);
else else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
@ -2695,7 +2693,7 @@ void Enr_RemUsrFromCrs1 (void)
/***** Get user to be removed *****/ /***** Get user to be removed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Enr_CheckIfICanRemUsrFromCrs ()) if (Enr_CheckIfICanRemUsrFromCrs () == Usr_I_CAN)
Enr_EffectivelyRemUsrFromCrs (&Gbl.Usrs.Other.UsrDat,&Gbl.Hierarchy.Node[Hie_CRS], Enr_EffectivelyRemUsrFromCrs (&Gbl.Usrs.Other.UsrDat,&Gbl.Hierarchy.Node[Hie_CRS],
Enr_DO_NOT_REMOVE_USR_PRODUCTION, Enr_DO_NOT_REMOVE_USR_PRODUCTION,
Cns_VERBOSE); Cns_VERBOSE);
@ -2720,23 +2718,24 @@ void Enr_RemUsrFromCrs2 (void)
/*********** Check if I can remove another user in current course ************/ /*********** 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
case Rol_NET: case Rol_NET:
// A student or non-editing teacher can remove herself/himself // 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_TCH:
case Rol_DEG_ADM: case Rol_DEG_ADM:
case Rol_CTR_ADM: case Rol_CTR_ADM:
case Rol_INS_ADM: case Rol_INS_ADM:
case Rol_SYS_ADM: case Rol_SYS_ADM:
// A teacher or administrator can remove anyone // A teacher or administrator can remove anyone
return true; return Usr_I_CAN;
default: 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) if (MeOrOther == Usr_ME || Gbl.Usrs.Me.Role.Logged >= Rol_TCH)
{ {
/***** Get user's name from record form *****/ /***** 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); Rec_GetUsrNameFromRecordForm (&Gbl.Usrs.Other.UsrDat);
/***** Update user's data in database *****/ /***** Update user's data in database *****/
@ -3008,7 +3007,7 @@ void Enr_ModifyUsr1 (void)
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break; break;
case Enr_ELIMINATE_ONE_USR_FROM_PLATFORM: 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 (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break; break;
default: default:

View File

@ -315,12 +315,12 @@ void Exa_ListAllExams (struct Exa_Exams *Exams)
/************************ Check if I can edit 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_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanEditExams[Gbl.Usrs.Me.Role.Logged]; return ICanEditExams[Gbl.Usrs.Me.Role.Logged];
@ -343,7 +343,7 @@ static void Exa_PutIconsListExams (void *Exams)
if (Exams) if (Exams)
{ {
/***** Put icon to create a new exam *****/ /***** Put icon to create a new exam *****/
if (Exa_CheckIfICanEditExams ()) if (Exa_CheckIfICanEditExams () == Usr_I_CAN)
Exa_PutIconToCreateNewExam ((struct Exa_Exams *) Exams); Exa_PutIconToCreateNewExam ((struct Exa_Exams *) Exams);
/***** Put icon to view sessions results *****/ /***** Put icon to view sessions results *****/
@ -352,9 +352,8 @@ static void Exa_PutIconsListExams (void *Exams)
NULL,NULL); NULL,NULL);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL, Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL,Exa_PutPars,Exams);
Exa_PutPars,Exams);
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
Fig_PutIconToShowFigure (Fig_EXAMS); Fig_PutIconToShowFigure (Fig_EXAMS);
@ -629,8 +628,7 @@ static void Exa_PutIconsEditingOneExam (void *Exams)
{ {
if (Exams) if (Exams)
/***** Icon to view exam *****/ /***** Icon to view exam *****/
Ico_PutContextualIconToView (ActSeeOneExa,NULL, Ico_PutContextualIconToView (ActSeeOneExa,NULL,Exa_PutPars,Exams);
Exa_PutPars,Exams);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -671,7 +669,7 @@ static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams,
[Rol_SYS_ADM] = ActSeeUsrExaResExa, [Rol_SYS_ADM] = ActSeeUsrExaResExa,
}; };
if (Exa_CheckIfICanEditExams ()) if (Exa_CheckIfICanEditExams () == Usr_I_CAN)
{ {
/***** Icon to remove exam *****/ /***** Icon to remove exam *****/
Ico_PutContextualIconToRemove (ActReqRemExa,NULL, Ico_PutContextualIconToRemove (ActReqRemExa,NULL,
@ -683,8 +681,7 @@ static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams,
Exams->Exam.HiddenOrVisible); Exams->Exam.HiddenOrVisible);
/***** Icon to edit exam *****/ /***** Icon to edit exam *****/
Ico_PutContextualIconToEdit (ActEdiOneExa,NULL, Ico_PutContextualIconToEdit (ActEdiOneExa,NULL,Exa_PutPars,Exams);
Exa_PutPars,Exams);
} }
/***** Put icon to view results of sessions in exam *****/ /***** Put icon to view results of sessions in exam *****/
@ -693,9 +690,8 @@ static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams,
Exa_PutPars,Exams); Exa_PutPars,Exams);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL, Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL,Exa_PutPars,Exams);
Exa_PutPars,Exams);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -973,7 +969,7 @@ void Exa_AskRemExam (void)
struct Exa_Exams Exams; struct Exa_Exams Exams;
/***** Check if I can edit exams *****/ /***** Check if I can edit exams *****/
if (!Exa_CheckIfICanEditExams ()) if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Reset exams context *****/ /***** Reset exams context *****/
@ -1006,7 +1002,7 @@ void Exa_RemoveExam (void)
struct Exa_Exams Exams; struct Exa_Exams Exams;
/***** Check if I can edit exams *****/ /***** Check if I can edit exams *****/
if (!Exa_CheckIfICanEditExams ()) if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Reset exams context *****/ /***** Reset exams context *****/
@ -1186,7 +1182,7 @@ static void Exa_HideUnhideExam (HidVis_HiddenOrVisible_t HiddenOrVisible)
struct Exa_Exams Exams; struct Exa_Exams Exams;
/***** Check if I can edit exams *****/ /***** Check if I can edit exams *****/
if (!Exa_CheckIfICanEditExams ()) if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Reset exams context *****/ /***** Reset exams context *****/
@ -1216,7 +1212,7 @@ void Exa_ReqCreatOrEditExam (void)
Exa_ExistingNewExam_t ExistingNewExam; Exa_ExistingNewExam_t ExistingNewExam;
/***** Check if I can edit exams *****/ /***** Check if I can edit exams *****/
if (!Exa_CheckIfICanEditExams ()) if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Reset exams context *****/ /***** Reset exams context *****/
@ -1427,7 +1423,7 @@ void Exa_ReceiveExam (void)
char Txt[Cns_MAX_BYTES_TEXT + 1]; char Txt[Cns_MAX_BYTES_TEXT + 1];
/***** Check if I can edit exams *****/ /***** Check if I can edit exams *****/
if (!Exa_CheckIfICanEditExams ()) if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Reset exams context *****/ /***** 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); 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 **************************/ /*************************** Show stats about exams **************************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -28,6 +28,7 @@
/*****************************************************************************/ /*****************************************************************************/
#include "swad_exam_type.h" #include "swad_exam_type.h"
#include "swad_user.h"
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
@ -39,7 +40,7 @@ void Exa_ResetExam (struct Exa_Exam *Exam);
void Exa_SeeAllExams (void); void Exa_SeeAllExams (void);
void Exa_ListAllExams (struct Exa_Exams *Exams); void Exa_ListAllExams (struct Exa_Exams *Exams);
bool Exa_CheckIfICanEditExams (void); Usr_ICan_t Exa_CheckIfICanEditExams (void);
void Exa_SeeOneExam (void); void Exa_SeeOneExam (void);
void Exa_ShowOnlyOneExam (struct Exa_Exams *Exams,Frm_PutForm_t PutFormSession); 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); void Exa_ReceiveExam (void);
bool Exa_CheckIfEditable (const struct Exa_Exam *Exam);
//-------------------------------- Figures ------------------------------------ //-------------------------------- Figures ------------------------------------
void Exa_GetAndShowExamsStats (void); 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 ***/ /*** 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 return
DB_QueryEXISTS ("can not check if I can play an exam session", 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" " WHERE grp_users.UsrCod=%ld"
" AND grp_users.GrpCod=exa_groups.GrpCod)))", " AND grp_users.GrpCod=exa_groups.GrpCod)))",
SesCod, 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) 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. /* Log access in exam log.
Redundant data (also present in log table) are stored for speed */ Redundant data (also present in log table) are stored for speed */
DB_QueryINSERT ("can not log exam access", DB_QueryINSERT ("can not log exam access",
@ -2161,8 +2168,7 @@ void Exa_DB_LogAccess (long LogCod,long PrnCod,ExaLog_Action_t Action)
PrnCod, PrnCod,
(unsigned) Action, (unsigned) Action,
ExaLog_GetQstInd (), ExaLog_GetQstInd (),
ExaLog_GetIfCanAnswer () ? 'Y' : YN[ExaLog_GetIfCanAnswer ()],
'N',
// NOW() Redundant, for speed // NOW() Redundant, for speed
Par_GetIP ()); // Redundant, for speed Par_GetIP ()); // Redundant, for speed
} }

View File

@ -128,7 +128,7 @@ void Exa_DB_RemoveUsrFromSessionTablesInCrs (long UsrCod,long CrsCod);
//--------------------------------- Groups ------------------------------------ //--------------------------------- Groups ------------------------------------
void Exa_DB_CreateGrpAssociatedToSes (long SesCod,long GrpCod); void Exa_DB_CreateGrpAssociatedToSes (long SesCod,long GrpCod);
unsigned Exa_DB_GetGrpsAssociatedToSes (MYSQL_RES **mysql_res,long SesCod); 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_RemoveAllGrpsFromExa (long ExaCod);
void Exa_DB_RemoveAllGrpsFromCrs (long CrsCod); void Exa_DB_RemoveAllGrpsFromCrs (long CrsCod);
void Exa_DB_RemoveAllGrpsFromSes (long SesCod); void Exa_DB_RemoveAllGrpsFromSes (long SesCod);

View File

@ -54,7 +54,7 @@ static struct
long PrnCod; // Exam print code long PrnCod; // Exam print code
int QstInd; // Exam print question index int QstInd; // Exam print question index
ExaLog_Action_t Action; // Action performed by user 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 = } ExaLog_Log =
{ {
.PrnCod = -1L, // -1 means no print code set .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 **************/ /************* 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; ExaLog_Log.ICanAnswer = ICanAnswer;
} }
bool ExaLog_GetIfCanAnswer (void) Usr_ICan_t ExaLog_GetIfCanAnswer (void)
{ {
return ExaLog_Log.ICanAnswer; return ExaLog_Log.ICanAnswer;
} }

View File

@ -54,8 +54,8 @@ void ExaLog_SetAction (ExaLog_Action_t Action);
ExaLog_Action_t ExaLog_GetAction (void); ExaLog_Action_t ExaLog_GetAction (void);
void ExaLog_SetQstInd (unsigned QstInd); void ExaLog_SetQstInd (unsigned QstInd);
int ExaLog_GetQstInd (void); int ExaLog_GetQstInd (void);
void ExaLog_SetIfCanAnswer (bool CanBeAnswered); void ExaLog_SetIfCanAnswer (Usr_ICan_t CanBeAnswered);
bool ExaLog_GetIfCanAnswer (void); Usr_ICan_t ExaLog_GetIfCanAnswer (void);
void ExaLog_LogAccess (long LogCod); void ExaLog_LogAccess (long LogCod);

View File

@ -178,7 +178,7 @@ void ExaPrn_ShowExamPrint (void)
ExaSes_GetAndCheckPars (&Exams,&Session); ExaSes_GetAndCheckPars (&Exams,&Session);
/***** Check if I can access to this 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 *****/ /***** Set basic data of exam print *****/
Print.SesCod = Session.SesCod; Print.SesCod = Session.SesCod;
@ -996,7 +996,7 @@ void ExaPrn_ReceivePrintAnswer (void)
ExaLog_SetQstInd (QstInd); ExaLog_SetQstInd (QstInd);
/***** Check if session if visible and open *****/ /***** 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 ****/ /***** Set log open to true ****/
ExaLog_SetIfCanAnswer (true); ExaLog_SetIfCanAnswer (true);

View File

@ -69,8 +69,8 @@ extern struct Globals Gbl;
struct ExaRes_ICanView struct ExaRes_ICanView
{ {
bool Result; Usr_ICan_t Result;
bool Score; Usr_ICan_t Score;
}; };
/*****************************************************************************/ /*****************************************************************************/
@ -292,7 +292,7 @@ static void ExaRes_PutFormToSelUsrsToViewResults (__attribute__((unused)) void *
Txt_Results, Txt_Results,
Hlp_ASSESSMENT_Exams_results, Hlp_ASSESSMENT_Exams_results,
Txt_View_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, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS)) 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 *****/ /***** Show sessions results *****/
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); 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, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS)) 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 *****/ /***** Show sessions results *****/
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); 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, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS)) 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 *****/ /***** Show sessions results *****/
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); 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 (); HTM_TD_End ();
/* Get and accumulate questions and score */ /* 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 */ /* Get questions and user's answers of exam print from database */
ExaPrn_GetPrintQuestionsFromDB (&Print); 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\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
HTM_Unsigned (Print.NumQsts.All); HTM_Unsigned (Print.NumQsts.All);
else else
Ico_PutIconNotVisible (); Ico_PutIconNotVisible ();
@ -862,7 +862,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_GREEN_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_GREEN_%s %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Total) if (Print.NumQsts.Valid.Total)
HTM_Unsigned (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\"", HTM_TD_Begin ("class=\"RT DAT_RED_%s %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
NumQstsInvalid = Print.NumQsts.All - Print.NumQsts.Valid.Total; NumQstsInvalid = Print.NumQsts.All - Print.NumQsts.Valid.Total;
if (NumQstsInvalid) if (NumQstsInvalid)
@ -893,7 +893,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Correct) if (Print.NumQsts.Valid.Correct)
HTM_Unsigned (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\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Wrong.Negative) if (Print.NumQsts.Valid.Wrong.Negative)
HTM_Unsigned (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\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Wrong.Zero) if (Print.NumQsts.Valid.Wrong.Zero)
HTM_Unsigned (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\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Wrong.Positive) if (Print.NumQsts.Valid.Wrong.Positive)
HTM_Unsigned (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\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Blank) if (Print.NumQsts.Valid.Blank)
HTM_Unsigned (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\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
HTM_Double2Decimals (Print.Score.Valid); HTM_Double2Decimals (Print.Score.Valid);
HTM_Txt ("/"); HTM_Txt ("/");
@ -980,7 +980,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
HTM_Double2Decimals (Print.NumQsts.Valid.Total ? Print.Score.Valid / HTM_Double2Decimals (Print.NumQsts.Valid.Total ? Print.Score.Valid /
(double) Print.NumQsts.Valid.Total : (double) Print.NumQsts.Valid.Total :
0.0); 0.0);
@ -992,7 +992,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid.Total,Print.Score.Valid,Exam.MaxGrade); Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid.Total,Print.Score.Valid,Exam.MaxGrade);
TstPrn_ShowGrade (Grade,Exam.MaxGrade); TstPrn_ShowGrade (Grade,Exam.MaxGrade);
@ -1005,7 +1005,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
/* Link to show this result */ /* Link to show this result */
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Result) if (ICanView.Result == Usr_I_CAN)
{ {
Exams->Exam.ExaCod = Session.ExaCod; Exams->Exam.ExaCod = Session.ExaCod;
Exams->SesCod = Session.SesCod; Exams->SesCod = Session.SesCod;
@ -1218,8 +1218,8 @@ void ExaRes_ShowExaResultAfterFinish (void)
struct ExaPrn_Print Print; struct ExaPrn_Print Print;
struct ExaRes_ICanView ICanView = struct ExaRes_ICanView ICanView =
{ {
.Result = true, // I have just finish answering, so show result... .Result = Usr_I_CAN, // I have just finish answering, so show result...
.Score = false, // ...but not score .Score = Usr_I_CAN_NOT, // ...but not score
}; };
unsigned Visibility = 1 << TstVis_VISIBLE_QST_ANS_TXT; // Show only questions and answers text 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_PREFS,
Usr_DONT_GET_ROLE_IN_CRS)) Usr_DONT_GET_ROLE_IN_CRS))
Err_WrongUserExit (); Err_WrongUserExit ();
if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat)) if (Usr_CheckIfICanViewTstExaMchResult (UsrDat) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Begin table *****/ /***** Begin table *****/
@ -1371,7 +1371,7 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
ExaRes_ShowExamResultGrade (Exam,Print,ICanView); ExaRes_ShowExamResultGrade (Exam,Print,ICanView);
/* Answers and solutions */ /* Answers and solutions */
if (ICanView->Result) if (ICanView->Result == Usr_I_CAN)
ExaRes_ShowExamAnswers (UsrDat,Print,Visibility); ExaRes_ShowExamAnswers (UsrDat,Print,Visibility);
/***** End table *****/ /***** 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 ICanView->Result = (Usr_ItsMe (UsrCod) == Usr_ME && // The result is mine
Exam->HiddenOrVisible == HidVis_VISIBLE && // The exam is visible Exam->HiddenOrVisible == HidVis_VISIBLE && // The exam is visible
Session->HiddenOrVisible == HidVis_VISIBLE && // The session 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... // 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 // ...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 // 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 else
ICanView->Score = false; ICanView->Score = Usr_I_CAN_NOT;
break; break;
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
@ -1415,11 +1417,11 @@ static void ExaRes_CheckIfICanViewResult (const struct Exa_Exam *Exam,
case Rol_INS_ADM: case Rol_INS_ADM:
case Rol_SYS_ADM: case Rol_SYS_ADM:
ICanView->Result = ICanView->Result =
ICanView->Score = true; ICanView->Score = Usr_I_CAN;
break; break;
default: default:
ICanView->Result = ICanView->Result =
ICanView->Score = false; ICanView->Score = Usr_I_CAN_NOT;
break; break;
} }
} }
@ -1600,7 +1602,7 @@ static void ExaRes_ShowExamResultNumQsts (struct ExaPrn_Print *Print,
/***** Number of questions *****/ /***** Number of questions *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Result) if (ICanView->Result == Usr_I_CAN)
{ {
HTM_TxtF ("%u",Print->NumQsts.All); HTM_TxtF ("%u",Print->NumQsts.All);
if (Print->NumQsts.All != Print->NumQsts.Valid.Total) if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
@ -1654,7 +1656,7 @@ static void ExaRes_ShowExamResultNumAnss (struct ExaPrn_Print *Print,
/***** Number of answers *****/ /***** Number of answers *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); 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; " 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(-1&le;<em>p<sub>i</sub></em>&lt;0):&nbsp;%u; "
"%s(<em>p<sub>i</sub></em>=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 *****/ /***** Score *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Score) if (ICanView->Score == Usr_I_CAN)
{ {
/* Score counting all questions */ /* Score counting all questions */
if (Print->NumQsts.All == Print->NumQsts.Valid.Total) if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
@ -1745,7 +1747,7 @@ static void ExaRes_ShowExamResultGrade (const struct Exa_Exam *Exam,
/***** Grade *****/ /***** Grade *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Score) if (ICanView->Score == Usr_I_CAN)
{ {
/* Grade counting all questions */ /* Grade counting all questions */
if (Print->NumQsts.All == Print->NumQsts.Valid.Total) 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_Score;
extern const char *Txt_Invalid_question; 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] = static const char *ClassNumQst[Qst_NUM_VALIDITIES] =
{ {
[Qst_INVALID_QUESTION] = "BIG_INDEX_RED", [Qst_INVALID_QUESTION] = "BIG_INDEX_RED",
@ -1840,10 +1842,14 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility); ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility) ? Usr_I_CAN:
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility); Usr_I_CAN_NOT;
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility); ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility) ? Usr_I_CAN:
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility); 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; break;
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
@ -1854,13 +1860,13 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = true; ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN;
break; break;
default: default:
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = false; ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN_NOT;
break; break;
} }
@ -1879,10 +1885,10 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
/* Stem */ /* Stem */
Qst_WriteQstStem (Question->Stem,ClassTxt[Question->Validity], Qst_WriteQstStem (Question->Stem,ClassTxt[Question->Validity],
ICanView[TstVis_VISIBLE_QST_ANS_TXT]); ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN);
/* Media */ /* Media */
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT]) if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN)
Med_ShowMedia (&Question->Media, Med_ShowMedia (&Question->Media,
"Tst_MED_SHOW_CONT", "Tst_MED_SHOW_CONT",
"Tst_MED_SHOW"); "Tst_MED_SHOW");
@ -1895,7 +1901,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
ClassFeedback[Question->Validity]); ClassFeedback[Question->Validity]);
/* Write score retrieved from database */ /* 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\"", HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"",
The_GetSuffix ()); The_GetSuffix ());
@ -1914,7 +1920,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
} }
/* Question feedback */ /* Question feedback */
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT]) if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
Qst_WriteQstFeedback (Question->Feedback, Qst_WriteQstFeedback (Question->Feedback,
ClassFeedback[Question->Validity]); ClassFeedback[Question->Validity]);

View File

@ -72,10 +72,10 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
Frm_PutForm_t PutFormSession, Frm_PutForm_t PutFormSession,
unsigned NumSessions, unsigned NumSessions,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions); static void ExaSes_ListOneOrMoreSessionsHeading (Usr_ICan_t ICanEditSessions);
static bool ExaSes_CheckIfICanEditSessions (void); static Usr_ICan_t ExaSes_CheckIfICanEditSessions (void);
static bool ExaSes_CheckIfICanEditThisSession (long UsrCod); static Usr_ICan_t ExaSes_CheckIfICanEditThisSession (long UsrCod);
static bool ExaSes_CheckIfVisibilityOfResultsCanBeChanged (const struct ExaSes_Session *Session); static Usr_ICan_t ExaSes_CheckIfICanChangeVisibilityOfResults (const struct ExaSes_Session *Session);
static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams, static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams,
const struct ExaSes_Session *Session, const struct ExaSes_Session *Session,
const char *Anchor); const char *Anchor);
@ -151,7 +151,8 @@ void ExaSes_ListSessions (struct Exa_Exams *Exams,
Hlp_ASSESSMENT_Exams_sessions,Box_NOT_CLOSABLE); Hlp_ASSESSMENT_Exams_sessions,Box_NOT_CLOSABLE);
/***** Select whether show only my groups or all groups *****/ /***** 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 (); Set_BeginSettingsHead ();
Grp_ShowFormToSelWhichGrps (ActSeeOneExa,Exa_PutPars,Exams); Grp_ShowFormToSelWhichGrps (ActSeeOneExa,Exa_PutPars,Exams);
@ -203,15 +204,10 @@ void ExaSes_GetSessionDataByCod (struct ExaSes_Session *Session)
static void ExaSes_PutIconsInListOfSessions (void *Exams) static void ExaSes_PutIconsInListOfSessions (void *Exams)
{ {
bool ICanEditSessions;
if (Exams) if (Exams)
{ if (ExaSes_CheckIfICanEditSessions () == Usr_I_CAN)
/***** Put icon to create a new exam session in current exam *****/ /***** Put icon to create a new exam session in current exam *****/
ICanEditSessions = ExaSes_CheckIfICanEditSessions ();
if (ICanEditSessions)
ExaSes_PutIconToCreateNewSession ((struct Exa_Exams *) Exams); ExaSes_PutIconToCreateNewSession ((struct Exa_Exams *) Exams);
}
} }
/*****************************************************************************/ /*****************************************************************************/
@ -237,7 +233,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
unsigned UniqueId; unsigned UniqueId;
struct ExaSes_Session Session; struct ExaSes_Session Session;
char *Anchor; char *Anchor;
bool ICanEditSessions = ExaSes_CheckIfICanEditSessions (); Usr_ICan_t ICanEditSessions = ExaSes_CheckIfICanEditSessions ();
long SesCodToBeEdited = PutFormSession == Frm_PUT_FORM && long SesCodToBeEdited = PutFormSession == Frm_PUT_FORM &&
Exams->SesCod > 0 ? Exams->SesCod : Exams->SesCod > 0 ? Exams->SesCod :
-1L; -1L;
@ -260,7 +256,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
/***** Get exam session data from row *****/ /***** Get exam session data from row *****/
ExaSes_GetSessionDataFromRow (mysql_res,&Session); ExaSes_GetSessionDataFromRow (mysql_res,&Session);
if (ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session.SesCod)) if (ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session.SesCod) == Usr_I_CAN)
{ {
/***** Build anchor string *****/ /***** Build anchor string *****/
if (asprintf (&Anchor,"evt_%ld_%ld",Exams->Exam.ExaCod,Session.SesCod) < 0) 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 *************/ /************* 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_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Session; extern const char *Txt_Session;
@ -343,14 +339,14 @@ static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions)
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/***** Column for icons *****/ /***** Column for icons *****/
if (ICanEditSessions) if (ICanEditSessions == Usr_I_CAN)
HTM_TH_Empty (1); HTM_TH_Empty (1);
/***** The rest of columns *****/ /***** 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_START_DATE],HTM_HEAD_LEFT );
HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_END_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_Session ,HTM_HEAD_LEFT );
HTM_TH (Txt_Results ,HTM_HEAD_CENTER); HTM_TH (Txt_Results ,HTM_HEAD_CENTER);
/***** End row *****/ /***** End row *****/
HTM_TR_End (); HTM_TR_End ();
@ -360,13 +356,13 @@ static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions)
/********************** Check if I can edit sessions *************************/ /********************** 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_NET ] = Usr_I_CAN,
[Rol_TCH ] = true, [Rol_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanEditSessions[Gbl.Usrs.Me.Role.Logged]; 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 ************/ /************ 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_NET: 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_TCH:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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 ************/ /********** 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 if (Session->ShowUsrResults || // Results are currently visible
Session->TimeUTC[Dat_END_TIME] < Dat_GetStartExecutionTimeUTC ()) // End of time is in the past Session->TimeUTC[Dat_END_TIME] < Dat_GetStartExecutionTimeUTC ()) // End of time is in the past
if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod)) return ExaSes_CheckIfICanEditThisSession (Session->UsrCod);
return true;
return false; return Usr_I_CAN_NOT;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -424,7 +420,7 @@ static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams,
/***** Begin cell *****/ /***** Begin cell *****/
HTM_TD_Begin ("rowspan=\"2\" class=\"BT %s\"",The_GetColorRows ()); 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 *****/ /***** Icon to remove the exam session *****/
Ico_PutContextualIconToRemove (ActReqRemExaSes,NULL, Ico_PutContextualIconToRemove (ActReqRemExaSes,NULL,
@ -504,7 +500,7 @@ static void ExaSes_ListOneOrMoreSessionsTitleGrps (struct Exa_Exams *Exams,
/***** Session title *****/ /***** Session title *****/
HTM_ARTICLE_Begin (Anchor); HTM_ARTICLE_Begin (Anchor);
if (ExaSes_CheckIfICanAnswerThisSession (&Exams->Exam,Session)) if (ExaSes_CheckIfICanAnswerThisSession (&Exams->Exam,Session) == Usr_I_CAN)
{ {
Frm_BeginForm (ActSeeExaPrn); Frm_BeginForm (ActSeeExaPrn);
Exa_PutPars (Exams); Exa_PutPars (Exams);
@ -648,13 +644,13 @@ static void ExaSes_ListOneOrMoreSessionsResultTch (struct Exa_Exams *Exams,
Exams->SesCod = Session->SesCod; Exams->SesCod = Session->SesCod;
/***** Show exam session results *****/ /***** Show exam session results *****/
if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod)) if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod) == Usr_I_CAN)
Lay_PutContextualLinkOnlyIcon (ActSeeUsrExaResSes,ExaRes_RESULTS_BOX_ID, Lay_PutContextualLinkOnlyIcon (ActSeeUsrExaResSes,ExaRes_RESULTS_BOX_ID,
ExaSes_PutParsEdit,Exams, ExaSes_PutParsEdit,Exams,
"trophy.svg",Ico_BLACK); "trophy.svg",Ico_BLACK);
/***** Check if visibility of session results can be changed *****/ /***** 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 *****/ /***** Put form to change visibility of session results *****/
if (Session->ShowUsrResults) if (Session->ShowUsrResults)
@ -694,7 +690,7 @@ void ExaSes_ToggleVisResultsSesUsr (void)
ExaSes_GetAndCheckPars (&Exams,&Session); ExaSes_GetAndCheckPars (&Exams,&Session);
/***** Check if visibility of session results can be changed *****/ /***** Check if visibility of session results can be changed *****/
if (!ExaSes_CheckIfVisibilityOfResultsCanBeChanged (&Session)) if (ExaSes_CheckIfICanChangeVisibilityOfResults (&Session) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Toggle visibility of exam session results *****/ /***** Toggle visibility of exam session results *****/
@ -812,7 +808,7 @@ void ExaSes_RemoveSession (void)
ExaSes_GetAndCheckPars (&Exams,&Session); ExaSes_GetAndCheckPars (&Exams,&Session);
/***** Check if I can remove this exam 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 (); Err_NoPermissionExit ();
/***** Remove questions of exams prints, and exam prints, in this session *****/ /***** 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); ExaSes_GetAndCheckPars (&Exams,&Session);
/***** Check if I can remove this exam 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 (); Err_NoPermissionExit ();
/***** Hide session *****/ /***** 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 **********/ /******** Check if I belong to any of the groups of an exam session **********/
/*****************************************************************************/ /*****************************************************************************/
bool ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam, Usr_ICan_t ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
const struct ExaSes_Session *Session) const struct ExaSes_Session *Session)
{ {
/***** 1. Sessions in hidden exams are not accesible /***** 1. Sessions in hidden exams are not accesible
2. Hidden or closed sessions are not accesible *****/ 2. Hidden or closed sessions are not accesible *****/
if (Exam->HiddenOrVisible == HidVis_HIDDEN || if (Exam->HiddenOrVisible == HidVis_HIDDEN ||
Session->HiddenOrVisible == HidVis_HIDDEN || Session->HiddenOrVisible == HidVis_HIDDEN ||
!Session->Open) !Session->Open)
return false; return Usr_I_CAN_NOT;
/***** Exam is visible, session is visible and open ==> /***** Exam is visible, session is visible and open ==>
==> I can answer this session if I can list it based on groups *****/ ==> I can answer this session if I can list it based on groups *****/
return ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session->SesCod); return ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session->SesCod);
} }
bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod) Usr_ICan_t ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
{ {
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
@ -1237,8 +1233,8 @@ bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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_ReqCreatOrEditSes (void);
void ExaSes_ReceiveSession (void); void ExaSes_ReceiveSession (void);
bool ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam, Usr_ICan_t ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
const struct ExaSes_Session *Session); const struct ExaSes_Session *Session);
bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod); Usr_ICan_t ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod);
#endif #endif

View File

@ -91,13 +91,13 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
unsigned MaxSetInd, unsigned MaxSetInd,
unsigned NumSets, unsigned NumSets,
MYSQL_RES *mysql_res, MYSQL_RES *mysql_res,
bool ICanEditSets); Usr_ICan_t ICanEditSets);
static void ExaSet_PutTableHeadingForSets (void); static void ExaSet_PutTableHeadingForSets (void);
static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams, static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
unsigned NumQsts, unsigned NumQsts,
MYSQL_RES *mysql_res, MYSQL_RES *mysql_res,
bool ICanEditQuestions); Usr_ICan_t ICanEditQuestions);
static void ExaSet_ListQuestionForEdition (struct Qst_Question *Question, static void ExaSet_ListQuestionForEdition (struct Qst_Question *Question,
unsigned QstInd,const char *Anchor); 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 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_RemoveMediaFromStemOfQst (long QstCod,long SetCod);
static void ExaSet_RemoveMediaFromAllAnsOfQst (long QstCod,long SetCod); static void ExaSet_RemoveMediaFromAllAnsOfQst (long QstCod,long SetCod);
@ -251,7 +253,7 @@ void ExaSet_ReceiveSet (void)
Exa_GetExamDataByCod (&Exams.Exam); Exa_GetExamDataByCod (&Exams.Exam);
/***** Check if exam is editable *****/ /***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam)) if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** If I can edit exams ==> receive set from form *****/ /***** If I can edit exams ==> receive set from form *****/
@ -318,7 +320,7 @@ void ExaSet_ChangeSetTitle (void)
char NewTitle[ExaSet_MAX_BYTES_TITLE + 1]; char NewTitle[ExaSet_MAX_BYTES_TITLE + 1];
/***** Check if I can edit exams *****/ /***** Check if I can edit exams *****/
if (!Exa_CheckIfICanEditExams ()) if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Reset exams context *****/ /***** Reset exams context *****/
@ -330,7 +332,7 @@ void ExaSet_ChangeSetTitle (void)
ExaSet_GetAndCheckPars (&Exams,&Set); ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/ /***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam)) if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Receive new title from form *****/ /***** Receive new title from form *****/
@ -361,7 +363,7 @@ void ExaSet_ChangeNumQstsToExam (void)
unsigned NumQstsToPrint; unsigned NumQstsToPrint;
/***** Check if I can edit exams *****/ /***** Check if I can edit exams *****/
if (!Exa_CheckIfICanEditExams ()) if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Reset exams context *****/ /***** Reset exams context *****/
@ -373,7 +375,7 @@ void ExaSet_ChangeNumQstsToExam (void)
ExaSet_GetAndCheckPars (&Exams,&Set); ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/ /***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam)) if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get number of questions in set to appear in exam print *****/ /***** 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; MYSQL_RES *mysql_res;
unsigned MaxSetInd; unsigned MaxSetInd;
unsigned NumSets; unsigned NumSets;
bool ICanEditSets = Exa_CheckIfEditable (&Exams->Exam); Usr_ICan_t ICanEditSets = ExaSet_CheckIfICanEditExamSets (&Exams->Exam);
/***** Get maximum set index *****/ /***** Get maximum set index *****/
MaxSetInd = Exa_DB_GetMaxSetIndexInExam (Exams->Exam.ExaCod); MaxSetInd = Exa_DB_GetMaxSetIndexInExam (Exams->Exam.ExaCod);
@ -516,14 +518,14 @@ static void ExaSet_ListSetQuestions (struct Exa_Exams *Exams,
extern const char *Txt_Questions; extern const char *Txt_Questions;
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
unsigned NumQsts; unsigned NumQsts;
bool ICanEditQuestions = Exa_CheckIfEditable (&Exams->Exam); Usr_ICan_t ICanEditQuestions = ExaSet_CheckIfICanEditExamSets (&Exams->Exam);
/***** Begin box *****/ /***** Begin box *****/
Box_BoxBegin (Txt_Questions, Box_BoxBegin (Txt_Questions,
ICanEditQuestions ? ExaSet_PutIconToAddNewQuestions : ICanEditQuestions == Usr_I_CAN ? ExaSet_PutIconToAddNewQuestions :
NULL, NULL,
ICanEditQuestions ? Exams : ICanEditQuestions == Usr_I_CAN ? Exams :
NULL, NULL,
Hlp_ASSESSMENT_Exams_questions,Box_NOT_CLOSABLE); Hlp_ASSESSMENT_Exams_questions,Box_NOT_CLOSABLE);
/***** Show table with questions *****/ /***** Show table with questions *****/
@ -546,7 +548,7 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
unsigned MaxSetInd, unsigned MaxSetInd,
unsigned NumSets, unsigned NumSets,
MYSQL_RES *mysql_res, MYSQL_RES *mysql_res,
bool ICanEditSets) Usr_ICan_t ICanEditSets)
{ {
extern const char *Txt_Movement_not_allowed; extern const char *Txt_Movement_not_allowed;
unsigned NumSet; unsigned NumSet;
@ -586,14 +588,14 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
The_GetColorRows ()); The_GetColorRows ());
/* Put icon to remove the set */ /* Put icon to remove the set */
if (ICanEditSets) if (ICanEditSets == Usr_I_CAN)
Ico_PutContextualIconToRemove (ActReqRemExaSet,NULL, Ico_PutContextualIconToRemove (ActReqRemExaSet,NULL,
ExaSet_PutParsOneSet,Exams); ExaSet_PutParsOneSet,Exams);
else else
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
/* Put icon to move up the question */ /* 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, Lay_PutContextualLinkOnlyIcon (ActUp_ExaSet,Anchor,
ExaSet_PutParsOneSet,Exams, ExaSet_PutParsOneSet,Exams,
"arrow-up.svg",Ico_BLACK); "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, static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
unsigned NumQsts, unsigned NumQsts,
MYSQL_RES *mysql_res, MYSQL_RES *mysql_res,
bool ICanEditQuestions) Usr_ICan_t ICanEditQuestions)
{ {
extern const char *Txt_Questions; extern const char *Txt_Questions;
extern const char *Txt_No_INDEX; 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 ()); HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ());
/* Put icon to remove the question */ /* Put icon to remove the question */
if (ICanEditQuestions) if (ICanEditQuestions == Usr_I_CAN)
Ico_PutContextualIconToRemove (ActReqRemSetQst,NULL, Ico_PutContextualIconToRemove (ActReqRemSetQst,NULL,
ExaSet_PutParsOneQst,Exams); ExaSet_PutParsOneQst,Exams);
else else
@ -1250,7 +1252,7 @@ void ExaSet_ReqRemSet (void)
ExaSet_GetAndCheckPars (&Exams,&Set); ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/ /***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam)) if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Show question and button to remove question *****/ /***** Show question and button to remove question *****/
@ -1282,7 +1284,7 @@ void ExaSet_RemoveSet (void)
ExaSet_GetAndCheckPars (&Exams,&Set); ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/ /***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam)) if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Remove the set from all tables *****/ /***** Remove the set from all tables *****/
@ -1323,7 +1325,7 @@ void ExaSet_MoveUpSet (void)
ExaSet_GetAndCheckPars (&Exams,&Set); ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/ /***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam)) if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get set index *****/ /***** Get set index *****/
@ -1369,7 +1371,7 @@ void ExaSet_MoveDownSet (void)
ExaSet_GetAndCheckPars (&Exams,&Set); ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/ /***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam)) if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get set index *****/ /***** Get set index *****/
@ -1396,6 +1398,21 @@ void ExaSet_MoveDownSet (void)
Exa_PutFormsOneExam (&Exams,Exa_EXISTING_EXAM); 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 ********************/ /********************** 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_OVAL ] = "PHOTOO60x80",
[PhoSha_SHAPE_RECTANGLE] = "PHOTOR60x80", [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\""); HTM_DIV_Begin ("class=\"FOLLOW_USR\"");
/***** Show user's photo *****/ /***** Show user's photo *****/
HTM_DIV_Begin ("class=\"FOLLOW_PHOTO\""); HTM_DIV_Begin ("class=\"FOLLOW_PHOTO\"");
if (Visible) if (ICanView == Usr_I_CAN)
Pho_ShowUsrPhotoIfAllowed (UsrDat, Pho_ShowUsrPhotoIfAllowed (UsrDat,
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM); ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
HTM_DIV_End (); HTM_DIV_End ();
@ -586,7 +586,7 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat)
/***** Show user's name and icon to follow/unfollow *****/ /***** Show user's name and icon to follow/unfollow *****/
HTM_DIV_Begin ("class=\"FOLLOW_TXT\""); HTM_DIV_Begin ("class=\"FOLLOW_TXT\"");
if (Visible) if (ICanView == Usr_I_CAN)
{ {
/* Put form to go to public profile */ /* Put form to go to public profile */
Frm_BeginForm (ActSeeOthPubPrf); Frm_BeginForm (ActSeeOthPubPrf);
@ -612,7 +612,7 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat)
UsrDat->UsrCod)) // I follow user UsrDat->UsrCod)) // I follow user
/* Form to unfollow */ /* Form to unfollow */
Fol_PutIconToUnfollow (UsrDat->EnUsrCod); 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 */ /* Form to follow */
Fol_PutIconToFollow (UsrDat->EnUsrCod); Fol_PutIconToFollow (UsrDat->EnUsrCod);
} }
@ -636,13 +636,13 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat)
[PhoSha_SHAPE_OVAL ] = "PHOTOO21x28", [PhoSha_SHAPE_OVAL ] = "PHOTOO21x28",
[PhoSha_SHAPE_RECTANGLE] = "PHOTOR21x28", [PhoSha_SHAPE_RECTANGLE] = "PHOTOR21x28",
}; };
bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat); Usr_ICan_t ICanView = Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat);
/***** Show user's photo *****/ /***** Show user's photo *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"CON_PHOTO %s\"",The_GetColorRows ()); HTM_TD_Begin ("class=\"CON_PHOTO %s\"",The_GetColorRows ());
if (Visible) if (ICanView == Usr_I_CAN)
Pho_ShowUsrPhotoIfAllowed (UsrDat, Pho_ShowUsrPhotoIfAllowed (UsrDat,
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM); ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
HTM_TD_End (); HTM_TD_End ();
@ -650,7 +650,7 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat)
/***** User's name *****/ /***** User's name *****/
HTM_TD_Begin ("class=\"CON_NAME_FOLLOW %s\"", HTM_TD_Begin ("class=\"CON_NAME_FOLLOW %s\"",
The_GetColorRows ()); The_GetColorRows ());
if (Visible) if (ICanView == Usr_I_CAN)
{ {
/* Put form to go to public profile */ /* Put form to go to public profile */
Frm_BeginForm (ActSeeOthPubPrf); Frm_BeginForm (ActSeeOthPubPrf);
@ -679,7 +679,7 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat)
UsrDat->UsrCod)) // I follow user UsrDat->UsrCod)) // I follow user
/* Form to unfollow */ /* Form to unfollow */
Fol_PutIconToUnfollow (UsrDat->EnUsrCod); 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 */ /* Form to follow */
Fol_PutIconToFollow (UsrDat->EnUsrCod); 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 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_InsertThrInClipboard (long ThrCod);
static void For_ShowStatOfAForumType (For_ForumType_t ForumType, static void For_ShowStatOfAForumType (For_ForumType_t ForumType,
@ -720,7 +720,7 @@ void For_ShowPostsOfAThread (struct For_Forums *Forums,
For_GetThreadData (&Thread); For_GetThreadData (&Thread);
/***** Get if there is a thread ready to be moved *****/ /***** 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 (); Forums->Thread.ToMove = For_DB_GetThrInMyClipboard ();
/***** Get thread read time for the current user *****/ /***** Get thread read time for the current user *****/
@ -871,7 +871,7 @@ static void For_PutIconsOneThread (void *Forums)
/***** Put icon to get resource link *****/ /***** Put icon to get resource link *****/
if (((struct For_Forums *) Forums)->Forum.Type == For_FORUM_COURSE_USRS && if (((struct For_Forums *) Forums)->Forum.Type == For_FORUM_COURSE_USRS &&
Rsc_CheckIfICanGetLink ()) Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkForCrsUsr,NULL, Ico_PutContextualIconToGetLink (ActReqLnkForCrsUsr,NULL,
For_PutParsNewPost,Forums); For_PutParsNewPost,Forums);
} }
@ -1233,7 +1233,7 @@ void For_ShowForumList (struct For_Forums *Forums)
bool ICanSeeDegForum; bool ICanSeeDegForum;
/***** Get if there is a thread ready to be moved *****/ /***** 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 (); Forums->Thread.ToMove = For_DB_GetThrInMyClipboard ();
/***** Fill the list with the institutions I belong to *****/ /***** 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 *****/ /***** Put icon to get resource link *****/
if (((struct For_Forums *) Forums)->Forum.Type == For_FORUM_COURSE_USRS && if (((struct For_Forums *) Forums)->Forum.Type == For_FORUM_COURSE_USRS &&
Rsc_CheckIfICanGetLink ()) Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkForCrsUsr,NULL, Ico_PutContextualIconToGetLink (ActReqLnkForCrsUsr,NULL,
For_PutParsNewPost,Forums); For_PutParsNewPost,Forums);
} }
@ -2232,10 +2232,10 @@ static void For_ListForumThrs (struct For_Forums *Forums,
long ThreadInMyClipboard = -1L; long ThreadInMyClipboard = -1L;
unsigned Column; unsigned Column;
const char *BgColor; const char *BgColor;
bool ICanMoveThreads; Usr_ICan_t ICanMoveThreads = For_CheckIfICanMoveThreads ();
/***** Get if there is a thread ready to be moved *****/ /***** Get if there is a thread ready to be moved *****/
if ((ICanMoveThreads = For_CheckIfICanMoveThreads ())) if (ICanMoveThreads == Usr_I_CAN)
ThreadInMyClipboard = For_DB_GetThrInMyClipboard (); ThreadInMyClipboard = For_DB_GetThrInMyClipboard ();
/***** Initialize structure with user's data *****/ /***** 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 *****/ /***** Put button to cut the thread for moving it to another forum *****/
if (ICanMoveThreads) if (ICanMoveThreads == Usr_I_CAN)
{ {
HTM_BR (); HTM_BR ();
Frm_BeginFormAnchor (For_ActionsCutThrFor[Forums->Forum.Type], Frm_BeginFormAnchor (For_ActionsCutThrFor[Forums->Forum.Type],
@ -3238,9 +3238,10 @@ void For_PasteThread (void)
/*********************** Check if I can move threads *************************/ /*********************** 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 void Gam_ListAllGamesHeading (const struct Gam_Games *Games);
static bool Gam_CheckIfICanEditGames (void); static Usr_ICan_t Gam_CheckIfICanEditGames (void);
static bool Gam_CheckIfICanListGameQuestions (void); static Usr_ICan_t Gam_CheckIfICanListGameQuestions (void);
static void Gam_PutIconsListingGames (void *Games); static void Gam_PutIconsListingGames (void *Games);
static void Gam_PutIconToCreateNewGame (struct Gam_Games *Games); static void Gam_PutIconToCreateNewGame (struct Gam_Games *Games);
static void Gam_PutParsToCreateNewGame (void *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, static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
unsigned NumQsts, unsigned NumQsts,
MYSQL_RES *mysql_res, MYSQL_RES *mysql_res,
bool ICanEditQuestions); Usr_ICan_t ICanEditQuestions);
static void Gam_PutIconToAddNewQuestions (void *Games); static void Gam_PutIconToAddNewQuestions (void *Games);
@ -163,7 +163,7 @@ static void Gam_FreeListsSelectedQuestions (struct Gam_Games *Games);
static void Gam_ExchangeQuestions (long GamCod, static void Gam_ExchangeQuestions (long GamCod,
unsigned QstIndTop,unsigned QstIndBottom); 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 *****************************/ /*************************** Reset games context *****************************/
@ -346,9 +346,9 @@ static void Gam_ListAllGamesHeading (const struct Gam_Games *Games)
/************************ Check if I can edit 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_TCH ] = true,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = true,
@ -361,13 +361,13 @@ static bool Gam_CheckIfICanEditGames (void)
/**************** Check if I can list questions in games *********************/ /**************** 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_NET ] = Usr_I_CAN,
[Rol_TCH ] = true, [Rol_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanListGameQuestions[Gbl.Usrs.Me.Role.Logged]; return ICanListGameQuestions[Gbl.Usrs.Me.Role.Logged];
@ -390,7 +390,7 @@ static void Gam_PutIconsListingGames (void *Games)
if (Games) if (Games)
{ {
/***** Put icon to create a new game *****/ /***** Put icon to create a new game *****/
if (Gam_CheckIfICanEditGames ()) if (Gam_CheckIfICanEditGames () == Usr_I_CAN)
Gam_PutIconToCreateNewGame ((struct Gam_Games *) Games); Gam_PutIconToCreateNewGame ((struct Gam_Games *) Games);
/***** Put icon to view matches results *****/ /***** Put icon to view matches results *****/
@ -399,9 +399,8 @@ static void Gam_PutIconsListingGames (void *Games)
NULL,NULL); NULL,NULL);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL, Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL,Gam_PutPars,Games);
Gam_PutPars,Games);
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
Fig_PutIconToShowFigure (Fig_GAMES); Fig_PutIconToShowFigure (Fig_GAMES);
@ -687,8 +686,7 @@ static void Gam_PutIconsEditingOneGame (void *Games)
{ {
if (Games) if (Games)
/***** Icon to view game *****/ /***** Icon to view game *****/
Ico_PutContextualIconToView (ActLstOneGam,NULL, Ico_PutContextualIconToView (ActLstOneGam,NULL,Gam_PutPars,Games);
Gam_PutPars,Games);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -729,7 +727,7 @@ static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games,
[Rol_SYS_ADM] = ActSeeUsrMchResGam, [Rol_SYS_ADM] = ActSeeUsrMchResGam,
}; };
if (Gam_CheckIfICanEditGames ()) if (Gam_CheckIfICanEditGames () == Usr_I_CAN)
{ {
/***** Icon to remove game *****/ /***** Icon to remove game *****/
Ico_PutContextualIconToRemove (ActReqRemGam,NULL, Ico_PutContextualIconToRemove (ActReqRemGam,NULL,
@ -741,14 +739,12 @@ static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games,
Games->Game.HiddenOrVisible); Games->Game.HiddenOrVisible);
/***** Icon to edit game *****/ /***** Icon to edit game *****/
Ico_PutContextualIconToEdit (ActEdiOneGam,NULL, Ico_PutContextualIconToEdit (ActEdiOneGam,NULL,Gam_PutPars,Games);
Gam_PutPars,Games);
} }
if (Gam_CheckIfICanListGameQuestions ()) if (Gam_CheckIfICanListGameQuestions () == Usr_I_CAN)
/***** Icon to view game listing its questions *****/ /***** Icon to view game listing its questions *****/
Ico_PutContextualIconToView (ActLstOneGam,NULL, Ico_PutContextualIconToView (ActLstOneGam,NULL,Gam_PutPars,Games);
Gam_PutPars,Games);
/***** Put icon to view matches results *****/ /***** Put icon to view matches results *****/
if (ActionShowResults[Gbl.Usrs.Me.Role.Logged]) if (ActionShowResults[Gbl.Usrs.Me.Role.Logged])
@ -756,9 +752,8 @@ static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games,
Gam_PutPars,Games); Gam_PutPars,Games);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL, Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL,Gam_PutPars,Games);
Gam_PutPars,Games);
} }
@ -1054,7 +1049,7 @@ void Gam_AskRemGame (void)
/***** Get data of the game from database *****/ /***** Get data of the game from database *****/
Gam_GetGameDataByCod (&Games.Game); Gam_GetGameDataByCod (&Games.Game);
if (!Gam_CheckIfICanEditGames ()) if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Show question and button to remove game *****/ /***** Show question and button to remove game *****/
@ -1087,7 +1082,7 @@ void Gam_RemoveGame (void)
/***** Get data of the game from database *****/ /***** Get data of the game from database *****/
Gam_GetGameDataByCod (&Games.Game); Gam_GetGameDataByCod (&Games.Game);
if (!Gam_CheckIfICanEditGames ()) if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Remove game from all tables *****/ /***** Remove game from all tables *****/
@ -1163,7 +1158,7 @@ static void Gam_HideUnhideGame (HidVis_HiddenOrVisible_t HiddenOrVisible)
/***** Get data of the game from database *****/ /***** Get data of the game from database *****/
Gam_GetGameDataByCod (&Games.Game); Gam_GetGameDataByCod (&Games.Game);
if (!Gam_CheckIfICanEditGames ()) if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Unhide game *****/ /***** Unhide game *****/
@ -1189,7 +1184,7 @@ void Gam_ListGame (void)
Gam_ResetGame (&Games.Game); Gam_ResetGame (&Games.Game);
/***** Check if I can list game questions *****/ /***** Check if I can list game questions *****/
if (!Gam_CheckIfICanListGameQuestions ()) if (Gam_CheckIfICanListGameQuestions () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
@ -1223,7 +1218,7 @@ void Gam_ReqCreatOrEditGame (void)
Gam_ResetGame (&Games.Game); Gam_ResetGame (&Games.Game);
/***** Check if I can edit games *****/ /***** Check if I can edit games *****/
if (!Gam_CheckIfICanEditGames ()) if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
@ -1439,7 +1434,7 @@ void Gam_ReceiveGame (void)
Gam_ResetGame (&Games.Game); Gam_ResetGame (&Games.Game);
/***** Check if I can edit games *****/ /***** Check if I can edit games *****/
if (!Gam_CheckIfICanEditGames ()) if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
@ -1568,7 +1563,7 @@ void Gam_ReqSelectQstsToAddToGame (void)
Gam_GetGameDataByCod (&Games.Game); Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/ /***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game)) if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Show form to create a new question in this game *****/ /***** Show form to create a new question in this game *****/
@ -1600,7 +1595,7 @@ void Gam_ListQstsToAddToGame (void)
Gam_GetGameDataByCod (&Games.Game); Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/ /***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game)) if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** List several test questions for selection *****/ /***** List several test questions for selection *****/
@ -1640,17 +1635,17 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games)
extern const char *Txt_Questions; extern const char *Txt_Questions;
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
unsigned NumQsts; unsigned NumQsts;
bool ICanEditQuestions = Gam_CheckIfEditable (&Games->Game); Usr_ICan_t ICanEditQuestions = Gam_CheckIfICanEditGame (&Games->Game);
/***** Get data of questions from database *****/ /***** Get data of questions from database *****/
NumQsts = Gam_DB_GetGameQuestionsBasic (&mysql_res,Games->Game.GamCod); NumQsts = Gam_DB_GetGameQuestionsBasic (&mysql_res,Games->Game.GamCod);
/***** Begin box *****/ /***** Begin box *****/
Box_BoxBegin (Txt_Questions, Box_BoxBegin (Txt_Questions,
ICanEditQuestions ? Gam_PutIconToAddNewQuestions : ICanEditQuestions == Usr_I_CAN ? Gam_PutIconToAddNewQuestions :
NULL, NULL,
ICanEditQuestions ? Games : ICanEditQuestions == Usr_I_CAN ? Games :
NULL, NULL,
Hlp_ASSESSMENT_Games_questions,Box_NOT_CLOSABLE); Hlp_ASSESSMENT_Games_questions,Box_NOT_CLOSABLE);
/***** Show table with questions *****/ /***** Show table with questions *****/
@ -1672,7 +1667,7 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games)
static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games, static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
unsigned NumQsts, unsigned NumQsts,
MYSQL_RES *mysql_res, MYSQL_RES *mysql_res,
bool ICanEditQuestions) Usr_ICan_t ICanEditQuestions)
{ {
extern const char *Txt_Questions; extern const char *Txt_Questions;
extern const char *Txt_No_INDEX; 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 ()); HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ());
/* Put icon to remove the question */ /* Put icon to remove the question */
if (ICanEditQuestions) if (ICanEditQuestions == Usr_I_CAN)
Ico_PutContextualIconToRemove (ActReqRemGamQst,NULL, Ico_PutContextualIconToRemove (ActReqRemGamQst,NULL,
Gam_PutParsOneQst,Games); Gam_PutParsOneQst,Games);
else else
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
/* Put icon to move up the question */ /* Put icon to move up the question */
if (ICanEditQuestions && QstInd > 1) if (ICanEditQuestions == Usr_I_CAN && QstInd > 1)
Lay_PutContextualLinkOnlyIcon (ActUp_GamQst,Anchor, Lay_PutContextualLinkOnlyIcon (ActUp_GamQst,Anchor,
Gam_PutParsOneQst,Games, Gam_PutParsOneQst,Games,
"arrow-up.svg",Ico_BLACK); "arrow-up.svg",Ico_BLACK);
@ -1757,7 +1752,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
Txt_Movement_not_allowed); Txt_Movement_not_allowed);
/* Put icon to move down the question */ /* Put icon to move down the question */
if (ICanEditQuestions && QstInd < MaxQstInd) if (ICanEditQuestions == Usr_I_CAN && QstInd < MaxQstInd)
Lay_PutContextualLinkOnlyIcon (ActDwnGamQst,Anchor, Lay_PutContextualLinkOnlyIcon (ActDwnGamQst,Anchor,
Gam_PutParsOneQst,Games, Gam_PutParsOneQst,Games,
"arrow-down.svg",Ico_BLACK); "arrow-down.svg",Ico_BLACK);
@ -1766,7 +1761,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
Txt_Movement_not_allowed); Txt_Movement_not_allowed);
/* Put icon to edit the question */ /* Put icon to edit the question */
if (ICanEditQuestions) if (ICanEditQuestions == Usr_I_CAN)
Ico_PutContextualIconToEdit (ActEdiOneTstQst,NULL, Ico_PutContextualIconToEdit (ActEdiOneTstQst,NULL,
Qst_PutParQstCod,&Question.QstCod); Qst_PutParQstCod,&Question.QstCod);
@ -1827,7 +1822,7 @@ void Gam_AddQstsToGame (void)
Gam_GetGameDataByCod (&Games.Game); Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/ /***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game)) if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get selected questions *****/ /***** Get selected questions *****/
@ -1935,7 +1930,7 @@ void Gam_ReqRemQstFromGame (void)
Gam_GetGameDataByCod (&Games.Game); Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/ /***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game)) if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get question index *****/ /***** Get question index *****/
@ -1977,7 +1972,7 @@ void Gam_RemoveQstFromGame (void)
Gam_GetGameDataByCod (&Games.Game); Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/ /***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game)) if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get question index *****/ /***** Get question index *****/
@ -2026,7 +2021,7 @@ void Gam_MoveUpQst (void)
Gam_GetGameDataByCod (&Games.Game); Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/ /***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game)) if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get question index *****/ /***** Get question index *****/
@ -2076,7 +2071,7 @@ void Gam_MoveDownQst (void)
Gam_GetGameDataByCod (&Games.Game); Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/ /***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game)) if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get question index *****/ /***** Get question index *****/
@ -2155,13 +2150,14 @@ static void Gam_ExchangeQuestions (long GamCod,
/*****************************************************************************/ /*****************************************************************************/
// Before calling this function, number of matches must be calculated // 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 *****/ /***** 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 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_GROUPS_SECTION_ID "grps"
#define Grp_NEW_GROUP_SECTION_ID "new_grp" #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 *****************/ /************* External global variables from others modules *****************/
/*****************************************************************************/ /*****************************************************************************/
@ -90,6 +76,8 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
static Usr_ICan_t Grp_CheckIfICanChangeGrps (void);
static void Grp_ReqEditGroupsInternal (Ale_AlertType_t AlertTypeGroupTypes,const char *AlertTextGroupTypes, static void Grp_ReqEditGroupsInternal (Ale_AlertType_t AlertTypeGroupTypes,const char *AlertTextGroupTypes,
Ale_AlertType_t AlertTypeGroups,const char *AlertTextGroups); Ale_AlertType_t AlertTypeGroups,const char *AlertTextGroups);
static void Grp_ReqEditGroupsInternal0 (void); 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_PutParGrpTypCod (void *GrpTypCod);
static void Grp_PutParGrpCod (void *GrpCod); 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 ******************/ /******************* Write the names of the selected groups ******************/
/*****************************************************************************/ /*****************************************************************************/
@ -624,7 +628,7 @@ void Grp_ChangeMyGrps (Cns_QuietOrVerbose_t QuietOrVerbose)
bool ChangesMade; bool ChangesMade;
/***** Can I change my groups? *****/ /***** 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 *****/ /***** Get list of groups types and groups in this course *****/
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS); Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
@ -683,7 +687,7 @@ void Grp_ChangeOtherUsrGrps (void)
bool SelectionIsValid; bool SelectionIsValid;
/***** Can I change another user's groups? *****/ /***** 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 *****/ /***** Get list of groups types and groups in current course *****/
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS); 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) static void Grp_PutIconToViewGroups (void)
{ {
Ico_PutContextualIconToView (ActReqSelGrp,NULL, Ico_PutContextualIconToView (ActReqSelGrp,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1773,8 +1776,7 @@ void Grp_ShowLstGrpsToChgMyGrps (void)
static void Grp_PutIconToEditGroups (__attribute__((unused)) void *Args) static void Grp_PutIconToEditGroups (__attribute__((unused)) void *Args)
{ {
Ico_PutContextualIconToEdit (ActReqEdiGrp,NULL, Ico_PutContextualIconToEdit (ActReqEdiGrp,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -707,23 +707,23 @@ void Hie_GetAndWriteInsCtrDegAdminBy (long UsrCod,unsigned ColSpan)
/****************** Check if I can edit hierarchy elements *******************/ /****************** Check if I can edit hierarchy elements *******************/
/*****************************************************************************/ /*****************************************************************************/
bool Hie_CheckIfICanEdit (void) Usr_ICan_t Hie_CheckIfICanEdit (void)
{ {
// Some admins can edit all hierarchy elements. // Some admins can edit all hierarchy elements.
// Any user can edit the elements he/she has created... // Any user can edit the elements he/she has created...
// ...as long as they are in pending status. // ...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 */ /* Users who can edit */
[Rol_GST ] = true, [Rol_GST ] = Usr_I_CAN,
[Rol_USR ] = true, [Rol_USR ] = Usr_I_CAN,
[Rol_STD ] = true, [Rol_STD ] = Usr_I_CAN,
[Rol_NET ] = true, [Rol_NET ] = Usr_I_CAN,
[Rol_TCH ] = true, [Rol_TCH ] = Usr_I_CAN,
[Rol_DEG_ADM] = true, [Rol_DEG_ADM] = Usr_I_CAN,
[Rol_CTR_ADM] = true, [Rol_CTR_ADM] = Usr_I_CAN,
[Rol_INS_ADM] = true, [Rol_INS_ADM] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanEdit[Gbl.Usrs.Me.Role.Logged]; return ICanEdit[Gbl.Usrs.Me.Role.Logged];

View File

@ -49,7 +49,7 @@ void Hie_ResetHierarchy (void);
void Hie_GetAndWriteInsCtrDegAdminBy (long UsrCod,unsigned ColSpan); void Hie_GetAndWriteInsCtrDegAdminBy (long UsrCod,unsigned ColSpan);
bool Hie_CheckIfICanEdit (void); Usr_ICan_t Hie_CheckIfICanEdit (void);
void Hie_WriteStatusCell (Hie_Status_t Status, void Hie_WriteStatusCell (Hie_Status_t Status,
const char *Class,const char *BgColor, const char *Class,const char *BgColor,

View File

@ -44,17 +44,6 @@
#include "swad_parameter.h" #include "swad_parameter.h"
#include "swad_parameter_code.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 ****************/ /************** External global variables from others modules ****************/
/*****************************************************************************/ /*****************************************************************************/
@ -71,6 +60,8 @@ static struct Hld_Holiday *Hld_EditingHld = NULL; // Static variable to keep the
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
static Usr_ICan_t Hld_CheckIfICanEditHlds (void);
static Hld_Order_t Hld_GetParHldOrder (void); static Hld_Order_t Hld_GetParHldOrder (void);
static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args); static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args);
static void Hld_PutIconsEditHolidays (__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_EditingHolidayConstructor (void);
static void Hld_EditingHolidayDestructor (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 *************************/ /************************* Reset departments context *************************/
/*****************************************************************************/ /*****************************************************************************/
@ -234,9 +241,8 @@ static Hld_Order_t Hld_GetParHldOrder (void)
static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args) static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args)
{ {
/***** Edit holidays *****/ /***** Edit holidays *****/
if (Hld_ICanEditHlds[Gbl.Usrs.Me.Role.Logged]) if (Hld_CheckIfICanEditHlds () == Usr_I_CAN)
Ico_PutContextualIconToEdit (ActEdiHld,NULL, Ico_PutContextualIconToEdit (ActEdiHld,NULL,NULL,NULL);
NULL,NULL);
/***** View calendar *****/ /***** View calendar *****/
Cal_PutIconToSeeCalendar (); Cal_PutIconToSeeCalendar ();
@ -245,8 +251,7 @@ static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args)
static void Hld_PutIconsEditHolidays (__attribute__((unused)) void *Args) static void Hld_PutIconsEditHolidays (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view holidays *****/ /***** Put icon to view holidays *****/
Ico_PutContextualIconToView (ActSeeHld,NULL, Ico_PutContextualIconToView (ActSeeHld,NULL,NULL,NULL);
NULL,NULL);
/***** View calendar *****/ /***** View calendar *****/
Cal_PutIconToSeeCalendar (); Cal_PutIconToSeeCalendar ();

View File

@ -89,7 +89,7 @@ static void Ins_GetInstitDataFromRow (MYSQL_RES *mysql_res,
bool GetNumUsrsWhoClaimToBelongToIns); bool GetNumUsrsWhoClaimToBelongToIns);
static void Ins_ListInstitutionsForEdition (void); 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); 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) static void Ins_PutIconsListingInstitutions (__attribute__((unused)) void *Args)
{ {
/***** Put icon to edit institutions *****/ /***** Put icon to edit institutions *****/
if (Hie_CheckIfICanEdit ()) if (Hie_CheckIfICanEdit () == Usr_I_CAN)
Ins_PutIconToEditInstitutions (); Ins_PutIconToEditInstitutions ();
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
@ -344,8 +344,7 @@ static void Ins_PutIconsListingInstitutions (__attribute__((unused)) void *Args)
static void Ins_PutIconToEditInstitutions (void) static void Ins_PutIconToEditInstitutions (void)
{ {
Ico_PutContextualIconToEdit (ActEdiIns,NULL, Ico_PutContextualIconToEdit (ActEdiIns,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -556,8 +555,7 @@ static void Ins_EditInstitutionsInternal (void)
static void Ins_PutIconsEditingInstitutions (__attribute__((unused)) void *Args) static void Ins_PutIconsEditingInstitutions (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view institutions *****/ /***** Put icon to view institutions *****/
Ico_PutContextualIconToView (ActSeeIns,NULL, Ico_PutContextualIconToView (ActSeeIns,NULL,NULL,NULL);
NULL,NULL);
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
Fig_PutIconToShowFigure (Fig_INSTITS); Fig_PutIconToShowFigure (Fig_INSTITS);
@ -884,7 +882,7 @@ static void Ins_ListInstitutionsForEdition (void)
struct Hie_Node *Ins; struct Hie_Node *Ins;
char WWW[Cns_MAX_BYTES_WWW + 1]; char WWW[Cns_MAX_BYTES_WWW + 1];
struct Usr_Data UsrDat; struct Usr_Data UsrDat;
bool ICanEdit; Usr_ICan_t ICanEdit;
unsigned NumCtrs; unsigned NumCtrs;
unsigned NumUsrsIns; unsigned NumUsrsIns;
unsigned NumUsrsInCrssOfIns; unsigned NumUsrsInCrssOfIns;
@ -920,7 +918,7 @@ static void Ins_ListInstitutionsForEdition (void)
/* Put icon to remove institution */ /* Put icon to remove institution */
HTM_TD_Begin ("class=\"BT\""); HTM_TD_Begin ("class=\"BT\"");
if (!ICanEdit || if (ICanEdit == Usr_I_CAN_NOT ||
NumCtrs || // Institution has centers NumCtrs || // Institution has centers
NumUsrsIns || // Institution has users NumUsrsIns || // Institution has users
NumUsrsInCrssOfIns) // Institution has users NumUsrsInCrssOfIns) // Institution has users
@ -947,11 +945,12 @@ static void Ins_ListInstitutionsForEdition (void)
Nam_ExistingShortAndFullNames (ActionRename, Nam_ExistingShortAndFullNames (ActionRename,
ParCod_OthHie,Ins->HieCod, ParCod_OthHie,Ins->HieCod,
Names, Names,
ICanEdit); // Put form? ICanEdit == Usr_I_CAN ? Frm_PUT_FORM :
Frm_DONT_PUT_FORM);
/* Institution WWW */ /* Institution WWW */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit) if (ICanEdit == Usr_I_CAN)
{ {
Frm_BeginForm (ActChgInsWWW); Frm_BeginForm (ActChgInsWWW);
ParCod_PutPar (ParCod_OthHie,Ins->HieCod); ParCod_PutPar (ParCod_OthHie,Ins->HieCod);
@ -1014,11 +1013,12 @@ static void Ins_ListInstitutionsForEdition (void)
/************ Check if I can edit, remove, etc. an institution ***************/ /************ 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 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 ((Ins->Status & Hie_STATUS_BIT_PENDING) != 0 && // Institution is not yet activated
Gbl.Usrs.Me.UsrDat.UsrCod == Ins->RequesterUsrCod); // I am the requester 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 *****/ /***** Get data of the institution from database *****/
Hie_GetDataByCod[Hie_INS] (Ins_EditingIns); Hie_GetDataByCod[Hie_INS] (Ins_EditingIns);
/***** Check if this institution has users *****/ /***** Check if I can edit this institution *****/
if (!Ins_CheckIfICanEdit (Ins_EditingIns)) if (Ins_CheckIfICanEdit (Ins_EditingIns) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
else if (Hie_GetNumNodesInHieLvl (Hie_CTR, // Number of centers...
Hie_INS, // ...in institution /***** Check if this institution has centers or users *****/
Ins_EditingIns->HieCod)) if (Hie_GetNumNodesInHieLvl (Hie_CTR, // Number of centers...
Hie_INS, // ...in institution
Ins_EditingIns->HieCod))
// Institution has centers ==> don't remove // Institution has centers ==> don't remove
Ale_CreateAlert (Ale_WARNING,NULL, Ale_CreateAlert (Ale_WARNING,NULL,
Txt_To_remove_an_institution_you_must_first_remove_all_centers_and_users_in_the_institution); 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.h"
#include "swad_parameter_code.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 ****************/ /************** 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 ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
static Usr_ICan_t Lnk_CheckIfICanEditLinks (void);
static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args); static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args);
static void Lnk_PutIconToEditLinks (void); static void Lnk_PutIconToEditLinks (void);
static void Lnk_WriteListOfLinks (const struct Lnk_Links *Links,const char *Class); 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_EditingLinkConstructor (void);
static void Lnk_EditingLinkDestructor (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 *******************************/ /****************************** List all links *******************************/
/*****************************************************************************/ /*****************************************************************************/
@ -142,7 +149,7 @@ void Lnk_SeeLinks (void)
static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args) static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args)
{ {
/***** Put icon to edit links *****/ /***** Put icon to edit links *****/
if (Lnk_ICanEditLinks[Gbl.Usrs.Me.Role.Logged]) if (Lnk_CheckIfICanEditLinks () == Usr_I_CAN)
Lnk_PutIconToEditLinks (); Lnk_PutIconToEditLinks ();
/***** Put icon to view banners *****/ /***** Put icon to view banners *****/
@ -155,8 +162,7 @@ static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args)
static void Lnk_PutIconToEditLinks (void) static void Lnk_PutIconToEditLinks (void)
{ {
Ico_PutContextualIconToEdit (ActEdiLnk,NULL, Ico_PutContextualIconToEdit (ActEdiLnk,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -269,8 +275,7 @@ static void Lnk_EditLinksInternal (void)
static void Lnk_PutIconsEditingLinks (__attribute__((unused)) void *Args) static void Lnk_PutIconsEditingLinks (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view links *****/ /***** Put icon to view links *****/
Ico_PutContextualIconToView (ActSeeLnk,NULL, Ico_PutContextualIconToView (ActSeeLnk,NULL,NULL,NULL);
NULL,NULL);
/***** Put icon to view banners *****/ /***** Put icon to view banners *****/
Ban_PutIconToViewBanners (); Ban_PutIconToViewBanners ();
@ -436,7 +441,7 @@ static void Lnk_ListLinksForEdition (const struct Lnk_Links *Links)
Nam_ExistingShortAndFullNames (ActionRename, Nam_ExistingShortAndFullNames (ActionRename,
ParCod_Lnk,Lnk->LnkCod, ParCod_Lnk,Lnk->LnkCod,
Names, Names,
true); // Put form Frm_PUT_FORM);
/* Link WWW */ /* Link WWW */
HTM_TD_Begin ("class=\"LM\""); 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) static void Mai_PutIconToEditMailDomains (__attribute__((unused)) void *Args)
{ {
Ico_PutContextualIconToEdit (ActEdiMai,NULL, Ico_PutContextualIconToEdit (ActEdiMai,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -793,7 +792,7 @@ static void Mai_PutFormToSelectUsrsToListEmails (__attribute__((unused)) void *A
Txt_Email, Txt_Email,
Hlp_COMMUNICATION_Email, Hlp_COMMUNICATION_Email,
Txt_View_email_addresses, 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 *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Remove user's email *****/ /***** Remove user's email *****/
Mai_RemoveEmail (&Gbl.Usrs.Other.UsrDat); 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; extern const char *Txt_Email_X_removed;
char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]; char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
if (Usr_ICanEditOtherUsr (UsrDat)) if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
{ {
/***** Get new email from form *****/ /***** Get new email from form *****/
Par_GetParText ("Email",Email,Cns_MAX_BYTES_EMAIL_ADDRESS); 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 *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Change user's ID *****/ /***** Change user's ID *****/
Mai_ChangeUsrEmail (&Gbl.Usrs.Other.UsrDat, 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; extern const char *Txt_The_email_address_entered_X_is_not_valid;
char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]; char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
if (Usr_ICanEditOtherUsr (UsrDat)) if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
{ {
/***** Get new email from form *****/ /***** Get new email from form *****/
Par_GetParText ("NewEmail",NewEmail,Cns_MAX_BYTES_EMAIL_ADDRESS); 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, Frm_PutForm_t PutFormMatch,
unsigned NumMatches, unsigned NumMatches,
MYSQL_RES *mysql_res); MYSQL_RES *mysql_res);
static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches); static void Mch_ListOneOrMoreMatchesHeading (Usr_ICan_t ICanEditMatches);
static bool Mch_CheckIfICanEditMatches (void); static Usr_ICan_t Mch_CheckIfICanEditMatches (void);
static bool Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match); static Usr_ICan_t Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match);
static bool Mch_CheckIfVisibilityOfResultsCanBeChanged (const struct Mch_Match *Match); static Usr_ICan_t Mch_CheckIfICanChangeVisibilityOfResults (const struct Mch_Match *Match);
static void Mch_ListOneOrMoreMatchesIcons (struct Gam_Games *Games, static void Mch_ListOneOrMoreMatchesIcons (struct Gam_Games *Games,
const struct Mch_Match *Match, const struct Mch_Match *Match,
const char *Anchor); const char *Anchor);
@ -284,7 +284,7 @@ void Mch_ListMatches (struct Gam_Games *Games,
Hlp_ASSESSMENT_Games_matches,Box_NOT_CLOSABLE); Hlp_ASSESSMENT_Games_matches,Box_NOT_CLOSABLE);
/***** Select whether show only my groups or all groups *****/ /***** 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 (); Set_BeginSettingsHead ();
Grp_ShowFormToSelWhichGrps (ActSeeOneGam,Gam_PutPars,Games); Grp_ShowFormToSelWhichGrps (ActSeeOneGam,Gam_PutPars,Games);
@ -328,15 +328,10 @@ void Mch_GetMatchDataByCod (struct Mch_Match *Match)
static void Mch_PutIconsInListOfMatches (void *Games) static void Mch_PutIconsInListOfMatches (void *Games)
{ {
bool ICanEditMatches;
if (Games) if (Games)
{ if (Mch_CheckIfICanEditMatches () == Usr_I_CAN)
/***** Put icon to create a new match in current game *****/ /***** Put icon to create a new match in current game *****/
ICanEditMatches = Mch_CheckIfICanEditMatches ();
if (ICanEditMatches)
Mch_PutIconToCreateNewMatch ((struct Gam_Games *) Games); Mch_PutIconToCreateNewMatch ((struct Gam_Games *) Games);
}
} }
/*****************************************************************************/ /*****************************************************************************/
@ -362,7 +357,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
unsigned UniqueId; unsigned UniqueId;
struct Mch_Match Match; struct Mch_Match Match;
char *Anchor; char *Anchor;
bool ICanEditMatches = Mch_CheckIfICanEditMatches (); Usr_ICan_t ICanEditMatches = Mch_CheckIfICanEditMatches ();
long MchCodToBeEdited = PutFormMatch == Frm_PUT_FORM && long MchCodToBeEdited = PutFormMatch == Frm_PUT_FORM &&
Games->MchCod > 0 ? Games->MchCod : Games->MchCod > 0 ? Games->MchCod :
-1L; -1L;
@ -385,7 +380,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
/***** Get match data from row *****/ /***** Get match data from row *****/
Mch_GetMatchDataFromRow (mysql_res,&Match); Mch_GetMatchDataFromRow (mysql_res,&Match);
if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match)) if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match) == Usr_I_CAN)
{ {
/***** Build anchor string *****/ /***** Build anchor string *****/
if (asprintf (&Anchor,"mch_%ld",Match.MchCod) < 0) if (asprintf (&Anchor,"mch_%ld",Match.MchCod) < 0)
@ -395,7 +390,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/* Icons */ /* Icons */
if (ICanEditMatches) if (ICanEditMatches == Usr_I_CAN)
Mch_ListOneOrMoreMatchesIcons (Games,&Match,Anchor); Mch_ListOneOrMoreMatchesIcons (Games,&Match,Anchor);
/* Start/end date/time */ /* Start/end date/time */
@ -421,10 +416,11 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
HTM_TR_End (); HTM_TR_End ();
/***** Third row for this match used for edition ****/ /***** Third row for this match used for edition ****/
if (ICanEditMatches && PutFormMatch == Frm_PUT_FORM && // Editing... if (ICanEditMatches == Usr_I_CAN &&
Match.MchCod == MchCodToBeEdited) // ...this match PutFormMatch == Frm_PUT_FORM && // Editing...
Match.MchCod == MchCodToBeEdited) // ...this match
/***** Check if I can edit 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_TR_Begin (NULL);
HTM_TD_Begin ("colspan=\"7\" class=\"LT %s\"", 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 *****/ /***** 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) MchCodToBeEdited <= 0)
{ {
/* Reset match */ /* Reset match */
@ -464,7 +461,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
/***************** Put a column for match start and end times ****************/ /***************** 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_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Match; extern const char *Txt_Match;
@ -476,7 +473,7 @@ static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches)
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/***** Column for icons *****/ /***** Column for icons *****/
if (ICanEditMatches) if (ICanEditMatches == Usr_I_CAN)
HTM_TH_Empty (1); HTM_TH_Empty (1);
/***** The rest of columns *****/ /***** The rest of columns *****/
@ -497,13 +494,13 @@ static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches)
/*********************** Check if I can edit matches *************************/ /*********************** 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_NET ] = Usr_I_CAN,
[Rol_TCH ] = true, [Rol_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanEditMatches[Gbl.Usrs.Me.Role.Logged]; 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 ***************/ /***************** 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) if (Match->MchCod <= 0)
return true; return Usr_I_CAN;
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_NET: 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_TCH:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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 *************/ /*********** 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 if (Match->Status.ShowUsrResults || // Results are currently visible
Match->Status.Showing == Mch_END) // Match has finished Match->Status.Showing == Mch_END) // Match has finished
if (Mch_CheckIfICanEditThisMatch (Match)) return Mch_CheckIfICanEditThisMatch (Match);
return true;
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 ()); 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; Games->MchCod = Match->MchCod;
/***** Put icon to remove the match *****/ /***** Put icon to remove the match *****/
Ico_PutContextualIconToRemove (ActReqRemMch,NULL, Ico_PutContextualIconToRemove (ActReqRemMch,NULL,Mch_PutParsEdit,Games);
Mch_PutParsEdit,Games);
/***** Put icon to edit the match *****/ /***** Put icon to edit the match *****/
Ico_PutContextualIconToEdit (ActReqChgMch,Anchor, Ico_PutContextualIconToEdit (ActReqChgMch,Anchor,Mch_PutParsEdit,Games);
Mch_PutParsEdit,Games);
} }
else else
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
@ -834,13 +829,13 @@ static void Mch_ListOneOrMoreMatchesResultTch (struct Gam_Games *Games,
Games->MchCod = Match->MchCod; Games->MchCod = Match->MchCod;
/***** Show match results *****/ /***** Show match results *****/
if (Mch_CheckIfICanEditThisMatch (Match)) if (Mch_CheckIfICanEditThisMatch (Match) == Usr_I_CAN)
Lay_PutContextualLinkOnlyIcon (ActSeeUsrMchResMch,MchRes_RESULTS_BOX_ID, Lay_PutContextualLinkOnlyIcon (ActSeeUsrMchResMch,MchRes_RESULTS_BOX_ID,
Mch_PutParsEdit,Games, Mch_PutParsEdit,Games,
"trophy.svg",Ico_BLACK); "trophy.svg",Ico_BLACK);
/***** Check if visibility of session results can be changed *****/ /***** Check if visibility of session results can be changed *****/
if (Mch_CheckIfVisibilityOfResultsCanBeChanged (Match)) if (Mch_CheckIfICanChangeVisibilityOfResults (Match) == Usr_I_CAN)
{ {
/* I can edit visibility */ /* I can edit visibility */
if (Match->Status.ShowUsrResults) if (Match->Status.ShowUsrResults)
@ -880,7 +875,7 @@ void Mch_ToggleVisResultsMchUsr (void)
Mch_GetAndCheckPars (&Games,&Match); Mch_GetAndCheckPars (&Games,&Match);
/***** Check if visibility of match results can be changed *****/ /***** Check if visibility of match results can be changed *****/
if (!Mch_CheckIfVisibilityOfResultsCanBeChanged (&Match)) if (Mch_CheckIfICanChangeVisibilityOfResults (&Match) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Toggle visibility of match results *****/ /***** Toggle visibility of match results *****/
@ -1028,7 +1023,7 @@ void Mch_RemoveMatch (void)
Mch_GetAndCheckPars (&Games,&Match); Mch_GetAndCheckPars (&Games,&Match);
/***** Check if I can remove this match *****/ /***** Check if I can remove this match *****/
if (!Mch_CheckIfICanEditThisMatch (&Match)) if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Remove the match from all database tables *****/ /***** Remove the match from all database tables *****/
@ -1124,7 +1119,7 @@ void Mch_ReqCreatOrEditMatch (void)
Mch_GetAndCheckPars (&Games,&Match); Mch_GetAndCheckPars (&Games,&Match);
/***** Check if I can edit this match *****/ /***** Check if I can edit this match *****/
if (!Mch_CheckIfICanEditThisMatch (&Match)) if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Show game *****/ /***** Show game *****/
@ -1332,7 +1327,7 @@ void Mch_ChangeMatch (void)
Mch_GetAndCheckPars (&Games,&Match); Mch_GetAndCheckPars (&Games,&Match);
/***** Check if I can update this match *****/ /***** Check if I can update this match *****/
if (!Mch_CheckIfICanEditThisMatch (&Match)) if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get match title and groups *****/ /***** Get match title and groups *****/
@ -1390,7 +1385,7 @@ void Mch_ResumeMatch (void)
Mch_GetMatchDataByCod (&Match); Mch_GetMatchDataByCod (&Match);
/***** Check if I have permission to resume match *****/ /***** Check if I have permission to resume match *****/
if (!Mch_CheckIfICanEditThisMatch (&Match)) if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Update match status in database *****/ /***** 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; struct Mch_UsrAnswer UsrAnswer;
/***** Can I play this match? *****/ /***** Can I play this match? *****/
if (!Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match)) if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get student's answer to this question /***** 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 **************/ /************ 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
@ -2018,12 +2013,13 @@ bool Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match)
return Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (Match->MchCod); return Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (Match->MchCod);
case Rol_NET: case Rol_NET:
/***** Only if I am the creator *****/ /***** 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_TCH:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: default:
return false; return Usr_I_CAN_NOT;
} }
} }

View File

@ -126,7 +126,7 @@ void Mch_ToggleVisResultsMchQst (void);
void Mch_BackMatch (void); void Mch_BackMatch (void);
void Mch_ForwardMatch (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); 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 **************/ /************ 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 return
DB_QueryEXISTS ("can not check if I can play a match", 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" " WHERE grp_users.UsrCod=%ld"
" AND grp_users.GrpCod=mch_groups.GrpCod)))", " AND grp_users.GrpCod=mch_groups.GrpCod)))",
MchCod, 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_GetGrpCodsAssociatedToMatch (MYSQL_RES **mysql_res,long MchCod);
unsigned Mch_DB_GetGrpNamesAssociatedToMatch (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_RemoveGroup (long GrpCod);
void Mch_DB_RemoveGroupsOfType (long GrpTypCod); void Mch_DB_RemoveGroupsOfType (long GrpTypCod);

View File

@ -63,8 +63,8 @@ extern struct Globals Gbl;
struct MchRes_ICanView struct MchRes_ICanView
{ {
bool Result; Usr_ICan_t Result;
bool Score; Usr_ICan_t Score;
}; };
/*****************************************************************************/ /*****************************************************************************/
@ -304,7 +304,7 @@ static void MchRes_ListAllMchResultsInSelectedGames (struct Gam_Games *Games)
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_GET_ROLE_IN_CRS)) 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 *****/ /***** Show matches results *****/
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
@ -335,7 +335,7 @@ static void MchRes_PutFormToSelUsrsToViewMchResults (__attribute__((unused)) voi
Txt_Results, Txt_Results,
Hlp_ASSESSMENT_Games_results, Hlp_ASSESSMENT_Games_results,
Txt_View_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, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_GET_ROLE_IN_CRS)) 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 *****/ /***** Show matches results *****/
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); 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, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_GET_ROLE_IN_CRS)) 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 *****/ /***** Show matches results *****/
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); 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 (); HTM_TD_End ();
/* Accumulate questions and score */ /* Accumulate questions and score */
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
NumTotalQsts.All += Print.NumQsts.All; NumTotalQsts.All += Print.NumQsts.All;
NumTotalQsts.NotBlank += Print.NumQsts.NotBlank; 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\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
HTM_Unsigned (Print.NumQsts.All); HTM_Unsigned (Print.NumQsts.All);
else else
Ico_PutIconNotVisible (); Ico_PutIconNotVisible ();
@ -799,7 +799,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.NotBlank) if (Print.NumQsts.NotBlank)
HTM_Unsigned (Print.NumQsts.NotBlank); HTM_Unsigned (Print.NumQsts.NotBlank);
@ -815,7 +815,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank; NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank;
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
if (NumQstsBlank) if (NumQstsBlank)
HTM_Unsigned (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\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
HTM_Double2Decimals (Print.Score); HTM_Double2Decimals (Print.Score);
HTM_Txt ("/"); HTM_Txt ("/");
@ -844,7 +844,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
HTM_TD_Begin ("class=\"RT DAT_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
HTM_Double2Decimals (Print.NumQsts.All ? Print.Score / HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
(double) Print.NumQsts.All : (double) Print.NumQsts.All :
0.0); 0.0);
@ -856,7 +856,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
Grade = TstPrn_ComputeGrade (Print.NumQsts.All,Print.Score,Games->Game.MaxGrade); Grade = TstPrn_ComputeGrade (Print.NumQsts.All,Print.Score,Games->Game.MaxGrade);
TstPrn_ShowGrade (Grade,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 */ /* Link to show this result */
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Result) if (ICanView.Result == Usr_I_CAN)
{ {
Games->Game.GamCod = Match.GamCod; Games->Game.GamCod = Match.GamCod;
Games->MchCod = Match.MchCod; Games->MchCod = Match.MchCod;
@ -1084,7 +1084,7 @@ void MchRes_ShowOneMchResult (void)
/***** Check if I can view this match result and score *****/ /***** Check if I can view this match result and score *****/
MchRes_CheckIfICanViewMatchResult (&Games.Game,&Match,UsrDat->UsrCod,&ICanView); MchRes_CheckIfICanViewMatchResult (&Games.Game,&Match,UsrDat->UsrCod,&ICanView);
if (!ICanView.Result) if (ICanView.Result == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get questions and user's answers of the match result from database *****/ /***** 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_DONT_GET_PREFS,
Usr_GET_ROLE_IN_CRS)) Usr_GET_ROLE_IN_CRS))
Err_WrongUserExit (); Err_WrongUserExit ();
if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat)) if (Usr_CheckIfICanViewTstExaMchResult (UsrDat) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/* Get if user has accepted enrolment */ /* Get if user has accepted enrolment */
@ -1201,7 +1201,7 @@ void MchRes_ShowOneMchResult (void)
HTM_TD_Begin ("class=\"LB DAT_%s\"", HTM_TD_Begin ("class=\"LB DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
HTM_STRONG_Begin (); HTM_STRONG_Begin ();
HTM_Double2Decimals (Print.Score); HTM_Double2Decimals (Print.Score);
@ -1225,7 +1225,7 @@ void MchRes_ShowOneMchResult (void)
HTM_TD_Begin ("class=\"LB DAT_%s\"", HTM_TD_Begin ("class=\"LB DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
HTM_STRONG_Begin (); HTM_STRONG_Begin ();
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Games.Game.MaxGrade); 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) // Depends on visibility of game and result (eye icons)
ICanView->Result = (Game->HiddenOrVisible == HidVis_VISIBLE && // The game is visible ICanView->Result = (Game->HiddenOrVisible == HidVis_VISIBLE && // The game is visible
Match->Status.ShowUsrResults && // The results of the match are visible to users 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... // 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 // ...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 // 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 else
ICanView->Score = false; ICanView->Score = Usr_I_CAN_NOT;
break; break;
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
@ -1299,11 +1301,11 @@ static void MchRes_CheckIfICanViewMatchResult (const struct Gam_Game *Game,
case Rol_INS_ADM: case Rol_INS_ADM:
case Rol_SYS_ADM: case Rol_SYS_ADM:
ICanView->Result = ICanView->Result =
ICanView->Score = true; ICanView->Score = Usr_I_CAN;
break; break;
default: default:
ICanView->Result = ICanView->Result =
ICanView->Score = false; ICanView->Score = Usr_I_CAN_NOT;
break; break;
} }
} }

View File

@ -424,7 +424,7 @@ void Nck_RemoveOtherUsrNick (void)
/***** Get user whose nick must be removed *****/ /***** Get user whose nick must be removed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Get nickname from form *****/ /***** Get nickname from form *****/
Par_GetParText ("Nick",NickWithoutArr, Par_GetParText ("Nick",NickWithoutArr,
@ -470,7 +470,7 @@ void Nck_ChangeOtherUsrNick (void)
/***** Get user whose nick must be changed *****/ /***** Get user whose nick must be changed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Update user's nickname *****/ /***** Update user's nickname *****/
Nck_ChangeUsrNick (&Gbl.Usrs.Other.UsrDat); 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 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_PutIconsListNotices (__attribute__((unused)) void *Args);
static void Not_PutIconToAddNewNotice (void); static void Not_PutIconToAddNewNotice (void);
static void Not_GetDataAndShowNotice (long NotCod); static void Not_GetDataAndShowNotice (long NotCod);
@ -401,10 +401,11 @@ static void Not_PutLinkToRSSFile (void)
/*********************** Check if I can edit notices *************************/ /*********************** 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 || return (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; 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) static void Not_PutIconsListNotices (__attribute__((unused)) void *Args)
{ {
/***** Put icon to add a new notice *****/ /***** Put icon to add a new notice *****/
if (Not_CheckIfICanEditNotices ()) if (Not_CheckIfICanEditNotices () == Usr_I_CAN)
Not_PutIconToAddNewNotice (); Not_PutIconToAddNewNotice ();
/***** Put icon to show a figure *****/ /***** 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 the date in the top part of the yellow note *****/
/* Write symbol to indicate if notice is obsolete or active */ /* Write symbol to indicate if notice is obsolete or active */
if (TypeNoticesListing == Not_LIST_FULL_NOTICES) if (TypeNoticesListing == Not_LIST_FULL_NOTICES)
if (Not_CheckIfICanEditNotices ()) if (Not_CheckIfICanEditNotices () == Usr_I_CAN)
{ {
/***** Icon to remove announcement *****/ /***** Icon to remove announcement *****/
Ico_PutContextualIconToRemove (ActReqRemNot,NULL, 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 *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
/***** Check and update password *****/ /***** Check and update password *****/
Pwd_CheckAndUpdateNewPwd (&Gbl.Usrs.Other.UsrDat); Pwd_CheckAndUpdateNewPwd (&Gbl.Usrs.Other.UsrDat);
else 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 **************/ /************** 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 *****/ /***** I can change my photo *****/
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return Usr_I_CAN;
/***** Check if I have permission to change user's photo *****/ /***** Check if I have permission to change user's photo *****/
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
@ -153,18 +153,19 @@ bool Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat)
case Rol_TCH: case Rol_TCH:
/* A teacher can change the photo of confirmed students */ /* A teacher can change the photo of confirmed students */
if (UsrDat->Roles.InCurrentCrs != Rol_STD) // Not a student if (UsrDat->Roles.InCurrentCrs != Rol_STD) // Not a student
return false; return Usr_I_CAN_NOT;
/* It's a student in this course, /* It's a student in this course,
check if he/she has accepted registration */ 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_DEG_ADM:
case Rol_CTR_ADM: case Rol_CTR_ADM:
case Rol_INS_ADM: case Rol_INS_ADM:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return Usr_ICanEditOtherUsr (UsrDat); return Usr_CheckIfICanEditOtherUsr (UsrDat);
default: default:
return false; return Usr_I_CAN_NOT;
} }
} }
@ -198,7 +199,7 @@ void Pho_PutIconToChangeUsrPhoto (struct Usr_Data *UsrDat)
break; break;
case Usr_OTHER: case Usr_OTHER:
default: default:
if (Pho_ICanChangeOtherUsrPhoto (UsrDat)) if (Pho_ICanChangeOtherUsrPhoto (UsrDat) == Usr_I_CAN)
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL, Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
"camera.svg",Ico_BLACK); "camera.svg",Ico_BLACK);
@ -354,7 +355,7 @@ void Pho_SendPhotoUsr (void)
} }
/***** Check if I have permission to change user's photo *****/ /***** 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 (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
return; return;
@ -521,7 +522,7 @@ void Pho_ReqRemUsrPhoto (void)
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS)) 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 *****/ /***** Show current photo and help message *****/
if (Pho_BuildLinkToPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL)) 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, bool Pho_ShowingUsrPhotoIsAllowed (struct Usr_Data *UsrDat,
char PhotoURL[Cns_MAX_BYTES_WWW + 1]) 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 *****/ /***** Photo is shown if I can see it, and it exists *****/
return ICanSeePhoto ? Pho_BuildLinkToPhoto (UsrDat,PhotoURL) : return (Pri_CheckIfICanView (UsrDat->PhotoVisibility,UsrDat) == Usr_I_CAN) ? Pho_BuildLinkToPhoto (UsrDat,PhotoURL) :
false; false;
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -95,7 +95,7 @@ struct Pho_DegPhotos
/***************************** Public prototypes *****************************/ /***************************** 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_PutIconToChangeUsrPhoto (struct Usr_Data *UsrDat);
void Pho_ReqMyPhoto (void); void Pho_ReqMyPhoto (void);
void Pho_SendPhotoUsr (void); void Pho_SendPhotoUsr (void);

View File

@ -45,17 +45,6 @@
#include "swad_place.h" #include "swad_place.h"
#include "swad_place_database.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 ****************/ /************** 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 ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
static bool Plc_CheckIfICanEditPlaces (void);
static Plc_Order_t Plc_GetParPlcOrder (void); static Plc_Order_t Plc_GetParPlcOrder (void);
static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args); static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args);
static void Plc_PutIconToEditPlaces (void); static void Plc_PutIconToEditPlaces (void);
@ -91,6 +82,22 @@ static void Plc_PutHeadPlaces (void);
static void Plc_EditingPlaceConstructor (void); static void Plc_EditingPlaceConstructor (void);
static void Plc_EditingPlaceDestructor (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 ***************************/ /**************************** Reset places context ***************************/
/*****************************************************************************/ /*****************************************************************************/
@ -231,7 +238,7 @@ static Plc_Order_t Plc_GetParPlcOrder (void)
static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args) static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args)
{ {
/***** Put icon to edit places *****/ /***** Put icon to edit places *****/
if (Plc_ICanEditPlaces[Gbl.Usrs.Me.Role.Logged]) if (Plc_CheckIfICanEditPlaces ())
Plc_PutIconToEditPlaces (); Plc_PutIconToEditPlaces ();
} }
@ -241,8 +248,7 @@ static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args)
static void Plc_PutIconToEditPlaces (void) static void Plc_PutIconToEditPlaces (void)
{ {
Ico_PutContextualIconToEdit (ActEdiPlc,NULL, Ico_PutContextualIconToEdit (ActEdiPlc,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -298,8 +304,7 @@ static void Plc_EditPlacesInternal (void)
static void Plc_PutIconsEditingPlaces (__attribute__((unused)) void *Args) static void Plc_PutIconsEditingPlaces (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view places *****/ /***** Put icon to view places *****/
Ico_PutContextualIconToView (ActSeePlc,NULL, Ico_PutContextualIconToView (ActSeePlc,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -467,7 +472,7 @@ static void Plc_ListPlacesForEdition (const struct Plc_Places *Places)
Nam_ExistingShortAndFullNames (ActionRename, Nam_ExistingShortAndFullNames (ActionRename,
ParCod_Plc,Plc->PlcCod, ParCod_Plc,Plc->PlcCod,
Names, Names,
true); // Put form Frm_PUT_FORM);
/* Number of centers */ /* Number of centers */
HTM_TD_Unsigned (Plc->NumCtrs); HTM_TD_Unsigned (Plc->NumCtrs);

View File

@ -184,8 +184,7 @@ void Plg_ListPlugins (void)
static void Plg_PutIconToEditPlugins (__attribute__((unused)) void *Args) static void Plg_PutIconToEditPlugins (__attribute__((unused)) void *Args)
{ {
Ico_PutContextualIconToEdit (ActEdiPlg,NULL, Ico_PutContextualIconToEdit (ActEdiPlg,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -194,8 +193,7 @@ static void Plg_PutIconToEditPlugins (__attribute__((unused)) void *Args)
static void Plg_PutIconToViewPlugins (__attribute__((unused)) void *Args) static void Plg_PutIconToViewPlugins (__attribute__((unused)) void *Args)
{ {
Ico_PutContextualIconToView (ActSeePlg,NULL, Ico_PutContextualIconToView (ActSeePlg,NULL,NULL,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 *****/ /***** I always can see my things *****/
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return Usr_I_CAN;
/***** System admins always can see others' profiles *****/ /***** System admins always can see others' profiles *****/
if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)
return true; return Usr_I_CAN;
/***** Check if I can see the other's photo *****/ /***** Check if I can see the other's photo *****/
switch (Visibility) switch (Visibility)
{ {
case Pri_VISIBILITY_UNKNOWN: 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 case Pri_VISIBILITY_USER: // Only visible
// by me and my teachers if I am a student // by me and my teachers if I am a student
// or me and my students if I am a teacher // or me and my students if I am a teacher
// Do both users share the same course but whit different role? // 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 case Pri_VISIBILITY_COURSE: // Visible by users sharing courses with me
// Do both users share the same course? // 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 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 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, Pri_Visibility_t Pri_GetParVisibility (const char *ParName,
unsigned MaskAllowedVisibility); 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 ------------------------------------ //-------------------------------- Figures ------------------------------------
void Pri_GetAndShowNumUsrsPerPrivacy (void); 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); Usr_MeOrOther_t MeOrOther = Usr_ItsMe (UsrDat->UsrCod);
/***** Check if I can see the public profile *****/ /***** 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) if (Gbl.Usrs.Me.Logged)
{ {
@ -314,7 +314,7 @@ bool Prf_ShowUsrProfile (struct Usr_Data *UsrDat)
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_PUBLIC,UsrDat,NULL); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_PUBLIC,UsrDat,NULL);
/***** Extended profile *****/ /***** Extended profile *****/
if (Pri_ShowingIsAllowed (UsrDat->ExPrfVisibility,UsrDat)) if (Pri_CheckIfICanView (UsrDat->ExPrfVisibility,UsrDat) == Usr_I_CAN)
{ {
/***** Show details of user's profile *****/ /***** Show details of user's profile *****/
Prf_ShowDetailsUserProfile (UsrDat); Prf_ShowDetailsUserProfile (UsrDat);
@ -1337,7 +1337,7 @@ static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,
[PhoSha_SHAPE_OVAL ] = "PHOTOO30x40", [PhoSha_SHAPE_OVAL ] = "PHOTOO30x40",
[PhoSha_SHAPE_RECTANGLE] = "PHOTOR30x40", [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\"", HTM_TD_Begin ("class=\"RM %s_%s %s\"",
Class[MeOrOther], Class[MeOrOther],

View File

@ -323,10 +323,11 @@ void Prg_ShowAllItems (Prg_ListingType_t ListingType,
/******************* Check if I can create program items *********************/ /******************* 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 || return (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; 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) static void Prg_PutIconsListItems (__attribute__((unused)) void *Args)
{ {
/***** Put icon to edit program *****/ /***** Put icon to edit program *****/
if (Prg_CheckIfICanEditProgram ()) if (Prg_CheckIfICanEditProgram () == Usr_I_CAN)
Prg_PutIconToEditProgram (); Prg_PutIconToEditProgram ();
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
@ -352,7 +353,7 @@ static void Prg_PutIconsEditItems (__attribute__((unused)) void *Args)
/***** Put icon to view program *****/ /***** Put icon to view program *****/
Prg_PutIconToViewProgram (); Prg_PutIconToViewProgram ();
if (Prg_CheckIfICanEditProgram ()) if (Prg_CheckIfICanEditProgram () == Usr_I_CAN)
{ {
/***** Put icon to create a new program item *****/ /***** Put icon to create a new program item *****/
Prg_PutIconToCreateNewItem (); Prg_PutIconToCreateNewItem ();
@ -371,8 +372,7 @@ static void Prg_PutIconsEditItems (__attribute__((unused)) void *Args)
static void Prg_PutIconToEditProgram (void) static void Prg_PutIconToEditProgram (void)
{ {
Ico_PutContextualIconToEdit (ActEdiPrg,NULL, Ico_PutContextualIconToEdit (ActEdiPrg,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -381,8 +381,7 @@ static void Prg_PutIconToEditProgram (void)
static void Prg_PutIconToViewProgram (void) static void Prg_PutIconToViewProgram (void)
{ {
Ico_PutContextualIconToView (ActSeePrg,NULL, Ico_PutContextualIconToView (ActSeePrg,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -403,8 +402,7 @@ static void Prg_PutIconToCreateNewItem (void)
static void Prg_PutIconToViewResourceClipboard (void) static void Prg_PutIconToViewResourceClipboard (void)
{ {
Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InPrg,NULL, Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InPrg,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -121,7 +121,7 @@ void Prg_EditCourseProgram (void);
void Prg_ShowAllItems (Prg_ListingType_t ListingType, void Prg_ShowAllItems (Prg_ListingType_t ListingType,
long SelectedItmCod,long SelectedRscCod); long SelectedItmCod,long SelectedRscCod);
bool Prg_CheckIfICanEditProgram (void); Usr_ICan_t Prg_CheckIfICanEditProgram (void);
void Prg_PutParItmCod (void *ItmCod); void Prg_PutParItmCod (void *ItmCod);
void Prg_GetPars (struct Prg_Item *Item); 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 *****/ /***** Put icon to create a new item resource *****/
if (ItmCod) if (ItmCod)
if (*(long *) ItmCod > 0) if (*(long *) ItmCod > 0)
if (Prg_CheckIfICanEditProgram ()) if (Prg_CheckIfICanEditProgram () == Usr_I_CAN)
Ico_PutContextualIconToView (ActFrmSeePrgRsc,PrgRsc_RESOURCE_SECTION_ID, Ico_PutContextualIconToView (ActFrmSeePrgRsc,PrgRsc_RESOURCE_SECTION_ID,
Prg_PutParItmCod,ItmCod); Prg_PutParItmCod,ItmCod);
} }
@ -315,7 +315,7 @@ static void PrgRsc_PutIconsEditResources (void *ItmCod)
/***** Put icon to create a new item resource *****/ /***** Put icon to create a new item resource *****/
if (ItmCod) if (ItmCod)
if (*(long *) ItmCod > 0) if (*(long *) ItmCod > 0)
if (Prg_CheckIfICanEditProgram ()) if (Prg_CheckIfICanEditProgram () == Usr_I_CAN)
Ico_PutContextualIconToEdit (ActFrmEdiPrgRsc,PrgRsc_RESOURCE_SECTION_ID, Ico_PutContextualIconToEdit (ActFrmEdiPrgRsc,PrgRsc_RESOURCE_SECTION_ID,
Prg_PutParItmCod,ItmCod); Prg_PutParItmCod,ItmCod);
} }
@ -895,7 +895,7 @@ static void PrgRsc_ShowClipboard (void)
static void PrgRsc_PutIconsClipboard (__attribute__((unused)) void *Args) static void PrgRsc_PutIconsClipboard (__attribute__((unused)) void *Args)
{ {
/***** Put icon to remove resource clipboard in program *****/ /***** 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 if (Rsc_DB_GetNumResourcesInClipboard ()) // Only if there are resources
Ico_PutContextualIconToRemove (ActRemRscCli_InPrg,NULL, Ico_PutContextualIconToRemove (ActRemRscCli_InPrg,NULL,
NULL,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_ShowFormToFilterByReview (const struct Prj_Projects *Projects);
static void Prj_ShowFormToFilterByDpt (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_PutParAssign (unsigned Assign);
static void Prj_PutParHidden (unsigned Hidden); 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_ShowProjectsHead (struct Prj_Projects *Projects);
static void Prj_ShowTableAllProjectsHead (void); 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_PutIconToCreateNewPrj (struct Prj_Projects *Projects);
static void Prj_PutIconToShowAllData (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 struct Prj_Faults *Faults,
const char *Anchor); const char *Anchor);
static void Prj_PutSelectorReviewStatus (struct Prj_Projects *Projects); 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, static void Prj_ShowAssigned (const struct Prj_Projects *Projects,
const char *ClassLabel, const char *ClassLabel,
const char *ClassData, const char *ClassData,
@ -288,7 +288,7 @@ static Prj_Order_t Prj_GetParPrjOrder (void);
static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects, static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
const char *Anchor); 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); 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_ShowRubrics (struct Prj_Projects *Projects);
static void Prj_ShowRubricsOfType (struct Prj_Projects *Projects, static void Prj_ShowRubricsOfType (struct Prj_Projects *Projects,
PrjCfg_RubricType_t RubricType); PrjCfg_RubricType_t RubricType);
static bool Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric); static Usr_ICan_t Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric);
static bool Prj_CheckIfICanFillRubric (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) *******/ /******* Set/get project code (used to pass parameter to file browser) *******/
@ -396,7 +396,7 @@ static void Prj_ReqUsrsToSelect (void *Projects)
Txt_Projects, Txt_Projects,
Hlp_ASSESSMENT_Projects, Hlp_ASSESSMENT_Projects,
Txt_View_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? *******************/ /******************** 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
case Rol_NET: 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_TCH: // Editing teachers in a course can access to all files
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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 **********/ /******** 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
case Rol_NET: 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_TCH: // Editing teachers in a course can access to all files
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: default:
return false; return Usr_I_CAN_NOT;
} }
return false;
} }
/*****************************************************************************/ /*****************************************************************************/
/******** Check if I have permission to view project assessment zone *********/ /******** 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
case Rol_NET: case Rol_NET:
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // Tutor... return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // Tutor...
1 << Prj_ROLE_EVL)) != 0); // ...or evaluator 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_TCH: // Editing teachers in a course can access to all files
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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 ***********************/ /********************** 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_NET: case Rol_NET:
return Projects->Config.NETCanCreate; return Projects->Config.NETCanCreate ? Usr_I_CAN :
Usr_I_CAN_NOT;
case Rol_TCH: case Rol_TCH:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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) void Prj_PutIconsListProjects (void *Projects)
{ {
bool ICanConfigAllProjects; Usr_ICan_t ICanConfigAllProjects;
if (Projects) if (Projects)
{ {
ICanConfigAllProjects = PrjCfg_CheckIfICanConfig (); ICanConfigAllProjects = PrjCfg_CheckIfICanConfig ();
/***** Put icon to create a new project *****/ /***** 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); Prj_PutIconToCreateNewPrj ((struct Prj_Projects *) Projects);
if (((struct Prj_Projects *) Projects)->Num) if (((struct Prj_Projects *) Projects)->Num)
@ -1263,19 +1265,19 @@ void Prj_PutIconsListProjects (void *Projects)
/***** Put icon to show all data in a table *****/ /***** Put icon to show all data in a table *****/
Prj_PutIconToShowAllData ((struct Prj_Projects *) Projects); Prj_PutIconToShowAllData ((struct Prj_Projects *) Projects);
if (ICanConfigAllProjects) if (ICanConfigAllProjects == Usr_I_CAN)
/****** Put icons to request locking/unlocking edition /****** Put icons to request locking/unlocking edition
of all selected projects *******/ of all selected projects *******/
Prj_PutIconsToLockUnlockAllProjects ((struct Prj_Projects *) Projects); Prj_PutIconsToLockUnlockAllProjects ((struct Prj_Projects *) Projects);
} }
/***** Put form to go to configuration of projects *****/ /***** Put form to go to configuration of projects *****/
if (ICanConfigAllProjects) if (ICanConfigAllProjects == Usr_I_CAN)
Ico_PutContextualIconToConfigure (ActCfgPrj,NULL, Ico_PutContextualIconToConfigure (ActCfgPrj,NULL,
NULL,NULL); NULL,NULL);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkPrj,NULL, Ico_PutContextualIconToGetLink (ActReqLnkPrj,NULL,
Prj_PutCurrentPars,Projects); Prj_PutCurrentPars,Projects);
@ -1360,7 +1362,7 @@ void Prj_ShowBoxWithOneProject (struct Prj_Projects *Projects)
HTM_FIELDSET_End (); HTM_FIELDSET_End ();
/***** Show project file browsers *****/ /***** Show project file browsers *****/
if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod)) if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod) == Usr_I_CAN)
Brw_ShowFileBrowserProject (Projects->Prj.PrjCod); Brw_ShowFileBrowserProject (Projects->Prj.PrjCod);
/***** Show project rubrics *****/ /***** 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_DateBlueClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE]; extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE];
extern const char *Txt_Actions[ActLst_NUM_ACTIONS]; 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; Act_Action_t NextAction;
char *Id;
/***** Write first row of data of this project *****/ /***** Write first row of data of this project *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
@ -1614,8 +1621,7 @@ static void Prj_ShowFirstRow (struct Prj_Projects *Projects,
HTM_ARTICLE_Begin (Anchor); HTM_ARTICLE_Begin (Anchor);
if (Projects->Prj.Title[0]) if (Projects->Prj.Title[0])
{ {
NextAction = Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod) ? ActAdmDocPrj : NextAction = NextActions[Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod)];
ActSeeOnePrj;
Frm_BeginForm (NextAction); Frm_BeginForm (NextAction);
Prj_PutCurrentPars (Projects); Prj_PutCurrentPars (Projects);
HTM_BUTTON_Submit_Begin (Txt_Actions[NextAction], HTM_BUTTON_Submit_Begin (Txt_Actions[NextAction],
@ -1703,8 +1709,8 @@ static void Prj_ShowReviewStatus (struct Prj_Projects *Projects,
PutForm = Frm_DONT_PUT_FORM; PutForm = Frm_DONT_PUT_FORM;
break; break;
default: default:
PutForm = Prj_CheckIfICanReviewProjects () ? Frm_PUT_FORM : PutForm = (Prj_CheckIfICanReviewProjects () == Usr_I_CAN) ? Frm_PUT_FORM :
Frm_DONT_PUT_FORM; Frm_DONT_PUT_FORM;
break; break;
} }
@ -1869,12 +1875,12 @@ static void Prj_PutSelectorReviewStatus (struct Prj_Projects *Projects)
/**************************** Can I review 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_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanReviewProjects[Gbl.Usrs.Me.Role.Logged]; return ICanReviewProjects[Gbl.Usrs.Me.Role.Logged];
@ -2877,7 +2883,7 @@ static void Prj_FormToSelectUsrs (struct Prj_Projects *Projects,
TxtButton, TxtButton,
Hlp_ASSESSMENT_Projects_add_user, Hlp_ASSESSMENT_Projects_add_user,
TxtButton, TxtButton,
false); // Do not put form with date range Frm_DONT_PUT_FORM); // Do not put form with date range
free (TxtButton); free (TxtButton);
/***** Put a form to create/edit project *****/ /***** Put a form to create/edit project *****/
@ -3045,7 +3051,7 @@ static void Prj_ReqRemUsrFromPrj (struct Prj_Projects *Projects,
/***** Get user to be removed *****/ /***** Get user to be removed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) 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 *****/ /***** Show question and button to remove user as a role from project *****/
/* Begin alert */ /* Begin alert */
@ -3123,7 +3129,7 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInPrj)
/***** Get user to be removed *****/ /***** Get user to be removed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Prj_CheckIfICanEditProject (&Projects.Prj)) if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN)
{ {
/***** Remove user from the table of project-users *****/ /***** Remove user from the table of project-users *****/
Prj_DB_RemoveUsrFromPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod); 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 [HidVis_VISIBLE] = ActHidPrj, // Visible ==> action to hide
}; };
if (Prj_CheckIfICanEditProject (&Projects->Prj)) if (Prj_CheckIfICanEditProject (&Projects->Prj) == Usr_I_CAN)
{ {
/***** Icon to remove project *****/ /***** Icon to remove project *****/
Ico_PutContextualIconToRemove (ActReqRemPrj,NULL, Ico_PutContextualIconToRemove (ActReqRemPrj,NULL,
@ -3190,11 +3196,11 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
/***** Icon to edit project *****/ /***** Icon to edit project *****/
Ico_PutContextualIconToEdit (ActEdiOnePrj,NULL, Ico_PutContextualIconToEdit (ActEdiOnePrj,NULL,
Prj_PutCurrentPars,Projects); Prj_PutCurrentPars,Projects);
} }
/***** Icon to admin project documents *****/ /***** Icon to admin project documents *****/
if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod)) if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod) == Usr_I_CAN)
Ico_PutContextualIconToViewFiles (ActAdmDocPrj, Ico_PutContextualIconToViewFiles (ActAdmDocPrj,
Prj_PutCurrentPars,Projects); Prj_PutCurrentPars,Projects);
@ -3202,7 +3208,7 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutCurrentPars,Projects); Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutCurrentPars,Projects);
/***** Locked/unlocked project edition *****/ /***** Locked/unlocked project edition *****/
if (PrjCfg_CheckIfICanConfig ()) if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN)
{ {
/* Icon to lock/unlock project edition */ /* Icon to lock/unlock project edition */
HTM_DIV_Begin ("id=\"prj_lck_%ld\" class=\"PRJ_LOCK\"", 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); Prj_PutIconOffLockedUnlocked (&Projects->Prj);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkPrj,NULL, Ico_PutContextualIconToGetLink (ActReqLnkPrj,NULL,
Prj_PutCurrentPars,Projects); Prj_PutCurrentPars,Projects);
} }
@ -3224,20 +3230,21 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
/************************ Can I edit a given project? ************************/ /************************ 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_NET: case Rol_NET:
if (Prj->Locked == Prj_LOCKED) // Locked edition if (Prj->Locked == Prj_LOCKED) // Locked edition
return false; return Usr_I_CAN_NOT;
return (Prj_GetMyRolesInProject (Prj->PrjCod) & return ((Prj_GetMyRolesInProject (Prj->PrjCod) &
(1 << Prj_ROLE_TUT)) != 0; // Am I a tutor? (1 << Prj_ROLE_TUT)) != 0) ? Usr_I_CAN : // Am I a tutor?
Usr_I_CAN_NOT;
case Rol_TCH: case Rol_TCH:
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: default:
return false; return Usr_I_CAN_NOT;
} }
} }
@ -3502,7 +3509,7 @@ void Prj_ReqRemProject (void)
Prj_GetProjectDataByCod (&Projects.Prj); Prj_GetProjectDataByCod (&Projects.Prj);
/***** Check if I can edit this project *****/ /***** Check if I can edit this project *****/
if (!Prj_CheckIfICanEditProject (&Projects.Prj)) if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Show question and button to remove the project *****/ /***** 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 Prj_GetProjectDataByCod (&Projects.Prj); // Inside this function, the course is checked to be the current one
/***** Check if I can edit this project *****/ /***** Check if I can edit this project *****/
if (!Prj_CheckIfICanEditProject (&Projects.Prj)) if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Remove users in project *****/ /***** Remove users in project *****/
@ -3606,7 +3613,7 @@ static void Prj_HideUnhideProject (HidVis_HiddenOrVisible_t HiddenOrVisible)
Prj_GetProjectDataByCod (&Projects.Prj); Prj_GetProjectDataByCod (&Projects.Prj);
/***** Check if I can edit this project *****/ /***** Check if I can edit this project *****/
if (!Prj_CheckIfICanEditProject (&Projects.Prj)) if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Hide/unhide project *****/ /***** Hide/unhide project *****/
@ -3631,7 +3638,7 @@ void Prj_ReqCreatePrj (void)
Prj_ResetPrjsAndReadConfig (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can create new projects *****/ /***** Check if I can create new projects *****/
if (!Prj_CheckIfICanCreateProjects (&Projects)) if (Prj_CheckIfICanCreateProjects (&Projects) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
@ -3996,7 +4003,7 @@ void Prj_ReceiveProject (void)
extern const char *Txt_The_project_has_been_modified; extern const char *Txt_The_project_has_been_modified;
struct Prj_Projects Projects; struct Prj_Projects Projects;
bool ItsANewProject; bool ItsANewProject;
bool ICanEditProject; Usr_ICan_t ICanEditProject;
bool NewProjectIsCorrect = true; bool NewProjectIsCorrect = true;
/***** Reset projects *****/ /***** Reset projects *****/
@ -4025,7 +4032,7 @@ void Prj_ReceiveProject (void)
} }
/* Check if I can create/edit project */ /* Check if I can create/edit project */
if (!ICanEditProject) if (ICanEditProject == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/* Get project title */ /* Get project title */
@ -4163,7 +4170,7 @@ void Prj_ReqLockSelectedPrjsEdition (void)
Prj_ResetPrjsAndReadConfig (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can configure projects *****/ /***** Check if I can configure projects *****/
if (!PrjCfg_CheckIfICanConfig ()) if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
@ -4201,7 +4208,7 @@ void Prj_ReqUnloSelectedPrjsEdition (void)
Prj_ResetPrjsAndReadConfig (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can configure projects *****/ /***** Check if I can configure projects *****/
if (!PrjCfg_CheckIfICanConfig ()) if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
@ -4242,7 +4249,7 @@ void Prj_LockSelectedPrjsEdition (void)
Prj_ResetPrjsAndReadConfig (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can configure projects *****/ /***** Check if I can configure projects *****/
if (!PrjCfg_CheckIfICanConfig ()) if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
@ -4278,7 +4285,7 @@ void Prj_UnloSelectedPrjsEdition (void)
Prj_ResetPrjsAndReadConfig (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can configure projects *****/ /***** Check if I can configure projects *****/
if (!PrjCfg_CheckIfICanConfig ()) if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Get parameters *****/ /***** Get parameters *****/
@ -4368,7 +4375,7 @@ void Prj_LockProjectEdition (void)
Prj_ResetPrjsAndReadConfig (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can configure projects *****/ /***** Check if I can configure projects *****/
if (!PrjCfg_CheckIfICanConfig ()) if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
@ -4404,7 +4411,7 @@ void Prj_UnloProjectEdition (void)
Prj_ResetPrjsAndReadConfig (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can configure projects *****/ /***** Check if I can configure projects *****/
if (!PrjCfg_CheckIfICanConfig ()) if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
@ -4440,7 +4447,7 @@ void Prj_ChangeReviewStatus (void)
Prj_ResetPrjsAndReadConfig (&Projects); Prj_ResetPrjsAndReadConfig (&Projects);
/***** Check if I can review projects *****/ /***** Check if I can review projects *****/
if (!Prj_CheckIfICanReviewProjects ()) if (Prj_CheckIfICanReviewProjects () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
@ -4499,7 +4506,7 @@ static void Prj_ShowRubrics (struct Prj_Projects *Projects)
for (RubricType = (PrjCfg_RubricType_t) 1; for (RubricType = (PrjCfg_RubricType_t) 1;
RubricType <= (PrjCfg_RubricType_t) (PrjCfg_NUM_RUBRIC_TYPES - 1); RubricType <= (PrjCfg_RubricType_t) (PrjCfg_NUM_RUBRIC_TYPES - 1);
RubricType++) RubricType++)
if (Prj_CheckIfICanViewRubric (Projects->Prj.PrjCod,RubricType)) if (Prj_CheckIfICanViewRubric (Projects->Prj.PrjCod,RubricType) == Usr_I_CAN)
Prj_ShowRubricsOfType (Projects,RubricType); Prj_ShowRubricsOfType (Projects,RubricType);
/***** End table *****/ /***** End table *****/
@ -4521,7 +4528,7 @@ static void Prj_ShowRubricsOfType (struct Prj_Projects *Projects,
unsigned NumRubricsThisType; unsigned NumRubricsThisType;
unsigned NumRubThisType; unsigned NumRubThisType;
struct Rub_Rubric Rubric; 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 *****/ /***** Get project rubrics for current course from database *****/
NumRubricsThisType = Prj_DB_GetRubricsOfType (&mysql_res,RubricType); NumRubricsThisType = Prj_DB_GetRubricsOfType (&mysql_res,RubricType);
@ -4587,7 +4594,7 @@ static void Prj_ShowRubricsOfType (struct Prj_Projects *Projects,
/************************* Who can view/fill rubrics *************************/ /************************* 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
@ -4596,25 +4603,26 @@ static bool Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubr
switch (WhichRubric) switch (WhichRubric)
{ {
case PrjCfg_RUBRIC_ERR: case PrjCfg_RUBRIC_ERR:
return false; return Usr_I_CAN_NOT;
case PrjCfg_RUBRIC_TUT: case PrjCfg_RUBRIC_TUT:
case PrjCfg_RUBRIC_EVL: case PrjCfg_RUBRIC_EVL:
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // I am a tutor return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // I am a tutor...
1 << Prj_ROLE_EVL)) != 0); // or an evaluator 1 << Prj_ROLE_EVL)) != 0) ? Usr_I_CAN : // ...or an evaluator
Usr_I_CAN_NOT;
case PrjCfg_RUBRIC_GBL: 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_TCH: // Editing teachers in a course can view all rubrics
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: 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) switch (Gbl.Usrs.Me.Role.Logged)
{ {
@ -4623,20 +4631,22 @@ static bool Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubr
switch (WhichRubric) switch (WhichRubric)
{ {
case PrjCfg_RUBRIC_ERR: case PrjCfg_RUBRIC_ERR:
return false; return Usr_I_CAN_NOT;
case PrjCfg_RUBRIC_TUT: 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: 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: 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_TCH: // Editing teachers in a course can fill all rubrics
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return Usr_I_CAN;
default: default:
return false; return Usr_I_CAN_NOT;
} }
} }
@ -4670,7 +4680,7 @@ void Prj_ChangeCriterionScore (void)
Err_WrongRubricExit (); Err_WrongRubricExit ();
/***** Update review *****/ /***** 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); Rub_DB_UpdateScore (Rsc_PROJECT,Prj.PrjCod,-1L,CriCod,Score);
else else
Err_NoPermission (); Err_NoPermission ();

View File

@ -205,8 +205,8 @@ void Prj_SeeAllProjects (void);
void Prj_ShowProjects (struct Prj_Projects *Projects); void Prj_ShowProjects (struct Prj_Projects *Projects);
void Prj_ShowTableSelectedPrjs (void); void Prj_ShowTableSelectedPrjs (void);
bool Prj_CheckIfICanViewProjectDocuments (long PrjCod); Usr_ICan_t Prj_CheckIfICanViewProjectDocuments (long PrjCod);
bool Prj_CheckIfICanViewProjectAssessment (long PrjCod); Usr_ICan_t Prj_CheckIfICanViewProjectAssessment (long PrjCod);
void Prj_PutCurrentPars (void *Projects); void Prj_PutCurrentPars (void *Projects);
void Prj_PutPars (struct Prj_Filter *Filter, 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? **********************/ /************************ 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_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanConfigAllProjects[Gbl.Usrs.Me.Role.Logged]; return ICanConfigAllProjects[Gbl.Usrs.Me.Role.Logged];

View File

@ -61,7 +61,7 @@ struct PrgCfg_ListRubCods
void PrjCfg_GetConfig (struct PrjCfg_Config *Config); void PrjCfg_GetConfig (struct PrjCfg_Config *Config);
bool PrjCfg_CheckIfICanConfig (void); Usr_ICan_t PrjCfg_CheckIfICanConfig (void);
void PrjCfg_ShowFormConfig (void); void PrjCfg_ShowFormConfig (void);
PrjCfg_RubricType_t PrjCfg_GetRubricFromString (const char *Str); PrjCfg_RubricType_t PrjCfg_GetRubricFromString (const char *Str);
void PrjCfg_ChangeNETCanCreate (void); void PrjCfg_ChangeNETCanCreate (void);

View File

@ -427,16 +427,6 @@ void Qst_ShowFormRequestSelectQstsForGame (struct Gam_Games *Games,
DB_FreeMySQLResult (&mysql_res); 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 *************************/ /********************* 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, void Qst_ShowFormRequestSelectQstsForGame (struct Gam_Games *Games,
struct Qst_Questions *Questions); struct Qst_Questions *Questions);
bool Qst_CheckIfICanEditQsts (void);
void Qst_PutIconsRequestBankQsts (__attribute__((unused)) void *Args); void Qst_PutIconsRequestBankQsts (__attribute__((unused)) void *Args);
void Qst_PutIconsEditBankQsts (void *Questions); void Qst_PutIconsEditBankQsts (void *Questions);

View File

@ -37,6 +37,7 @@
#include "swad_action.h" #include "swad_action.h"
#include "swad_action_list.h" #include "swad_action_list.h"
#include "swad_alert.h" #include "swad_alert.h"
#include "swad_agenda.h"
#include "swad_box.h" #include "swad_box.h"
#include "swad_config.h" #include "swad_config.h"
#include "swad_database.h" #include "swad_database.h"
@ -128,7 +129,7 @@ static bool Rec_GetParShowOfficeHours (void);
static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView, static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
struct Usr_Data *UsrDat,const char *Anchor); struct Usr_Data *UsrDat,const char *Anchor);
static void Rec_ShowMyCrsRecordUpdated (void); 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_PutIconsCommands (__attribute__((unused)) void *Args);
static void Rec_PutParsMyResults (__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 if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, // Get student's data from database
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_GET_ROLE_IN_CRS)) Usr_GET_ROLE_IN_CRS))
if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat)) if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
Rec_ShowRecordOneStdCrs (); Rec_ShowRecordOneStdCrs ();
} }
@ -1184,7 +1185,7 @@ void Rec_GetUsrAndShowRecOneTchCrs (void)
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, // Get teacher's data from database if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, // Get teacher's data from database
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_GET_ROLE_IN_CRS)) Usr_GET_ROLE_IN_CRS))
if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat)) if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
Rec_ShowRecordOneTchCrs (); Rec_ShowRecordOneTchCrs ();
} }
@ -1789,7 +1790,7 @@ void Rec_GetFieldsCrsRecordFromForm (void)
for (NumField = 0; for (NumField = 0;
NumField < Gbl.Crs.Records.LstFields.Num; NumField < Gbl.Crs.Records.LstFields.Num;
NumField++) 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 */ /* Get text from the form */
snprintf (FieldParName,sizeof (FieldParName),"Field%ld", snprintf (FieldParName,sizeof (FieldParName),"Field%ld",
@ -1811,7 +1812,7 @@ void Rec_UpdateCrsRecord (long UsrCod)
for (NumField = 0; for (NumField = 0;
NumField < Gbl.Crs.Records.LstFields.Num; NumField < Gbl.Crs.Records.LstFields.Num;
NumField++) 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 *****/ /***** Check if already exists this field for this user in database *****/
FieldAlreadyExists = (Rec_DB_GetFieldTxtFromUsrRecord (&mysql_res, FieldAlreadyExists = (Rec_DB_GetFieldTxtFromUsrRecord (&mysql_res,
@ -1867,7 +1868,7 @@ void Rec_AllocMemFieldsRecordsCrs (void)
for (NumField = 0; for (NumField = 0;
NumField < Gbl.Crs.Records.LstFields.Num; NumField < Gbl.Crs.Records.LstFields.Num;
NumField++) 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 */ /* Allocate memory for the texts of the fields */
if ((Gbl.Crs.Records.LstFields.Lst[NumField].Text = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL) if ((Gbl.Crs.Records.LstFields.Lst[NumField].Text = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
@ -1884,7 +1885,7 @@ void Rec_FreeMemFieldsRecordsCrs (void)
for (NumField = 0; for (NumField = 0;
NumField < Gbl.Crs.Records.LstFields.Num; NumField < Gbl.Crs.Records.LstFields.Num;
NumField++) 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 */ /* Free memory of the text of the field */
if (Gbl.Crs.Records.LstFields.Lst[NumField].Text) 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 */ /* 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 // Non-editing teachers can not edit fields
return Gbl.Usrs.Me.Role.Logged == Rol_TCH || return ( Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM || Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
(Gbl.Usrs.Me.Role.Logged == Rol_STD && (Gbl.Usrs.Me.Role.Logged == Rol_STD &&
Visibility == Rec_EDITABLE_FIELD); 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; ViewType = Vie_EDIT;
break; break;
case Rec_SHA_OTHER_EXISTING_USR_FORM: case Rec_SHA_OTHER_EXISTING_USR_FORM:
ViewType = Usr_ICanChangeOtherUsrData (UsrDat) ? Vie_EDIT : ViewType = (Usr_ICanChangeOtherUsrData (UsrDat) == Usr_I_CAN) ? Vie_EDIT :
Vie_VIEW; Vie_VIEW;
break; break;
default: // In other options, I can not edit user's data default: // In other options, I can not edit user's data
ViewType = Vie_VIEW; ViewType = Vie_VIEW;
@ -2280,7 +2282,7 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
static void Rec_PutIconsCommands (__attribute__((unused)) void *Args) static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
{ {
Usr_MeOrOther_t MeOrOther = Usr_ItsMe (Rec_Record.UsrDat->UsrCod); Usr_MeOrOther_t MeOrOther = Usr_ItsMe (Rec_Record.UsrDat->UsrCod);
bool ICanViewUsrProfile; Usr_ICan_t ICanViewUsrProfile;
bool RecipientHasBannedMe; bool RecipientHasBannedMe;
static Act_Action_t NextAction[Rol_NUM_ROLES] = 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 Act_GetBrowserTab (Gbl.Action.Act) == Act_1ST_TAB && // Only in main browser tab
Gbl.Usrs.Me.Logged) // Only if I am logged Gbl.Usrs.Me.Logged) // Only if I am logged
{ {
ICanViewUsrProfile = Pri_ShowingIsAllowed (Rec_Record.UsrDat->BaPrfVisibility, ICanViewUsrProfile = Pri_CheckIfICanView (Rec_Record.UsrDat->BaPrfVisibility,
Rec_Record.UsrDat); Rec_Record.UsrDat);
/***** Begin container *****/ /***** Begin container *****/
HTM_DIV_Begin ("class=\"FRAME_ICO\""); HTM_DIV_Begin ("class=\"FRAME_ICO\"");
@ -2363,25 +2365,25 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
"pen.svg",Ico_BLACK); "pen.svg",Ico_BLACK);
/***** Button to view user's profile *****/ /***** Button to view user's profile *****/
if (ICanViewUsrProfile) if (ICanViewUsrProfile == Usr_I_CAN)
Lay_PutContextualLinkOnlyIcon (ActSeeOthPubPrf,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeOthPubPrf,NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
"user.svg",Ico_BLACK); "user.svg",Ico_BLACK);
/***** Button to view user's record card *****/ /***** 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 */ /* View student's records: common record card and course record card */
Lay_PutContextualLinkOnlyIcon (ActSeeRecOneStd,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeRecOneStd,NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
"address-card.svg",Ico_BLACK); "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 */ /* View teacher's record card and timetable */
Lay_PutContextualLinkOnlyIcon (ActSeeRecOneTch,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeRecOneTch,NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
"address-card.svg",Ico_BLACK); "address-card.svg",Ico_BLACK);
/***** Button to view user's agenda *****/ /***** 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, Lay_PutContextualLinkOnlyIcon (ActSeeAgd[MeOrOther],NULL,
FuncPutParsAgd[MeOrOther],NULL, FuncPutParsAgd[MeOrOther],NULL,
"calendar.svg",Ico_BLACK); "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 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 *****/ /***** 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 */ /* Test results in course */
Lay_PutContextualLinkOnlyIcon (ActSeeTstResCrs[MeOrOther],NULL, 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 *****/ /***** 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, Lay_PutContextualLinkOnlyIcon (ActAdmAsgWrk[MeOrOther],NULL,
FuncPutParsAdmAsgWrk[MeOrOther],NULL, FuncPutParsAdmAsgWrk[MeOrOther],NULL,
"folder-open.svg",Ico_BLACK); "folder-open.svg",Ico_BLACK);
/***** Button to view student's attendance *****/ /***** 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, Lay_PutContextualLinkOnlyIcon (ActSeeLstAtt[MeOrOther],NULL,
FuncPutParsSeeLstAtt[MeOrOther],NULL, FuncPutParsSeeLstAtt[MeOrOther],NULL,
"calendar-check.svg",Ico_BLACK); "calendar-check.svg",Ico_BLACK);
@ -2453,7 +2455,7 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
Lay_PutContextualLinkOnlyIcon (ActUnfUsr,NULL, Lay_PutContextualLinkOnlyIcon (ActUnfUsr,NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
"user-check.svg",Ico_BLACK); // Put button to unfollow, even if I can not view user's profile "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, Lay_PutContextualLinkOnlyIcon (ActFolUsr,NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
"user-plus.svg",Ico_BLACK); // Put button to follow "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 **************************/ /************************** 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_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanGetLink[Gbl.Usrs.Me.Role.Logged]; return ICanGetLink[Gbl.Usrs.Me.Role.Logged];

View File

@ -32,6 +32,7 @@
#include "swad_form.h" #include "swad_form.h"
#include "swad_HTML.h" #include "swad_HTML.h"
#include "swad_string.h" #include "swad_string.h"
#include "swad_user.h"
/*****************************************************************************/ /*****************************************************************************/
/************************** Public types and constants ***********************/ /************************** 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_GetParLink (struct Rsc_Link *Link);
bool Rsc_CheckIfICanGetLink (void); Usr_ICan_t Rsc_CheckIfICanGetLink (void);
#endif #endif

View File

@ -97,7 +97,7 @@ static void Roo_GetAndListMACAddresses (long RooCod);
static void Roo_GetAndEditMACAddresses (long RooCod,const char *Anchor); static void Roo_GetAndEditMACAddresses (long RooCod,const char *Anchor);
static Roo_Order_t Roo_GetParRoomOrder (void); 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_PutIconsListingRooms (__attribute__((unused)) void *Args);
static void Roo_PutIconToEditRooms (void); static void Roo_PutIconToEditRooms (void);
static void Roo_PutIconsEditingRooms (__attribute__((unused)) void *Args); 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 *************************/ /*********************** 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) static void Roo_PutIconsListingRooms (__attribute__((unused)) void *Args)
{ {
/***** Put icon to edit rooms *****/ /***** Put icon to edit rooms *****/
if (Roo_CheckIfICanCreateRooms ()) if (Roo_CheckIfICanCreateRooms () == Usr_I_CAN)
Roo_PutIconToEditRooms (); Roo_PutIconToEditRooms ();
} }
@ -399,8 +400,7 @@ static void Roo_PutIconsListingRooms (__attribute__((unused)) void *Args)
static void Roo_PutIconToEditRooms (void) static void Roo_PutIconToEditRooms (void)
{ {
Ico_PutContextualIconToEdit (ActEdiRoo,NULL, Ico_PutContextualIconToEdit (ActEdiRoo,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -460,8 +460,7 @@ static void Roo_EditRoomsInternal (void)
static void Roo_PutIconsEditingRooms (__attribute__((unused)) void *Args) static void Roo_PutIconsEditingRooms (__attribute__((unused)) void *Args)
{ {
/***** Put icon to view rooms *****/ /***** Put icon to view rooms *****/
Ico_PutContextualIconToView (ActSeeRoo,NULL, Ico_PutContextualIconToView (ActSeeRoo,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -702,7 +701,7 @@ static void Roo_ListRoomsForEdition (const struct Bld_Buildings *Buildings,
Nam_ExistingShortAndFullNames (ActionRename, Nam_ExistingShortAndFullNames (ActionRename,
ParCod_Roo,Room->RooCod, ParCod_Roo,Room->RooCod,
Names, Names,
true); // Put form Frm_PUT_FORM);
/* Seating capacity */ /* Seating capacity */
HTM_TD_Begin ("class=\"LT\""); 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 *******************/ /********************** 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 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 " AND crs_courses.DegCod=deg_degrees.DegCod) AS C2" // centers of user's courses
" WHERE C1.CtrCod=C2.CtrCod)", " WHERE C1.CtrCod=C2.CtrCod)",
Gbl.Usrs.Me.UsrDat.UsrCod, 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 ---------------------------------- //--------------------------------- Check in ----------------------------------
long Roo_DB_CheckIn (long RooCod); 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_GetUsrLastLocation (MYSQL_RES **mysql_res,long UsrCod);
unsigned Roo_DB_GetLocationByMAC (MYSQL_RES **mysql_res,unsigned long long MACnum); 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 ************************/ /************************ 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_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanEditRubrics[Gbl.Usrs.Me.Role.Logged]; return ICanEditRubrics[Gbl.Usrs.Me.Role.Logged];
@ -245,7 +245,7 @@ bool Rub_CheckIfICanEditRubrics (void)
bool Rub_CheckIfEditable (void) bool Rub_CheckIfEditable (void)
{ {
if (Rub_CheckIfICanEditRubrics ()) if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN)
/***** Rubric is editable only if ... *****/ /***** Rubric is editable only if ... *****/
// TODO: Change to control that a rubric is not edited in some circunstances? // 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 (Rubrics)
{ {
if (Rub_CheckIfICanEditRubrics ()) if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN)
{ {
/***** Put icon to create a new rubric *****/ /***** Put icon to create a new rubric *****/
Rub_PutIconToCreateNewRubric ((struct Rub_Rubrics *) Rubrics); Rub_PutIconToCreateNewRubric ((struct Rub_Rubrics *) Rubrics);
@ -275,9 +275,8 @@ static void Rub_PutIconsListRubrics (void *Rubrics)
} }
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL, Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL,Rub_PutPars,Rubrics);
Rub_PutPars,Rubrics);
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
Fig_PutIconToShowFigure (Fig_RUBRICS); Fig_PutIconToShowFigure (Fig_RUBRICS);
@ -300,8 +299,7 @@ static void Rub_PutIconToCreateNewRubric (struct Rub_Rubrics *Rubrics)
static void Prg_PutIconToViewResourceClipboard (void) static void Prg_PutIconToViewResourceClipboard (void)
{ {
Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InRub,NULL, Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InRub,NULL,NULL,NULL);
NULL,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -472,26 +470,22 @@ static void Rub_PutIconsEditingOneRubric (void *Rubrics)
{ {
if (Rubrics) if (Rubrics)
/***** Icon to view rubric *****/ /***** Icon to view rubric *****/
Ico_PutContextualIconToView (ActSeeOneRub,NULL, Ico_PutContextualIconToView (ActSeeOneRub,NULL,Rub_PutPars,Rubrics);
Rub_PutPars,Rubrics);
} }
static void Rub_PutIconsToRemEditOneRubric (struct Rub_Rubrics *Rubrics) static void Rub_PutIconsToRemEditOneRubric (struct Rub_Rubrics *Rubrics)
{ {
if (Rub_CheckIfICanEditRubrics ()) if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN)
{ {
/***** Icon to remove rubric *****/ /***** Icon to remove rubric *****/
Ico_PutContextualIconToRemove (ActReqRemRub,NULL, Ico_PutContextualIconToRemove (ActReqRemRub,NULL,Rub_PutPars,Rubrics);
Rub_PutPars,Rubrics);
/***** Icon to edit rubric *****/ /***** Icon to edit rubric *****/
Ico_PutContextualIconToEdit (ActEdiOneRub,NULL, Ico_PutContextualIconToEdit (ActEdiOneRub,NULL,Rub_PutPars,Rubrics);
Rub_PutPars,Rubrics);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL, Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL,Rub_PutPars,Rubrics);
Rub_PutPars,Rubrics);
} }
} }
@ -652,7 +646,7 @@ void Rub_AskRemRubric (void)
/***** Get data of the rubric from database *****/ /***** Get data of the rubric from database *****/
Rub_GetRubricDataByCod (&Rubrics.Rubric); Rub_GetRubricDataByCod (&Rubrics.Rubric);
if (!Rub_CheckIfICanEditRubrics ()) if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Show criterion and button to remove rubric *****/ /***** Show criterion and button to remove rubric *****/
@ -686,7 +680,7 @@ void Rub_RemoveRubric (void)
/***** Get data of the rubric from database *****/ /***** Get data of the rubric from database *****/
Rub_GetRubricDataByCod (&Rubrics.Rubric); Rub_GetRubricDataByCod (&Rubrics.Rubric);
if (!Rub_CheckIfICanEditRubrics ()) if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Remove rubric from all tables *****/ /***** Remove rubric from all tables *****/
@ -738,7 +732,7 @@ void Rub_ReqCreatOrEditRubric (void)
Rub_ExistingNewRubric_t ExistingNewRubric; Rub_ExistingNewRubric_t ExistingNewRubric;
/***** Check if I can edit rubrics *****/ /***** Check if I can edit rubrics *****/
if (!Rub_CheckIfICanEditRubrics ()) if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Reset rubrics context *****/ /***** Reset rubrics context *****/
@ -910,7 +904,7 @@ void Rub_ReceiveRubric (void)
Rub_ExistingNewRubric_t ExistingNewRubric; Rub_ExistingNewRubric_t ExistingNewRubric;
/***** Check if I can edit rubrics *****/ /***** Check if I can edit rubrics *****/
if (!Rub_CheckIfICanEditRubrics ()) if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/***** Reset rubrics context *****/ /***** Reset rubrics context *****/

View File

@ -54,7 +54,7 @@ void Rub_RubricDestructor (struct Rub_Rubric *Rubric);
void Rub_SeeAllRubrics (void); void Rub_SeeAllRubrics (void);
void Rub_ListAllRubrics (struct Rub_Rubrics *Rubrics); void Rub_ListAllRubrics (struct Rub_Rubrics *Rubrics);
bool Rub_CheckIfICanEditRubrics (void); Usr_ICan_t Rub_CheckIfICanEditRubrics (void);
bool Rub_CheckIfEditable (void); bool Rub_CheckIfEditable (void);
void Rub_SeeOneRubric (void); void Rub_SeeOneRubric (void);
void Rub_ShowOnlyOneRubric (struct Rub_Rubrics *Rubrics); 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, void RubCri_ListCriteriaInProject (struct Prj_Projects *Projects,long RubCod,
bool ICanFill) Usr_ICan_t ICanFill)
{ {
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
unsigned NumCriteria; unsigned NumCriteria;

View File

@ -45,7 +45,7 @@ void RubCri_ChangeWeight (void);
void RubCri_ListCriteriaForSeeing (const struct Rub_Rubrics *Rubrics); void RubCri_ListCriteriaForSeeing (const struct Rub_Rubrics *Rubrics);
void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics); void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics);
void RubCri_ListCriteriaInProject (struct Prj_Projects *Projects,long RubCod, 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_PushRubCod (struct Rub_Node **TOS,long RubCod);
void Rub_PopRubCod (struct Rub_Node **TOS); 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) static void RubRsc_PutIconsClipboard (__attribute__((unused)) void *Args)
{ {
/***** Put icon to remove resource clipboard in rubrics *****/ /***** 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 if (Rsc_DB_GetNumResourcesInClipboard ()) // Only if there are resources
Ico_PutContextualIconToRemove (ActRemRscCli_InRub,NULL, Ico_PutContextualIconToRemove (ActRemRscCli_InRub,NULL,
NULL,NULL); NULL,NULL);

View File

@ -75,7 +75,7 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
static bool Svy_CheckIfICanCreateSvy (void); static Usr_ICan_t Svy_CheckIfICanCreateSvy (void);
static void Svy_PutIconsListSurveys (void *Surveys); static void Svy_PutIconsListSurveys (void *Surveys);
static void Svy_PutIconToCreateNewSvy (struct Svy_Surveys *Surveys); static void Svy_PutIconToCreateNewSvy (struct Svy_Surveys *Surveys);
static void Svy_PutParsToCreateNewSvy (void *Surveys); static void Svy_PutParsToCreateNewSvy (void *Surveys);
@ -224,7 +224,7 @@ void Svy_ListAllSurveys (struct Svy_Surveys *Surveys)
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
if (Surveys->Svy.Status.ICanEdit || 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 HTM_TH_Span (NULL,HTM_HEAD_CENTER,1,1,"CONTEXT_COL"); // Column for contextual icons
for (Order = (Dat_StartEndTime_t) 0; 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 **********************/ /******************* 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_TCH ] = Usr_I_CAN,
[Rol_DEG_ADM] = true, [Rol_DEG_ADM] = Usr_I_CAN,
[Rol_CTR_ADM] = true, [Rol_CTR_ADM] = Usr_I_CAN,
[Rol_INS_ADM] = true, [Rol_INS_ADM] = Usr_I_CAN,
[Rol_SYS_ADM] = true, [Rol_SYS_ADM] = Usr_I_CAN,
}; };
return ICanCreateSvy[Gbl.Usrs.Me.Role.Logged]; return ICanCreateSvy[Gbl.Usrs.Me.Role.Logged];
@ -308,13 +308,12 @@ static bool Svy_CheckIfICanCreateSvy (void)
static void Svy_PutIconsListSurveys (void *Surveys) static void Svy_PutIconsListSurveys (void *Surveys)
{ {
/***** Put icon to create a new survey *****/ /***** Put icon to create a new survey *****/
if (Svy_CheckIfICanCreateSvy ()) if (Svy_CheckIfICanCreateSvy () == Usr_I_CAN)
Svy_PutIconToCreateNewSvy ((struct Svy_Surveys *) Surveys); Svy_PutIconToCreateNewSvy ((struct Svy_Surveys *) Surveys);
/***** Put icon to get resource link *****/ /***** Put icon to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL, Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL,Svy_PutPars,Surveys);
Svy_PutPars,Surveys);
/***** Put icon to show a figure *****/ /***** Put icon to show a figure *****/
Fig_PutIconToShowFigure (Fig_SURVEYS); 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\"", HTM_TD_Begin ("rowspan=\"2\" class=\"CONTEXT_COL %s\"",
The_GetColorRows ()); The_GetColorRows ());
if (Surveys->Svy.Status.ICanEdit || if (Surveys->Svy.Status.ICanEdit ||
Rsc_CheckIfICanGetLink ()) Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Svy_PutFormsToRemEditOneSvy (Surveys,Anchor); Svy_PutFormsToRemEditOneSvy (Surveys,Anchor);
HTM_TD_End (); HTM_TD_End ();
} }
@ -846,12 +845,10 @@ static void Svy_PutFormsToRemEditOneSvy (struct Svy_Surveys *Surveys,
if (Surveys->Svy.Status.ICanEdit) if (Surveys->Svy.Status.ICanEdit)
{ {
/***** Icon to remove survey *****/ /***** Icon to remove survey *****/
Ico_PutContextualIconToRemove (ActReqRemSvy,NULL, Ico_PutContextualIconToRemove (ActReqRemSvy,NULL,Svy_PutPars,Surveys);
Svy_PutPars,Surveys);
/***** Icon to reset survey *****/ /***** Icon to reset survey *****/
Ico_PutContextualIconToReset (ActReqRstSvy,NULL, Ico_PutContextualIconToReset (ActReqRstSvy,NULL,Svy_PutPars,Surveys);
Svy_PutPars,Surveys);
/***** Icon to hide/unhide survey *****/ /***** Icon to hide/unhide survey *****/
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor, Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor,
@ -859,14 +856,12 @@ static void Svy_PutFormsToRemEditOneSvy (struct Svy_Surveys *Surveys,
Surveys->Svy.Status.HiddenOrVisible); Surveys->Svy.Status.HiddenOrVisible);
/***** Icon to edit survey *****/ /***** Icon to edit survey *****/
Ico_PutContextualIconToEdit (ActEdiOneSvy,NULL, Ico_PutContextualIconToEdit (ActEdiOneSvy,NULL,Svy_PutPars,Surveys);
Svy_PutPars,Surveys);
} }
/***** Icon to get resource link *****/ /***** Icon to get resource link *****/
if (Rsc_CheckIfICanGetLink ()) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL, Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL,Svy_PutPars,Surveys);
Svy_PutPars,Surveys);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1165,7 +1160,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
break; break;
case Hie_CRS: // Course case Hie_CRS: // Course
Svy->Status.IBelongToScope = Hie_CheckIfIBelongTo (Svy->Level,Svy->HieCod) && Svy->Status.IBelongToScope = Hie_CheckIfIBelongTo (Svy->Level,Svy->HieCod) &&
Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (Svy->SvyCod); Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (Svy->SvyCod) == Usr_I_CAN;
break; break;
default: // Unknown default: // Unknown
Err_WrongHierarchyLevelExit (); Err_WrongHierarchyLevelExit ();
@ -1596,7 +1591,7 @@ void Svy_ReqCreatOrEditSvy (void)
if (ItsANewSurvey) if (ItsANewSurvey)
{ {
/***** Put link (form) to create new survey *****/ /***** Put link (form) to create new survey *****/
if (!Svy_CheckIfICanCreateSvy ()) if (Svy_CheckIfICanCreateSvy () == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/* Initialize to empty survey */ /* 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 *************/ /************ 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 return
DB_QueryEXISTS ("can not check if I can do a survey", 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" " WHERE grp_users.UsrCod=%ld"
" AND grp_users.GrpCod=svy_groups.GrpCod)))", " AND grp_users.GrpCod=svy_groups.GrpCod)))",
SvyCod, 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); void Svy_DB_CreateGrp (long SvyCod,long GrpCod);
unsigned Svy_DB_GetGrpNamesAssociatedToSvy (MYSQL_RES **mysql_res,long SvyCod); 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_RemoveGroupsOfType (long GrpTypCod);
void Svy_DB_RemoveGroup (long GrpCod); void Svy_DB_RemoveGroup (long GrpCod);

View File

@ -43,7 +43,7 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/ /***************************** 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); 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]; extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS];
Tab_Tab_t NumTab; Tab_Tab_t NumTab;
const char *TabTxt; const char *TabTxt;
bool ICanViewTab;
char URLIconSet[PATH_MAX + 1]; char URLIconSet[PATH_MAX + 1];
static const char *ClassIcoTab[Ico_NUM_ICON_SETS] = 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 <= (Tab_Tab_t) (Tab_NUM_TABS - 1);
NumTab++) NumTab++)
{ {
ICanViewTab = Tab_CheckIfICanViewTab (NumTab);
/* If current tab is unknown, then activate the first one with access allowed */ /* If current tab is unknown, then activate the first one with access allowed */
if (Gbl.Action.Tab == TabUnk) if (Gbl.Action.Tab == TabUnk)
{ {
@ -82,7 +79,7 @@ void Tab_DrawTabs (void)
Tab_DisableIncompatibleTabs (); 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); TabTxt = Tab_GetTxt (NumTab);
@ -133,32 +130,40 @@ void Tab_DrawTabs (void)
/************************* Check if I can view a tab *************************/ /************************* 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) switch (Tab)
{ {
case TabUnk: case TabUnk:
return false; return Usr_I_CAN_NOT;
case TabSys: 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: 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: 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: 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: 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: 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: case TabAss:
return (Gbl.Hierarchy.Level == Hie_CRS && // Course selected return (Gbl.Hierarchy.Level == Hie_CRS && // Course selected
Gbl.Usrs.Me.Role.Logged >= Rol_STD); // I belong to course or I am an admin 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: case TabFil:
return (Gbl.Hierarchy.Node[Hie_INS].HieCod > 0 || // Institution selected 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: 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, static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, 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 *ClassTxt,
__attribute__((unused)) const char *ClassFeedback); __attribute__((unused)) const char *ClassFeedback);
static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, 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 *ClassTxt,
__attribute__((unused)) const char *ClassFeedback); __attribute__((unused)) const char *ClassFeedback);
static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, 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 *ClassTxt,
__attribute__((unused)) const char *ClassFeedback); __attribute__((unused)) const char *ClassFeedback);
static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, struct Qst_Question *Question,
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
const char *ClassTxt, const char *ClassTxt,
const char *ClassFeedback); const char *ClassFeedback);
static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, 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 *ClassTxt,
__attribute__((unused)) const char *ClassFeedback); __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_removed;
extern const char *Txt_Question_modified; extern const char *Txt_Question_modified;
bool QuestionUneditedAfterExam = false; 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 *****/ /***** Check if I can view each part of the question *****/
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility); ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility) ? Usr_I_CAN :
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility); Usr_I_CAN_NOT;
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility); ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility) ? Usr_I_CAN :
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility); 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; break;
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
@ -625,13 +629,13 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = true; ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN;
break; break;
default: default:
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = false; ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN_NOT;
break; break;
} }
@ -663,7 +667,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
ICanView[TstVis_VISIBLE_QST_ANS_TXT]); ICanView[TstVis_VISIBLE_QST_ANS_TXT]);
/* Media */ /* Media */
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT]) if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN)
Med_ShowMedia (&Question->Media, Med_ShowMedia (&Question->Media,
"Tst_MED_SHOW_CONT", "Tst_MED_SHOW_CONT",
"Tst_MED_SHOW"); "Tst_MED_SHOW");
@ -674,7 +678,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
ICanView,"Qst_TXT","Qst_TXT_LIGHT"); ICanView,"Qst_TXT","Qst_TXT_LIGHT");
/* Write score retrieved from database */ /* 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\"", HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"",
The_GetSuffix ()); The_GetSuffix ());
@ -698,7 +702,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
/* Question feedback */ /* Question feedback */
if (QuestionUneditedAfterExam) if (QuestionUneditedAfterExam)
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT]) if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
Qst_WriteQstFeedback (Question->Feedback,"Qst_TXT_LIGHT"); Qst_WriteQstFeedback (Question->Feedback,"Qst_TXT_LIGHT");
HTM_TD_End (); HTM_TD_End ();
@ -1169,14 +1173,14 @@ void TstPrn_ShowGrade (double Grade,double MaxGrade)
void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat, void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, struct Qst_Question *Question,
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
const char *ClassTxt, const char *ClassTxt,
const char *ClassFeedback) const char *ClassFeedback)
{ {
void (*TstPrn_WriteAnsExam[Qst_NUM_ANS_TYPES]) (struct Usr_Data *UsrDat, void (*TstPrn_WriteAnsExam[Qst_NUM_ANS_TYPES]) (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, struct Qst_Question *Question,
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
const char *ClassTxt, const char *ClassTxt,
const char *ClassFeedback) = const char *ClassFeedback) =
{ {
@ -1200,7 +1204,7 @@ void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat,
static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, 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 *ClassTxt,
__attribute__((unused)) const char *ClassFeedback) __attribute__((unused)) const char *ClassFeedback)
{ {
@ -1225,7 +1229,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
if (sscanf (PrintedQuestion->StrAnswers,"%ld",&IntAnswerUsr) == 1) if (sscanf (PrintedQuestion->StrAnswers,"%ld",&IntAnswerUsr) == 1)
{ {
HTM_TD_Begin ("class=\"CM %s_%s\"", 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 (IntAnswerUsr == Question->Answer.Integer ? "Qst_ANS_OK" : // Correct
"Qst_ANS_BAD") : // Wrong "Qst_ANS_BAD") : // Wrong
"Qst_ANS_0", // Blank answer "Qst_ANS_0", // Blank answer
@ -1246,7 +1250,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
/***** Write the correct answer *****/ /***** Write the correct answer *****/
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ()); 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); HTM_Long (Question->Answer.Integer);
else else
Ico_PutIconNotVisible (); Ico_PutIconNotVisible ();
@ -1264,7 +1268,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, 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 *ClassTxt,
__attribute__((unused)) const char *ClassFeedback) __attribute__((unused)) const char *ClassFeedback)
{ {
@ -1290,7 +1294,7 @@ static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
FloatAnsUsr = Str_GetDoubleFromStr (PrintedQuestion->StrAnswers); FloatAnsUsr = Str_GetDoubleFromStr (PrintedQuestion->StrAnswers);
// A bad formatted floating point answer will interpreted as 0.0 // A bad formatted floating point answer will interpreted as 0.0
HTM_TD_Begin ("class=\"CM %s_%s\"", 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[0] &&
FloatAnsUsr <= Question->Answer.FloatingPoint[1]) ? "Qst_ANS_OK" : // Correct FloatAnsUsr <= Question->Answer.FloatingPoint[1]) ? "Qst_ANS_OK" : // Correct
"Qst_ANS_BAD") : // Wrong "Qst_ANS_BAD") : // Wrong
@ -1304,7 +1308,7 @@ static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
/***** Write the correct answer *****/ /***** Write the correct answer *****/
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ()); 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_Txt ("[");
HTM_Double (Question->Answer.FloatingPoint[0]); 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, static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, 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 *ClassTxt,
__attribute__((unused)) const char *ClassFeedback) __attribute__((unused)) const char *ClassFeedback)
{ {
@ -1352,7 +1356,7 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
/***** Write the user answer *****/ /***** Write the user answer *****/
HTM_TD_Begin ("class=\"CM %s_%s\"", 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 (AnsTFUsr == Question->Answer.TF ? "Qst_ANS_OK" : // Correct
"Qst_ANS_BAD") : // Wrong "Qst_ANS_BAD") : // Wrong
"Qst_ANS_0", // Blank answer "Qst_ANS_0", // Blank answer
@ -1362,7 +1366,7 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
/***** Write the correct answer *****/ /***** Write the correct answer *****/
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ()); 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); Qst_WriteAnsTF (Question->Answer.TF);
else else
Ico_PutIconNotVisible (); Ico_PutIconNotVisible ();
@ -1380,7 +1384,7 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat, static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, struct Qst_Question *Question,
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
const char *ClassTxt, const char *ClassTxt,
const char *ClassFeedback) const char *ClassFeedback)
{ {
@ -1399,7 +1403,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
Qst_ChangeFormatAnswersText (Question); Qst_ChangeFormatAnswersText (Question);
/***** Change format of answers feedback *****/ /***** Change format of answers feedback *****/
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT]) if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
Qst_ChangeFormatAnswersFeedback (Question); Qst_ChangeFormatAnswersFeedback (Question);
/***** Get indexes for this question from string *****/ /***** 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 */ /* Draw icon depending on user's answer */
if (UsrAnswers[Indexes[NumOpt]]) // This answer has been selected by the user 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) if (Question->Answer.Options[Indexes[NumOpt]].Correct)
{ {
@ -1455,7 +1459,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
HTM_TD_Empty (1); HTM_TD_Empty (1);
/* Draw icon that indicates whether the answer is correct */ /* 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) 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\"", HTM_DIV_Begin ("class=\"%s_%s\"",
ClassTxt,The_GetSuffix ()); 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); HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text);
Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media, Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media,
@ -1498,7 +1502,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
Ico_PutIconNotVisible (); Ico_PutIconNotVisible ();
HTM_DIV_End (); 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)
if (Question->Answer.Options[Indexes[NumOpt]].Feedback[0]) 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, static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, 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 *ClassTxt,
__attribute__((unused)) const char *ClassFeedback) __attribute__((unused)) const char *ClassFeedback)
{ {
@ -1537,7 +1541,7 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
Qst_ChangeFormatAnswersText (Question); Qst_ChangeFormatAnswersText (Question);
/***** Change format of answers feedback *****/ /***** Change format of answers feedback *****/
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT]) if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
Qst_ChangeFormatAnswersFeedback (Question); Qst_ChangeFormatAnswersFeedback (Question);
/***** Begin table *****/ /***** Begin table *****/
@ -1578,9 +1582,9 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
} }
} }
HTM_TD_Begin ("class=\"CT %s_%s\"", HTM_TD_Begin ("class=\"CT %s_%s\"",
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ? (Correct ? "Qst_ANS_OK" : // Correct ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN ? (Correct ? "Qst_ANS_OK" : // Correct
"Qst_ANS_BAD") : // Wrong "Qst_ANS_BAD") : // Wrong
"Qst_ANS_0", // Blank answer "Qst_ANS_0", // Blank answer
The_GetSuffix ()); The_GetSuffix ());
HTM_Txt (PrintedQuestion->StrAnswers); HTM_Txt (PrintedQuestion->StrAnswers);
HTM_TD_End (); HTM_TD_End ();
@ -1589,7 +1593,7 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
HTM_TD_Empty (1); HTM_TD_Empty (1);
/***** Write the correct answers *****/ /***** 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_TD_Begin ("class=\"CT\"");
HTM_TABLE_BeginPadding (2); HTM_TABLE_BeginPadding (2);
@ -1614,7 +1618,7 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
HTM_Txt (Question->Answer.Options[NumOpt].Text); HTM_Txt (Question->Answer.Options[NumOpt].Text);
HTM_DIV_End (); 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)
if (Question->Answer.Options[NumOpt].Feedback[0]) if (Question->Answer.Options[NumOpt].Feedback[0])
{ {
@ -1682,7 +1686,7 @@ static void TstPrn_PutFormToSelectUsrsToViewUsrsPrints (__attribute__((unused))
Act_GetActionText (ActSeeUsrTstResCrs), Act_GetActionText (ActSeeUsrTstResCrs),
Hlp_ASSESSMENT_Tests_results, Hlp_ASSESSMENT_Tests_results,
Txt_View_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, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS)) 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 *****/ /***** Show tests *****/
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat); 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 */ /* Accumulate questions and score */
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
NumTotalQsts.All += Print.NumQsts.All; NumTotalQsts.All += Print.NumQsts.All;
NumTotalQsts.NotBlank += Print.NumQsts.NotBlank; 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\"", HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Result) if (ICanView.Result == Usr_I_CAN)
HTM_Unsigned (Print.NumQsts.All); HTM_Unsigned (Print.NumQsts.All);
else else
Ico_PutIconNotVisible (); Ico_PutIconNotVisible ();
@ -1941,7 +1945,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Result) if (ICanView.Result == Usr_I_CAN)
{ {
if (Print.NumQsts.NotBlank) if (Print.NumQsts.NotBlank)
HTM_Unsigned (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\"", HTM_TD_Begin ("class=\"RT %s_%s %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Result) if (ICanView.Result == Usr_I_CAN)
{ {
NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank; NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank;
if (NumQstsBlank) if (NumQstsBlank)
@ -1972,7 +1976,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
HTM_Double2Decimals (Print.Score); HTM_Double2Decimals (Print.Score);
HTM_Txt ("/"); HTM_Txt ("/");
@ -1986,7 +1990,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
HTM_TD_Begin ("class=\"RT %s_%s %s\"", HTM_TD_Begin ("class=\"RT %s_%s %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
HTM_Double2Decimals (Print.NumQsts.All ? Print.Score / HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
(double) Print.NumQsts.All : (double) Print.NumQsts.All :
0.0); 0.0);
@ -1998,7 +2002,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX); TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX);
else else
Ico_PutIconNotVisible (); Ico_PutIconNotVisible ();
@ -2007,7 +2011,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
/* Link to show this test */ /* Link to show this test */
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Result) if (ICanView.Result == Usr_I_CAN)
{ {
Frm_BeginForm (Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe : Frm_BeginForm (Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe :
ActSeeOneTstResOth); ActSeeOneTstResOth);
@ -2220,7 +2224,7 @@ void TstPrn_ShowOnePrint (void)
if (Gbl.Usrs.Me.Role.Logged == Rol_STD) if (Gbl.Usrs.Me.Role.Logged == Rol_STD)
TstCfg_GetConfig (); // To get visibility TstCfg_GetConfig (); // To get visibility
TstRes_CheckIfICanSeePrintResult (&Print,Gbl.Usrs.Other.UsrDat.UsrCod,&ICanView); 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 (); Err_NoPermissionExit ();
/***** Get questions and user's answers of the test from database *****/ /***** 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_PREFS,
Usr_DONT_GET_ROLE_IN_CRS)) Usr_DONT_GET_ROLE_IN_CRS))
Err_WrongUserExit (); Err_WrongUserExit ();
if (!Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat)) if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN_NOT)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/* User */ /* User */
@ -2333,7 +2337,7 @@ void TstPrn_ShowOnePrint (void)
HTM_TD_Begin ("class=\"LB DAT_%s\"", HTM_TD_Begin ("class=\"LB DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
HTM_STRONG_Begin (); HTM_STRONG_Begin ();
HTM_Double2Decimals (Print.Score); HTM_Double2Decimals (Print.Score);
@ -2357,7 +2361,7 @@ void TstPrn_ShowOnePrint (void)
HTM_TD_Begin ("class=\"LB DAT_%s\"", HTM_TD_Begin ("class=\"LB DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ICanView.Score) if (ICanView.Score == Usr_I_CAN)
{ {
HTM_STRONG_Begin (); HTM_STRONG_Begin ();
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX); 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: case Rol_STD:
// Depends on whether the print is sent or not // Depends on whether the print is sent or not
// if the print is not sent ==> I can not view results // if the print is not sent ==> I can not view results
ICanView->Result = Print->Sent && Usr_ItsMe (UsrCod) == Usr_ME; ICanView->Result = (Print->Sent && Usr_ItsMe (UsrCod) == Usr_ME) ? Usr_I_CAN :
Usr_I_CAN_NOT;
if (ICanView->Result) if (ICanView->Result == Usr_I_CAN)
// Depends on 5 visibility icons associated to tests // 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 else
ICanView->Score = false; ICanView->Score = Usr_I_CAN_NOT;
break; break;
case Rol_NET: case Rol_NET:
case Rol_TCH: 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) // if teachers are not allowed ==> I can not view results (except if the print is mine)
ICanView->Result = ICanView->Result =
ICanView->Score = Print->Sent && 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; break;
case Rol_SYS_ADM: case Rol_SYS_ADM:
ICanView->Result = ICanView->Result =
ICanView->Score = true; ICanView->Score = Usr_I_CAN;
break; break;
default: default:
ICanView->Result = ICanView->Result =
ICanView->Score = false; ICanView->Score = Usr_I_CAN_NOT;
break; break;
} }
} }

View File

@ -131,7 +131,7 @@ void TstPrn_ShowGrade (double Grade,double MaxGrade);
void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat, void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion, const struct TstPrn_PrintedQuestion *PrintedQuestion,
struct Qst_Question *Question, struct Qst_Question *Question,
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY], Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
const char *ClassTxt, const char *ClassTxt,
const char *ClassFeedback); const char *ClassFeedback);

View File

@ -877,7 +877,7 @@ static void TmlCom_ReqRemComm (struct Tml_Timeline *Timeline)
TmlCom_GetCommDataByCod (&Com); TmlCom_GetCommDataByCod (&Com);
/***** Do some checks *****/ /***** 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); Med_MediaDestructor (&Com.Content.Media);
return; return;

View File

@ -135,7 +135,7 @@ static void TmlFav_FavNote (struct TmlNot_Note *Not)
TmlNot_GetNoteDataByCod (Not); TmlNot_GetNoteDataByCod (Not);
/***** Do some checks *****/ /***** Do some checks *****/
if (!TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod)) if (TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod) == Usr_I_CAN_NOT)
return; return;
/***** Trivial check: Have I faved this note? *****/ /***** Trivial check: Have I faved this note? *****/
@ -165,7 +165,7 @@ static void TmlFav_UnfNote (struct TmlNot_Note *Not)
TmlNot_GetNoteDataByCod (Not); TmlNot_GetNoteDataByCod (Not);
/***** Do some checks *****/ /***** Do some checks *****/
if (!TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod)) if (TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod) == Usr_I_CAN_NOT)
return; return;
/***** Trivial check: Have I faved this note? *****/ /***** Trivial check: Have I faved this note? *****/
@ -272,7 +272,7 @@ static void TmlFav_FavComm (struct TmlCom_Comment *Com)
TmlCom_GetCommDataByCod (Com); TmlCom_GetCommDataByCod (Com);
/***** Do some checks *****/ /***** 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); Med_MediaDestructor (&Com->Content.Media);
return; return;
@ -311,7 +311,7 @@ static void TmlFav_UnfComm (struct TmlCom_Comment *Com)
TmlCom_GetCommDataByCod (Com); TmlCom_GetCommDataByCod (Com);
/***** Do some checks *****/ /***** 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); Med_MediaDestructor (&Com->Content.Media);
return; return;

View File

@ -1010,7 +1010,7 @@ static void TmlNot_ReqRemNote (struct Tml_Timeline *Timeline)
TmlNot_GetNoteDataByCod (&Not); TmlNot_GetNoteDataByCod (&Not);
/***** Do some checks *****/ /***** Do some checks *****/
if (!TmlUsr_CheckIfICanRemove (Not.NotCod,Not.UsrCod)) if (TmlUsr_CheckIfICanRemove (Not.NotCod,Not.UsrCod) == Usr_I_CAN_NOT)
return; return;
/***** Show question and button to remove note *****/ /***** Show question and button to remove note *****/

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