mirror of https://github.com/acanas/swad-core.git
Version 23.72: Apr 01, 2024 New type Usr_ICan_t.
This commit is contained in:
parent
566cbc95a4
commit
665eb5e4ce
|
@ -1772,7 +1772,7 @@ static void API_CopyListUsers (struct soap *soap,
|
|||
|
||||
/* Get list of user's IDs */
|
||||
ID_GetListIDsFromUsrCod (&UsrDat);
|
||||
ICanSeeUsrID = ID_ICanSeeOtherUsrIDs (&UsrDat);
|
||||
ICanSeeUsrID = (ID_ICanSeeOtherUsrIDs (&UsrDat) == Usr_I_CAN);
|
||||
|
||||
/* Get nickname */
|
||||
Nck_DB_GetNicknameFromUsrCod (UsrDat.UsrCod,UsrDat.Nickname);
|
||||
|
@ -4326,7 +4326,6 @@ int swad__getMatchStatus (struct soap *soap,
|
|||
int ReturnCode;
|
||||
struct Gam_Game Game;
|
||||
struct Mch_Match Match;
|
||||
bool ICanPlayThisMatchBasedOnGrps;
|
||||
struct Mch_UsrAnswer UsrAnswer;
|
||||
|
||||
/***** Reset game and match *****/
|
||||
|
@ -4395,8 +4394,7 @@ int swad__getMatchStatus (struct soap *soap,
|
|||
"Requester must be a student in the course");
|
||||
|
||||
/***** Can I play this match? *****/
|
||||
ICanPlayThisMatchBasedOnGrps = Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match);
|
||||
if (!ICanPlayThisMatchBasedOnGrps)
|
||||
if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match) == Usr_I_CAN_NOT)
|
||||
return soap_receiver_fault (soap,
|
||||
"Request forbidden",
|
||||
"Requester can not join this match");
|
||||
|
@ -5263,7 +5261,7 @@ int swad__getLastLocation (struct soap *soap,
|
|||
The other user does not have to share any course with me,
|
||||
but at least some course of each one has to share center.
|
||||
*/
|
||||
if (Roo_DB_CheckIfICanSeeUsrLocation ((long) userCode))
|
||||
if (Roo_DB_CheckIfICanSeeUsrLocation ((long) userCode) == Usr_I_CAN)
|
||||
{
|
||||
/***** Get list of locations *****/
|
||||
NumLocs = Roo_DB_GetUsrLastLocation (&mysql_res,(long) userCode);
|
||||
|
|
28
swad_ID.c
28
swad_ID.c
|
@ -308,7 +308,7 @@ static bool ID_CheckIfUsrIDIsValidUsingMinDigits (const char *UsrID,unsigned Min
|
|||
void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor)
|
||||
{
|
||||
unsigned NumID;
|
||||
bool ICanSeeUsrID = ID_ICanSeeOtherUsrIDs (UsrDat);
|
||||
bool ICanSeeUsrID = (ID_ICanSeeOtherUsrIDs (UsrDat) == Usr_I_CAN);
|
||||
bool ICanConfirmUsrID = ICanSeeUsrID &&
|
||||
Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER && // Not me
|
||||
!Frm_CheckIfInside () && // Not inside another form
|
||||
|
@ -343,11 +343,11 @@ void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor)
|
|||
/***************** Check if I can see another user's IDs *********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat)
|
||||
Usr_ICan_t ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat)
|
||||
{
|
||||
/***** Fast check: It's me? *****/
|
||||
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
|
||||
/***** Check if I have permission to see another user's IDs *****/
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
|
@ -356,12 +356,12 @@ bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat)
|
|||
case Rol_TCH:
|
||||
/* Check 1: I can see the IDs of users who do not exist in database */
|
||||
if (UsrDat->UsrCod <= 0) // User does not exist (when creating a new user)
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
|
||||
/* Check 2: I can see the IDs of confirmed students */
|
||||
if (UsrDat->Roles.InCurrentCrs == Rol_STD && // A student
|
||||
UsrDat->Accepted) // who accepted registration
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
|
||||
/* Check 3: I can see the IDs of users with user's data empty */
|
||||
// This check is made to not view simultaneously:
|
||||
|
@ -372,16 +372,16 @@ bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat)
|
|||
!UsrDat->Surname2[0] && // and who has no surname 2 (nobody filled user's surname 2)
|
||||
!UsrDat->FrstName[0] && // and who has no first name (nobody filled user's first name)
|
||||
!UsrDat->Email[0]) // and who has no email (nobody filled user's email)
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
case Rol_DEG_ADM:
|
||||
case Rol_CTR_ADM:
|
||||
case Rol_INS_ADM:
|
||||
case Rol_SYS_ADM:
|
||||
return Usr_ICanEditOtherUsr (UsrDat);
|
||||
return Usr_CheckIfICanEditOtherUsr (UsrDat);
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -691,7 +691,7 @@ void ID_RemoveOtherUsrID (void)
|
|||
/***** Get other user's code from form and get user's data *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Remove user's ID *****/
|
||||
ID_RemoveUsrID (&Gbl.Usrs.Other.UsrDat,
|
||||
|
@ -721,7 +721,7 @@ static void ID_RemoveUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOt
|
|||
char UsrID[ID_MAX_BYTES_USR_ID + 1];
|
||||
bool ICanRemove;
|
||||
|
||||
if (Usr_ICanEditOtherUsr (UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Get user's ID from form *****/
|
||||
Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID);
|
||||
|
@ -787,7 +787,7 @@ void ID_ChangeOtherUsrID (void)
|
|||
/***** Get other user's code from form and get user's data *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Change user's ID *****/
|
||||
ID_ChangeUsrID (&Gbl.Usrs.Other.UsrDat,
|
||||
|
@ -822,7 +822,7 @@ static void ID_ChangeUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOt
|
|||
bool AlreadyExists;
|
||||
unsigned NumIDFound = 0; // Initialized to avoid warning
|
||||
|
||||
if (Usr_ICanEditOtherUsr (UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Get new user's ID from form *****/
|
||||
Par_GetParText ("NewID",NewID,ID_MAX_BYTES_USR_ID);
|
||||
|
@ -911,7 +911,7 @@ void ID_ConfirmOtherUsrID (void)
|
|||
if (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs == Rol_STD)
|
||||
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
|
||||
if (ID_ICanSeeOtherUsrIDs (&Gbl.Usrs.Other.UsrDat))
|
||||
if (ID_ICanSeeOtherUsrIDs (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
ICanConfirm = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ bool ID_CheckIfUsrIDIsValid (const char *UsrID);
|
|||
bool ID_CheckIfUsrIDSeemsAValidID (const char *UsrID);
|
||||
|
||||
void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor);
|
||||
bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat);
|
||||
Usr_ICan_t ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat);
|
||||
|
||||
void ID_ShowFormChangeMyID (bool IShouldFillInID);
|
||||
void ID_ShowFormChangeOtherUsrID (void);
|
||||
|
|
|
@ -488,7 +488,7 @@ void Acc_ShowFormChgOtherUsrAccount (void)
|
|||
/***** Get user whose account must be changed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Get user's nickname and email address
|
||||
It's necessary because nickname or email could be just updated *****/
|
||||
|
@ -530,7 +530,7 @@ void Acc_ShowFormChgOtherUsrAccount (void)
|
|||
|
||||
void Acc_PutLinkToRemoveMyAccount (__attribute__((unused)) void *Args)
|
||||
{
|
||||
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Me.UsrDat.UsrCod))
|
||||
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Me.UsrDat.UsrCod) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (ActReqRemMyAcc,NULL,
|
||||
Acc_PutParsToRemoveMyAccount,Gbl.Usrs.Me.UsrDat.EnUsrCod,
|
||||
"trash.svg",Ico_RED);
|
||||
|
@ -771,7 +771,7 @@ void Acc_GetUsrCodAndRemUsrGbl (void)
|
|||
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod))
|
||||
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_I_CAN)
|
||||
Acc_ReqRemAccountOrRemAccount (Acc_REMOVE_USR);
|
||||
else
|
||||
Error = true;
|
||||
|
@ -814,7 +814,7 @@ void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove)
|
|||
/******** Check if I can eliminate completely another user's account *********/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Acc_CheckIfICanEliminateAccount (long UsrCod)
|
||||
Usr_ICan_t Acc_CheckIfICanEliminateAccount (long UsrCod)
|
||||
{
|
||||
Usr_MeOrOther_t MeOrOther = Usr_ItsMe (UsrCod);
|
||||
|
||||
|
@ -823,10 +823,14 @@ bool Acc_CheckIfICanEliminateAccount (long UsrCod)
|
|||
switch (MeOrOther)
|
||||
{
|
||||
case Usr_ME:
|
||||
return (Gbl.Usrs.Me.Role.Available & (1 << Rol_SYS_ADM)) == 0; // I can not be system admin
|
||||
// A system admin can not eliminate him/herself
|
||||
return (Gbl.Usrs.Me.Role.Available & (1 << Rol_SYS_ADM)) == 0 ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; // I am logged as system admin
|
||||
// Only a system admin can eliminate other's account
|
||||
return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1100,7 +1104,7 @@ void Acc_PutIconToChangeUsrAccount (struct Usr_Data *UsrDat)
|
|||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
if (Usr_ICanEditOtherUsr (UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL,
|
||||
Rec_PutParUsrCodEncrypted,NULL,
|
||||
"at.svg",Ico_BLACK);
|
||||
|
|
|
@ -62,7 +62,7 @@ void Acc_AfterCreationNewAccount (void);
|
|||
void Acc_GetUsrCodAndRemUsrGbl (void);
|
||||
void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove);
|
||||
|
||||
bool Acc_CheckIfICanEliminateAccount (long UsrCod);
|
||||
Usr_ICan_t Acc_CheckIfICanEliminateAccount (long UsrCod);
|
||||
void Acc_AskIfRemoveMyAccount (void);
|
||||
void Acc_RemoveMyAccount (void);
|
||||
void Acc_CompletelyEliminateAccount (struct Usr_Data *UsrDat,
|
||||
|
|
33
swad_admin.c
33
swad_admin.c
|
@ -34,20 +34,6 @@
|
|||
#include "swad_global.h"
|
||||
#include "swad_user_database.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************** Public constants *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can admin */
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_DEG_ADM] = true,
|
||||
[Rol_CTR_ADM] = true,
|
||||
[Rol_INS_ADM] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/************** External global variables from others modules ****************/
|
||||
/*****************************************************************************/
|
||||
|
@ -66,6 +52,25 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
|
|||
static void Adm_AskIfRemAdm (Usr_MeOrOther_t MeOrOther,Hie_Level_t Level);
|
||||
static void Adm_EffectivelyRemAdm (struct Usr_Data *UsrDat,Hie_Level_t Level);
|
||||
|
||||
/*****************************************************************************/
|
||||
/**************** Check if I can admin another user's account ****************/
|
||||
/*****************************************************************************/
|
||||
|
||||
Usr_ICan_t Adm_CheckIfICanAdminOtherUsrs (void)
|
||||
{
|
||||
static Usr_ICan_t Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can admin */
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_DEG_ADM] = Usr_I_CAN,
|
||||
[Rol_CTR_ADM] = Usr_I_CAN,
|
||||
[Rol_INS_ADM] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged];
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**** Ask if really wanted to add an administrator to current institution ****/
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -35,6 +35,8 @@
|
|||
/****************************** Public prototypes ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
Usr_ICan_t Adm_CheckIfICanAdminOtherUsrs (void);
|
||||
|
||||
void Adm_ReqAddAdm (Hie_Level_t Level);
|
||||
|
||||
void Adm_AddAdmToIns (void);
|
||||
|
|
|
@ -121,6 +121,29 @@ static void Agd_FreeListEvents (struct Agd_Agenda *Agenda);
|
|||
|
||||
static void Agd_HideUnhideEvent (HidVis_HiddenOrVisible_t HiddenOrVisible);
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************* Check if I can view a user's agenda *********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
Usr_ICan_t Agd_CheckIfICanViewUsrAgenda (struct Usr_Data *UsrDat)
|
||||
{
|
||||
/***** 1. Fast check: Am I logged? *****/
|
||||
if (!Gbl.Usrs.Me.Logged)
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** 2. Fast check: It's me? *****/
|
||||
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
|
||||
return Usr_I_CAN;
|
||||
|
||||
/***** 3. Fast check: Am I logged as system admin? *****/
|
||||
if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)
|
||||
return Usr_I_CAN;
|
||||
|
||||
/***** 4. Slow check: Get if user shares any course with me from database *****/
|
||||
return Enr_CheckIfUsrSharesAnyOfMyCrs (UsrDat) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*************************** Reset agenda context ****************************/
|
||||
/*****************************************************************************/
|
||||
|
@ -386,7 +409,7 @@ void Agd_ShowUsrAgenda (void)
|
|||
|
||||
/***** Get user *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
if (Usr_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Agd_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
Error = false;
|
||||
|
||||
|
@ -695,8 +718,7 @@ static void Agd_PutIconToCreateNewEvent (void *Agenda)
|
|||
|
||||
static void Agd_PutIconToViewEditMyFullAgenda (void *EncryptedUsrCod)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActSeeMyAgd,NULL,
|
||||
NULL,EncryptedUsrCod);
|
||||
Ico_PutContextualIconToEdit (ActSeeMyAgd,NULL,NULL,EncryptedUsrCod);
|
||||
}
|
||||
|
||||
static void Agd_PutIconToShowQR (void)
|
||||
|
@ -714,19 +736,19 @@ static void Agd_PutIconToShowQR (void)
|
|||
static void Agd_PutIconsOtherPublicAgenda (void *EncryptedUsrCod)
|
||||
{
|
||||
/***** Button to view user's public profile *****/
|
||||
if (Pri_ShowingIsAllowed (Gbl.Usrs.Other.UsrDat.BaPrfVisibility,
|
||||
&Gbl.Usrs.Other.UsrDat))
|
||||
if (Pri_CheckIfICanView (Gbl.Usrs.Other.UsrDat.BaPrfVisibility,
|
||||
&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeOthPubPrf,NULL,
|
||||
Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod,
|
||||
"user.svg",Ico_BLACK);
|
||||
|
||||
/***** Button to view user's record card *****/
|
||||
if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
/* View student's records: common record card and course record card */
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeRecOneStd,NULL,
|
||||
Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod,
|
||||
"address-card.svg",Ico_BLACK);
|
||||
else if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat))
|
||||
else if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeRecOneTch,NULL,
|
||||
Usr_PutParOtherUsrCodEncrypted,EncryptedUsrCod,
|
||||
"address-card.svg",Ico_BLACK);
|
||||
|
|
|
@ -101,6 +101,8 @@ typedef enum
|
|||
/***************************** Public prototypes *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
Usr_ICan_t Agd_CheckIfICanViewUsrAgenda (struct Usr_Data *UsrDat);
|
||||
|
||||
void Agd_PutFormLogInToShowUsrAgenda (void);
|
||||
void Agd_PutParAgd (void);
|
||||
|
||||
|
|
70
swad_alert.c
70
swad_alert.c
|
@ -34,6 +34,7 @@
|
|||
|
||||
#include "swad_action_list.h"
|
||||
#include "swad_alert.h"
|
||||
#include "swad_box.h"
|
||||
#include "swad_error.h"
|
||||
#include "swad_form.h"
|
||||
#include "swad_global.h"
|
||||
|
@ -398,15 +399,15 @@ static void Ale_ShowFixAlertAndButtonBegin (Ale_AlertType_t AlertType,const char
|
|||
{
|
||||
extern const char *Txt_Close;
|
||||
char IdAlert[Frm_MAX_BYTES_ID + 1];
|
||||
static const bool AlertClosable[Ale_NUM_ALERT_TYPES] =
|
||||
static Box_Closable_t AlertClosable[Ale_NUM_ALERT_TYPES] =
|
||||
{
|
||||
[Ale_NONE ] = false,
|
||||
[Ale_CLIPBOARD] = true,
|
||||
[Ale_INFO ] = true,
|
||||
[Ale_SUCCESS ] = true,
|
||||
[Ale_QUESTION ] = true,
|
||||
[Ale_WARNING ] = true,
|
||||
[Ale_ERROR ] = true,
|
||||
[Ale_NONE ] = Box_NOT_CLOSABLE,
|
||||
[Ale_CLIPBOARD] = Box_CLOSABLE,
|
||||
[Ale_INFO ] = Box_CLOSABLE,
|
||||
[Ale_SUCCESS ] = Box_CLOSABLE,
|
||||
[Ale_QUESTION ] = Box_CLOSABLE,
|
||||
[Ale_WARNING ] = Box_CLOSABLE,
|
||||
[Ale_ERROR ] = Box_CLOSABLE,
|
||||
};
|
||||
static const char *Ale_AlertIcons[Ale_NUM_ALERT_TYPES] =
|
||||
{
|
||||
|
@ -424,38 +425,49 @@ static void Ale_ShowFixAlertAndButtonBegin (Ale_AlertType_t AlertType,const char
|
|||
Lay_WriteStartOfPage ();
|
||||
|
||||
/***** Begin container *****/
|
||||
if (AlertClosable[AlertType])
|
||||
switch (AlertClosable[AlertType])
|
||||
{
|
||||
/* Create unique id for alert */
|
||||
Frm_SetUniqueId (IdAlert);
|
||||
HTM_DIV_Begin ("id=\"%s\" class=\"CM\"",IdAlert);
|
||||
case Box_NOT_CLOSABLE:
|
||||
HTM_DIV_Begin ("class=\"CM\"");
|
||||
break;
|
||||
case Box_CLOSABLE:
|
||||
/* Create unique id for alert */
|
||||
Frm_SetUniqueId (IdAlert);
|
||||
HTM_DIV_Begin ("id=\"%s\" class=\"CM\"",IdAlert);
|
||||
break;
|
||||
}
|
||||
else
|
||||
HTM_DIV_Begin ("class=\"CM\"");
|
||||
|
||||
/***** Begin box *****/
|
||||
HTM_DIV_Begin ("class=\"ALERT ALERT_BG_%s\"",The_GetSuffix ());
|
||||
|
||||
/***** Icon to close the alert *****/
|
||||
if (AlertClosable[AlertType])
|
||||
switch (AlertClosable[AlertType])
|
||||
{
|
||||
HTM_DIV_Begin ("class=\"ALERT_CLOSE\"");
|
||||
HTM_A_Begin ("href=\"\" onclick=\"toggleDisplay('%s');return false;\" /",
|
||||
IdAlert);
|
||||
Ico_PutIcon ("times.svg",Ico_BLACK,Txt_Close,"ICO16x16");
|
||||
HTM_A_End ();
|
||||
HTM_DIV_End ();
|
||||
case Box_NOT_CLOSABLE:
|
||||
break;
|
||||
case Box_CLOSABLE:
|
||||
HTM_DIV_Begin ("class=\"ALERT_CLOSE\"");
|
||||
HTM_A_Begin ("href=\"\" onclick=\"toggleDisplay('%s');return false;\" /",
|
||||
IdAlert);
|
||||
Ico_PutIcon ("times.svg",Ico_BLACK,Txt_Close,"ICO16x16");
|
||||
HTM_A_End ();
|
||||
HTM_DIV_End ();
|
||||
break;
|
||||
}
|
||||
|
||||
/***** Write message *****/
|
||||
if (AlertType == Ale_NONE)
|
||||
HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\"",
|
||||
The_GetSuffix ());
|
||||
else
|
||||
HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\""
|
||||
" style=\"background-image:url('%s/%s');\"",
|
||||
The_GetSuffix (),
|
||||
Cfg_URL_ICON_PUBLIC,Ale_AlertIcons[AlertType]);
|
||||
switch (AlertType)
|
||||
{
|
||||
case Ale_NONE:
|
||||
HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\"",The_GetSuffix ());
|
||||
break;
|
||||
default:
|
||||
HTM_DIV_Begin ("class=\"ALERT_TXT ALERT_TXT_%s\""
|
||||
" style=\"background-image:url('%s/%s');\"",
|
||||
The_GetSuffix (),
|
||||
Cfg_URL_ICON_PUBLIC,Ale_AlertIcons[AlertType]);
|
||||
break;
|
||||
}
|
||||
HTM_Txt (Txt);
|
||||
HTM_DIV_End ();
|
||||
}
|
||||
|
|
|
@ -56,6 +56,16 @@
|
|||
#include "swad_setting.h"
|
||||
#include "swad_string.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************************* Private types *******************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef enum
|
||||
{
|
||||
Asg_ONE_ASSIGMENT,
|
||||
Asg_MULTIPLE_ASSIGMENTS
|
||||
} Asg_OneOrMultiple_t;
|
||||
|
||||
/*****************************************************************************/
|
||||
/************** External global variables from others modules ****************/
|
||||
/*****************************************************************************/
|
||||
|
@ -67,14 +77,15 @@ extern struct Globals Gbl;
|
|||
/*****************************************************************************/
|
||||
|
||||
static void Asg_PutHead (struct Asg_Assignments *Assignments,
|
||||
bool OnlyOneAssignment,Vie_ViewType_t ViewType);
|
||||
static bool Asg_CheckIfICanCreateAssignments (void);
|
||||
Asg_OneOrMultiple_t OneOrMultiple,
|
||||
Vie_ViewType_t ViewType);
|
||||
static Usr_ICan_t Asg_CheckIfICanCreateAssignments (void);
|
||||
static void Asg_PutIconsListAssignments (void *Assignments);
|
||||
static void Asg_PutIconToCreateNewAsg (void *Assignments);
|
||||
static void Asg_ParsWhichGroupsToShow (void *Assignments);
|
||||
static void Asg_PutIconsOneAsg (void *Assignments);
|
||||
static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
|
||||
bool OnlyOneAssignment,
|
||||
Asg_OneOrMultiple_t OneOrMultiple,
|
||||
Vie_ViewType_t ViewType);
|
||||
static void Asg_WriteAsgAuthor (struct Asg_Assignment *Asg);
|
||||
static void Asg_WriteAssignmentFolder (struct Asg_Assignment *Asg,
|
||||
|
@ -176,9 +187,7 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments)
|
|||
HTM_TABLE_Begin ("TBL_SCROLL");
|
||||
|
||||
/***** Table head *****/
|
||||
Asg_PutHead (Assignments,
|
||||
false, // Not only this assignment in table
|
||||
Vie_VIEW); // Not print view
|
||||
Asg_PutHead (Assignments,Asg_MULTIPLE_ASSIGMENTS,Vie_VIEW);
|
||||
|
||||
/***** Write all assignments *****/
|
||||
for (NumAsg = Pagination.FirstItemVisible, The_ResetRowColor ();
|
||||
|
@ -187,9 +196,7 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments)
|
|||
{
|
||||
Assignments->Asg.AsgCod = Assignments->LstAsgCods[NumAsg - 1];
|
||||
Asg_GetAssignmentDataByCod (&Assignments->Asg);
|
||||
Asg_ShowAssignmentRow (Assignments,
|
||||
false, // Not only this assignment in table
|
||||
Vie_VIEW); // Not print view
|
||||
Asg_ShowAssignmentRow (Assignments,Asg_MULTIPLE_ASSIGMENTS,Vie_VIEW);
|
||||
}
|
||||
|
||||
/***** End table *****/
|
||||
|
@ -214,7 +221,8 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments)
|
|||
/*****************************************************************************/
|
||||
|
||||
static void Asg_PutHead (struct Asg_Assignments *Assignments,
|
||||
bool OnlyOneAssignment,Vie_ViewType_t ViewType)
|
||||
Asg_OneOrMultiple_t OneOrMultiple,
|
||||
Vie_ViewType_t ViewType)
|
||||
{
|
||||
extern const char *Txt_START_END_TIME_HELP[Dat_NUM_START_END_TIME];
|
||||
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
|
||||
|
@ -225,7 +233,7 @@ static void Asg_PutHead (struct Asg_Assignments *Assignments,
|
|||
|
||||
HTM_TR_Begin (NULL);
|
||||
|
||||
if (!OnlyOneAssignment)
|
||||
if (OneOrMultiple == Asg_MULTIPLE_ASSIGMENTS)
|
||||
HTM_TH_Span (NULL,HTM_HEAD_CENTER,1,1,"CONTEXT_COL"); // Column for contextual icons
|
||||
|
||||
for (Order = (Dat_StartEndTime_t) 0;
|
||||
|
@ -279,10 +287,11 @@ static void Asg_PutHead (struct Asg_Assignments *Assignments,
|
|||
/******************** Check if I can create assignments **********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Asg_CheckIfICanCreateAssignments (void)
|
||||
static Usr_ICan_t Asg_CheckIfICanCreateAssignments (void)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM;
|
||||
return (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -294,11 +303,11 @@ static void Asg_PutIconsListAssignments (void *Assignments)
|
|||
/***** Put icon to create a new assignment *****/
|
||||
if (Assignments)
|
||||
{
|
||||
if (Asg_CheckIfICanCreateAssignments ())
|
||||
if (Asg_CheckIfICanCreateAssignments () == Usr_I_CAN)
|
||||
Asg_PutIconToCreateNewAsg (Assignments);
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
{
|
||||
((struct Asg_Assignments *) Assignments)->Asg.AsgCod = -1L;
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkAsg,NULL,
|
||||
|
@ -393,14 +402,10 @@ void Asg_PrintOneAssignment (void)
|
|||
HTM_TABLE_BeginWideMarginPadding (2);
|
||||
|
||||
/***** Table head *****/
|
||||
Asg_PutHead (&Assignments,
|
||||
true, // Only this assignment in table
|
||||
Vie_PRINT); // Print view
|
||||
Asg_PutHead (&Assignments,Asg_ONE_ASSIGMENT,Vie_PRINT);
|
||||
|
||||
/***** Write assignment *****/
|
||||
Asg_ShowAssignmentRow (&Assignments,
|
||||
true, // Only this assignment in table
|
||||
Vie_PRINT); // Print view
|
||||
Asg_ShowAssignmentRow (&Assignments,Asg_ONE_ASSIGMENT,Vie_PRINT);
|
||||
|
||||
/***** End table *****/
|
||||
HTM_TABLE_End ();
|
||||
|
@ -425,14 +430,10 @@ void Asg_ShowOneAssignmentInBox (struct Asg_Assignments *Assignments)
|
|||
HTM_TABLE_Begin ("TBL_SCROLL");
|
||||
|
||||
/***** Table head *****/
|
||||
Asg_PutHead (Assignments,
|
||||
true, // Only this assignment in table
|
||||
Vie_VIEW); // Not print view
|
||||
Asg_PutHead (Assignments,Asg_ONE_ASSIGMENT,Vie_VIEW);
|
||||
|
||||
/***** Write assignment *****/
|
||||
Asg_ShowAssignmentRow (Assignments,
|
||||
true, // Only this assignment in table
|
||||
Vie_VIEW); // Not print view
|
||||
Asg_ShowAssignmentRow (Assignments,Asg_ONE_ASSIGMENT,Vie_VIEW);
|
||||
|
||||
/***** End table *****/
|
||||
HTM_TABLE_End ();
|
||||
|
@ -467,7 +468,7 @@ static void Asg_PutIconsOneAsg (void *Assignments)
|
|||
/*****************************************************************************/
|
||||
|
||||
static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
|
||||
bool OnlyOneAssignment,
|
||||
Asg_OneOrMultiple_t OneOrMultiple,
|
||||
Vie_ViewType_t ViewType)
|
||||
{
|
||||
extern const char *Txt_Actions[ActLst_NUM_ACTIONS];
|
||||
|
@ -488,7 +489,7 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
|
|||
HTM_TR_Begin (NULL);
|
||||
|
||||
/* Forms to remove/edit this assignment */
|
||||
if (!OnlyOneAssignment)
|
||||
if (OneOrMultiple == Asg_MULTIPLE_ASSIGMENTS)
|
||||
{
|
||||
HTM_TD_Begin ("rowspan=\"2\" class=\"CONTEXT_COL %s\"",
|
||||
The_GetColorRows ());
|
||||
|
@ -768,7 +769,7 @@ static void Asg_PutIconsToRemEditOneAsg (struct Asg_Assignments *Assignments,
|
|||
Asg_PutPars,Assignments);
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkAsg,NULL,
|
||||
Asg_PutPars,Assignments);
|
||||
/* falls through */
|
||||
|
@ -1640,7 +1641,7 @@ static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod)
|
|||
case Rol_TCH:
|
||||
// Students and teachers can do assignments depending on groups
|
||||
/***** Get if I can do an assignment from database *****/
|
||||
return Asg_DB_CheckIfICanDoAssignment (AsgCod);
|
||||
return (Asg_DB_CheckIfICanDoAssignment (AsgCod) == Usr_I_CAN);
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
default:
|
||||
|
@ -1703,31 +1704,32 @@ void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg)
|
|||
/* Check if I have permission to create a file or folder into an assignment **/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg)
|
||||
Usr_ICan_t Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg)
|
||||
{
|
||||
/***** Trivial check 1: assignment is valid *****/
|
||||
if (Asg->AsgCod <= 0)
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** Check 2: Do not create anything in hidden assigments *****/
|
||||
if (Asg->HiddenOrVisible == HidVis_HIDDEN)
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** Check 3: If I do not belong to course / groups of this assignment,
|
||||
I can not create anything inside this assignment *****/
|
||||
if (!Asg->IBelongToCrsOrGrps)
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** Check 4: Depending on my role in this course... *****/
|
||||
switch (Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs)
|
||||
{
|
||||
case Rol_STD: // Students...
|
||||
case Rol_NET: // ...and non-editing teachers...
|
||||
return Asg->Open; // ...can create inside open assignments
|
||||
case Rol_TCH: // Teachers...
|
||||
return true; // ...can create inside open or closed assignments
|
||||
case Rol_STD: // Students...
|
||||
case Rol_NET: // ...and non-editing teachers...
|
||||
return Asg->Open ? Usr_I_CAN : // ...can create inside open assignments
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH: // Teachers...
|
||||
return Usr_I_CAN; // ...can create inside open or closed assignments
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -106,7 +106,7 @@ void Asg_ReceiveAssignment (void);
|
|||
void Asg_RemoveCrsAssignments (long CrsCod);
|
||||
|
||||
void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg);
|
||||
bool Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg);
|
||||
Usr_ICan_t Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg);
|
||||
void Asg_SetFolder (struct Asg_Assignment *Asg,unsigned Level);
|
||||
|
||||
unsigned Asg_GetNumAssignments (Hie_Level_t Level,unsigned *NumNotif);
|
||||
|
|
|
@ -331,7 +331,7 @@ void Asg_DB_RemoveAssignment (long AsgCod)
|
|||
/********************* Check if I can do an assignment ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Asg_DB_CheckIfICanDoAssignment (long AsgCod)
|
||||
Usr_ICan_t Asg_DB_CheckIfICanDoAssignment (long AsgCod)
|
||||
{
|
||||
// Students and teachers can do assignments depending on groups
|
||||
return
|
||||
|
@ -355,7 +355,8 @@ bool Asg_DB_CheckIfICanDoAssignment (long AsgCod)
|
|||
" AND asg_groups.GrpCod=grp_users.GrpCod)"
|
||||
"))",
|
||||
AsgCod,
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -59,7 +59,7 @@ void Asg_DB_HideOrUnhideAssignment (long AsgCod,
|
|||
|
||||
void Asg_DB_RemoveAssignment (long AsgCod);
|
||||
|
||||
bool Asg_DB_CheckIfICanDoAssignment (long AsgCod);
|
||||
Usr_ICan_t Asg_DB_CheckIfICanDoAssignment (long AsgCod);
|
||||
|
||||
unsigned Asg_DB_GetGrps (MYSQL_RES **mysql_res,long AsgCod);
|
||||
void Asg_DB_CreateGroup (long AsgCod,long GrpCod);
|
||||
|
|
|
@ -371,7 +371,7 @@ static void Att_PutIconsInListOfEvents (void *Events)
|
|||
Usr_PutParMyUsrCodEncrypted,Gbl.Usrs.Me.UsrDat.EnUsrCod);
|
||||
|
||||
/***** Put icon to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkAtt,NULL,
|
||||
Att_PutPars,Events);
|
||||
}
|
||||
|
@ -579,7 +579,7 @@ static void Att_PutFormsToRemEditOneEvent (struct Att_Events *Events,
|
|||
[HidVis_VISIBLE] = ActHidAtt, // Visible ==> action to hide
|
||||
};
|
||||
|
||||
if (Att_CheckIfICanEditEvents ())
|
||||
if (Att_CheckIfICanEditEvents () == Usr_I_CAN)
|
||||
{
|
||||
/***** Icon to remove attendance event *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemAtt,NULL,
|
||||
|
@ -591,27 +591,24 @@ static void Att_PutFormsToRemEditOneEvent (struct Att_Events *Events,
|
|||
Events->Event.HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit attendance event *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneAtt,NULL,
|
||||
Att_PutPars,Events);
|
||||
Ico_PutContextualIconToEdit (ActEdiOneAtt,NULL,Att_PutPars,Events);
|
||||
}
|
||||
|
||||
/***** Icon to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkAtt,NULL,
|
||||
Att_PutPars,Events);
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkAtt,NULL,Att_PutPars,Events);
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************* Check if I can edit calls for exams *********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Att_CheckIfICanEditEvents (void)
|
||||
Usr_ICan_t Att_CheckIfICanEditEvents (void)
|
||||
{
|
||||
static const bool ICanEditAttEvents[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanEditAttEvents[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanEditAttEvents[Gbl.Usrs.Me.Role.Logged];
|
||||
|
@ -2181,7 +2178,7 @@ static void Att_ReqListOrPrintUsrsAttendanceCrs (__attribute__((unused)) void *A
|
|||
Txt_Attendance_list,
|
||||
Hlp_USERS_Attendance_attendance_list,
|
||||
Txt_View_attendance,
|
||||
false); // Do not put form with date range
|
||||
Frm_DONT_PUT_FORM); // Do not put form with date range
|
||||
|
||||
/***** Free list of attendance events *****/
|
||||
Att_FreeListEvents (&Events);
|
||||
|
@ -2722,8 +2719,7 @@ static void Att_ListEventsToSelect (struct Att_Events *Events,
|
|||
|
||||
static void Att_PutIconToViewAttEvents (__attribute__((unused)) void *Args)
|
||||
{
|
||||
Ico_PutContextualIconToView (ActSeeAllAtt,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeAllAtt,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -2732,8 +2728,7 @@ static void Att_PutIconToViewAttEvents (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Att_PutIconToEditAttEvents (__attribute__((unused)) void *Args)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActSeeAllAtt,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActSeeAllAtt,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -2775,7 +2770,7 @@ static void Att_ListUsrsAttendanceTable (struct Att_Events *Events,
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get from the database the data of the student
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewAtt (&UsrDat))
|
||||
if (Usr_CheckIfICanViewAtt (&UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&UsrDat);
|
||||
Att_WriteRowUsrSeveralAttEvents (Events,NumUsr,&UsrDat);
|
||||
|
@ -3010,7 +3005,7 @@ static void Att_ListStdsWithAttEventsDetails (struct Att_Events *Events,
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get from the database the data of the student
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewAtt (&UsrDat))
|
||||
if (Usr_CheckIfICanViewAtt (&UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&UsrDat);
|
||||
Att_ListAttEventsForAStd (Events,NumUsr,&UsrDat);
|
||||
|
|
|
@ -85,7 +85,7 @@ struct Att_Events
|
|||
|
||||
void Att_SeeEvents (void);
|
||||
|
||||
bool Att_CheckIfICanEditEvents (void);
|
||||
Usr_ICan_t Att_CheckIfICanEditEvents (void);
|
||||
|
||||
void Att_ReqCreatOrEditEvent (void);
|
||||
bool Att_GetEventDataByCod (struct Att_Event *Event);
|
||||
|
|
|
@ -205,8 +205,7 @@ static void Ban_PutIconsListingBanners (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Ban_PutIconToEditBanners (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiBan,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiBan,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -357,8 +356,7 @@ static void Ban_GetBannerDataFromRow (MYSQL_RES *mysql_res,
|
|||
static void Ban_PutIconsEditingBanners (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view banners *****/
|
||||
Ico_PutContextualIconToView (ActSeeBan,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeBan,NULL,NULL,NULL);
|
||||
|
||||
/***** Put icon to view links *****/
|
||||
Lnk_PutIconToViewLinks ();
|
||||
|
@ -370,9 +368,7 @@ static void Ban_PutIconsEditingBanners (__attribute__((unused)) void *Args)
|
|||
|
||||
void Ban_PutIconToViewBanners (void)
|
||||
{
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeBan,NULL,
|
||||
NULL,NULL,
|
||||
"flag.svg",Ico_BLACK);
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeBan,NULL,NULL,NULL,"flag.svg",Ico_BLACK);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -447,7 +443,7 @@ static void Ban_ListBannersForEdition (struct Ban_Banners *Banners)
|
|||
Nam_ExistingShortAndFullNames (ActionRename,
|
||||
ParCod_Ban,Banners->BanCodToEdit,
|
||||
Names,
|
||||
true); // Put form
|
||||
Frm_PUT_FORM);
|
||||
|
||||
/* Banner image */
|
||||
HTM_TD_Begin ("class=\"LM\"");
|
||||
|
|
238
swad_browser.c
238
swad_browser.c
|
@ -1097,7 +1097,7 @@ static Act_Action_t Brw_ActZIPFolder[Brw_NUM_TYPES_FILE_BROWSER] =
|
|||
/***************************** Private variables *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Brw_ICanEditFileOrFolder; // Can I modify (remove, rename, create inside, etc.) a file or folder?
|
||||
Usr_ICan_t Brw_ICanEditFileOrFolder; // Can I modify (remove, rename, create inside, etc.) a file or folder?
|
||||
|
||||
/*****************************************************************************/
|
||||
/**************************** Private prototypes *****************************/
|
||||
|
@ -1213,7 +1213,7 @@ static bool Brw_CheckIfUploadIsAllowed (const char *FileType);
|
|||
static void Brw_PutIconToGetLinkToFile (void *FileMetadata);
|
||||
static void Brw_PutParsToGetLinkToFile (void *FileMetadata);
|
||||
|
||||
static bool Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner);
|
||||
static Usr_ICan_t Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner);
|
||||
static bool Brw_CheckIfIAmOwnerOfFile (long PublisherUsrCod);
|
||||
static void Brw_WriteBigLinkToDownloadFile (const char *URL,
|
||||
struct Brw_FileMetadata *FileMetadata,
|
||||
|
@ -1233,15 +1233,15 @@ static unsigned Brw_GetFileViewsFromMe (long FilCod);
|
|||
static void Brw_RemoveOneFileOrFolderFromDB (const char Path[PATH_MAX + 1]);
|
||||
static void Brw_RemoveChildrenOfFolderFromDB (const char Path[PATH_MAX + 1]);
|
||||
|
||||
static void Brw_SetIfICanEditFileOrFolder (bool Value);
|
||||
static bool Brw_GetIfICanEditFileOrFolder (void);
|
||||
static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level);
|
||||
static void Brw_SetIfICanEditFileOrFolder (Usr_ICan_t Value);
|
||||
static Usr_ICan_t Brw_GetIfICanEditFileOrFolder (void);
|
||||
static Usr_ICan_t Brw_CheckIfICanEditFileOrFolder (unsigned Level);
|
||||
|
||||
static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level);
|
||||
static bool Brw_CheckIfICanModifySharedFileOrFolder (void);
|
||||
static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void);
|
||||
static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void);
|
||||
static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void);
|
||||
static Usr_ICan_t Brw_CheckIfICanCreateIntoFolder (unsigned Level);
|
||||
static Usr_ICan_t Brw_CheckIfICanModifySharedFileOrFolder (void);
|
||||
static Usr_ICan_t Brw_CheckIfICanModifyPrivateFileOrFolder (void);
|
||||
static Usr_ICan_t Brw_CheckIfICanModifyPrjDocFileOrFolder (void);
|
||||
static Usr_ICan_t Brw_CheckIfICanModifyPrjAssFileOrFolder (void);
|
||||
|
||||
static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row);
|
||||
|
||||
|
@ -2711,7 +2711,7 @@ static void Brw_AskEditWorksCrsInternal (__attribute__((unused)) void *Args)
|
|||
Txt_Assignments_and_other_works,
|
||||
Hlp_FILES_Homework_for_teachers,
|
||||
Txt_View_homework,
|
||||
false); // Do not put form with date range
|
||||
Frm_DONT_PUT_FORM); // Do not put form with date range
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -2744,7 +2744,7 @@ void Brw_ShowFileBrowserProject (long PrjCod)
|
|||
|
||||
Brw_WriteTopBeforeShowingFileBrowser ();
|
||||
|
||||
if (Prj_CheckIfICanViewProjectDocuments (PrjCod))
|
||||
if (Prj_CheckIfICanViewProjectDocuments (PrjCod) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show the tree with the project documents *****/
|
||||
Gbl.FileBrowser.Type = Brw_ADMI_DOC_PRJ;
|
||||
|
@ -2752,7 +2752,7 @@ void Brw_ShowFileBrowserProject (long PrjCod)
|
|||
Brw_ShowFileBrowser ();
|
||||
}
|
||||
|
||||
if (Prj_CheckIfICanViewProjectAssessment (PrjCod))
|
||||
if (Prj_CheckIfICanViewProjectAssessment (PrjCod) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show the tree with the project assessment *****/
|
||||
Gbl.FileBrowser.Type = Brw_ADMI_ASS_PRJ;
|
||||
|
@ -2798,7 +2798,7 @@ static void Brw_ShowFileBrowsersAsgWrkCrs (void)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewAsgWrk (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewAsgWrk (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
Gbl.Usrs.Other.UsrDat.Accepted =
|
||||
Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
|
@ -3333,7 +3333,7 @@ static void Brw_PutIconsFileBrowser (__attribute__((unused)) void *Args)
|
|||
|
||||
/***** Put icon to get resource link *****/
|
||||
if (Brw_ActReqLnk[Gbl.FileBrowser.Type] != ActUnk &&
|
||||
Rsc_CheckIfICanGetLink ())
|
||||
Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (Brw_ActReqLnk[Gbl.FileBrowser.Type],NULL,
|
||||
NULL,NULL);
|
||||
|
||||
|
@ -3997,7 +3997,7 @@ static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
|
|||
}
|
||||
|
||||
/****** If current action allows file administration... ******/
|
||||
Brw_SetIfICanEditFileOrFolder (false);
|
||||
Brw_SetIfICanEditFileOrFolder (Usr_I_CAN_NOT);
|
||||
if (Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type) &&
|
||||
!Gbl.FileBrowser.ShowOnlyPublicFiles)
|
||||
{
|
||||
|
@ -4155,7 +4155,7 @@ static bool Brw_CheckIfCanPasteIn (unsigned Level)
|
|||
return false;
|
||||
|
||||
/**** If I can not create elements into this folder... *****/
|
||||
if (!Brw_CheckIfICanCreateIntoFolder (Level))
|
||||
if (Brw_CheckIfICanCreateIntoFolder (Level) == Usr_I_CAN_NOT)
|
||||
return false; // Pasting into top level of assignments is forbidden
|
||||
|
||||
/**** If we are in the same tree of the clipboard... *****/
|
||||
|
@ -4182,7 +4182,7 @@ static void Brw_PutIconRemove (void)
|
|||
{
|
||||
HTM_TD_Begin ("class=\"BM %s\"",The_GetColorRows ());
|
||||
|
||||
if (Brw_GetIfICanEditFileOrFolder ()) // Can I remove this?
|
||||
if (Brw_GetIfICanEditFileOrFolder () == Usr_I_CAN) // Can I remove this?
|
||||
switch (Gbl.FileBrowser.FilFolLnk.Type)
|
||||
{
|
||||
case Brw_IS_FILE:
|
||||
|
@ -4459,13 +4459,11 @@ static void Brw_PutIconFolder (unsigned Level,
|
|||
const char *FileBrowserId,const char *RowId,
|
||||
Brw_IconTree_t IconSubtree)
|
||||
{
|
||||
bool ICanCreate;
|
||||
|
||||
/***** Begin cell *****/
|
||||
HTM_TD_Begin ("class=\"BM %s\"",The_GetColorRows ());
|
||||
|
||||
/***** Put icon to create a new file or folder *****/
|
||||
if ((ICanCreate = Brw_CheckIfICanCreateIntoFolder (Level))) // I can create a new file or folder
|
||||
if (Brw_CheckIfICanCreateIntoFolder (Level) == Usr_I_CAN) // I can create a new file or folder
|
||||
{
|
||||
if (IconSubtree == Brw_ICON_TREE_EXPAND)
|
||||
{
|
||||
|
@ -4721,7 +4719,7 @@ static void Brw_WriteFileName (unsigned Level,bool IsPublic,
|
|||
|
||||
HTM_NBSP ();
|
||||
|
||||
if (Brw_GetIfICanEditFileOrFolder ()) // Can I rename this folder?
|
||||
if (Brw_GetIfICanEditFileOrFolder () == Usr_I_CAN) // Can I rename this folder?
|
||||
{
|
||||
/***** Form to rename folder *****/
|
||||
Frm_BeginForm (Brw_ActRenameFolder[Gbl.FileBrowser.Type]);
|
||||
|
@ -4935,7 +4933,7 @@ void Brw_AskRemFileFromTree (void)
|
|||
Brw_GetParAndInitFileBrowser ();
|
||||
|
||||
/***** Button of confirmation of removing *****/
|
||||
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this file?
|
||||
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) // Can I remove this file?
|
||||
{
|
||||
/***** Show question and button to remove file/link *****/
|
||||
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
|
||||
|
@ -4970,7 +4968,7 @@ void Brw_RemFileFromTree (void)
|
|||
/***** Get parameters related to file browser *****/
|
||||
Brw_GetParAndInitFileBrowser ();
|
||||
|
||||
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this file?
|
||||
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) // Can I remove this file?
|
||||
{
|
||||
snprintf (Path,sizeof (Path),"%s/%s",
|
||||
Gbl.FileBrowser.Path.AboveRootFolder,
|
||||
|
@ -5023,7 +5021,7 @@ void Brw_RemFolderFromTree (void)
|
|||
/***** Get parameters related to file browser *****/
|
||||
Brw_GetParAndInitFileBrowser ();
|
||||
|
||||
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this folder?
|
||||
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) // Can I remove this folder?
|
||||
{
|
||||
snprintf (Path,sizeof (Path),"%s/%s",
|
||||
Gbl.FileBrowser.Path.AboveRootFolder,
|
||||
|
@ -5089,7 +5087,7 @@ void Brw_RemSubtreeInFileBrowser (void)
|
|||
/***** Get parameters related to file browser *****/
|
||||
Brw_GetParAndInitFileBrowser ();
|
||||
|
||||
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I remove this subtree?
|
||||
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) // Can I remove this subtree?
|
||||
{
|
||||
snprintf (Path,sizeof (Path),"%s/%s",
|
||||
Gbl.FileBrowser.Path.AboveRootFolder,
|
||||
|
@ -6191,7 +6189,7 @@ void Brw_ShowFormFileBrowser (void)
|
|||
Brw_GetParAndInitFileBrowser ();
|
||||
|
||||
/***** Check if creating a new folder or file is allowed *****/
|
||||
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level))
|
||||
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level) == Usr_I_CAN)
|
||||
{
|
||||
/***** Name of the folder to be shown ****/
|
||||
Brw_GetFileNameToShowDependingOnLevel (Gbl.FileBrowser.Type,
|
||||
|
@ -6487,7 +6485,7 @@ void Brw_RecFolderFileBrowser (void)
|
|||
Brw_GetParAndInitFileBrowser ();
|
||||
|
||||
/***** Check if creating a new folder is allowed *****/
|
||||
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level))
|
||||
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level) == Usr_I_CAN)
|
||||
{
|
||||
if (Str_ConvertFilFolLnkNameToValid (Gbl.FileBrowser.NewFilFolLnkName))
|
||||
{
|
||||
|
@ -6587,7 +6585,7 @@ void Brw_RenFolderFileBrowser (void)
|
|||
/***** Get parameters related to file browser *****/
|
||||
Brw_GetParAndInitFileBrowser ();
|
||||
|
||||
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level)) // Can I rename this folder?
|
||||
if (Brw_CheckIfICanEditFileOrFolder (Gbl.FileBrowser.Level) == Usr_I_CAN) // Can I rename this folder?
|
||||
{
|
||||
if (Str_ConvertFilFolLnkNameToValid (Gbl.FileBrowser.NewFilFolLnkName))
|
||||
{
|
||||
|
@ -6758,7 +6756,7 @@ static bool Brw_RcvFileInFileBrw (struct BrwSiz_BrowserSize *Size,
|
|||
Brw_GetParAndInitFileBrowser ();
|
||||
|
||||
/***** Check if creating a new file is allowed *****/
|
||||
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level))
|
||||
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level) == Usr_I_CAN)
|
||||
{
|
||||
/***** First, we save in disk the file received *****/
|
||||
Par = Fil_StartReceptionOfFile (Fil_NAME_OF_PARAM_FILENAME_ORG,
|
||||
|
@ -6938,7 +6936,7 @@ void Brw_RecLinkFileBrowser (void)
|
|||
Brw_GetParAndInitFileBrowser ();
|
||||
|
||||
/***** Check if creating a new link is allowed *****/
|
||||
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level))
|
||||
if (Brw_CheckIfICanCreateIntoFolder (Gbl.FileBrowser.Level) == Usr_I_CAN)
|
||||
{
|
||||
/***** Create a new file to store URL ****/
|
||||
Par_GetParText ("NewLinkURL",URL,PATH_MAX);
|
||||
|
@ -7259,9 +7257,9 @@ void Brw_ShowFileMetadata (void)
|
|||
char URL[PATH_MAX + 1];
|
||||
char FileSizeStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1];
|
||||
bool Found;
|
||||
bool ICanView = false;
|
||||
Usr_ICan_t ICanView = Usr_I_CAN_NOT;
|
||||
bool IAmTheOwner;
|
||||
bool ICanEdit;
|
||||
Usr_ICan_t ICanEdit;
|
||||
bool ICanChangePublic = false;
|
||||
bool FileHasPublisher;
|
||||
Brw_License_t License;
|
||||
|
@ -7285,32 +7283,36 @@ void Brw_ShowFileMetadata (void)
|
|||
|
||||
/***** Check if I can view this file.
|
||||
It could be marked as hidden or in a hidden folder *****/
|
||||
ICanView = true;
|
||||
ICanView = Usr_I_CAN;
|
||||
switch (Gbl.FileBrowser.Type)
|
||||
{
|
||||
case Brw_SHOW_DOC_INS:
|
||||
if (Gbl.Usrs.Me.Role.Logged < Rol_INS_ADM)
|
||||
ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata);
|
||||
ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT :
|
||||
Usr_I_CAN;
|
||||
break;
|
||||
case Brw_SHOW_DOC_CTR:
|
||||
if (Gbl.Usrs.Me.Role.Logged < Rol_CTR_ADM)
|
||||
ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata);
|
||||
ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT :
|
||||
Usr_I_CAN;
|
||||
break;
|
||||
case Brw_SHOW_DOC_DEG:
|
||||
if (Gbl.Usrs.Me.Role.Logged < Rol_DEG_ADM)
|
||||
ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata);
|
||||
ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT :
|
||||
Usr_I_CAN;
|
||||
break;
|
||||
case Brw_SHOW_DOC_CRS:
|
||||
case Brw_SHOW_DOC_GRP:
|
||||
if (Gbl.Usrs.Me.Role.Logged < Rol_TCH)
|
||||
ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata);
|
||||
ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT :
|
||||
Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ICanView)
|
||||
if (ICanView == Usr_I_CAN)
|
||||
{
|
||||
if (FileMetadata.FilFolLnk.Type == Brw_IS_FILE ||
|
||||
FileMetadata.FilFolLnk.Type == Brw_IS_LINK)
|
||||
|
@ -7354,7 +7356,7 @@ void Brw_ShowFileMetadata (void)
|
|||
if (Brw_ActReqLnk[Gbl.FileBrowser.Type] != ActUnk &&
|
||||
(FileMetadata.FilFolLnk.Type == Brw_IS_FILE || // Only files or links
|
||||
FileMetadata.FilFolLnk.Type == Brw_IS_LINK) &&
|
||||
Rsc_CheckIfICanGetLink ())
|
||||
Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Box_BoxShadowBegin (NULL,Brw_PutIconToGetLinkToFile,&FileMetadata,
|
||||
NULL);
|
||||
else
|
||||
|
@ -7363,7 +7365,7 @@ void Brw_ShowFileMetadata (void)
|
|||
|
||||
|
||||
/***** Begin form to update the metadata of a file *****/
|
||||
if (ICanEdit) // I can edit file properties
|
||||
if (ICanEdit == Usr_I_CAN) // I can edit file properties
|
||||
{
|
||||
/* Can the file be public? */
|
||||
switch (Gbl.FileBrowser.Type)
|
||||
|
@ -7507,14 +7509,14 @@ void Brw_ShowFileMetadata (void)
|
|||
HTM_TR_Begin (NULL);
|
||||
|
||||
/* Label */
|
||||
Frm_LabelColumn ("RT",ICanEdit ? "License" :
|
||||
NULL,
|
||||
Frm_LabelColumn ("RT",ICanEdit == Usr_I_CAN ? "License" :
|
||||
NULL,
|
||||
Txt_License);
|
||||
|
||||
/* Data */
|
||||
HTM_TD_Begin ("class=\"LT DAT_STRONG_%s\"",
|
||||
The_GetSuffix ());
|
||||
if (ICanEdit) // I can edit file properties
|
||||
if (ICanEdit == Usr_I_CAN) // I can edit file properties
|
||||
{
|
||||
HTM_SELECT_Begin (HTM_DONT_SUBMIT_ON_CHANGE,NULL,
|
||||
"id=\"License\" name=\"License\" class=\"LICENSE\"");
|
||||
|
@ -7584,7 +7586,7 @@ void Brw_ShowFileMetadata (void)
|
|||
HTM_TABLE_End ();
|
||||
|
||||
/***** End form *****/
|
||||
if (ICanEdit) // I can edit file properties
|
||||
if (ICanEdit == Usr_I_CAN) // I can edit file properties
|
||||
{
|
||||
Btn_PutButton (Btn_CONFIRM_BUTTON,Txt_Save_file_properties);
|
||||
Frm_EndForm ();
|
||||
|
@ -7628,7 +7630,7 @@ void Brw_ShowFileMetadata (void)
|
|||
/***** Add paths until file to table of expanded folders *****/
|
||||
Brw_InsFoldersInPathAndUpdOtherFoldersInExpandedFolders (Gbl.FileBrowser.FilFolLnk.Path);
|
||||
}
|
||||
else // !ICanView
|
||||
else // ICanView == Usr_I_CAN_NOT
|
||||
{
|
||||
/***** Mark possible notifications about non visible file as removed *****/
|
||||
switch (Gbl.FileBrowser.Type)
|
||||
|
@ -7741,7 +7743,7 @@ void Brw_DownloadFile (void)
|
|||
struct Brw_FileMetadata FileMetadata;
|
||||
char URL[PATH_MAX + 1];
|
||||
bool Found;
|
||||
bool ICanView = false;
|
||||
Usr_ICan_t ICanView = Usr_I_CAN_NOT;
|
||||
|
||||
/***** Get parameters related to file browser *****/
|
||||
Brw_GetParAndInitFileBrowser ();
|
||||
|
@ -7760,32 +7762,36 @@ void Brw_DownloadFile (void)
|
|||
|
||||
/***** Check if I can view this file.
|
||||
It could be marked as hidden or in a hidden folder *****/
|
||||
ICanView = true;
|
||||
ICanView = Usr_I_CAN;
|
||||
switch (Gbl.FileBrowser.Type)
|
||||
{
|
||||
case Brw_SHOW_DOC_INS:
|
||||
if (Gbl.Usrs.Me.Role.Logged < Rol_INS_ADM)
|
||||
ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata);
|
||||
ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT :
|
||||
Usr_I_CAN;
|
||||
break;
|
||||
case Brw_SHOW_DOC_CTR:
|
||||
if (Gbl.Usrs.Me.Role.Logged < Rol_CTR_ADM)
|
||||
ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata);
|
||||
ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT :
|
||||
Usr_I_CAN;
|
||||
break;
|
||||
case Brw_SHOW_DOC_DEG:
|
||||
if (Gbl.Usrs.Me.Role.Logged < Rol_DEG_ADM)
|
||||
ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata);
|
||||
ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT :
|
||||
Usr_I_CAN;
|
||||
break;
|
||||
case Brw_SHOW_DOC_CRS:
|
||||
case Brw_SHOW_DOC_GRP:
|
||||
if (Gbl.Usrs.Me.Role.Logged < Rol_TCH)
|
||||
ICanView = !Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata);
|
||||
ICanView = Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingMetadata (&FileMetadata) ? Usr_I_CAN_NOT :
|
||||
Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ICanView)
|
||||
if (ICanView == Usr_I_CAN)
|
||||
{
|
||||
if (FileMetadata.FilFolLnk.Type == Brw_IS_FILE ||
|
||||
FileMetadata.FilFolLnk.Type == Brw_IS_LINK)
|
||||
|
@ -7845,7 +7851,7 @@ void Brw_DownloadFile (void)
|
|||
Gbl.Layout.DivsEndWritten =
|
||||
Gbl.Layout.HTMLEndWritten = true; // Don't write HTML at all
|
||||
}
|
||||
else // !ICanView
|
||||
else // ICanView == Usr_I_CAN_NOT
|
||||
{
|
||||
/***** Mark possible notifications about non visible file as removed *****/
|
||||
switch (Gbl.FileBrowser.Type)
|
||||
|
@ -7889,7 +7895,7 @@ void Brw_DownloadFile (void)
|
|||
/*********** Check if I have permission to change file metadata **************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner)
|
||||
static Usr_ICan_t Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner)
|
||||
{
|
||||
switch (Gbl.Action.Act) // Only in actions where edition is allowed
|
||||
{
|
||||
|
@ -7918,9 +7924,10 @@ static bool Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner)
|
|||
case ActReqDatWrkUsr: case ActChgDatWrkUsr:
|
||||
|
||||
case ActReqDatBrf: case ActChgDatBrf:
|
||||
return IAmTheOwner;
|
||||
return IAmTheOwner ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8089,7 +8096,7 @@ void Brw_ChgFileMetadata (void)
|
|||
{
|
||||
/***** Check if I can change file metadata *****/
|
||||
IAmTheOwner = Brw_CheckIfIAmOwnerOfFile (FileMetadata.PublisherUsrCod);
|
||||
if (!Brw_CheckIfICanEditFileMetadata (IAmTheOwner))
|
||||
if (Brw_CheckIfICanEditFileMetadata (IAmTheOwner) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Check if the file was public before the edition *****/
|
||||
|
@ -8658,37 +8665,40 @@ static void Brw_RemoveChildrenOfFolderFromDB (const char Path[PATH_MAX + 1])
|
|||
/********** Check if I have permission to modify a file or folder ************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void Brw_SetIfICanEditFileOrFolder (bool Value)
|
||||
static void Brw_SetIfICanEditFileOrFolder (Usr_ICan_t Value)
|
||||
{
|
||||
Brw_ICanEditFileOrFolder = Value;
|
||||
}
|
||||
|
||||
static bool Brw_GetIfICanEditFileOrFolder (void)
|
||||
static Usr_ICan_t Brw_GetIfICanEditFileOrFolder (void)
|
||||
{
|
||||
return Brw_ICanEditFileOrFolder;
|
||||
}
|
||||
|
||||
static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level)
|
||||
static Usr_ICan_t Brw_CheckIfICanEditFileOrFolder (unsigned Level)
|
||||
{
|
||||
/***** Level 0 (root folder) can not be removed/renamed *****/
|
||||
if (Level == 0)
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** I must be student or a superior role to edit *****/
|
||||
if (Gbl.Usrs.Me.Role.Max < Rol_STD)
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** Set depending on browser, level, logged role... *****/
|
||||
switch (Gbl.FileBrowser.Type)
|
||||
{
|
||||
case Brw_ADMI_DOC_CRS:
|
||||
return Gbl.Usrs.Me.Role.Logged >= Rol_TCH;
|
||||
return (Gbl.Usrs.Me.Role.Logged >= Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Brw_ADMI_DOC_GRP:
|
||||
if (Gbl.Usrs.Me.Role.Logged == Rol_TCH) // A teacher...
|
||||
// ...can edit only if he/she belongs to group
|
||||
return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod);
|
||||
return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
// An administrator can edit
|
||||
return (Gbl.Usrs.Me.Role.Logged > Rol_TCH);
|
||||
return (Gbl.Usrs.Me.Role.Logged > Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Brw_ADMI_TCH_CRS:
|
||||
case Brw_ADMI_TCH_GRP:
|
||||
// Check if I am the publisher of the file/folder
|
||||
|
@ -8701,7 +8711,7 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level)
|
|||
case Brw_ADMI_ASG_CRS:
|
||||
if (Gbl.FileBrowser.FilFolLnk.Type == Brw_IS_FOLDER && // The main folder of an assignment
|
||||
Level == 1)
|
||||
return false; // Do not remove / rename main folder of assigment
|
||||
return Usr_I_CAN_NOT; // Do not remove / rename main folder of assigment
|
||||
|
||||
return Asg_CheckIfICanCreateIntoAssigment (&Gbl.FileBrowser.Asg);
|
||||
case Brw_ADMI_DOC_PRJ:
|
||||
|
@ -8709,7 +8719,8 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level)
|
|||
case Brw_ADMI_ASS_PRJ:
|
||||
return Brw_CheckIfICanModifyPrjAssFileOrFolder ();
|
||||
default:
|
||||
return Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type);
|
||||
return Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -8718,59 +8729,68 @@ static bool Brw_CheckIfICanEditFileOrFolder (unsigned Level)
|
|||
/**** Check if I have permission to create a file or folder into a folder ****/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level)
|
||||
static Usr_ICan_t Brw_CheckIfICanCreateIntoFolder (unsigned Level)
|
||||
{
|
||||
/***** If not in a folder... *****/
|
||||
if (Gbl.FileBrowser.FilFolLnk.Type != Brw_IS_FOLDER)
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** I must be student, teacher, admin or superuser to edit *****/
|
||||
if (Gbl.Usrs.Me.Role.Max < Rol_STD)
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** If maximum level is reached, I can not create/paste *****/
|
||||
if (Level >= BrwSiz_MAX_DIR_LEVELS)
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** Have I permission to create/paste a new file or folder into the folder? *****/
|
||||
switch (Gbl.FileBrowser.Type)
|
||||
{
|
||||
case Brw_ADMI_DOC_CRS:
|
||||
return Gbl.Usrs.Me.Role.Logged >= Rol_TCH;
|
||||
return (Gbl.Usrs.Me.Role.Logged >= Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Brw_ADMI_DOC_GRP:
|
||||
if (Gbl.Usrs.Me.Role.Logged == Rol_TCH) // A teacher
|
||||
// ...can create/paste only if he/she belongs to group
|
||||
return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod);
|
||||
return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
// An administrator can create/paste
|
||||
return (Gbl.Usrs.Me.Role.Logged > Rol_TCH);
|
||||
return (Gbl.Usrs.Me.Role.Logged > Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Brw_ADMI_TCH_CRS:
|
||||
return Gbl.Usrs.Me.Role.Logged >= Rol_NET;
|
||||
return (Gbl.Usrs.Me.Role.Logged >= Rol_NET) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Brw_ADMI_TCH_GRP:
|
||||
if (Gbl.Usrs.Me.Role.Logged == Rol_NET || // A non-editing teacher...
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_TCH) // ...or a teacher
|
||||
// ...can create/paste only if he/she belongs to group
|
||||
return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod);
|
||||
return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
// An administrator can create/paste
|
||||
return (Gbl.Usrs.Me.Role.Logged > Rol_TCH);
|
||||
return (Gbl.Usrs.Me.Role.Logged > Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Brw_ADMI_SHR_CRS:
|
||||
return Gbl.Usrs.Me.Role.Logged >= Rol_STD;
|
||||
return (Gbl.Usrs.Me.Role.Logged >= Rol_STD) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Brw_ADMI_SHR_GRP:
|
||||
if (Gbl.Usrs.Me.Role.Logged >= Rol_STD && // A student, non-editing teacher...
|
||||
Gbl.Usrs.Me.Role.Logged <= Rol_TCH) // ...or a teacher
|
||||
// ...can create/paste only if he/she belongs to group
|
||||
return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod);
|
||||
return Grp_GetIfIBelongToGrp (Gbl.Crs.Grps.GrpCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
// An administrator can create/paste
|
||||
return Gbl.Usrs.Me.Role.Logged >= Rol_STD;
|
||||
return (Gbl.Usrs.Me.Role.Logged >= Rol_STD) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Brw_ADMI_ASG_USR:
|
||||
case Brw_ADMI_ASG_CRS:
|
||||
if (Level == 0) // If root folder
|
||||
return false; // Folders of assigments (level 1)
|
||||
// can only be created automatically
|
||||
if (Level == 0) // If root folder
|
||||
return Usr_I_CAN_NOT; // Folders of assigments (level 1)
|
||||
// can only be created automatically
|
||||
return Asg_CheckIfICanCreateIntoAssigment (&Gbl.FileBrowser.Asg);
|
||||
default:
|
||||
return Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type);
|
||||
return Brw_CheckIfFileBrowserIsEditable (Gbl.FileBrowser.Type) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -8779,7 +8799,7 @@ static bool Brw_CheckIfICanCreateIntoFolder (unsigned Level)
|
|||
|
||||
bool Brw_CheckIfFileBrowserIsEditable (Brw_FileBrowser_t FileBrowser)
|
||||
{
|
||||
static const bool Brw_FileBrowserIsEditable[Brw_NUM_TYPES_FILE_BROWSER] =
|
||||
static bool Brw_FileBrowserIsEditable[Brw_NUM_TYPES_FILE_BROWSER] =
|
||||
{
|
||||
[Brw_UNKNOWN ] = false,
|
||||
[Brw_SHOW_DOC_CRS] = false,
|
||||
|
@ -8823,42 +8843,42 @@ bool Brw_CheckIfFileBrowserIsEditable (Brw_FileBrowser_t FileBrowser)
|
|||
// I can remove or rename a file if I am the publisher
|
||||
// I can remove or rename a folder if I am the unique publisher of all files and folders in the subtree starting there
|
||||
|
||||
static bool Brw_CheckIfICanModifySharedFileOrFolder (void)
|
||||
static Usr_ICan_t Brw_CheckIfICanModifySharedFileOrFolder (void)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD: // If I am a student or a non-editing teacher...
|
||||
case Rol_NET: // ...I can modify the file/folder if I am the publisher
|
||||
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full)); // Am I the publisher of subtree?
|
||||
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT); // Am I the publisher of subtree?
|
||||
case Rol_TCH:
|
||||
case Rol_DEG_ADM:
|
||||
case Rol_CTR_ADM:
|
||||
case Rol_INS_ADM:
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void)
|
||||
static Usr_ICan_t Brw_CheckIfICanModifyPrivateFileOrFolder (void)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_NET: // If I am a student or a non-editing teacher...
|
||||
// ...I can modify the file/folder if I am the publisher
|
||||
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full)); // Am I the publisher of subtree?
|
||||
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT); // Am I the publisher of subtree?
|
||||
case Rol_TCH:
|
||||
case Rol_DEG_ADM:
|
||||
case Rol_CTR_ADM:
|
||||
case Rol_INS_ADM:
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -8869,22 +8889,22 @@ static bool Brw_CheckIfICanModifyPrivateFileOrFolder (void)
|
|||
// I can remove or rename a file if I am the publisher
|
||||
// I can remove or rename a folder if I am the unique publisher of all files and folders in the subtree starting there
|
||||
|
||||
static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void)
|
||||
static Usr_ICan_t Brw_CheckIfICanModifyPrjDocFileOrFolder (void)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD:
|
||||
case Rol_NET:
|
||||
if (Prj_GetMyRolesInProject (Prj_GetPrjCod ())) // I am a member
|
||||
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full)); // Am I the publisher of subtree?
|
||||
return false;
|
||||
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT); // Am I the publisher of subtree?
|
||||
return Usr_I_CAN_NOT;
|
||||
case Rol_TCH: // Editing teachers in a course can access to all files
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -8895,7 +8915,7 @@ static bool Brw_CheckIfICanModifyPrjDocFileOrFolder (void)
|
|||
// I can remove or rename a file if I am the publisher
|
||||
// I can remove or rename a folder if I am the unique publisher of all files and folders in the subtree starting there
|
||||
|
||||
static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void)
|
||||
static Usr_ICan_t Brw_CheckIfICanModifyPrjAssFileOrFolder (void)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
|
@ -8903,15 +8923,15 @@ static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void)
|
|||
case Rol_NET:
|
||||
if ((Prj_GetMyRolesInProject (Prj_GetPrjCod ()) & (1 << Prj_ROLE_TUT | // Tutor...
|
||||
1 << Prj_ROLE_EVL))) // ...or evaluator
|
||||
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full)); // Am I the publisher of subtree?
|
||||
return false;
|
||||
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT); // Am I the publisher of subtree?
|
||||
return Usr_I_CAN_NOT;
|
||||
case Rol_TCH: // Editing teachers in a course can access to all files
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -60,7 +60,7 @@ static struct Bld_Building *Bld_EditingBuilding = NULL; // Static variable to ke
|
|||
/*****************************************************************************/
|
||||
|
||||
static Bld_Order_t Bld_GetParBuildingOrder (void);
|
||||
static bool Bld_CheckIfICanCreateBuildings (void);
|
||||
static Usr_ICan_t Bld_CheckIfICanCreateBuildings (void);
|
||||
static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args);
|
||||
static void Bld_PutIconToEditBuildings (void);
|
||||
static void Bld_PutIconsEditingBuildings (__attribute__((unused)) void *Args);
|
||||
|
@ -196,9 +196,10 @@ static Bld_Order_t Bld_GetParBuildingOrder (void)
|
|||
/********************* Check if I can create buildings ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Bld_CheckIfICanCreateBuildings (void)
|
||||
static Usr_ICan_t Bld_CheckIfICanCreateBuildings (void)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM;
|
||||
return (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -208,7 +209,7 @@ static bool Bld_CheckIfICanCreateBuildings (void)
|
|||
static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit buildings *****/
|
||||
if (Bld_CheckIfICanCreateBuildings ())
|
||||
if (Bld_CheckIfICanCreateBuildings () == Usr_I_CAN)
|
||||
Bld_PutIconToEditBuildings ();
|
||||
}
|
||||
|
||||
|
@ -218,8 +219,7 @@ static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Bld_PutIconToEditBuildings (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiBld,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiBld,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -275,8 +275,7 @@ static void Bld_EditBuildingsInternal (void)
|
|||
static void Bld_PutIconsEditingBuildings (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view buildings *****/
|
||||
Ico_PutContextualIconToView (ActSeeBld,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeBld,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -435,7 +434,7 @@ static void Bld_ListBuildingsForEdition (const struct Bld_Buildings *Buildings)
|
|||
Nam_ExistingShortAndFullNames (ActionRename,
|
||||
ParCod_Bld,Building->BldCod,
|
||||
Names,
|
||||
true); // Put form
|
||||
Frm_PUT_FORM);
|
||||
|
||||
/* Building location */
|
||||
HTM_TD_Begin ("class=\"LM\"");
|
||||
|
|
|
@ -56,7 +56,7 @@ extern struct Globals Gbl;
|
|||
/***************************** Public constants ******************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
const bool Cal_DayIsValidAsFirstDayOfWeek[7] =
|
||||
bool Cal_DayIsValidAsFirstDayOfWeek[7] =
|
||||
{
|
||||
[0] = true, // monday
|
||||
[1] = false, // tuesday
|
||||
|
@ -332,7 +332,7 @@ void Cal_PutIconToSeeCalendar (void)
|
|||
|
||||
void Cal_GetAndShowNumUsrsPerFirstDayOfWeek (void)
|
||||
{
|
||||
extern const bool Cal_DayIsValidAsFirstDayOfWeek[7];
|
||||
extern bool Cal_DayIsValidAsFirstDayOfWeek[7];
|
||||
extern const char *Hlp_ANALYTICS_Figures_calendar;
|
||||
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
|
||||
extern const char *Txt_Calendar;
|
||||
|
|
|
@ -675,13 +675,12 @@ static void Cfe_ListCallsForExams (struct Cfe_CallsForExams *CallsForExams,
|
|||
static void Cfe_PutIconsCallsForExams (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Icon to create a new call for exam *****/
|
||||
if (Cfe_CheckIfICanEditCallsForExams ())
|
||||
if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToAdd (ActEdiCfe,NULL,NULL,NULL);
|
||||
|
||||
/***** Icon to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL,
|
||||
NULL,NULL);
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1465,7 +1464,7 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams)
|
|||
|
||||
if (CallsForExams)
|
||||
{
|
||||
if (Cfe_CheckIfICanEditCallsForExams ())
|
||||
if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN)
|
||||
{
|
||||
/***** Icon to remove call for exam *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemCfe,NULL,
|
||||
|
@ -1499,7 +1498,7 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams)
|
|||
&((struct Cfe_CallsForExams *) CallsForExams)->ExaCod);
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL,
|
||||
Cfe_PutParExaCod,
|
||||
&((struct Cfe_CallsForExams *) CallsForExams)->ExaCod);
|
||||
|
@ -1510,12 +1509,12 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams)
|
|||
/******************* Check if I can edit calls for exams *********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Cfe_CheckIfICanEditCallsForExams (void)
|
||||
Usr_ICan_t Cfe_CheckIfICanEditCallsForExams (void)
|
||||
{
|
||||
static const bool ICanEditCallsForExams[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanEditCallsForExams[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanEditCallsForExams[Gbl.Usrs.Me.Role.Logged];
|
||||
|
|
|
@ -129,7 +129,7 @@ void Cfe_ListCallsForExamsDay (void);
|
|||
|
||||
void Cfe_CreateListCallsForExams (struct Cfe_CallsForExams *CallsForExams);
|
||||
|
||||
bool Cfe_CheckIfICanEditCallsForExams (void);
|
||||
Usr_ICan_t Cfe_CheckIfICanEditCallsForExams (void);
|
||||
|
||||
void Cfe_GetSummaryAndContentCallForExam (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
|
||||
char **ContentStr,
|
||||
|
|
|
@ -85,7 +85,7 @@ unsigned Cfe_DB_GetCallsForExamsInCurrentCrs (MYSQL_RES **mysql_res)
|
|||
char SubQueryStatus[64];
|
||||
|
||||
/***** Build subquery about status depending on my role *****/
|
||||
if (Cfe_CheckIfICanEditCallsForExams ())
|
||||
if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN)
|
||||
sprintf (SubQueryStatus,"Status<>%u",
|
||||
(unsigned) Cfe_DELETED_CALL_FOR_EXAM);
|
||||
else
|
||||
|
|
|
@ -89,7 +89,7 @@ static void Ctr_GetCoordFromRow (MYSQL_RES *mysql_res,
|
|||
struct Map_Coordinates *Coord);
|
||||
|
||||
static void Ctr_ListCentersForEdition (const struct Plc_Places *Places);
|
||||
static bool Ctr_CheckIfICanEditACenter (struct Hie_Node *Ctr);
|
||||
static Usr_ICan_t Ctr_CheckIfICanEditACenter (struct Hie_Node *Ctr);
|
||||
|
||||
static void Ctr_ShowAlertAndButtonToGoToCtr (void);
|
||||
|
||||
|
@ -289,7 +289,7 @@ static void Ctr_ListCenters (void)
|
|||
static void Ctr_PutIconsListingCenters (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit centers *****/
|
||||
if (Hie_CheckIfICanEdit ())
|
||||
if (Hie_CheckIfICanEdit () == Usr_I_CAN)
|
||||
Ctr_PutIconToEditCenters ();
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
|
@ -302,8 +302,7 @@ static void Ctr_PutIconsListingCenters (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Ctr_PutIconToEditCenters (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiCtr,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiCtr,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -460,8 +459,7 @@ static void Ctr_EditCentersInternal (void)
|
|||
static void Ctr_PutIconsEditingCenters (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view centers *****/
|
||||
Ico_PutContextualIconToView (ActSeeCtr,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeCtr,NULL,NULL,NULL);
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
Fig_PutIconToShowFigure (Fig_HIERARCHY);
|
||||
|
@ -737,7 +735,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
|
|||
const struct Plc_Place *Plc;
|
||||
char WWW[Cns_MAX_BYTES_WWW + 1];
|
||||
struct Usr_Data UsrDat;
|
||||
bool ICanEdit;
|
||||
Usr_ICan_t ICanEdit;
|
||||
unsigned NumDegs;
|
||||
unsigned NumUsrsCtr;
|
||||
unsigned NumUsrsInCrssOfCtr;
|
||||
|
@ -773,7 +771,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
|
|||
|
||||
/* Put icon to remove center */
|
||||
HTM_TD_Begin ("class=\"BT\"");
|
||||
if (!ICanEdit || // I cannot edit
|
||||
if (ICanEdit == Usr_I_CAN_NOT || // I cannot edit
|
||||
NumDegs || // Center has degrees
|
||||
NumUsrsCtr || // Center has users who claim to belong to it
|
||||
NumUsrsInCrssOfCtr) // Center has users
|
||||
|
@ -795,7 +793,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
|
|||
|
||||
/* Place */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit)
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (ActChgCtrPlc);
|
||||
ParCod_PutPar (ParCod_OthHie,Ctr->HieCod);
|
||||
|
@ -836,11 +834,12 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
|
|||
Nam_ExistingShortAndFullNames (ActionRename,
|
||||
ParCod_OthHie,Ctr->HieCod,
|
||||
Names,
|
||||
ICanEdit); // Put form?
|
||||
ICanEdit == Usr_I_CAN ? Frm_PUT_FORM :
|
||||
Frm_DONT_PUT_FORM);
|
||||
|
||||
/* Center WWW */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit)
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (ActChgCtrWWW);
|
||||
ParCod_PutPar (ParCod_OthHie,Ctr->HieCod);
|
||||
|
@ -903,11 +902,12 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
|
|||
/************** Check if I can edit, remove, etc. a center *******************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Ctr_CheckIfICanEditACenter (struct Hie_Node *Ctr)
|
||||
static Usr_ICan_t Ctr_CheckIfICanEditACenter (struct Hie_Node *Ctr)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM || // I am an institution administrator or higher
|
||||
return (Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM || // I am an institution administrator or higher
|
||||
((Ctr->Status & Hie_STATUS_BIT_PENDING) != 0 && // Center is not yet activated
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod == Ctr->RequesterUsrCod); // I am the requester
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod == Ctr->RequesterUsrCod)) ? Usr_I_CAN : // I am the requester
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -633,10 +633,12 @@ Me sale este error, no s
|
|||
"can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod')
|
||||
*/
|
||||
|
||||
#define Log_PLATFORM_VERSION "SWAD 23.71.3 (2024-03-22)"
|
||||
#define Log_PLATFORM_VERSION "SWAD 23.72 (2024-04-01)"
|
||||
#define CSS_FILE "swad23.67.2.css"
|
||||
#define JS_FILE "swad23.53.6.js"
|
||||
/*
|
||||
Version 23.72: Apr 01, 2024 New type Usr_ICan_t. (334879 lines)
|
||||
Version 23.71.4: Mar 22, 2024 Code refactoring. (334860 lines)
|
||||
Version 23.71.3: Mar 22, 2024 Code refactoring. (334827 lines)
|
||||
Version 23.71.2: Mar 20, 2024 Code refactoring in actions. (334866 lines)
|
||||
Version 23.71.1: Mar 20, 2024 Some functions renamed. (334869 lines)
|
||||
|
|
|
@ -463,7 +463,7 @@ static void Cty_ListOneCountryForSeeing (struct Hie_Node *Cty,unsigned NumCty)
|
|||
static void Cty_PutIconsListingCountries (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit countries *****/
|
||||
if (Cty_CheckIfICanEditCountries ())
|
||||
if (Cty_CheckIfICanEditCountries () == Usr_I_CAN)
|
||||
Cty_PutIconToEditCountries ();
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
|
@ -474,9 +474,10 @@ static void Cty_PutIconsListingCountries (__attribute__((unused)) void *Args)
|
|||
/********************** Check if I can edit countries ************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Cty_CheckIfICanEditCountries (void)
|
||||
Usr_ICan_t Cty_CheckIfICanEditCountries (void)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM;
|
||||
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -485,8 +486,7 @@ bool Cty_CheckIfICanEditCountries (void)
|
|||
|
||||
static void Cty_PutIconToEditCountries (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiCty,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiCty,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -692,8 +692,7 @@ static void Cty_EditCountriesInternal (void)
|
|||
static void Cty_PutIconsEditingCountries (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view countries *****/
|
||||
Ico_PutContextualIconToView (ActSeeCty,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeCty,NULL,NULL,NULL);
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
Fig_PutIconToShowFigure (Fig_HIERARCHY);
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "swad_institution.h"
|
||||
#include "swad_language.h"
|
||||
#include "swad_role_type.h"
|
||||
#include "swad_user.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************** Public types and constants ***********************/
|
||||
|
@ -53,7 +54,7 @@ void Cty_ListCountries (void);
|
|||
void Cty_ListCountries1 (void);
|
||||
void Cty_ListCountries2 (void);
|
||||
|
||||
bool Cty_CheckIfICanEditCountries (void);
|
||||
Usr_ICan_t Cty_CheckIfICanEditCountries (void);
|
||||
|
||||
void Cty_DrawCountryMapAndNameWithLink (struct Hie_Node *Cty,Act_Action_t Action,
|
||||
const char *ClassContainer,
|
||||
|
|
|
@ -341,7 +341,7 @@ static void CtyCfg_MapImage (Vie_ViewType_t ViewType,Hie_PutLink_t PutLink)
|
|||
HTM_DIV_End ();
|
||||
|
||||
/***** Map attribution *****/
|
||||
if (ViewType == Vie_VIEW && Cty_CheckIfICanEditCountries ())
|
||||
if (ViewType == Vie_VIEW && Cty_CheckIfICanEditCountries () == Usr_I_CAN)
|
||||
{
|
||||
HTM_DIV_Begin ("class=\"CM\"");
|
||||
Frm_BeginForm (ActChgCtyMapAtt);
|
||||
|
|
|
@ -100,7 +100,7 @@ static void Crs_EditCoursesInternal (void);
|
|||
static void Crs_PutIconsEditingCourses (__attribute__((unused)) void *Args);
|
||||
static void Crs_ListCoursesForEdition (void);
|
||||
static void Crs_ListCoursesOfAYearForEdition (unsigned Year);
|
||||
static bool Crs_CheckIfICanEdit (struct Hie_Node *Crs);
|
||||
static Usr_ICan_t Crs_CheckIfICanEdit (struct Hie_Node *Crs);
|
||||
static void Crs_PutFormToCreateCourse (void);
|
||||
static void Crs_PutHeadCoursesForSeeing (void);
|
||||
static void Crs_PutHeadCoursesForEdition (void);
|
||||
|
@ -423,7 +423,7 @@ static void Crs_ListCourses (void)
|
|||
static void Crs_PutIconsListCourses (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit courses *****/
|
||||
if (Hie_CheckIfICanEdit ())
|
||||
if (Hie_CheckIfICanEdit () == Usr_I_CAN)
|
||||
Crs_PutIconToEditCourses ();
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
|
@ -436,8 +436,7 @@ static void Crs_PutIconsListCourses (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Crs_PutIconToEditCourses (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiCrs,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiCrs,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -613,8 +612,7 @@ static void Crs_EditCoursesInternal (void)
|
|||
static void Crs_PutIconsEditingCourses (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view courses *****/
|
||||
Ico_PutContextualIconToView (ActSeeCrs,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeCrs,NULL,NULL,NULL);
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
Fig_PutIconToShowFigure (Fig_HIERARCHY);
|
||||
|
@ -662,7 +660,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
|
|||
unsigned YearAux;
|
||||
unsigned NumCrs;
|
||||
struct Usr_Data UsrDat;
|
||||
bool ICanEdit;
|
||||
Usr_ICan_t ICanEdit;
|
||||
unsigned NumUsrs[Rol_NUM_ROLES];
|
||||
const char *Names[Nam_NUM_SHRT_FULL_NAMES];
|
||||
|
||||
|
@ -693,9 +691,9 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
|
|||
/* Put icon to remove course */
|
||||
HTM_TD_Begin ("class=\"BT\"");
|
||||
if (NumUsrs[Rol_UNK] || // Course has users ==> deletion forbidden
|
||||
!ICanEdit)
|
||||
ICanEdit == Usr_I_CAN_NOT)
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
else // Crs->NumUsrs == 0 && ICanEdit
|
||||
else // Crs->NumUsrs == 0 && ICanEdit == Usr_I_CAN
|
||||
Ico_PutContextualIconToRemove (ActRemCrs,NULL,
|
||||
Hie_PutParOtherHieCod,&Crs->HieCod);
|
||||
HTM_TD_End ();
|
||||
|
@ -707,7 +705,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
|
|||
|
||||
/* Course year */
|
||||
HTM_TD_Begin ("class=\"CT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit)
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (ActChgCrsYea);
|
||||
ParCod_PutPar (ParCod_OthHie,Crs->HieCod);
|
||||
|
@ -734,7 +732,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
|
|||
|
||||
/* Institutional code of the course */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit)
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (ActChgInsCrsCod);
|
||||
ParCod_PutPar (ParCod_OthHie,Crs->HieCod);
|
||||
|
@ -754,7 +752,8 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
|
|||
Nam_ExistingShortAndFullNames (ActionRename,
|
||||
ParCod_OthHie,Crs->HieCod,
|
||||
Names,
|
||||
ICanEdit); // Put form?
|
||||
ICanEdit == Usr_I_CAN ? Frm_PUT_FORM :
|
||||
Frm_DONT_PUT_FORM);
|
||||
|
||||
/* Current number of teachers in this course */
|
||||
HTM_TD_Unsigned (NumUsrs[Rol_TCH] +
|
||||
|
@ -790,11 +789,12 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
|
|||
/************** Check if I can edit, remove, etc. a course *******************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Crs_CheckIfICanEdit (struct Hie_Node *Crs)
|
||||
static Usr_ICan_t Crs_CheckIfICanEdit (struct Hie_Node *Crs)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM || // I am a degree administrator or higher
|
||||
((Crs->Status & Hie_STATUS_BIT_PENDING) != 0 && // Course is not yet activated
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod == Crs->RequesterUsrCod); // I am the requester
|
||||
return (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM || // I am a degree administrator or higher
|
||||
((Crs->Status & Hie_STATUS_BIT_PENDING) != 0 && // Course is not yet activated
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod == Crs->RequesterUsrCod)) ? Usr_I_CAN : // I am the requester
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1052,7 +1052,7 @@ void Crs_RemoveCourse (void)
|
|||
|
||||
/***** Get data of the course from database *****/
|
||||
Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs);
|
||||
if (!Crs_CheckIfICanEdit (Crs_EditingCrs))
|
||||
if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Check if this course has users *****/
|
||||
|
@ -1295,7 +1295,7 @@ void Crs_ChangeInsCrsCod (void)
|
|||
|
||||
/* Get data of the course */
|
||||
Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs);
|
||||
if (!Crs_CheckIfICanEdit (Crs_EditingCrs))
|
||||
if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Change the institutional course code *****/
|
||||
|
@ -1340,7 +1340,7 @@ void Crs_ChangeCrsYear (void)
|
|||
|
||||
/* Get data of the course */
|
||||
Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs);
|
||||
if (!Crs_CheckIfICanEdit (Crs_EditingCrs))
|
||||
if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
if (NewYear <= Deg_MAX_YEARS_PER_DEGREE) // If year is valid
|
||||
|
@ -1445,7 +1445,7 @@ void Crs_RenameCourse (struct Hie_Node *Crs,Nam_ShrtOrFullName_t ShrtOrFull)
|
|||
|
||||
/***** Get from the database the data of the degree *****/
|
||||
Hie_GetDataByCod[Hie_CRS] (Crs);
|
||||
if (!Crs_CheckIfICanEdit (Crs))
|
||||
if (Crs_CheckIfICanEdit (Crs) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Check if new name is empty *****/
|
||||
|
|
|
@ -84,7 +84,7 @@ static struct Hie_Node *Deg_EditingDeg = NULL; // Static variable to keep the de
|
|||
/*****************************************************************************/
|
||||
|
||||
static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes);
|
||||
static bool Deg_CheckIfICanEditADegree (struct Hie_Node *Deg);
|
||||
static Usr_ICan_t Deg_CheckIfICanEditADegree (struct Hie_Node *Deg);
|
||||
static void Deg_PutFormToCreateDegree (const struct DegTyp_DegTypes *DegTypes);
|
||||
static void Deg_PutHeadDegreesForSeeing (void);
|
||||
static void Deg_PutHeadDegreesForEdition (void);
|
||||
|
@ -325,7 +325,7 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
|
|||
struct DegTyp_DegreeType *DegTyp;
|
||||
char WWW[Cns_MAX_BYTES_WWW + 1];
|
||||
struct Usr_Data UsrDat;
|
||||
bool ICanEdit;
|
||||
Usr_ICan_t ICanEdit;
|
||||
unsigned NumCrss;
|
||||
unsigned NumUsrsInCrssOfDeg;
|
||||
const char *Names[Nam_NUM_SHRT_FULL_NAMES];
|
||||
|
@ -359,7 +359,7 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
|
|||
|
||||
/* Put icon to remove degree */
|
||||
HTM_TD_Begin ("class=\"BT\"");
|
||||
if (!ICanEdit ||
|
||||
if (ICanEdit == Usr_I_CAN_NOT ||
|
||||
NumCrss || // Degree has courses ==> deletion forbidden
|
||||
NumUsrsInCrssOfDeg)
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
|
@ -384,11 +384,12 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
|
|||
Nam_ExistingShortAndFullNames (ActionRename,
|
||||
ParCod_OthHie,Deg->HieCod,
|
||||
Names,
|
||||
ICanEdit); // Put form?
|
||||
ICanEdit == Usr_I_CAN ? Frm_PUT_FORM :
|
||||
Frm_DONT_PUT_FORM);
|
||||
|
||||
/* Degree type */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit)
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (ActChgDegTyp);
|
||||
ParCod_PutPar (ParCod_OthHie,Deg->HieCod);
|
||||
|
@ -423,7 +424,7 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
|
|||
|
||||
/* Degree WWW */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit)
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (ActChgDegWWW);
|
||||
ParCod_PutPar (ParCod_OthHie,Deg->HieCod);
|
||||
|
@ -483,11 +484,12 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
|
|||
/************** Check if I can edit, remove, etc. a degree *******************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Deg_CheckIfICanEditADegree (struct Hie_Node *Deg)
|
||||
static Usr_ICan_t Deg_CheckIfICanEditADegree (struct Hie_Node *Deg)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM || // I am a center administrator or higher
|
||||
((Deg->Status & Hie_STATUS_BIT_PENDING) != 0 && // Degree is not yet activated
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod == Deg->RequesterUsrCod); // I am the requester
|
||||
return (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM || // I am a center administrator or higher
|
||||
((Deg->Status & Hie_STATUS_BIT_PENDING) != 0 && // Degree is not yet activated
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod == Deg->RequesterUsrCod)) ? Usr_I_CAN : // I am the requester
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -719,7 +721,7 @@ static void Deg_ListDegrees (void)
|
|||
static void Deg_PutIconsListingDegrees (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit degrees *****/
|
||||
if (Hie_CheckIfICanEdit ())
|
||||
if (Hie_CheckIfICanEdit () == Usr_I_CAN)
|
||||
Deg_PutIconToEditDegrees ();
|
||||
|
||||
/***** Put icon to view degree types *****/
|
||||
|
@ -735,8 +737,7 @@ static void Deg_PutIconsListingDegrees (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Deg_PutIconToEditDegrees (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiDeg,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiDeg,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -882,7 +883,7 @@ static void Deg_EditDegreesInternal (void)
|
|||
Ale_ShowAlert (Ale_WARNING,Txt_No_types_of_degree);
|
||||
|
||||
/***** Form to create the first degree type *****/
|
||||
if (DegTyp_CheckIfICanCreateDegreeTypes ())
|
||||
if (DegTyp_CheckIfICanCreateDegreeTypes () == Usr_I_CAN)
|
||||
DegTyp_EditDegreeTypes (&DegTypes);
|
||||
}
|
||||
|
||||
|
@ -900,8 +901,7 @@ static void Deg_EditDegreesInternal (void)
|
|||
static void Deg_PutIconsEditingDegrees (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view degrees *****/
|
||||
Ico_PutContextualIconToView (ActSeeDeg,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeDeg,NULL,NULL,NULL);
|
||||
|
||||
/***** Put icon to view types of degree *****/
|
||||
DegTyp_PutIconToViewDegreeTypes ();
|
||||
|
@ -916,8 +916,7 @@ static void Deg_PutIconsEditingDegrees (__attribute__((unused)) void *Args)
|
|||
|
||||
void Deg_PutIconToViewDegrees (void)
|
||||
{
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeDeg,NULL,
|
||||
NULL,NULL,
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeDeg,NULL,NULL,NULL,
|
||||
"graduation-cap.svg",Ico_BLACK);
|
||||
}
|
||||
|
||||
|
|
|
@ -287,8 +287,7 @@ static void DegTyp_EditDegreeTypesInternal (const struct DegTyp_DegTypes *DegTyp
|
|||
static void DegTyp_PutIconsEditingDegreeTypes (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view degree types *****/
|
||||
Ico_PutContextualIconToView (ActSeeDegTyp,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeDegTyp,NULL,NULL,NULL);
|
||||
|
||||
/***** Put icon to view degrees *****/
|
||||
Deg_PutIconToViewDegrees ();
|
||||
|
@ -303,8 +302,7 @@ static void DegTyp_PutIconsEditingDegreeTypes (__attribute__((unused)) void *Arg
|
|||
|
||||
void DegTyp_PutIconToViewDegreeTypes (void)
|
||||
{
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeDegTyp,NULL,
|
||||
NULL,NULL,
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeDegTyp,NULL,NULL,NULL,
|
||||
"sitemap.svg",Ico_BLACK);
|
||||
}
|
||||
|
||||
|
@ -375,9 +373,8 @@ static void DegTyp_PutIconsListingDegTypes (__attribute__((unused)) void *Args)
|
|||
static void DegTyp_PutIconToEditDegTypes (__attribute__((unused)) void *Args)
|
||||
{
|
||||
if (Gbl.Hierarchy.Level == Hie_CTR && // Only editable if center tab is visible
|
||||
DegTyp_CheckIfICanCreateDegreeTypes ())
|
||||
Ico_PutContextualIconToEdit (ActEdiDegTyp,NULL,
|
||||
NULL,NULL);
|
||||
DegTyp_CheckIfICanCreateDegreeTypes () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToEdit (ActEdiDegTyp,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -445,9 +442,10 @@ static void DegTyp_ListDegreeTypesForEdition (const struct DegTyp_DegTypes *DegT
|
|||
/******************** Check if I can create degree types *********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool DegTyp_CheckIfICanCreateDegreeTypes (void)
|
||||
Usr_ICan_t DegTyp_CheckIfICanCreateDegreeTypes (void)
|
||||
{
|
||||
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
|
||||
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -73,7 +73,7 @@ void DegTyp_EditDegreeTypes (const struct DegTyp_DegTypes *DegTypes);
|
|||
|
||||
void DegTyp_PutIconToViewDegreeTypes (void);
|
||||
|
||||
bool DegTyp_CheckIfICanCreateDegreeTypes (void);
|
||||
Usr_ICan_t DegTyp_CheckIfICanCreateDegreeTypes (void);
|
||||
|
||||
void DegTyp_GetListDegreeTypes (struct DegTyp_DegTypes *DegTypes,
|
||||
Hie_Level_t Level,DegTyp_Order_t Order);
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
/****************************** Private constants ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static const bool Dpt_ICanEditDpts[Rol_NUM_ROLES] =
|
||||
static bool Dpt_ICanEditDpts[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_INS_ADM] = true,
|
||||
|
@ -244,8 +244,7 @@ static Dpt_Order_t Dpt_GetParDptOrder (void)
|
|||
static void Dpt_PutIconToEditDpts (__attribute__((unused)) void *Args)
|
||||
{
|
||||
if (Dpt_ICanEditDpts[Gbl.Usrs.Me.Role.Logged])
|
||||
Ico_PutContextualIconToEdit (ActEdiDpt,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiDpt,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -254,8 +253,7 @@ static void Dpt_PutIconToEditDpts (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Dpt_PutIconToViewDpts (__attribute__((unused)) void *Args)
|
||||
{
|
||||
Ico_PutContextualIconToView (ActSeeDpt,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeDpt,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -515,7 +513,7 @@ static void Dpt_ListDepartmentsForEdition (const struct Dpt_Departments *Departm
|
|||
Nam_ExistingShortAndFullNames (ActionRename,
|
||||
ParCod_Dpt,Dpt->DptCod,
|
||||
Names,
|
||||
true); // Put form
|
||||
Frm_PUT_FORM);
|
||||
|
||||
/* Department WWW */
|
||||
HTM_TD_Begin ("class=\"LM\"");
|
||||
|
|
|
@ -311,7 +311,7 @@ static void Dup_ListSimilarUsrs (void)
|
|||
Usr_NUM_MAIN_FIELDS_DATA_USR-2,
|
||||
The_GetColorRows ());
|
||||
/* Button to remove this user */
|
||||
if (Acc_CheckIfICanEliminateAccount (UsrDat.UsrCod))
|
||||
if (Acc_CheckIfICanEliminateAccount (UsrDat.UsrCod) == Usr_I_CAN)
|
||||
Dup_PutButtonToEliminateUsrAccount (&UsrDat);
|
||||
/* Button to remove from list of possible duplicate users */
|
||||
if (Dup_DB_CheckIfUsrIsDup (UsrDat.UsrCod))
|
||||
|
|
|
@ -145,7 +145,7 @@ static void Enr_AskIfRegRemUsr (struct Usr_ListUsrCods *ListUsrCods,Rol_Role_t R
|
|||
|
||||
static void Enr_ShowFormToEditOtherUsr (void);
|
||||
|
||||
static bool Enr_CheckIfICanRemUsrFromCrs (void);
|
||||
static Usr_ICan_t Enr_CheckIfICanRemUsrFromCrs (void);
|
||||
|
||||
static void Enr_AskIfRemoveUsrFromCrs (struct Usr_Data *UsrDat);
|
||||
static void Enr_EffectivelyRemUsrFromCrs (struct Usr_Data *UsrDat,
|
||||
|
@ -1428,7 +1428,7 @@ bool Enr_PutActionsRegRemOneUsr (Usr_MeOrOther_t MeOrOther)
|
|||
}
|
||||
|
||||
/***** Eliminate user completely from platform *****/
|
||||
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod))
|
||||
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_I_CAN)
|
||||
{
|
||||
Enr_PutActionRemUsrAcc (&OptionChecked,MeOrOther);
|
||||
OptionsShown = true;
|
||||
|
@ -2369,16 +2369,18 @@ static void Enr_RemUsrEnrolmentRequestInCrs (long UsrCod,long CrsCod)
|
|||
|
||||
void Enr_PutLinkToAdminOneUsr (Act_Action_t NextAction)
|
||||
{
|
||||
extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES];
|
||||
extern const char *Txt_Administer_me;
|
||||
extern const char *Txt_Administer_one_user;
|
||||
const char *TitleText = Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged] ? Txt_Administer_one_user :
|
||||
Txt_Administer_me;
|
||||
static const char **TitleText[] =
|
||||
{
|
||||
[Usr_I_CAN_NOT] = &Txt_Administer_me,
|
||||
[Usr_I_CAN ] = &Txt_Administer_one_user,
|
||||
};
|
||||
|
||||
Lay_PutContextualLinkIconText (NextAction,NULL,
|
||||
NULL,NULL,
|
||||
"user-cog.svg",Ico_BLACK,
|
||||
TitleText,NULL);
|
||||
*TitleText[Adm_CheckIfICanAdminOtherUsrs ()],NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -2421,10 +2423,8 @@ void Enr_ReqRegRemOth (void)
|
|||
|
||||
void Enr_ReqRegRemStd (void)
|
||||
{
|
||||
extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES];
|
||||
|
||||
/***** Contextual menu *****/
|
||||
if (Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged])
|
||||
if (Adm_CheckIfICanAdminOtherUsrs () == Usr_I_CAN)
|
||||
{
|
||||
Mnu_ContextMenuBegin ();
|
||||
Enr_PutLinkToAdminSeveralUsrs (Rol_STD); // Admin several students
|
||||
|
@ -2443,9 +2443,7 @@ void Enr_ReqRegRemTch (void)
|
|||
|
||||
static void Enr_ReqRegRemUsr (Rol_Role_t Role)
|
||||
{
|
||||
extern const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES];
|
||||
|
||||
if (Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged])
|
||||
if (Adm_CheckIfICanAdminOtherUsrs () == Usr_I_CAN)
|
||||
/***** Form to request the user's ID of another user *****/
|
||||
Enr_ReqAnotherUsrIDToRegisterRemove (Role);
|
||||
else
|
||||
|
@ -2675,7 +2673,7 @@ void Enr_ReqRemUsrFromCrs (void)
|
|||
/***** Get user to be removed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Enr_CheckIfICanRemUsrFromCrs ())
|
||||
if (Enr_CheckIfICanRemUsrFromCrs () == Usr_I_CAN)
|
||||
Enr_AskIfRemoveUsrFromCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
|
@ -2695,7 +2693,7 @@ void Enr_RemUsrFromCrs1 (void)
|
|||
/***** Get user to be removed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Enr_CheckIfICanRemUsrFromCrs ())
|
||||
if (Enr_CheckIfICanRemUsrFromCrs () == Usr_I_CAN)
|
||||
Enr_EffectivelyRemUsrFromCrs (&Gbl.Usrs.Other.UsrDat,&Gbl.Hierarchy.Node[Hie_CRS],
|
||||
Enr_DO_NOT_REMOVE_USR_PRODUCTION,
|
||||
Cns_VERBOSE);
|
||||
|
@ -2720,23 +2718,24 @@ void Enr_RemUsrFromCrs2 (void)
|
|||
/*********** Check if I can remove another user in current course ************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Enr_CheckIfICanRemUsrFromCrs (void)
|
||||
static Usr_ICan_t Enr_CheckIfICanRemUsrFromCrs (void)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD:
|
||||
case Rol_NET:
|
||||
// A student or non-editing teacher can remove herself/himself
|
||||
return Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME;
|
||||
return (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH:
|
||||
case Rol_DEG_ADM:
|
||||
case Rol_CTR_ADM:
|
||||
case Rol_INS_ADM:
|
||||
case Rol_SYS_ADM:
|
||||
// A teacher or administrator can remove anyone
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2902,7 +2901,7 @@ void Enr_ModifyUsr1 (void)
|
|||
if (MeOrOther == Usr_ME || Gbl.Usrs.Me.Role.Logged >= Rol_TCH)
|
||||
{
|
||||
/***** Get user's name from record form *****/
|
||||
if (Usr_ICanChangeOtherUsrData (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_ICanChangeOtherUsrData (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
Rec_GetUsrNameFromRecordForm (&Gbl.Usrs.Other.UsrDat);
|
||||
|
||||
/***** Update user's data in database *****/
|
||||
|
@ -3008,7 +3007,7 @@ void Enr_ModifyUsr1 (void)
|
|||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
case Enr_ELIMINATE_ONE_USR_FROM_PLATFORM:
|
||||
if (!Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod))
|
||||
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_I_CAN_NOT)
|
||||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
default:
|
||||
|
|
52
swad_exam.c
52
swad_exam.c
|
@ -315,12 +315,12 @@ void Exa_ListAllExams (struct Exa_Exams *Exams)
|
|||
/************************ Check if I can edit exams **************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Exa_CheckIfICanEditExams (void)
|
||||
Usr_ICan_t Exa_CheckIfICanEditExams (void)
|
||||
{
|
||||
static const bool ICanEditExams[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanEditExams[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanEditExams[Gbl.Usrs.Me.Role.Logged];
|
||||
|
@ -343,7 +343,7 @@ static void Exa_PutIconsListExams (void *Exams)
|
|||
if (Exams)
|
||||
{
|
||||
/***** Put icon to create a new exam *****/
|
||||
if (Exa_CheckIfICanEditExams ())
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN)
|
||||
Exa_PutIconToCreateNewExam ((struct Exa_Exams *) Exams);
|
||||
|
||||
/***** Put icon to view sessions results *****/
|
||||
|
@ -352,9 +352,8 @@ static void Exa_PutIconsListExams (void *Exams)
|
|||
NULL,NULL);
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL,
|
||||
Exa_PutPars,Exams);
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL,Exa_PutPars,Exams);
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
Fig_PutIconToShowFigure (Fig_EXAMS);
|
||||
|
@ -629,8 +628,7 @@ static void Exa_PutIconsEditingOneExam (void *Exams)
|
|||
{
|
||||
if (Exams)
|
||||
/***** Icon to view exam *****/
|
||||
Ico_PutContextualIconToView (ActSeeOneExa,NULL,
|
||||
Exa_PutPars,Exams);
|
||||
Ico_PutContextualIconToView (ActSeeOneExa,NULL,Exa_PutPars,Exams);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -671,7 +669,7 @@ static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams,
|
|||
[Rol_SYS_ADM] = ActSeeUsrExaResExa,
|
||||
};
|
||||
|
||||
if (Exa_CheckIfICanEditExams ())
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN)
|
||||
{
|
||||
/***** Icon to remove exam *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemExa,NULL,
|
||||
|
@ -683,8 +681,7 @@ static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams,
|
|||
Exams->Exam.HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit exam *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneExa,NULL,
|
||||
Exa_PutPars,Exams);
|
||||
Ico_PutContextualIconToEdit (ActEdiOneExa,NULL,Exa_PutPars,Exams);
|
||||
}
|
||||
|
||||
/***** Put icon to view results of sessions in exam *****/
|
||||
|
@ -693,9 +690,8 @@ static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams,
|
|||
Exa_PutPars,Exams);
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL,
|
||||
Exa_PutPars,Exams);
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkExa,NULL,Exa_PutPars,Exams);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -973,7 +969,7 @@ void Exa_AskRemExam (void)
|
|||
struct Exa_Exams Exams;
|
||||
|
||||
/***** Check if I can edit exams *****/
|
||||
if (!Exa_CheckIfICanEditExams ())
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Reset exams context *****/
|
||||
|
@ -1006,7 +1002,7 @@ void Exa_RemoveExam (void)
|
|||
struct Exa_Exams Exams;
|
||||
|
||||
/***** Check if I can edit exams *****/
|
||||
if (!Exa_CheckIfICanEditExams ())
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Reset exams context *****/
|
||||
|
@ -1186,7 +1182,7 @@ static void Exa_HideUnhideExam (HidVis_HiddenOrVisible_t HiddenOrVisible)
|
|||
struct Exa_Exams Exams;
|
||||
|
||||
/***** Check if I can edit exams *****/
|
||||
if (!Exa_CheckIfICanEditExams ())
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Reset exams context *****/
|
||||
|
@ -1216,7 +1212,7 @@ void Exa_ReqCreatOrEditExam (void)
|
|||
Exa_ExistingNewExam_t ExistingNewExam;
|
||||
|
||||
/***** Check if I can edit exams *****/
|
||||
if (!Exa_CheckIfICanEditExams ())
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Reset exams context *****/
|
||||
|
@ -1427,7 +1423,7 @@ void Exa_ReceiveExam (void)
|
|||
char Txt[Cns_MAX_BYTES_TEXT + 1];
|
||||
|
||||
/***** Check if I can edit exams *****/
|
||||
if (!Exa_CheckIfICanEditExams ())
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Reset exams context *****/
|
||||
|
@ -1553,20 +1549,6 @@ static void Exa_UpdateExam (struct Exa_Exam *Exam,const char *Txt)
|
|||
Ale_ShowAlert (Ale_SUCCESS,Txt_The_exam_has_been_modified);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/********** Get number of sessions and check is edition is possible **********/
|
||||
/*****************************************************************************/
|
||||
// Before calling this function, number of sessions must be calculated
|
||||
|
||||
bool Exa_CheckIfEditable (const struct Exa_Exam *Exam)
|
||||
{
|
||||
if (Exa_CheckIfICanEditExams ())
|
||||
/***** Questions are editable only if exam has no sessions *****/
|
||||
return Exam->NumSess == 0; // Exams with sessions should not be edited
|
||||
else
|
||||
return false; // Questions are not editable
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*************************** Show stats about exams **************************/
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
/*****************************************************************************/
|
||||
|
||||
#include "swad_exam_type.h"
|
||||
#include "swad_user.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/***************************** Public prototypes *****************************/
|
||||
|
@ -39,7 +40,7 @@ void Exa_ResetExam (struct Exa_Exam *Exam);
|
|||
void Exa_SeeAllExams (void);
|
||||
void Exa_ListAllExams (struct Exa_Exams *Exams);
|
||||
|
||||
bool Exa_CheckIfICanEditExams (void);
|
||||
Usr_ICan_t Exa_CheckIfICanEditExams (void);
|
||||
|
||||
void Exa_SeeOneExam (void);
|
||||
void Exa_ShowOnlyOneExam (struct Exa_Exams *Exams,Frm_PutForm_t PutFormSession);
|
||||
|
@ -70,8 +71,6 @@ void Exa_PutFormsOneExam (struct Exa_Exams *Exams,
|
|||
|
||||
void Exa_ReceiveExam (void);
|
||||
|
||||
bool Exa_CheckIfEditable (const struct Exa_Exam *Exam);
|
||||
|
||||
//-------------------------------- Figures ------------------------------------
|
||||
void Exa_GetAndShowExamsStats (void);
|
||||
|
||||
|
|
|
@ -1668,7 +1668,7 @@ unsigned Exa_DB_GetGrpsAssociatedToSes (MYSQL_RES **mysql_res,long SesCod)
|
|||
/*** Check if I belong to any of the groups associated to the exam session ***/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
|
||||
Usr_ICan_t Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
|
||||
{
|
||||
return
|
||||
DB_QueryEXISTS ("can not check if I can play an exam session",
|
||||
|
@ -1686,7 +1686,8 @@ bool Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
|
|||
" WHERE grp_users.UsrCod=%ld"
|
||||
" AND grp_users.GrpCod=exa_groups.GrpCod)))",
|
||||
SesCod,
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -2150,6 +2151,12 @@ bool Exa_DB_CheckIfUserAgentIsTheSameAsTheLast (long PrnCod,const char *UserAgen
|
|||
|
||||
void Exa_DB_LogAccess (long LogCod,long PrnCod,ExaLog_Action_t Action)
|
||||
{
|
||||
static char YN[Usr_NUM_I_CAN] =
|
||||
{
|
||||
[Usr_I_CAN_NOT] = 'N',
|
||||
[Usr_I_CAN ] = 'Y',
|
||||
};
|
||||
|
||||
/* Log access in exam log.
|
||||
Redundant data (also present in log table) are stored for speed */
|
||||
DB_QueryINSERT ("can not log exam access",
|
||||
|
@ -2161,8 +2168,7 @@ void Exa_DB_LogAccess (long LogCod,long PrnCod,ExaLog_Action_t Action)
|
|||
PrnCod,
|
||||
(unsigned) Action,
|
||||
ExaLog_GetQstInd (),
|
||||
ExaLog_GetIfCanAnswer () ? 'Y' :
|
||||
'N',
|
||||
YN[ExaLog_GetIfCanAnswer ()],
|
||||
// NOW() Redundant, for speed
|
||||
Par_GetIP ()); // Redundant, for speed
|
||||
}
|
||||
|
|
|
@ -128,7 +128,7 @@ void Exa_DB_RemoveUsrFromSessionTablesInCrs (long UsrCod,long CrsCod);
|
|||
//--------------------------------- Groups ------------------------------------
|
||||
void Exa_DB_CreateGrpAssociatedToSes (long SesCod,long GrpCod);
|
||||
unsigned Exa_DB_GetGrpsAssociatedToSes (MYSQL_RES **mysql_res,long SesCod);
|
||||
bool Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod);
|
||||
Usr_ICan_t Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod);
|
||||
void Exa_DB_RemoveAllGrpsFromExa (long ExaCod);
|
||||
void Exa_DB_RemoveAllGrpsFromCrs (long CrsCod);
|
||||
void Exa_DB_RemoveAllGrpsFromSes (long SesCod);
|
||||
|
|
|
@ -54,7 +54,7 @@ static struct
|
|||
long PrnCod; // Exam print code
|
||||
int QstInd; // Exam print question index
|
||||
ExaLog_Action_t Action; // Action performed by user
|
||||
bool ICanAnswer; // Exam print is open and accesible to answer by the user
|
||||
Usr_ICan_t ICanAnswer; // Exam print is open and accesible to answer by the user
|
||||
} ExaLog_Log =
|
||||
{
|
||||
.PrnCod = -1L, // -1 means no print code set
|
||||
|
@ -116,12 +116,12 @@ int ExaLog_GetQstInd (void)
|
|||
/************* Set and get if exam print is open and accessible **************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void ExaLog_SetIfCanAnswer (bool ICanAnswer)
|
||||
void ExaLog_SetIfCanAnswer (Usr_ICan_t ICanAnswer)
|
||||
{
|
||||
ExaLog_Log.ICanAnswer = ICanAnswer;
|
||||
}
|
||||
|
||||
bool ExaLog_GetIfCanAnswer (void)
|
||||
Usr_ICan_t ExaLog_GetIfCanAnswer (void)
|
||||
{
|
||||
return ExaLog_Log.ICanAnswer;
|
||||
}
|
||||
|
|
|
@ -54,8 +54,8 @@ void ExaLog_SetAction (ExaLog_Action_t Action);
|
|||
ExaLog_Action_t ExaLog_GetAction (void);
|
||||
void ExaLog_SetQstInd (unsigned QstInd);
|
||||
int ExaLog_GetQstInd (void);
|
||||
void ExaLog_SetIfCanAnswer (bool CanBeAnswered);
|
||||
bool ExaLog_GetIfCanAnswer (void);
|
||||
void ExaLog_SetIfCanAnswer (Usr_ICan_t CanBeAnswered);
|
||||
Usr_ICan_t ExaLog_GetIfCanAnswer (void);
|
||||
|
||||
void ExaLog_LogAccess (long LogCod);
|
||||
|
||||
|
|
|
@ -178,7 +178,7 @@ void ExaPrn_ShowExamPrint (void)
|
|||
ExaSes_GetAndCheckPars (&Exams,&Session);
|
||||
|
||||
/***** Check if I can access to this session *****/
|
||||
if (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session))
|
||||
if (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session) == Usr_I_CAN)
|
||||
{
|
||||
/***** Set basic data of exam print *****/
|
||||
Print.SesCod = Session.SesCod;
|
||||
|
@ -996,7 +996,7 @@ void ExaPrn_ReceivePrintAnswer (void)
|
|||
ExaLog_SetQstInd (QstInd);
|
||||
|
||||
/***** Check if session if visible and open *****/
|
||||
if (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session))
|
||||
if (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session) == Usr_I_CAN)
|
||||
{
|
||||
/***** Set log open to true ****/
|
||||
ExaLog_SetIfCanAnswer (true);
|
||||
|
|
|
@ -69,8 +69,8 @@ extern struct Globals Gbl;
|
|||
|
||||
struct ExaRes_ICanView
|
||||
{
|
||||
bool Result;
|
||||
bool Score;
|
||||
Usr_ICan_t Result;
|
||||
Usr_ICan_t Score;
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -292,7 +292,7 @@ static void ExaRes_PutFormToSelUsrsToViewResults (__attribute__((unused)) void *
|
|||
Txt_Results,
|
||||
Hlp_ASSESSMENT_Exams_results,
|
||||
Txt_View_results,
|
||||
false); // Do not put form with date range
|
||||
Frm_DONT_PUT_FORM); // Do not put form with date range
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -358,7 +358,7 @@ static void ExaRes_ListAllResultsInSelectedExams (struct Exa_Exams *Exams)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show sessions results *****/
|
||||
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
|
@ -424,7 +424,7 @@ static void ExaRes_ListAllResultsInExa (struct Exa_Exams *Exams)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show sessions results *****/
|
||||
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
|
@ -495,7 +495,7 @@ static void ExaRes_ListAllResultsInSes (struct Exa_Exams *Exams,long SesCod)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show sessions results *****/
|
||||
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
|
@ -831,7 +831,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_End ();
|
||||
|
||||
/* Get and accumulate questions and score */
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
/* Get questions and user's answers of exam print from database */
|
||||
ExaPrn_GetPrintQuestionsFromDB (&Print);
|
||||
|
@ -852,7 +852,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
|
@ -862,7 +862,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_GREEN_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Total)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Total);
|
||||
|
@ -877,7 +877,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_RED_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
NumQstsInvalid = Print.NumQsts.All - Print.NumQsts.Valid.Total;
|
||||
if (NumQstsInvalid)
|
||||
|
@ -893,7 +893,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Correct)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Correct);
|
||||
|
@ -908,7 +908,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Wrong.Negative)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Negative);
|
||||
|
@ -922,7 +922,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Wrong.Zero)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Zero);
|
||||
|
@ -936,7 +936,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Wrong.Positive)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Positive);
|
||||
|
@ -951,7 +951,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Blank)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Blank);
|
||||
|
@ -966,7 +966,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
HTM_Double2Decimals (Print.Score.Valid);
|
||||
HTM_Txt ("/");
|
||||
|
@ -980,7 +980,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
HTM_Double2Decimals (Print.NumQsts.Valid.Total ? Print.Score.Valid /
|
||||
(double) Print.NumQsts.Valid.Total :
|
||||
0.0);
|
||||
|
@ -992,7 +992,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid.Total,Print.Score.Valid,Exam.MaxGrade);
|
||||
TstPrn_ShowGrade (Grade,Exam.MaxGrade);
|
||||
|
@ -1005,7 +1005,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
/* Link to show this result */
|
||||
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result)
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
{
|
||||
Exams->Exam.ExaCod = Session.ExaCod;
|
||||
Exams->SesCod = Session.SesCod;
|
||||
|
@ -1218,8 +1218,8 @@ void ExaRes_ShowExaResultAfterFinish (void)
|
|||
struct ExaPrn_Print Print;
|
||||
struct ExaRes_ICanView ICanView =
|
||||
{
|
||||
.Result = true, // I have just finish answering, so show result...
|
||||
.Score = false, // ...but not score
|
||||
.Result = Usr_I_CAN, // I have just finish answering, so show result...
|
||||
.Score = Usr_I_CAN_NOT, // ...but not score
|
||||
};
|
||||
unsigned Visibility = 1 << TstVis_VISIBLE_QST_ANS_TXT; // Show only questions and answers text
|
||||
|
||||
|
@ -1346,7 +1346,7 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
|
|||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS))
|
||||
Err_WrongUserExit ();
|
||||
if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (UsrDat) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Begin table *****/
|
||||
|
@ -1371,7 +1371,7 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
|
|||
ExaRes_ShowExamResultGrade (Exam,Print,ICanView);
|
||||
|
||||
/* Answers and solutions */
|
||||
if (ICanView->Result)
|
||||
if (ICanView->Result == Usr_I_CAN)
|
||||
ExaRes_ShowExamAnswers (UsrDat,Print,Visibility);
|
||||
|
||||
/***** End table *****/
|
||||
|
@ -1398,15 +1398,17 @@ static void ExaRes_CheckIfICanViewResult (const struct Exa_Exam *Exam,
|
|||
ICanView->Result = (Usr_ItsMe (UsrCod) == Usr_ME && // The result is mine
|
||||
Exam->HiddenOrVisible == HidVis_VISIBLE && // The exam is visible
|
||||
Session->HiddenOrVisible == HidVis_VISIBLE && // The session is visible
|
||||
Session->ShowUsrResults); // The results of the session are visible to users
|
||||
Session->ShowUsrResults) ? Usr_I_CAN : // The results of the session are visible to users
|
||||
Usr_I_CAN_NOT;
|
||||
// Whether I belong or not to groups of session is not checked here...
|
||||
// ...because I should be able to see old exams made in old groups to which I belonged
|
||||
|
||||
if (ICanView->Result)
|
||||
if (ICanView->Result == Usr_I_CAN)
|
||||
// Depends on 5 visibility icons associated to exam
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (Exam->Visibility);
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (Exam->Visibility) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
else
|
||||
ICanView->Score = false;
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
|
@ -1415,11 +1417,11 @@ static void ExaRes_CheckIfICanViewResult (const struct Exa_Exam *Exam,
|
|||
case Rol_INS_ADM:
|
||||
case Rol_SYS_ADM:
|
||||
ICanView->Result =
|
||||
ICanView->Score = true;
|
||||
ICanView->Score = Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
ICanView->Result =
|
||||
ICanView->Score = false;
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1600,7 +1602,7 @@ static void ExaRes_ShowExamResultNumQsts (struct ExaPrn_Print *Print,
|
|||
|
||||
/***** Number of questions *****/
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanView->Result)
|
||||
if (ICanView->Result == Usr_I_CAN)
|
||||
{
|
||||
HTM_TxtF ("%u",Print->NumQsts.All);
|
||||
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
||||
|
@ -1654,7 +1656,7 @@ static void ExaRes_ShowExamResultNumAnss (struct ExaPrn_Print *Print,
|
|||
|
||||
/***** Number of answers *****/
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanView->Score)
|
||||
if (ICanView->Score == Usr_I_CAN)
|
||||
HTM_TxtF ("%s(<em>p<sub>i</sub></em>=1): %u; "
|
||||
"%s(-1≤<em>p<sub>i</sub></em><0): %u; "
|
||||
"%s(<em>p<sub>i</sub></em>=0): %u; "
|
||||
|
@ -1693,7 +1695,7 @@ static void ExaRes_ShowExamResultScore (struct ExaPrn_Print *Print,
|
|||
|
||||
/***** Score *****/
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanView->Score)
|
||||
if (ICanView->Score == Usr_I_CAN)
|
||||
{
|
||||
/* Score counting all questions */
|
||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||
|
@ -1745,7 +1747,7 @@ static void ExaRes_ShowExamResultGrade (const struct Exa_Exam *Exam,
|
|||
|
||||
/***** Grade *****/
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanView->Score)
|
||||
if (ICanView->Score == Usr_I_CAN)
|
||||
{
|
||||
/* Grade counting all questions */
|
||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||
|
@ -1814,7 +1816,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
{
|
||||
extern const char *Txt_Score;
|
||||
extern const char *Txt_Invalid_question;
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY];
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY];
|
||||
static const char *ClassNumQst[Qst_NUM_VALIDITIES] =
|
||||
{
|
||||
[Qst_INVALID_QUESTION] = "BIG_INDEX_RED",
|
||||
|
@ -1840,10 +1842,14 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD:
|
||||
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility);
|
||||
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility);
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility);
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility);
|
||||
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility) ? Usr_I_CAN:
|
||||
Usr_I_CAN_NOT;
|
||||
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility) ? Usr_I_CAN:
|
||||
Usr_I_CAN_NOT;
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility) ? Usr_I_CAN:
|
||||
Usr_I_CAN_NOT;
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility) ? Usr_I_CAN:
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
|
@ -1854,13 +1860,13 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
|
||||
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = true;
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
|
||||
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = false;
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1879,10 +1885,10 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
|
||||
/* Stem */
|
||||
Qst_WriteQstStem (Question->Stem,ClassTxt[Question->Validity],
|
||||
ICanView[TstVis_VISIBLE_QST_ANS_TXT]);
|
||||
ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN);
|
||||
|
||||
/* Media */
|
||||
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT])
|
||||
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN)
|
||||
Med_ShowMedia (&Question->Media,
|
||||
"Tst_MED_SHOW_CONT",
|
||||
"Tst_MED_SHOW");
|
||||
|
@ -1895,7 +1901,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
ClassFeedback[Question->Validity]);
|
||||
|
||||
/* Write score retrieved from database */
|
||||
if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE])
|
||||
if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE] == Usr_I_CAN)
|
||||
{
|
||||
HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"",
|
||||
The_GetSuffix ());
|
||||
|
@ -1914,7 +1920,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
}
|
||||
|
||||
/* Question feedback */
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
|
||||
Qst_WriteQstFeedback (Question->Feedback,
|
||||
ClassFeedback[Question->Validity]);
|
||||
|
||||
|
|
|
@ -72,10 +72,10 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
|
|||
Frm_PutForm_t PutFormSession,
|
||||
unsigned NumSessions,
|
||||
MYSQL_RES *mysql_res);
|
||||
static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions);
|
||||
static bool ExaSes_CheckIfICanEditSessions (void);
|
||||
static bool ExaSes_CheckIfICanEditThisSession (long UsrCod);
|
||||
static bool ExaSes_CheckIfVisibilityOfResultsCanBeChanged (const struct ExaSes_Session *Session);
|
||||
static void ExaSes_ListOneOrMoreSessionsHeading (Usr_ICan_t ICanEditSessions);
|
||||
static Usr_ICan_t ExaSes_CheckIfICanEditSessions (void);
|
||||
static Usr_ICan_t ExaSes_CheckIfICanEditThisSession (long UsrCod);
|
||||
static Usr_ICan_t ExaSes_CheckIfICanChangeVisibilityOfResults (const struct ExaSes_Session *Session);
|
||||
static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams,
|
||||
const struct ExaSes_Session *Session,
|
||||
const char *Anchor);
|
||||
|
@ -151,7 +151,8 @@ void ExaSes_ListSessions (struct Exa_Exams *Exams,
|
|||
Hlp_ASSESSMENT_Exams_sessions,Box_NOT_CLOSABLE);
|
||||
|
||||
/***** Select whether show only my groups or all groups *****/
|
||||
if (Gbl.Crs.Grps.NumGrps && ExaSes_CheckIfICanEditSessions ())
|
||||
if (Gbl.Crs.Grps.NumGrps &&
|
||||
ExaSes_CheckIfICanEditSessions () == Usr_I_CAN)
|
||||
{
|
||||
Set_BeginSettingsHead ();
|
||||
Grp_ShowFormToSelWhichGrps (ActSeeOneExa,Exa_PutPars,Exams);
|
||||
|
@ -203,15 +204,10 @@ void ExaSes_GetSessionDataByCod (struct ExaSes_Session *Session)
|
|||
|
||||
static void ExaSes_PutIconsInListOfSessions (void *Exams)
|
||||
{
|
||||
bool ICanEditSessions;
|
||||
|
||||
if (Exams)
|
||||
{
|
||||
/***** Put icon to create a new exam session in current exam *****/
|
||||
ICanEditSessions = ExaSes_CheckIfICanEditSessions ();
|
||||
if (ICanEditSessions)
|
||||
if (ExaSes_CheckIfICanEditSessions () == Usr_I_CAN)
|
||||
/***** Put icon to create a new exam session in current exam *****/
|
||||
ExaSes_PutIconToCreateNewSession ((struct Exa_Exams *) Exams);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -237,7 +233,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
|
|||
unsigned UniqueId;
|
||||
struct ExaSes_Session Session;
|
||||
char *Anchor;
|
||||
bool ICanEditSessions = ExaSes_CheckIfICanEditSessions ();
|
||||
Usr_ICan_t ICanEditSessions = ExaSes_CheckIfICanEditSessions ();
|
||||
long SesCodToBeEdited = PutFormSession == Frm_PUT_FORM &&
|
||||
Exams->SesCod > 0 ? Exams->SesCod :
|
||||
-1L;
|
||||
|
@ -260,7 +256,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
|
|||
/***** Get exam session data from row *****/
|
||||
ExaSes_GetSessionDataFromRow (mysql_res,&Session);
|
||||
|
||||
if (ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session.SesCod))
|
||||
if (ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session.SesCod) == Usr_I_CAN)
|
||||
{
|
||||
/***** Build anchor string *****/
|
||||
if (asprintf (&Anchor,"evt_%ld_%ld",Exams->Exam.ExaCod,Session.SesCod) < 0)
|
||||
|
@ -333,7 +329,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
|
|||
/************* Put a column for exam session start and end times *************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions)
|
||||
static void ExaSes_ListOneOrMoreSessionsHeading (Usr_ICan_t ICanEditSessions)
|
||||
{
|
||||
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
|
||||
extern const char *Txt_Session;
|
||||
|
@ -343,14 +339,14 @@ static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions)
|
|||
HTM_TR_Begin (NULL);
|
||||
|
||||
/***** Column for icons *****/
|
||||
if (ICanEditSessions)
|
||||
if (ICanEditSessions == Usr_I_CAN)
|
||||
HTM_TH_Empty (1);
|
||||
|
||||
/***** The rest of columns *****/
|
||||
HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_START_DATE] ,HTM_HEAD_LEFT );
|
||||
HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_END_DATE ] ,HTM_HEAD_LEFT );
|
||||
HTM_TH (Txt_Session ,HTM_HEAD_LEFT );
|
||||
HTM_TH (Txt_Results ,HTM_HEAD_CENTER);
|
||||
HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_START_DATE],HTM_HEAD_LEFT );
|
||||
HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_END_DATE ],HTM_HEAD_LEFT );
|
||||
HTM_TH (Txt_Session ,HTM_HEAD_LEFT );
|
||||
HTM_TH (Txt_Results ,HTM_HEAD_CENTER);
|
||||
|
||||
/***** End row *****/
|
||||
HTM_TR_End ();
|
||||
|
@ -360,13 +356,13 @@ static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions)
|
|||
/********************** Check if I can edit sessions *************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool ExaSes_CheckIfICanEditSessions (void)
|
||||
static Usr_ICan_t ExaSes_CheckIfICanEditSessions (void)
|
||||
{
|
||||
static const bool ICanEditSessions[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanEditSessions[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_NET ] = true,
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_NET ] = Usr_I_CAN,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanEditSessions[Gbl.Usrs.Me.Role.Logged];
|
||||
|
@ -376,17 +372,18 @@ static bool ExaSes_CheckIfICanEditSessions (void)
|
|||
/************ Check if I can edit (remove/resume) an exam session ************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool ExaSes_CheckIfICanEditThisSession (long UsrCod)
|
||||
static Usr_ICan_t ExaSes_CheckIfICanEditThisSession (long UsrCod)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_NET:
|
||||
return (UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod); // Only if I am the creator
|
||||
return (UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN : // Only if I am the creator
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -394,14 +391,13 @@ static bool ExaSes_CheckIfICanEditThisSession (long UsrCod)
|
|||
/********** Check if visibility of session results can be changed ************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool ExaSes_CheckIfVisibilityOfResultsCanBeChanged (const struct ExaSes_Session *Session)
|
||||
static Usr_ICan_t ExaSes_CheckIfICanChangeVisibilityOfResults (const struct ExaSes_Session *Session)
|
||||
{
|
||||
if (Session->ShowUsrResults || // Results are currently visible
|
||||
Session->TimeUTC[Dat_END_TIME] < Dat_GetStartExecutionTimeUTC ()) // End of time is in the past
|
||||
if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod))
|
||||
return true;
|
||||
return ExaSes_CheckIfICanEditThisSession (Session->UsrCod);
|
||||
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -424,7 +420,7 @@ static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams,
|
|||
/***** Begin cell *****/
|
||||
HTM_TD_Begin ("rowspan=\"2\" class=\"BT %s\"",The_GetColorRows ());
|
||||
|
||||
if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod))
|
||||
if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod) == Usr_I_CAN)
|
||||
{
|
||||
/***** Icon to remove the exam session *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemExaSes,NULL,
|
||||
|
@ -504,7 +500,7 @@ static void ExaSes_ListOneOrMoreSessionsTitleGrps (struct Exa_Exams *Exams,
|
|||
|
||||
/***** Session title *****/
|
||||
HTM_ARTICLE_Begin (Anchor);
|
||||
if (ExaSes_CheckIfICanAnswerThisSession (&Exams->Exam,Session))
|
||||
if (ExaSes_CheckIfICanAnswerThisSession (&Exams->Exam,Session) == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (ActSeeExaPrn);
|
||||
Exa_PutPars (Exams);
|
||||
|
@ -648,13 +644,13 @@ static void ExaSes_ListOneOrMoreSessionsResultTch (struct Exa_Exams *Exams,
|
|||
Exams->SesCod = Session->SesCod;
|
||||
|
||||
/***** Show exam session results *****/
|
||||
if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod))
|
||||
if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeUsrExaResSes,ExaRes_RESULTS_BOX_ID,
|
||||
ExaSes_PutParsEdit,Exams,
|
||||
"trophy.svg",Ico_BLACK);
|
||||
|
||||
/***** Check if visibility of session results can be changed *****/
|
||||
if (ExaSes_CheckIfVisibilityOfResultsCanBeChanged (Session))
|
||||
if (ExaSes_CheckIfICanChangeVisibilityOfResults (Session) == Usr_I_CAN)
|
||||
{
|
||||
/***** Put form to change visibility of session results *****/
|
||||
if (Session->ShowUsrResults)
|
||||
|
@ -694,7 +690,7 @@ void ExaSes_ToggleVisResultsSesUsr (void)
|
|||
ExaSes_GetAndCheckPars (&Exams,&Session);
|
||||
|
||||
/***** Check if visibility of session results can be changed *****/
|
||||
if (!ExaSes_CheckIfVisibilityOfResultsCanBeChanged (&Session))
|
||||
if (ExaSes_CheckIfICanChangeVisibilityOfResults (&Session) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Toggle visibility of exam session results *****/
|
||||
|
@ -812,7 +808,7 @@ void ExaSes_RemoveSession (void)
|
|||
ExaSes_GetAndCheckPars (&Exams,&Session);
|
||||
|
||||
/***** Check if I can remove this exam session *****/
|
||||
if (!ExaSes_CheckIfICanEditThisSession (Session.UsrCod))
|
||||
if (ExaSes_CheckIfICanEditThisSession (Session.UsrCod) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Remove questions of exams prints, and exam prints, in this session *****/
|
||||
|
@ -866,7 +862,7 @@ static void ExaSes_HideUnhideSession (HidVis_HiddenOrVisible_t HiddenOrVisible)
|
|||
ExaSes_GetAndCheckPars (&Exams,&Session);
|
||||
|
||||
/***** Check if I can remove this exam session *****/
|
||||
if (!ExaSes_CheckIfICanEditThisSession (Session.UsrCod))
|
||||
if (ExaSes_CheckIfICanEditThisSession (Session.UsrCod) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Hide session *****/
|
||||
|
@ -1211,22 +1207,22 @@ static void ExaSes_CreateGrpsAssociatedToExamSession (long SesCod,
|
|||
/******** Check if I belong to any of the groups of an exam session **********/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
|
||||
const struct ExaSes_Session *Session)
|
||||
Usr_ICan_t ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
|
||||
const struct ExaSes_Session *Session)
|
||||
{
|
||||
/***** 1. Sessions in hidden exams are not accesible
|
||||
2. Hidden or closed sessions are not accesible *****/
|
||||
if (Exam->HiddenOrVisible == HidVis_HIDDEN ||
|
||||
Session->HiddenOrVisible == HidVis_HIDDEN ||
|
||||
!Session->Open)
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** Exam is visible, session is visible and open ==>
|
||||
==> I can answer this session if I can list it based on groups *****/
|
||||
return ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session->SesCod);
|
||||
}
|
||||
|
||||
bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
|
||||
Usr_ICan_t ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
|
@ -1237,8 +1233,8 @@ bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
|
|||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -69,8 +69,8 @@ void ExaSes_GetAndCheckPars (struct Exa_Exams *Exams,
|
|||
void ExaSes_ReqCreatOrEditSes (void);
|
||||
void ExaSes_ReceiveSession (void);
|
||||
|
||||
bool ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
|
||||
const struct ExaSes_Session *Session);
|
||||
bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod);
|
||||
Usr_ICan_t ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
|
||||
const struct ExaSes_Session *Session);
|
||||
Usr_ICan_t ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -91,13 +91,13 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
|
|||
unsigned MaxSetInd,
|
||||
unsigned NumSets,
|
||||
MYSQL_RES *mysql_res,
|
||||
bool ICanEditSets);
|
||||
Usr_ICan_t ICanEditSets);
|
||||
static void ExaSet_PutTableHeadingForSets (void);
|
||||
|
||||
static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
|
||||
unsigned NumQsts,
|
||||
MYSQL_RES *mysql_res,
|
||||
bool ICanEditQuestions);
|
||||
Usr_ICan_t ICanEditQuestions);
|
||||
static void ExaSet_ListQuestionForEdition (struct Qst_Question *Question,
|
||||
unsigned QstInd,const char *Anchor);
|
||||
|
||||
|
@ -106,6 +106,8 @@ static void ExaSet_FreeListsSelectedQuestions (struct Exa_Exams *Exams);
|
|||
|
||||
static void ExaSet_CopyQstFromBankToExamSet (const struct ExaSet_Set *Set,long QstCod);
|
||||
|
||||
static Usr_ICan_t ExaSet_CheckIfICanEditExamSets (const struct Exa_Exam *Exam);
|
||||
|
||||
static void ExaSet_RemoveMediaFromStemOfQst (long QstCod,long SetCod);
|
||||
static void ExaSet_RemoveMediaFromAllAnsOfQst (long QstCod,long SetCod);
|
||||
|
||||
|
@ -251,7 +253,7 @@ void ExaSet_ReceiveSet (void)
|
|||
Exa_GetExamDataByCod (&Exams.Exam);
|
||||
|
||||
/***** Check if exam is editable *****/
|
||||
if (!Exa_CheckIfEditable (&Exams.Exam))
|
||||
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** If I can edit exams ==> receive set from form *****/
|
||||
|
@ -318,7 +320,7 @@ void ExaSet_ChangeSetTitle (void)
|
|||
char NewTitle[ExaSet_MAX_BYTES_TITLE + 1];
|
||||
|
||||
/***** Check if I can edit exams *****/
|
||||
if (!Exa_CheckIfICanEditExams ())
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Reset exams context *****/
|
||||
|
@ -330,7 +332,7 @@ void ExaSet_ChangeSetTitle (void)
|
|||
ExaSet_GetAndCheckPars (&Exams,&Set);
|
||||
|
||||
/***** Check if exam is editable *****/
|
||||
if (!Exa_CheckIfEditable (&Exams.Exam))
|
||||
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Receive new title from form *****/
|
||||
|
@ -361,7 +363,7 @@ void ExaSet_ChangeNumQstsToExam (void)
|
|||
unsigned NumQstsToPrint;
|
||||
|
||||
/***** Check if I can edit exams *****/
|
||||
if (!Exa_CheckIfICanEditExams ())
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Reset exams context *****/
|
||||
|
@ -373,7 +375,7 @@ void ExaSet_ChangeNumQstsToExam (void)
|
|||
ExaSet_GetAndCheckPars (&Exams,&Set);
|
||||
|
||||
/***** Check if exam is editable *****/
|
||||
if (!Exa_CheckIfEditable (&Exams.Exam))
|
||||
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get number of questions in set to appear in exam print *****/
|
||||
|
@ -480,7 +482,7 @@ void ExaSet_ListExamSets (struct Exa_Exams *Exams)
|
|||
MYSQL_RES *mysql_res;
|
||||
unsigned MaxSetInd;
|
||||
unsigned NumSets;
|
||||
bool ICanEditSets = Exa_CheckIfEditable (&Exams->Exam);
|
||||
Usr_ICan_t ICanEditSets = ExaSet_CheckIfICanEditExamSets (&Exams->Exam);
|
||||
|
||||
/***** Get maximum set index *****/
|
||||
MaxSetInd = Exa_DB_GetMaxSetIndexInExam (Exams->Exam.ExaCod);
|
||||
|
@ -516,14 +518,14 @@ static void ExaSet_ListSetQuestions (struct Exa_Exams *Exams,
|
|||
extern const char *Txt_Questions;
|
||||
MYSQL_RES *mysql_res;
|
||||
unsigned NumQsts;
|
||||
bool ICanEditQuestions = Exa_CheckIfEditable (&Exams->Exam);
|
||||
Usr_ICan_t ICanEditQuestions = ExaSet_CheckIfICanEditExamSets (&Exams->Exam);
|
||||
|
||||
/***** Begin box *****/
|
||||
Box_BoxBegin (Txt_Questions,
|
||||
ICanEditQuestions ? ExaSet_PutIconToAddNewQuestions :
|
||||
NULL,
|
||||
ICanEditQuestions ? Exams :
|
||||
NULL,
|
||||
ICanEditQuestions == Usr_I_CAN ? ExaSet_PutIconToAddNewQuestions :
|
||||
NULL,
|
||||
ICanEditQuestions == Usr_I_CAN ? Exams :
|
||||
NULL,
|
||||
Hlp_ASSESSMENT_Exams_questions,Box_NOT_CLOSABLE);
|
||||
|
||||
/***** Show table with questions *****/
|
||||
|
@ -546,7 +548,7 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
|
|||
unsigned MaxSetInd,
|
||||
unsigned NumSets,
|
||||
MYSQL_RES *mysql_res,
|
||||
bool ICanEditSets)
|
||||
Usr_ICan_t ICanEditSets)
|
||||
{
|
||||
extern const char *Txt_Movement_not_allowed;
|
||||
unsigned NumSet;
|
||||
|
@ -586,14 +588,14 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
|
|||
The_GetColorRows ());
|
||||
|
||||
/* Put icon to remove the set */
|
||||
if (ICanEditSets)
|
||||
if (ICanEditSets == Usr_I_CAN)
|
||||
Ico_PutContextualIconToRemove (ActReqRemExaSet,NULL,
|
||||
ExaSet_PutParsOneSet,Exams);
|
||||
else
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
|
||||
/* Put icon to move up the question */
|
||||
if (ICanEditSets && Set.SetInd > 1)
|
||||
if (ICanEditSets == Usr_I_CAN && Set.SetInd > 1)
|
||||
Lay_PutContextualLinkOnlyIcon (ActUp_ExaSet,Anchor,
|
||||
ExaSet_PutParsOneSet,Exams,
|
||||
"arrow-up.svg",Ico_BLACK);
|
||||
|
@ -785,7 +787,7 @@ void ExaSet_GetSetDataFromRow (MYSQL_RES *mysql_res,struct ExaSet_Set *Set)
|
|||
static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
|
||||
unsigned NumQsts,
|
||||
MYSQL_RES *mysql_res,
|
||||
bool ICanEditQuestions)
|
||||
Usr_ICan_t ICanEditQuestions)
|
||||
{
|
||||
extern const char *Txt_Questions;
|
||||
extern const char *Txt_No_INDEX;
|
||||
|
@ -839,7 +841,7 @@ static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
|
|||
HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ());
|
||||
|
||||
/* Put icon to remove the question */
|
||||
if (ICanEditQuestions)
|
||||
if (ICanEditQuestions == Usr_I_CAN)
|
||||
Ico_PutContextualIconToRemove (ActReqRemSetQst,NULL,
|
||||
ExaSet_PutParsOneQst,Exams);
|
||||
else
|
||||
|
@ -1250,7 +1252,7 @@ void ExaSet_ReqRemSet (void)
|
|||
ExaSet_GetAndCheckPars (&Exams,&Set);
|
||||
|
||||
/***** Check if exam is editable *****/
|
||||
if (!Exa_CheckIfEditable (&Exams.Exam))
|
||||
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Show question and button to remove question *****/
|
||||
|
@ -1282,7 +1284,7 @@ void ExaSet_RemoveSet (void)
|
|||
ExaSet_GetAndCheckPars (&Exams,&Set);
|
||||
|
||||
/***** Check if exam is editable *****/
|
||||
if (!Exa_CheckIfEditable (&Exams.Exam))
|
||||
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Remove the set from all tables *****/
|
||||
|
@ -1323,7 +1325,7 @@ void ExaSet_MoveUpSet (void)
|
|||
ExaSet_GetAndCheckPars (&Exams,&Set);
|
||||
|
||||
/***** Check if exam is editable *****/
|
||||
if (!Exa_CheckIfEditable (&Exams.Exam))
|
||||
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get set index *****/
|
||||
|
@ -1369,7 +1371,7 @@ void ExaSet_MoveDownSet (void)
|
|||
ExaSet_GetAndCheckPars (&Exams,&Set);
|
||||
|
||||
/***** Check if exam is editable *****/
|
||||
if (!Exa_CheckIfEditable (&Exams.Exam))
|
||||
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get set index *****/
|
||||
|
@ -1396,6 +1398,21 @@ void ExaSet_MoveDownSet (void)
|
|||
Exa_PutFormsOneExam (&Exams,Exa_EXISTING_EXAM);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**************** Check is edition of exam sets is possible ******************/
|
||||
/*****************************************************************************/
|
||||
// Before calling this function, number of sessions must be calculated
|
||||
|
||||
static Usr_ICan_t ExaSet_CheckIfICanEditExamSets (const struct Exa_Exam *Exam)
|
||||
{
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN)
|
||||
/***** Questions are editable only if exam has no sessions *****/
|
||||
return (Exam->NumSess == 0) ? Usr_I_CAN : // Exams with sessions should not be edited
|
||||
Usr_I_CAN_NOT;
|
||||
else
|
||||
return Usr_I_CAN_NOT; // Sets of questions are not editable
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/********************** Request the removal of a question ********************/
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -572,13 +572,13 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat)
|
|||
[PhoSha_SHAPE_OVAL ] = "PHOTOO60x80",
|
||||
[PhoSha_SHAPE_RECTANGLE] = "PHOTOR60x80",
|
||||
};
|
||||
bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat);
|
||||
Usr_ICan_t ICanView = Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat);
|
||||
|
||||
HTM_DIV_Begin ("class=\"FOLLOW_USR\"");
|
||||
|
||||
/***** Show user's photo *****/
|
||||
HTM_DIV_Begin ("class=\"FOLLOW_PHOTO\"");
|
||||
if (Visible)
|
||||
if (ICanView == Usr_I_CAN)
|
||||
Pho_ShowUsrPhotoIfAllowed (UsrDat,
|
||||
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
|
||||
HTM_DIV_End ();
|
||||
|
@ -586,7 +586,7 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat)
|
|||
/***** Show user's name and icon to follow/unfollow *****/
|
||||
HTM_DIV_Begin ("class=\"FOLLOW_TXT\"");
|
||||
|
||||
if (Visible)
|
||||
if (ICanView == Usr_I_CAN)
|
||||
{
|
||||
/* Put form to go to public profile */
|
||||
Frm_BeginForm (ActSeeOthPubPrf);
|
||||
|
@ -612,7 +612,7 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat)
|
|||
UsrDat->UsrCod)) // I follow user
|
||||
/* Form to unfollow */
|
||||
Fol_PutIconToUnfollow (UsrDat->EnUsrCod);
|
||||
else if (Visible) // I do not follow this user and I can follow
|
||||
else if (ICanView == Usr_I_CAN) // I do not follow this user and I can follow
|
||||
/* Form to follow */
|
||||
Fol_PutIconToFollow (UsrDat->EnUsrCod);
|
||||
}
|
||||
|
@ -636,13 +636,13 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat)
|
|||
[PhoSha_SHAPE_OVAL ] = "PHOTOO21x28",
|
||||
[PhoSha_SHAPE_RECTANGLE] = "PHOTOR21x28",
|
||||
};
|
||||
bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat);
|
||||
Usr_ICan_t ICanView = Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat);
|
||||
|
||||
/***** Show user's photo *****/
|
||||
HTM_TR_Begin (NULL);
|
||||
|
||||
HTM_TD_Begin ("class=\"CON_PHOTO %s\"",The_GetColorRows ());
|
||||
if (Visible)
|
||||
if (ICanView == Usr_I_CAN)
|
||||
Pho_ShowUsrPhotoIfAllowed (UsrDat,
|
||||
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
|
||||
HTM_TD_End ();
|
||||
|
@ -650,7 +650,7 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat)
|
|||
/***** User's name *****/
|
||||
HTM_TD_Begin ("class=\"CON_NAME_FOLLOW %s\"",
|
||||
The_GetColorRows ());
|
||||
if (Visible)
|
||||
if (ICanView == Usr_I_CAN)
|
||||
{
|
||||
/* Put form to go to public profile */
|
||||
Frm_BeginForm (ActSeeOthPubPrf);
|
||||
|
@ -679,7 +679,7 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat)
|
|||
UsrDat->UsrCod)) // I follow user
|
||||
/* Form to unfollow */
|
||||
Fol_PutIconToUnfollow (UsrDat->EnUsrCod);
|
||||
else if (Visible) // I do not follow this user and I can follow
|
||||
else if (ICanView == Usr_I_CAN) // I do not follow this user and I can follow
|
||||
/* Form to follow */
|
||||
Fol_PutIconToFollow (UsrDat->EnUsrCod);
|
||||
}
|
||||
|
|
21
swad_forum.c
21
swad_forum.c
|
@ -379,7 +379,7 @@ static void For_WriteFormForumPst (struct For_Forums *Forums,
|
|||
|
||||
static void For_PutParsRemThread (void *Forums);
|
||||
|
||||
static bool For_CheckIfICanMoveThreads (void);
|
||||
static Usr_ICan_t For_CheckIfICanMoveThreads (void);
|
||||
static void For_InsertThrInClipboard (long ThrCod);
|
||||
|
||||
static void For_ShowStatOfAForumType (For_ForumType_t ForumType,
|
||||
|
@ -720,7 +720,7 @@ void For_ShowPostsOfAThread (struct For_Forums *Forums,
|
|||
For_GetThreadData (&Thread);
|
||||
|
||||
/***** Get if there is a thread ready to be moved *****/
|
||||
if (For_CheckIfICanMoveThreads ())
|
||||
if (For_CheckIfICanMoveThreads () == Usr_I_CAN)
|
||||
Forums->Thread.ToMove = For_DB_GetThrInMyClipboard ();
|
||||
|
||||
/***** Get thread read time for the current user *****/
|
||||
|
@ -871,7 +871,7 @@ static void For_PutIconsOneThread (void *Forums)
|
|||
|
||||
/***** Put icon to get resource link *****/
|
||||
if (((struct For_Forums *) Forums)->Forum.Type == For_FORUM_COURSE_USRS &&
|
||||
Rsc_CheckIfICanGetLink ())
|
||||
Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkForCrsUsr,NULL,
|
||||
For_PutParsNewPost,Forums);
|
||||
}
|
||||
|
@ -1233,7 +1233,7 @@ void For_ShowForumList (struct For_Forums *Forums)
|
|||
bool ICanSeeDegForum;
|
||||
|
||||
/***** Get if there is a thread ready to be moved *****/
|
||||
if (For_CheckIfICanMoveThreads ())
|
||||
if (For_CheckIfICanMoveThreads () == Usr_I_CAN)
|
||||
Forums->Thread.ToMove = For_DB_GetThrInMyClipboard ();
|
||||
|
||||
/***** Fill the list with the institutions I belong to *****/
|
||||
|
@ -2182,7 +2182,7 @@ static void For_PutIconsThreads (void *Forums)
|
|||
|
||||
/***** Put icon to get resource link *****/
|
||||
if (((struct For_Forums *) Forums)->Forum.Type == For_FORUM_COURSE_USRS &&
|
||||
Rsc_CheckIfICanGetLink ())
|
||||
Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkForCrsUsr,NULL,
|
||||
For_PutParsNewPost,Forums);
|
||||
}
|
||||
|
@ -2232,10 +2232,10 @@ static void For_ListForumThrs (struct For_Forums *Forums,
|
|||
long ThreadInMyClipboard = -1L;
|
||||
unsigned Column;
|
||||
const char *BgColor;
|
||||
bool ICanMoveThreads;
|
||||
Usr_ICan_t ICanMoveThreads = For_CheckIfICanMoveThreads ();
|
||||
|
||||
/***** Get if there is a thread ready to be moved *****/
|
||||
if ((ICanMoveThreads = For_CheckIfICanMoveThreads ()))
|
||||
if (ICanMoveThreads == Usr_I_CAN)
|
||||
ThreadInMyClipboard = For_DB_GetThrInMyClipboard ();
|
||||
|
||||
/***** Initialize structure with user's data *****/
|
||||
|
@ -2288,7 +2288,7 @@ static void For_ListForumThrs (struct For_Forums *Forums,
|
|||
}
|
||||
|
||||
/***** Put button to cut the thread for moving it to another forum *****/
|
||||
if (ICanMoveThreads)
|
||||
if (ICanMoveThreads == Usr_I_CAN)
|
||||
{
|
||||
HTM_BR ();
|
||||
Frm_BeginFormAnchor (For_ActionsCutThrFor[Forums->Forum.Type],
|
||||
|
@ -3238,9 +3238,10 @@ void For_PasteThread (void)
|
|||
/*********************** Check if I can move threads *************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool For_CheckIfICanMoveThreads (void)
|
||||
static Usr_ICan_t For_CheckIfICanMoveThreads (void)
|
||||
{
|
||||
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); // If I have permission to move threads...
|
||||
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN : // If I have permission to move threads...
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
102
swad_game.c
102
swad_game.c
|
@ -113,8 +113,8 @@ extern struct Globals Gbl;
|
|||
|
||||
static void Gam_ListAllGamesHeading (const struct Gam_Games *Games);
|
||||
|
||||
static bool Gam_CheckIfICanEditGames (void);
|
||||
static bool Gam_CheckIfICanListGameQuestions (void);
|
||||
static Usr_ICan_t Gam_CheckIfICanEditGames (void);
|
||||
static Usr_ICan_t Gam_CheckIfICanListGameQuestions (void);
|
||||
static void Gam_PutIconsListingGames (void *Games);
|
||||
static void Gam_PutIconToCreateNewGame (struct Gam_Games *Games);
|
||||
static void Gam_PutParsToCreateNewGame (void *Games);
|
||||
|
@ -153,7 +153,7 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games);
|
|||
static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
|
||||
unsigned NumQsts,
|
||||
MYSQL_RES *mysql_res,
|
||||
bool ICanEditQuestions);
|
||||
Usr_ICan_t ICanEditQuestions);
|
||||
|
||||
static void Gam_PutIconToAddNewQuestions (void *Games);
|
||||
|
||||
|
@ -163,7 +163,7 @@ static void Gam_FreeListsSelectedQuestions (struct Gam_Games *Games);
|
|||
static void Gam_ExchangeQuestions (long GamCod,
|
||||
unsigned QstIndTop,unsigned QstIndBottom);
|
||||
|
||||
static bool Gam_CheckIfEditable (const struct Gam_Game *Game);
|
||||
static Usr_ICan_t Gam_CheckIfICanEditGame (const struct Gam_Game *Game);
|
||||
|
||||
/*****************************************************************************/
|
||||
/*************************** Reset games context *****************************/
|
||||
|
@ -346,9 +346,9 @@ static void Gam_ListAllGamesHeading (const struct Gam_Games *Games)
|
|||
/************************ Check if I can edit games **************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Gam_CheckIfICanEditGames (void)
|
||||
static Usr_ICan_t Gam_CheckIfICanEditGames (void)
|
||||
{
|
||||
static const bool ICanEditGames[Rol_NUM_ROLES] =
|
||||
static bool ICanEditGames[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
|
@ -361,13 +361,13 @@ static bool Gam_CheckIfICanEditGames (void)
|
|||
/**************** Check if I can list questions in games *********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Gam_CheckIfICanListGameQuestions (void)
|
||||
static Usr_ICan_t Gam_CheckIfICanListGameQuestions (void)
|
||||
{
|
||||
static const bool ICanListGameQuestions[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanListGameQuestions[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_NET ] = true,
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_NET ] = Usr_I_CAN,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanListGameQuestions[Gbl.Usrs.Me.Role.Logged];
|
||||
|
@ -390,7 +390,7 @@ static void Gam_PutIconsListingGames (void *Games)
|
|||
if (Games)
|
||||
{
|
||||
/***** Put icon to create a new game *****/
|
||||
if (Gam_CheckIfICanEditGames ())
|
||||
if (Gam_CheckIfICanEditGames () == Usr_I_CAN)
|
||||
Gam_PutIconToCreateNewGame ((struct Gam_Games *) Games);
|
||||
|
||||
/***** Put icon to view matches results *****/
|
||||
|
@ -399,9 +399,8 @@ static void Gam_PutIconsListingGames (void *Games)
|
|||
NULL,NULL);
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL,
|
||||
Gam_PutPars,Games);
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL,Gam_PutPars,Games);
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
Fig_PutIconToShowFigure (Fig_GAMES);
|
||||
|
@ -687,8 +686,7 @@ static void Gam_PutIconsEditingOneGame (void *Games)
|
|||
{
|
||||
if (Games)
|
||||
/***** Icon to view game *****/
|
||||
Ico_PutContextualIconToView (ActLstOneGam,NULL,
|
||||
Gam_PutPars,Games);
|
||||
Ico_PutContextualIconToView (ActLstOneGam,NULL,Gam_PutPars,Games);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -729,7 +727,7 @@ static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games,
|
|||
[Rol_SYS_ADM] = ActSeeUsrMchResGam,
|
||||
};
|
||||
|
||||
if (Gam_CheckIfICanEditGames ())
|
||||
if (Gam_CheckIfICanEditGames () == Usr_I_CAN)
|
||||
{
|
||||
/***** Icon to remove game *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemGam,NULL,
|
||||
|
@ -741,14 +739,12 @@ static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games,
|
|||
Games->Game.HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit game *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneGam,NULL,
|
||||
Gam_PutPars,Games);
|
||||
Ico_PutContextualIconToEdit (ActEdiOneGam,NULL,Gam_PutPars,Games);
|
||||
}
|
||||
|
||||
if (Gam_CheckIfICanListGameQuestions ())
|
||||
if (Gam_CheckIfICanListGameQuestions () == Usr_I_CAN)
|
||||
/***** Icon to view game listing its questions *****/
|
||||
Ico_PutContextualIconToView (ActLstOneGam,NULL,
|
||||
Gam_PutPars,Games);
|
||||
Ico_PutContextualIconToView (ActLstOneGam,NULL,Gam_PutPars,Games);
|
||||
|
||||
/***** Put icon to view matches results *****/
|
||||
if (ActionShowResults[Gbl.Usrs.Me.Role.Logged])
|
||||
|
@ -756,9 +752,8 @@ static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games,
|
|||
Gam_PutPars,Games);
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL,
|
||||
Gam_PutPars,Games);
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkGam,NULL,Gam_PutPars,Games);
|
||||
|
||||
}
|
||||
|
||||
|
@ -1054,7 +1049,7 @@ void Gam_AskRemGame (void)
|
|||
|
||||
/***** Get data of the game from database *****/
|
||||
Gam_GetGameDataByCod (&Games.Game);
|
||||
if (!Gam_CheckIfICanEditGames ())
|
||||
if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Show question and button to remove game *****/
|
||||
|
@ -1087,7 +1082,7 @@ void Gam_RemoveGame (void)
|
|||
|
||||
/***** Get data of the game from database *****/
|
||||
Gam_GetGameDataByCod (&Games.Game);
|
||||
if (!Gam_CheckIfICanEditGames ())
|
||||
if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Remove game from all tables *****/
|
||||
|
@ -1163,7 +1158,7 @@ static void Gam_HideUnhideGame (HidVis_HiddenOrVisible_t HiddenOrVisible)
|
|||
|
||||
/***** Get data of the game from database *****/
|
||||
Gam_GetGameDataByCod (&Games.Game);
|
||||
if (!Gam_CheckIfICanEditGames ())
|
||||
if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Unhide game *****/
|
||||
|
@ -1189,7 +1184,7 @@ void Gam_ListGame (void)
|
|||
Gam_ResetGame (&Games.Game);
|
||||
|
||||
/***** Check if I can list game questions *****/
|
||||
if (!Gam_CheckIfICanListGameQuestions ())
|
||||
if (Gam_CheckIfICanListGameQuestions () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get parameters *****/
|
||||
|
@ -1223,7 +1218,7 @@ void Gam_ReqCreatOrEditGame (void)
|
|||
Gam_ResetGame (&Games.Game);
|
||||
|
||||
/***** Check if I can edit games *****/
|
||||
if (!Gam_CheckIfICanEditGames ())
|
||||
if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get parameters *****/
|
||||
|
@ -1439,7 +1434,7 @@ void Gam_ReceiveGame (void)
|
|||
Gam_ResetGame (&Games.Game);
|
||||
|
||||
/***** Check if I can edit games *****/
|
||||
if (!Gam_CheckIfICanEditGames ())
|
||||
if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get parameters *****/
|
||||
|
@ -1568,7 +1563,7 @@ void Gam_ReqSelectQstsToAddToGame (void)
|
|||
Gam_GetGameDataByCod (&Games.Game);
|
||||
|
||||
/***** Check if game has matches *****/
|
||||
if (!Gam_CheckIfEditable (&Games.Game))
|
||||
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Show form to create a new question in this game *****/
|
||||
|
@ -1600,7 +1595,7 @@ void Gam_ListQstsToAddToGame (void)
|
|||
Gam_GetGameDataByCod (&Games.Game);
|
||||
|
||||
/***** Check if game has matches *****/
|
||||
if (!Gam_CheckIfEditable (&Games.Game))
|
||||
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** List several test questions for selection *****/
|
||||
|
@ -1640,17 +1635,17 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games)
|
|||
extern const char *Txt_Questions;
|
||||
MYSQL_RES *mysql_res;
|
||||
unsigned NumQsts;
|
||||
bool ICanEditQuestions = Gam_CheckIfEditable (&Games->Game);
|
||||
Usr_ICan_t ICanEditQuestions = Gam_CheckIfICanEditGame (&Games->Game);
|
||||
|
||||
/***** Get data of questions from database *****/
|
||||
NumQsts = Gam_DB_GetGameQuestionsBasic (&mysql_res,Games->Game.GamCod);
|
||||
|
||||
/***** Begin box *****/
|
||||
Box_BoxBegin (Txt_Questions,
|
||||
ICanEditQuestions ? Gam_PutIconToAddNewQuestions :
|
||||
NULL,
|
||||
ICanEditQuestions ? Games :
|
||||
NULL,
|
||||
ICanEditQuestions == Usr_I_CAN ? Gam_PutIconToAddNewQuestions :
|
||||
NULL,
|
||||
ICanEditQuestions == Usr_I_CAN ? Games :
|
||||
NULL,
|
||||
Hlp_ASSESSMENT_Games_questions,Box_NOT_CLOSABLE);
|
||||
|
||||
/***** Show table with questions *****/
|
||||
|
@ -1672,7 +1667,7 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games)
|
|||
static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
|
||||
unsigned NumQsts,
|
||||
MYSQL_RES *mysql_res,
|
||||
bool ICanEditQuestions)
|
||||
Usr_ICan_t ICanEditQuestions)
|
||||
{
|
||||
extern const char *Txt_Questions;
|
||||
extern const char *Txt_No_INDEX;
|
||||
|
@ -1741,14 +1736,14 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
|
|||
HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ());
|
||||
|
||||
/* Put icon to remove the question */
|
||||
if (ICanEditQuestions)
|
||||
if (ICanEditQuestions == Usr_I_CAN)
|
||||
Ico_PutContextualIconToRemove (ActReqRemGamQst,NULL,
|
||||
Gam_PutParsOneQst,Games);
|
||||
else
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
|
||||
/* Put icon to move up the question */
|
||||
if (ICanEditQuestions && QstInd > 1)
|
||||
if (ICanEditQuestions == Usr_I_CAN && QstInd > 1)
|
||||
Lay_PutContextualLinkOnlyIcon (ActUp_GamQst,Anchor,
|
||||
Gam_PutParsOneQst,Games,
|
||||
"arrow-up.svg",Ico_BLACK);
|
||||
|
@ -1757,7 +1752,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
|
|||
Txt_Movement_not_allowed);
|
||||
|
||||
/* Put icon to move down the question */
|
||||
if (ICanEditQuestions && QstInd < MaxQstInd)
|
||||
if (ICanEditQuestions == Usr_I_CAN && QstInd < MaxQstInd)
|
||||
Lay_PutContextualLinkOnlyIcon (ActDwnGamQst,Anchor,
|
||||
Gam_PutParsOneQst,Games,
|
||||
"arrow-down.svg",Ico_BLACK);
|
||||
|
@ -1766,7 +1761,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
|
|||
Txt_Movement_not_allowed);
|
||||
|
||||
/* Put icon to edit the question */
|
||||
if (ICanEditQuestions)
|
||||
if (ICanEditQuestions == Usr_I_CAN)
|
||||
Ico_PutContextualIconToEdit (ActEdiOneTstQst,NULL,
|
||||
Qst_PutParQstCod,&Question.QstCod);
|
||||
|
||||
|
@ -1827,7 +1822,7 @@ void Gam_AddQstsToGame (void)
|
|||
Gam_GetGameDataByCod (&Games.Game);
|
||||
|
||||
/***** Check if game has matches *****/
|
||||
if (!Gam_CheckIfEditable (&Games.Game))
|
||||
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get selected questions *****/
|
||||
|
@ -1935,7 +1930,7 @@ void Gam_ReqRemQstFromGame (void)
|
|||
Gam_GetGameDataByCod (&Games.Game);
|
||||
|
||||
/***** Check if game has matches *****/
|
||||
if (!Gam_CheckIfEditable (&Games.Game))
|
||||
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get question index *****/
|
||||
|
@ -1977,7 +1972,7 @@ void Gam_RemoveQstFromGame (void)
|
|||
Gam_GetGameDataByCod (&Games.Game);
|
||||
|
||||
/***** Check if game has matches *****/
|
||||
if (!Gam_CheckIfEditable (&Games.Game))
|
||||
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get question index *****/
|
||||
|
@ -2026,7 +2021,7 @@ void Gam_MoveUpQst (void)
|
|||
Gam_GetGameDataByCod (&Games.Game);
|
||||
|
||||
/***** Check if game has matches *****/
|
||||
if (!Gam_CheckIfEditable (&Games.Game))
|
||||
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get question index *****/
|
||||
|
@ -2076,7 +2071,7 @@ void Gam_MoveDownQst (void)
|
|||
Gam_GetGameDataByCod (&Games.Game);
|
||||
|
||||
/***** Check if game has matches *****/
|
||||
if (!Gam_CheckIfEditable (&Games.Game))
|
||||
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get question index *****/
|
||||
|
@ -2155,13 +2150,14 @@ static void Gam_ExchangeQuestions (long GamCod,
|
|||
/*****************************************************************************/
|
||||
// Before calling this function, number of matches must be calculated
|
||||
|
||||
static bool Gam_CheckIfEditable (const struct Gam_Game *Game)
|
||||
static Usr_ICan_t Gam_CheckIfICanEditGame (const struct Gam_Game *Game)
|
||||
{
|
||||
if (Gam_CheckIfICanEditGames ())
|
||||
if (Gam_CheckIfICanEditGames () == Usr_I_CAN)
|
||||
/***** Questions are editable only if game has no matches *****/
|
||||
return Game->NumMchs == 0; // Games with matches should not be edited
|
||||
return Game->NumMchs == 0 ? Usr_I_CAN : // Games with matches should not be edited
|
||||
Usr_I_CAN_NOT;
|
||||
else
|
||||
return false; // Questions are not editable
|
||||
return Usr_I_CAN_NOT; // Questions are not editable
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
42
swad_group.c
42
swad_group.c
|
@ -66,20 +66,6 @@
|
|||
#define Grp_GROUPS_SECTION_ID "grps"
|
||||
#define Grp_NEW_GROUP_SECTION_ID "new_grp"
|
||||
|
||||
static const bool Grp_ICanChangeGrps[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_UNK ] = false,
|
||||
[Rol_GST ] = false,
|
||||
[Rol_USR ] = false,
|
||||
[Rol_STD ] = true,
|
||||
[Rol_NET ] = false,
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_DEG_ADM] = false,
|
||||
[Rol_CTR_ADM] = false,
|
||||
[Rol_INS_ADM] = false,
|
||||
[Rol_SYS_ADM] = true,
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/************* External global variables from others modules *****************/
|
||||
/*****************************************************************************/
|
||||
|
@ -90,6 +76,8 @@ extern struct Globals Gbl;
|
|||
/***************************** Private prototypes ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static Usr_ICan_t Grp_CheckIfICanChangeGrps (void);
|
||||
|
||||
static void Grp_ReqEditGroupsInternal (Ale_AlertType_t AlertTypeGroupTypes,const char *AlertTextGroupTypes,
|
||||
Ale_AlertType_t AlertTypeGroups,const char *AlertTextGroups);
|
||||
static void Grp_ReqEditGroupsInternal0 (void);
|
||||
|
@ -143,6 +131,22 @@ static void Grp_WriteMaxStds (char Str[Cns_MAX_DECIMAL_DIGITS_UINT + 1],unsigned
|
|||
static void Grp_PutParGrpTypCod (void *GrpTypCod);
|
||||
static void Grp_PutParGrpCod (void *GrpCod);
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************ Check if I can change groups ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static Usr_ICan_t Grp_CheckIfICanChangeGrps (void)
|
||||
{
|
||||
static Usr_ICan_t Grp_ICanChangeGrps[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_STD ] = Usr_I_CAN,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return Grp_ICanChangeGrps[Gbl.Usrs.Me.Role.Logged];
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************* Write the names of the selected groups ******************/
|
||||
/*****************************************************************************/
|
||||
|
@ -624,7 +628,7 @@ void Grp_ChangeMyGrps (Cns_QuietOrVerbose_t QuietOrVerbose)
|
|||
bool ChangesMade;
|
||||
|
||||
/***** Can I change my groups? *****/
|
||||
if (Grp_ICanChangeGrps[Gbl.Usrs.Me.Role.Logged])
|
||||
if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN)
|
||||
{
|
||||
/***** Get list of groups types and groups in this course *****/
|
||||
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
|
||||
|
@ -683,7 +687,7 @@ void Grp_ChangeOtherUsrGrps (void)
|
|||
bool SelectionIsValid;
|
||||
|
||||
/***** Can I change another user's groups? *****/
|
||||
if (Grp_ICanChangeGrps[Gbl.Usrs.Me.Role.Logged])
|
||||
if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN)
|
||||
{
|
||||
/***** Get list of groups types and groups in current course *****/
|
||||
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
|
||||
|
@ -1340,8 +1344,7 @@ static void Grp_PutIconsEditingGroupTypes (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Grp_PutIconToViewGroups (void)
|
||||
{
|
||||
Ico_PutContextualIconToView (ActReqSelGrp,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActReqSelGrp,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1773,8 +1776,7 @@ void Grp_ShowLstGrpsToChgMyGrps (void)
|
|||
|
||||
static void Grp_PutIconToEditGroups (__attribute__((unused)) void *Args)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActReqEdiGrp,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActReqEdiGrp,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -707,23 +707,23 @@ void Hie_GetAndWriteInsCtrDegAdminBy (long UsrCod,unsigned ColSpan)
|
|||
/****************** Check if I can edit hierarchy elements *******************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Hie_CheckIfICanEdit (void)
|
||||
Usr_ICan_t Hie_CheckIfICanEdit (void)
|
||||
{
|
||||
// Some admins can edit all hierarchy elements.
|
||||
// Any user can edit the elements he/she has created...
|
||||
// ...as long as they are in pending status.
|
||||
static const bool ICanEdit[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanEdit[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_GST ] = true,
|
||||
[Rol_USR ] = true,
|
||||
[Rol_STD ] = true,
|
||||
[Rol_NET ] = true,
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_DEG_ADM] = true,
|
||||
[Rol_CTR_ADM] = true,
|
||||
[Rol_INS_ADM] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_GST ] = Usr_I_CAN,
|
||||
[Rol_USR ] = Usr_I_CAN,
|
||||
[Rol_STD ] = Usr_I_CAN,
|
||||
[Rol_NET ] = Usr_I_CAN,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_DEG_ADM] = Usr_I_CAN,
|
||||
[Rol_CTR_ADM] = Usr_I_CAN,
|
||||
[Rol_INS_ADM] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanEdit[Gbl.Usrs.Me.Role.Logged];
|
||||
|
|
|
@ -49,7 +49,7 @@ void Hie_ResetHierarchy (void);
|
|||
|
||||
void Hie_GetAndWriteInsCtrDegAdminBy (long UsrCod,unsigned ColSpan);
|
||||
|
||||
bool Hie_CheckIfICanEdit (void);
|
||||
Usr_ICan_t Hie_CheckIfICanEdit (void);
|
||||
|
||||
void Hie_WriteStatusCell (Hie_Status_t Status,
|
||||
const char *Class,const char *BgColor,
|
||||
|
|
|
@ -44,17 +44,6 @@
|
|||
#include "swad_parameter.h"
|
||||
#include "swad_parameter_code.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************** Private constants ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static const bool Hld_ICanEditHlds[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_INS_ADM] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/************** External global variables from others modules ****************/
|
||||
/*****************************************************************************/
|
||||
|
@ -71,6 +60,8 @@ static struct Hld_Holiday *Hld_EditingHld = NULL; // Static variable to keep the
|
|||
/***************************** Private prototypes ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static Usr_ICan_t Hld_CheckIfICanEditHlds (void);
|
||||
|
||||
static Hld_Order_t Hld_GetParHldOrder (void);
|
||||
static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args);
|
||||
static void Hld_PutIconsEditHolidays (__attribute__((unused)) void *Args);
|
||||
|
@ -93,6 +84,22 @@ static void Hld_PutHeadHolidays (void);
|
|||
static void Hld_EditingHolidayConstructor (void);
|
||||
static void Hld_EditingHolidayDestructor (void);
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************ Check if I can edit holidays ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static Usr_ICan_t Hld_CheckIfICanEditHlds (void)
|
||||
{
|
||||
static Usr_ICan_t Hld_ICanEditHlds[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_INS_ADM] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return Hld_ICanEditHlds[Gbl.Usrs.Me.Role.Logged];
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************* Reset departments context *************************/
|
||||
/*****************************************************************************/
|
||||
|
@ -234,9 +241,8 @@ static Hld_Order_t Hld_GetParHldOrder (void)
|
|||
static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Edit holidays *****/
|
||||
if (Hld_ICanEditHlds[Gbl.Usrs.Me.Role.Logged])
|
||||
Ico_PutContextualIconToEdit (ActEdiHld,NULL,
|
||||
NULL,NULL);
|
||||
if (Hld_CheckIfICanEditHlds () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToEdit (ActEdiHld,NULL,NULL,NULL);
|
||||
|
||||
/***** View calendar *****/
|
||||
Cal_PutIconToSeeCalendar ();
|
||||
|
@ -245,8 +251,7 @@ static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args)
|
|||
static void Hld_PutIconsEditHolidays (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view holidays *****/
|
||||
Ico_PutContextualIconToView (ActSeeHld,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeHld,NULL,NULL,NULL);
|
||||
|
||||
/***** View calendar *****/
|
||||
Cal_PutIconToSeeCalendar ();
|
||||
|
|
|
@ -89,7 +89,7 @@ static void Ins_GetInstitDataFromRow (MYSQL_RES *mysql_res,
|
|||
bool GetNumUsrsWhoClaimToBelongToIns);
|
||||
|
||||
static void Ins_ListInstitutionsForEdition (void);
|
||||
static bool Ins_CheckIfICanEdit (struct Hie_Node *Ins);
|
||||
static Usr_ICan_t Ins_CheckIfICanEdit (struct Hie_Node *Ins);
|
||||
|
||||
static void Ins_UpdateInsNameDB (long InsCod,const char *FldName,const char *NewName);
|
||||
|
||||
|
@ -331,7 +331,7 @@ static void Ins_ListInstitutions (void)
|
|||
static void Ins_PutIconsListingInstitutions (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit institutions *****/
|
||||
if (Hie_CheckIfICanEdit ())
|
||||
if (Hie_CheckIfICanEdit () == Usr_I_CAN)
|
||||
Ins_PutIconToEditInstitutions ();
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
|
@ -344,8 +344,7 @@ static void Ins_PutIconsListingInstitutions (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Ins_PutIconToEditInstitutions (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiIns,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiIns,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -556,8 +555,7 @@ static void Ins_EditInstitutionsInternal (void)
|
|||
static void Ins_PutIconsEditingInstitutions (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view institutions *****/
|
||||
Ico_PutContextualIconToView (ActSeeIns,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeIns,NULL,NULL,NULL);
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
Fig_PutIconToShowFigure (Fig_INSTITS);
|
||||
|
@ -884,7 +882,7 @@ static void Ins_ListInstitutionsForEdition (void)
|
|||
struct Hie_Node *Ins;
|
||||
char WWW[Cns_MAX_BYTES_WWW + 1];
|
||||
struct Usr_Data UsrDat;
|
||||
bool ICanEdit;
|
||||
Usr_ICan_t ICanEdit;
|
||||
unsigned NumCtrs;
|
||||
unsigned NumUsrsIns;
|
||||
unsigned NumUsrsInCrssOfIns;
|
||||
|
@ -920,7 +918,7 @@ static void Ins_ListInstitutionsForEdition (void)
|
|||
|
||||
/* Put icon to remove institution */
|
||||
HTM_TD_Begin ("class=\"BT\"");
|
||||
if (!ICanEdit ||
|
||||
if (ICanEdit == Usr_I_CAN_NOT ||
|
||||
NumCtrs || // Institution has centers
|
||||
NumUsrsIns || // Institution has users
|
||||
NumUsrsInCrssOfIns) // Institution has users
|
||||
|
@ -947,11 +945,12 @@ static void Ins_ListInstitutionsForEdition (void)
|
|||
Nam_ExistingShortAndFullNames (ActionRename,
|
||||
ParCod_OthHie,Ins->HieCod,
|
||||
Names,
|
||||
ICanEdit); // Put form?
|
||||
ICanEdit == Usr_I_CAN ? Frm_PUT_FORM :
|
||||
Frm_DONT_PUT_FORM);
|
||||
|
||||
/* Institution WWW */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit)
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (ActChgInsWWW);
|
||||
ParCod_PutPar (ParCod_OthHie,Ins->HieCod);
|
||||
|
@ -1014,11 +1013,12 @@ static void Ins_ListInstitutionsForEdition (void)
|
|||
/************ Check if I can edit, remove, etc. an institution ***************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Ins_CheckIfICanEdit (struct Hie_Node *Ins)
|
||||
static Usr_ICan_t Ins_CheckIfICanEdit (struct Hie_Node *Ins)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM || // I am a superuser
|
||||
((Ins->Status & Hie_STATUS_BIT_PENDING) != 0 && // Institution is not yet activated
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod == Ins->RequesterUsrCod); // I am the requester
|
||||
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM || // I am a superuser
|
||||
((Ins->Status & Hie_STATUS_BIT_PENDING) != 0 && // Institution is not yet activated
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod == Ins->RequesterUsrCod)) ? Usr_I_CAN : // I am the requester
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1041,12 +1041,14 @@ void Ins_RemoveInstitution (void)
|
|||
/***** Get data of the institution from database *****/
|
||||
Hie_GetDataByCod[Hie_INS] (Ins_EditingIns);
|
||||
|
||||
/***** Check if this institution has users *****/
|
||||
if (!Ins_CheckIfICanEdit (Ins_EditingIns))
|
||||
/***** Check if I can edit this institution *****/
|
||||
if (Ins_CheckIfICanEdit (Ins_EditingIns) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
else if (Hie_GetNumNodesInHieLvl (Hie_CTR, // Number of centers...
|
||||
Hie_INS, // ...in institution
|
||||
Ins_EditingIns->HieCod))
|
||||
|
||||
/***** Check if this institution has centers or users *****/
|
||||
if (Hie_GetNumNodesInHieLvl (Hie_CTR, // Number of centers...
|
||||
Hie_INS, // ...in institution
|
||||
Ins_EditingIns->HieCod))
|
||||
// Institution has centers ==> don't remove
|
||||
Ale_CreateAlert (Ale_WARNING,NULL,
|
||||
Txt_To_remove_an_institution_you_must_first_remove_all_centers_and_users_in_the_institution);
|
||||
|
|
37
swad_link.c
37
swad_link.c
|
@ -45,16 +45,6 @@
|
|||
#include "swad_parameter.h"
|
||||
#include "swad_parameter_code.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************** Private constants ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static const bool Lnk_ICanEditLinks[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_SYS_ADM] = true,
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/************** External global variables from others modules ****************/
|
||||
/*****************************************************************************/
|
||||
|
@ -81,6 +71,8 @@ static struct Lnk_Link *Lnk_EditingLnk = NULL; // Static variable to keep the li
|
|||
/***************************** Private prototypes ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static Usr_ICan_t Lnk_CheckIfICanEditLinks (void);
|
||||
|
||||
static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args);
|
||||
static void Lnk_PutIconToEditLinks (void);
|
||||
static void Lnk_WriteListOfLinks (const struct Lnk_Links *Links,const char *Class);
|
||||
|
@ -104,6 +96,21 @@ static void Lnk_PutHeadLinks (void);
|
|||
static void Lnk_EditingLinkConstructor (void);
|
||||
static void Lnk_EditingLinkDestructor (void);
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************* Check if I can edit links *************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static Usr_ICan_t Lnk_CheckIfICanEditLinks (void)
|
||||
{
|
||||
static bool Lnk_ICanEditLinks[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return Lnk_ICanEditLinks[Gbl.Usrs.Me.Role.Logged];
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************** List all links *******************************/
|
||||
/*****************************************************************************/
|
||||
|
@ -142,7 +149,7 @@ void Lnk_SeeLinks (void)
|
|||
static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit links *****/
|
||||
if (Lnk_ICanEditLinks[Gbl.Usrs.Me.Role.Logged])
|
||||
if (Lnk_CheckIfICanEditLinks () == Usr_I_CAN)
|
||||
Lnk_PutIconToEditLinks ();
|
||||
|
||||
/***** Put icon to view banners *****/
|
||||
|
@ -155,8 +162,7 @@ static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Lnk_PutIconToEditLinks (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiLnk,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiLnk,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -269,8 +275,7 @@ static void Lnk_EditLinksInternal (void)
|
|||
static void Lnk_PutIconsEditingLinks (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view links *****/
|
||||
Ico_PutContextualIconToView (ActSeeLnk,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeLnk,NULL,NULL,NULL);
|
||||
|
||||
/***** Put icon to view banners *****/
|
||||
Ban_PutIconToViewBanners ();
|
||||
|
@ -436,7 +441,7 @@ static void Lnk_ListLinksForEdition (const struct Lnk_Links *Links)
|
|||
Nam_ExistingShortAndFullNames (ActionRename,
|
||||
ParCod_Lnk,Lnk->LnkCod,
|
||||
Names,
|
||||
true); // Put form
|
||||
Frm_PUT_FORM);
|
||||
|
||||
/* Link WWW */
|
||||
HTM_TD_Begin ("class=\"LM\"");
|
||||
|
|
13
swad_mail.c
13
swad_mail.c
|
@ -217,8 +217,7 @@ static Mai_DomainsOrder_t Mai_GetParMaiOrder (void)
|
|||
|
||||
static void Mai_PutIconToEditMailDomains (__attribute__((unused)) void *Args)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiMai,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiMai,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -793,7 +792,7 @@ static void Mai_PutFormToSelectUsrsToListEmails (__attribute__((unused)) void *A
|
|||
Txt_Email,
|
||||
Hlp_COMMUNICATION_Email,
|
||||
Txt_View_email_addresses,
|
||||
false); // Do not put form with date range
|
||||
Frm_DONT_PUT_FORM); // Do not put form with date range
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1298,7 +1297,7 @@ void Mai_RemoveOtherUsrEmail (void)
|
|||
/***** Get other user's code from form and get user's data *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Remove user's email *****/
|
||||
Mai_RemoveEmail (&Gbl.Usrs.Other.UsrDat);
|
||||
|
@ -1322,7 +1321,7 @@ static void Mai_RemoveEmail (struct Usr_Data *UsrDat)
|
|||
extern const char *Txt_Email_X_removed;
|
||||
char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
|
||||
|
||||
if (Usr_ICanEditOtherUsr (UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Get new email from form *****/
|
||||
Par_GetParText ("Email",Email,Cns_MAX_BYTES_EMAIL_ADDRESS);
|
||||
|
@ -1364,7 +1363,7 @@ void Mai_ChangeOtherUsrEmail (void)
|
|||
/***** Get other user's code from form and get user's data *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Change user's ID *****/
|
||||
Mai_ChangeUsrEmail (&Gbl.Usrs.Other.UsrDat,
|
||||
|
@ -1392,7 +1391,7 @@ static void Mai_ChangeUsrEmail (struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOthe
|
|||
extern const char *Txt_The_email_address_entered_X_is_not_valid;
|
||||
char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
|
||||
|
||||
if (Usr_ICanEditOtherUsr (UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Get new email from form *****/
|
||||
Par_GetParText ("NewEmail",NewEmail,Cns_MAX_BYTES_EMAIL_ADDRESS);
|
||||
|
|
100
swad_match.c
100
swad_match.c
|
@ -103,10 +103,10 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
|
|||
Frm_PutForm_t PutFormMatch,
|
||||
unsigned NumMatches,
|
||||
MYSQL_RES *mysql_res);
|
||||
static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches);
|
||||
static bool Mch_CheckIfICanEditMatches (void);
|
||||
static bool Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match);
|
||||
static bool Mch_CheckIfVisibilityOfResultsCanBeChanged (const struct Mch_Match *Match);
|
||||
static void Mch_ListOneOrMoreMatchesHeading (Usr_ICan_t ICanEditMatches);
|
||||
static Usr_ICan_t Mch_CheckIfICanEditMatches (void);
|
||||
static Usr_ICan_t Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match);
|
||||
static Usr_ICan_t Mch_CheckIfICanChangeVisibilityOfResults (const struct Mch_Match *Match);
|
||||
static void Mch_ListOneOrMoreMatchesIcons (struct Gam_Games *Games,
|
||||
const struct Mch_Match *Match,
|
||||
const char *Anchor);
|
||||
|
@ -284,7 +284,7 @@ void Mch_ListMatches (struct Gam_Games *Games,
|
|||
Hlp_ASSESSMENT_Games_matches,Box_NOT_CLOSABLE);
|
||||
|
||||
/***** Select whether show only my groups or all groups *****/
|
||||
if (Gbl.Crs.Grps.NumGrps && Mch_CheckIfICanEditMatches ())
|
||||
if (Gbl.Crs.Grps.NumGrps && Mch_CheckIfICanEditMatches () == Usr_I_CAN)
|
||||
{
|
||||
Set_BeginSettingsHead ();
|
||||
Grp_ShowFormToSelWhichGrps (ActSeeOneGam,Gam_PutPars,Games);
|
||||
|
@ -328,15 +328,10 @@ void Mch_GetMatchDataByCod (struct Mch_Match *Match)
|
|||
|
||||
static void Mch_PutIconsInListOfMatches (void *Games)
|
||||
{
|
||||
bool ICanEditMatches;
|
||||
|
||||
if (Games)
|
||||
{
|
||||
/***** Put icon to create a new match in current game *****/
|
||||
ICanEditMatches = Mch_CheckIfICanEditMatches ();
|
||||
if (ICanEditMatches)
|
||||
if (Mch_CheckIfICanEditMatches () == Usr_I_CAN)
|
||||
/***** Put icon to create a new match in current game *****/
|
||||
Mch_PutIconToCreateNewMatch ((struct Gam_Games *) Games);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -362,7 +357,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
|
|||
unsigned UniqueId;
|
||||
struct Mch_Match Match;
|
||||
char *Anchor;
|
||||
bool ICanEditMatches = Mch_CheckIfICanEditMatches ();
|
||||
Usr_ICan_t ICanEditMatches = Mch_CheckIfICanEditMatches ();
|
||||
long MchCodToBeEdited = PutFormMatch == Frm_PUT_FORM &&
|
||||
Games->MchCod > 0 ? Games->MchCod :
|
||||
-1L;
|
||||
|
@ -385,7 +380,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
|
|||
/***** Get match data from row *****/
|
||||
Mch_GetMatchDataFromRow (mysql_res,&Match);
|
||||
|
||||
if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match))
|
||||
if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match) == Usr_I_CAN)
|
||||
{
|
||||
/***** Build anchor string *****/
|
||||
if (asprintf (&Anchor,"mch_%ld",Match.MchCod) < 0)
|
||||
|
@ -395,7 +390,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
|
|||
HTM_TR_Begin (NULL);
|
||||
|
||||
/* Icons */
|
||||
if (ICanEditMatches)
|
||||
if (ICanEditMatches == Usr_I_CAN)
|
||||
Mch_ListOneOrMoreMatchesIcons (Games,&Match,Anchor);
|
||||
|
||||
/* Start/end date/time */
|
||||
|
@ -421,10 +416,11 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
|
|||
HTM_TR_End ();
|
||||
|
||||
/***** Third row for this match used for edition ****/
|
||||
if (ICanEditMatches && PutFormMatch == Frm_PUT_FORM && // Editing...
|
||||
Match.MchCod == MchCodToBeEdited) // ...this match
|
||||
if (ICanEditMatches == Usr_I_CAN &&
|
||||
PutFormMatch == Frm_PUT_FORM && // Editing...
|
||||
Match.MchCod == MchCodToBeEdited) // ...this match
|
||||
/***** Check if I can edit this match *****/
|
||||
if (Mch_CheckIfICanEditThisMatch (&Match))
|
||||
if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN)
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
HTM_TD_Begin ("colspan=\"7\" class=\"LT %s\"",
|
||||
|
@ -440,7 +436,8 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
|
|||
}
|
||||
|
||||
/***** Put button to play a new match in this game *****/
|
||||
if (ICanEditMatches && PutFormMatch == Frm_PUT_FORM &&
|
||||
if (ICanEditMatches == Usr_I_CAN &&
|
||||
PutFormMatch == Frm_PUT_FORM &&
|
||||
MchCodToBeEdited <= 0)
|
||||
{
|
||||
/* Reset match */
|
||||
|
@ -464,7 +461,7 @@ static void Mch_ListOneOrMoreMatches (struct Gam_Games *Games,
|
|||
/***************** Put a column for match start and end times ****************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches)
|
||||
static void Mch_ListOneOrMoreMatchesHeading (Usr_ICan_t ICanEditMatches)
|
||||
{
|
||||
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
|
||||
extern const char *Txt_Match;
|
||||
|
@ -476,7 +473,7 @@ static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches)
|
|||
HTM_TR_Begin (NULL);
|
||||
|
||||
/***** Column for icons *****/
|
||||
if (ICanEditMatches)
|
||||
if (ICanEditMatches == Usr_I_CAN)
|
||||
HTM_TH_Empty (1);
|
||||
|
||||
/***** The rest of columns *****/
|
||||
|
@ -497,13 +494,13 @@ static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches)
|
|||
/*********************** Check if I can edit matches *************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Mch_CheckIfICanEditMatches (void)
|
||||
static Usr_ICan_t Mch_CheckIfICanEditMatches (void)
|
||||
{
|
||||
static const bool ICanEditMatches[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanEditMatches[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_NET ] = true,
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_NET ] = Usr_I_CAN,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanEditMatches[Gbl.Usrs.Me.Role.Logged];
|
||||
|
@ -513,20 +510,21 @@ static bool Mch_CheckIfICanEditMatches (void)
|
|||
/***************** Check if I can edit (remove/resume) a match ***************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match)
|
||||
static Usr_ICan_t Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match)
|
||||
{
|
||||
if (Match->MchCod <= 0)
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_NET:
|
||||
return (Match->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod); // Only if I am the creator
|
||||
return (Match->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN : // Only if I am the creator
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -534,14 +532,13 @@ static bool Mch_CheckIfICanEditThisMatch (const struct Mch_Match *Match)
|
|||
/*********** Check if visibility of match results can be changed *************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Mch_CheckIfVisibilityOfResultsCanBeChanged (const struct Mch_Match *Match)
|
||||
static Usr_ICan_t Mch_CheckIfICanChangeVisibilityOfResults (const struct Mch_Match *Match)
|
||||
{
|
||||
if (Match->Status.ShowUsrResults || // Results are currently visible
|
||||
Match->Status.Showing == Mch_END) // Match has finished
|
||||
if (Mch_CheckIfICanEditThisMatch (Match))
|
||||
return true;
|
||||
return Mch_CheckIfICanEditThisMatch (Match);
|
||||
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -554,17 +551,15 @@ static void Mch_ListOneOrMoreMatchesIcons (struct Gam_Games *Games,
|
|||
{
|
||||
HTM_TD_Begin ("rowspan=\"2\" class=\"BT %s\"",The_GetColorRows ());
|
||||
|
||||
if (Mch_CheckIfICanEditThisMatch (Match))
|
||||
if (Mch_CheckIfICanEditThisMatch (Match) == Usr_I_CAN)
|
||||
{
|
||||
Games->MchCod = Match->MchCod;
|
||||
|
||||
/***** Put icon to remove the match *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemMch,NULL,
|
||||
Mch_PutParsEdit,Games);
|
||||
Ico_PutContextualIconToRemove (ActReqRemMch,NULL,Mch_PutParsEdit,Games);
|
||||
|
||||
/***** Put icon to edit the match *****/
|
||||
Ico_PutContextualIconToEdit (ActReqChgMch,Anchor,
|
||||
Mch_PutParsEdit,Games);
|
||||
Ico_PutContextualIconToEdit (ActReqChgMch,Anchor,Mch_PutParsEdit,Games);
|
||||
}
|
||||
else
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
|
@ -834,13 +829,13 @@ static void Mch_ListOneOrMoreMatchesResultTch (struct Gam_Games *Games,
|
|||
Games->MchCod = Match->MchCod;
|
||||
|
||||
/***** Show match results *****/
|
||||
if (Mch_CheckIfICanEditThisMatch (Match))
|
||||
if (Mch_CheckIfICanEditThisMatch (Match) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeUsrMchResMch,MchRes_RESULTS_BOX_ID,
|
||||
Mch_PutParsEdit,Games,
|
||||
"trophy.svg",Ico_BLACK);
|
||||
|
||||
/***** Check if visibility of session results can be changed *****/
|
||||
if (Mch_CheckIfVisibilityOfResultsCanBeChanged (Match))
|
||||
if (Mch_CheckIfICanChangeVisibilityOfResults (Match) == Usr_I_CAN)
|
||||
{
|
||||
/* I can edit visibility */
|
||||
if (Match->Status.ShowUsrResults)
|
||||
|
@ -880,7 +875,7 @@ void Mch_ToggleVisResultsMchUsr (void)
|
|||
Mch_GetAndCheckPars (&Games,&Match);
|
||||
|
||||
/***** Check if visibility of match results can be changed *****/
|
||||
if (!Mch_CheckIfVisibilityOfResultsCanBeChanged (&Match))
|
||||
if (Mch_CheckIfICanChangeVisibilityOfResults (&Match) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Toggle visibility of match results *****/
|
||||
|
@ -1028,7 +1023,7 @@ void Mch_RemoveMatch (void)
|
|||
Mch_GetAndCheckPars (&Games,&Match);
|
||||
|
||||
/***** Check if I can remove this match *****/
|
||||
if (!Mch_CheckIfICanEditThisMatch (&Match))
|
||||
if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Remove the match from all database tables *****/
|
||||
|
@ -1124,7 +1119,7 @@ void Mch_ReqCreatOrEditMatch (void)
|
|||
Mch_GetAndCheckPars (&Games,&Match);
|
||||
|
||||
/***** Check if I can edit this match *****/
|
||||
if (!Mch_CheckIfICanEditThisMatch (&Match))
|
||||
if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Show game *****/
|
||||
|
@ -1332,7 +1327,7 @@ void Mch_ChangeMatch (void)
|
|||
Mch_GetAndCheckPars (&Games,&Match);
|
||||
|
||||
/***** Check if I can update this match *****/
|
||||
if (!Mch_CheckIfICanEditThisMatch (&Match))
|
||||
if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get match title and groups *****/
|
||||
|
@ -1390,7 +1385,7 @@ void Mch_ResumeMatch (void)
|
|||
Mch_GetMatchDataByCod (&Match);
|
||||
|
||||
/***** Check if I have permission to resume match *****/
|
||||
if (!Mch_CheckIfICanEditThisMatch (&Match))
|
||||
if (Mch_CheckIfICanEditThisMatch (&Match) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Update match status in database *****/
|
||||
|
@ -1987,7 +1982,7 @@ static void Mch_ShowMatchStatusForStd (struct Mch_Match *Match,Mch_Update_t Upda
|
|||
struct Mch_UsrAnswer UsrAnswer;
|
||||
|
||||
/***** Can I play this match? *****/
|
||||
if (!Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match))
|
||||
if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (Match) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get student's answer to this question
|
||||
|
@ -2008,7 +2003,7 @@ static void Mch_ShowMatchStatusForStd (struct Mch_Match *Match,Mch_Update_t Upda
|
|||
/************ Check if I belong to any of the groups of a match **************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match)
|
||||
Usr_ICan_t Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
|
@ -2018,12 +2013,13 @@ bool Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match)
|
|||
return Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (Match->MchCod);
|
||||
case Rol_NET:
|
||||
/***** Only if I am the creator *****/
|
||||
return (Match->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||
return (Match->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ void Mch_ToggleVisResultsMchQst (void);
|
|||
void Mch_BackMatch (void);
|
||||
void Mch_ForwardMatch (void);
|
||||
|
||||
bool Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match);
|
||||
Usr_ICan_t Mch_CheckIfICanPlayThisMatchBasedOnGrps (const struct Mch_Match *Match);
|
||||
|
||||
bool Mch_RegisterMeAsPlayerInMatch (struct Mch_Match *Match);
|
||||
|
||||
|
|
|
@ -569,7 +569,7 @@ unsigned Mch_DB_GetGrpNamesAssociatedToMatch (MYSQL_RES **mysql_res,long MchCod)
|
|||
/************ Check if I belong to any of the groups of a match **************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (long MchCod)
|
||||
Usr_ICan_t Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (long MchCod)
|
||||
{
|
||||
return
|
||||
DB_QueryEXISTS ("can not check if I can play a match",
|
||||
|
@ -588,7 +588,8 @@ bool Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (long MchCod)
|
|||
" WHERE grp_users.UsrCod=%ld"
|
||||
" AND grp_users.GrpCod=mch_groups.GrpCod)))",
|
||||
MchCod,
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -66,7 +66,7 @@ void Mch_DB_AssociateGroupToMatch (long MchCod,long GrpCod);
|
|||
|
||||
unsigned Mch_DB_GetGrpCodsAssociatedToMatch (MYSQL_RES **mysql_res,long MchCod);
|
||||
unsigned Mch_DB_GetGrpNamesAssociatedToMatch (MYSQL_RES **mysql_res,long MchCod);
|
||||
bool Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (long MchCod);
|
||||
Usr_ICan_t Mch_DB_CheckIfICanPlayThisMatchBasedOnGrps (long MchCod);
|
||||
|
||||
void Mch_DB_RemoveGroup (long GrpCod);
|
||||
void Mch_DB_RemoveGroupsOfType (long GrpTypCod);
|
||||
|
|
|
@ -63,8 +63,8 @@ extern struct Globals Gbl;
|
|||
|
||||
struct MchRes_ICanView
|
||||
{
|
||||
bool Result;
|
||||
bool Score;
|
||||
Usr_ICan_t Result;
|
||||
Usr_ICan_t Score;
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -304,7 +304,7 @@ static void MchRes_ListAllMchResultsInSelectedGames (struct Gam_Games *Games)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show matches results *****/
|
||||
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
|
@ -335,7 +335,7 @@ static void MchRes_PutFormToSelUsrsToViewMchResults (__attribute__((unused)) voi
|
|||
Txt_Results,
|
||||
Hlp_ASSESSMENT_Games_results,
|
||||
Txt_View_results,
|
||||
false); // Do not put form with date range
|
||||
Frm_DONT_PUT_FORM); // Do not put form with date range
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -395,7 +395,7 @@ static void MchRes_ListAllMchResultsInGam (struct Gam_Games *Games)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show matches results *****/
|
||||
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
|
@ -467,7 +467,7 @@ static void MchRes_ListAllMchResultsInMch (struct Gam_Games *Games,long MchCod)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show matches results *****/
|
||||
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
|
@ -778,7 +778,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
|
|||
HTM_TD_End ();
|
||||
|
||||
/* Accumulate questions and score */
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
NumTotalQsts.All += Print.NumQsts.All;
|
||||
NumTotalQsts.NotBlank += Print.NumQsts.NotBlank;
|
||||
|
@ -789,7 +789,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
|
@ -799,7 +799,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
if (Print.NumQsts.NotBlank)
|
||||
HTM_Unsigned (Print.NumQsts.NotBlank);
|
||||
|
@ -815,7 +815,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
|
|||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank;
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
if (NumQstsBlank)
|
||||
HTM_Unsigned (NumQstsBlank);
|
||||
|
@ -830,7 +830,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
HTM_Txt ("/");
|
||||
|
@ -844,7 +844,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
|
||||
(double) Print.NumQsts.All :
|
||||
0.0);
|
||||
|
@ -856,7 +856,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
|
|||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
Grade = TstPrn_ComputeGrade (Print.NumQsts.All,Print.Score,Games->Game.MaxGrade);
|
||||
TstPrn_ShowGrade (Grade,Games->Game.MaxGrade);
|
||||
|
@ -869,7 +869,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
|
|||
/* Link to show this result */
|
||||
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result)
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
{
|
||||
Games->Game.GamCod = Match.GamCod;
|
||||
Games->MchCod = Match.MchCod;
|
||||
|
@ -1084,7 +1084,7 @@ void MchRes_ShowOneMchResult (void)
|
|||
|
||||
/***** Check if I can view this match result and score *****/
|
||||
MchRes_CheckIfICanViewMatchResult (&Games.Game,&Match,UsrDat->UsrCod,&ICanView);
|
||||
if (!ICanView.Result)
|
||||
if (ICanView.Result == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get questions and user's answers of the match result from database *****/
|
||||
|
@ -1104,7 +1104,7 @@ void MchRes_ShowOneMchResult (void)
|
|||
Usr_DONT_GET_PREFS,
|
||||
Usr_GET_ROLE_IN_CRS))
|
||||
Err_WrongUserExit ();
|
||||
if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (UsrDat) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/* Get if user has accepted enrolment */
|
||||
|
@ -1201,7 +1201,7 @@ void MchRes_ShowOneMchResult (void)
|
|||
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||
The_GetSuffix ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
HTM_STRONG_Begin ();
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
|
@ -1225,7 +1225,7 @@ void MchRes_ShowOneMchResult (void)
|
|||
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||
The_GetSuffix ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
HTM_STRONG_Begin ();
|
||||
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Games.Game.MaxGrade);
|
||||
|
@ -1282,15 +1282,17 @@ static void MchRes_CheckIfICanViewMatchResult (const struct Gam_Game *Game,
|
|||
// Depends on visibility of game and result (eye icons)
|
||||
ICanView->Result = (Game->HiddenOrVisible == HidVis_VISIBLE && // The game is visible
|
||||
Match->Status.ShowUsrResults && // The results of the match are visible to users
|
||||
Usr_ItsMe (UsrCod) == Usr_ME); // The result is mine
|
||||
Usr_ItsMe (UsrCod) == Usr_ME) ? Usr_I_CAN : // The result is mine
|
||||
Usr_I_CAN_NOT;
|
||||
// Whether I belong or not to groups of match is not checked here...
|
||||
// ...because I should be able to see old matches made in old groups to which I belonged
|
||||
|
||||
if (ICanView->Result)
|
||||
if (ICanView->Result == Usr_I_CAN)
|
||||
// Depends on 5 visibility icons associated to game
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (Game->Visibility);
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (Game->Visibility) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
else
|
||||
ICanView->Score = false;
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
|
@ -1299,11 +1301,11 @@ static void MchRes_CheckIfICanViewMatchResult (const struct Gam_Game *Game,
|
|||
case Rol_INS_ADM:
|
||||
case Rol_SYS_ADM:
|
||||
ICanView->Result =
|
||||
ICanView->Score = true;
|
||||
ICanView->Score = Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
ICanView->Result =
|
||||
ICanView->Score = false;
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -424,7 +424,7 @@ void Nck_RemoveOtherUsrNick (void)
|
|||
/***** Get user whose nick must be removed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Get nickname from form *****/
|
||||
Par_GetParText ("Nick",NickWithoutArr,
|
||||
|
@ -470,7 +470,7 @@ void Nck_ChangeOtherUsrNick (void)
|
|||
/***** Get user whose nick must be changed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Update user's nickname *****/
|
||||
Nck_ChangeUsrNick (&Gbl.Usrs.Other.UsrDat);
|
||||
|
|
|
@ -78,7 +78,7 @@ static unsigned Not_MaxCharsURLOnScreen[Not_NUM_TYPES_LISTING] =
|
|||
|
||||
static void Not_PutLinkToRSSFile (void);
|
||||
|
||||
static bool Not_CheckIfICanEditNotices (void);
|
||||
static Usr_ICan_t Not_CheckIfICanEditNotices (void);
|
||||
static void Not_PutIconsListNotices (__attribute__((unused)) void *Args);
|
||||
static void Not_PutIconToAddNewNotice (void);
|
||||
static void Not_GetDataAndShowNotice (long NotCod);
|
||||
|
@ -401,10 +401,11 @@ static void Not_PutLinkToRSSFile (void)
|
|||
/*********************** Check if I can edit notices *************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Not_CheckIfICanEditNotices (void)
|
||||
static Usr_ICan_t Not_CheckIfICanEditNotices (void)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM;
|
||||
return (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -414,7 +415,7 @@ static bool Not_CheckIfICanEditNotices (void)
|
|||
static void Not_PutIconsListNotices (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to add a new notice *****/
|
||||
if (Not_CheckIfICanEditNotices ())
|
||||
if (Not_CheckIfICanEditNotices () == Usr_I_CAN)
|
||||
Not_PutIconToAddNewNotice ();
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
|
@ -551,7 +552,7 @@ static void Not_DrawANotice (Not_Listing_t TypeNoticesListing,
|
|||
/***** Write the date in the top part of the yellow note *****/
|
||||
/* Write symbol to indicate if notice is obsolete or active */
|
||||
if (TypeNoticesListing == Not_LIST_FULL_NOTICES)
|
||||
if (Not_CheckIfICanEditNotices ())
|
||||
if (Not_CheckIfICanEditNotices () == Usr_I_CAN)
|
||||
{
|
||||
/***** Icon to remove announcement *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemNot,NULL,
|
||||
|
|
|
@ -177,7 +177,7 @@ void Pwd_UpdateOtherUsrPwd (void)
|
|||
/***** Get other user's code from form and get user's data *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
/***** Check and update password *****/
|
||||
Pwd_CheckAndUpdateNewPwd (&Gbl.Usrs.Other.UsrDat);
|
||||
else
|
||||
|
|
28
swad_photo.c
28
swad_photo.c
|
@ -141,11 +141,11 @@ static void Pho_ComputePhotoSize (const struct Pho_DegPhotos *DegPhotos,
|
|||
/************** Check if I can change the photo of another user **************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat)
|
||||
Usr_ICan_t Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat)
|
||||
{
|
||||
/***** I can change my photo *****/
|
||||
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
|
||||
/***** Check if I have permission to change user's photo *****/
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
|
@ -153,18 +153,19 @@ bool Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat)
|
|||
case Rol_TCH:
|
||||
/* A teacher can change the photo of confirmed students */
|
||||
if (UsrDat->Roles.InCurrentCrs != Rol_STD) // Not a student
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/* It's a student in this course,
|
||||
check if he/she has accepted registration */
|
||||
return (UsrDat->Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (UsrDat));
|
||||
return (UsrDat->Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (UsrDat)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_DEG_ADM:
|
||||
case Rol_CTR_ADM:
|
||||
case Rol_INS_ADM:
|
||||
case Rol_SYS_ADM:
|
||||
return Usr_ICanEditOtherUsr (UsrDat);
|
||||
return Usr_CheckIfICanEditOtherUsr (UsrDat);
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -198,7 +199,7 @@ void Pho_PutIconToChangeUsrPhoto (struct Usr_Data *UsrDat)
|
|||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
if (Pho_ICanChangeOtherUsrPhoto (UsrDat))
|
||||
if (Pho_ICanChangeOtherUsrPhoto (UsrDat) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL,
|
||||
Rec_PutParUsrCodEncrypted,NULL,
|
||||
"camera.svg",Ico_BLACK);
|
||||
|
@ -354,7 +355,7 @@ void Pho_SendPhotoUsr (void)
|
|||
}
|
||||
|
||||
/***** Check if I have permission to change user's photo *****/
|
||||
if (!Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN_NOT)
|
||||
{
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
return;
|
||||
|
@ -521,7 +522,7 @@ void Pho_ReqRemUsrPhoto (void)
|
|||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS))
|
||||
{
|
||||
if (Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show current photo and help message *****/
|
||||
if (Pho_BuildLinkToPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL))
|
||||
|
@ -991,14 +992,9 @@ void Pho_ShowUsrPhotoIfAllowed (struct Usr_Data *UsrDat,
|
|||
bool Pho_ShowingUsrPhotoIsAllowed (struct Usr_Data *UsrDat,
|
||||
char PhotoURL[Cns_MAX_BYTES_WWW + 1])
|
||||
{
|
||||
bool ICanSeePhoto;
|
||||
|
||||
/***** Check if I can see the other's photo *****/
|
||||
ICanSeePhoto = Pri_ShowingIsAllowed (UsrDat->PhotoVisibility,UsrDat);
|
||||
|
||||
/***** Photo is shown if I can see it, and it exists *****/
|
||||
return ICanSeePhoto ? Pho_BuildLinkToPhoto (UsrDat,PhotoURL) :
|
||||
false;
|
||||
return (Pri_CheckIfICanView (UsrDat->PhotoVisibility,UsrDat) == Usr_I_CAN) ? Pho_BuildLinkToPhoto (UsrDat,PhotoURL) :
|
||||
false;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -95,7 +95,7 @@ struct Pho_DegPhotos
|
|||
/***************************** Public prototypes *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat);
|
||||
Usr_ICan_t Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat);
|
||||
void Pho_PutIconToChangeUsrPhoto (struct Usr_Data *UsrDat);
|
||||
void Pho_ReqMyPhoto (void);
|
||||
void Pho_SendPhotoUsr (void);
|
||||
|
|
39
swad_place.c
39
swad_place.c
|
@ -45,17 +45,6 @@
|
|||
#include "swad_place.h"
|
||||
#include "swad_place_database.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************** Private constants ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static const bool Plc_ICanEditPlaces[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_INS_ADM] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/************** External global variables from others modules ****************/
|
||||
/*****************************************************************************/
|
||||
|
@ -72,6 +61,8 @@ static struct Plc_Place *Plc_EditingPlc = NULL; // Static variable to keep the p
|
|||
/***************************** Private prototypes ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Plc_CheckIfICanEditPlaces (void);
|
||||
|
||||
static Plc_Order_t Plc_GetParPlcOrder (void);
|
||||
static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args);
|
||||
static void Plc_PutIconToEditPlaces (void);
|
||||
|
@ -91,6 +82,22 @@ static void Plc_PutHeadPlaces (void);
|
|||
static void Plc_EditingPlaceConstructor (void);
|
||||
static void Plc_EditingPlaceDestructor (void);
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************* Check if I can edit places ************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Plc_CheckIfICanEditPlaces (void)
|
||||
{
|
||||
static bool Plc_ICanEditPlaces[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_INS_ADM] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
};
|
||||
|
||||
return Plc_ICanEditPlaces[Gbl.Usrs.Me.Role.Logged];
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**************************** Reset places context ***************************/
|
||||
/*****************************************************************************/
|
||||
|
@ -231,7 +238,7 @@ static Plc_Order_t Plc_GetParPlcOrder (void)
|
|||
static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit places *****/
|
||||
if (Plc_ICanEditPlaces[Gbl.Usrs.Me.Role.Logged])
|
||||
if (Plc_CheckIfICanEditPlaces ())
|
||||
Plc_PutIconToEditPlaces ();
|
||||
}
|
||||
|
||||
|
@ -241,8 +248,7 @@ static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Plc_PutIconToEditPlaces (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiPlc,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiPlc,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -298,8 +304,7 @@ static void Plc_EditPlacesInternal (void)
|
|||
static void Plc_PutIconsEditingPlaces (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view places *****/
|
||||
Ico_PutContextualIconToView (ActSeePlc,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeePlc,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -467,7 +472,7 @@ static void Plc_ListPlacesForEdition (const struct Plc_Places *Places)
|
|||
Nam_ExistingShortAndFullNames (ActionRename,
|
||||
ParCod_Plc,Plc->PlcCod,
|
||||
Names,
|
||||
true); // Put form
|
||||
Frm_PUT_FORM);
|
||||
|
||||
/* Number of centers */
|
||||
HTM_TD_Unsigned (Plc->NumCtrs);
|
||||
|
|
|
@ -184,8 +184,7 @@ void Plg_ListPlugins (void)
|
|||
|
||||
static void Plg_PutIconToEditPlugins (__attribute__((unused)) void *Args)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiPlg,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiPlg,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -194,8 +193,7 @@ static void Plg_PutIconToEditPlugins (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Plg_PutIconToViewPlugins (__attribute__((unused)) void *Args)
|
||||
{
|
||||
Ico_PutContextualIconToView (ActSeePlg,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeePlg,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -246,40 +246,43 @@ Pri_Visibility_t Pri_GetParVisibility (const char *ParName,
|
|||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*********** Check if user's photo of public profile can be shown ************/
|
||||
/*********** Check if user's photo or public profile can be shown ************/
|
||||
/*****************************************************************************/
|
||||
// Returns true if it can be shown and false if not.
|
||||
|
||||
bool Pri_ShowingIsAllowed (Pri_Visibility_t Visibility,struct Usr_Data *UsrDat)
|
||||
Usr_ICan_t Pri_CheckIfICanView (Pri_Visibility_t Visibility,
|
||||
struct Usr_Data *UsrDat)
|
||||
{
|
||||
/***** I always can see my things *****/
|
||||
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
|
||||
/***** System admins always can see others' profiles *****/
|
||||
if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
|
||||
/***** Check if I can see the other's photo *****/
|
||||
switch (Visibility)
|
||||
{
|
||||
case Pri_VISIBILITY_UNKNOWN:
|
||||
return false; // It's not me
|
||||
return Usr_I_CAN_NOT; // It's not me
|
||||
case Pri_VISIBILITY_USER: // Only visible
|
||||
// by me and my teachers if I am a student
|
||||
// or me and my students if I am a teacher
|
||||
// Do both users share the same course but whit different role?
|
||||
return Enr_DB_CheckIfUsrSharesAnyOfMyCrsWithDifferentRole (UsrDat->UsrCod);
|
||||
return Enr_DB_CheckIfUsrSharesAnyOfMyCrsWithDifferentRole (UsrDat->UsrCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Pri_VISIBILITY_COURSE: // Visible by users sharing courses with me
|
||||
// Do both users share the same course?
|
||||
return Enr_CheckIfUsrSharesAnyOfMyCrs (UsrDat);
|
||||
return Enr_CheckIfUsrSharesAnyOfMyCrs (UsrDat) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Pri_VISIBILITY_SYSTEM: // Visible by any user logged in platform
|
||||
return Gbl.Usrs.Me.Logged;
|
||||
return Gbl.Usrs.Me.Logged ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Pri_VISIBILITY_WORLD: // Public, visible by everyone, even unlogged visitors
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
}
|
||||
|
||||
return false; // Never reached. To avoid warning
|
||||
return Usr_I_CAN_NOT; // Never reached. To avoid warning
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -65,7 +65,7 @@ Pri_Visibility_t Pri_GetVisibilityFromStr (const char *Str);
|
|||
Pri_Visibility_t Pri_GetParVisibility (const char *ParName,
|
||||
unsigned MaskAllowedVisibility);
|
||||
|
||||
bool Pri_ShowingIsAllowed (Pri_Visibility_t Visibility,struct Usr_Data *UsrDat);
|
||||
Usr_ICan_t Pri_CheckIfICanView (Pri_Visibility_t Visibility,struct Usr_Data *UsrDat);
|
||||
|
||||
//-------------------------------- Figures ------------------------------------
|
||||
void Pri_GetAndShowNumUsrsPerPrivacy (void);
|
||||
|
|
|
@ -289,7 +289,7 @@ bool Prf_ShowUsrProfile (struct Usr_Data *UsrDat)
|
|||
Usr_MeOrOther_t MeOrOther = Usr_ItsMe (UsrDat->UsrCod);
|
||||
|
||||
/***** Check if I can see the public profile *****/
|
||||
if (Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat))
|
||||
if (Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
if (Gbl.Usrs.Me.Logged)
|
||||
{
|
||||
|
@ -314,7 +314,7 @@ bool Prf_ShowUsrProfile (struct Usr_Data *UsrDat)
|
|||
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_PUBLIC,UsrDat,NULL);
|
||||
|
||||
/***** Extended profile *****/
|
||||
if (Pri_ShowingIsAllowed (UsrDat->ExPrfVisibility,UsrDat))
|
||||
if (Pri_CheckIfICanView (UsrDat->ExPrfVisibility,UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show details of user's profile *****/
|
||||
Prf_ShowDetailsUserProfile (UsrDat);
|
||||
|
@ -1337,7 +1337,7 @@ static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,
|
|||
[PhoSha_SHAPE_OVAL ] = "PHOTOO30x40",
|
||||
[PhoSha_SHAPE_RECTANGLE] = "PHOTOR30x40",
|
||||
};
|
||||
bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat);
|
||||
bool Visible = (Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat) == Usr_I_CAN);
|
||||
|
||||
HTM_TD_Begin ("class=\"RM %s_%s %s\"",
|
||||
Class[MeOrOther],
|
||||
|
|
|
@ -323,10 +323,11 @@ void Prg_ShowAllItems (Prg_ListingType_t ListingType,
|
|||
/******************* Check if I can create program items *********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Prg_CheckIfICanEditProgram (void)
|
||||
Usr_ICan_t Prg_CheckIfICanEditProgram (void)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM;
|
||||
return (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -336,7 +337,7 @@ bool Prg_CheckIfICanEditProgram (void)
|
|||
static void Prg_PutIconsListItems (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit program *****/
|
||||
if (Prg_CheckIfICanEditProgram ())
|
||||
if (Prg_CheckIfICanEditProgram () == Usr_I_CAN)
|
||||
Prg_PutIconToEditProgram ();
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
|
@ -352,7 +353,7 @@ static void Prg_PutIconsEditItems (__attribute__((unused)) void *Args)
|
|||
/***** Put icon to view program *****/
|
||||
Prg_PutIconToViewProgram ();
|
||||
|
||||
if (Prg_CheckIfICanEditProgram ())
|
||||
if (Prg_CheckIfICanEditProgram () == Usr_I_CAN)
|
||||
{
|
||||
/***** Put icon to create a new program item *****/
|
||||
Prg_PutIconToCreateNewItem ();
|
||||
|
@ -371,8 +372,7 @@ static void Prg_PutIconsEditItems (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Prg_PutIconToEditProgram (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiPrg,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiPrg,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -381,8 +381,7 @@ static void Prg_PutIconToEditProgram (void)
|
|||
|
||||
static void Prg_PutIconToViewProgram (void)
|
||||
{
|
||||
Ico_PutContextualIconToView (ActSeePrg,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeePrg,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -403,8 +402,7 @@ static void Prg_PutIconToCreateNewItem (void)
|
|||
|
||||
static void Prg_PutIconToViewResourceClipboard (void)
|
||||
{
|
||||
Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InPrg,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InPrg,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -121,7 +121,7 @@ void Prg_EditCourseProgram (void);
|
|||
void Prg_ShowAllItems (Prg_ListingType_t ListingType,
|
||||
long SelectedItmCod,long SelectedRscCod);
|
||||
|
||||
bool Prg_CheckIfICanEditProgram (void);
|
||||
Usr_ICan_t Prg_CheckIfICanEditProgram (void);
|
||||
|
||||
void Prg_PutParItmCod (void *ItmCod);
|
||||
void Prg_GetPars (struct Prg_Item *Item);
|
||||
|
|
|
@ -305,7 +305,7 @@ static void PrgRsc_PutIconsViewResources (void *ItmCod)
|
|||
/***** Put icon to create a new item resource *****/
|
||||
if (ItmCod)
|
||||
if (*(long *) ItmCod > 0)
|
||||
if (Prg_CheckIfICanEditProgram ())
|
||||
if (Prg_CheckIfICanEditProgram () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToView (ActFrmSeePrgRsc,PrgRsc_RESOURCE_SECTION_ID,
|
||||
Prg_PutParItmCod,ItmCod);
|
||||
}
|
||||
|
@ -315,7 +315,7 @@ static void PrgRsc_PutIconsEditResources (void *ItmCod)
|
|||
/***** Put icon to create a new item resource *****/
|
||||
if (ItmCod)
|
||||
if (*(long *) ItmCod > 0)
|
||||
if (Prg_CheckIfICanEditProgram ())
|
||||
if (Prg_CheckIfICanEditProgram () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToEdit (ActFrmEdiPrgRsc,PrgRsc_RESOURCE_SECTION_ID,
|
||||
Prg_PutParItmCod,ItmCod);
|
||||
}
|
||||
|
@ -895,7 +895,7 @@ static void PrgRsc_ShowClipboard (void)
|
|||
static void PrgRsc_PutIconsClipboard (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to remove resource clipboard in program *****/
|
||||
if (Prg_CheckIfICanEditProgram ())
|
||||
if (Prg_CheckIfICanEditProgram () == Usr_I_CAN)
|
||||
if (Rsc_DB_GetNumResourcesInClipboard ()) // Only if there are resources
|
||||
Ico_PutContextualIconToRemove (ActRemRscCli_InPrg,NULL,
|
||||
NULL,NULL);
|
||||
|
|
188
swad_project.c
188
swad_project.c
|
@ -189,7 +189,7 @@ static void Prj_ShowFormToFilterByWarning (const struct Prj_Projects *Projects);
|
|||
static void Prj_ShowFormToFilterByReview (const struct Prj_Projects *Projects);
|
||||
static void Prj_ShowFormToFilterByDpt (const struct Prj_Projects *Projects);
|
||||
|
||||
static bool Prj_CheckIfICanViewProjectFiles (long PrjCod);
|
||||
static Usr_ICan_t Prj_CheckIfICanViewProjectFiles (long PrjCod);
|
||||
|
||||
static void Prj_PutParAssign (unsigned Assign);
|
||||
static void Prj_PutParHidden (unsigned Hidden);
|
||||
|
@ -205,7 +205,7 @@ static Usr_Who_t Prj_GetParWho (void);
|
|||
|
||||
static void Prj_ShowProjectsHead (struct Prj_Projects *Projects);
|
||||
static void Prj_ShowTableAllProjectsHead (void);
|
||||
static bool Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects);
|
||||
static Usr_ICan_t Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects);
|
||||
static void Prj_PutIconToCreateNewPrj (struct Prj_Projects *Projects);
|
||||
static void Prj_PutIconToShowAllData (struct Prj_Projects *Projects);
|
||||
|
||||
|
@ -226,7 +226,7 @@ static void Prj_ShowReviewStatus (struct Prj_Projects *Projects,
|
|||
const struct Prj_Faults *Faults,
|
||||
const char *Anchor);
|
||||
static void Prj_PutSelectorReviewStatus (struct Prj_Projects *Projects);
|
||||
static bool Prj_CheckIfICanReviewProjects (void);
|
||||
static Usr_ICan_t Prj_CheckIfICanReviewProjects (void);
|
||||
static void Prj_ShowAssigned (const struct Prj_Projects *Projects,
|
||||
const char *ClassLabel,
|
||||
const char *ClassData,
|
||||
|
@ -288,7 +288,7 @@ static Prj_Order_t Prj_GetParPrjOrder (void);
|
|||
static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
|
||||
const char *Anchor);
|
||||
|
||||
static bool Prj_CheckIfICanEditProject (const struct Prj_Project *Prj);
|
||||
static Usr_ICan_t Prj_CheckIfICanEditProject (const struct Prj_Project *Prj);
|
||||
|
||||
static void Prj_GetListProjects (struct Prj_Projects *Projects);
|
||||
|
||||
|
@ -317,8 +317,8 @@ static Prj_ReviewStatus_t Prj_GetParReviewStatus (void);
|
|||
static void Prj_ShowRubrics (struct Prj_Projects *Projects);
|
||||
static void Prj_ShowRubricsOfType (struct Prj_Projects *Projects,
|
||||
PrjCfg_RubricType_t RubricType);
|
||||
static bool Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric);
|
||||
static bool Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric);
|
||||
static Usr_ICan_t Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric);
|
||||
static Usr_ICan_t Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric);
|
||||
|
||||
/*****************************************************************************/
|
||||
/******* Set/get project code (used to pass parameter to file browser) *******/
|
||||
|
@ -396,7 +396,7 @@ static void Prj_ReqUsrsToSelect (void *Projects)
|
|||
Txt_Projects,
|
||||
Hlp_ASSESSMENT_Projects,
|
||||
Txt_View_projects,
|
||||
false); // Do not put form with date range
|
||||
Frm_DONT_PUT_FORM); // Do not put form with date range
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -864,18 +864,19 @@ static void Prj_ShowFormToFilterByDpt (const struct Prj_Projects *Projects)
|
|||
/******************** Can I view files of a given project? *******************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Prj_CheckIfICanViewProjectFiles (long PrjCod)
|
||||
static Usr_ICan_t Prj_CheckIfICanViewProjectFiles (long PrjCod)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD:
|
||||
case Rol_NET:
|
||||
return (Prj_GetMyRolesInProject (PrjCod) != 0); // Am I a member?
|
||||
return (Prj_GetMyRolesInProject (PrjCod) != 0) ? Usr_I_CAN : // Am I a member?
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH: // Editing teachers in a course can access to all files
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -883,41 +884,41 @@ static bool Prj_CheckIfICanViewProjectFiles (long PrjCod)
|
|||
/******** Check if I have permission to view project documents zone **********/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Prj_CheckIfICanViewProjectDocuments (long PrjCod)
|
||||
Usr_ICan_t Prj_CheckIfICanViewProjectDocuments (long PrjCod)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD:
|
||||
case Rol_NET:
|
||||
return (Prj_GetMyRolesInProject (PrjCod) != 0); // Am I a member?
|
||||
return (Prj_GetMyRolesInProject (PrjCod) != 0) ? Usr_I_CAN : // Am I a member?
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH: // Editing teachers in a course can access to all files
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******** Check if I have permission to view project assessment zone *********/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Prj_CheckIfICanViewProjectAssessment (long PrjCod)
|
||||
Usr_ICan_t Prj_CheckIfICanViewProjectAssessment (long PrjCod)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD:
|
||||
case Rol_NET:
|
||||
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // Tutor...
|
||||
1 << Prj_ROLE_EVL)) != 0); // ...or evaluator
|
||||
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // Tutor...
|
||||
1 << Prj_ROLE_EVL)) != 0) ? Usr_I_CAN : // ...or evaluator
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH: // Editing teachers in a course can access to all files
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1228,17 +1229,18 @@ static void Prj_ShowTableAllProjectsHead (void)
|
|||
/********************** Check if I can create projects ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects)
|
||||
static Usr_ICan_t Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_NET:
|
||||
return Projects->Config.NETCanCreate;
|
||||
return Projects->Config.NETCanCreate ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1248,14 +1250,14 @@ static bool Prj_CheckIfICanCreateProjects (const struct Prj_Projects *Projects)
|
|||
|
||||
void Prj_PutIconsListProjects (void *Projects)
|
||||
{
|
||||
bool ICanConfigAllProjects;
|
||||
Usr_ICan_t ICanConfigAllProjects;
|
||||
|
||||
if (Projects)
|
||||
{
|
||||
ICanConfigAllProjects = PrjCfg_CheckIfICanConfig ();
|
||||
|
||||
/***** Put icon to create a new project *****/
|
||||
if (Prj_CheckIfICanCreateProjects ((struct Prj_Projects *) Projects))
|
||||
if (Prj_CheckIfICanCreateProjects ((struct Prj_Projects *) Projects) == Usr_I_CAN)
|
||||
Prj_PutIconToCreateNewPrj ((struct Prj_Projects *) Projects);
|
||||
|
||||
if (((struct Prj_Projects *) Projects)->Num)
|
||||
|
@ -1263,19 +1265,19 @@ void Prj_PutIconsListProjects (void *Projects)
|
|||
/***** Put icon to show all data in a table *****/
|
||||
Prj_PutIconToShowAllData ((struct Prj_Projects *) Projects);
|
||||
|
||||
if (ICanConfigAllProjects)
|
||||
if (ICanConfigAllProjects == Usr_I_CAN)
|
||||
/****** Put icons to request locking/unlocking edition
|
||||
of all selected projects *******/
|
||||
Prj_PutIconsToLockUnlockAllProjects ((struct Prj_Projects *) Projects);
|
||||
}
|
||||
|
||||
/***** Put form to go to configuration of projects *****/
|
||||
if (ICanConfigAllProjects)
|
||||
if (ICanConfigAllProjects == Usr_I_CAN)
|
||||
Ico_PutContextualIconToConfigure (ActCfgPrj,NULL,
|
||||
NULL,NULL);
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkPrj,NULL,
|
||||
Prj_PutCurrentPars,Projects);
|
||||
|
||||
|
@ -1360,7 +1362,7 @@ void Prj_ShowBoxWithOneProject (struct Prj_Projects *Projects)
|
|||
HTM_FIELDSET_End ();
|
||||
|
||||
/***** Show project file browsers *****/
|
||||
if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod))
|
||||
if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod) == Usr_I_CAN)
|
||||
Brw_ShowFileBrowserProject (Projects->Prj.PrjCod);
|
||||
|
||||
/***** Show project rubrics *****/
|
||||
|
@ -1516,8 +1518,13 @@ static void Prj_ShowFirstRow (struct Prj_Projects *Projects,
|
|||
extern const char *HidVis_DateBlueClass[HidVis_NUM_HIDDEN_VISIBLE];
|
||||
extern const char *HidVis_TitleClass[HidVis_NUM_HIDDEN_VISIBLE];
|
||||
extern const char *Txt_Actions[ActLst_NUM_ACTIONS];
|
||||
char *Id;
|
||||
static Act_Action_t NextActions[Usr_NUM_I_CAN] =
|
||||
{
|
||||
[Usr_I_CAN_NOT] = ActSeeOnePrj,
|
||||
[Usr_I_CAN ] = ActAdmDocPrj,
|
||||
};
|
||||
Act_Action_t NextAction;
|
||||
char *Id;
|
||||
|
||||
/***** Write first row of data of this project *****/
|
||||
HTM_TR_Begin (NULL);
|
||||
|
@ -1614,8 +1621,7 @@ static void Prj_ShowFirstRow (struct Prj_Projects *Projects,
|
|||
HTM_ARTICLE_Begin (Anchor);
|
||||
if (Projects->Prj.Title[0])
|
||||
{
|
||||
NextAction = Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod) ? ActAdmDocPrj :
|
||||
ActSeeOnePrj;
|
||||
NextAction = NextActions[Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod)];
|
||||
Frm_BeginForm (NextAction);
|
||||
Prj_PutCurrentPars (Projects);
|
||||
HTM_BUTTON_Submit_Begin (Txt_Actions[NextAction],
|
||||
|
@ -1703,8 +1709,8 @@ static void Prj_ShowReviewStatus (struct Prj_Projects *Projects,
|
|||
PutForm = Frm_DONT_PUT_FORM;
|
||||
break;
|
||||
default:
|
||||
PutForm = Prj_CheckIfICanReviewProjects () ? Frm_PUT_FORM :
|
||||
Frm_DONT_PUT_FORM;
|
||||
PutForm = (Prj_CheckIfICanReviewProjects () == Usr_I_CAN) ? Frm_PUT_FORM :
|
||||
Frm_DONT_PUT_FORM;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1869,12 +1875,12 @@ static void Prj_PutSelectorReviewStatus (struct Prj_Projects *Projects)
|
|||
/**************************** Can I review projects? *************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Prj_CheckIfICanReviewProjects (void)
|
||||
static Usr_ICan_t Prj_CheckIfICanReviewProjects (void)
|
||||
{
|
||||
static bool ICanReviewProjects[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanReviewProjects[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanReviewProjects[Gbl.Usrs.Me.Role.Logged];
|
||||
|
@ -2877,7 +2883,7 @@ static void Prj_FormToSelectUsrs (struct Prj_Projects *Projects,
|
|||
TxtButton,
|
||||
Hlp_ASSESSMENT_Projects_add_user,
|
||||
TxtButton,
|
||||
false); // Do not put form with date range
|
||||
Frm_DONT_PUT_FORM); // Do not put form with date range
|
||||
free (TxtButton);
|
||||
|
||||
/***** Put a form to create/edit project *****/
|
||||
|
@ -3045,7 +3051,7 @@ static void Prj_ReqRemUsrFromPrj (struct Prj_Projects *Projects,
|
|||
/***** Get user to be removed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Prj_CheckIfICanEditProject (&Projects->Prj))
|
||||
if (Prj_CheckIfICanEditProject (&Projects->Prj) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show question and button to remove user as a role from project *****/
|
||||
/* Begin alert */
|
||||
|
@ -3123,7 +3129,7 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInPrj)
|
|||
/***** Get user to be removed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Prj_CheckIfICanEditProject (&Projects.Prj))
|
||||
if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN)
|
||||
{
|
||||
/***** Remove user from the table of project-users *****/
|
||||
Prj_DB_RemoveUsrFromPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod);
|
||||
|
@ -3177,7 +3183,7 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
|
|||
[HidVis_VISIBLE] = ActHidPrj, // Visible ==> action to hide
|
||||
};
|
||||
|
||||
if (Prj_CheckIfICanEditProject (&Projects->Prj))
|
||||
if (Prj_CheckIfICanEditProject (&Projects->Prj) == Usr_I_CAN)
|
||||
{
|
||||
/***** Icon to remove project *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemPrj,NULL,
|
||||
|
@ -3190,11 +3196,11 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
|
|||
|
||||
/***** Icon to edit project *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOnePrj,NULL,
|
||||
Prj_PutCurrentPars,Projects);
|
||||
Prj_PutCurrentPars,Projects);
|
||||
}
|
||||
|
||||
/***** Icon to admin project documents *****/
|
||||
if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod))
|
||||
if (Prj_CheckIfICanViewProjectFiles (Projects->Prj.PrjCod) == Usr_I_CAN)
|
||||
Ico_PutContextualIconToViewFiles (ActAdmDocPrj,
|
||||
Prj_PutCurrentPars,Projects);
|
||||
|
||||
|
@ -3202,7 +3208,7 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
|
|||
Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutCurrentPars,Projects);
|
||||
|
||||
/***** Locked/unlocked project edition *****/
|
||||
if (PrjCfg_CheckIfICanConfig ())
|
||||
if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN)
|
||||
{
|
||||
/* Icon to lock/unlock project edition */
|
||||
HTM_DIV_Begin ("id=\"prj_lck_%ld\" class=\"PRJ_LOCK\"",
|
||||
|
@ -3215,7 +3221,7 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
|
|||
Prj_PutIconOffLockedUnlocked (&Projects->Prj);
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkPrj,NULL,
|
||||
Prj_PutCurrentPars,Projects);
|
||||
}
|
||||
|
@ -3224,20 +3230,21 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
|
|||
/************************ Can I edit a given project? ************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Prj_CheckIfICanEditProject (const struct Prj_Project *Prj)
|
||||
static Usr_ICan_t Prj_CheckIfICanEditProject (const struct Prj_Project *Prj)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_NET:
|
||||
if (Prj->Locked == Prj_LOCKED) // Locked edition
|
||||
return false;
|
||||
return (Prj_GetMyRolesInProject (Prj->PrjCod) &
|
||||
(1 << Prj_ROLE_TUT)) != 0; // Am I a tutor?
|
||||
if (Prj->Locked == Prj_LOCKED) // Locked edition
|
||||
return Usr_I_CAN_NOT;
|
||||
return ((Prj_GetMyRolesInProject (Prj->PrjCod) &
|
||||
(1 << Prj_ROLE_TUT)) != 0) ? Usr_I_CAN : // Am I a tutor?
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3502,7 +3509,7 @@ void Prj_ReqRemProject (void)
|
|||
Prj_GetProjectDataByCod (&Projects.Prj);
|
||||
|
||||
/***** Check if I can edit this project *****/
|
||||
if (!Prj_CheckIfICanEditProject (&Projects.Prj))
|
||||
if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Show question and button to remove the project *****/
|
||||
|
@ -3542,7 +3549,7 @@ void Prj_RemoveProject (void)
|
|||
Prj_GetProjectDataByCod (&Projects.Prj); // Inside this function, the course is checked to be the current one
|
||||
|
||||
/***** Check if I can edit this project *****/
|
||||
if (!Prj_CheckIfICanEditProject (&Projects.Prj))
|
||||
if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Remove users in project *****/
|
||||
|
@ -3606,7 +3613,7 @@ static void Prj_HideUnhideProject (HidVis_HiddenOrVisible_t HiddenOrVisible)
|
|||
Prj_GetProjectDataByCod (&Projects.Prj);
|
||||
|
||||
/***** Check if I can edit this project *****/
|
||||
if (!Prj_CheckIfICanEditProject (&Projects.Prj))
|
||||
if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Hide/unhide project *****/
|
||||
|
@ -3631,7 +3638,7 @@ void Prj_ReqCreatePrj (void)
|
|||
Prj_ResetPrjsAndReadConfig (&Projects);
|
||||
|
||||
/***** Check if I can create new projects *****/
|
||||
if (!Prj_CheckIfICanCreateProjects (&Projects))
|
||||
if (Prj_CheckIfICanCreateProjects (&Projects) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get parameters *****/
|
||||
|
@ -3996,7 +4003,7 @@ void Prj_ReceiveProject (void)
|
|||
extern const char *Txt_The_project_has_been_modified;
|
||||
struct Prj_Projects Projects;
|
||||
bool ItsANewProject;
|
||||
bool ICanEditProject;
|
||||
Usr_ICan_t ICanEditProject;
|
||||
bool NewProjectIsCorrect = true;
|
||||
|
||||
/***** Reset projects *****/
|
||||
|
@ -4025,7 +4032,7 @@ void Prj_ReceiveProject (void)
|
|||
}
|
||||
|
||||
/* Check if I can create/edit project */
|
||||
if (!ICanEditProject)
|
||||
if (ICanEditProject == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/* Get project title */
|
||||
|
@ -4163,7 +4170,7 @@ void Prj_ReqLockSelectedPrjsEdition (void)
|
|||
Prj_ResetPrjsAndReadConfig (&Projects);
|
||||
|
||||
/***** Check if I can configure projects *****/
|
||||
if (!PrjCfg_CheckIfICanConfig ())
|
||||
if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get parameters *****/
|
||||
|
@ -4201,7 +4208,7 @@ void Prj_ReqUnloSelectedPrjsEdition (void)
|
|||
Prj_ResetPrjsAndReadConfig (&Projects);
|
||||
|
||||
/***** Check if I can configure projects *****/
|
||||
if (!PrjCfg_CheckIfICanConfig ())
|
||||
if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get parameters *****/
|
||||
|
@ -4242,7 +4249,7 @@ void Prj_LockSelectedPrjsEdition (void)
|
|||
Prj_ResetPrjsAndReadConfig (&Projects);
|
||||
|
||||
/***** Check if I can configure projects *****/
|
||||
if (!PrjCfg_CheckIfICanConfig ())
|
||||
if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get parameters *****/
|
||||
|
@ -4278,7 +4285,7 @@ void Prj_UnloSelectedPrjsEdition (void)
|
|||
Prj_ResetPrjsAndReadConfig (&Projects);
|
||||
|
||||
/***** Check if I can configure projects *****/
|
||||
if (!PrjCfg_CheckIfICanConfig ())
|
||||
if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get parameters *****/
|
||||
|
@ -4368,7 +4375,7 @@ void Prj_LockProjectEdition (void)
|
|||
Prj_ResetPrjsAndReadConfig (&Projects);
|
||||
|
||||
/***** Check if I can configure projects *****/
|
||||
if (!PrjCfg_CheckIfICanConfig ())
|
||||
if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Allocate memory for the project *****/
|
||||
|
@ -4404,7 +4411,7 @@ void Prj_UnloProjectEdition (void)
|
|||
Prj_ResetPrjsAndReadConfig (&Projects);
|
||||
|
||||
/***** Check if I can configure projects *****/
|
||||
if (!PrjCfg_CheckIfICanConfig ())
|
||||
if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Allocate memory for the project *****/
|
||||
|
@ -4440,7 +4447,7 @@ void Prj_ChangeReviewStatus (void)
|
|||
Prj_ResetPrjsAndReadConfig (&Projects);
|
||||
|
||||
/***** Check if I can review projects *****/
|
||||
if (!Prj_CheckIfICanReviewProjects ())
|
||||
if (Prj_CheckIfICanReviewProjects () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Allocate memory for the project *****/
|
||||
|
@ -4499,7 +4506,7 @@ static void Prj_ShowRubrics (struct Prj_Projects *Projects)
|
|||
for (RubricType = (PrjCfg_RubricType_t) 1;
|
||||
RubricType <= (PrjCfg_RubricType_t) (PrjCfg_NUM_RUBRIC_TYPES - 1);
|
||||
RubricType++)
|
||||
if (Prj_CheckIfICanViewRubric (Projects->Prj.PrjCod,RubricType))
|
||||
if (Prj_CheckIfICanViewRubric (Projects->Prj.PrjCod,RubricType) == Usr_I_CAN)
|
||||
Prj_ShowRubricsOfType (Projects,RubricType);
|
||||
|
||||
/***** End table *****/
|
||||
|
@ -4521,7 +4528,7 @@ static void Prj_ShowRubricsOfType (struct Prj_Projects *Projects,
|
|||
unsigned NumRubricsThisType;
|
||||
unsigned NumRubThisType;
|
||||
struct Rub_Rubric Rubric;
|
||||
bool ICanFill = Prj_CheckIfICanFillRubric (Projects->Prj.PrjCod,RubricType);
|
||||
Usr_ICan_t ICanFill = Prj_CheckIfICanFillRubric (Projects->Prj.PrjCod,RubricType);
|
||||
|
||||
/***** Get project rubrics for current course from database *****/
|
||||
NumRubricsThisType = Prj_DB_GetRubricsOfType (&mysql_res,RubricType);
|
||||
|
@ -4587,7 +4594,7 @@ static void Prj_ShowRubricsOfType (struct Prj_Projects *Projects,
|
|||
/************************* Who can view/fill rubrics *************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric)
|
||||
static Usr_ICan_t Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
|
@ -4596,25 +4603,26 @@ static bool Prj_CheckIfICanViewRubric (long PrjCod,PrjCfg_RubricType_t WhichRubr
|
|||
switch (WhichRubric)
|
||||
{
|
||||
case PrjCfg_RUBRIC_ERR:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
case PrjCfg_RUBRIC_TUT:
|
||||
case PrjCfg_RUBRIC_EVL:
|
||||
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // I am a tutor
|
||||
1 << Prj_ROLE_EVL)) != 0); // or an evaluator
|
||||
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT | // I am a tutor...
|
||||
1 << Prj_ROLE_EVL)) != 0) ? Usr_I_CAN : // ...or an evaluator
|
||||
Usr_I_CAN_NOT;
|
||||
case PrjCfg_RUBRIC_GBL:
|
||||
return (Prj_GetMyRolesInProject (PrjCod) != 0); // I am a member
|
||||
return (Prj_GetMyRolesInProject (PrjCod) != 0) ? Usr_I_CAN : // I am a member
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
case Rol_TCH: // Editing teachers in a course can view all rubrics
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric)
|
||||
static Usr_ICan_t Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubric)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
|
@ -4623,20 +4631,22 @@ static bool Prj_CheckIfICanFillRubric (long PrjCod,PrjCfg_RubricType_t WhichRubr
|
|||
switch (WhichRubric)
|
||||
{
|
||||
case PrjCfg_RUBRIC_ERR:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
case PrjCfg_RUBRIC_TUT:
|
||||
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT)) != 0); // I am a tutor
|
||||
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_TUT)) != 0) ? Usr_I_CAN : // I am a tutor
|
||||
Usr_I_CAN_NOT;
|
||||
case PrjCfg_RUBRIC_EVL:
|
||||
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_EVL)) != 0); // Am I an evaluator
|
||||
return ((Prj_GetMyRolesInProject (PrjCod) & (1 << Prj_ROLE_EVL)) != 0) ? Usr_I_CAN : // Am I an evaluator
|
||||
Usr_I_CAN_NOT;
|
||||
case PrjCfg_RUBRIC_GBL:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
case Rol_TCH: // Editing teachers in a course can fill all rubrics
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4670,7 +4680,7 @@ void Prj_ChangeCriterionScore (void)
|
|||
Err_WrongRubricExit ();
|
||||
|
||||
/***** Update review *****/
|
||||
if (Prj_CheckIfICanFillRubric (Prj.PrjCod,WhichRubric))
|
||||
if (Prj_CheckIfICanFillRubric (Prj.PrjCod,WhichRubric) == Usr_I_CAN)
|
||||
Rub_DB_UpdateScore (Rsc_PROJECT,Prj.PrjCod,-1L,CriCod,Score);
|
||||
else
|
||||
Err_NoPermission ();
|
||||
|
|
|
@ -205,8 +205,8 @@ void Prj_SeeAllProjects (void);
|
|||
void Prj_ShowProjects (struct Prj_Projects *Projects);
|
||||
void Prj_ShowTableSelectedPrjs (void);
|
||||
|
||||
bool Prj_CheckIfICanViewProjectDocuments (long PrjCod);
|
||||
bool Prj_CheckIfICanViewProjectAssessment (long PrjCod);
|
||||
Usr_ICan_t Prj_CheckIfICanViewProjectDocuments (long PrjCod);
|
||||
Usr_ICan_t Prj_CheckIfICanViewProjectAssessment (long PrjCod);
|
||||
|
||||
void Prj_PutCurrentPars (void *Projects);
|
||||
void Prj_PutPars (struct Prj_Filter *Filter,
|
||||
|
|
|
@ -82,12 +82,12 @@ void PrjCfg_GetConfig (struct PrjCfg_Config *Config)
|
|||
/************************ Can I configure all projects? **********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool PrjCfg_CheckIfICanConfig (void)
|
||||
Usr_ICan_t PrjCfg_CheckIfICanConfig (void)
|
||||
{
|
||||
static const bool ICanConfigAllProjects[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanConfigAllProjects[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanConfigAllProjects[Gbl.Usrs.Me.Role.Logged];
|
||||
|
|
|
@ -61,7 +61,7 @@ struct PrgCfg_ListRubCods
|
|||
|
||||
void PrjCfg_GetConfig (struct PrjCfg_Config *Config);
|
||||
|
||||
bool PrjCfg_CheckIfICanConfig (void);
|
||||
Usr_ICan_t PrjCfg_CheckIfICanConfig (void);
|
||||
void PrjCfg_ShowFormConfig (void);
|
||||
PrjCfg_RubricType_t PrjCfg_GetRubricFromString (const char *Str);
|
||||
void PrjCfg_ChangeNETCanCreate (void);
|
||||
|
|
|
@ -427,16 +427,6 @@ void Qst_ShowFormRequestSelectQstsForGame (struct Gam_Games *Games,
|
|||
DB_FreeMySQLResult (&mysql_res);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*********************** Check if I can edit questions ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Qst_CheckIfICanEditQsts (void)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/********************* Put contextual icons in tests *************************/
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -141,7 +141,6 @@ void Qst_ShowFormRequestSelectQstsForExamSet (struct Exa_Exams *Exams,
|
|||
void Qst_ShowFormRequestSelectQstsForGame (struct Gam_Games *Games,
|
||||
struct Qst_Questions *Questions);
|
||||
|
||||
bool Qst_CheckIfICanEditQsts (void);
|
||||
void Qst_PutIconsRequestBankQsts (__attribute__((unused)) void *Args);
|
||||
void Qst_PutIconsEditBankQsts (void *Questions);
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include "swad_action.h"
|
||||
#include "swad_action_list.h"
|
||||
#include "swad_alert.h"
|
||||
#include "swad_agenda.h"
|
||||
#include "swad_box.h"
|
||||
#include "swad_config.h"
|
||||
#include "swad_database.h"
|
||||
|
@ -128,7 +129,7 @@ static bool Rec_GetParShowOfficeHours (void);
|
|||
static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
|
||||
struct Usr_Data *UsrDat,const char *Anchor);
|
||||
static void Rec_ShowMyCrsRecordUpdated (void);
|
||||
static bool Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility);
|
||||
static Usr_ICan_t Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility);
|
||||
|
||||
static void Rec_PutIconsCommands (__attribute__((unused)) void *Args);
|
||||
static void Rec_PutParsMyResults (__attribute__((unused)) void *Args);
|
||||
|
@ -961,7 +962,7 @@ void Rec_GetUsrAndShowRecOneStdCrs (void)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, // Get student's data from database
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
Rec_ShowRecordOneStdCrs ();
|
||||
}
|
||||
|
||||
|
@ -1184,7 +1185,7 @@ void Rec_GetUsrAndShowRecOneTchCrs (void)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, // Get teacher's data from database
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
Rec_ShowRecordOneTchCrs ();
|
||||
}
|
||||
|
||||
|
@ -1789,7 +1790,7 @@ void Rec_GetFieldsCrsRecordFromForm (void)
|
|||
for (NumField = 0;
|
||||
NumField < Gbl.Crs.Records.LstFields.Num;
|
||||
NumField++)
|
||||
if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility))
|
||||
if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility) == Usr_I_CAN)
|
||||
{
|
||||
/* Get text from the form */
|
||||
snprintf (FieldParName,sizeof (FieldParName),"Field%ld",
|
||||
|
@ -1811,7 +1812,7 @@ void Rec_UpdateCrsRecord (long UsrCod)
|
|||
for (NumField = 0;
|
||||
NumField < Gbl.Crs.Records.LstFields.Num;
|
||||
NumField++)
|
||||
if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility))
|
||||
if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility) == Usr_I_CAN)
|
||||
{
|
||||
/***** Check if already exists this field for this user in database *****/
|
||||
FieldAlreadyExists = (Rec_DB_GetFieldTxtFromUsrRecord (&mysql_res,
|
||||
|
@ -1867,7 +1868,7 @@ void Rec_AllocMemFieldsRecordsCrs (void)
|
|||
for (NumField = 0;
|
||||
NumField < Gbl.Crs.Records.LstFields.Num;
|
||||
NumField++)
|
||||
if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility))
|
||||
if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility) == Usr_I_CAN)
|
||||
/* Allocate memory for the texts of the fields */
|
||||
if ((Gbl.Crs.Records.LstFields.Lst[NumField].Text = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
|
@ -1884,7 +1885,7 @@ void Rec_FreeMemFieldsRecordsCrs (void)
|
|||
for (NumField = 0;
|
||||
NumField < Gbl.Crs.Records.LstFields.Num;
|
||||
NumField++)
|
||||
if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility))
|
||||
if (Rec_CheckIfICanEditField (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility) == Usr_I_CAN)
|
||||
/* Free memory of the text of the field */
|
||||
if (Gbl.Crs.Records.LstFields.Lst[NumField].Text)
|
||||
{
|
||||
|
@ -1897,13 +1898,14 @@ void Rec_FreeMemFieldsRecordsCrs (void)
|
|||
/* Check if I can edit a field depending on my role and the field visibility */
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility)
|
||||
static Usr_ICan_t Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility)
|
||||
{
|
||||
// Non-editing teachers can not edit fields
|
||||
return Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_STD &&
|
||||
Visibility == Rec_EDITABLE_FIELD);
|
||||
return ( Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_STD &&
|
||||
Visibility == Rec_EDITABLE_FIELD)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -2064,8 +2066,8 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
|
|||
ViewType = Vie_EDIT;
|
||||
break;
|
||||
case Rec_SHA_OTHER_EXISTING_USR_FORM:
|
||||
ViewType = Usr_ICanChangeOtherUsrData (UsrDat) ? Vie_EDIT :
|
||||
Vie_VIEW;
|
||||
ViewType = (Usr_ICanChangeOtherUsrData (UsrDat) == Usr_I_CAN) ? Vie_EDIT :
|
||||
Vie_VIEW;
|
||||
break;
|
||||
default: // In other options, I can not edit user's data
|
||||
ViewType = Vie_VIEW;
|
||||
|
@ -2280,7 +2282,7 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
|
|||
static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
|
||||
{
|
||||
Usr_MeOrOther_t MeOrOther = Usr_ItsMe (Rec_Record.UsrDat->UsrCod);
|
||||
bool ICanViewUsrProfile;
|
||||
Usr_ICan_t ICanViewUsrProfile;
|
||||
bool RecipientHasBannedMe;
|
||||
static Act_Action_t NextAction[Rol_NUM_ROLES] =
|
||||
{
|
||||
|
@ -2350,8 +2352,8 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
|
|||
Act_GetBrowserTab (Gbl.Action.Act) == Act_1ST_TAB && // Only in main browser tab
|
||||
Gbl.Usrs.Me.Logged) // Only if I am logged
|
||||
{
|
||||
ICanViewUsrProfile = Pri_ShowingIsAllowed (Rec_Record.UsrDat->BaPrfVisibility,
|
||||
Rec_Record.UsrDat);
|
||||
ICanViewUsrProfile = Pri_CheckIfICanView (Rec_Record.UsrDat->BaPrfVisibility,
|
||||
Rec_Record.UsrDat);
|
||||
|
||||
/***** Begin container *****/
|
||||
HTM_DIV_Begin ("class=\"FRAME_ICO\"");
|
||||
|
@ -2363,25 +2365,25 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
|
|||
"pen.svg",Ico_BLACK);
|
||||
|
||||
/***** Button to view user's profile *****/
|
||||
if (ICanViewUsrProfile)
|
||||
if (ICanViewUsrProfile == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeOthPubPrf,NULL,
|
||||
Rec_PutParUsrCodEncrypted,NULL,
|
||||
"user.svg",Ico_BLACK);
|
||||
|
||||
/***** Button to view user's record card *****/
|
||||
if (Usr_CheckIfICanViewRecordStd (Rec_Record.UsrDat))
|
||||
if (Usr_CheckIfICanViewRecordStd (Rec_Record.UsrDat) == Usr_I_CAN)
|
||||
/* View student's records: common record card and course record card */
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeRecOneStd,NULL,
|
||||
Rec_PutParUsrCodEncrypted,NULL,
|
||||
"address-card.svg",Ico_BLACK);
|
||||
else if (Usr_CheckIfICanViewRecordTch (Rec_Record.UsrDat))
|
||||
else if (Usr_CheckIfICanViewRecordTch (Rec_Record.UsrDat) == Usr_I_CAN)
|
||||
/* View teacher's record card and timetable */
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeRecOneTch,NULL,
|
||||
Rec_PutParUsrCodEncrypted,NULL,
|
||||
"address-card.svg",Ico_BLACK);
|
||||
|
||||
/***** Button to view user's agenda *****/
|
||||
if (Usr_CheckIfICanViewUsrAgenda (Rec_Record.UsrDat))
|
||||
if (Agd_CheckIfICanViewUsrAgenda (Rec_Record.UsrDat) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeAgd[MeOrOther],NULL,
|
||||
FuncPutParsAgd[MeOrOther],NULL,
|
||||
"calendar.svg",Ico_BLACK);
|
||||
|
@ -2402,7 +2404,7 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
|
|||
if (Rec_Record.UsrDat->Roles.InCurrentCrs == Rol_STD) // He/she is a student in current course
|
||||
{
|
||||
/***** Buttons to view student's test, exam and match results *****/
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (Rec_Record.UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (Rec_Record.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/* Test results in course */
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeTstResCrs[MeOrOther],NULL,
|
||||
|
@ -2419,13 +2421,13 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
|
|||
}
|
||||
|
||||
/***** Button to view student's assignments and works *****/
|
||||
if (Usr_CheckIfICanViewAsgWrk (Rec_Record.UsrDat))
|
||||
if (Usr_CheckIfICanViewAsgWrk (Rec_Record.UsrDat) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (ActAdmAsgWrk[MeOrOther],NULL,
|
||||
FuncPutParsAdmAsgWrk[MeOrOther],NULL,
|
||||
"folder-open.svg",Ico_BLACK);
|
||||
|
||||
/***** Button to view student's attendance *****/
|
||||
if (Usr_CheckIfICanViewAtt (Rec_Record.UsrDat))
|
||||
if (Usr_CheckIfICanViewAtt (Rec_Record.UsrDat) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (ActSeeLstAtt[MeOrOther],NULL,
|
||||
FuncPutParsSeeLstAtt[MeOrOther],NULL,
|
||||
"calendar-check.svg",Ico_BLACK);
|
||||
|
@ -2453,7 +2455,7 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
|
|||
Lay_PutContextualLinkOnlyIcon (ActUnfUsr,NULL,
|
||||
Rec_PutParUsrCodEncrypted,NULL,
|
||||
"user-check.svg",Ico_BLACK); // Put button to unfollow, even if I can not view user's profile
|
||||
else if (ICanViewUsrProfile)
|
||||
else if (ICanViewUsrProfile == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (ActFolUsr,NULL,
|
||||
Rec_PutParUsrCodEncrypted,NULL,
|
||||
"user-plus.svg",Ico_BLACK); // Put button to follow
|
||||
|
|
|
@ -472,12 +472,12 @@ bool Rsc_GetParLink (struct Rsc_Link *Link)
|
|||
/************************** Check if I can get link **************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Rsc_CheckIfICanGetLink (void)
|
||||
Usr_ICan_t Rsc_CheckIfICanGetLink (void)
|
||||
{
|
||||
static const bool ICanGetLink[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanGetLink[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanGetLink[Gbl.Usrs.Me.Role.Logged];
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include "swad_form.h"
|
||||
#include "swad_HTML.h"
|
||||
#include "swad_string.h"
|
||||
#include "swad_user.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************** Public types and constants ***********************/
|
||||
|
@ -88,6 +89,6 @@ Rsc_Type_t Rsc_GetTypeFromString (const char *Str);
|
|||
|
||||
bool Rsc_GetParLink (struct Rsc_Link *Link);
|
||||
|
||||
bool Rsc_CheckIfICanGetLink (void);
|
||||
Usr_ICan_t Rsc_CheckIfICanGetLink (void);
|
||||
|
||||
#endif
|
||||
|
|
17
swad_room.c
17
swad_room.c
|
@ -97,7 +97,7 @@ static void Roo_GetAndListMACAddresses (long RooCod);
|
|||
static void Roo_GetAndEditMACAddresses (long RooCod,const char *Anchor);
|
||||
|
||||
static Roo_Order_t Roo_GetParRoomOrder (void);
|
||||
static bool Roo_CheckIfICanCreateRooms (void);
|
||||
static Usr_ICan_t Roo_CheckIfICanCreateRooms (void);
|
||||
static void Roo_PutIconsListingRooms (__attribute__((unused)) void *Args);
|
||||
static void Roo_PutIconToEditRooms (void);
|
||||
static void Roo_PutIconsEditingRooms (__attribute__((unused)) void *Args);
|
||||
|
@ -377,9 +377,10 @@ static Roo_Order_t Roo_GetParRoomOrder (void)
|
|||
/*********************** Check if I can create rooms *************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Roo_CheckIfICanCreateRooms (void)
|
||||
static Usr_ICan_t Roo_CheckIfICanCreateRooms (void)
|
||||
{
|
||||
return Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM;
|
||||
return (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -389,7 +390,7 @@ static bool Roo_CheckIfICanCreateRooms (void)
|
|||
static void Roo_PutIconsListingRooms (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit rooms *****/
|
||||
if (Roo_CheckIfICanCreateRooms ())
|
||||
if (Roo_CheckIfICanCreateRooms () == Usr_I_CAN)
|
||||
Roo_PutIconToEditRooms ();
|
||||
}
|
||||
|
||||
|
@ -399,8 +400,7 @@ static void Roo_PutIconsListingRooms (__attribute__((unused)) void *Args)
|
|||
|
||||
static void Roo_PutIconToEditRooms (void)
|
||||
{
|
||||
Ico_PutContextualIconToEdit (ActEdiRoo,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToEdit (ActEdiRoo,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -460,8 +460,7 @@ static void Roo_EditRoomsInternal (void)
|
|||
static void Roo_PutIconsEditingRooms (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to view rooms *****/
|
||||
Ico_PutContextualIconToView (ActSeeRoo,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToView (ActSeeRoo,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -702,7 +701,7 @@ static void Roo_ListRoomsForEdition (const struct Bld_Buildings *Buildings,
|
|||
Nam_ExistingShortAndFullNames (ActionRename,
|
||||
ParCod_Roo,Room->RooCod,
|
||||
Names,
|
||||
true); // Put form
|
||||
Frm_PUT_FORM);
|
||||
|
||||
/* Seating capacity */
|
||||
HTM_TD_Begin ("class=\"LT\"");
|
||||
|
|
|
@ -396,7 +396,7 @@ long Roo_DB_CheckIn (long RooCod)
|
|||
/********************** Check if I can see user's location *******************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Roo_DB_CheckIfICanSeeUsrLocation (long UsrCod)
|
||||
Usr_ICan_t Roo_DB_CheckIfICanSeeUsrLocation (long UsrCod)
|
||||
{
|
||||
/*
|
||||
I can only consult the location of another user
|
||||
|
@ -426,7 +426,8 @@ bool Roo_DB_CheckIfICanSeeUsrLocation (long UsrCod)
|
|||
" AND crs_courses.DegCod=deg_degrees.DegCod) AS C2" // centers of user's courses
|
||||
" WHERE C1.CtrCod=C2.CtrCod)",
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||
UsrCod);
|
||||
UsrCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -55,7 +55,7 @@ void Roo_DB_RemoveAllRoomsInCtr (long CtrCod);
|
|||
//--------------------------------- Check in ----------------------------------
|
||||
long Roo_DB_CheckIn (long RooCod);
|
||||
|
||||
bool Roo_DB_CheckIfICanSeeUsrLocation (long UsrCod);
|
||||
Usr_ICan_t Roo_DB_CheckIfICanSeeUsrLocation (long UsrCod);
|
||||
unsigned Roo_DB_GetUsrLastLocation (MYSQL_RES **mysql_res,long UsrCod);
|
||||
unsigned Roo_DB_GetLocationByMAC (MYSQL_RES **mysql_res,unsigned long long MACnum);
|
||||
|
||||
|
|
|
@ -228,12 +228,12 @@ void Rub_ListAllRubrics (struct Rub_Rubrics *Rubrics)
|
|||
/************************ Check if I can edit rubrics ************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Rub_CheckIfICanEditRubrics (void)
|
||||
Usr_ICan_t Rub_CheckIfICanEditRubrics (void)
|
||||
{
|
||||
static const bool ICanEditRubrics[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanEditRubrics[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanEditRubrics[Gbl.Usrs.Me.Role.Logged];
|
||||
|
@ -245,7 +245,7 @@ bool Rub_CheckIfICanEditRubrics (void)
|
|||
|
||||
bool Rub_CheckIfEditable (void)
|
||||
{
|
||||
if (Rub_CheckIfICanEditRubrics ())
|
||||
if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN)
|
||||
/***** Rubric is editable only if ... *****/
|
||||
// TODO: Change to control that a rubric is not edited in some circunstances?
|
||||
/*
|
||||
|
@ -265,7 +265,7 @@ static void Rub_PutIconsListRubrics (void *Rubrics)
|
|||
{
|
||||
if (Rubrics)
|
||||
{
|
||||
if (Rub_CheckIfICanEditRubrics ())
|
||||
if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN)
|
||||
{
|
||||
/***** Put icon to create a new rubric *****/
|
||||
Rub_PutIconToCreateNewRubric ((struct Rub_Rubrics *) Rubrics);
|
||||
|
@ -275,9 +275,8 @@ static void Rub_PutIconsListRubrics (void *Rubrics)
|
|||
}
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL,
|
||||
Rub_PutPars,Rubrics);
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL,Rub_PutPars,Rubrics);
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
Fig_PutIconToShowFigure (Fig_RUBRICS);
|
||||
|
@ -300,8 +299,7 @@ static void Rub_PutIconToCreateNewRubric (struct Rub_Rubrics *Rubrics)
|
|||
|
||||
static void Prg_PutIconToViewResourceClipboard (void)
|
||||
{
|
||||
Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InRub,NULL,
|
||||
NULL,NULL);
|
||||
Ico_PutContextualIconToViewClipboard (ActSeeRscCli_InRub,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -472,26 +470,22 @@ static void Rub_PutIconsEditingOneRubric (void *Rubrics)
|
|||
{
|
||||
if (Rubrics)
|
||||
/***** Icon to view rubric *****/
|
||||
Ico_PutContextualIconToView (ActSeeOneRub,NULL,
|
||||
Rub_PutPars,Rubrics);
|
||||
Ico_PutContextualIconToView (ActSeeOneRub,NULL,Rub_PutPars,Rubrics);
|
||||
}
|
||||
|
||||
static void Rub_PutIconsToRemEditOneRubric (struct Rub_Rubrics *Rubrics)
|
||||
{
|
||||
if (Rub_CheckIfICanEditRubrics ())
|
||||
if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN)
|
||||
{
|
||||
/***** Icon to remove rubric *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemRub,NULL,
|
||||
Rub_PutPars,Rubrics);
|
||||
Ico_PutContextualIconToRemove (ActReqRemRub,NULL,Rub_PutPars,Rubrics);
|
||||
|
||||
/***** Icon to edit rubric *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneRub,NULL,
|
||||
Rub_PutPars,Rubrics);
|
||||
Ico_PutContextualIconToEdit (ActEdiOneRub,NULL,Rub_PutPars,Rubrics);
|
||||
|
||||
/***** Link to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL,
|
||||
Rub_PutPars,Rubrics);
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkRub,NULL,Rub_PutPars,Rubrics);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -652,7 +646,7 @@ void Rub_AskRemRubric (void)
|
|||
|
||||
/***** Get data of the rubric from database *****/
|
||||
Rub_GetRubricDataByCod (&Rubrics.Rubric);
|
||||
if (!Rub_CheckIfICanEditRubrics ())
|
||||
if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Show criterion and button to remove rubric *****/
|
||||
|
@ -686,7 +680,7 @@ void Rub_RemoveRubric (void)
|
|||
|
||||
/***** Get data of the rubric from database *****/
|
||||
Rub_GetRubricDataByCod (&Rubrics.Rubric);
|
||||
if (!Rub_CheckIfICanEditRubrics ())
|
||||
if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Remove rubric from all tables *****/
|
||||
|
@ -738,7 +732,7 @@ void Rub_ReqCreatOrEditRubric (void)
|
|||
Rub_ExistingNewRubric_t ExistingNewRubric;
|
||||
|
||||
/***** Check if I can edit rubrics *****/
|
||||
if (!Rub_CheckIfICanEditRubrics ())
|
||||
if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Reset rubrics context *****/
|
||||
|
@ -910,7 +904,7 @@ void Rub_ReceiveRubric (void)
|
|||
Rub_ExistingNewRubric_t ExistingNewRubric;
|
||||
|
||||
/***** Check if I can edit rubrics *****/
|
||||
if (!Rub_CheckIfICanEditRubrics ())
|
||||
if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Reset rubrics context *****/
|
||||
|
|
|
@ -54,7 +54,7 @@ void Rub_RubricDestructor (struct Rub_Rubric *Rubric);
|
|||
|
||||
void Rub_SeeAllRubrics (void);
|
||||
void Rub_ListAllRubrics (struct Rub_Rubrics *Rubrics);
|
||||
bool Rub_CheckIfICanEditRubrics (void);
|
||||
Usr_ICan_t Rub_CheckIfICanEditRubrics (void);
|
||||
bool Rub_CheckIfEditable (void);
|
||||
void Rub_SeeOneRubric (void);
|
||||
void Rub_ShowOnlyOneRubric (struct Rub_Rubrics *Rubrics);
|
||||
|
|
|
@ -561,7 +561,7 @@ void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics)
|
|||
/*****************************************************************************/
|
||||
|
||||
void RubCri_ListCriteriaInProject (struct Prj_Projects *Projects,long RubCod,
|
||||
bool ICanFill)
|
||||
Usr_ICan_t ICanFill)
|
||||
{
|
||||
MYSQL_RES *mysql_res;
|
||||
unsigned NumCriteria;
|
||||
|
|
|
@ -45,7 +45,7 @@ void RubCri_ChangeWeight (void);
|
|||
void RubCri_ListCriteriaForSeeing (const struct Rub_Rubrics *Rubrics);
|
||||
void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics);
|
||||
void RubCri_ListCriteriaInProject (struct Prj_Projects *Projects,long RubCod,
|
||||
bool ICanFill);
|
||||
Usr_ICan_t ICanFill);
|
||||
|
||||
void Rub_PushRubCod (struct Rub_Node **TOS,long RubCod);
|
||||
void Rub_PopRubCod (struct Rub_Node **TOS);
|
||||
|
|
|
@ -114,7 +114,7 @@ static void RubRsc_ShowClipboard (void)
|
|||
static void RubRsc_PutIconsClipboard (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to remove resource clipboard in rubrics *****/
|
||||
if (Rub_CheckIfICanEditRubrics ())
|
||||
if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN)
|
||||
if (Rsc_DB_GetNumResourcesInClipboard ()) // Only if there are resources
|
||||
Ico_PutContextualIconToRemove (ActRemRscCli_InRub,NULL,
|
||||
NULL,NULL);
|
||||
|
|
|
@ -75,7 +75,7 @@ extern struct Globals Gbl;
|
|||
/***************************** Private prototypes ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Svy_CheckIfICanCreateSvy (void);
|
||||
static Usr_ICan_t Svy_CheckIfICanCreateSvy (void);
|
||||
static void Svy_PutIconsListSurveys (void *Surveys);
|
||||
static void Svy_PutIconToCreateNewSvy (struct Svy_Surveys *Surveys);
|
||||
static void Svy_PutParsToCreateNewSvy (void *Surveys);
|
||||
|
@ -224,7 +224,7 @@ void Svy_ListAllSurveys (struct Svy_Surveys *Surveys)
|
|||
HTM_TR_Begin (NULL);
|
||||
|
||||
if (Surveys->Svy.Status.ICanEdit ||
|
||||
Rsc_CheckIfICanGetLink ())
|
||||
Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
HTM_TH_Span (NULL,HTM_HEAD_CENTER,1,1,"CONTEXT_COL"); // Column for contextual icons
|
||||
|
||||
for (Order = (Dat_StartEndTime_t) 0;
|
||||
|
@ -287,15 +287,15 @@ void Svy_ListAllSurveys (struct Svy_Surveys *Surveys)
|
|||
/******************* Check if I can create a new survey **********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Svy_CheckIfICanCreateSvy (void)
|
||||
static Usr_ICan_t Svy_CheckIfICanCreateSvy (void)
|
||||
{
|
||||
static const bool ICanCreateSvy[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanCreateSvy[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_DEG_ADM] = true,
|
||||
[Rol_CTR_ADM] = true,
|
||||
[Rol_INS_ADM] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_DEG_ADM] = Usr_I_CAN,
|
||||
[Rol_CTR_ADM] = Usr_I_CAN,
|
||||
[Rol_INS_ADM] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanCreateSvy[Gbl.Usrs.Me.Role.Logged];
|
||||
|
@ -308,13 +308,12 @@ static bool Svy_CheckIfICanCreateSvy (void)
|
|||
static void Svy_PutIconsListSurveys (void *Surveys)
|
||||
{
|
||||
/***** Put icon to create a new survey *****/
|
||||
if (Svy_CheckIfICanCreateSvy ())
|
||||
if (Svy_CheckIfICanCreateSvy () == Usr_I_CAN)
|
||||
Svy_PutIconToCreateNewSvy ((struct Svy_Surveys *) Surveys);
|
||||
|
||||
/***** Put icon to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL,
|
||||
Svy_PutPars,Surveys);
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL,Svy_PutPars,Surveys);
|
||||
|
||||
/***** Put icon to show a figure *****/
|
||||
Fig_PutIconToShowFigure (Fig_SURVEYS);
|
||||
|
@ -439,7 +438,7 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
HTM_TD_Begin ("rowspan=\"2\" class=\"CONTEXT_COL %s\"",
|
||||
The_GetColorRows ());
|
||||
if (Surveys->Svy.Status.ICanEdit ||
|
||||
Rsc_CheckIfICanGetLink ())
|
||||
Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Svy_PutFormsToRemEditOneSvy (Surveys,Anchor);
|
||||
HTM_TD_End ();
|
||||
}
|
||||
|
@ -846,12 +845,10 @@ static void Svy_PutFormsToRemEditOneSvy (struct Svy_Surveys *Surveys,
|
|||
if (Surveys->Svy.Status.ICanEdit)
|
||||
{
|
||||
/***** Icon to remove survey *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemSvy,NULL,
|
||||
Svy_PutPars,Surveys);
|
||||
Ico_PutContextualIconToRemove (ActReqRemSvy,NULL,Svy_PutPars,Surveys);
|
||||
|
||||
/***** Icon to reset survey *****/
|
||||
Ico_PutContextualIconToReset (ActReqRstSvy,NULL,
|
||||
Svy_PutPars,Surveys);
|
||||
Ico_PutContextualIconToReset (ActReqRstSvy,NULL,Svy_PutPars,Surveys);
|
||||
|
||||
/***** Icon to hide/unhide survey *****/
|
||||
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Anchor,
|
||||
|
@ -859,14 +856,12 @@ static void Svy_PutFormsToRemEditOneSvy (struct Svy_Surveys *Surveys,
|
|||
Surveys->Svy.Status.HiddenOrVisible);
|
||||
|
||||
/***** Icon to edit survey *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOneSvy,NULL,
|
||||
Svy_PutPars,Surveys);
|
||||
Ico_PutContextualIconToEdit (ActEdiOneSvy,NULL,Svy_PutPars,Surveys);
|
||||
}
|
||||
|
||||
/***** Icon to get resource link *****/
|
||||
if (Rsc_CheckIfICanGetLink ())
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL,
|
||||
Svy_PutPars,Surveys);
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
Ico_PutContextualIconToGetLink (ActReqLnkSvy,NULL,Svy_PutPars,Surveys);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1165,7 +1160,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
|
|||
break;
|
||||
case Hie_CRS: // Course
|
||||
Svy->Status.IBelongToScope = Hie_CheckIfIBelongTo (Svy->Level,Svy->HieCod) &&
|
||||
Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (Svy->SvyCod);
|
||||
Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (Svy->SvyCod) == Usr_I_CAN;
|
||||
break;
|
||||
default: // Unknown
|
||||
Err_WrongHierarchyLevelExit ();
|
||||
|
@ -1596,7 +1591,7 @@ void Svy_ReqCreatOrEditSvy (void)
|
|||
if (ItsANewSurvey)
|
||||
{
|
||||
/***** Put link (form) to create new survey *****/
|
||||
if (!Svy_CheckIfICanCreateSvy ())
|
||||
if (Svy_CheckIfICanCreateSvy () == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/* Initialize to empty survey */
|
||||
|
|
|
@ -743,7 +743,7 @@ unsigned Svy_DB_GetGrpNamesAssociatedToSvy (MYSQL_RES **mysql_res,long SvyCod)
|
|||
/************ Check if I belong to any of the groups of a survey *************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod)
|
||||
Usr_ICan_t Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod)
|
||||
{
|
||||
return
|
||||
DB_QueryEXISTS ("can not check if I can do a survey",
|
||||
|
@ -762,7 +762,8 @@ bool Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod)
|
|||
" WHERE grp_users.UsrCod=%ld"
|
||||
" AND grp_users.GrpCod=svy_groups.GrpCod)))",
|
||||
SvyCod,
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||
Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -66,7 +66,7 @@ void Svy_DB_RemoveSvysIn (Hie_Level_t Level,long HieCod);
|
|||
void Svy_DB_CreateGrp (long SvyCod,long GrpCod);
|
||||
|
||||
unsigned Svy_DB_GetGrpNamesAssociatedToSvy (MYSQL_RES **mysql_res,long SvyCod);
|
||||
bool Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod);
|
||||
Usr_ICan_t Svy_DB_CheckIfICanDoThisSurveyBasedOnGrps (long SvyCod);
|
||||
|
||||
void Svy_DB_RemoveGroupsOfType (long GrpTypCod);
|
||||
void Svy_DB_RemoveGroup (long GrpCod);
|
||||
|
|
39
swad_tab.c
39
swad_tab.c
|
@ -43,7 +43,7 @@ extern struct Globals Gbl;
|
|||
/***************************** Private prototypes ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Tab_CheckIfICanViewTab (Tab_Tab_t Tab);
|
||||
static Usr_ICan_t Tab_CheckIfICanViewTab (Tab_Tab_t Tab);
|
||||
static const char *Tab_GetIcon (Tab_Tab_t Tab);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -55,7 +55,6 @@ void Tab_DrawTabs (void)
|
|||
extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS];
|
||||
Tab_Tab_t NumTab;
|
||||
const char *TabTxt;
|
||||
bool ICanViewTab;
|
||||
char URLIconSet[PATH_MAX + 1];
|
||||
static const char *ClassIcoTab[Ico_NUM_ICON_SETS] =
|
||||
{
|
||||
|
@ -73,8 +72,6 @@ void Tab_DrawTabs (void)
|
|||
NumTab <= (Tab_Tab_t) (Tab_NUM_TABS - 1);
|
||||
NumTab++)
|
||||
{
|
||||
ICanViewTab = Tab_CheckIfICanViewTab (NumTab);
|
||||
|
||||
/* If current tab is unknown, then activate the first one with access allowed */
|
||||
if (Gbl.Action.Tab == TabUnk)
|
||||
{
|
||||
|
@ -82,7 +79,7 @@ void Tab_DrawTabs (void)
|
|||
Tab_DisableIncompatibleTabs ();
|
||||
}
|
||||
|
||||
if (ICanViewTab) // Don't show the first hidden tabs
|
||||
if (Tab_CheckIfICanViewTab (NumTab) == Usr_I_CAN) // Don't show the first hidden tabs
|
||||
{
|
||||
TabTxt = Tab_GetTxt (NumTab);
|
||||
|
||||
|
@ -133,32 +130,40 @@ void Tab_DrawTabs (void)
|
|||
/************************* Check if I can view a tab *************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Tab_CheckIfICanViewTab (Tab_Tab_t Tab)
|
||||
static Usr_ICan_t Tab_CheckIfICanViewTab (Tab_Tab_t Tab)
|
||||
{
|
||||
switch (Tab)
|
||||
{
|
||||
case TabUnk:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
case TabSys:
|
||||
return (Gbl.Hierarchy.Level == Hie_SYS); // Institution selected
|
||||
return (Gbl.Hierarchy.Level == Hie_SYS) ? Usr_I_CAN : // Institution selected
|
||||
Usr_I_CAN_NOT;
|
||||
case TabCty:
|
||||
return (Gbl.Hierarchy.Level == Hie_CTY); // Institution selected
|
||||
return (Gbl.Hierarchy.Level == Hie_CTY) ? Usr_I_CAN : // Institution selected
|
||||
Usr_I_CAN_NOT;
|
||||
case TabIns:
|
||||
return (Gbl.Hierarchy.Level == Hie_INS); // Institution selected
|
||||
return (Gbl.Hierarchy.Level == Hie_INS) ? Usr_I_CAN : // Institution selected
|
||||
Usr_I_CAN_NOT;
|
||||
case TabCtr:
|
||||
return (Gbl.Hierarchy.Level == Hie_CTR); // Center selected
|
||||
return (Gbl.Hierarchy.Level == Hie_CTR) ? Usr_I_CAN : // Center selected
|
||||
Usr_I_CAN_NOT;
|
||||
case TabDeg:
|
||||
return (Gbl.Hierarchy.Level == Hie_DEG); // Degree selected
|
||||
return (Gbl.Hierarchy.Level == Hie_DEG) ? Usr_I_CAN : // Degree selected
|
||||
Usr_I_CAN_NOT;
|
||||
case TabCrs:
|
||||
return (Gbl.Hierarchy.Level == Hie_CRS); // Course selected
|
||||
return (Gbl.Hierarchy.Level == Hie_CRS) ? Usr_I_CAN : // Course selected
|
||||
Usr_I_CAN_NOT;
|
||||
case TabAss:
|
||||
return (Gbl.Hierarchy.Level == Hie_CRS && // Course selected
|
||||
Gbl.Usrs.Me.Role.Logged >= Rol_STD); // I belong to course or I am an admin
|
||||
return (Gbl.Hierarchy.Level == Hie_CRS && // Course selected
|
||||
Gbl.Usrs.Me.Role.Logged >= Rol_STD) ? Usr_I_CAN : // I belong to course or I am an admin
|
||||
Usr_I_CAN_NOT;
|
||||
case TabFil:
|
||||
return (Gbl.Hierarchy.Node[Hie_INS].HieCod > 0 || // Institution selected
|
||||
Gbl.Usrs.Me.Logged); // I'm logged
|
||||
Gbl.Usrs.Me.Logged) ? Usr_I_CAN : // I'm logged
|
||||
Usr_I_CAN_NOT;
|
||||
default:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -126,31 +126,31 @@ static void TstPrn_GetCorrectAndComputeTxtAnsScore (struct TstPrn_PrintedQuestio
|
|||
static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
__attribute__((unused)) const char *ClassTxt,
|
||||
__attribute__((unused)) const char *ClassFeedback);
|
||||
static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
__attribute__((unused)) const char *ClassTxt,
|
||||
__attribute__((unused)) const char *ClassFeedback);
|
||||
static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
__attribute__((unused)) const char *ClassTxt,
|
||||
__attribute__((unused)) const char *ClassFeedback);
|
||||
static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
const char *ClassTxt,
|
||||
const char *ClassFeedback);
|
||||
static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
__attribute__((unused)) const char *ClassTxt,
|
||||
__attribute__((unused)) const char *ClassFeedback);
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -605,16 +605,20 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
extern const char *Txt_Question_removed;
|
||||
extern const char *Txt_Question_modified;
|
||||
bool QuestionUneditedAfterExam = false;
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY];
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY];
|
||||
|
||||
/***** Check if I can view each part of the question *****/
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD:
|
||||
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility);
|
||||
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility);
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility);
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility);
|
||||
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
|
@ -625,13 +629,13 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
|
||||
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = true;
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
|
||||
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = false;
|
||||
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -663,7 +667,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
ICanView[TstVis_VISIBLE_QST_ANS_TXT]);
|
||||
|
||||
/* Media */
|
||||
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT])
|
||||
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN)
|
||||
Med_ShowMedia (&Question->Media,
|
||||
"Tst_MED_SHOW_CONT",
|
||||
"Tst_MED_SHOW");
|
||||
|
@ -674,7 +678,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
ICanView,"Qst_TXT","Qst_TXT_LIGHT");
|
||||
|
||||
/* Write score retrieved from database */
|
||||
if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE])
|
||||
if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE] == Usr_I_CAN)
|
||||
{
|
||||
HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"",
|
||||
The_GetSuffix ());
|
||||
|
@ -698,7 +702,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
|
||||
/* Question feedback */
|
||||
if (QuestionUneditedAfterExam)
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
|
||||
Qst_WriteQstFeedback (Question->Feedback,"Qst_TXT_LIGHT");
|
||||
|
||||
HTM_TD_End ();
|
||||
|
@ -1169,14 +1173,14 @@ void TstPrn_ShowGrade (double Grade,double MaxGrade)
|
|||
void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
const char *ClassTxt,
|
||||
const char *ClassFeedback)
|
||||
{
|
||||
void (*TstPrn_WriteAnsExam[Qst_NUM_ANS_TYPES]) (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
const char *ClassTxt,
|
||||
const char *ClassFeedback) =
|
||||
{
|
||||
|
@ -1200,7 +1204,7 @@ void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat,
|
|||
static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
__attribute__((unused)) const char *ClassTxt,
|
||||
__attribute__((unused)) const char *ClassFeedback)
|
||||
{
|
||||
|
@ -1225,7 +1229,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
|
|||
if (sscanf (PrintedQuestion->StrAnswers,"%ld",&IntAnswerUsr) == 1)
|
||||
{
|
||||
HTM_TD_Begin ("class=\"CM %s_%s\"",
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ?
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN ?
|
||||
(IntAnswerUsr == Question->Answer.Integer ? "Qst_ANS_OK" : // Correct
|
||||
"Qst_ANS_BAD") : // Wrong
|
||||
"Qst_ANS_0", // Blank answer
|
||||
|
@ -1246,7 +1250,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
|
|||
|
||||
/***** Write the correct answer *****/
|
||||
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
HTM_Long (Question->Answer.Integer);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
|
@ -1264,7 +1268,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
|
|||
static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
__attribute__((unused)) const char *ClassTxt,
|
||||
__attribute__((unused)) const char *ClassFeedback)
|
||||
{
|
||||
|
@ -1290,7 +1294,7 @@ static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
|
|||
FloatAnsUsr = Str_GetDoubleFromStr (PrintedQuestion->StrAnswers);
|
||||
// A bad formatted floating point answer will interpreted as 0.0
|
||||
HTM_TD_Begin ("class=\"CM %s_%s\"",
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ?
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN ?
|
||||
((FloatAnsUsr >= Question->Answer.FloatingPoint[0] &&
|
||||
FloatAnsUsr <= Question->Answer.FloatingPoint[1]) ? "Qst_ANS_OK" : // Correct
|
||||
"Qst_ANS_BAD") : // Wrong
|
||||
|
@ -1304,7 +1308,7 @@ static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
|
|||
|
||||
/***** Write the correct answer *****/
|
||||
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
{
|
||||
HTM_Txt ("[");
|
||||
HTM_Double (Question->Answer.FloatingPoint[0]);
|
||||
|
@ -1328,7 +1332,7 @@ static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
|
|||
static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
__attribute__((unused)) const char *ClassTxt,
|
||||
__attribute__((unused)) const char *ClassFeedback)
|
||||
{
|
||||
|
@ -1352,7 +1356,7 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
|
|||
|
||||
/***** Write the user answer *****/
|
||||
HTM_TD_Begin ("class=\"CM %s_%s\"",
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ?
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN ?
|
||||
(AnsTFUsr == Question->Answer.TF ? "Qst_ANS_OK" : // Correct
|
||||
"Qst_ANS_BAD") : // Wrong
|
||||
"Qst_ANS_0", // Blank answer
|
||||
|
@ -1362,7 +1366,7 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
|
|||
|
||||
/***** Write the correct answer *****/
|
||||
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
Qst_WriteAnsTF (Question->Answer.TF);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
|
@ -1380,7 +1384,7 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
|
|||
static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
const char *ClassTxt,
|
||||
const char *ClassFeedback)
|
||||
{
|
||||
|
@ -1399,7 +1403,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
|
|||
Qst_ChangeFormatAnswersText (Question);
|
||||
|
||||
/***** Change format of answers feedback *****/
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
|
||||
Qst_ChangeFormatAnswersFeedback (Question);
|
||||
|
||||
/***** Get indexes for this question from string *****/
|
||||
|
@ -1426,7 +1430,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
|
|||
/* Draw icon depending on user's answer */
|
||||
if (UsrAnswers[Indexes[NumOpt]]) // This answer has been selected by the user
|
||||
{
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
{
|
||||
if (Question->Answer.Options[Indexes[NumOpt]].Correct)
|
||||
{
|
||||
|
@ -1455,7 +1459,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
|
|||
HTM_TD_Empty (1);
|
||||
|
||||
/* Draw icon that indicates whether the answer is correct */
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
{
|
||||
if (Question->Answer.Options[Indexes[NumOpt]].Correct)
|
||||
{
|
||||
|
@ -1487,7 +1491,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
|
|||
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
ClassTxt,The_GetSuffix ());
|
||||
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT])
|
||||
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN)
|
||||
{
|
||||
HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text);
|
||||
Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media,
|
||||
|
@ -1498,7 +1502,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
|
|||
Ico_PutIconNotVisible ();
|
||||
HTM_DIV_End ();
|
||||
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
if (Question->Answer.Options[Indexes[NumOpt]].Feedback)
|
||||
if (Question->Answer.Options[Indexes[NumOpt]].Feedback[0])
|
||||
{
|
||||
|
@ -1524,7 +1528,7 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
|
|||
static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
__attribute__((unused)) const char *ClassTxt,
|
||||
__attribute__((unused)) const char *ClassFeedback)
|
||||
{
|
||||
|
@ -1537,7 +1541,7 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
|
|||
Qst_ChangeFormatAnswersText (Question);
|
||||
|
||||
/***** Change format of answers feedback *****/
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
|
||||
Qst_ChangeFormatAnswersFeedback (Question);
|
||||
|
||||
/***** Begin table *****/
|
||||
|
@ -1578,9 +1582,9 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
|
|||
}
|
||||
}
|
||||
HTM_TD_Begin ("class=\"CT %s_%s\"",
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ? (Correct ? "Qst_ANS_OK" : // Correct
|
||||
"Qst_ANS_BAD") : // Wrong
|
||||
"Qst_ANS_0", // Blank answer
|
||||
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN ? (Correct ? "Qst_ANS_OK" : // Correct
|
||||
"Qst_ANS_BAD") : // Wrong
|
||||
"Qst_ANS_0", // Blank answer
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (PrintedQuestion->StrAnswers);
|
||||
HTM_TD_End ();
|
||||
|
@ -1589,7 +1593,7 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
|
|||
HTM_TD_Empty (1);
|
||||
|
||||
/***** Write the correct answers *****/
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
{
|
||||
HTM_TD_Begin ("class=\"CT\"");
|
||||
HTM_TABLE_BeginPadding (2);
|
||||
|
@ -1614,7 +1618,7 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
|
|||
HTM_Txt (Question->Answer.Options[NumOpt].Text);
|
||||
HTM_DIV_End ();
|
||||
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
|
||||
if (Question->Answer.Options[NumOpt].Feedback)
|
||||
if (Question->Answer.Options[NumOpt].Feedback[0])
|
||||
{
|
||||
|
@ -1682,7 +1686,7 @@ static void TstPrn_PutFormToSelectUsrsToViewUsrsPrints (__attribute__((unused))
|
|||
Act_GetActionText (ActSeeUsrTstResCrs),
|
||||
Hlp_ASSESSMENT_Tests_results,
|
||||
Txt_View_results,
|
||||
true); // Put form with date range
|
||||
Frm_PUT_FORM); // Put form with date range
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1784,7 +1788,7 @@ static void TstPrn_ShowUsrsPrints (__attribute__((unused)) void *Args)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Show tests *****/
|
||||
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
|
@ -1920,7 +1924,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
|
|||
}
|
||||
|
||||
/* Accumulate questions and score */
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
NumTotalQsts.All += Print.NumQsts.All;
|
||||
NumTotalQsts.NotBlank += Print.NumQsts.NotBlank;
|
||||
|
@ -1931,7 +1935,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
|
|||
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result)
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
|
@ -1941,7 +1945,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
|
|||
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result)
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
{
|
||||
if (Print.NumQsts.NotBlank)
|
||||
HTM_Unsigned (Print.NumQsts.NotBlank);
|
||||
|
@ -1956,7 +1960,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
|
|||
HTM_TD_Begin ("class=\"RT %s_%s %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result)
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
{
|
||||
NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank;
|
||||
if (NumQstsBlank)
|
||||
|
@ -1972,7 +1976,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
|
|||
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
HTM_Txt ("/");
|
||||
|
@ -1986,7 +1990,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
|
|||
HTM_TD_Begin ("class=\"RT %s_%s %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
|
||||
(double) Print.NumQsts.All :
|
||||
0.0);
|
||||
|
@ -1998,7 +2002,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
|
|||
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
|
@ -2007,7 +2011,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
|
|||
/* Link to show this test */
|
||||
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result)
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe :
|
||||
ActSeeOneTstResOth);
|
||||
|
@ -2220,7 +2224,7 @@ void TstPrn_ShowOnePrint (void)
|
|||
if (Gbl.Usrs.Me.Role.Logged == Rol_STD)
|
||||
TstCfg_GetConfig (); // To get visibility
|
||||
TstRes_CheckIfICanSeePrintResult (&Print,Gbl.Usrs.Other.UsrDat.UsrCod,&ICanView);
|
||||
if (!ICanView.Result) // I am not allowed to view this test
|
||||
if (ICanView.Result == Usr_I_CAN_NOT) // I am not allowed to view this test
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/***** Get questions and user's answers of the test from database *****/
|
||||
|
@ -2241,7 +2245,7 @@ void TstPrn_ShowOnePrint (void)
|
|||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS))
|
||||
Err_WrongUserExit ();
|
||||
if (!Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
|
||||
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
|
||||
/* User */
|
||||
|
@ -2333,7 +2337,7 @@ void TstPrn_ShowOnePrint (void)
|
|||
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||
The_GetSuffix ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
HTM_STRONG_Begin ();
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
|
@ -2357,7 +2361,7 @@ void TstPrn_ShowOnePrint (void)
|
|||
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||
The_GetSuffix ());
|
||||
if (ICanView.Score)
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
{
|
||||
HTM_STRONG_Begin ();
|
||||
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX);
|
||||
|
@ -2412,13 +2416,14 @@ static void TstRes_CheckIfICanSeePrintResult (const struct TstPrn_Print *Print,
|
|||
case Rol_STD:
|
||||
// Depends on whether the print is sent or not
|
||||
// if the print is not sent ==> I can not view results
|
||||
ICanView->Result = Print->Sent && Usr_ItsMe (UsrCod) == Usr_ME;
|
||||
|
||||
if (ICanView->Result)
|
||||
ICanView->Result = (Print->Sent && Usr_ItsMe (UsrCod) == Usr_ME) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
if (ICanView->Result == Usr_I_CAN)
|
||||
// Depends on 5 visibility icons associated to tests
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ());
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ()) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
else
|
||||
ICanView->Score = false;
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
|
@ -2430,15 +2435,16 @@ static void TstRes_CheckIfICanSeePrintResult (const struct TstPrn_Print *Print,
|
|||
// if teachers are not allowed ==> I can not view results (except if the print is mine)
|
||||
ICanView->Result =
|
||||
ICanView->Score = Print->Sent &&
|
||||
(Print->AllowTeachers || Usr_ItsMe (UsrCod) == Usr_ME);
|
||||
(Print->AllowTeachers || Usr_ItsMe (UsrCod) == Usr_ME) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_SYS_ADM:
|
||||
ICanView->Result =
|
||||
ICanView->Score = true;
|
||||
ICanView->Score = Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
ICanView->Result =
|
||||
ICanView->Score = false;
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -131,7 +131,7 @@ void TstPrn_ShowGrade (double Grade,double MaxGrade);
|
|||
void TstPrn_WriteAnswersExam (struct Usr_Data *UsrDat,
|
||||
const struct TstPrn_PrintedQuestion *PrintedQuestion,
|
||||
struct Qst_Question *Question,
|
||||
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY],
|
||||
const char *ClassTxt,
|
||||
const char *ClassFeedback);
|
||||
|
||||
|
|
|
@ -877,7 +877,7 @@ static void TmlCom_ReqRemComm (struct Tml_Timeline *Timeline)
|
|||
TmlCom_GetCommDataByCod (&Com);
|
||||
|
||||
/***** Do some checks *****/
|
||||
if (!TmlUsr_CheckIfICanRemove (Com.PubCod,Com.UsrCod))
|
||||
if (TmlUsr_CheckIfICanRemove (Com.PubCod,Com.UsrCod) == Usr_I_CAN_NOT)
|
||||
{
|
||||
Med_MediaDestructor (&Com.Content.Media);
|
||||
return;
|
||||
|
|
|
@ -135,7 +135,7 @@ static void TmlFav_FavNote (struct TmlNot_Note *Not)
|
|||
TmlNot_GetNoteDataByCod (Not);
|
||||
|
||||
/***** Do some checks *****/
|
||||
if (!TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod))
|
||||
if (TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod) == Usr_I_CAN_NOT)
|
||||
return;
|
||||
|
||||
/***** Trivial check: Have I faved this note? *****/
|
||||
|
@ -165,7 +165,7 @@ static void TmlFav_UnfNote (struct TmlNot_Note *Not)
|
|||
TmlNot_GetNoteDataByCod (Not);
|
||||
|
||||
/***** Do some checks *****/
|
||||
if (!TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod))
|
||||
if (TmlUsr_CheckIfICanFavSha (Not->NotCod,Not->UsrCod) == Usr_I_CAN_NOT)
|
||||
return;
|
||||
|
||||
/***** Trivial check: Have I faved this note? *****/
|
||||
|
@ -272,7 +272,7 @@ static void TmlFav_FavComm (struct TmlCom_Comment *Com)
|
|||
TmlCom_GetCommDataByCod (Com);
|
||||
|
||||
/***** Do some checks *****/
|
||||
if (!TmlUsr_CheckIfICanFavSha (Com->PubCod,Com->UsrCod))
|
||||
if (TmlUsr_CheckIfICanFavSha (Com->PubCod,Com->UsrCod) == Usr_I_CAN_NOT)
|
||||
{
|
||||
Med_MediaDestructor (&Com->Content.Media);
|
||||
return;
|
||||
|
@ -311,7 +311,7 @@ static void TmlFav_UnfComm (struct TmlCom_Comment *Com)
|
|||
TmlCom_GetCommDataByCod (Com);
|
||||
|
||||
/***** Do some checks *****/
|
||||
if (!TmlUsr_CheckIfICanFavSha (Com->PubCod,Com->UsrCod))
|
||||
if (TmlUsr_CheckIfICanFavSha (Com->PubCod,Com->UsrCod) == Usr_I_CAN_NOT)
|
||||
{
|
||||
Med_MediaDestructor (&Com->Content.Media);
|
||||
return;
|
||||
|
|
|
@ -1010,7 +1010,7 @@ static void TmlNot_ReqRemNote (struct Tml_Timeline *Timeline)
|
|||
TmlNot_GetNoteDataByCod (&Not);
|
||||
|
||||
/***** Do some checks *****/
|
||||
if (!TmlUsr_CheckIfICanRemove (Not.NotCod,Not.UsrCod))
|
||||
if (TmlUsr_CheckIfICanRemove (Not.NotCod,Not.UsrCod) == Usr_I_CAN_NOT)
|
||||
return;
|
||||
|
||||
/***** Show question and button to remove note *****/
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue