Compare commits

...

4 Commits

180 changed files with 2073 additions and 2025 deletions

View File

@ -264,7 +264,7 @@ static void API_CopyListUsers (struct soap *soap,
struct swad__getUsersOutput *getUsersOut);
static void API_CopyUsrData (struct soap *soap,
struct swad__user *Usr,struct Usr_Data *UsrDat,
bool UsrIDIsVisible);
Usr_ICan_t ICanSeeUsrID);
static void API_GetListGrpsInAttendanceEventFromDB (struct soap *soap,
long AttCod,char **ListGroups);
@ -1195,7 +1195,7 @@ int swad__getCourseInfo (struct soap *soap,
int Result = SOAP_OK;
const char *NamesInWSForInfoType[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = "introduction",
[Inf_INFORMATION ] = "introduction",
[Inf_TEACHING_GUIDE] = "guide",
[Inf_LECTURES ] = "lectures",
[Inf_PRACTICALS ] = "practicals",
@ -1743,7 +1743,7 @@ static void API_CopyListUsers (struct soap *soap,
unsigned NumUsrs;
unsigned NumUsr;
struct Usr_Data UsrDat;
bool ICanSeeUsrID;
Usr_ICan_t ICanSeeUsrID;
/***** Initialize result *****/
getUsersOut->numUsers = 0;
@ -2191,7 +2191,7 @@ int swad__sendMyGroups (struct soap *soap,
static void API_CopyUsrData (struct soap *soap,
struct swad__user *Usr,struct Usr_Data *UsrDat,
bool UsrIDIsVisible)
Usr_ICan_t ICanSeeUsrID)
{
char PhotoURL[Cns_MAX_BYTES_WWW + 1];
const char *FirstID;
@ -2206,7 +2206,7 @@ static void API_CopyUsrData (struct soap *soap,
Str_Copy (Usr->userNickname,UsrDat->Nickname,Length);
/* Copy user's first ID */
if (UsrIDIsVisible && UsrDat->IDs.List)
if (ICanSeeUsrID == Usr_I_CAN && UsrDat->IDs.List)
FirstID = UsrDat->IDs.List[0].ID;
else // Hide user's ID
FirstID = "********";
@ -3262,7 +3262,7 @@ int swad__sendMessage (struct soap *soap,
API_CopyUsrData (soap,
&(sendMessageOut->usersArray.__ptr[NumUsr]),
&Gbl.Usrs.Other.UsrDat,
false);
Usr_I_CAN_NOT);
}
}
}
@ -4326,7 +4326,6 @@ int swad__getMatchStatus (struct soap *soap,
int ReturnCode;
struct Gam_Game Game;
struct Mch_Match Match;
bool ICanPlayThisMatchBasedOnGrps;
struct Mch_UsrAnswer UsrAnswer;
/***** Reset game and match *****/
@ -4395,8 +4394,7 @@ int swad__getMatchStatus (struct soap *soap,
"Requester must be a student in the course");
/***** Can I play this match? *****/
ICanPlayThisMatchBasedOnGrps = Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match);
if (!ICanPlayThisMatchBasedOnGrps)
if (Mch_CheckIfICanPlayThisMatchBasedOnGrps (&Match) == Usr_I_CAN_NOT)
return soap_receiver_fault (soap,
"Request forbidden",
"Requester can not join this match");
@ -5263,7 +5261,7 @@ int swad__getLastLocation (struct soap *soap,
The other user does not have to share any course with me,
but at least some course of each one has to share center.
*/
if (Roo_DB_CheckIfICanSeeUsrLocation ((long) userCode))
if (Roo_DB_CheckIfICanSeeUsrLocation ((long) userCode) == Usr_I_CAN)
{
/***** Get list of locations *****/
NumLocs = Roo_DB_GetUsrLastLocation (&mysql_res,(long) userCode);

View File

@ -308,7 +308,7 @@ static bool ID_CheckIfUsrIDIsValidUsingMinDigits (const char *UsrID,unsigned Min
void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor)
{
unsigned NumID;
bool ICanSeeUsrID = ID_ICanSeeOtherUsrIDs (UsrDat);
bool ICanSeeUsrID = (ID_ICanSeeOtherUsrIDs (UsrDat) == Usr_I_CAN);
bool ICanConfirmUsrID = ICanSeeUsrID &&
Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER && // Not me
!Frm_CheckIfInside () && // Not inside another form
@ -343,11 +343,11 @@ void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor)
/***************** Check if I can see another user's IDs *********************/
/*****************************************************************************/
bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat)
Usr_ICan_t ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat)
{
/***** Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true;
return Usr_I_CAN;
/***** Check if I have permission to see another user's IDs *****/
switch (Gbl.Usrs.Me.Role.Logged)
@ -356,12 +356,12 @@ bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat)
case Rol_TCH:
/* Check 1: I can see the IDs of users who do not exist in database */
if (UsrDat->UsrCod <= 0) // User does not exist (when creating a new user)
return true;
return Usr_I_CAN;
/* Check 2: I can see the IDs of confirmed students */
if (UsrDat->Roles.InCurrentCrs == Rol_STD && // A student
UsrDat->Accepted) // who accepted registration
return true;
return Usr_I_CAN;
/* Check 3: I can see the IDs of users with user's data empty */
// This check is made to not view simultaneously:
@ -372,16 +372,16 @@ bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat)
!UsrDat->Surname2[0] && // and who has no surname 2 (nobody filled user's surname 2)
!UsrDat->FrstName[0] && // and who has no first name (nobody filled user's first name)
!UsrDat->Email[0]) // and who has no email (nobody filled user's email)
return true;
return Usr_I_CAN;
return false;
return Usr_I_CAN_NOT;
case Rol_DEG_ADM:
case Rol_CTR_ADM:
case Rol_INS_ADM:
case Rol_SYS_ADM:
return Usr_ICanEditOtherUsr (UsrDat);
return Usr_CheckIfICanEditOtherUsr (UsrDat);
default:
return false;
return Usr_I_CAN_NOT;
}
}
@ -393,7 +393,7 @@ static void ID_PutLinkToConfirmID (struct Usr_Data *UsrDat,unsigned NumID,
const char *Anchor)
{
extern const char *Txt_Confirm_ID;
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
static Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_UNK ] = ActCnfID_Oth,
[Rol_GST ] = ActCnfID_Oth,
@ -691,7 +691,7 @@ void ID_RemoveOtherUsrID (void)
/***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{
/***** Remove user's ID *****/
ID_RemoveUsrID (&Gbl.Usrs.Other.UsrDat,
@ -721,7 +721,7 @@ static void ID_RemoveUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOt
char UsrID[ID_MAX_BYTES_USR_ID + 1];
bool ICanRemove;
if (Usr_ICanEditOtherUsr (UsrDat))
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
{
/***** Get user's ID from form *****/
Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID);
@ -787,7 +787,7 @@ void ID_ChangeOtherUsrID (void)
/***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{
/***** Change user's ID *****/
ID_ChangeUsrID (&Gbl.Usrs.Other.UsrDat,
@ -822,7 +822,7 @@ static void ID_ChangeUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOt
bool AlreadyExists;
unsigned NumIDFound = 0; // Initialized to avoid warning
if (Usr_ICanEditOtherUsr (UsrDat))
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
{
/***** Get new user's ID from form *****/
Par_GetParText ("NewID",NewID,ID_MAX_BYTES_USR_ID);
@ -911,7 +911,7 @@ void ID_ConfirmOtherUsrID (void)
if (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs == Rol_STD)
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
if (ID_ICanSeeOtherUsrIDs (&Gbl.Usrs.Other.UsrDat))
if (ID_ICanSeeOtherUsrIDs (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
ICanConfirm = true;
}

View File

@ -70,7 +70,7 @@ bool ID_CheckIfUsrIDIsValid (const char *UsrID);
bool ID_CheckIfUsrIDSeemsAValidID (const char *UsrID);
void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor);
bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat);
Usr_ICan_t ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat);
void ID_ShowFormChangeMyID (bool IShouldFillInID);
void ID_ShowFormChangeOtherUsrID (void);

View File

@ -112,7 +112,7 @@ void MFU_GetMFUActions (struct MFU_ListMFUActions *ListMFUActions,unsigned MaxAc
ActCod = DB_GetNextCode (mysql_res);
if ((Action = Act_GetActionFromActCod (ActCod)) != ActUnk)
if (Act_GetIndexInMenu (Action) >= 0) // MFU actions must be only actions shown on menu (database could contain wrong action numbers)
if (Act_CheckIfIHavePermissionToExecuteAction (Action))
if (Act_CheckIfICanExecuteAction (Action) == Usr_I_CAN)
ListMFUActions->Actions[ListMFUActions->NumActions++] = Action;
}
@ -148,7 +148,7 @@ Act_Action_t MFU_GetMyLastActionInCurrentTab (void)
if (ActCod >= 0 && ActCod <= ActLst_MAX_ACTION_COD)
if ((Action = Act_GetActionFromActCod (ActCod)) >= 0)
if (Act_GetTab (Action) == Gbl.Action.Tab)
if (Act_CheckIfIHavePermissionToExecuteAction (Action))
if (Act_CheckIfICanExecuteAction (Action) == Usr_I_CAN)
{
MoreRecentActionInCurrentTab = Action;
break;

View File

@ -146,7 +146,7 @@ void QR_ImageQRCode (const char *QRString)
void QR_LinkTo (unsigned Size,ParCod_Param_t ParCode,long Cod)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_Shortcut;
char *URL;

View File

@ -488,7 +488,7 @@ void Acc_ShowFormChgOtherUsrAccount (void)
/***** Get user whose account must be changed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{
/***** Get user's nickname and email address
It's necessary because nickname or email could be just updated *****/
@ -530,7 +530,7 @@ void Acc_ShowFormChgOtherUsrAccount (void)
void Acc_PutLinkToRemoveMyAccount (__attribute__((unused)) void *Args)
{
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Me.UsrDat.UsrCod))
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Me.UsrDat.UsrCod) == Usr_I_CAN)
Lay_PutContextualLinkOnlyIcon (ActReqRemMyAcc,NULL,
Acc_PutParsToRemoveMyAccount,Gbl.Usrs.Me.UsrDat.EnUsrCod,
"trash.svg",Ico_RED);
@ -771,7 +771,7 @@ void Acc_GetUsrCodAndRemUsrGbl (void)
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod))
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_I_CAN)
Acc_ReqRemAccountOrRemAccount (Acc_REMOVE_USR);
else
Error = true;
@ -814,7 +814,7 @@ void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove)
/******** Check if I can eliminate completely another user's account *********/
/*****************************************************************************/
bool Acc_CheckIfICanEliminateAccount (long UsrCod)
Usr_ICan_t Acc_CheckIfICanEliminateAccount (long UsrCod)
{
Usr_MeOrOther_t MeOrOther = Usr_ItsMe (UsrCod);
@ -823,10 +823,14 @@ bool Acc_CheckIfICanEliminateAccount (long UsrCod)
switch (MeOrOther)
{
case Usr_ME:
return (Gbl.Usrs.Me.Role.Available & (1 << Rol_SYS_ADM)) == 0; // I can not be system admin
// A system admin can not eliminate him/herself
return (Gbl.Usrs.Me.Role.Available & (1 << Rol_SYS_ADM)) == 0 ? Usr_I_CAN :
Usr_I_CAN_NOT;
case Usr_OTHER:
default:
return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; // I am logged as system admin
// Only a system admin can eliminate other's account
return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ? Usr_I_CAN :
Usr_I_CAN_NOT;
}
}
@ -1076,7 +1080,7 @@ static void Acc_RemoveUsrBriefcase (struct Usr_Data *UsrDat)
void Acc_PutIconToChangeUsrAccount (struct Usr_Data *UsrDat)
{
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
static Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_UNK ] = ActFrmAccOth,
[Rol_GST ] = ActFrmAccOth,
@ -1100,7 +1104,7 @@ void Acc_PutIconToChangeUsrAccount (struct Usr_Data *UsrDat)
break;
case Usr_OTHER:
default:
if (Usr_ICanEditOtherUsr (UsrDat))
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL,
Rec_PutParUsrCodEncrypted,NULL,
"at.svg",Ico_BLACK);

View File

@ -62,7 +62,7 @@ void Acc_AfterCreationNewAccount (void);
void Acc_GetUsrCodAndRemUsrGbl (void);
void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove);
bool Acc_CheckIfICanEliminateAccount (long UsrCod);
Usr_ICan_t Acc_CheckIfICanEliminateAccount (long UsrCod);
void Acc_AskIfRemoveMyAccount (void);
void Acc_RemoveMyAccount (void);
void Acc_CompletelyEliminateAccount (struct Usr_Data *UsrDat,

View File

@ -99,12 +99,12 @@ Act_Action_t Act_GetSuperAction (Act_Action_t Action)
/************* Check if I have permission to execute an action ***************/
/*****************************************************************************/
bool Act_CheckIfIHavePermissionToExecuteAction (Act_Action_t Action)
Usr_ICan_t Act_CheckIfICanExecuteAction (Act_Action_t Action)
{
unsigned Permission;
if ((unsigned) Action >= ActLst_NUM_ACTIONS)
return false;
return Usr_I_CAN_NOT;
switch (Gbl.Hierarchy.Level)
{
@ -128,10 +128,11 @@ bool Act_CheckIfIHavePermissionToExecuteAction (Act_Action_t Action)
ActLst_Actions[Action].PermissionCrsIfIDontBelong;
break;
default:
return false;
return Usr_I_CAN_NOT;
}
return ((Permission & (1 << Gbl.Usrs.Me.Role.Logged)) != 0);
return ((Permission & (1 << Gbl.Usrs.Me.Role.Logged)) != 0) ? Usr_I_CAN :
Usr_I_CAN_NOT;
}
/*****************************************************************************/
@ -240,7 +241,7 @@ const char *Act_GetActionText (Act_Action_t Action)
void Act_AdjustActionWhenNoUsrLogged (void)
{
static const Act_Action_t Actions[Hie_NUM_LEVELS] =
static Act_Action_t Actions[Hie_NUM_LEVELS] =
{
[Hie_UNK] = ActUnk, // Unknown
[Hie_SYS] = ActFrmLogIn, // System

View File

@ -35,6 +35,7 @@
#include "swad_language.h"
#include "swad_string.h"
#include "swad_tab.h"
#include "swad_user_type.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
@ -89,6 +90,13 @@ struct Act_Actions
void (*FunctionPosteriori) ();
};
struct Act_ActionFunc
{
Act_Action_t NextAction;
void (*FuncPars) (void *Args);
void *Args;
};
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
@ -98,7 +106,7 @@ long Act_GetActCod (Act_Action_t Action);
signed int Act_GetIndexInMenu (Act_Action_t Action);
Tab_Tab_t Act_GetTab (Act_Action_t Action);
Act_Action_t Act_GetSuperAction (Act_Action_t Action);
bool Act_CheckIfIHavePermissionToExecuteAction (Act_Action_t Action);
Usr_ICan_t Act_CheckIfICanExecuteAction (Act_Action_t Action);
Act_Content_t Act_GetContentType (Act_Action_t Action);
Act_BrowserTab_t Act_GetBrowserTab (Act_Action_t Action);
void (*Act_GetFunctionPriori (Act_Action_t Action)) (void);

View File

@ -208,7 +208,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActMrkNtfSee ] = {1146,-1,TabUnk,ActSeeNtf ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ntf_MarkAllNotifAsSeen },
[ActSeeMai ] = { 855,-1,TabUnk,ActSeeNtf ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Mai_SeeMailDomains },
[ActEdiMai ] = { 856,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,NULL ,Mai_EditMailDomains },
[ActNewMai ] = { 857,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Mai_ReceiveFormNewMailDomain,Mai_ContEditAfterChgMai },
[ActNewMai ] = { 857,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Mai_ReceiveNewMailDomain ,Mai_ContEditAfterChgMai },
[ActRemMai ] = { 860,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Mai_RemoveMailDomain ,Mai_ContEditAfterChgMai },
[ActRenMaiSho ] = { 858,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Mai_RenameMailDomainShort ,Mai_ContEditAfterChgMai },
[ActRenMaiFul ] = { 859,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Mai_RenameMailDomainFull ,Mai_ContEditAfterChgMai },
@ -221,7 +221,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
// Countries
[ActSeeCty ] = { 862, 1,TabSys,ActSeeCty , 0, 0, 0, 0, 0, 0,0x3C7,Act_CONT_NORM,Act_1ST_TAB,Cty_ListCountries1 ,Cty_ListCountries2 },
[ActEdiCty ] = { 863,-1,TabUnk,ActSeeCty , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,NULL ,Cty_EditCountries },
[ActNewCty ] = { 864,-1,TabUnk,ActSeeCty , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Cty_ReceiveFormNewCountry ,Cty_ContEditAfterChgCty },
[ActNewCty ] = { 864,-1,TabUnk,ActSeeCty , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Cty_ReceiveNewCountry ,Cty_ContEditAfterChgCty },
[ActRemCty ] = { 893,-1,TabUnk,ActSeeCty , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Cty_RemoveCountry ,Cty_ContEditAfterChgCty },
[ActRenCty ] = { 866,-1,TabUnk,ActSeeCty , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Cty_RenameCountry ,Cty_ContEditAfterChgCty },
[ActChgCtyWWW ] = {1157,-1,TabUnk,ActSeeCty , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Cty_ChangeCtyWWW ,Cty_ContEditAfterChgCty },
@ -230,16 +230,16 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActSeePen ] = {1060, 2,TabSys,ActSeePen , 0, 0, 0, 0, 0, 0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Hie_SeePending },
// Links
[ActSeeLnk ] = { 748, 3,TabSys,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x3C7,Act_CONT_NORM,Act_1ST_TAB,NULL ,Lnk_SeeLinks },
[ActSeeLnk ] = { 748, 3,TabSys,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x3C7,Act_CONT_NORM,Act_1ST_TAB,NULL ,Lnk_SeeLinks },
[ActEdiLnk ] = { 749,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,NULL ,Lnk_EditLinks },
[ActNewLnk ] = { 750,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Lnk_ReceiveFormNewLink ,Lnk_ContEditAfterChgLnk },
[ActNewLnk ] = { 750,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Lnk_ReceiveNewLink ,Lnk_ContEditAfterChgLnk },
[ActRemLnk ] = { 897,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Lnk_RemoveLink ,Lnk_ContEditAfterChgLnk },
[ActRenLnkSho ] = { 753,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Lnk_RenameLinkShort ,Lnk_ContEditAfterChgLnk },
[ActRenLnkFul ] = { 751,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Lnk_RenameLinkFull ,Lnk_ContEditAfterChgLnk },
[ActChgLnkWWW ] = { 752,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Lnk_ChangeLinkWWW ,Lnk_ContEditAfterChgLnk },
[ActSeeBan ] = {1137,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x3FF,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ban_ShowAllBanners },
[ActEdiBan ] = {1138,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ban_EditBanners },
[ActNewBan ] = {1139,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Ban_ReceiveFormNewBanner ,Ban_ContEditAfterChgBan },
[ActNewBan ] = {1139,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Ban_ReceiveNewBanner ,Ban_ContEditAfterChgBan },
[ActRemBan ] = {1140,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Ban_RemoveBanner ,Ban_ContEditAfterChgBan },
[ActUnhBan ] = {1212,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Ban_UnhideBanner ,Ban_ContEditAfterChgBan },
[ActHidBan ] = {1213,-1,TabUnk,ActSeeLnk , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Ban_HideBanner ,Ban_ContEditAfterChgBan },
@ -252,7 +252,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
// Plugins
[ActSeePlg ] = { 777, 4,TabSys,ActSeePlg , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,NULL ,Plg_ListPlugins },
[ActEdiPlg ] = { 778,-1,TabUnk,ActSeePlg , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,NULL ,Plg_EditPlugins },
[ActNewPlg ] = { 779,-1,TabUnk,ActSeePlg , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Plg_ReceiveFormNewPlg ,Plg_ContEditAfterChgPlg },
[ActNewPlg ] = { 779,-1,TabUnk,ActSeePlg , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Plg_ReceiveNewPlg ,Plg_ContEditAfterChgPlg },
[ActRemPlg ] = { 889,-1,TabUnk,ActSeePlg , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Plg_RemovePlugin ,Plg_ContEditAfterChgPlg },
[ActRenPlg ] = { 782,-1,TabUnk,ActSeePlg , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Plg_RenamePlugin ,Plg_ContEditAfterChgPlg },
[ActChgPlgDes ] = { 888,-1,TabUnk,ActSeePlg , 0, 0, 0, 0, 0, 0,0x200,Act_CONT_NORM,Act_1ST_TAB,Plg_ChangePlgDescription ,Plg_ContEditAfterChgPlg },
@ -276,8 +276,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
// Institutions
[ActSeeIns ] = { 696, 1,TabCty,ActSeeIns , 0, 0, 0, 0, 0,0x3C7, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ins_ShowInssOfCurrentCty },
[ActEdiIns ] = { 697,-1,TabUnk,ActSeeIns , 0, 0, 0, 0, 0,0x3C6, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ins_EditInstitutions },
[ActReqIns ] = {1210,-1,TabUnk,ActSeeIns , 0, 0, 0, 0, 0,0x3C6, 0,Act_CONT_NORM,Act_1ST_TAB,Ins_ReceiveFormReqIns ,Ins_ContEditAfterChgIns },
[ActNewIns ] = { 698,-1,TabUnk,ActSeeIns , 0, 0, 0, 0, 0,0x200, 0,Act_CONT_NORM,Act_1ST_TAB,Ins_ReceiveFormNewIns ,Ins_ContEditAfterChgIns },
[ActReqIns ] = {1210,-1,TabUnk,ActSeeIns , 0, 0, 0, 0, 0,0x3C6, 0,Act_CONT_NORM,Act_1ST_TAB,Ins_ReceiveReqIns ,Ins_ContEditAfterChgIns },
[ActNewIns ] = { 698,-1,TabUnk,ActSeeIns , 0, 0, 0, 0, 0,0x200, 0,Act_CONT_NORM,Act_1ST_TAB,Ins_ReceiveNewIns ,Ins_ContEditAfterChgIns },
[ActRemIns ] = { 759,-1,TabUnk,ActSeeIns , 0, 0, 0, 0, 0,0x3C6, 0,Act_CONT_NORM,Act_1ST_TAB,Ins_RemoveInstitution ,Ins_ContEditAfterChgIns },
[ActRenInsSho ] = { 702,-1,TabUnk,ActSeeIns , 0, 0, 0, 0, 0,0x3C6, 0,Act_CONT_NORM,Act_1ST_TAB,Ins_RenameInsShort ,Ins_ContEditAfterChgIns },
[ActRenInsFul ] = { 701,-1,TabUnk,ActSeeIns , 0, 0, 0, 0, 0,0x3C6, 0,Act_CONT_NORM,Act_1ST_TAB,Ins_RenameInsFull ,Ins_ContEditAfterChgIns },
@ -299,8 +299,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
// Centers
[ActSeeCtr ] = { 676, 1,TabIns,ActSeeCtr , 0, 0, 0, 0,0x3C7, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ctr_ShowCtrsOfCurrentIns },
[ActEdiCtr ] = { 681,-1,TabUnk,ActSeeCtr , 0, 0, 0, 0,0x3C6, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ctr_EditCenters },
[ActReqCtr ] = {1208,-1,TabUnk,ActSeeCtr , 0, 0, 0, 0,0x3C6, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Ctr_ReceiveFormReqCtr ,Ctr_ContEditAfterChgCtr },
[ActNewCtr ] = { 685,-1,TabUnk,ActSeeCtr , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Ctr_ReceiveFormNewCtr ,Ctr_ContEditAfterChgCtr },
[ActReqCtr ] = {1208,-1,TabUnk,ActSeeCtr , 0, 0, 0, 0,0x3C6, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Ctr_ReceiveReqCtr ,Ctr_ContEditAfterChgCtr },
[ActNewCtr ] = { 685,-1,TabUnk,ActSeeCtr , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Ctr_ReceiveNewCtr ,Ctr_ContEditAfterChgCtr },
[ActRemCtr ] = { 686,-1,TabUnk,ActSeeCtr , 0, 0, 0, 0,0x3C6, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Ctr_RemoveCenter ,Ctr_ContEditAfterChgCtr },
[ActChgCtrPlc ] = { 706,-1,TabUnk,ActSeeCtr , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Ctr_ChangeCtrPlc ,Ctr_ContEditAfterChgCtr },
[ActRenCtrSho ] = { 682,-1,TabUnk,ActSeeCtr , 0, 0, 0, 0,0x3C6, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Ctr_RenameCenterShort ,Ctr_ContEditAfterChgCtr },
@ -311,7 +311,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
// Places
[ActSeePlc ] = { 703, 2,TabIns,ActSeePlc , 0, 0, 0, 0,0x3C7, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Plc_SeeAllPlaces },
[ActEdiPlc ] = { 704,-1,TabUnk,ActSeePlc , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Plc_EditPlaces },
[ActNewPlc ] = { 705,-1,TabUnk,ActSeePlc , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Plc_ReceiveFormNewPlace ,Plc_ContEditAfterChgPlc },
[ActNewPlc ] = { 705,-1,TabUnk,ActSeePlc , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Plc_ReceiveNewPlace ,Plc_ContEditAfterChgPlc },
[ActRemPlc ] = { 776,-1,TabUnk,ActSeePlc , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Plc_RemovePlace ,Plc_ContEditAfterChgPlc },
[ActRenPlcSho ] = { 894,-1,TabUnk,ActSeePlc , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Plc_RenamePlaceShort ,Plc_ContEditAfterChgPlc },
[ActRenPlcFul ] = { 895,-1,TabUnk,ActSeePlc , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Plc_RenamePlaceFull ,Plc_ContEditAfterChgPlc },
@ -319,7 +319,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
// Departments
[ActSeeDpt ] = { 675, 3,TabIns,ActSeeDpt , 0, 0, 0, 0,0x3C7, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Dpt_SeeAllDepts },
[ActEdiDpt ] = { 677,-1,TabUnk,ActSeeDpt , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Dpt_EditDepartments },
[ActNewDpt ] = { 687,-1,TabUnk,ActSeeDpt , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dpt_ReceiveFormNewDpt ,Dpt_ContEditAfterChgDpt },
[ActNewDpt ] = { 687,-1,TabUnk,ActSeeDpt , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dpt_ReceiveNewDpt ,Dpt_ContEditAfterChgDpt },
[ActRemDpt ] = { 690,-1,TabUnk,ActSeeDpt , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dpt_RemoveDepartment ,Dpt_ContEditAfterChgDpt },
[ActChgDptIns ] = { 721,-1,TabUnk,ActSeeDpt , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dpt_ChangeDepartIns ,Dpt_ContEditAfterChgDpt },
[ActRenDptSho ] = { 688,-1,TabUnk,ActSeeDpt , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dpt_RenameDepartShort ,Dpt_ContEditAfterChgDpt },
@ -329,7 +329,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
// Holidays
[ActSeeHld ] = { 707, 4,TabIns,ActSeeHld , 0, 0, 0, 0,0x3C7, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Hld_SeeAllHolidays },
[ActEdiHld ] = { 713,-1,TabUnk,ActSeeHld , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Hld_EditHolidays },
[ActNewHld ] = { 714,-1,TabUnk,ActSeeHld , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Hld_ReceiveFormNewHoliday ,Hld_ContEditAfterChgHld },
[ActNewHld ] = { 714,-1,TabUnk,ActSeeHld , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Hld_ReceiveNewHoliday ,Hld_ContEditAfterChgHld },
[ActRemHld ] = { 716,-1,TabUnk,ActSeeHld , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Hld_RemoveHoliday ,Hld_ContEditAfterChgHld },
[ActChgHldPlc ] = { 896,-1,TabUnk,ActSeeHld , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Hld_ChangeHolidayPlace ,Hld_ContEditAfterChgHld },
[ActChgHldTyp ] = { 715,-1,TabUnk,ActSeeHld , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Hld_ChangeHolidayType ,Hld_ContEditAfterChgHld },
@ -359,8 +359,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
// Degrees
[ActSeeDeg ] = {1011, 1,TabCtr,ActSeeDeg , 0, 0, 0,0x3C7, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Deg_ShowDegsOfCurrentCtr },
[ActEdiDeg ] = { 536,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Deg_EditDegrees },
[ActReqDeg ] = {1206,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Deg_ReceiveFormReqDeg ,Deg_ContEditAfterChgDeg },
[ActNewDeg ] = { 540,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Deg_ReceiveFormNewDeg ,Deg_ContEditAfterChgDeg },
[ActReqDeg ] = {1206,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Deg_ReceiveReqDeg ,Deg_ContEditAfterChgDeg },
[ActNewDeg ] = { 540,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Deg_ReceiveNewDeg ,Deg_ContEditAfterChgDeg },
[ActRemDeg ] = { 542,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Deg_RemoveDegree ,Deg_ContEditAfterChgDeg },
[ActRenDegSho ] = { 546,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Deg_RenameDegreeShort ,Deg_ContEditAfterChgDeg },
[ActRenDegFul ] = { 547,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Deg_RenameDegreeFull ,Deg_ContEditAfterChgDeg },
@ -369,14 +369,14 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActChgDegSta ] = {1207,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Deg_ChangeDegStatus ,Deg_ContEditAfterChgDeg },
[ActSeeDegTyp ] = {1013,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x3C7, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,DegTyp_SeeDegreeTypesInDegTab },
[ActEdiDegTyp ] = { 573,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x200, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,DegTyp_GetAndEditDegreeTypes },
[ActNewDegTyp ] = { 537,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x200, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,DegTyp_ReceiveFormNewDegreeType,DegTyp_ContEditAfterChgDegTyp},
[ActNewDegTyp ] = { 537,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x200, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,DegTyp_ReceiveNewDegreeType,DegTyp_ContEditAfterChgDegTyp },
[ActRemDegTyp ] = { 545,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x200, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,DegTyp_RemoveDegreeType ,DegTyp_ContEditAfterChgDegTyp },
[ActRenDegTyp ] = { 538,-1,TabUnk,ActSeeDeg , 0, 0, 0,0x200, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,DegTyp_RenameDegreeType ,DegTyp_ContEditAfterChgDegTyp },
// Buildings
[ActSeeBld ] = {1838, 2,TabCtr,ActSeeBld , 0, 0, 0,0x3C7, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Bld_SeeBuildings },
[ActEdiBld ] = {1839,-1,TabUnk,ActSeeBld , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Bld_EditBuildings },
[ActNewBld ] = {1840,-1,TabUnk,ActSeeBld , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Bld_ReceiveFormNewBuilding ,Bld_ContEditAfterChgBuilding },
[ActNewBld ] = {1840,-1,TabUnk,ActSeeBld , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Bld_ReceiveNewBuilding ,Bld_ContEditAfterChgBuilding },
[ActRemBld ] = {1841,-1,TabUnk,ActSeeBld , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Bld_RemoveBuilding ,Bld_ContEditAfterChgBuilding },
[ActRenBldSho ] = {1842,-1,TabUnk,ActSeeBld , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Bld_RenameBuildingShort ,Bld_ContEditAfterChgBuilding },
[ActRenBldFul ] = {1843,-1,TabUnk,ActSeeBld , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Bld_RenameBuildingFull ,Bld_ContEditAfterChgBuilding },
@ -385,7 +385,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
// Rooms
[ActSeeRoo ] = {1744, 2,TabCtr,ActSeeRoo , 0, 0, 0,0x3C7, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Roo_SeeRooms },
[ActEdiRoo ] = {1745,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Roo_EditRooms },
[ActNewRoo ] = {1746,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Roo_ReceiveFormNewRoom ,Roo_ContEditAfterChgRoom },
[ActNewRoo ] = {1746,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Roo_ReceiveNewRoom ,Roo_ContEditAfterChgRoom },
[ActRemRoo ] = {1747,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Roo_RemoveRoom ,Roo_ContEditAfterChgRoom },
[ActChgRooBld ] = {1845,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Roo_ChangeBuilding ,Roo_ContEditAfterChgRoom },
[ActChgRooFlo ] = {1846,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Roo_ChangeFloor ,Roo_ContEditAfterChgRoom },
@ -410,8 +410,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
// Courses
[ActSeeCrs ] = {1009, 1,TabDeg,ActSeeCrs , 0, 0,0x3C7, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Crs_ShowCrssOfCurrentDeg },
[ActEdiCrs ] = { 555,-1,TabUnk,ActSeeCrs , 0, 0,0x3C6, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Crs_EditCourses },
[ActReqCrs ] = {1053,-1,TabUnk,ActSeeCrs , 0, 0,0x3C6, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Crs_ReceiveFormReqCrs ,Crs_ContEditAfterChgCrs },
[ActNewCrs ] = { 556,-1,TabUnk,ActSeeCrs , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Crs_ReceiveFormNewCrs ,Crs_ContEditAfterChgCrs },
[ActReqCrs ] = {1053,-1,TabUnk,ActSeeCrs , 0, 0,0x3C6, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Crs_ReceiveReqCrs ,Crs_ContEditAfterChgCrs },
[ActNewCrs ] = { 556,-1,TabUnk,ActSeeCrs , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Crs_ReceiveNewCrs ,Crs_ContEditAfterChgCrs },
[ActRemCrs ] = { 560,-1,TabUnk,ActSeeCrs , 0, 0,0x3C6, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Crs_RemoveCourse ,Crs_ContEditAfterChgCrs },
[ActChgInsCrsCod ] = {1025,-1,TabUnk,ActSeeCrs , 0, 0,0x3C6, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Crs_ChangeInsCrsCod ,Crs_ContEditAfterChgCrs },
[ActChgCrsYea ] = { 561,-1,TabUnk,ActSeeCrs , 0, 0,0x3C6, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Crs_ChangeCrsYear ,Crs_ContEditAfterChgCrs },
@ -446,8 +446,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActSeePrgItm ] = {1927,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ViewItemAfterEdit },
[ActFrmChgPrgItm ] = {1823,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ReqChangeItem },
[ActFrmNewPrgItm ] = {1822,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ReqCreateItem },
[ActChgPrgItm ] = {1826,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ReceiveFormChgItem },
[ActNewPrgItm ] = {1825,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ReceiveFormNewItem },
[ActChgPrgItm ] = {1826,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ReceiveChgItem },
[ActNewPrgItm ] = {1825,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ReceiveNewItem },
[ActReqRemPrgItm ] = {1827,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ReqRemItem },
[ActRemPrgItm ] = {1828,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_RemoveItem },
[ActHidPrgItm ] = {1829,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_HideItem },
@ -457,8 +457,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActLftPrgItm ] = {1834,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_MoveLeftItem },
[ActRgtPrgItm ] = {1833,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_MoveRightItem },
[ActExpSeePrgItm ] = {1944,-1,TabUnk,ActSeePrg ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ExpandItem },
[ActExpEdiPrgItm ] = {1946,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ExpandItem },
[ActConSeePrgItm ] = {1945,-1,TabUnk,ActSeePrg ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ContractItem },
[ActExpEdiPrgItm ] = {1946,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ExpandItem },
[ActConEdiPrgItm ] = {1947,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prg_ContractItem },
[ActSeeRscCli_InPrg ] = {1970,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,PrgRsc_ViewResourceClipboard },
[ActRemRscCli_InPrg ] = {1971,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,PrgRsc_RemoveResourceClipboard },
@ -580,8 +580,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActEdiOneAsg ] = { 814,-1,TabUnk,ActSeeAllAsg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Asg_ReqCreatOrEditAsg },
[ActSeeOneAsg ] = {1942,-1,TabUnk,ActSeeAllAsg ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Asg_SeeOneAssignment },
[ActPrnOneAsg ] = {1637,-1,TabUnk,ActSeeAllAsg ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_NEW_TAB,NULL ,Asg_PrintOneAssignment },
[ActNewAsg ] = { 803,-1,TabUnk,ActSeeAllAsg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Asg_ReceiveFormAssignment },
[ActChgAsg ] = { 815,-1,TabUnk,ActSeeAllAsg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Asg_ReceiveFormAssignment },
[ActNewAsg ] = { 803,-1,TabUnk,ActSeeAllAsg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Asg_ReceiveAssignment },
[ActChgAsg ] = { 815,-1,TabUnk,ActSeeAllAsg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Asg_ReceiveAssignment },
[ActReqRemAsg ] = { 813,-1,TabUnk,ActSeeAllAsg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Asg_ReqRemAssignment },
[ActRemAsg ] = { 806,-1,TabUnk,ActSeeAllAsg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Asg_RemoveAssignment },
[ActHidAsg ] = { 964,-1,TabUnk,ActSeeAllAsg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Asg_HideAssignment },
@ -603,8 +603,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActEdiOnePrj ] = {1676,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prj_ReqEditPrj },
[ActSeeOnePrj ] = {1949,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_ShowFileBrowserOrWorks },
[ActPrnOnePrj ] = {1677,-1,TabUnk,ActSeeAllPrj ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_NEW_TAB,NULL ,Prj_PrintOneProject },
[ActNewPrj ] = {1678,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prj_ReceiveFormProject },
[ActChgPrj ] = {1679,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prj_ReceiveFormProject },
[ActNewPrj ] = {1678,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prj_ReceiveProject },
[ActChgPrj ] = {1679,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prj_ReceiveProject },
[ActReqRemPrj ] = {1680,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prj_ReqRemProject },
[ActRemPrj ] = {1681,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prj_RemoveProject },
[ActHidPrj ] = {1682,-1,TabUnk,ActSeeAllPrj ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Prj_HideProject },
@ -637,7 +637,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActCreFolDocPrj ] = {1705,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecFolderFileBrowser },
[ActCreLnkDocPrj ] = {1706,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecLinkFileBrowser },
[ActRenFolDocPrj ] = {1707,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RenFolderFileBrowser },
[ActRcvFilDocPrjDZ ] = {1708,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ,NULL },
[ActRcvFilDocPrjDZ ] = {1708,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ ,NULL },
[ActRcvFilDocPrjCla ] = {1709,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_1ST_TAB,NULL ,Brw_RcvFileInFileBrwClassic },
[ActExpDocPrj ] = {1710,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ExpandFileTree ,NULL },
[ActConDocPrj ] = {1711,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ContractFileTree ,NULL },
@ -656,7 +656,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActCreFolAssPrj ] = {1724,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecFolderFileBrowser },
[ActCreLnkAssPrj ] = {1725,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecLinkFileBrowser },
[ActRenFolAssPrj ] = {1726,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RenFolderFileBrowser },
[ActRcvFilAssPrjDZ ] = {1727,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ,NULL },
[ActRcvFilAssPrjDZ ] = {1727,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ ,NULL },
[ActRcvFilAssPrjCla ] = {1728,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_1ST_TAB,NULL ,Brw_RcvFileInFileBrwClassic },
[ActExpAssPrj ] = {1729,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ExpandFileTree ,NULL },
[ActConAssPrj ] = {1730,-1,TabUnk,ActSeeAllPrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ContractFileTree ,NULL },
@ -679,7 +679,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActReqLnkCfe ] = {1934,-1,TabUnk,ActSeeAllCfe ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,CfeRsc_GetLinkToCallForExam },
// Questions
[ActEdiTstQst ] = { 104, 3,TabAss,ActEdiTstQst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetIniEndDatesToPastAndNow,Qst_ReqEditQsts },
[ActEdiTstQst ] = { 104, 3,TabAss,ActEdiTstQst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetDatesToPastAndNow ,Qst_ReqEditQsts },
[ActEdiOneTstQst ] = { 105,-1,TabUnk,ActEdiTstQst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Qst_ShowFormEditOneQst },
[ActReqImpTstQst ] = {1007,-1,TabUnk,ActEdiTstQst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,QstImp_ShowFormImpQstsFromXML },
[ActImpTstQst ] = {1008,-1,TabUnk,ActEdiTstQst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_DATA,Act_1ST_TAB,NULL ,QstImp_ImpQstsFromXML },
@ -703,10 +703,10 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActAssTst ] = { 98,-1,TabUnk,ActReqTst ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Tst_AssessTest },
[ActCfgTst ] = { 451,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,TstCfg_CheckAndShowFormConfig },
[ActRcvCfgTst ] = { 454,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,TstCfg_ReceiveConfigTst },
[ActReqSeeMyTstRes ] = {1083,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetIniEndDatesToPastAndNow,TstPrn_SelDatesToSeeMyPrints},
[ActReqSeeMyTstRes ] = {1083,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetDatesToPastAndNow ,TstPrn_SelDatesToSeeMyPrints },
[ActSeeMyTstResCrs ] = {1084,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,TstPrn_ShowMyPrints },
[ActSeeOneTstResMe ] = {1085,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,TstPrn_ShowOnePrint },
[ActReqSeeUsrTstRes ] = {1080,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetIniEndDatesToPastAndNow,TstPrn_SelUsrsToViewUsrsPrints},
[ActReqSeeUsrTstRes ] = {1080,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetDatesToPastAndNow ,TstPrn_SelUsrsToViewUsrsPrints},
[ActSeeUsrTstResCrs ] = {1081,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,TstPrn_GetUsrsAndShowPrints },
[ActSeeOneTstResOth ] = {1082,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,TstPrn_ShowOnePrint },
@ -715,21 +715,21 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActSeeOneExa ] = {1849,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_SeeOneExam },
[ActFrmNewExa ] = {1877,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_ReqCreatOrEditExam },
[ActEdiOneExa ] = {1878,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_ReqCreatOrEditExam },
[ActNewExa ] = {1879,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_ReceiveFormExam },
[ActChgExa ] = {1880,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_ReceiveFormExam },
[ActNewExa ] = {1879,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_ReceiveExam },
[ActChgExa ] = {1880,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_ReceiveExam },
[ActReqRemExa ] = {1881,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_AskRemExam },
[ActRemExa ] = {1882,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_RemoveExam },
[ActHidExa ] = {1883,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_HideExam },
[ActUnhExa ] = {1884,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Exa_UnhideExam },
[ActReqLnkExa ] = {1936,-1,TabUnk,ActSeeAllExa ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaRsc_GetLinkToExam },
[ActNewExaSet ] = {1898,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_ReceiveFormSet },
[ActNewExaSet ] = {1898,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_ReceiveSet },
[ActReqRemExaSet ] = {1893,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_ReqRemSet },
[ActRemExaSet ] = {1894,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_RemoveSet },
[ActUp_ExaSet ] = {1895,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_MoveUpSet },
[ActDwnExaSet ] = {1896,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_MoveDownSet },
[ActChgTitExaSet ] = {1897,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_ChangeSetTitle },
[ActChgNumQstExaSet ] = {1899,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_ChangeNumQstsToExam },
[ActReqAddQstExaSet ] = {1885,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetIniEndDatesToPastAndNow,ExaSet_ReqSelectQstsToAddToSet},
[ActReqAddQstExaSet ] = {1885,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetDatesToPastAndNow ,ExaSet_ReqSelectQstsToAddToSet },
[ActLstTstQstForSet ] = {1886,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_ListQstsToAddToSet },
[ActAddQstToExa ] = {1887,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_AddQstsToSet },
[ActReqRemSetQst ] = {1888,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_ReqRemQstFromSet },
@ -738,8 +738,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActInvSetQst ] = {1910,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSet_InvalidateQst },
[ActReqNewExaSes ] = {1852,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSes_ReqCreatOrEditSes },
[ActReqChgExaSes ] = {1902,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSes_ReqCreatOrEditSes },
[ActNewExaSes ] = {1853,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSes_ReceiveFormSession },
[ActChgExaSes ] = {1903,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSes_ReceiveFormSession },
[ActNewExaSes ] = {1853,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSes_ReceiveSession },
[ActChgExaSes ] = {1903,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSes_ReceiveSession },
[ActReqRemExaSes ] = {1850,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSes_ReqRemSession },
[ActRemExaSes ] = {1851,-1,TabUnk,ActSeeAllExa ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSes_RemoveSession },
[ActHidExaSes ] = {1900,-1,TabUnk,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,ExaSes_HideSession },
@ -793,13 +793,13 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActLstOneGam ] = {1912,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_ListGame },
[ActFrmNewGam ] = {1652,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_ReqCreatOrEditGame },
[ActEdiOneGam ] = {1653,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_ReqCreatOrEditGame },
[ActNewGam ] = {1654,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_ReceiveFormGame },
[ActChgGam ] = {1655,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_ReceiveFormGame },
[ActNewGam ] = {1654,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_ReceiveGame },
[ActChgGam ] = {1655,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_ReceiveGame },
[ActReqRemGam ] = {1656,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_AskRemGame },
[ActRemGam ] = {1657,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_RemoveGame },
[ActHidGam ] = {1660,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_HideGame },
[ActUnhGam ] = {1661,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_UnhideGame },
[ActAddOneGamQst ] = {1662,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetIniEndDatesToPastAndNow,Gam_ReqSelectQstsToAddToGame},
[ActAddOneGamQst ] = {1662,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetDatesToPastAndNow ,Gam_ReqSelectQstsToAddToGame },
[ActGamLstTstQst ] = {1666,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_ListQstsToAddToGame },
[ActAddTstQstToGam ] = {1667,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_AddQstsToGame },
[ActReqRemGamQst ] = {1664,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Gam_ReqRemQstFromGame },
@ -813,14 +813,14 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActSeeOneRub ] = {1952,-1,TabUnk,ActSeeAllRub ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rub_SeeOneRubric },
[ActFrmNewRub ] = {1953,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rub_ReqCreatOrEditRubric },
[ActEdiOneRub ] = {1954,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rub_ReqCreatOrEditRubric },
[ActNewRub ] = {1955,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rub_ReceiveFormRubric },
[ActChgRub ] = {1956,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rub_ReceiveFormRubric },
[ActNewRub ] = {1955,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rub_ReceiveRubric },
[ActChgRub ] = {1956,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rub_ReceiveRubric },
[ActReqRemRub ] = {1957,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rub_AskRemRubric },
[ActRemRub ] = {1958,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rub_RemoveRubric },
[ActReqLnkRub ] = {1969,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,RubRsc_GetLinkToRubric },
[ActSeeRscCli_InRub ] = {1972,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,RubRsc_ViewResourceClipboard },
[ActRemRscCli_InRub ] = {1973,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,RubRsc_RemoveResourceClipboard },
[ActNewRubCri ] = {1959,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,RubCri_ReceiveFormCriterion },
[ActNewRubCri ] = {1959,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,RubCri_ReceiveCriterion },
[ActReqRemRubCri ] = {1960,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,RubCri_ReqRemCriterion },
[ActRemRubCri ] = {1961,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,RubCri_RemoveCriterion },
[ActUp_RubCri ] = {1962,-1,TabUnk,ActSeeAllRub ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,RubCri_MoveUpCriterion },
@ -853,7 +853,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActCreFolDocIns ] = {1324,-1,TabUnk,ActSeeAdmDocIns , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecFolderFileBrowser },
[ActCreLnkDocIns ] = {1325,-1,TabUnk,ActSeeAdmDocIns , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecLinkFileBrowser },
[ActRenFolDocIns ] = {1326,-1,TabUnk,ActSeeAdmDocIns , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RenFolderFileBrowser },
[ActRcvFilDocInsDZ ] = {1327,-1,TabUnk,ActSeeAdmDocIns , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ,NULL },
[ActRcvFilDocInsDZ ] = {1327,-1,TabUnk,ActSeeAdmDocIns , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ ,NULL },
[ActRcvFilDocInsCla ] = {1328,-1,TabUnk,ActSeeAdmDocIns , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_DATA,Act_1ST_TAB,NULL ,Brw_RcvFileInFileBrwClassic },
[ActExpAdmDocIns ] = {1329,-1,TabUnk,ActSeeAdmDocIns , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ExpandFileTree ,NULL },
[ActConAdmDocIns ] = {1330,-1,TabUnk,ActSeeAdmDocIns , 0, 0, 0, 0,0x300, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ContractFileTree ,NULL },
@ -876,7 +876,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActCreFolShaIns ] = {1390,-1,TabUnk,ActAdmShaIns , 0, 0, 0, 0,0x3C0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecFolderFileBrowser },
[ActCreLnkShaIns ] = {1391,-1,TabUnk,ActAdmShaIns , 0, 0, 0, 0,0x3C0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecLinkFileBrowser },
[ActRenFolShaIns ] = {1392,-1,TabUnk,ActAdmShaIns , 0, 0, 0, 0,0x3C0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RenFolderFileBrowser },
[ActRcvFilShaInsDZ ] = {1393,-1,TabUnk,ActAdmShaIns , 0, 0, 0, 0,0x3C0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ,NULL },
[ActRcvFilShaInsDZ ] = {1393,-1,TabUnk,ActAdmShaIns , 0, 0, 0, 0,0x3C0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ ,NULL },
[ActRcvFilShaInsCla ] = {1394,-1,TabUnk,ActAdmShaIns , 0, 0, 0, 0,0x3C0, 0, 0,Act_CONT_DATA,Act_1ST_TAB,NULL ,Brw_RcvFileInFileBrwClassic },
[ActExpShaIns ] = {1395,-1,TabUnk,ActAdmShaIns , 0, 0, 0, 0,0x3C0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ExpandFileTree ,NULL },
[ActConShaIns ] = {1396,-1,TabUnk,ActAdmShaIns , 0, 0, 0, 0,0x3C0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ContractFileTree ,NULL },
@ -906,7 +906,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActCreFolDocCtr ] = {1295,-1,TabUnk,ActSeeAdmDocCtr , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecFolderFileBrowser },
[ActCreLnkDocCtr ] = {1296,-1,TabUnk,ActSeeAdmDocCtr , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecLinkFileBrowser },
[ActRenFolDocCtr ] = {1297,-1,TabUnk,ActSeeAdmDocCtr , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RenFolderFileBrowser },
[ActRcvFilDocCtrDZ ] = {1298,-1,TabUnk,ActSeeAdmDocCtr , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ,NULL },
[ActRcvFilDocCtrDZ ] = {1298,-1,TabUnk,ActSeeAdmDocCtr , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ ,NULL },
[ActRcvFilDocCtrCla ] = {1299,-1,TabUnk,ActSeeAdmDocCtr , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_DATA,Act_1ST_TAB,NULL ,Brw_RcvFileInFileBrwClassic },
[ActExpAdmDocCtr ] = {1300,-1,TabUnk,ActSeeAdmDocCtr , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ExpandFileTree ,NULL },
[ActConAdmDocCtr ] = {1301,-1,TabUnk,ActSeeAdmDocCtr , 0, 0, 0,0x380, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ContractFileTree ,NULL },
@ -929,7 +929,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActCreFolShaCtr ] = {1371,-1,TabUnk,ActAdmShaCtr , 0, 0, 0,0x3C0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecFolderFileBrowser },
[ActCreLnkShaCtr ] = {1372,-1,TabUnk,ActAdmShaCtr , 0, 0, 0,0x3C0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecLinkFileBrowser },
[ActRenFolShaCtr ] = {1373,-1,TabUnk,ActAdmShaCtr , 0, 0, 0,0x3C0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RenFolderFileBrowser },
[ActRcvFilShaCtrDZ ] = {1374,-1,TabUnk,ActAdmShaCtr , 0, 0, 0,0x3C0, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ,NULL },
[ActRcvFilShaCtrDZ ] = {1374,-1,TabUnk,ActAdmShaCtr , 0, 0, 0,0x3C0, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ ,NULL },
[ActRcvFilShaCtrCla ] = {1375,-1,TabUnk,ActAdmShaCtr , 0, 0, 0,0x3C0, 0, 0, 0,Act_CONT_DATA,Act_1ST_TAB,NULL ,Brw_RcvFileInFileBrwClassic },
[ActExpShaCtr ] = {1376,-1,TabUnk,ActAdmShaCtr , 0, 0, 0,0x3C0, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ExpandFileTree ,NULL },
[ActConShaCtr ] = {1377,-1,TabUnk,ActAdmShaCtr , 0, 0, 0,0x3C0, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ContractFileTree ,NULL },
@ -959,7 +959,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActCreFolDocDeg ] = {1266,-1,TabUnk,ActSeeAdmDocDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecFolderFileBrowser },
[ActCreLnkDocDeg ] = {1267,-1,TabUnk,ActSeeAdmDocDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecLinkFileBrowser },
[ActRenFolDocDeg ] = {1268,-1,TabUnk,ActSeeAdmDocDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RenFolderFileBrowser },
[ActRcvFilDocDegDZ ] = {1269,-1,TabUnk,ActSeeAdmDocDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ,NULL },
[ActRcvFilDocDegDZ ] = {1269,-1,TabUnk,ActSeeAdmDocDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ ,NULL },
[ActRcvFilDocDegCla ] = {1270,-1,TabUnk,ActSeeAdmDocDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_DATA,Act_1ST_TAB,NULL ,Brw_RcvFileInFileBrwClassic },
[ActExpAdmDocDeg ] = {1271,-1,TabUnk,ActSeeAdmDocDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ExpandFileTree ,NULL },
[ActConAdmDocDeg ] = {1272,-1,TabUnk,ActSeeAdmDocDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ContractFileTree ,NULL },
@ -982,7 +982,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActCreFolShaDeg ] = {1352,-1,TabUnk,ActAdmShaDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecFolderFileBrowser },
[ActCreLnkShaDeg ] = {1353,-1,TabUnk,ActAdmShaDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RecLinkFileBrowser },
[ActRenFolShaDeg ] = {1354,-1,TabUnk,ActAdmShaDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Brw_RenFolderFileBrowser },
[ActRcvFilShaDegDZ ] = {1355,-1,TabUnk,ActAdmShaDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ,NULL },
[ActRcvFilShaDegDZ ] = {1355,-1,TabUnk,ActAdmShaDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_DATA,Act_UPL_FIL,Brw_RcvFileInFileBrwDZ ,NULL },
[ActRcvFilShaDegCla ] = {1356,-1,TabUnk,ActAdmShaDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_DATA,Act_1ST_TAB,NULL ,Brw_RcvFileInFileBrwClassic },
[ActExpShaDeg ] = {1357,-1,TabUnk,ActAdmShaDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ExpandFileTree ,NULL },
[ActConShaDeg ] = {1358,-1,TabUnk,ActAdmShaDeg , 0, 0,0x3C0, 0, 0, 0, 0,Act_CONT_NORM,Act_204_NOC,Brw_ContractFileTree ,NULL },
@ -1304,14 +1304,14 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActReqSelGrp ] = { 116, 0,TabUsr,ActReqSelGrp ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ReqRegisterInGrps },
[ActChgGrp ] = { 118,-1,TabUnk,ActReqSelGrp ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ChangeMyGrpsAndShowChanges },
[ActReqEdiGrp ] = { 108,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ReqEditGroups },
[ActNewGrpTyp ] = { 174,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ReceiveFormNewGrpTyp },
[ActNewGrpTyp ] = { 174,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ReceiveNewGrpTyp },
[ActReqRemGrpTyp ] = { 236,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ReqRemGroupType },
[ActRemGrpTyp ] = { 237,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_RemoveGroupType },
[ActRenGrpTyp ] = { 304,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_RenameGroupType },
[ActChgMdtGrpTyp ] = { 303,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ChangeMandatGrpTyp },
[ActChgMulGrpTyp ] = { 302,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ChangeMultiGrpTyp },
[ActChgTimGrpTyp ] = {1061,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ChangeOpenTimeGrpTyp },
[ActNewGrp ] = { 122,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ReceiveFormNewGrp },
[ActNewGrp ] = { 122,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ReceiveNewGrp },
[ActReqRemGrp ] = { 107,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_ReqRemGroup },
[ActRemGrp ] = { 175,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_RemoveGroup },
[ActOpeGrp ] = { 322,-1,TabUnk,ActReqSelGrp ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Grp_OpenGroup },
@ -1327,7 +1327,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActLstStd ] = { 678, 1,TabUsr,ActLstStd ,0x3F8,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Usr_SeeStudents },
[ActLstStdAll ] = { 42,-1,TabUnk,ActLstStd ,0x3F8,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_NEW_TAB,NULL ,Usr_ListAllDataStds },
[ActPrnStdPho ] = { 120,-1,TabUnk,ActLstStd ,0x3F8,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_NEW_TAB,NULL ,Usr_SeeStdClassPhotoPrn },
[ActDoActOnSevStd ] = {1754,-1,TabUnk,ActLstStd ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Usr_DoActionOnSeveralUsrs1 ,Usr_DoActionOnSeveralUsrs2 },
[Act_DoAct_OnSevStd ] = {1754,-1,TabUnk,ActLstStd ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Usr_DoActionOnSeveralUsrs1 ,Usr_DoActionOnSeveralUsrs2 },
[ActSeeRecSevStd ] = { 89,-1,TabUnk,ActLstStd ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_ListRecordsStdsShow },
[ActPrnRecSevStd ] = { 111,-1,TabUnk,ActLstStd ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_NEW_TAB,NULL ,Rec_ListRecordsStdsPrint },
[ActReqMdfOneStd ] = {1415,-1,TabUnk,ActLstStd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReqRegRemStd },
@ -1360,10 +1360,10 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActUnfSevStd ] = {1762,-1,TabUnk,ActLstStd ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Fol_UnfollowUsrs },
[ActSeeRecOneStd ] = {1174,-1,TabUnk,ActLstStd ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_GetUsrAndShowRecOneStdCrs },
[ActReqEnrSevStd ] = {1426,-1,TabUnk,ActLstStd ,0x3E0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReqAdminStds },
[ActRcvFrmEnrSevStd ] = {1428,-1,TabUnk,ActLstStd ,0x3E0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReceiveFormAdminStds },
[ActRcvFrmEnrSevStd ] = {1428,-1,TabUnk,ActLstStd ,0x3E0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReceiveAdminStds },
[ActRcvRecOthUsr ] = { 300,-1,TabUnk,ActLstStd ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_UpdateAndShowOtherCrsRecord},
[ActEdiRecFie ] = { 292,-1,TabUnk,ActLstStd ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_ReqEditRecordFields },
[ActNewFie ] = { 293,-1,TabUnk,ActLstStd ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_ReceiveFormField },
[ActNewFie ] = { 293,-1,TabUnk,ActLstStd ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_ReceiveField },
[ActReqRemFie ] = { 294,-1,TabUnk,ActLstStd ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_ReqRemField },
[ActRemFie ] = { 295,-1,TabUnk,ActLstStd ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_RemoveField },
[ActRenFie ] = { 296,-1,TabUnk,ActLstStd ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_RenameField },
@ -1375,7 +1375,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActLstTch ] = { 679, 2,TabUsr,ActLstTch ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Usr_SeeTeachers },
[ActLstTchAll ] = { 578,-1,TabUnk,ActLstTch ,0x3F8,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_NEW_TAB,NULL ,Usr_ListAllDataTchs },
[ActPrnTchPho ] = { 443,-1,TabUnk,ActLstTch ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_NEW_TAB,NULL ,Usr_SeeTchClassPhotoPrn },
[ActDoActOnSevTch ] = {1755,-1,TabUnk,ActLstTch ,0x3F8,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Usr_DoActionOnSeveralUsrs1 ,Usr_DoActionOnSeveralUsrs2 },
[Act_DoAct_OnSevTch ] = {1755,-1,TabUnk,ActLstTch ,0x3F8,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Usr_DoActionOnSeveralUsrs1 ,Usr_DoActionOnSeveralUsrs2 },
[ActSeeRecSevTch ] = { 22,-1,TabUnk,ActLstTch ,0x3F8,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_ListRecordsTchsShow },
[ActPrnRecSevTch ] = { 127,-1,TabUnk,ActLstTch ,0x3F8,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_NEW_TAB,NULL ,Rec_ListRecordsTchsPrint },
[ActReqMdfOneTch ] = {1416,-1,TabUnk,ActLstTch ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReqRegRemTch },
@ -1411,12 +1411,11 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActReqUnfSevTch ] = {1759,-1,TabUnk,ActLstTch ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Fol_ReqUnfollowTchs },
[ActFolSevTch ] = {1761,-1,TabUnk,ActLstTch ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Fol_FollowUsrs },
[ActUnfSevTch ] = {1763,-1,TabUnk,ActLstTch ,0x3F8,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Fol_UnfollowUsrs },
[ActSeeRecOneTch ] = {1175,-1,TabUnk,ActLstTch ,0x3F8,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_GetUsrAndShowRecOneTchCrs },
[ActReqEnrSevNET ] = {1642,-1,TabUnk,ActLstTch ,0x3C0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReqAdminNonEditingTchs },
[ActRcvFrmEnrSevNET ] = {1643,-1,TabUnk,ActLstTch ,0x3C0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReceiveFormAdminNonEditTchs},
[ActRcvFrmEnrSevNET ] = {1643,-1,TabUnk,ActLstTch ,0x3C0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReceiveAdminNonEditTchs },
[ActReqEnrSevTch ] = {1427,-1,TabUnk,ActLstTch ,0x3C0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReqAdminTchs },
[ActRcvFrmEnrSevTch ] = {1429,-1,TabUnk,ActLstTch ,0x3C0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReceiveFormAdminTchs },
[ActRcvFrmEnrSevTch ] = {1429,-1,TabUnk,ActLstTch ,0x3C0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReceiveAdminTchs },
[ActFrmLogInUsrAgd ] = {1614,-1,TabUnk,ActLstTch , 0,0x001,0x001,0x001,0x001,0x001,0x001,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_PutFormLogInToShowUsrAgenda},
[ActLogInUsrAgd ] = {1615,-1,TabUnk,ActLstTch ,0x3F8,0x3C4,0x3C4,0x3C4,0x3C4,0x3C4,0x3C4,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_ShowOtherAgendaAfterLogIn },
[ActLogInUsrAgdLan ] = {1616,-1,TabUnk,ActLstTch ,0x3F8,0x3C4,0x3C4,0x3C4,0x3C4,0x3C4,0x3C4,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_ShowOtherAgendaAfterLogIn },
@ -1432,7 +1431,7 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActLstGst ] = { 587,-1,TabUnk,ActLstOth ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Usr_SeeGuests },
[ActLstGstAll ] = {1189,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_NEW_TAB,NULL ,Usr_ListAllDataGsts },
[ActPrnGstPho ] = {1190,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_NEW_TAB,NULL ,Usr_SeeGstClassPhotoPrn },
[ActDoActOnSevGst ] = {1753,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Usr_DoActionOnSeveralUsrs1 ,Usr_DoActionOnSeveralUsrs2 },
[Act_DoAct_OnSevGst ] = {1753,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Usr_DoActionOnSeveralUsrs1 ,Usr_DoActionOnSeveralUsrs2 },
[ActSeeRecSevGst ] = {1187,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,NULL ,Rec_ListRecordsGstsShow },
[ActPrnRecSevGst ] = {1188,-1,TabUnk,ActLstOth ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_NEW_TAB,NULL ,Rec_ListRecordsGstsPrint },
[ActReqMdfOneOth ] = {1414,-1,TabUnk,ActLstOth ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Enr_ReqRegRemOth },
@ -1469,8 +1468,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActPrnLstUsrAtt ] = {1075,-1,TabUnk,ActSeeAllAtt ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_NEW_TAB,NULL ,Att_PrintUsrsAttendanceCrs },
[ActFrmNewAtt ] = {1063,-1,TabUnk,ActSeeAllAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Att_ReqCreatOrEditEvent },
[ActEdiOneAtt ] = {1064,-1,TabUnk,ActSeeAllAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Att_ReqCreatOrEditEvent },
[ActNewAtt ] = {1065,-1,TabUnk,ActSeeAllAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Att_ReceiveFormEvent },
[ActChgAtt ] = {1066,-1,TabUnk,ActSeeAllAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Att_ReceiveFormEvent },
[ActNewAtt ] = {1065,-1,TabUnk,ActSeeAllAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Att_ReceiveEvent },
[ActChgAtt ] = {1066,-1,TabUnk,ActSeeAllAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Att_ReceiveEvent },
[ActReqRemAtt ] = {1067,-1,TabUnk,ActSeeAllAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Att_AskRemEvent },
[ActRemAtt ] = {1068,-1,TabUnk,ActSeeAllAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Att_GetAndRemEvent },
[ActHidAtt ] = {1069,-1,TabUnk,ActSeeAllAtt ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Att_HideEvent },
@ -1498,8 +1497,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActSeeAnn ] = {1235, 0,TabMsg,ActSeeAnn ,0x3F8,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ann_ShowAllAnnouncements },
[ActWriAnn ] = {1237,-1,TabUnk,ActSeeAnn ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ann_ShowFormAnnouncement },
[ActNewAnn ] = {1238,-1,TabUnk,ActSeeAnn ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ann_ReceiveAnnouncement },
[ActHidAnn ] = {1470,-1,TabUnk,ActSeeAnn ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Ann_HideActiveAnnouncement ,Ann_ShowAllAnnouncements },
[ActUnhAnn ] = {1471,-1,TabUnk,ActSeeAnn ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Ann_RevealHiddenAnnouncement,Ann_ShowAllAnnouncements },
[ActHidAnn ] = {1470,-1,TabUnk,ActSeeAnn ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Ann_HideAnnouncement ,Ann_ShowAllAnnouncements },
[ActUnhAnn ] = {1471,-1,TabUnk,ActSeeAnn ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,Ann_UnhideAnnouncement ,Ann_ShowAllAnnouncements },
[ActRemAnn ] = {1236,-1,TabUnk,ActSeeAnn ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_1ST_TAB,NULL ,Ann_RemoveAnnouncement },
// Notices
@ -1507,8 +1506,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActSeeOneNot ] = {1164,-1,TabUnk,ActSeeAllNot ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Not_GetHighLightedNotCod ,Not_ListFullNotices },
[ActWriNot ] = { 59,-1,TabUnk,ActSeeAllNot ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Not_ShowFormNotice },
[ActNewNot ] = { 60,-1,TabUnk,ActSeeAllNot ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Not_ReceiveNotice ,Not_ListFullNotices },
[ActHidNot ] = { 763,-1,TabUnk,ActSeeAllNot ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Not_HideActiveNotice ,Not_ListFullNotices },
[ActUnhNot ] = { 764,-1,TabUnk,ActSeeAllNot ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Not_RevealHiddenNotice ,Not_ListFullNotices },
[ActHidNot ] = { 763,-1,TabUnk,ActSeeAllNot ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Not_HideNotice ,Not_ListFullNotices },
[ActUnhNot ] = { 764,-1,TabUnk,ActSeeAllNot ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Not_UnhideNotice ,Not_ListFullNotices },
[ActReqRemNot ] = {1472,-1,TabUnk,ActSeeAllNot ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Not_ReqRemNotice },
[ActRemNot ] = { 73,-1,TabUnk,ActSeeAllNot ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Not_RemoveNotice ,Not_ListNoticesAfterRemoval },
@ -1698,8 +1697,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActAnsSvy ] = { 983,-1,TabUnk,ActSeeAllSvy ,0x3F8,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_ReceiveSurveyAnswers },
[ActFrmNewSvy ] = { 973,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_ReqCreatOrEditSvy },
[ActEdiOneSvy ] = { 974,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_ReqCreatOrEditSvy },
[ActNewSvy ] = { 968,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_ReceiveFormSurvey },
[ActChgSvy ] = { 975,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_ReceiveFormSurvey },
[ActNewSvy ] = { 968,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_ReceiveSurvey },
[ActChgSvy ] = { 975,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_ReceiveSurvey },
[ActReqRemSvy ] = { 976,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_AskRemSurvey },
[ActRemSvy ] = { 969,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_RemoveSurvey },
[ActReqRstSvy ] = { 984,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_AskResetSurvey },
@ -1714,9 +1713,9 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActRemSvyQst ] = { 981,-1,TabUnk,ActSeeAllSvy ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Svy_RemoveQst },
// Visits
[ActReqAccGbl ] = { 591, 4,TabAna,ActReqAccGbl ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,Dat_SetIniEndDatesToRecentWeeks,Sta_AskShowGblHits },
[ActReqAccGbl ] = { 591, 4,TabAna,ActReqAccGbl ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,Dat_SetDatesToRecentWeeks ,Sta_AskShowGblHits },
[ActSeeAccGbl ] = { 79,-1,TabUnk,ActReqAccGbl ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Sta_SeeGblAccesses },
[ActReqAccCrs ] = { 594,-1,TabUnk,ActReqAccGbl ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetIniEndDatesToRecentWeeks,Sta_ReqCrsHits },
[ActReqAccCrs ] = { 594,-1,TabUnk,ActReqAccGbl ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,Dat_SetDatesToRecentWeeks ,Sta_ReqCrsHits },
[ActSeeAccCrs ] = { 119,-1,TabUnk,ActReqAccGbl ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_1ST_TAB,NULL ,Sta_SeeCrsAccesses },
[ActLstClk ] = { 989,-1,TabUnk,ActReqAccGbl ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Log_ShowLastClicks },
[ActRefLstClk ] = { 994,-1,TabUnk,ActReqAccGbl ,0x3F8,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,0x3C7,Act_CONT_NORM,Act_AJAX_RF,NULL ,Lay_RefreshLastClicks },
@ -1747,8 +1746,8 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActSeeMyAgd ] = {1602, 3,TabPrf,ActSeeMyAgd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_GetParsAndShowMyAgenda },
[ActFrmNewEvtMyAgd ] = {1603,-1,TabUnk,ActSeeMyAgd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_ReqCreatOrEditEvent },
[ActEdiOneEvtMyAgd ] = {1604,-1,TabUnk,ActSeeMyAgd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_ReqCreatOrEditEvent },
[ActNewEvtMyAgd ] = {1605,-1,TabUnk,ActSeeMyAgd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_ReceiveFormEvent },
[ActChgEvtMyAgd ] = {1606,-1,TabUnk,ActSeeMyAgd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_ReceiveFormEvent },
[ActNewEvtMyAgd ] = {1605,-1,TabUnk,ActSeeMyAgd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_ReceiveEvent },
[ActChgEvtMyAgd ] = {1606,-1,TabUnk,ActSeeMyAgd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_ReceiveEvent },
[ActReqRemEvtMyAgd ] = {1607,-1,TabUnk,ActSeeMyAgd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_AskRemEvent },
[ActRemEvtMyAgd ] = {1608,-1,TabUnk,ActSeeMyAgd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_RemoveEvent },
[ActHidEvtMyAgd ] = {1612,-1,TabUnk,ActSeeMyAgd ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_1ST_TAB,NULL ,Agd_HideEvent },
@ -2022,7 +2021,7 @@ Act_Action_t ActLst_FromActCodToAction[1 + ActLst_MAX_ACTION_COD] = // Do not re
ActRenFolWrkCrs, // #208
ActRemFilWrkCrs, // #209
ActRemFolWrkCrs, // #210
ActModIteSyl, // #211
ActModIteSyl, // #211
ActUnk, // #212 (obsolete action)
ActUnk, // #213 (obsolete action)
ActUnk, // #214 (obsolete action)
@ -3564,9 +3563,9 @@ Act_Action_t ActLst_FromActCodToAction[1 + ActLst_MAX_ACTION_COD] = // Do not re
ActChgRooMaxUsr, // #1750
ActUnk, // #1751 (obsolete action)
ActChgGrpRoo, // #1752
ActDoActOnSevGst, // #1753
ActDoActOnSevStd, // #1754
ActDoActOnSevTch, // #1755
Act_DoAct_OnSevGst, // #1753
Act_DoAct_OnSevStd, // #1754
Act_DoAct_OnSevTch, // #1755
ActReqFolSevStd, // #1756
ActReqFolSevTch, // #1757
ActReqUnfSevStd, // #1758

View File

@ -1298,7 +1298,7 @@ typedef enum
ActLstStd,
ActLstStdAll,
ActPrnStdPho,
ActDoActOnSevStd,
Act_DoAct_OnSevStd,
ActSeeRecSevStd,
ActPrnRecSevStd,
ActReqMdfOneStd,
@ -1347,7 +1347,7 @@ typedef enum
ActLstTch,
ActLstTchAll,
ActPrnTchPho,
ActDoActOnSevTch,
Act_DoAct_OnSevTch,
ActSeeRecSevTch,
ActPrnRecSevTch,
ActReqMdfOneTch,
@ -1404,7 +1404,7 @@ typedef enum
ActLstGst,
ActLstGstAll,
ActPrnGstPho,
ActDoActOnSevGst,
Act_DoAct_OnSevGst,
ActSeeRecSevGst,
ActPrnRecSevGst,
ActReqMdfOneOth,

View File

@ -34,20 +34,6 @@
#include "swad_global.h"
#include "swad_user_database.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
const bool Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES] =
{
/* Users who can admin */
[Rol_TCH ] = true,
[Rol_DEG_ADM] = true,
[Rol_CTR_ADM] = true,
[Rol_INS_ADM] = true,
[Rol_SYS_ADM] = true,
};
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
@ -66,6 +52,25 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
static void Adm_AskIfRemAdm (Usr_MeOrOther_t MeOrOther,Hie_Level_t Level);
static void Adm_EffectivelyRemAdm (struct Usr_Data *UsrDat,Hie_Level_t Level);
/*****************************************************************************/
/**************** Check if I can admin another user's account ****************/
/*****************************************************************************/
Usr_ICan_t Adm_CheckIfICanAdminOtherUsrs (void)
{
static Usr_ICan_t Adm_ICanAdminOtherUsrs[Rol_NUM_ROLES] =
{
/* Users who can admin */
[Rol_TCH ] = Usr_I_CAN,
[Rol_DEG_ADM] = Usr_I_CAN,
[Rol_CTR_ADM] = Usr_I_CAN,
[Rol_INS_ADM] = Usr_I_CAN,
[Rol_SYS_ADM] = Usr_I_CAN,
};
return Adm_ICanAdminOtherUsrs[Gbl.Usrs.Me.Role.Logged];
}
/*****************************************************************************/
/**** Ask if really wanted to add an administrator to current institution ****/
/*****************************************************************************/
@ -75,7 +80,7 @@ void Adm_ReqAddAdm (Hie_Level_t Level)
extern const char *Txt_THE_USER_X_is_already_an_administrator_of_Y;
extern const char *Txt_Do_you_really_want_to_register_the_following_user_as_an_administrator_of_X;
extern const char *Txt_Register_user_IN_A_COURSE_OR_DEGREE;
static const Act_Action_t Enr_ActNewAdm[Hie_NUM_LEVELS] =
static Act_Action_t Enr_ActNewAdm[Hie_NUM_LEVELS] =
{
[Hie_UNK] = ActUnk,
[Hie_SYS] = ActUnk,
@ -85,7 +90,7 @@ void Adm_ReqAddAdm (Hie_Level_t Level)
[Hie_DEG] = ActNewAdmDeg,
[Hie_CRS] = ActUnk,
};
bool ICanRegister;
Usr_ICan_t ICanRegister;
if (Gbl.Hierarchy.Node[Level].HieCod > 0)
{
@ -95,8 +100,9 @@ void Adm_ReqAddAdm (Hie_Level_t Level)
/* Check if I am allowed to register user as administrator in institution/center/degree */
ICanRegister = ((Level == Hie_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
if (ICanRegister)
(Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
Usr_I_CAN_NOT;
if (ICanRegister == Usr_I_CAN)
{
if (Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Level)) // User is already an administrator of current institution/center/degree
{
@ -180,7 +186,7 @@ void Adm_GetAdmsLst (Hie_Level_t Level)
static void Adm_AddAdm (Hie_Level_t Level)
{
bool ICanRegister;
Usr_ICan_t ICanRegister;
if (Gbl.Hierarchy.Node[Level].HieCod > 0)
{
@ -190,8 +196,9 @@ static void Adm_AddAdm (Hie_Level_t Level)
/* Check if I am allowed to register user as administrator in institution/center/degree */
ICanRegister = ((Level == Hie_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
if (ICanRegister)
(Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
Usr_I_CAN_NOT;
if (ICanRegister == Usr_I_CAN)
{
/***** Register administrator in current institution/center/degree in database *****/
Adm_RegisterAdmin (&Gbl.Usrs.Other.UsrDat,Level);
@ -293,7 +300,7 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
{
extern const char *Txt_THE_USER_X_is_not_an_administrator_of_Y;
Usr_MeOrOther_t MeOrOther;
bool ICanRemove;
Usr_ICan_t ICanRemove;
if (Gbl.Hierarchy.Node[Level].HieCod > 0)
{
@ -305,8 +312,9 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
ICanRemove = (MeOrOther == Usr_ME ||
(Level == Hie_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
if (ICanRemove)
(Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
Usr_I_CAN_NOT;
if (ICanRemove == Usr_I_CAN)
{
/* Check if the other user is an admin of the current institution/center/degree */
if (Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Level))
@ -344,7 +352,7 @@ static void Adm_AskIfRemAdm (Usr_MeOrOther_t MeOrOther,Hie_Level_t Level)
extern const char *Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_X;
extern const char *Txt_Remove_me_as_an_administrator;
extern const char *Txt_Remove_USER_as_an_administrator;
static const Act_Action_t ActRemAdm[Hie_NUM_LEVELS] =
static Act_Action_t ActRemAdm[Hie_NUM_LEVELS] =
{
[Hie_UNK] = ActUnk,
[Hie_SYS] = ActUnk,

View File

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

View File

@ -121,6 +121,29 @@ static void Agd_FreeListEvents (struct Agd_Agenda *Agenda);
static void Agd_HideUnhideEvent (HidVis_HiddenOrVisible_t HiddenOrVisible);
/*****************************************************************************/
/******************* Check if I can view a user's agenda *********************/
/*****************************************************************************/
Usr_ICan_t Agd_CheckIfICanViewUsrAgenda (struct Usr_Data *UsrDat)
{
/***** 1. Fast check: Am I logged? *****/
if (!Gbl.Usrs.Me.Logged)
return Usr_I_CAN_NOT;
/***** 2. Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return Usr_I_CAN;
/***** 3. Fast check: Am I logged as system admin? *****/
if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)
return Usr_I_CAN;
/***** 4. Slow check: Get if user shares any course with me from database *****/
return Enr_CheckIfUsrSharesAnyOfMyCrs (UsrDat) ? Usr_I_CAN :
Usr_I_CAN_NOT;
}
/*****************************************************************************/
/*************************** Reset agenda context ****************************/
/*****************************************************************************/
@ -386,7 +409,7 @@ void Agd_ShowUsrAgenda (void)
/***** Get user *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
if (Usr_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat))
if (Agd_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{
Error = false;
@ -423,7 +446,7 @@ void Agd_ShowUsrAgenda (void)
void Agd_ShowOtherAgendaAfterLogIn (void)
{
extern const char *Hlp_PROFILE_Agenda_public_agenda;
extern const unsigned Txt_Current_CGI_SWAD_Language;
extern unsigned Txt_Current_CGI_SWAD_Language;
extern const char *Txt_Public_agenda_USER;
extern const char *Txt_Switching_to_LANGUAGE[1 + Lan_NUM_LANGUAGES];
struct Agd_Agenda Agenda;
@ -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);
@ -855,7 +877,7 @@ static void Agd_PutFormsToRemEditOneEvent (struct Agd_Agenda *Agenda,
struct Agd_Event *AgdEvent,
const char *Anchor)
{
static const Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
static Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = ActUnhEvtMyAgd, // Hidden ==> action to unhide
[HidVis_VISIBLE] = ActHidEvtMyAgd, // Visible ==> action to hide
@ -1449,7 +1471,7 @@ void Agd_ReqCreatOrEditEvent (void)
/********************* Receive form to create a new event ********************/
/*****************************************************************************/
void Agd_ReceiveFormEvent (void)
void Agd_ReceiveEvent (void)
{
extern const char *Txt_Created_new_event_X;
extern const char *Txt_The_event_has_been_modified;

View File

@ -101,6 +101,8 @@ typedef enum
/***************************** Public prototypes *****************************/
/*****************************************************************************/
Usr_ICan_t Agd_CheckIfICanViewUsrAgenda (struct Usr_Data *UsrDat);
void Agd_PutFormLogInToShowUsrAgenda (void);
void Agd_PutParAgd (void);
@ -127,7 +129,7 @@ void Agd_UnhideEvent (void);
void Agd_MakeEventPrivate (void);
void Agd_MakeEventPublic (void);
void Agd_ReceiveFormEvent (void);
void Agd_ReceiveEvent (void);
void Agd_PrintAgdQRCode (void);

View File

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

View File

@ -234,7 +234,7 @@ static void Ann_DrawAnAnnouncement (struct Ann_Announcement *Announcement,
[Ann_ACTIVE_ANNOUNCEMENT ] = "NOTICE_BOX NOTICE_BOX_WIDE",
[Ann_OBSOLETE_ANNOUNCEMENT] = "NOTICE_BOX NOTICE_BOX_WIDE LIGHT",
};
static const Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
static Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = ActUnhAnn, // Hidden ==> action to unhide
[HidVis_VISIBLE] = ActHidAnn, // Visible ==> action to hide
@ -429,7 +429,7 @@ void Ann_ReceiveAnnouncement (void)
/*********** Mark as hidden a global announcement that was active ************/
/*****************************************************************************/
void Ann_HideActiveAnnouncement (void)
void Ann_HideAnnouncement (void)
{
long AnnCod;
@ -444,7 +444,7 @@ void Ann_HideActiveAnnouncement (void)
/*********** Mark as active a global announcement that was hidden ************/
/*****************************************************************************/
void Ann_RevealHiddenAnnouncement (void)
void Ann_UnhideAnnouncement (void)
{
long AnnCod;

View File

@ -58,8 +58,8 @@ void Ann_ShowMyAnnouncementsNotMarkedAsSeen (void);
void Ann_ShowFormAnnouncement (void);
void Ann_ReceiveAnnouncement (void);
void Ann_HideActiveAnnouncement (void);
void Ann_RevealHiddenAnnouncement (void);
void Ann_HideAnnouncement (void);
void Ann_UnhideAnnouncement (void);
void Ann_RemoveAnnouncement (void);
void Ann_MarkAnnouncementAsSeen (void);

View File

@ -56,6 +56,16 @@
#include "swad_setting.h"
#include "swad_string.h"
/*****************************************************************************/
/******************************* Private types *******************************/
/*****************************************************************************/
typedef enum
{
Asg_ONE_ASSIGMENT,
Asg_MULTIPLE_ASSIGMENTS
} Asg_OneOrMultiple_t;
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
@ -67,14 +77,15 @@ extern struct Globals Gbl;
/*****************************************************************************/
static void Asg_PutHead (struct Asg_Assignments *Assignments,
bool OnlyOneAssignment,Vie_ViewType_t ViewType);
static bool Asg_CheckIfICanCreateAssignments (void);
Asg_OneOrMultiple_t OneOrMultiple,
Vie_ViewType_t ViewType);
static Usr_ICan_t Asg_CheckIfICanCreateAssignments (void);
static void Asg_PutIconsListAssignments (void *Assignments);
static void Asg_PutIconToCreateNewAsg (void *Assignments);
static void Asg_ParsWhichGroupsToShow (void *Assignments);
static void Asg_PutIconsOneAsg (void *Assignments);
static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
bool OnlyOneAssignment,
Asg_OneOrMultiple_t OneOrMultiple,
Vie_ViewType_t ViewType);
static void Asg_WriteAsgAuthor (struct Asg_Assignment *Asg);
static void Asg_WriteAssignmentFolder (struct Asg_Assignment *Asg,
@ -176,9 +187,7 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments)
HTM_TABLE_Begin ("TBL_SCROLL");
/***** Table head *****/
Asg_PutHead (Assignments,
false, // Not only this assignment in table
Vie_VIEW); // Not print view
Asg_PutHead (Assignments,Asg_MULTIPLE_ASSIGMENTS,Vie_VIEW);
/***** Write all assignments *****/
for (NumAsg = Pagination.FirstItemVisible, The_ResetRowColor ();
@ -187,9 +196,7 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments)
{
Assignments->Asg.AsgCod = Assignments->LstAsgCods[NumAsg - 1];
Asg_GetAssignmentDataByCod (&Assignments->Asg);
Asg_ShowAssignmentRow (Assignments,
false, // Not only this assignment in table
Vie_VIEW); // Not print view
Asg_ShowAssignmentRow (Assignments,Asg_MULTIPLE_ASSIGMENTS,Vie_VIEW);
}
/***** End table *****/
@ -214,7 +221,8 @@ void Asg_ShowAllAssignments (struct Asg_Assignments *Assignments)
/*****************************************************************************/
static void Asg_PutHead (struct Asg_Assignments *Assignments,
bool OnlyOneAssignment,Vie_ViewType_t ViewType)
Asg_OneOrMultiple_t OneOrMultiple,
Vie_ViewType_t ViewType)
{
extern const char *Txt_START_END_TIME_HELP[Dat_NUM_START_END_TIME];
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
@ -225,7 +233,7 @@ static void Asg_PutHead (struct Asg_Assignments *Assignments,
HTM_TR_Begin (NULL);
if (!OnlyOneAssignment)
if (OneOrMultiple == Asg_MULTIPLE_ASSIGMENTS)
HTM_TH_Span (NULL,HTM_HEAD_CENTER,1,1,"CONTEXT_COL"); // Column for contextual icons
for (Order = (Dat_StartEndTime_t) 0;
@ -279,10 +287,11 @@ static void Asg_PutHead (struct Asg_Assignments *Assignments,
/******************** Check if I can create assignments **********************/
/*****************************************************************************/
static bool Asg_CheckIfICanCreateAssignments (void)
static Usr_ICan_t Asg_CheckIfICanCreateAssignments (void)
{
return Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM;
return (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
Usr_I_CAN_NOT;
}
/*****************************************************************************/
@ -294,11 +303,11 @@ static void Asg_PutIconsListAssignments (void *Assignments)
/***** Put icon to create a new assignment *****/
if (Assignments)
{
if (Asg_CheckIfICanCreateAssignments ())
if (Asg_CheckIfICanCreateAssignments () == Usr_I_CAN)
Asg_PutIconToCreateNewAsg (Assignments);
/***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ())
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
{
((struct Asg_Assignments *) Assignments)->Asg.AsgCod = -1L;
Ico_PutContextualIconToGetLink (ActReqLnkAsg,NULL,
@ -393,14 +402,10 @@ void Asg_PrintOneAssignment (void)
HTM_TABLE_BeginWideMarginPadding (2);
/***** Table head *****/
Asg_PutHead (&Assignments,
true, // Only this assignment in table
Vie_PRINT); // Print view
Asg_PutHead (&Assignments,Asg_ONE_ASSIGMENT,Vie_PRINT);
/***** Write assignment *****/
Asg_ShowAssignmentRow (&Assignments,
true, // Only this assignment in table
Vie_PRINT); // Print view
Asg_ShowAssignmentRow (&Assignments,Asg_ONE_ASSIGMENT,Vie_PRINT);
/***** End table *****/
HTM_TABLE_End ();
@ -425,14 +430,10 @@ void Asg_ShowOneAssignmentInBox (struct Asg_Assignments *Assignments)
HTM_TABLE_Begin ("TBL_SCROLL");
/***** Table head *****/
Asg_PutHead (Assignments,
true, // Only this assignment in table
Vie_VIEW); // Not print view
Asg_PutHead (Assignments,Asg_ONE_ASSIGMENT,Vie_VIEW);
/***** Write assignment *****/
Asg_ShowAssignmentRow (Assignments,
true, // Only this assignment in table
Vie_VIEW); // Not print view
Asg_ShowAssignmentRow (Assignments,Asg_ONE_ASSIGMENT,Vie_VIEW);
/***** End table *****/
HTM_TABLE_End ();
@ -467,7 +468,7 @@ static void Asg_PutIconsOneAsg (void *Assignments)
/*****************************************************************************/
static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
bool OnlyOneAssignment,
Asg_OneOrMultiple_t OneOrMultiple,
Vie_ViewType_t ViewType)
{
extern const char *Txt_Actions[ActLst_NUM_ACTIONS];
@ -488,7 +489,7 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
HTM_TR_Begin (NULL);
/* Forms to remove/edit this assignment */
if (!OnlyOneAssignment)
if (OneOrMultiple == Asg_MULTIPLE_ASSIGMENTS)
{
HTM_TD_Begin ("rowspan=\"2\" class=\"CONTEXT_COL %s\"",
The_GetColorRows ());
@ -744,7 +745,7 @@ Dat_StartEndTime_t Asg_GetParAsgOrder (void)
static void Asg_PutIconsToRemEditOneAsg (struct Asg_Assignments *Assignments,
const char *Anchor)
{
static const Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
static Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = ActUnhAsg, // Hidden ==> action to unhide
[HidVis_VISIBLE] = ActHidAsg, // Visible ==> action to hide
@ -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 */
@ -1357,7 +1358,7 @@ static void Asg_ShowLstGrpsToEditAssignment (long AsgCod)
/****************** Receive form to create a new assignment ******************/
/*****************************************************************************/
void Asg_ReceiveFormAssignment (void)
void Asg_ReceiveAssignment (void)
{
extern const char *Txt_Already_existed_an_assignment_with_the_title_X;
extern const char *Txt_Already_existed_an_assignment_with_the_folder_X;
@ -1640,7 +1641,7 @@ static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod)
case Rol_TCH:
// Students and teachers can do assignments depending on groups
/***** Get if I can do an assignment from database *****/
return Asg_DB_CheckIfICanDoAssignment (AsgCod);
return (Asg_DB_CheckIfICanDoAssignment (AsgCod) == Usr_I_CAN);
case Rol_SYS_ADM:
return true;
default:
@ -1703,31 +1704,32 @@ void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg)
/* Check if I have permission to create a file or folder into an assignment **/
/*****************************************************************************/
bool Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg)
Usr_ICan_t Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg)
{
/***** Trivial check 1: assignment is valid *****/
if (Asg->AsgCod <= 0)
return false;
return Usr_I_CAN_NOT;
/***** Check 2: Do not create anything in hidden assigments *****/
if (Asg->HiddenOrVisible == HidVis_HIDDEN)
return false;
return Usr_I_CAN_NOT;
/***** Check 3: If I do not belong to course / groups of this assignment,
I can not create anything inside this assignment *****/
if (!Asg->IBelongToCrsOrGrps)
return false;
return Usr_I_CAN_NOT;
/***** Check 4: Depending on my role in this course... *****/
switch (Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs)
{
case Rol_STD: // Students...
case Rol_NET: // ...and non-editing teachers...
return Asg->Open; // ...can create inside open assignments
case Rol_TCH: // Teachers...
return true; // ...can create inside open or closed assignments
case Rol_STD: // Students...
case Rol_NET: // ...and non-editing teachers...
return Asg->Open ? Usr_I_CAN : // ...can create inside open assignments
Usr_I_CAN_NOT;
case Rol_TCH: // Teachers...
return Usr_I_CAN; // ...can create inside open or closed assignments
default:
return false;
return Usr_I_CAN_NOT;
}
}

View File

@ -102,11 +102,11 @@ void Asg_ReqRemAssignment (void);
void Asg_RemoveAssignment (void);
void Asg_HideAssignment (void);
void Asg_UnhideAssignment (void);
void Asg_ReceiveFormAssignment (void);
void Asg_ReceiveAssignment (void);
void Asg_RemoveCrsAssignments (long CrsCod);
void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg);
bool Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg);
Usr_ICan_t Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg);
void Asg_SetFolder (struct Asg_Assignment *Asg,unsigned Level);
unsigned Asg_GetNumAssignments (Hie_Level_t Level,unsigned *NumNotif);

View File

@ -331,7 +331,7 @@ void Asg_DB_RemoveAssignment (long AsgCod)
/********************* Check if I can do an assignment ***********************/
/*****************************************************************************/
bool Asg_DB_CheckIfICanDoAssignment (long AsgCod)
Usr_ICan_t Asg_DB_CheckIfICanDoAssignment (long AsgCod)
{
// Students and teachers can do assignments depending on groups
return
@ -355,7 +355,8 @@ bool Asg_DB_CheckIfICanDoAssignment (long AsgCod)
" AND asg_groups.GrpCod=grp_users.GrpCod)"
"))",
AsgCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN :
Usr_I_CAN_NOT;
}
/*****************************************************************************/

View File

@ -59,7 +59,7 @@ void Asg_DB_HideOrUnhideAssignment (long AsgCod,
void Asg_DB_RemoveAssignment (long AsgCod);
bool Asg_DB_CheckIfICanDoAssignment (long AsgCod);
Usr_ICan_t Asg_DB_CheckIfICanDoAssignment (long AsgCod);
unsigned Asg_DB_GetGrps (MYSQL_RES **mysql_res,long AsgCod);
void Asg_DB_CreateGroup (long AsgCod,long GrpCod);

View File

@ -128,7 +128,7 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
static void Att_PutLinkEvent (struct Att_Event *Event,
const char *Title,const char *Txt);
static unsigned Att_GetNumUsrsFromAListWhoAreInEvent (long AttCod,
long LstSelectedUsrCods[],
long *LstSelectedUsrCods,
unsigned NumUsrsInList);
static bool Att_CheckIfUsrIsPresentInEvent (long AttCod,long UsrCod);
static bool Att_CheckIfUsrIsPresentInEventAndGetComments (long AttCod,long UsrCod,
@ -338,14 +338,15 @@ static void Att_ParsWhichGroupsToShow (void *Events)
static void Att_PutIconsInListOfEvents (void *Events)
{
bool ICanEdit;
Usr_ICan_t ICanEdit;
if (Events)
{
/***** Put icon to create a new attendance event *****/
ICanEdit = (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
if (ICanEdit)
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
Usr_I_CAN_NOT;
if (ICanEdit == Usr_I_CAN)
Att_PutIconToCreateNewEvent ((struct Att_Events *) Events);
/***** Put icon to show attendance list *****/
@ -371,7 +372,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);
}
@ -573,13 +574,13 @@ static Dat_StartEndTime_t Att_GetParAttOrder (void)
static void Att_PutFormsToRemEditOneEvent (struct Att_Events *Events,
const char *Anchor)
{
static const Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
static Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = ActUnhAtt, // Hidden ==> action to unhide
[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 +592,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];
@ -1132,7 +1130,7 @@ static void Att_ShowLstGrpsToEditEvent (long AttCod)
/*************** Receive form to create a new attendance event ***************/
/*****************************************************************************/
void Att_ReceiveFormEvent (void)
void Att_ReceiveEvent (void)
{
extern const char *Txt_Already_existed_an_event_with_the_title_X;
extern const char *Txt_Created_new_event_X;
@ -1658,9 +1656,9 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
bool Present;
char CommentStd[Cns_MAX_BYTES_TEXT + 1];
char CommentTch[Cns_MAX_BYTES_TEXT + 1];
bool ICanChangeStdAttendance;
bool ICanEditStdComment;
bool ICanEditTchComment;
Usr_ICan_t ICanChangeStdAttendance;
Usr_ICan_t ICanEditStdComment;
Usr_ICan_t ICanEditTchComment;
/***** Set who can edit *****/
switch (Gbl.Usrs.Me.Role.Logged)
@ -1669,24 +1667,25 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
// A student can see only her/his attendance
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER)
Err_ShowErrorAndExit ("Wrong call.");
ICanChangeStdAttendance = false;
ICanEditStdComment = Event->Open; // Attendance event is open
ICanEditTchComment = false;
ICanChangeStdAttendance = Usr_I_CAN_NOT;
ICanEditStdComment = Event->Open ? Usr_I_CAN : // Attendance event is open
Usr_I_CAN_NOT;
ICanEditTchComment = Usr_I_CAN_NOT;
break;
case Rol_TCH:
ICanChangeStdAttendance = true;
ICanEditStdComment = false;
ICanEditTchComment = true;
ICanChangeStdAttendance = Usr_I_CAN;
ICanEditStdComment = Usr_I_CAN_NOT;
ICanEditTchComment = Usr_I_CAN;
break;
case Rol_SYS_ADM:
ICanChangeStdAttendance = true;
ICanEditStdComment = false;
ICanEditTchComment = false;
ICanChangeStdAttendance = Usr_I_CAN;
ICanEditStdComment = Usr_I_CAN_NOT;
ICanEditTchComment = Usr_I_CAN_NOT;
break;
default:
ICanChangeStdAttendance = false;
ICanEditStdComment = false;
ICanEditTchComment = false;
ICanChangeStdAttendance = Usr_I_CAN_NOT;
ICanEditStdComment = Usr_I_CAN_NOT;
ICanEditTchComment = Usr_I_CAN_NOT;
break;
}
@ -1709,8 +1708,8 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
"id=\"Std%u\" value=\"%s\"%s%s",
NumUsr,UsrDat->EnUsrCod,
Present ? " checked=\"checked\"" : "",
ICanChangeStdAttendance ? "" :
" disabled=\"disabled\"");
(ICanChangeStdAttendance == Usr_I_CAN) ? "" :
" disabled=\"disabled\"");
HTM_TD_End ();
/***** Write number of student in the list *****/
@ -1758,7 +1757,7 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
"DAT_SMALL",
The_GetSuffix (),
The_GetColorRows ());
if (ICanEditStdComment) // Show with form
if (ICanEditStdComment == Usr_I_CAN) // Show with form
{
HTM_TEXTAREA_Begin ("name=\"CommentStd%s\" cols=\"40\" rows=\"3\""
" class=\"INPUT_%s\"",
@ -1781,7 +1780,7 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
"DAT_SMALL",
The_GetSuffix (),
The_GetColorRows ());
if (ICanEditTchComment) // Show with form
if (ICanEditTchComment == Usr_I_CAN) // Show with form
{
HTM_TEXTAREA_Begin ("name=\"CommentTch%s\" cols=\"40\" rows=\"3\""
" class=\"INPUT_%s\"",
@ -1790,7 +1789,7 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
HTM_Txt (CommentTch);
HTM_TEXTAREA_End ();
}
else if (Event->CommentTchVisible) // Show without form
else if (Event->CommentTchVisible) // Show without form
{
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
CommentTch,Cns_MAX_BYTES_TEXT,
@ -2077,7 +2076,7 @@ void Att_RegisterStudentsInEvent (void)
/*****************************************************************************/
static unsigned Att_GetNumUsrsFromAListWhoAreInEvent (long AttCod,
long LstSelectedUsrCods[],
long *LstSelectedUsrCods,
unsigned NumUsrsInList)
{
char *SubQueryUsrs;
@ -2181,7 +2180,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);
@ -2231,7 +2230,7 @@ static void Att_ListOrPrintMyAttendanceCrs (Att_TypeOfView_t TypeOfView)
/* Get number of students in this event */
Events.Lst[NumAttEvent].NumStdsFromList =
Att_GetNumUsrsFromAListWhoAreInEvent (Events.Lst[NumAttEvent].AttCod,
&Gbl.Usrs.Me.UsrDat.UsrCod,1);
&Gbl.Usrs.Me.UsrDat.UsrCod,1);
/***** Get list of attendance events selected *****/
Att_GetListSelectedAttCods (&Events);
@ -2344,7 +2343,7 @@ static void Att_ListOrPrintUsrsAttendanceCrs (void *TypeOfView)
/* Get number of students in this event */
Events.Lst[NumAttEvent].NumStdsFromList =
Att_GetNumUsrsFromAListWhoAreInEvent (Events.Lst[NumAttEvent].AttCod,
LstSelectedUsrCods,NumUsrsInList);
LstSelectedUsrCods,NumUsrsInList);
/***** Get list of attendance events selected *****/
Att_GetListSelectedAttCods (&Events);
@ -2722,8 +2721,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 +2730,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 +2772,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 +3007,7 @@ static void Att_ListStdsWithAttEventsDetails (struct Att_Events *Events,
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get from the database the data of the student
Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS))
if (Usr_CheckIfICanViewAtt (&UsrDat))
if (Usr_CheckIfICanViewAtt (&UsrDat) == Usr_I_CAN)
{
UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&UsrDat);
Att_ListAttEventsForAStd (Events,NumUsr,&UsrDat);

View File

@ -85,7 +85,7 @@ struct Att_Events
void Att_SeeEvents (void);
bool Att_CheckIfICanEditEvents (void);
Usr_ICan_t Att_CheckIfICanEditEvents (void);
void Att_ReqCreatOrEditEvent (void);
bool Att_GetEventDataByCod (struct Att_Event *Event);
@ -97,7 +97,7 @@ void Att_RemoveEventFromDB (long AttCod);
void Att_HideEvent (void);
void Att_UnhideEvent (void);
void Att_ReceiveFormEvent (void);
void Att_ReceiveEvent (void);
void Att_CreateEvent (struct Att_Event *Event,const char *Description);
void Att_UpdateEvent (struct Att_Event *Event,const char *Description);

View File

@ -205,8 +205,7 @@ static void Ban_PutIconsListingBanners (__attribute__((unused)) void *Args)
static void Ban_PutIconToEditBanners (void)
{
Ico_PutContextualIconToEdit (ActEdiBan,NULL,
NULL,NULL);
Ico_PutContextualIconToEdit (ActEdiBan,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -357,8 +356,7 @@ static void Ban_GetBannerDataFromRow (MYSQL_RES *mysql_res,
static void Ban_PutIconsEditingBanners (__attribute__((unused)) void *Args)
{
/***** Put icon to view banners *****/
Ico_PutContextualIconToView (ActSeeBan,NULL,
NULL,NULL);
Ico_PutContextualIconToView (ActSeeBan,NULL,NULL,NULL);
/***** Put icon to view links *****/
Lnk_PutIconToViewLinks ();
@ -370,9 +368,7 @@ static void Ban_PutIconsEditingBanners (__attribute__((unused)) void *Args)
void Ban_PutIconToViewBanners (void)
{
Lay_PutContextualLinkOnlyIcon (ActSeeBan,NULL,
NULL,NULL,
"flag.svg",Ico_BLACK);
Lay_PutContextualLinkOnlyIcon (ActSeeBan,NULL,NULL,NULL,"flag.svg",Ico_BLACK);
}
/*****************************************************************************/
@ -382,12 +378,12 @@ void Ban_PutIconToViewBanners (void)
static void Ban_ListBannersForEdition (struct Ban_Banners *Banners)
{
extern const char *HidVis_DataClass[HidVis_NUM_HIDDEN_VISIBLE];
static const Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
static Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = ActUnhBan, // Hidden ==> action to unhide
[HidVis_VISIBLE] = ActHidBan, // Visible ==> action to hide
};
static const Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
static Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
{
[Nam_SHRT_NAME] = ActRenBanSho,
[Nam_FULL_NAME] = ActRenBanFul,
@ -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\"");
@ -854,7 +850,7 @@ static void Ban_PutHeadBanners (void)
/******************* Receive form to create a new banner *********************/
/*****************************************************************************/
void Ban_ReceiveFormNewBanner (void)
void Ban_ReceiveNewBanner (void)
{
extern const char *Nam_Fields[Nam_NUM_SHRT_FULL_NAMES];
extern const char *Txt_You_must_specify_the_image_of_the_new_banner;

View File

@ -67,7 +67,7 @@ void Ban_RenameBannerFull (void);
void Ban_ChangeBannerImg (void);
void Ban_ChangeBannerWWW (void);
void Ban_ContEditAfterChgBan (void);
void Ban_ReceiveFormNewBanner (void);
void Ban_ReceiveNewBanner (void);
void Ban_WriteMenuWithBanners (void);
void Ban_ClickOnBanner (void);

View File

@ -301,7 +301,7 @@ static const Brw_FileBrowser_t Brw_FileBrowserForDB_clipboard[Brw_NUM_TYPES_FILE
[Brw_ADMI_ASS_PRJ] = Brw_ADMI_ASS_PRJ,
};
static const Act_Action_t Brw_ActSeeAdm[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActSeeAdm[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActSeeDocCrs,
@ -334,7 +334,7 @@ static const Act_Action_t Brw_ActSeeAdm[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActAdmAssPrj,
};
static const Act_Action_t Brw_ActFromSeeToAdm[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActFromSeeToAdm[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActAdmDocCrs,
@ -367,7 +367,7 @@ static const Act_Action_t Brw_ActFromSeeToAdm[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActUnk,
};
static const Act_Action_t Brw_ActFromAdmToSee[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActFromAdmToSee[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -400,7 +400,7 @@ static const Act_Action_t Brw_ActFromAdmToSee[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActUnk,
};
static const Act_Action_t Brw_ActChgZone[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActChgZone[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActChgToSeeDocCrs,
@ -433,7 +433,7 @@ static const Act_Action_t Brw_ActChgZone[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActUnk,
};
static const Act_Action_t Brw_ActReqDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActReqDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActReqDatSeeDocCrs,
@ -466,7 +466,7 @@ static const Act_Action_t Brw_ActReqDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActReqDatAssPrj,
};
static const Act_Action_t Brw_ActReqLnk[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActReqLnk[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActReqLnkSeeDocCrs,
@ -499,7 +499,7 @@ static const Act_Action_t Brw_ActReqLnk[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActUnk,
};
static const Act_Action_t Brw_ActDowFile[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActDowFile[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActDowSeeDocCrs,
@ -532,7 +532,7 @@ static const Act_Action_t Brw_ActDowFile[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActDowAssPrj,
};
static const Act_Action_t Brw_ActAskRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActAskRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -565,7 +565,7 @@ static const Act_Action_t Brw_ActAskRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActReqRemFilAssPrj,
};
static const Act_Action_t Brw_ActRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -598,7 +598,7 @@ static const Act_Action_t Brw_ActRemoveFile[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActRemFilAssPrj,
};
static const Act_Action_t Brw_ActRemoveFolder[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActRemoveFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -631,7 +631,7 @@ static const Act_Action_t Brw_ActRemoveFolder[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActRemFolAssPrj,
};
static const Act_Action_t Brw_ActRemoveFolderNotEmpty[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActRemoveFolderNotEmpty[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -664,7 +664,7 @@ static const Act_Action_t Brw_ActRemoveFolderNotEmpty[Brw_NUM_TYPES_FILE_BROWSER
[Brw_ADMI_ASS_PRJ] = ActRemTreAssPrj,
};
static const Act_Action_t Brw_ActCopy[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActCopy[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -697,7 +697,7 @@ static const Act_Action_t Brw_ActCopy[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActCopAssPrj,
};
static const Act_Action_t Brw_ActPaste[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActPaste[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -730,7 +730,7 @@ static const Act_Action_t Brw_ActPaste[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActPasAssPrj,
};
static const Act_Action_t Brw_ActFormCreate[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActFormCreate[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -763,7 +763,7 @@ static const Act_Action_t Brw_ActFormCreate[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActFrmCreAssPrj,
};
static const Act_Action_t Brw_ActCreateFolder[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActCreateFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -796,7 +796,7 @@ static const Act_Action_t Brw_ActCreateFolder[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActCreFolAssPrj,
};
static const Act_Action_t Brw_ActCreateLink[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActCreateLink[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -829,7 +829,7 @@ static const Act_Action_t Brw_ActCreateLink[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActCreLnkAssPrj,
};
static const Act_Action_t Brw_ActRenameFolder[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActRenameFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -862,7 +862,7 @@ static const Act_Action_t Brw_ActRenameFolder[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActRenFolAssPrj,
};
static const Act_Action_t Brw_ActUploadFileDropzone[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActUploadFileDropzone[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -895,7 +895,7 @@ static const Act_Action_t Brw_ActUploadFileDropzone[Brw_NUM_TYPES_FILE_BROWSER]
[Brw_ADMI_ASS_PRJ] = ActRcvFilAssPrjDZ,
};
static const Act_Action_t Brw_ActUploadFileClassic[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActUploadFileClassic[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -928,7 +928,7 @@ static const Act_Action_t Brw_ActUploadFileClassic[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActRcvFilAssPrjCla,
};
static const Act_Action_t Brw_ActRefreshAfterUploadFiles[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActRefreshAfterUploadFiles[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -961,7 +961,7 @@ static const Act_Action_t Brw_ActRefreshAfterUploadFiles[Brw_NUM_TYPES_FILE_BROW
[Brw_ADMI_ASS_PRJ] = ActAdmAssPrj,
};
static const Act_Action_t Brw_ActExpandFolder[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActExpandFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActExpSeeDocCrs,
@ -994,7 +994,7 @@ static const Act_Action_t Brw_ActExpandFolder[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActExpAssPrj,
};
static const Act_Action_t Brw_ActContractFolder[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActContractFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActConSeeDocCrs,
@ -1027,7 +1027,7 @@ static const Act_Action_t Brw_ActContractFolder[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActConAssPrj,
};
static const Act_Action_t Brw_ActRecDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActRecDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActUnk,
@ -1060,7 +1060,7 @@ static const Act_Action_t Brw_ActRecDatFile[Brw_NUM_TYPES_FILE_BROWSER] =
[Brw_ADMI_ASS_PRJ] = ActChgDatAssPrj,
};
static const Act_Action_t Brw_ActZIPFolder[Brw_NUM_TYPES_FILE_BROWSER] =
static Act_Action_t Brw_ActZIPFolder[Brw_NUM_TYPES_FILE_BROWSER] =
{
[Brw_UNKNOWN ] = ActUnk,
[Brw_SHOW_DOC_CRS] = ActZIPSeeDocCrs,
@ -1097,7 +1097,7 @@ static const 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 *****************************/
@ -1140,7 +1140,7 @@ static void Brw_ListDir (unsigned Level,const char *RowId,
static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
bool TreeContracted,
Brw_IconTree_t IconThisRow);
static bool Brw_CheckIfCanPasteIn (unsigned Level);
static Usr_ICan_t Brw_CheckIfCanPasteIn (unsigned Level);
static void Brw_PutIconRemove (void);
static void Brw_PutIconCopy (void);
static void Brw_PutIconPaste (unsigned Level);
@ -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 (long 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);
@ -2876,7 +2876,7 @@ void Brw_PutLegalNotice (void)
static void Brw_FormToChangeCrsGrpZone (void)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
struct ListCodGrps LstMyGrps;
unsigned NumGrp;
struct GroupData GrpDat;
@ -2983,7 +2983,7 @@ static void Brw_GetSelectedGroupData (struct GroupData *GrpDat,bool AbortOnError
static void Brw_ShowDataOwnerAsgWrk (struct Usr_Data *UsrDat)
{
extern const char *Txt_View_record_for_this_course;
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
static Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_STD] = ActSeeRecOneStd,
[Rol_NET] = ActSeeRecOneTch,
@ -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)
{
@ -4137,26 +4137,26 @@ void Brw_SetFullPathInTree (void)
/*****************************************************************************/
// Return true if Gbl.FileBrowser.Clipboard.FilFolLnk.Full can be pasted into Gbl.FileBrowser.FilFolLnk.Full
static bool Brw_CheckIfCanPasteIn (unsigned Level)
static Usr_ICan_t Brw_CheckIfCanPasteIn (unsigned Level)
{
char PathDstWithFile[PATH_MAX + 1 + NAME_MAX + 1];
/***** If not in a folder... *****/
if (Gbl.FileBrowser.FilFolLnk.Type != Brw_IS_FOLDER)
return false;
return Usr_I_CAN_NOT;
/***** If there is nothing in clipboard... *****/
if (Gbl.FileBrowser.Clipboard.FileBrowser == Brw_UNKNOWN)
return false;
return Usr_I_CAN_NOT;
/***** Do not paste a link in marks... *****/
if (Gbl.FileBrowser.Clipboard.FilFolLnk.Type == Brw_IS_LINK &&
Brw_TypeIsAdmMrk[Gbl.FileBrowser.Type])
return false;
return Usr_I_CAN_NOT;
/**** If I can not create elements into this folder... *****/
if (!Brw_CheckIfICanCreateIntoFolder (Level))
return false; // Pasting into top level of assignments is forbidden
if (Brw_CheckIfICanCreateIntoFolder (Level) == Usr_I_CAN_NOT)
return Usr_I_CAN_NOT; // Pasting into top level of assignments is forbidden
/**** If we are in the same tree of the clipboard... *****/
if (Gbl.FileBrowser.Clipboard.IsThisTree) // We are in the same tree of the clipboard ==>
@ -4167,11 +4167,12 @@ static bool Brw_CheckIfCanPasteIn (unsigned Level)
Gbl.FileBrowser.FilFolLnk.Full,
Gbl.FileBrowser.Clipboard.FilFolLnk.Name);
return !Str_Path1BeginsByPath2 (PathDstWithFile,
Gbl.FileBrowser.Clipboard.FilFolLnk.Full);
return Str_Path1BeginsByPath2 (PathDstWithFile,
Gbl.FileBrowser.Clipboard.FilFolLnk.Full) ? Usr_I_CAN_NOT :
Usr_I_CAN;
}
return true; // I can paste
return Usr_I_CAN; // I can paste
}
/*****************************************************************************/
@ -4182,7 +4183,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:
@ -4233,7 +4234,7 @@ static void Brw_PutIconPaste (unsigned Level)
if (Gbl.FileBrowser.FilFolLnk.Type == Brw_IS_FOLDER) // Can't paste in a file or link
{
/* Icon to paste */
if (Brw_CheckIfCanPasteIn (Level))
if (Brw_CheckIfCanPasteIn (Level) == Usr_I_CAN)
{
/***** Form to paste the content of the clipboard *****/
Ico_PutContextualIconToPaste (Brw_ActPaste[Gbl.FileBrowser.Type],
@ -4394,7 +4395,7 @@ static void Brw_PutIconToContractFolder (const char *FileBrowserId,const char *R
static void Brw_PutIconHideUnhide (const char *Anchor,
HidVis_HiddenOrVisible_t HiddenOrVisible)
{
static const Act_Action_t Brw_ActHideUnhide[Brw_NUM_TYPES_FILE_BROWSER][HidVis_NUM_HIDDEN_VISIBLE] =
static Act_Action_t Brw_ActHideUnhide[Brw_NUM_TYPES_FILE_BROWSER][HidVis_NUM_HIDDEN_VISIBLE] =
{
[Brw_UNKNOWN ] = {[HidVis_HIDDEN] = ActUnk ,[HidVis_VISIBLE] = ActUnk },
[Brw_SHOW_DOC_CRS] = {[HidVis_HIDDEN] = ActUnk ,[HidVis_VISIBLE] = ActUnk },
@ -4459,13 +4460,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)
{
@ -4632,8 +4631,7 @@ static void Brw_PutIconFileWithLinkToViewMetadata (const struct Brw_FileMetadata
void Brw_PutIconFile (const char *FileName,
const char *Class,Frm_PutForm_t PutFormToGo)
{
extern const unsigned Ext_NUM_FILE_EXT_ALLOWED;
extern const char *Ext_FileExtensionsAllowed[];
extern const char *Ext_FileExtensionsAllowed[Ext_NUM_FILE_EXT_ALLOWED];
extern const char *Txt_X_file;
char *URL;
char *Icon;
@ -4722,7 +4720,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]);
@ -4936,7 +4934,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,
@ -4971,7 +4969,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,
@ -5024,7 +5022,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,
@ -5090,7 +5088,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,
@ -5771,7 +5769,7 @@ static void Brw_PasteClipboard (struct BrwSiz_BrowserSize *Size)
Pasted.NumFolds = 0;
Gbl.FileBrowser.Clipboard.IsThisTree = Brw_CheckIfClipboardIsInThisTree ();
if (Brw_CheckIfCanPasteIn (Gbl.FileBrowser.Level))
if (Brw_CheckIfCanPasteIn (Gbl.FileBrowser.Level) == Usr_I_CAN)
{
/***** Construct the relative path of the origin file or folder *****/
switch (Gbl.FileBrowser.Clipboard.FileBrowser)
@ -6192,7 +6190,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,
@ -6215,7 +6213,7 @@ void Brw_ShowFormFileBrowser (void)
{
/***** Check if we can paste in this folder *****/
Gbl.FileBrowser.Clipboard.IsThisTree = Brw_CheckIfClipboardIsInThisTree ();
if (Brw_CheckIfCanPasteIn (Gbl.FileBrowser.Level))
if (Brw_CheckIfCanPasteIn (Gbl.FileBrowser.Level) == Usr_I_CAN)
Brw_PutFormToPasteAFileOrFolder (FileNameToShow);
}
@ -6488,7 +6486,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))
{
@ -6588,7 +6586,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))
{
@ -6759,7 +6757,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,
@ -6939,7 +6937,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);
@ -7260,9 +7258,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;
@ -7286,32 +7284,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)
@ -7355,7 +7357,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
@ -7364,7 +7366,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)
@ -7508,14 +7510,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\"");
@ -7585,7 +7587,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 ();
@ -7629,7 +7631,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)
@ -7742,7 +7744,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 ();
@ -7761,32 +7763,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)
@ -7846,7 +7852,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)
@ -7890,7 +7896,7 @@ void Brw_DownloadFile (void)
/*********** Check if I have permission to change file metadata **************/
/*****************************************************************************/
static bool Brw_CheckIfICanEditFileMetadata (long IAmTheOwner)
static Usr_ICan_t Brw_CheckIfICanEditFileMetadata (bool IAmTheOwner)
{
switch (Gbl.Action.Act) // Only in actions where edition is allowed
{
@ -7919,9 +7925,10 @@ static bool Brw_CheckIfICanEditFileMetadata (long 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;
}
}
@ -8090,7 +8097,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 *****/
@ -8659,37 +8666,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
@ -8702,7 +8712,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:
@ -8710,7 +8720,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;
}
@ -8719,59 +8730,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;
}
/*****************************************************************************/
@ -8780,7 +8800,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,
@ -8824,42 +8844,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;
}
/*****************************************************************************/
@ -8870,22 +8890,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;
}
/*****************************************************************************/
@ -8896,7 +8916,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)
{
@ -8904,15 +8924,15 @@ static bool Brw_CheckIfICanModifyPrjAssFileOrFolder (void)
case Rol_NET:
if ((Prj_GetMyRolesInProject (Prj_GetPrjCod ()) & (1 << Prj_ROLE_TUT | // Tutor...
1 << Prj_ROLE_EVL))) // ...or evaluator
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full)); // Am I the publisher of subtree?
return false;
return (Gbl.Usrs.Me.UsrDat.UsrCod == Brw_DB_GetPublisherOfSubtree (Gbl.FileBrowser.FilFolLnk.Full) ? Usr_I_CAN :
Usr_I_CAN_NOT); // Am I the publisher of subtree?
return Usr_I_CAN_NOT;
case Rol_TCH: // Editing teachers in a course can access to all files
case Rol_SYS_ADM:
return true;
return Usr_I_CAN;
default:
return false;
return Usr_I_CAN_NOT;
}
return false;
}
/*****************************************************************************/

View File

@ -117,7 +117,7 @@
#define BrwSiz_MAX_FILES_MARKS_GRP 200
#define BrwSiz_MAX_FOLDS_MARKS_GRP 20
static const unsigned long long BrwSiz_MAX_QUOTA_BRIEF[Rol_NUM_ROLES] = // MaxRole is used
static unsigned long long BrwSiz_MAX_QUOTA_BRIEF[Rol_NUM_ROLES] = // MaxRole is used
{
[Rol_STD] = 32ULL*BrwSiz_GiB,
[Rol_NET] = 32ULL*BrwSiz_GiB,

View File

@ -60,7 +60,7 @@ static struct Bld_Building *Bld_EditingBuilding = NULL; // Static variable to ke
/*****************************************************************************/
static Bld_Order_t Bld_GetParBuildingOrder (void);
static bool Bld_CheckIfICanCreateBuildings (void);
static Usr_ICan_t Bld_CheckIfICanCreateBuildings (void);
static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args);
static void Bld_PutIconToEditBuildings (void);
static void Bld_PutIconsEditingBuildings (__attribute__((unused)) void *Args);
@ -196,9 +196,10 @@ static Bld_Order_t Bld_GetParBuildingOrder (void)
/********************* Check if I can create buildings ***********************/
/*****************************************************************************/
static bool Bld_CheckIfICanCreateBuildings (void)
static Usr_ICan_t Bld_CheckIfICanCreateBuildings (void)
{
return Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM;
return (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ? Usr_I_CAN :
Usr_I_CAN_NOT;
}
/*****************************************************************************/
@ -208,7 +209,7 @@ static bool Bld_CheckIfICanCreateBuildings (void)
static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args)
{
/***** Put icon to edit buildings *****/
if (Bld_CheckIfICanCreateBuildings ())
if (Bld_CheckIfICanCreateBuildings () == Usr_I_CAN)
Bld_PutIconToEditBuildings ();
}
@ -218,8 +219,7 @@ static void Bld_PutIconsListingBuildings (__attribute__((unused)) void *Args)
static void Bld_PutIconToEditBuildings (void)
{
Ico_PutContextualIconToEdit (ActEdiBld,NULL,
NULL,NULL);
Ico_PutContextualIconToEdit (ActEdiBld,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -275,8 +275,7 @@ static void Bld_EditBuildingsInternal (void)
static void Bld_PutIconsEditingBuildings (__attribute__((unused)) void *Args)
{
/***** Put icon to view buildings *****/
Ico_PutContextualIconToView (ActSeeBld,NULL,
NULL,NULL);
Ico_PutContextualIconToView (ActSeeBld,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -388,7 +387,7 @@ void Bld_FreeListBuildings (struct Bld_Buildings *Buildings)
static void Bld_ListBuildingsForEdition (const struct Bld_Buildings *Buildings)
{
static const Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
static Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
{
[Nam_SHRT_NAME] = ActRenBldSho,
[Nam_FULL_NAME] = ActRenBldFul,
@ -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\"");
@ -714,7 +713,7 @@ static void Bld_PutHeadBuildings (void)
/***************** Receive form to create a new building *********************/
/*****************************************************************************/
void Bld_ReceiveFormNewBuilding (void)
void Bld_ReceiveNewBuilding (void)
{
extern const char *Txt_Created_new_building_X;
char *Names[Nam_NUM_SHRT_FULL_NAMES];

View File

@ -92,6 +92,6 @@ void Bld_RenameBuildingFull (void);
void Bld_ChangeBuildingLocation (void);
void Bld_ContEditAfterChgBuilding (void);
void Bld_ReceiveFormNewBuilding (void);
void Bld_ReceiveNewBuilding (void);
#endif

View File

@ -56,7 +56,7 @@ extern struct Globals Gbl;
/***************************** Public constants ******************************/
/*****************************************************************************/
const bool Cal_DayIsValidAsFirstDayOfWeek[7] =
bool Cal_DayIsValidAsFirstDayOfWeek[7] =
{
[0] = true, // monday
[1] = false, // tuesday
@ -332,7 +332,7 @@ void Cal_PutIconToSeeCalendar (void)
void Cal_GetAndShowNumUsrsPerFirstDayOfWeek (void)
{
extern const bool Cal_DayIsValidAsFirstDayOfWeek[7];
extern bool Cal_DayIsValidAsFirstDayOfWeek[7];
extern const char *Hlp_ANALYTICS_Figures_calendar;
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
extern const char *Txt_Calendar;

View File

@ -675,13 +675,12 @@ static void Cfe_ListCallsForExams (struct Cfe_CallsForExams *CallsForExams,
static void Cfe_PutIconsCallsForExams (__attribute__((unused)) void *Args)
{
/***** Icon to create a new call for exam *****/
if (Cfe_CheckIfICanEditCallsForExams ())
if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN)
Ico_PutContextualIconToAdd (ActEdiCfe,NULL,NULL,NULL);
/***** Icon to get resource link *****/
if (Rsc_CheckIfICanGetLink ())
Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL,
NULL,NULL);
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -1457,7 +1456,7 @@ static void Cfe_ShowCallForExam (struct Cfe_CallsForExams *CallsForExams,
static void Cfe_PutIconsCallForExam (void *CallsForExams)
{
static const Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
static Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = ActUnhCfe, // Hidden ==> action to unhide
[HidVis_VISIBLE] = ActHidCfe, // Visible ==> action to hide
@ -1465,7 +1464,7 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams)
if (CallsForExams)
{
if (Cfe_CheckIfICanEditCallsForExams ())
if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN)
{
/***** Icon to remove call for exam *****/
Ico_PutContextualIconToRemove (ActReqRemCfe,NULL,
@ -1499,7 +1498,7 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams)
&((struct Cfe_CallsForExams *) CallsForExams)->ExaCod);
/***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink ())
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkCfe,NULL,
Cfe_PutParExaCod,
&((struct Cfe_CallsForExams *) CallsForExams)->ExaCod);
@ -1510,12 +1509,12 @@ static void Cfe_PutIconsCallForExam (void *CallsForExams)
/******************* Check if I can edit calls for exams *********************/
/*****************************************************************************/
bool Cfe_CheckIfICanEditCallsForExams (void)
Usr_ICan_t Cfe_CheckIfICanEditCallsForExams (void)
{
static const bool ICanEditCallsForExams[Rol_NUM_ROLES] =
static Usr_ICan_t ICanEditCallsForExams[Rol_NUM_ROLES] =
{
[Rol_TCH ] = true,
[Rol_SYS_ADM] = true,
[Rol_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = Usr_I_CAN,
};
return ICanEditCallsForExams[Gbl.Usrs.Me.Role.Logged];

View File

@ -129,7 +129,7 @@ void Cfe_ListCallsForExamsDay (void);
void Cfe_CreateListCallsForExams (struct Cfe_CallsForExams *CallsForExams);
bool Cfe_CheckIfICanEditCallsForExams (void);
Usr_ICan_t Cfe_CheckIfICanEditCallsForExams (void);
void Cfe_GetSummaryAndContentCallForExam (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
char **ContentStr,

View File

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

View File

@ -89,14 +89,14 @@ 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);
static void Ctr_PutFormToCreateCenter (const struct Plc_Places *Places);
static void Ctr_PutHeadCentersForSeeing (bool OrderSelectable);
static void Ctr_PutHeadCentersForEdition (void);
static void Ctr_ReceiveFormRequestOrCreateCtr (Hie_Status_t Status);
static void Ctr_ReceiveRequestOrCreateCtr (Hie_Status_t Status);
static void Ctr_EditingCenterConstructor (void);
static void Ctr_EditingCenterDestructor (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);
@ -726,7 +724,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
{
extern const char *Txt_Another_place;
extern const char *Txt_CENTER_STATUS[Hie_NUM_STATUS_TXT];
static const Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
static Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
{
[Nam_SHRT_NAME] = ActRenCtrSho,
[Nam_FULL_NAME] = ActRenCtrFul,
@ -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;
}
/*****************************************************************************/
@ -1422,33 +1422,33 @@ static void Ctr_PutHeadCentersForEdition (void)
/****************** Receive form to request a new center *********************/
/*****************************************************************************/
void Ctr_ReceiveFormReqCtr (void)
void Ctr_ReceiveReqCtr (void)
{
/***** Center constructor *****/
Ctr_EditingCenterConstructor ();
/***** Receive form to request a new center *****/
Ctr_ReceiveFormRequestOrCreateCtr ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
Ctr_ReceiveRequestOrCreateCtr ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
}
/*****************************************************************************/
/******************* Receive form to create a new center *********************/
/*****************************************************************************/
void Ctr_ReceiveFormNewCtr (void)
void Ctr_ReceiveNewCtr (void)
{
/***** Center constructor *****/
Ctr_EditingCenterConstructor ();
/***** Receive form to create a new center *****/
Ctr_ReceiveFormRequestOrCreateCtr ((Hie_Status_t) 0);
Ctr_ReceiveRequestOrCreateCtr ((Hie_Status_t) 0);
}
/*****************************************************************************/
/************* Receive form to request or create a new center ****************/
/*****************************************************************************/
static void Ctr_ReceiveFormRequestOrCreateCtr (Hie_Status_t Status)
static void Ctr_ReceiveRequestOrCreateCtr (Hie_Status_t Status)
{
extern const char *Txt_Created_new_center_X;
char *Names[Nam_NUM_SHRT_FULL_NAMES];

View File

@ -63,8 +63,8 @@ void Ctr_ChangeCtrWWW (void);
void Ctr_ChangeCtrStatus (void);
void Ctr_ContEditAfterChgCtr (void);
void Ctr_ReceiveFormReqCtr (void);
void Ctr_ReceiveFormNewCtr (void);
void Ctr_ReceiveReqCtr (void);
void Ctr_ReceiveNewCtr (void);
unsigned Ctr_GetCachedNumCtrsWithMapInSys (void);
unsigned Ctr_GetCachedNumCtrsWithMapInCty (long CtyCod);

View File

@ -544,7 +544,7 @@ static void CtrCfg_FreePhotoAttr (char **PhotoAttribution)
static void CtrCfg_Institution (Vie_ViewType_t ViewType,Frm_PutForm_t PutForm)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_HIERARCHY_SINGUL_Abc[Hie_NUM_LEVELS];
unsigned NumIns;
const struct Hie_Node *Ins;
@ -623,7 +623,7 @@ static void CtrCfg_Institution (Vie_ViewType_t ViewType,Frm_PutForm_t PutForm)
static void CtrCfg_Place (Frm_PutForm_t PutForm)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_Place;
extern const char *Txt_Another_place;
struct Plc_Places Places;

View File

@ -633,10 +633,16 @@ 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 (2024-03-20)"
#define Log_PLATFORM_VERSION "SWAD 23.72.1 (2024-04-01)"
#define CSS_FILE "swad23.67.2.css"
#define JS_FILE "swad23.53.6.js"
/*
Version 23.72.1: Apr 01, 2024 New type Usr_ICan_t. (334912 lines)
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)
Version 23.71: Mar 20, 2024 Actions for syllabus unified for lectures and practicals. (334868 lines)
Version 23.70.2: Mar 19, 2024 Changes in course info. (335353 lines)
Version 23.70.1: Mar 19, 2024 Bug fixing in syllabus. (335429 lines)

View File

@ -81,8 +81,6 @@
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t) (30UL * 60UL)) // After these seconds after first pending notification, all pending notifications are sent by email
#define Cfg_GOOGLE_ANALYTICS ""
#elif defined OPENSWAD_ORG // openswad.org ************************
#define Cfg_PLATFORM_SHORT_NAME "OpenSWAD"
@ -118,29 +116,6 @@
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t) (30UL * 60UL)) // After these seconds after first pending notification, all pending notifications are sent by email
/* Google Analytics without cookies.
* This code comes from http://stackoverflow.com/a/19995629
*/
#define Cfg_GOOGLE_ANALYTICS ""
/*
"<script type=\"text/javascript\">" \
" (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){" \
" (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o)," \
" m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)" \
" })(window,document,'script','//www.google-analytics.com/analytics.js','ga');" \
" ga('create', 'UA-40768375-1', 'openswad.org', {" \
" 'anonymizeIp': true," \
" 'storage': 'none'," \
" 'clientId': window.localStorage.getItem('ga_clientId')" \
" });" \
" ga(function(tracker) {" \
" window.localStorage.setItem('ga_clientID', tracker.get('clientId'));" \
" });" \
" ga('send', 'pageview');" \
"</script>"
*/
#elif defined SWAD_UGR_ES // swad.ugr.es *************************
#define Cfg_PLATFORM_SHORT_NAME "SWAD"
@ -176,26 +151,6 @@
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t) (30UL * 60UL)) // After these seconds after first pending notification, all pending notifications are sent by email
#define Cfg_GOOGLE_ANALYTICS ""
/*
"<script type=\"text/javascript\">" \
" (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){" \
" (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o)," \
" m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)" \
" })(window,document,'script','//www.google-analytics.com/analytics.js','ga');" \
" ga('create', 'UA-42150741-1', 'ugr.es', {" \
" 'anonymizeIp': true," \
" 'storage': 'none'," \
" 'clientId': window.localStorage.getItem('ga_clientId')" \
" });" \
" ga(function(tracker) {" \
" window.localStorage.setItem('ga_clientID', tracker.get('clientId'));" \
" });" \
" ga('send', 'pageview');" \
"</script>"
*/
#elif defined SWADBERRY_UGR_ES // swadberry.ugr.es ******************
#define Cfg_PLATFORM_SHORT_NAME "SWADberry"
@ -231,8 +186,6 @@
#define Cfg_TIME_TO_SEND_PENDING_NOTIF ((time_t) (30UL * 60UL)) // After these seconds after first pending notification, all pending notifications are sent by email
#define Cfg_GOOGLE_ANALYTICS ""
#endif
/* Database */
@ -433,14 +386,14 @@
#define Cfg_SYLLABUS_FILENAME "syllabus.xml"
/* Main folders in file browsers */
#define Cfg_CRS_INFO_INTRODUCTION "intro"
#define Cfg_CRS_INFO_TEACHING_GUIDE "description"
#define Cfg_CRS_INFO_LECTURES "teoria"
#define Cfg_CRS_INFO_PRACTICALS "practicas"
#define Cfg_CRS_INFO_BIBLIOGRAPHY "bibliografia"
#define Cfg_CRS_INFO_FAQ "FAQ"
#define Cfg_CRS_INFO_LINKS "enlaces"
#define Cfg_CRS_INFO_ASSESSMENT "evaluacion"
#define Cfg_CRS_INFO_INFORMATION "intro" // TODO: Change to inf
#define Cfg_CRS_INFO_TEACHING_GUIDE "description" // TODO: Change to gui
#define Cfg_CRS_INFO_LECTURES "teoria" // TODO: Change to lec
#define Cfg_CRS_INFO_PRACTICALS "practicas" // TODO: Change to pra
#define Cfg_CRS_INFO_BIBLIOGRAPHY "bibliografia" // TODO: Change to bib
#define Cfg_CRS_INFO_FAQ "FAQ" // TODO: Change to faq
#define Cfg_CRS_INFO_LINKS "enlaces" // TODO: Change to lnk
#define Cfg_CRS_INFO_ASSESSMENT "evaluacion" // TODO: Change to ass
/* RSS folders and files */
#define Cfg_RSS_FOLDER "rss"

View File

@ -523,7 +523,7 @@ static void Con_ShowConnectedUsrsCurrentCrsOneByOneOnRightColumn (Rol_Role_t Rol
static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
{
extern const char *Txt_View_record_for_this_course;
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
static Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_STD] = ActSeeRecOneStd,
[Rol_NET] = ActSeeRecOneTch,
@ -624,7 +624,7 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t Role)
{
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
static Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_STD] = ActSeeRecOneStd,
[Rol_NET] = ActSeeRecOneTch,

View File

@ -463,7 +463,7 @@ static void Cty_ListOneCountryForSeeing (struct Hie_Node *Cty,unsigned NumCty)
static void Cty_PutIconsListingCountries (__attribute__((unused)) void *Args)
{
/***** Put icon to edit countries *****/
if (Cty_CheckIfICanEditCountries ())
if (Cty_CheckIfICanEditCountries () == Usr_I_CAN)
Cty_PutIconToEditCountries ();
/***** Put icon to show a figure *****/
@ -474,9 +474,10 @@ static void Cty_PutIconsListingCountries (__attribute__((unused)) void *Args)
/********************** Check if I can edit countries ************************/
/*****************************************************************************/
bool Cty_CheckIfICanEditCountries (void)
Usr_ICan_t Cty_CheckIfICanEditCountries (void)
{
return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM;
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
Usr_I_CAN_NOT;
}
/*****************************************************************************/
@ -485,8 +486,7 @@ bool Cty_CheckIfICanEditCountries (void)
static void Cty_PutIconToEditCountries (void)
{
Ico_PutContextualIconToEdit (ActEdiCty,NULL,
NULL,NULL);
Ico_PutContextualIconToEdit (ActEdiCty,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -692,8 +692,7 @@ static void Cty_EditCountriesInternal (void)
static void Cty_PutIconsEditingCountries (__attribute__((unused)) void *Args)
{
/***** Put icon to view countries *****/
Ico_PutContextualIconToView (ActSeeCty,NULL,
NULL,NULL);
Ico_PutContextualIconToView (ActSeeCty,NULL,NULL,NULL);
/***** Put icon to show a figure *****/
Fig_PutIconToShowFigure (Fig_HIERARCHY);
@ -1383,7 +1382,7 @@ static void Cty_PutParGoToCty (void *CtyCod)
static void Cty_PutFormToCreateCountry (void)
{
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_STR_LANG_NAME[1 + Lan_NUM_LANGUAGES];
Lan_Language_t Lan;
char StrCtyCod[Cns_MAX_DECIMAL_DIGITS_LONG + 1];
@ -1506,7 +1505,7 @@ static void Cty_PutHeadCountriesForEdition (void)
/******************* Receive form to create a new country ********************/
/*****************************************************************************/
void Cty_ReceiveFormNewCountry (void)
void Cty_ReceiveNewCountry (void)
{
extern const char *Txt_You_must_specify_the_numerical_code_of_the_new_country;
extern const char *Txt_The_numerical_code_X_already_exists;

View File

@ -35,6 +35,7 @@
#include "swad_institution.h"
#include "swad_language.h"
#include "swad_role_type.h"
#include "swad_user.h"
/*****************************************************************************/
/************************** Public types and constants ***********************/
@ -53,7 +54,7 @@ void Cty_ListCountries (void);
void Cty_ListCountries1 (void);
void Cty_ListCountries2 (void);
bool Cty_CheckIfICanEditCountries (void);
Usr_ICan_t Cty_CheckIfICanEditCountries (void);
void Cty_DrawCountryMapAndNameWithLink (struct Hie_Node *Cty,Act_Action_t Action,
const char *ClassContainer,
@ -78,7 +79,7 @@ void Cty_RemoveCountry (void);
void Cty_RenameCountry (void);
void Cty_ChangeCtyWWW (void);
void Cty_ContEditAfterChgCty (void);
void Cty_ReceiveFormNewCountry (void);
void Cty_ReceiveNewCountry (void);
unsigned Cty_GetCachedNumCtysWithUsrs (Rol_Role_t Role);

View File

@ -341,7 +341,7 @@ static void CtyCfg_MapImage (Vie_ViewType_t ViewType,Hie_PutLink_t PutLink)
HTM_DIV_End ();
/***** Map attribution *****/
if (ViewType == Vie_VIEW && Cty_CheckIfICanEditCountries ())
if (ViewType == Vie_VIEW && Cty_CheckIfICanEditCountries () == Usr_I_CAN)
{
HTM_DIV_Begin ("class=\"CM\"");
Frm_BeginForm (ActChgCtyMapAtt);

View File

@ -100,11 +100,11 @@ 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);
static void Crs_ReceiveFormRequestOrCreateCrs (Hie_Status_t Status);
static void Crs_ReceiveRequestOrCreateCrs (Hie_Status_t Status);
static void Crs_GetParsNewCourse (struct Hie_Node *Crs);
static void Crs_GetCourseDataFromRow (MYSQL_RES *mysql_res,
@ -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);
@ -653,7 +651,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
{
extern const char *Txt_YEAR_OF_DEGREE[1 + Deg_MAX_YEARS_PER_DEGREE];
extern const char *Txt_COURSE_STATUS[Hie_NUM_STATUS_TXT];
static const Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
static Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
{
[Nam_SHRT_NAME] = ActRenCrsSho,
[Nam_FULL_NAME] = ActRenCrsFul,
@ -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;
}
/*****************************************************************************/
@ -942,33 +942,33 @@ static void Crs_PutHeadCoursesForEdition (void)
/****************** Receive form to request a new course *********************/
/*****************************************************************************/
void Crs_ReceiveFormReqCrs (void)
void Crs_ReceiveReqCrs (void)
{
/***** Course constructor *****/
Crs_EditingCourseConstructor ();
/***** Receive form to request a new course *****/
Crs_ReceiveFormRequestOrCreateCrs ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
Crs_ReceiveRequestOrCreateCrs ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
}
/*****************************************************************************/
/******************* Receive form to create a new course *********************/
/*****************************************************************************/
void Crs_ReceiveFormNewCrs (void)
void Crs_ReceiveNewCrs (void)
{
/***** Course constructor *****/
Crs_EditingCourseConstructor ();
/***** Receive form to create a new course *****/
Crs_ReceiveFormRequestOrCreateCrs ((Hie_Status_t) 0);
Crs_ReceiveRequestOrCreateCrs ((Hie_Status_t) 0);
}
/*****************************************************************************/
/************* Receive form to request or create a new course ****************/
/*****************************************************************************/
static void Crs_ReceiveFormRequestOrCreateCrs (Hie_Status_t Status)
static void Crs_ReceiveRequestOrCreateCrs (Hie_Status_t Status)
{
extern const char *Txt_Created_new_course_X;
extern const char *Txt_The_year_X_is_not_allowed;
@ -1052,7 +1052,7 @@ void Crs_RemoveCourse (void)
/***** Get data of the course from database *****/
Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs);
if (!Crs_CheckIfICanEdit (Crs_EditingCrs))
if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Check if this course has users *****/
@ -1295,7 +1295,7 @@ void Crs_ChangeInsCrsCod (void)
/* Get data of the course */
Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs);
if (!Crs_CheckIfICanEdit (Crs_EditingCrs))
if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Change the institutional course code *****/
@ -1340,7 +1340,7 @@ void Crs_ChangeCrsYear (void)
/* Get data of the course */
Hie_GetDataByCod[Hie_CRS] (Crs_EditingCrs);
if (!Crs_CheckIfICanEdit (Crs_EditingCrs))
if (Crs_CheckIfICanEdit (Crs_EditingCrs) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
if (NewYear <= Deg_MAX_YEARS_PER_DEGREE) // If year is valid
@ -1445,7 +1445,7 @@ void Crs_RenameCourse (struct Hie_Node *Crs,Nam_ShrtOrFullName_t ShrtOrFull)
/***** Get from the database the data of the degree *****/
Hie_GetDataByCod[Hie_CRS] (Crs);
if (!Crs_CheckIfICanEdit (Crs))
if (Crs_CheckIfICanEdit (Crs) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Check if new name is empty *****/

View File

@ -59,8 +59,8 @@ void Crs_WriteSelectorMyCoursesInBreadcrumb (void);
void Crs_EditCourses (void);
void Crs_ReceiveFormReqCrs (void);
void Crs_ReceiveFormNewCrs (void);
void Crs_ReceiveReqCrs (void);
void Crs_ReceiveNewCrs (void);
void Crs_RemoveCourse (void);
bool Crs_GetCourseDataByCod (struct Hie_Node *Crs);

View File

@ -201,7 +201,7 @@ void CrsCfg_PrintConfiguration (void)
static void CrsCfg_Degree (Vie_ViewType_t ViewType,Frm_PutForm_t PutForm)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_HIERARCHY_SINGUL_Abc[Hie_NUM_LEVELS];
unsigned NumDeg;
const struct Hie_Node *Deg;

View File

@ -74,7 +74,7 @@ const char *Dat_TimeStatusClass[Dat_NUM_TIME_STATUS][HidVis_NUM_HIDDEN_VISIBLE]
/**************************** Private constants ******************************/
/*****************************************************************************/
static const unsigned Dat_NumDaysMonth[1 + 12] =
static unsigned Dat_NumDaysMonth[1 + 12] =
{
[ 0] = 0,
[ 1] = 31, // January
@ -1098,7 +1098,7 @@ void Dat_GetDateFromForm (const char *ParNameDay,const char *ParNameMonth,const
/******* Set initial date to distant past and end date to current date *******/
/*****************************************************************************/
void Dat_SetIniEndDatesToPastAndNow (void)
void Dat_SetDatesToPastAndNow (void)
{
Dat_Time.Range.TimeUTC[Dat_STR_TIME] = (time_t) 0;
Dat_Time.Range.TimeUTC[Dat_END_TIME] = Dat_GetStartExecutionTimeUTC ();
@ -1109,7 +1109,7 @@ void Dat_SetIniEndDatesToPastAndNow (void)
/************ and set initial date to end date minus several days ************/
/*****************************************************************************/
void Dat_SetIniEndDatesToRecentWeeks (void)
void Dat_SetDatesToRecentWeeks (void)
{
Dat_Time.Range.TimeUTC[Dat_END_TIME] = Dat_GetStartExecutionTimeUTC ();
Dat_Time.Range.TimeUTC[Dat_STR_TIME] = Dat_Time.Range.TimeUTC[Dat_END_TIME] -

View File

@ -190,8 +190,8 @@ void Dat_WriteFormDate (unsigned FirstYear,unsigned LastYear,
void Dat_GetDateFromForm (const char *ParNameDay,const char *ParNameMonth,const char *ParNameYear,
unsigned *Day,unsigned *Month,unsigned *Year);
void Dat_SetIniEndDatesToPastAndNow (void);
void Dat_SetIniEndDatesToRecentWeeks (void);
void Dat_SetDatesToPastAndNow (void);
void Dat_SetDatesToRecentWeeks (void);
void Dat_WriteParsIniEndDates (void);
void Dat_GetIniEndDatesFromForm (void);

View File

@ -84,7 +84,7 @@ static struct Hie_Node *Deg_EditingDeg = NULL; // Static variable to keep the de
/*****************************************************************************/
static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes);
static bool Deg_CheckIfICanEditADegree (struct Hie_Node *Deg);
static Usr_ICan_t Deg_CheckIfICanEditADegree (struct Hie_Node *Deg);
static void Deg_PutFormToCreateDegree (const struct DegTyp_DegTypes *DegTypes);
static void Deg_PutHeadDegreesForSeeing (void);
static void Deg_PutHeadDegreesForEdition (void);
@ -97,7 +97,7 @@ static void Deg_ListOneDegreeForSeeing (struct Hie_Node *Deg,unsigned NumDeg);
static void Deg_EditDegreesInternal (void);
static void Deg_PutIconsEditingDegrees (__attribute__((unused)) void *Args);
static void Deg_ReceiveFormRequestOrCreateDeg (Hie_Status_t Status);
static void Deg_ReceiveRequestOrCreateDeg (Hie_Status_t Status);
static void Deg_GetDegreeDataFromRow (MYSQL_RES *mysql_res,
struct Hie_Node *Deg);
@ -314,7 +314,7 @@ void Deg_ShowDegsOfCurrentCtr (void)
static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
{
extern const char *Txt_DEGREE_STATUS[Hie_NUM_STATUS_TXT];
static const Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
static Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
{
[Nam_SHRT_NAME] = ActRenDegSho,
[Nam_FULL_NAME] = ActRenDegFul,
@ -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);
}
@ -999,33 +998,33 @@ void Deg_FreeListAllDegsWithStds (struct Hie_List *Degs)
/****************** Receive form to request a new degree *********************/
/*****************************************************************************/
void Deg_ReceiveFormReqDeg (void)
void Deg_ReceiveReqDeg (void)
{
/***** Degree constructor *****/
Deg_EditingDegreeConstructor ();
/***** Receive form to request a new degree *****/
Deg_ReceiveFormRequestOrCreateDeg ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
Deg_ReceiveRequestOrCreateDeg ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
}
/*****************************************************************************/
/******************* Receive form to create a new degree *********************/
/*****************************************************************************/
void Deg_ReceiveFormNewDeg (void)
void Deg_ReceiveNewDeg (void)
{
/***** Degree constructor *****/
Deg_EditingDegreeConstructor ();
/***** Receive form to create a new degree *****/
Deg_ReceiveFormRequestOrCreateDeg ((Hie_Status_t) 0);
Deg_ReceiveRequestOrCreateDeg ((Hie_Status_t) 0);
}
/*****************************************************************************/
/******************* Receive form to create a new degree *********************/
/*****************************************************************************/
static void Deg_ReceiveFormRequestOrCreateDeg (Hie_Status_t Status)
static void Deg_ReceiveRequestOrCreateDeg (Hie_Status_t Status)
{
extern const char *Txt_Created_new_degree_X;
char *Names[Nam_NUM_SHRT_FULL_NAMES];

View File

@ -66,8 +66,8 @@ void Deg_GetListAllDegsWithStds (struct Hie_List *Degs);
void Deg_GetListDegsInCurrentCtr (void);
void Deg_FreeListAllDegsWithStds (struct Hie_List *Degs);
void Deg_ReceiveFormReqDeg (void);
void Deg_ReceiveFormNewDeg (void);
void Deg_ReceiveReqDeg (void);
void Deg_ReceiveNewDeg (void);
void Deg_RemoveDegree (void);
bool Deg_GetDegreeDataByCod (struct Hie_Node *Node);

View File

@ -194,7 +194,7 @@ static void DegCfg_PutIconsToPrintAndUpload (__attribute__((unused)) void *Args)
static void DegCfg_Center (Vie_ViewType_t ViewType,Frm_PutForm_t PutForm)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_HIERARCHY_SINGUL_Abc[Hie_NUM_LEVELS];
unsigned NumCtr;
const struct Hie_Node *Ctr;

View File

@ -287,8 +287,7 @@ static void DegTyp_EditDegreeTypesInternal (const struct DegTyp_DegTypes *DegTyp
static void DegTyp_PutIconsEditingDegreeTypes (__attribute__((unused)) void *Args)
{
/***** Put icon to view degree types *****/
Ico_PutContextualIconToView (ActSeeDegTyp,NULL,
NULL,NULL);
Ico_PutContextualIconToView (ActSeeDegTyp,NULL,NULL,NULL);
/***** Put icon to view degrees *****/
Deg_PutIconToViewDegrees ();
@ -303,8 +302,7 @@ static void DegTyp_PutIconsEditingDegreeTypes (__attribute__((unused)) void *Arg
void DegTyp_PutIconToViewDegreeTypes (void)
{
Lay_PutContextualLinkOnlyIcon (ActSeeDegTyp,NULL,
NULL,NULL,
Lay_PutContextualLinkOnlyIcon (ActSeeDegTyp,NULL,NULL,NULL,
"sitemap.svg",Ico_BLACK);
}
@ -375,9 +373,8 @@ static void DegTyp_PutIconsListingDegTypes (__attribute__((unused)) void *Args)
static void DegTyp_PutIconToEditDegTypes (__attribute__((unused)) void *Args)
{
if (Gbl.Hierarchy.Level == Hie_CTR && // Only editable if center tab is visible
DegTyp_CheckIfICanCreateDegreeTypes ())
Ico_PutContextualIconToEdit (ActEdiDegTyp,NULL,
NULL,NULL);
DegTyp_CheckIfICanCreateDegreeTypes () == Usr_I_CAN)
Ico_PutContextualIconToEdit (ActEdiDegTyp,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -445,9 +442,10 @@ static void DegTyp_ListDegreeTypesForEdition (const struct DegTyp_DegTypes *DegT
/******************** Check if I can create degree types *********************/
/*****************************************************************************/
bool DegTyp_CheckIfICanCreateDegreeTypes (void)
Usr_ICan_t DegTyp_CheckIfICanCreateDegreeTypes (void)
{
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
Usr_I_CAN_NOT;
}
/*****************************************************************************/
@ -637,7 +635,7 @@ void DegTyp_FreeListDegreeTypes (struct DegTyp_DegTypes *DegTypes)
/***************** Receive form to create a new degree type ******************/
/*****************************************************************************/
void DegTyp_ReceiveFormNewDegreeType (void)
void DegTyp_ReceiveNewDegreeType (void)
{
extern const char *Txt_The_type_of_degree_X_already_exists;
extern const char *Txt_Created_new_type_of_degree_X;

View File

@ -73,13 +73,13 @@ 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);
void DegTyp_FreeListDegreeTypes (struct DegTyp_DegTypes *DegTypes);
void DegTyp_ReceiveFormNewDegreeType (void);
void DegTyp_ReceiveNewDegreeType (void);
void DegTyp_RemoveDegreeType (void);

View File

@ -53,7 +53,7 @@
/****************************** Private constants ****************************/
/*****************************************************************************/
static const bool Dpt_ICanEditDpts[Rol_NUM_ROLES] =
static bool Dpt_ICanEditDpts[Rol_NUM_ROLES] =
{
/* Users who can edit */
[Rol_INS_ADM] = true,
@ -244,8 +244,7 @@ static Dpt_Order_t Dpt_GetParDptOrder (void)
static void Dpt_PutIconToEditDpts (__attribute__((unused)) void *Args)
{
if (Dpt_ICanEditDpts[Gbl.Usrs.Me.Role.Logged])
Ico_PutContextualIconToEdit (ActEdiDpt,NULL,
NULL,NULL);
Ico_PutContextualIconToEdit (ActEdiDpt,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -254,8 +253,7 @@ static void Dpt_PutIconToEditDpts (__attribute__((unused)) void *Args)
static void Dpt_PutIconToViewDpts (__attribute__((unused)) void *Args)
{
Ico_PutContextualIconToView (ActSeeDpt,NULL,
NULL,NULL);
Ico_PutContextualIconToView (ActSeeDpt,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -441,7 +439,7 @@ static void Dpt_GetDepartmentDataFromRow (MYSQL_RES *mysql_res,
static void Dpt_ListDepartmentsForEdition (const struct Dpt_Departments *Departments)
{
extern const char *Txt_Another_institution;
static const Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
static Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
{
[Nam_SHRT_NAME] = ActRenDptSho,
[Nam_FULL_NAME] = ActRenDptFul,
@ -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\"");
@ -862,7 +860,7 @@ static void Dpt_PutHeadDepartments (void)
/***************** Receive form to create a new department *******************/
/*****************************************************************************/
void Dpt_ReceiveFormNewDpt (void)
void Dpt_ReceiveNewDpt (void)
{
extern const char *Txt_Created_new_department_X;
char *Names[Nam_NUM_SHRT_FULL_NAMES];

View File

@ -73,7 +73,7 @@ void Dpt_RenameDepartFull (void);
void Dpt_ChangeDptWWW (void);
void Dpt_ContEditAfterChgDpt (void);
void Dpt_ReceiveFormNewDpt (void);
void Dpt_ReceiveNewDpt (void);
unsigned Dpt_GetTotalNumberOfDepartments (void);
void Dpt_FlushCacheNumDptsInIns (void);
unsigned Dpt_GetNumDptsInIns (long InsCod);

View File

@ -311,7 +311,7 @@ static void Dup_ListSimilarUsrs (void)
Usr_NUM_MAIN_FIELDS_DATA_USR-2,
The_GetColorRows ());
/* Button to remove this user */
if (Acc_CheckIfICanEliminateAccount (UsrDat.UsrCod))
if (Acc_CheckIfICanEliminateAccount (UsrDat.UsrCod) == Usr_I_CAN)
Dup_PutButtonToEliminateUsrAccount (&UsrDat);
/* Button to remove from list of possible duplicate users */
if (Dup_DB_CheckIfUsrIsDup (UsrDat.UsrCod))

View File

@ -111,7 +111,7 @@ static void Enr_ShowFormRegRemSeveralUsrs (Rol_Role_t Role);
static void Enr_PutAreaToEnterUsrsIDs (void);
static void Enr_PutActionsRegRemSeveralUsrs (void);
static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role);
static void Enr_ReceiveUsrsCrs (Rol_Role_t Role);
static void Enr_PutActionModifyOneUsr (bool *OptionChecked,
bool UsrBelongsToCrs,Usr_MeOrOther_t MeOrOther);
@ -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,
@ -173,7 +173,7 @@ void Enr_CheckStdsAndPutButtonToRegisterStdsInCurrentCrs (void)
/*****************************************************************************/
void Enr_PutButtonInlineToRegisterStds (long CrsCod,
unsigned Level,Lay_LastItem_t IsLastItemInLevel[],
unsigned Level,const Lay_LastItem_t *IsLastItemInLevel,
Lay_Highlight_t Highlight)
{
extern const char *Lay_HighlightClass[Lay_NUM_HIGHLIGHT];
@ -873,22 +873,22 @@ static void Enr_PutActionsRegRemSeveralUsrs (void)
/******* Receive the list of users of the course to register/remove **********/
/*****************************************************************************/
void Enr_ReceiveFormAdminStds (void)
void Enr_ReceiveAdminStds (void)
{
Enr_ReceiveFormUsrsCrs (Rol_STD);
Enr_ReceiveUsrsCrs (Rol_STD);
}
void Enr_ReceiveFormAdminNonEditTchs (void)
void Enr_ReceiveAdminNonEditTchs (void)
{
Enr_ReceiveFormUsrsCrs (Rol_NET);
Enr_ReceiveUsrsCrs (Rol_NET);
}
void Enr_ReceiveFormAdminTchs (void)
void Enr_ReceiveAdminTchs (void)
{
Enr_ReceiveFormUsrsCrs (Rol_TCH);
Enr_ReceiveUsrsCrs (Rol_TCH);
}
static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
static void Enr_ReceiveUsrsCrs (Rol_Role_t Role)
{
extern const char *Txt_In_a_type_of_group_with_single_enrolment_students_can_not_be_registered_in_more_than_one_group;
extern const char *Txt_No_user_has_been_eliminated;
@ -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;
@ -2121,7 +2121,7 @@ static void Enr_ShowEnrolmentRequestsGivenRoles (unsigned RolesSelected)
bool UsrExists;
bool UsrBelongsToCrs;
Rol_Role_t DesiredRole;
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
static Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_STD] = ActReqMdfStd,
[Rol_NET] = ActReqMdfNET,
@ -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
@ -2461,7 +2459,7 @@ static void Enr_ReqAnotherUsrIDToRegisterRemove (Rol_Role_t Role)
{
extern const char *Hlp_USERS_Administration_administer_one_user;
extern const char *Txt_Administer_one_user;
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
static Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_GST] = ActReqMdfOth,
[Rol_STD] = ActReqMdfStd,
@ -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;
}
}
@ -2775,7 +2774,7 @@ void Enr_CreateNewUsr1 (void)
extern const char *Txt_The_ID_X_is_not_valid;
Rol_Role_t OldRole;
Rol_Role_t NewRole;
static const Act_Action_t Action[Rol_NUM_ROLES] =
static Act_Action_t Action[Rol_NUM_ROLES] =
{
[Rol_GST] = ActCreOth,
[Rol_STD] = ActCreStd,
@ -2877,7 +2876,7 @@ void Enr_ModifyUsr1 (void)
Usr_MeOrOther_t MeOrOther;
Rol_Role_t OldRole;
Rol_Role_t NewRole;
static const Act_Action_t Action[Rol_NUM_ROLES] =
static Act_Action_t Action[Rol_NUM_ROLES] =
{
[Rol_GST] = ActUpdOth,
[Rol_STD] = ActUpdStd,
@ -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:
@ -3083,7 +3082,7 @@ static void Enr_AskIfRemoveUsrFromCrs (struct Usr_Data *UsrDat)
extern const char *Txt_Remove_me_from_this_course;
extern const char *Txt_Remove_user_from_this_course;
Usr_MeOrOther_t MeOrOther;
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
static Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_STD] = ActRemStdCrs,
[Rol_NET] = ActRemNETCrs,

View File

@ -75,7 +75,7 @@ typedef enum
void Enr_CheckStdsAndPutButtonToRegisterStdsInCurrentCrs (void);
void Enr_PutButtonInlineToRegisterStds (long CrsCod,
unsigned Level,Lay_LastItem_t IsLastItemInLevel[],
unsigned Level,const Lay_LastItem_t *IsLastItemInLevel,
Lay_Highlight_t Highlight);
void Enr_PutLinkToRequestSignUp (void);
@ -99,9 +99,9 @@ void Enr_PutLinkToRemOldUsrs (void);
void Enr_AskRemoveOldUsrs (void);
void Enr_RemoveOldUsrs (void);
void Enr_ReceiveFormAdminStds (void);
void Enr_ReceiveFormAdminNonEditTchs (void);
void Enr_ReceiveFormAdminTchs (void);
void Enr_ReceiveAdminStds (void);
void Enr_ReceiveAdminNonEditTchs (void);
void Enr_ReceiveAdminTchs (void);
bool Enr_PutActionsRegRemOneUsr (Usr_MeOrOther_t MeOrOther);

View File

@ -315,12 +315,12 @@ void Exa_ListAllExams (struct Exa_Exams *Exams)
/************************ Check if I can edit exams **************************/
/*****************************************************************************/
bool Exa_CheckIfICanEditExams (void)
Usr_ICan_t Exa_CheckIfICanEditExams (void)
{
static const bool ICanEditExams[Rol_NUM_ROLES] =
static Usr_ICan_t ICanEditExams[Rol_NUM_ROLES] =
{
[Rol_TCH ] = true,
[Rol_SYS_ADM] = true,
[Rol_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = Usr_I_CAN,
};
return ICanEditExams[Gbl.Usrs.Me.Role.Logged];
@ -332,7 +332,7 @@ bool Exa_CheckIfICanEditExams (void)
static void Exa_PutIconsListExams (void *Exams)
{
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
static Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_STD ] = ActSeeMyExaResCrs,
[Rol_NET ] = ActReqSeeUsrExaRes,
@ -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);
}
/*****************************************************************************/
@ -658,12 +656,12 @@ static void Exa_PutParExamOrder (Exa_Order_t SelectedOrder)
static void Exa_PutIconsToRemEditOneExam (struct Exa_Exams *Exams,
const char *Anchor)
{
static const Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
static Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = ActUnhExa, // Hidden ==> action to unhide
[HidVis_VISIBLE] = ActHidExa, // Visible ==> action to hide
};
static const Act_Action_t ActionShowResults[Rol_NUM_ROLES] =
static Act_Action_t ActionShowResults[Rol_NUM_ROLES] =
{
[Rol_STD ] = ActSeeMyExaResExa,
[Rol_NET ] = ActSeeUsrExaResExa,
@ -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);
}
/*****************************************************************************/
@ -804,7 +800,7 @@ void Exa_GetListExams (struct Exa_Exams *Exams,Exa_Order_t SelectedOrder)
void Exa_GetListSelectedExaCods (struct Exa_Exams *Exams)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
unsigned MaxSizeListExaCodsSelected;
unsigned NumExam;
const char *Ptr;
@ -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 *****/
@ -1253,12 +1249,12 @@ void Exa_PutFormsOneExam (struct Exa_Exams *Exams,
extern const char *Hlp_ASSESSMENT_Exams_edit_exam;
extern const char *Hlp_ASSESSMENT_Exams_new_exam;
extern const char *Txt_Exam;
static void (*FunctionToDrawContextualIcons[]) (void *Args) =
static void (*FunctionToDrawContextualIcons[Exa_NUM_EXISTING_NEW_EXAM]) (void *Args) =
{
[Exa_EXISTING_EXAM] = Exa_PutIconsEditingOneExam,
[Exa_NEW_EXAM ] = NULL,
};
static const char **HelpLink[] =
static const char **HelpLink[Exa_NUM_EXISTING_NEW_EXAM] =
{
[Exa_EXISTING_EXAM] = &Hlp_ASSESSMENT_Exams_edit_exam,
[Exa_NEW_EXAM ] = &Hlp_ASSESSMENT_Exams_new_exam,
@ -1317,17 +1313,17 @@ static void Exa_PutFormEditionExam (struct Exa_Exams *Exams,
extern const char *Txt_Description;
extern const char *Txt_Save_changes;
extern const char *Txt_Create;
static const Act_Action_t NextAction[] =
static Act_Action_t NextAction[Exa_NUM_EXISTING_NEW_EXAM] =
{
[Exa_EXISTING_EXAM] = ActChgExa,
[Exa_NEW_EXAM ] = ActNewExa,
};
static Btn_Button_t Button[] =
static Btn_Button_t Button[Exa_NUM_EXISTING_NEW_EXAM] =
{
[Exa_EXISTING_EXAM] = Btn_CONFIRM_BUTTON,
[Exa_NEW_EXAM ] = Btn_CREATE_BUTTON,
};
const char *TxtButton[] =
const char *TxtButton[Exa_NUM_EXISTING_NEW_EXAM] =
{
[Exa_EXISTING_EXAM] = Txt_Save_changes,
[Exa_NEW_EXAM ] = Txt_Create,
@ -1420,14 +1416,14 @@ static void Exa_PutFormEditionExam (struct Exa_Exams *Exams,
/********************** Receive form to create a new exam ********************/
/*****************************************************************************/
void Exa_ReceiveFormExam (void)
void Exa_ReceiveExam (void)
{
struct Exa_Exams Exams;
Exa_ExistingNewExam_t ExistingNewExam;
char Txt[Cns_MAX_BYTES_TEXT + 1];
/***** Check if I can edit exams *****/
if (!Exa_CheckIfICanEditExams ())
if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Reset exams context *****/
@ -1553,20 +1549,6 @@ static void Exa_UpdateExam (struct Exa_Exam *Exam,const char *Txt)
Ale_ShowAlert (Ale_SUCCESS,Txt_The_exam_has_been_modified);
}
/*****************************************************************************/
/********** Get number of sessions and check is edition is possible **********/
/*****************************************************************************/
// Before calling this function, number of sessions must be calculated
bool Exa_CheckIfEditable (const struct Exa_Exam *Exam)
{
if (Exa_CheckIfICanEditExams ())
/***** Questions are editable only if exam has no sessions *****/
return Exam->NumSess == 0; // Exams with sessions should not be edited
else
return false; // Questions are not editable
}
/*****************************************************************************/
/*************************** Show stats about exams **************************/
/*****************************************************************************/

View File

@ -28,6 +28,7 @@
/*****************************************************************************/
#include "swad_exam_type.h"
#include "swad_user.h"
/*****************************************************************************/
/***************************** Public prototypes *****************************/
@ -39,7 +40,7 @@ void Exa_ResetExam (struct Exa_Exam *Exam);
void Exa_SeeAllExams (void);
void Exa_ListAllExams (struct Exa_Exams *Exams);
bool Exa_CheckIfICanEditExams (void);
Usr_ICan_t Exa_CheckIfICanEditExams (void);
void Exa_SeeOneExam (void);
void Exa_ShowOnlyOneExam (struct Exa_Exams *Exams,Frm_PutForm_t PutFormSession);
@ -68,9 +69,7 @@ void Exa_ReqCreatOrEditExam (void);
void Exa_PutFormsOneExam (struct Exa_Exams *Exams,
Exa_ExistingNewExam_t ExistingNewExam);
void Exa_ReceiveFormExam (void);
bool Exa_CheckIfEditable (const struct Exa_Exam *Exam);
void Exa_ReceiveExam (void);
//-------------------------------- Figures ------------------------------------
void Exa_GetAndShowExamsStats (void);

View File

@ -1668,7 +1668,7 @@ unsigned Exa_DB_GetGrpsAssociatedToSes (MYSQL_RES **mysql_res,long SesCod)
/*** Check if I belong to any of the groups associated to the exam session ***/
/*****************************************************************************/
bool Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
Usr_ICan_t Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
{
return
DB_QueryEXISTS ("can not check if I can play an exam session",
@ -1686,7 +1686,8 @@ bool Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
" WHERE grp_users.UsrCod=%ld"
" AND grp_users.GrpCod=exa_groups.GrpCod)))",
SesCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN :
Usr_I_CAN_NOT;
}
/*****************************************************************************/
@ -2150,6 +2151,12 @@ bool Exa_DB_CheckIfUserAgentIsTheSameAsTheLast (long PrnCod,const char *UserAgen
void Exa_DB_LogAccess (long LogCod,long PrnCod,ExaLog_Action_t Action)
{
static char YN[Usr_NUM_I_CAN] =
{
[Usr_I_CAN_NOT] = 'N',
[Usr_I_CAN ] = 'Y',
};
/* Log access in exam log.
Redundant data (also present in log table) are stored for speed */
DB_QueryINSERT ("can not log exam access",
@ -2161,8 +2168,7 @@ void Exa_DB_LogAccess (long LogCod,long PrnCod,ExaLog_Action_t Action)
PrnCod,
(unsigned) Action,
ExaLog_GetQstInd (),
ExaLog_GetIfCanAnswer () ? 'Y' :
'N',
YN[ExaLog_GetIfCanAnswer ()],
// NOW() Redundant, for speed
Par_GetIP ()); // Redundant, for speed
}

View File

@ -128,7 +128,7 @@ void Exa_DB_RemoveUsrFromSessionTablesInCrs (long UsrCod,long CrsCod);
//--------------------------------- Groups ------------------------------------
void Exa_DB_CreateGrpAssociatedToSes (long SesCod,long GrpCod);
unsigned Exa_DB_GetGrpsAssociatedToSes (MYSQL_RES **mysql_res,long SesCod);
bool Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod);
Usr_ICan_t Exa_DB_CheckIfICanListThisSessionBasedOnGrps (long SesCod);
void Exa_DB_RemoveAllGrpsFromExa (long ExaCod);
void Exa_DB_RemoveAllGrpsFromCrs (long CrsCod);
void Exa_DB_RemoveAllGrpsFromSes (long SesCod);

View File

@ -54,7 +54,7 @@ static struct
long PrnCod; // Exam print code
int QstInd; // Exam print question index
ExaLog_Action_t Action; // Action performed by user
bool ICanAnswer; // Exam print is open and accesible to answer by the user
Usr_ICan_t ICanAnswer; // Exam print is open and accesible to answer by the user
} ExaLog_Log =
{
.PrnCod = -1L, // -1 means no print code set
@ -116,12 +116,12 @@ int ExaLog_GetQstInd (void)
/************* Set and get if exam print is open and accessible **************/
/*****************************************************************************/
void ExaLog_SetIfCanAnswer (bool ICanAnswer)
void ExaLog_SetIfCanAnswer (Usr_ICan_t ICanAnswer)
{
ExaLog_Log.ICanAnswer = ICanAnswer;
}
bool ExaLog_GetIfCanAnswer (void)
Usr_ICan_t ExaLog_GetIfCanAnswer (void)
{
return ExaLog_Log.ICanAnswer;
}

View File

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

View File

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

View File

@ -69,8 +69,8 @@ extern struct Globals Gbl;
struct ExaRes_ICanView
{
bool Result;
bool Score;
Usr_ICan_t Result;
Usr_ICan_t Score;
};
/*****************************************************************************/
@ -292,7 +292,7 @@ static void ExaRes_PutFormToSelUsrsToViewResults (__attribute__((unused)) void *
Txt_Results,
Hlp_ASSESSMENT_Exams_results,
Txt_View_results,
false); // Do not put form with date range
Frm_DONT_PUT_FORM); // Do not put form with date range
}
/*****************************************************************************/
@ -358,7 +358,7 @@ static void ExaRes_ListAllResultsInSelectedExams (struct Exa_Exams *Exams)
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS))
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{
/***** Show sessions results *****/
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
@ -424,7 +424,7 @@ static void ExaRes_ListAllResultsInExa (struct Exa_Exams *Exams)
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS))
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{
/***** Show sessions results *****/
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
@ -495,7 +495,7 @@ static void ExaRes_ListAllResultsInSes (struct Exa_Exams *Exams,long SesCod)
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS))
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanViewTstExaMchResult (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{
/***** Show sessions results *****/
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
@ -554,7 +554,7 @@ static void ExaRes_ShowResultsEnd (void)
static void ExaRes_ListExamsToSelect (struct Exa_Exams *Exams)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_Exams;
extern const char *Txt_Exam;
extern const char *Txt_Update_results;
@ -831,7 +831,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_End ();
/* Get and accumulate questions and score */
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{
/* Get questions and user's answers of exam print from database */
ExaPrn_GetPrintQuestionsFromDB (&Print);
@ -852,7 +852,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
HTM_Unsigned (Print.NumQsts.All);
else
Ico_PutIconNotVisible ();
@ -862,7 +862,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_GREEN_%s %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{
if (Print.NumQsts.Valid.Total)
HTM_Unsigned (Print.NumQsts.Valid.Total);
@ -877,7 +877,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_RED_%s %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{
NumQstsInvalid = Print.NumQsts.All - Print.NumQsts.Valid.Total;
if (NumQstsInvalid)
@ -893,7 +893,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{
if (Print.NumQsts.Valid.Correct)
HTM_Unsigned (Print.NumQsts.Valid.Correct);
@ -908,7 +908,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{
if (Print.NumQsts.Valid.Wrong.Negative)
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Negative);
@ -922,7 +922,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{
if (Print.NumQsts.Valid.Wrong.Zero)
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Zero);
@ -936,7 +936,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{
if (Print.NumQsts.Valid.Wrong.Positive)
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Positive);
@ -951,7 +951,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{
if (Print.NumQsts.Valid.Blank)
HTM_Unsigned (Print.NumQsts.Valid.Blank);
@ -966,7 +966,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{
HTM_Double2Decimals (Print.Score.Valid);
HTM_Txt ("/");
@ -980,7 +980,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
HTM_Double2Decimals (Print.NumQsts.Valid.Total ? Print.Score.Valid /
(double) Print.NumQsts.Valid.Total :
0.0);
@ -992,7 +992,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (),
The_GetColorRows ());
if (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{
Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid.Total,Print.Score.Valid,Exam.MaxGrade);
TstPrn_ShowGrade (Grade,Exam.MaxGrade);
@ -1005,7 +1005,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
/* Link to show this result */
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
The_GetColorRows ());
if (ICanView.Result)
if (ICanView.Result == Usr_I_CAN)
{
Exams->Exam.ExaCod = Session.ExaCod;
Exams->SesCod = Session.SesCod;
@ -1218,8 +1218,8 @@ void ExaRes_ShowExaResultAfterFinish (void)
struct ExaPrn_Print Print;
struct ExaRes_ICanView ICanView =
{
.Result = true, // I have just finish answering, so show result...
.Score = false, // ...but not score
.Result = Usr_I_CAN, // I have just finish answering, so show result...
.Score = Usr_I_CAN_NOT, // ...but not score
};
unsigned Visibility = 1 << TstVis_VISIBLE_QST_ANS_TXT; // Show only questions and answers text
@ -1346,7 +1346,7 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS))
Err_WrongUserExit ();
if (!Usr_CheckIfICanViewTstExaMchResult (UsrDat))
if (Usr_CheckIfICanViewTstExaMchResult (UsrDat) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Begin table *****/
@ -1371,7 +1371,7 @@ static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
ExaRes_ShowExamResultGrade (Exam,Print,ICanView);
/* Answers and solutions */
if (ICanView->Result)
if (ICanView->Result == Usr_I_CAN)
ExaRes_ShowExamAnswers (UsrDat,Print,Visibility);
/***** End table *****/
@ -1398,15 +1398,17 @@ static void ExaRes_CheckIfICanViewResult (const struct Exa_Exam *Exam,
ICanView->Result = (Usr_ItsMe (UsrCod) == Usr_ME && // The result is mine
Exam->HiddenOrVisible == HidVis_VISIBLE && // The exam is visible
Session->HiddenOrVisible == HidVis_VISIBLE && // The session is visible
Session->ShowUsrResults); // The results of the session are visible to users
Session->ShowUsrResults) ? Usr_I_CAN : // The results of the session are visible to users
Usr_I_CAN_NOT;
// Whether I belong or not to groups of session is not checked here...
// ...because I should be able to see old exams made in old groups to which I belonged
if (ICanView->Result)
if (ICanView->Result == Usr_I_CAN)
// Depends on 5 visibility icons associated to exam
ICanView->Score = TstVis_IsVisibleTotalScore (Exam->Visibility);
ICanView->Score = TstVis_IsVisibleTotalScore (Exam->Visibility) ? Usr_I_CAN :
Usr_I_CAN_NOT;
else
ICanView->Score = false;
ICanView->Score = Usr_I_CAN_NOT;
break;
case Rol_NET:
case Rol_TCH:
@ -1415,11 +1417,11 @@ static void ExaRes_CheckIfICanViewResult (const struct Exa_Exam *Exam,
case Rol_INS_ADM:
case Rol_SYS_ADM:
ICanView->Result =
ICanView->Score = true;
ICanView->Score = Usr_I_CAN;
break;
default:
ICanView->Result =
ICanView->Score = false;
ICanView->Score = Usr_I_CAN_NOT;
break;
}
}
@ -1600,7 +1602,7 @@ static void ExaRes_ShowExamResultNumQsts (struct ExaPrn_Print *Print,
/***** Number of questions *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Result)
if (ICanView->Result == Usr_I_CAN)
{
HTM_TxtF ("%u",Print->NumQsts.All);
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
@ -1654,7 +1656,7 @@ static void ExaRes_ShowExamResultNumAnss (struct ExaPrn_Print *Print,
/***** Number of answers *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Score)
if (ICanView->Score == Usr_I_CAN)
HTM_TxtF ("%s(<em>p<sub>i</sub></em>=1):&nbsp;%u; "
"%s(-1&le;<em>p<sub>i</sub></em>&lt;0):&nbsp;%u; "
"%s(<em>p<sub>i</sub></em>=0):&nbsp;%u; "
@ -1693,7 +1695,7 @@ static void ExaRes_ShowExamResultScore (struct ExaPrn_Print *Print,
/***** Score *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Score)
if (ICanView->Score == Usr_I_CAN)
{
/* Score counting all questions */
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
@ -1745,7 +1747,7 @@ static void ExaRes_ShowExamResultGrade (const struct Exa_Exam *Exam,
/***** Grade *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Score)
if (ICanView->Score == Usr_I_CAN)
{
/* Grade counting all questions */
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
@ -1814,7 +1816,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
{
extern const char *Txt_Score;
extern const char *Txt_Invalid_question;
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY];
Usr_ICan_t ICanView[TstVis_NUM_ITEMS_VISIBILITY];
static const char *ClassNumQst[Qst_NUM_VALIDITIES] =
{
[Qst_INVALID_QUESTION] = "BIG_INDEX_RED",
@ -1840,10 +1842,14 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD:
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility);
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility);
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility);
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility);
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility) ? Usr_I_CAN:
Usr_I_CAN_NOT;
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility) ? Usr_I_CAN:
Usr_I_CAN_NOT;
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility) ? Usr_I_CAN:
Usr_I_CAN_NOT;
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility) ? Usr_I_CAN:
Usr_I_CAN_NOT;
break;
case Rol_NET:
case Rol_TCH:
@ -1854,13 +1860,13 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = true;
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN;
break;
default:
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = false;
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = Usr_I_CAN_NOT;
break;
}
@ -1879,10 +1885,10 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
/* Stem */
Qst_WriteQstStem (Question->Stem,ClassTxt[Question->Validity],
ICanView[TstVis_VISIBLE_QST_ANS_TXT]);
ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN);
/* Media */
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT])
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN)
Med_ShowMedia (&Question->Media,
"Tst_MED_SHOW_CONT",
"Tst_MED_SHOW");
@ -1895,7 +1901,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
ClassFeedback[Question->Validity]);
/* Write score retrieved from database */
if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE])
if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE] == Usr_I_CAN)
{
HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"",
The_GetSuffix ());
@ -1914,7 +1920,7 @@ static void ExaRes_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
}
/* Question feedback */
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
Qst_WriteQstFeedback (Question->Feedback,
ClassFeedback[Question->Validity]);

View File

@ -72,10 +72,10 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
Frm_PutForm_t PutFormSession,
unsigned NumSessions,
MYSQL_RES *mysql_res);
static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions);
static bool ExaSes_CheckIfICanEditSessions (void);
static bool ExaSes_CheckIfICanEditThisSession (long UsrCod);
static bool ExaSes_CheckIfVisibilityOfResultsCanBeChanged (const struct ExaSes_Session *Session);
static void ExaSes_ListOneOrMoreSessionsHeading (Usr_ICan_t ICanEditSessions);
static Usr_ICan_t ExaSes_CheckIfICanEditSessions (void);
static Usr_ICan_t ExaSes_CheckIfICanEditThisSession (long UsrCod);
static Usr_ICan_t ExaSes_CheckIfICanChangeVisibilityOfResults (const struct ExaSes_Session *Session);
static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams,
const struct ExaSes_Session *Session,
const char *Anchor);
@ -151,7 +151,8 @@ void ExaSes_ListSessions (struct Exa_Exams *Exams,
Hlp_ASSESSMENT_Exams_sessions,Box_NOT_CLOSABLE);
/***** Select whether show only my groups or all groups *****/
if (Gbl.Crs.Grps.NumGrps && ExaSes_CheckIfICanEditSessions ())
if (Gbl.Crs.Grps.NumGrps &&
ExaSes_CheckIfICanEditSessions () == Usr_I_CAN)
{
Set_BeginSettingsHead ();
Grp_ShowFormToSelWhichGrps (ActSeeOneExa,Exa_PutPars,Exams);
@ -203,15 +204,10 @@ void ExaSes_GetSessionDataByCod (struct ExaSes_Session *Session)
static void ExaSes_PutIconsInListOfSessions (void *Exams)
{
bool ICanEditSessions;
if (Exams)
{
/***** Put icon to create a new exam session in current exam *****/
ICanEditSessions = ExaSes_CheckIfICanEditSessions ();
if (ICanEditSessions)
if (ExaSes_CheckIfICanEditSessions () == Usr_I_CAN)
/***** Put icon to create a new exam session in current exam *****/
ExaSes_PutIconToCreateNewSession ((struct Exa_Exams *) Exams);
}
}
/*****************************************************************************/
@ -237,7 +233,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
unsigned UniqueId;
struct ExaSes_Session Session;
char *Anchor;
bool ICanEditSessions = ExaSes_CheckIfICanEditSessions ();
Usr_ICan_t ICanEditSessions = ExaSes_CheckIfICanEditSessions ();
long SesCodToBeEdited = PutFormSession == Frm_PUT_FORM &&
Exams->SesCod > 0 ? Exams->SesCod :
-1L;
@ -260,7 +256,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
/***** Get exam session data from row *****/
ExaSes_GetSessionDataFromRow (mysql_res,&Session);
if (ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session.SesCod))
if (ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session.SesCod) == Usr_I_CAN)
{
/***** Build anchor string *****/
if (asprintf (&Anchor,"evt_%ld_%ld",Exams->Exam.ExaCod,Session.SesCod) < 0)
@ -333,7 +329,7 @@ static void ExaSes_ListOneOrMoreSessions (struct Exa_Exams *Exams,
/************* Put a column for exam session start and end times *************/
/*****************************************************************************/
static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions)
static void ExaSes_ListOneOrMoreSessionsHeading (Usr_ICan_t ICanEditSessions)
{
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Session;
@ -343,14 +339,14 @@ static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions)
HTM_TR_Begin (NULL);
/***** Column for icons *****/
if (ICanEditSessions)
if (ICanEditSessions == Usr_I_CAN)
HTM_TH_Empty (1);
/***** The rest of columns *****/
HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_START_DATE] ,HTM_HEAD_LEFT );
HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_END_DATE ] ,HTM_HEAD_LEFT );
HTM_TH (Txt_Session ,HTM_HEAD_LEFT );
HTM_TH (Txt_Results ,HTM_HEAD_CENTER);
HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_START_DATE],HTM_HEAD_LEFT );
HTM_TH (Txt_START_END_TIME[Exa_ORDER_BY_END_DATE ],HTM_HEAD_LEFT );
HTM_TH (Txt_Session ,HTM_HEAD_LEFT );
HTM_TH (Txt_Results ,HTM_HEAD_CENTER);
/***** End row *****/
HTM_TR_End ();
@ -360,13 +356,13 @@ static void ExaSes_ListOneOrMoreSessionsHeading (bool ICanEditSessions)
/********************** Check if I can edit sessions *************************/
/*****************************************************************************/
static bool ExaSes_CheckIfICanEditSessions (void)
static Usr_ICan_t ExaSes_CheckIfICanEditSessions (void)
{
static const bool ICanEditSessions[Rol_NUM_ROLES] =
static Usr_ICan_t ICanEditSessions[Rol_NUM_ROLES] =
{
[Rol_NET ] = true,
[Rol_TCH ] = true,
[Rol_SYS_ADM] = true,
[Rol_NET ] = Usr_I_CAN,
[Rol_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = Usr_I_CAN,
};
return ICanEditSessions[Gbl.Usrs.Me.Role.Logged];
@ -376,17 +372,18 @@ static bool ExaSes_CheckIfICanEditSessions (void)
/************ Check if I can edit (remove/resume) an exam session ************/
/*****************************************************************************/
static bool ExaSes_CheckIfICanEditThisSession (long UsrCod)
static Usr_ICan_t ExaSes_CheckIfICanEditThisSession (long UsrCod)
{
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_NET:
return (UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod); // Only if I am the creator
return (UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_I_CAN : // Only if I am the creator
Usr_I_CAN_NOT;
case Rol_TCH:
case Rol_SYS_ADM:
return true;
return Usr_I_CAN;
default:
return false;
return Usr_I_CAN_NOT;
}
}
@ -394,14 +391,13 @@ static bool ExaSes_CheckIfICanEditThisSession (long UsrCod)
/********** Check if visibility of session results can be changed ************/
/*****************************************************************************/
static bool ExaSes_CheckIfVisibilityOfResultsCanBeChanged (const struct ExaSes_Session *Session)
static Usr_ICan_t ExaSes_CheckIfICanChangeVisibilityOfResults (const struct ExaSes_Session *Session)
{
if (Session->ShowUsrResults || // Results are currently visible
Session->TimeUTC[Dat_END_TIME] < Dat_GetStartExecutionTimeUTC ()) // End of time is in the past
if (ExaSes_CheckIfICanEditThisSession (Session->UsrCod))
return true;
return ExaSes_CheckIfICanEditThisSession (Session->UsrCod);
return false;
return Usr_I_CAN_NOT;
}
/*****************************************************************************/
@ -412,7 +408,7 @@ static void ExaSes_ListOneOrMoreSessionsIcons (struct Exa_Exams *Exams,
const struct ExaSes_Session *Session,
const char *Anchor)
{
static const Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
static Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = ActUnhExaSes, // Hidden ==> action to unhide
[HidVis_VISIBLE] = ActHidExaSes, // Visible ==> action to hide
@ -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 *****/
@ -1083,7 +1079,7 @@ void ExaSes_ReqCreatOrEditSes (void)
/****************** Create a new exam session (by a teacher) *****************/
/*****************************************************************************/
void ExaSes_ReceiveFormSession (void)
void ExaSes_ReceiveSession (void)
{
extern const char *Txt_Created_new_session_X;
extern const char *Txt_The_session_has_been_modified;
@ -1211,22 +1207,22 @@ static void ExaSes_CreateGrpsAssociatedToExamSession (long SesCod,
/******** Check if I belong to any of the groups of an exam session **********/
/*****************************************************************************/
bool ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
const struct ExaSes_Session *Session)
Usr_ICan_t ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
const struct ExaSes_Session *Session)
{
/***** 1. Sessions in hidden exams are not accesible
2. Hidden or closed sessions are not accesible *****/
if (Exam->HiddenOrVisible == HidVis_HIDDEN ||
Session->HiddenOrVisible == HidVis_HIDDEN ||
!Session->Open)
return false;
return Usr_I_CAN_NOT;
/***** Exam is visible, session is visible and open ==>
==> I can answer this session if I can list it based on groups *****/
return ExaSes_CheckIfICanListThisSessionBasedOnGrps (Session->SesCod);
}
bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
Usr_ICan_t ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
{
switch (Gbl.Usrs.Me.Role.Logged)
{
@ -1237,8 +1233,8 @@ bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod)
case Rol_NET:
case Rol_TCH:
case Rol_SYS_ADM:
return true;
return Usr_I_CAN;
default:
return false;
return Usr_I_CAN_NOT;
}
}

View File

@ -67,10 +67,10 @@ void ExaSes_GetAndCheckPars (struct Exa_Exams *Exams,
struct ExaSes_Session *Session);
void ExaSes_ReqCreatOrEditSes (void);
void ExaSes_ReceiveFormSession (void);
void ExaSes_ReceiveSession (void);
bool ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
const struct ExaSes_Session *Session);
bool ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod);
Usr_ICan_t ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
const struct ExaSes_Session *Session);
Usr_ICan_t ExaSes_CheckIfICanListThisSessionBasedOnGrps (long SesCod);
#endif

View File

@ -91,13 +91,13 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
unsigned MaxSetInd,
unsigned NumSets,
MYSQL_RES *mysql_res,
bool ICanEditSets);
Usr_ICan_t ICanEditSets);
static void ExaSet_PutTableHeadingForSets (void);
static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
unsigned NumQsts,
MYSQL_RES *mysql_res,
bool ICanEditQuestions);
Usr_ICan_t ICanEditQuestions);
static void ExaSet_ListQuestionForEdition (struct Qst_Question *Question,
unsigned QstInd,const char *Anchor);
@ -106,6 +106,8 @@ static void ExaSet_FreeListsSelectedQuestions (struct Exa_Exams *Exams);
static void ExaSet_CopyQstFromBankToExamSet (const struct ExaSet_Set *Set,long QstCod);
static Usr_ICan_t ExaSet_CheckIfICanEditExamSets (const struct Exa_Exam *Exam);
static void ExaSet_RemoveMediaFromStemOfQst (long QstCod,long SetCod);
static void ExaSet_RemoveMediaFromAllAnsOfQst (long QstCod,long SetCod);
@ -233,7 +235,7 @@ static void ExaSet_PutFormNewSet (struct Exa_Exams *Exams,
/**************** Receive form to create a new set of questions **************/
/*****************************************************************************/
void ExaSet_ReceiveFormSet (void)
void ExaSet_ReceiveSet (void)
{
struct Exa_Exams Exams;
struct ExaSet_Set Set;
@ -251,7 +253,7 @@ void ExaSet_ReceiveFormSet (void)
Exa_GetExamDataByCod (&Exams.Exam);
/***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam))
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** If I can edit exams ==> receive set from form *****/
@ -318,7 +320,7 @@ void ExaSet_ChangeSetTitle (void)
char NewTitle[ExaSet_MAX_BYTES_TITLE + 1];
/***** Check if I can edit exams *****/
if (!Exa_CheckIfICanEditExams ())
if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Reset exams context *****/
@ -330,7 +332,7 @@ void ExaSet_ChangeSetTitle (void)
ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam))
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Receive new title from form *****/
@ -361,7 +363,7 @@ void ExaSet_ChangeNumQstsToExam (void)
unsigned NumQstsToPrint;
/***** Check if I can edit exams *****/
if (!Exa_CheckIfICanEditExams ())
if (Exa_CheckIfICanEditExams () == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Reset exams context *****/
@ -373,7 +375,7 @@ void ExaSet_ChangeNumQstsToExam (void)
ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam))
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Get number of questions in set to appear in exam print *****/
@ -480,7 +482,7 @@ void ExaSet_ListExamSets (struct Exa_Exams *Exams)
MYSQL_RES *mysql_res;
unsigned MaxSetInd;
unsigned NumSets;
bool ICanEditSets = Exa_CheckIfEditable (&Exams->Exam);
Usr_ICan_t ICanEditSets = ExaSet_CheckIfICanEditExamSets (&Exams->Exam);
/***** Get maximum set index *****/
MaxSetInd = Exa_DB_GetMaxSetIndexInExam (Exams->Exam.ExaCod);
@ -516,14 +518,14 @@ static void ExaSet_ListSetQuestions (struct Exa_Exams *Exams,
extern const char *Txt_Questions;
MYSQL_RES *mysql_res;
unsigned NumQsts;
bool ICanEditQuestions = Exa_CheckIfEditable (&Exams->Exam);
Usr_ICan_t ICanEditQuestions = ExaSet_CheckIfICanEditExamSets (&Exams->Exam);
/***** Begin box *****/
Box_BoxBegin (Txt_Questions,
ICanEditQuestions ? ExaSet_PutIconToAddNewQuestions :
NULL,
ICanEditQuestions ? Exams :
NULL,
ICanEditQuestions == Usr_I_CAN ? ExaSet_PutIconToAddNewQuestions :
NULL,
ICanEditQuestions == Usr_I_CAN ? Exams :
NULL,
Hlp_ASSESSMENT_Exams_questions,Box_NOT_CLOSABLE);
/***** Show table with questions *****/
@ -546,7 +548,7 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
unsigned MaxSetInd,
unsigned NumSets,
MYSQL_RES *mysql_res,
bool ICanEditSets)
Usr_ICan_t ICanEditSets)
{
extern const char *Txt_Movement_not_allowed;
unsigned NumSet;
@ -586,14 +588,14 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
The_GetColorRows ());
/* Put icon to remove the set */
if (ICanEditSets)
if (ICanEditSets == Usr_I_CAN)
Ico_PutContextualIconToRemove (ActReqRemExaSet,NULL,
ExaSet_PutParsOneSet,Exams);
else
Ico_PutIconRemovalNotAllowed ();
/* Put icon to move up the question */
if (ICanEditSets && Set.SetInd > 1)
if (ICanEditSets == Usr_I_CAN && Set.SetInd > 1)
Lay_PutContextualLinkOnlyIcon (ActUp_ExaSet,Anchor,
ExaSet_PutParsOneSet,Exams,
"arrow-up.svg",Ico_BLACK);
@ -785,7 +787,7 @@ void ExaSet_GetSetDataFromRow (MYSQL_RES *mysql_res,struct ExaSet_Set *Set)
static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
unsigned NumQsts,
MYSQL_RES *mysql_res,
bool ICanEditQuestions)
Usr_ICan_t ICanEditQuestions)
{
extern const char *Txt_Questions;
extern const char *Txt_No_INDEX;
@ -839,7 +841,7 @@ static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ());
/* Put icon to remove the question */
if (ICanEditQuestions)
if (ICanEditQuestions == Usr_I_CAN)
Ico_PutContextualIconToRemove (ActReqRemSetQst,NULL,
ExaSet_PutParsOneQst,Exams);
else
@ -1250,7 +1252,7 @@ void ExaSet_ReqRemSet (void)
ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam))
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Show question and button to remove question *****/
@ -1282,7 +1284,7 @@ void ExaSet_RemoveSet (void)
ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam))
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Remove the set from all tables *****/
@ -1323,7 +1325,7 @@ void ExaSet_MoveUpSet (void)
ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam))
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Get set index *****/
@ -1369,7 +1371,7 @@ void ExaSet_MoveDownSet (void)
ExaSet_GetAndCheckPars (&Exams,&Set);
/***** Check if exam is editable *****/
if (!Exa_CheckIfEditable (&Exams.Exam))
if (ExaSet_CheckIfICanEditExamSets (&Exams.Exam) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Get set index *****/
@ -1396,6 +1398,21 @@ void ExaSet_MoveDownSet (void)
Exa_PutFormsOneExam (&Exams,Exa_EXISTING_EXAM);
}
/*****************************************************************************/
/**************** Check is edition of exam sets is possible ******************/
/*****************************************************************************/
// Before calling this function, number of sessions must be calculated
static Usr_ICan_t ExaSet_CheckIfICanEditExamSets (const struct Exa_Exam *Exam)
{
if (Exa_CheckIfICanEditExams () == Usr_I_CAN)
/***** Questions are editable only if exam has no sessions *****/
return (Exam->NumSess == 0) ? Usr_I_CAN : // Exams with sessions should not be edited
Usr_I_CAN_NOT;
else
return Usr_I_CAN_NOT; // Sets of questions are not editable
}
/*****************************************************************************/
/********************** Request the removal of a question ********************/
/*****************************************************************************/

View File

@ -39,7 +39,7 @@ void ExaSet_PutParsOneSet (void *Exams);
void ExaSet_GetSetDataByCod (struct ExaSet_Set *Set);
void ExaSet_ReceiveFormSet (void);
void ExaSet_ReceiveSet (void);
void ExaSet_ChangeSetTitle (void);
void ExaSet_ChangeNumQstsToExam (void);

View File

@ -62,6 +62,7 @@ typedef enum
Exa_CHECK_EXA_COD,
} Exa_CheckExaCod_t;
#define Exa_NUM_EXISTING_NEW_EXAM 2
typedef enum
{
Exa_EXISTING_EXAM,

View File

@ -34,7 +34,8 @@
/*****************************************************************************/
/* MIME types allowed for uploades files */
const char *MIM_MIMETypesAllowed[] =
#define MIM_NUM_MIME_TYPES_ALLOWED 200
const char *MIM_MIMETypesAllowed[MIM_NUM_MIME_TYPES_ALLOWED] =
{
"application/", //
"application/acrobat", // PDF
@ -238,11 +239,8 @@ const char *MIM_MIMETypesAllowed[] =
"zz-application/zz-winassoc-mpp" // Microsoft Project mpp
};
const unsigned MIM_NUM_MIME_TYPES_ALLOWED = sizeof (MIM_MIMETypesAllowed) /
sizeof (MIM_MIMETypesAllowed[0]);
/*****************************************************************************/
/******** Check if MIME type is allowed **********/
/*********************** Check if MIME type is allowed ***********************/
/*****************************************************************************/
bool MIM_CheckIfMIMETypeIsAllowed (const char *MIMEType)

View File

@ -33,7 +33,7 @@
/*****************************************************************************/
/* Extensions allowed for uploaded files */
const char *Ext_FileExtensionsAllowed[] =
const char *Ext_FileExtensionsAllowed[Ext_NUM_FILE_EXT_ALLOWED] =
{
"3gp" , // Video Android mobile
"7z" ,
@ -151,9 +151,6 @@ const char *Ext_FileExtensionsAllowed[] =
"zip" ,
};
const unsigned Ext_NUM_FILE_EXT_ALLOWED = sizeof (Ext_FileExtensionsAllowed) /
sizeof (Ext_FileExtensionsAllowed[0]);
/*****************************************************************************/
/******************* Check if file extension is allowed **********************/
/*****************************************************************************/

View File

@ -30,6 +30,13 @@
#include <linux/limits.h> // For NAME_MAX
#include <stdbool.h> // For boolean type
/*****************************************************************************/
/***************************** Public constants ******************************/
/*****************************************************************************/
#define Ext_NUM_FILE_EXT_ALLOWED 114
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/

View File

@ -572,13 +572,13 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat)
[PhoSha_SHAPE_OVAL ] = "PHOTOO60x80",
[PhoSha_SHAPE_RECTANGLE] = "PHOTOR60x80",
};
bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat);
Usr_ICan_t ICanView = Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat);
HTM_DIV_Begin ("class=\"FOLLOW_USR\"");
/***** Show user's photo *****/
HTM_DIV_Begin ("class=\"FOLLOW_PHOTO\"");
if (Visible)
if (ICanView == Usr_I_CAN)
Pho_ShowUsrPhotoIfAllowed (UsrDat,
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
HTM_DIV_End ();
@ -586,7 +586,7 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat)
/***** Show user's name and icon to follow/unfollow *****/
HTM_DIV_Begin ("class=\"FOLLOW_TXT\"");
if (Visible)
if (ICanView == Usr_I_CAN)
{
/* Put form to go to public profile */
Frm_BeginForm (ActSeeOthPubPrf);
@ -612,7 +612,7 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat)
UsrDat->UsrCod)) // I follow user
/* Form to unfollow */
Fol_PutIconToUnfollow (UsrDat->EnUsrCod);
else if (Visible) // I do not follow this user and I can follow
else if (ICanView == Usr_I_CAN) // I do not follow this user and I can follow
/* Form to follow */
Fol_PutIconToFollow (UsrDat->EnUsrCod);
}
@ -636,13 +636,13 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat)
[PhoSha_SHAPE_OVAL ] = "PHOTOO21x28",
[PhoSha_SHAPE_RECTANGLE] = "PHOTOR21x28",
};
bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat);
Usr_ICan_t ICanView = Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat);
/***** Show user's photo *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"CON_PHOTO %s\"",The_GetColorRows ());
if (Visible)
if (ICanView == Usr_I_CAN)
Pho_ShowUsrPhotoIfAllowed (UsrDat,
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
HTM_TD_End ();
@ -650,7 +650,7 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat)
/***** User's name *****/
HTM_TD_Begin ("class=\"CON_NAME_FOLLOW %s\"",
The_GetColorRows ());
if (Visible)
if (ICanView == Usr_I_CAN)
{
/* Put form to go to public profile */
Frm_BeginForm (ActSeeOthPubPrf);
@ -679,7 +679,7 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat)
UsrDat->UsrCod)) // I follow user
/* Form to unfollow */
Fol_PutIconToUnfollow (UsrDat->EnUsrCod);
else if (Visible) // I do not follow this user and I can follow
else if (ICanView == Usr_I_CAN) // I do not follow this user and I can follow
/* Form to follow */
Fol_PutIconToFollow (UsrDat->EnUsrCod);
}

View File

@ -74,7 +74,7 @@ extern struct Globals Gbl;
/************************ Public constants and types *************************/
/*****************************************************************************/
const Act_Action_t For_ActionsSeeFor[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsSeeFor[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActSeeForCrsUsr,
[For_FORUM_COURSE_TCHS] = ActSeeForCrsTch,
@ -91,7 +91,7 @@ const Act_Action_t For_ActionsSeeFor[For_NUM_TYPES_FORUM] =
[For_FORUM_UNKNOWN ] = ActSeeFor,
};
const Act_Action_t For_ActionsSeePstFor[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsSeePstFor[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActSeePstForCrsUsr,
[For_FORUM_COURSE_TCHS] = ActSeePstForCrsTch,
@ -108,7 +108,7 @@ const Act_Action_t For_ActionsSeePstFor[For_NUM_TYPES_FORUM] =
[For_FORUM_UNKNOWN ] = ActSeeFor,
};
const Act_Action_t For_ActionsRecThrFor[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsRecThrFor[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActRcvThrForCrsUsr,
[For_FORUM_COURSE_TCHS] = ActRcvThrForCrsTch,
@ -125,7 +125,7 @@ const Act_Action_t For_ActionsRecThrFor[For_NUM_TYPES_FORUM] =
[For_FORUM_UNKNOWN ] = ActSeeFor,
};
const Act_Action_t For_ActionsRecRepFor[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsRecRepFor[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActRcvRepForCrsUsr,
[For_FORUM_COURSE_TCHS] = ActRcvRepForCrsTch,
@ -142,7 +142,7 @@ const Act_Action_t For_ActionsRecRepFor[For_NUM_TYPES_FORUM] =
[For_FORUM_UNKNOWN ] = ActSeeFor,
};
const Act_Action_t For_ActionsReqDelThr[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsReqDelThr[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActReqDelThrCrsUsr,
[For_FORUM_COURSE_TCHS] = ActReqDelThrCrsTch,
@ -159,7 +159,7 @@ const Act_Action_t For_ActionsReqDelThr[For_NUM_TYPES_FORUM] =
[For_FORUM_UNKNOWN ] = ActSeeFor,
};
const Act_Action_t For_ActionsDelThrFor[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsDelThrFor[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActDelThrForCrsUsr,
[For_FORUM_COURSE_TCHS] = ActDelThrForCrsTch,
@ -176,7 +176,7 @@ const Act_Action_t For_ActionsDelThrFor[For_NUM_TYPES_FORUM] =
[For_FORUM_UNKNOWN ] = ActSeeFor,
};
const Act_Action_t For_ActionsCutThrFor[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsCutThrFor[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActCutThrForCrsUsr,
[For_FORUM_COURSE_TCHS] = ActCutThrForCrsTch,
@ -193,7 +193,7 @@ const Act_Action_t For_ActionsCutThrFor[For_NUM_TYPES_FORUM] =
[For_FORUM_UNKNOWN ] = ActSeeFor,
};
const Act_Action_t For_ActionsPasThrFor[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsPasThrFor[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActPasThrForCrsUsr,
[For_FORUM_COURSE_TCHS] = ActPasThrForCrsTch,
@ -210,7 +210,7 @@ const Act_Action_t For_ActionsPasThrFor[For_NUM_TYPES_FORUM] =
[For_FORUM_UNKNOWN ] = ActSeeFor,
};
const Act_Action_t For_ActionsDelPstFor[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsDelPstFor[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActDelPstForCrsUsr,
[For_FORUM_COURSE_TCHS] = ActDelPstForCrsTch,
@ -227,7 +227,7 @@ const Act_Action_t For_ActionsDelPstFor[For_NUM_TYPES_FORUM] =
[For_FORUM_UNKNOWN ] = ActSeeFor,
};
const Act_Action_t For_ActionsEnbPstFor[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsEnbPstFor[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActEnbPstForCrsUsr,
[For_FORUM_COURSE_TCHS] = ActEnbPstForCrsTch,
@ -244,7 +244,7 @@ const Act_Action_t For_ActionsEnbPstFor[For_NUM_TYPES_FORUM] =
[For_FORUM_UNKNOWN ] = ActSeeFor,
};
const Act_Action_t For_ActionsDisPstFor[For_NUM_TYPES_FORUM] =
Act_Action_t For_ActionsDisPstFor[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = ActDisPstForCrsUsr,
[For_FORUM_COURSE_TCHS] = ActDisPstForCrsTch,
@ -267,7 +267,7 @@ const Act_Action_t For_ActionsDisPstFor[For_NUM_TYPES_FORUM] =
#define For_FORUM_MAX_LEVELS 5
static const unsigned PermissionThreadDeletion[For_NUM_TYPES_FORUM] =
static unsigned PermissionThreadDeletion[For_NUM_TYPES_FORUM] =
{
[For_FORUM_COURSE_USRS] = 0x3F0,
[For_FORUM_COURSE_TCHS] = 0x3F0,
@ -379,7 +379,7 @@ static void For_WriteFormForumPst (struct For_Forums *Forums,
static void For_PutParsRemThread (void *Forums);
static bool For_CheckIfICanMoveThreads (void);
static Usr_ICan_t For_CheckIfICanMoveThreads (void);
static void For_InsertThrInClipboard (long ThrCod);
static void For_ShowStatOfAForumType (For_ForumType_t ForumType,
@ -720,7 +720,7 @@ void For_ShowPostsOfAThread (struct For_Forums *Forums,
For_GetThreadData (&Thread);
/***** Get if there is a thread ready to be moved *****/
if (For_CheckIfICanMoveThreads ())
if (For_CheckIfICanMoveThreads () == Usr_I_CAN)
Forums->Thread.ToMove = For_DB_GetThrInMyClipboard ();
/***** Get thread read time for the current user *****/
@ -871,7 +871,7 @@ static void For_PutIconsOneThread (void *Forums)
/***** Put icon to get resource link *****/
if (((struct For_Forums *) Forums)->Forum.Type == For_FORUM_COURSE_USRS &&
Rsc_CheckIfICanGetLink ())
Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkForCrsUsr,NULL,
For_PutParsNewPost,Forums);
}
@ -1233,7 +1233,7 @@ void For_ShowForumList (struct For_Forums *Forums)
bool ICanSeeDegForum;
/***** Get if there is a thread ready to be moved *****/
if (For_CheckIfICanMoveThreads ())
if (For_CheckIfICanMoveThreads () == Usr_I_CAN)
Forums->Thread.ToMove = For_DB_GetThrInMyClipboard ();
/***** Fill the list with the institutions I belong to *****/
@ -2182,7 +2182,7 @@ static void For_PutIconsThreads (void *Forums)
/***** Put icon to get resource link *****/
if (((struct For_Forums *) Forums)->Forum.Type == For_FORUM_COURSE_USRS &&
Rsc_CheckIfICanGetLink ())
Rsc_CheckIfICanGetLink () == Usr_I_CAN)
Ico_PutContextualIconToGetLink (ActReqLnkForCrsUsr,NULL,
For_PutParsNewPost,Forums);
}
@ -2232,10 +2232,10 @@ static void For_ListForumThrs (struct For_Forums *Forums,
long ThreadInMyClipboard = -1L;
unsigned Column;
const char *BgColor;
bool ICanMoveThreads;
Usr_ICan_t ICanMoveThreads = For_CheckIfICanMoveThreads ();
/***** Get if there is a thread ready to be moved *****/
if ((ICanMoveThreads = For_CheckIfICanMoveThreads ()))
if (ICanMoveThreads == Usr_I_CAN)
ThreadInMyClipboard = For_DB_GetThrInMyClipboard ();
/***** Initialize structure with user's data *****/
@ -2288,7 +2288,7 @@ static void For_ListForumThrs (struct For_Forums *Forums,
}
/***** Put button to cut the thread for moving it to another forum *****/
if (ICanMoveThreads)
if (ICanMoveThreads == Usr_I_CAN)
{
HTM_BR ();
Frm_BeginFormAnchor (For_ActionsCutThrFor[Forums->Forum.Type],
@ -3238,9 +3238,10 @@ void For_PasteThread (void)
/*********************** Check if I can move threads *************************/
/*****************************************************************************/
static bool For_CheckIfICanMoveThreads (void)
static Usr_ICan_t For_CheckIfICanMoveThreads (void)
{
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); // If I have permission to move threads...
return (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN : // If I have permission to move threads...
Usr_I_CAN_NOT;
}
/*****************************************************************************/

View File

@ -113,8 +113,8 @@ extern struct Globals Gbl;
static void Gam_ListAllGamesHeading (const struct Gam_Games *Games);
static bool Gam_CheckIfICanEditGames (void);
static bool Gam_CheckIfICanListGameQuestions (void);
static Usr_ICan_t Gam_CheckIfICanEditGames (void);
static Usr_ICan_t Gam_CheckIfICanListGameQuestions (void);
static void Gam_PutIconsListingGames (void *Games);
static void Gam_PutIconToCreateNewGame (struct Gam_Games *Games);
static void Gam_PutParsToCreateNewGame (void *Games);
@ -153,7 +153,7 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games);
static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
unsigned NumQsts,
MYSQL_RES *mysql_res,
bool ICanEditQuestions);
Usr_ICan_t ICanEditQuestions);
static void Gam_PutIconToAddNewQuestions (void *Games);
@ -163,7 +163,7 @@ static void Gam_FreeListsSelectedQuestions (struct Gam_Games *Games);
static void Gam_ExchangeQuestions (long GamCod,
unsigned QstIndTop,unsigned QstIndBottom);
static bool Gam_CheckIfEditable (const struct Gam_Game *Game);
static Usr_ICan_t Gam_CheckIfICanEditGame (const struct Gam_Game *Game);
/*****************************************************************************/
/*************************** Reset games context *****************************/
@ -346,9 +346,9 @@ static void Gam_ListAllGamesHeading (const struct Gam_Games *Games)
/************************ Check if I can edit games **************************/
/*****************************************************************************/
static bool Gam_CheckIfICanEditGames (void)
static Usr_ICan_t Gam_CheckIfICanEditGames (void)
{
static const bool ICanEditGames[Rol_NUM_ROLES] =
static bool ICanEditGames[Rol_NUM_ROLES] =
{
[Rol_TCH ] = true,
[Rol_SYS_ADM] = true,
@ -361,13 +361,13 @@ static bool Gam_CheckIfICanEditGames (void)
/**************** Check if I can list questions in games *********************/
/*****************************************************************************/
static bool Gam_CheckIfICanListGameQuestions (void)
static Usr_ICan_t Gam_CheckIfICanListGameQuestions (void)
{
static const bool ICanListGameQuestions[Rol_NUM_ROLES] =
static Usr_ICan_t ICanListGameQuestions[Rol_NUM_ROLES] =
{
[Rol_NET ] = true,
[Rol_TCH ] = true,
[Rol_SYS_ADM] = true,
[Rol_NET ] = Usr_I_CAN,
[Rol_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = Usr_I_CAN,
};
return ICanListGameQuestions[Gbl.Usrs.Me.Role.Logged];
@ -379,7 +379,7 @@ static bool Gam_CheckIfICanListGameQuestions (void)
static void Gam_PutIconsListingGames (void *Games)
{
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
static Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_STD ] = ActSeeMyMchResCrs,
[Rol_NET ] = ActReqSeeUsrMchRes,
@ -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);
}
/*****************************************************************************/
@ -716,12 +714,12 @@ static void Gam_PutParGameOrder (Gam_Order_t SelectedOrder)
static void Gam_PutIconsToRemEditOneGame (struct Gam_Games *Games,
const char *Anchor)
{
static const Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
static Act_Action_t ActionHideUnhide[HidVis_NUM_HIDDEN_VISIBLE] =
{
[HidVis_HIDDEN ] = ActUnhGam, // Hidden ==> action to unhide
[HidVis_VISIBLE] = ActHidGam, // Visible ==> action to hide
};
static const Act_Action_t ActionShowResults[Rol_NUM_ROLES] =
static Act_Action_t ActionShowResults[Rol_NUM_ROLES] =
{
[Rol_STD ] = ActSeeMyMchResGam,
[Rol_NET ] = ActSeeUsrMchResGam,
@ -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);
}
@ -875,7 +870,7 @@ void Gam_GetListGames (struct Gam_Games *Games,Gam_Order_t SelectedOrder)
void Gam_GetListSelectedGamCods (struct Gam_Games *Games)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
unsigned MaxSizeListGamCodsSelected;
unsigned NumGame;
const char *Ptr;
@ -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 *****/
@ -1258,12 +1253,12 @@ void Gam_PutFormsOneGame (struct Gam_Games *Games,
extern const char *Hlp_ASSESSMENT_Games_edit_game;
extern const char *Hlp_ASSESSMENT_Games_new_game;
extern const char *Txt_Game;
static void (*FunctionToDrawContextualIcons[]) (void *Args) =
static void (*FunctionToDrawContextualIcons[Gam_NUM_EXISTING_NEW_GAME]) (void *Args) =
{
[Gam_EXISTING_GAME] = Gam_PutIconsEditingOneGame,
[Gam_NEW_GAME ] = NULL,
};
static const char **HelpLink[] =
static const char **HelpLink[Gam_NUM_EXISTING_NEW_GAME] =
{
[Gam_EXISTING_GAME] = &Hlp_ASSESSMENT_Games_edit_game,
[Gam_NEW_GAME ] = &Hlp_ASSESSMENT_Games_new_game,
@ -1324,17 +1319,17 @@ static void Gam_PutFormEditionGame (struct Gam_Games *Games,
extern const char *Txt_Description;
extern const char *Txt_Save_changes;
extern const char *Txt_Create;
static const Act_Action_t NextAction[] =
static Act_Action_t NextAction[Gam_NUM_EXISTING_NEW_GAME] =
{
[Gam_EXISTING_GAME] = ActChgGam,
[Gam_NEW_GAME ] = ActNewGam,
};
static Btn_Button_t Button[] =
static Btn_Button_t Button[Gam_NUM_EXISTING_NEW_GAME] =
{
[Gam_EXISTING_GAME] = Btn_CONFIRM_BUTTON,
[Gam_NEW_GAME ] = Btn_CREATE_BUTTON,
};
const char *TxtButton[] =
const char *TxtButton[Gam_NUM_EXISTING_NEW_GAME] =
{
[Gam_EXISTING_GAME] = Txt_Save_changes,
[Gam_NEW_GAME ] = Txt_Create,
@ -1426,7 +1421,7 @@ static void Gam_PutFormEditionGame (struct Gam_Games *Games,
/********************** Receive form to create a new game ********************/
/*****************************************************************************/
void Gam_ReceiveFormGame (void)
void Gam_ReceiveGame (void)
{
struct Gam_Games Games;
Gam_ExistingNewGame_t ExistingNewGame;
@ -1439,7 +1434,7 @@ void Gam_ReceiveFormGame (void)
Gam_ResetGame (&Games.Game);
/***** Check if I can edit games *****/
if (!Gam_CheckIfICanEditGames ())
if (Gam_CheckIfICanEditGames () == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Get parameters *****/
@ -1568,7 +1563,7 @@ void Gam_ReqSelectQstsToAddToGame (void)
Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game))
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Show form to create a new question in this game *****/
@ -1600,7 +1595,7 @@ void Gam_ListQstsToAddToGame (void)
Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game))
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** List several test questions for selection *****/
@ -1640,17 +1635,17 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games)
extern const char *Txt_Questions;
MYSQL_RES *mysql_res;
unsigned NumQsts;
bool ICanEditQuestions = Gam_CheckIfEditable (&Games->Game);
Usr_ICan_t ICanEditQuestions = Gam_CheckIfICanEditGame (&Games->Game);
/***** Get data of questions from database *****/
NumQsts = Gam_DB_GetGameQuestionsBasic (&mysql_res,Games->Game.GamCod);
/***** Begin box *****/
Box_BoxBegin (Txt_Questions,
ICanEditQuestions ? Gam_PutIconToAddNewQuestions :
NULL,
ICanEditQuestions ? Games :
NULL,
ICanEditQuestions == Usr_I_CAN ? Gam_PutIconToAddNewQuestions :
NULL,
ICanEditQuestions == Usr_I_CAN ? Games :
NULL,
Hlp_ASSESSMENT_Games_questions,Box_NOT_CLOSABLE);
/***** Show table with questions *****/
@ -1672,7 +1667,7 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games)
static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
unsigned NumQsts,
MYSQL_RES *mysql_res,
bool ICanEditQuestions)
Usr_ICan_t ICanEditQuestions)
{
extern const char *Txt_Questions;
extern const char *Txt_No_INDEX;
@ -1741,14 +1736,14 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ());
/* Put icon to remove the question */
if (ICanEditQuestions)
if (ICanEditQuestions == Usr_I_CAN)
Ico_PutContextualIconToRemove (ActReqRemGamQst,NULL,
Gam_PutParsOneQst,Games);
else
Ico_PutIconRemovalNotAllowed ();
/* Put icon to move up the question */
if (ICanEditQuestions && QstInd > 1)
if (ICanEditQuestions == Usr_I_CAN && QstInd > 1)
Lay_PutContextualLinkOnlyIcon (ActUp_GamQst,Anchor,
Gam_PutParsOneQst,Games,
"arrow-up.svg",Ico_BLACK);
@ -1757,7 +1752,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
Txt_Movement_not_allowed);
/* Put icon to move down the question */
if (ICanEditQuestions && QstInd < MaxQstInd)
if (ICanEditQuestions == Usr_I_CAN && QstInd < MaxQstInd)
Lay_PutContextualLinkOnlyIcon (ActDwnGamQst,Anchor,
Gam_PutParsOneQst,Games,
"arrow-down.svg",Ico_BLACK);
@ -1766,7 +1761,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
Txt_Movement_not_allowed);
/* Put icon to edit the question */
if (ICanEditQuestions)
if (ICanEditQuestions == Usr_I_CAN)
Ico_PutContextualIconToEdit (ActEdiOneTstQst,NULL,
Qst_PutParQstCod,&Question.QstCod);
@ -1827,7 +1822,7 @@ void Gam_AddQstsToGame (void)
Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game))
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Get selected questions *****/
@ -1935,7 +1930,7 @@ void Gam_ReqRemQstFromGame (void)
Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game))
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Get question index *****/
@ -1977,7 +1972,7 @@ void Gam_RemoveQstFromGame (void)
Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game))
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Get question index *****/
@ -2026,7 +2021,7 @@ void Gam_MoveUpQst (void)
Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game))
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Get question index *****/
@ -2076,7 +2071,7 @@ void Gam_MoveDownQst (void)
Gam_GetGameDataByCod (&Games.Game);
/***** Check if game has matches *****/
if (!Gam_CheckIfEditable (&Games.Game))
if (Gam_CheckIfICanEditGame (&Games.Game) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Get question index *****/
@ -2155,13 +2150,14 @@ static void Gam_ExchangeQuestions (long GamCod,
/*****************************************************************************/
// Before calling this function, number of matches must be calculated
static bool Gam_CheckIfEditable (const struct Gam_Game *Game)
static Usr_ICan_t Gam_CheckIfICanEditGame (const struct Gam_Game *Game)
{
if (Gam_CheckIfICanEditGames ())
if (Gam_CheckIfICanEditGames () == Usr_I_CAN)
/***** Questions are editable only if game has no matches *****/
return Game->NumMchs == 0; // Games with matches should not be edited
return Game->NumMchs == 0 ? Usr_I_CAN : // Games with matches should not be edited
Usr_I_CAN_NOT;
else
return false; // Questions are not editable
return Usr_I_CAN_NOT; // Questions are not editable
}
/*****************************************************************************/

View File

@ -56,6 +56,7 @@ typedef enum
} Gam_AnswerType_t;
#define Gam_ANSWER_TYPE_DEFAULT Gam_ANS_UNIQUE_CHOICE
#define Gam_NUM_EXISTING_NEW_GAME 2
typedef enum
{
Gam_EXISTING_GAME,
@ -140,7 +141,7 @@ void Gam_ListGame (void);
void Gam_ReqCreatOrEditGame (void);
void Gam_PutFormsOneGame (struct Gam_Games *Games,
Gam_ExistingNewGame_t ExistingNewGame);
void Gam_ReceiveFormGame (void);
void Gam_ReceiveGame (void);
void Gam_ReqSelectQstsToAddToGame (void);
void Gam_ListQstsToAddToGame (void);

View File

@ -72,7 +72,7 @@ struct Globals Gbl; // All the global parameters and variables must be in this s
void Gbl_InitializeGlobals (void)
{
extern const unsigned Txt_Current_CGI_SWAD_Language;
extern unsigned Txt_Current_CGI_SWAD_Language;
Rol_Role_t Role;
Gbl.Layout.WritingHTMLStart =

View File

@ -66,20 +66,6 @@
#define Grp_GROUPS_SECTION_ID "grps"
#define Grp_NEW_GROUP_SECTION_ID "new_grp"
static const bool Grp_ICanChangeGrps[Rol_NUM_ROLES] =
{
[Rol_UNK ] = false,
[Rol_GST ] = false,
[Rol_USR ] = false,
[Rol_STD ] = true,
[Rol_NET ] = false,
[Rol_TCH ] = true,
[Rol_DEG_ADM] = false,
[Rol_CTR_ADM] = false,
[Rol_INS_ADM] = false,
[Rol_SYS_ADM] = true,
};
/*****************************************************************************/
/************* External global variables from others modules *****************/
/*****************************************************************************/
@ -90,6 +76,8 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static Usr_ICan_t Grp_CheckIfICanChangeGrps (void);
static void Grp_ReqEditGroupsInternal (Ale_AlertType_t AlertTypeGroupTypes,const char *AlertTextGroupTypes,
Ale_AlertType_t AlertTypeGroups,const char *AlertTextGroups);
static void Grp_ReqEditGroupsInternal0 (void);
@ -143,6 +131,22 @@ static void Grp_WriteMaxStds (char Str[Cns_MAX_DECIMAL_DIGITS_UINT + 1],unsigned
static void Grp_PutParGrpTypCod (void *GrpTypCod);
static void Grp_PutParGrpCod (void *GrpCod);
/*****************************************************************************/
/************************ Check if I can change groups ***********************/
/*****************************************************************************/
static Usr_ICan_t Grp_CheckIfICanChangeGrps (void)
{
static Usr_ICan_t Grp_ICanChangeGrps[Rol_NUM_ROLES] =
{
[Rol_STD ] = Usr_I_CAN,
[Rol_TCH ] = Usr_I_CAN,
[Rol_SYS_ADM] = Usr_I_CAN,
};
return Grp_ICanChangeGrps[Gbl.Usrs.Me.Role.Logged];
}
/*****************************************************************************/
/******************* Write the names of the selected groups ******************/
/*****************************************************************************/
@ -624,7 +628,7 @@ void Grp_ChangeMyGrps (Cns_QuietOrVerbose_t QuietOrVerbose)
bool ChangesMade;
/***** Can I change my groups? *****/
if (Grp_ICanChangeGrps[Gbl.Usrs.Me.Role.Logged])
if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN)
{
/***** Get list of groups types and groups in this course *****/
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
@ -683,7 +687,7 @@ void Grp_ChangeOtherUsrGrps (void)
bool SelectionIsValid;
/***** Can I change another user's groups? *****/
if (Grp_ICanChangeGrps[Gbl.Usrs.Me.Role.Logged])
if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN)
{
/***** Get list of groups types and groups in current course *****/
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
@ -1340,8 +1344,7 @@ static void Grp_PutIconsEditingGroupTypes (__attribute__((unused)) void *Args)
static void Grp_PutIconToViewGroups (void)
{
Ico_PutContextualIconToView (ActReqSelGrp,NULL,
NULL,NULL);
Ico_PutContextualIconToView (ActReqSelGrp,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -1773,8 +1776,7 @@ void Grp_ShowLstGrpsToChgMyGrps (void)
static void Grp_PutIconToEditGroups (__attribute__((unused)) void *Args)
{
Ico_PutContextualIconToEdit (ActReqEdiGrp,NULL,
NULL,NULL);
Ico_PutContextualIconToEdit (ActReqEdiGrp,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -3204,7 +3206,7 @@ void Grp_GetNamesGrpsUsrBelongsTo (long UsrCod,long GrpTypCod,char *GroupNames)
/****************** Receive form to create a new group type ******************/
/*****************************************************************************/
void Grp_ReceiveFormNewGrpTyp (void)
void Grp_ReceiveNewGrpTyp (void)
{
extern const char *Txt_The_type_of_group_X_already_exists;
extern const char *Txt_Created_new_type_of_group_X;
@ -3276,7 +3278,7 @@ static bool Grp_CheckIfOpenTimeInTheFuture (time_t OpenTimeUTC)
/******************** Receive form to create a new group *********************/
/*****************************************************************************/
void Grp_ReceiveFormNewGrp (void)
void Grp_ReceiveNewGrp (void)
{
extern const char *Txt_The_group_X_already_exists;
extern const char *Txt_Created_new_group_X;

View File

@ -206,8 +206,8 @@ bool Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (const struct Usr_Data *UsrDat)
void Grp_GetLstCodGrpsWithFileZonesIBelong (struct ListCodGrps *LstGrps);
void Grp_GetNamesGrpsUsrBelongsTo (long UsrCod,long GrpTypCod,char *GroupNames);
void Grp_ReceiveFormNewGrpTyp (void);
void Grp_ReceiveFormNewGrp (void);
void Grp_ReceiveNewGrpTyp (void);
void Grp_ReceiveNewGrp (void);
void Grp_ReqRemGroupType (void);
void Grp_ReqRemGroup (void);
void Grp_RemoveGroupType (void);

View File

@ -86,7 +86,7 @@ void Hlp_ShowHelpWhatWouldYouLikeToDo (void)
extern const char *Txt_Log_in;
extern const char *Txt_New_on_PLATFORM_Sign_up;
extern const char *Txt_Actions[ActLst_NUM_ACTIONS];
static const Act_Action_t ActionsRemoveMe[Rol_NUM_ROLES] =
static Act_Action_t ActionsRemoveMe[Rol_NUM_ROLES] =
{
[Rol_UNK ] = ActUnk,
[Rol_GST ] = ActUnk,

View File

@ -167,7 +167,7 @@ void Hie_SeePending (void)
void Hie_WriteMenuHierarchy (void)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_HIERARCHY_SINGUL_Abc[Hie_NUM_LEVELS];
static void (*FunctionWriteSelector[Hie_NUM_LEVELS]) (void) =
{
@ -707,23 +707,23 @@ void Hie_GetAndWriteInsCtrDegAdminBy (long UsrCod,unsigned ColSpan)
/****************** Check if I can edit hierarchy elements *******************/
/*****************************************************************************/
bool Hie_CheckIfICanEdit (void)
Usr_ICan_t Hie_CheckIfICanEdit (void)
{
// Some admins can edit all hierarchy elements.
// Any user can edit the elements he/she has created...
// ...as long as they are in pending status.
static const bool ICanEdit[Rol_NUM_ROLES] =
static Usr_ICan_t ICanEdit[Rol_NUM_ROLES] =
{
/* Users who can edit */
[Rol_GST ] = true,
[Rol_USR ] = true,
[Rol_STD ] = true,
[Rol_NET ] = true,
[Rol_TCH ] = true,
[Rol_DEG_ADM] = true,
[Rol_CTR_ADM] = true,
[Rol_INS_ADM] = true,
[Rol_SYS_ADM] = true,
[Rol_GST ] = Usr_I_CAN,
[Rol_USR ] = Usr_I_CAN,
[Rol_STD ] = Usr_I_CAN,
[Rol_NET ] = Usr_I_CAN,
[Rol_TCH ] = Usr_I_CAN,
[Rol_DEG_ADM] = Usr_I_CAN,
[Rol_CTR_ADM] = Usr_I_CAN,
[Rol_INS_ADM] = Usr_I_CAN,
[Rol_SYS_ADM] = Usr_I_CAN,
};
return ICanEdit[Gbl.Usrs.Me.Role.Logged];

View File

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

View File

@ -91,7 +91,7 @@ void HieCfg_Name (Frm_PutForm_t PutForm,Hie_Level_t Level,
extern const char *Nam_Classes[Nam_NUM_SHRT_FULL_NAMES];
extern const char *Txt_Short_name;
extern const char *Txt_HIERARCHY_SINGUL_Abc[Hie_NUM_LEVELS];
static const Act_Action_t Action[Hie_NUM_LEVELS][Nam_NUM_SHRT_FULL_NAMES] =
static Act_Action_t Action[Hie_NUM_LEVELS][Nam_NUM_SHRT_FULL_NAMES] =
{
[Hie_INS][Nam_SHRT_NAME] = ActRenInsShoCfg,
[Hie_INS][Nam_FULL_NAME] = ActRenInsFulCfg,
@ -205,7 +205,7 @@ void HieCfg_WWW (Vie_ViewType_t ViewType,Frm_PutForm_t PutForm,
void HieCfg_Shortcut (Vie_ViewType_t ViewType,ParCod_Param_t ParCode,long HieCod)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_Shortcut;
/***** Short cut *****/

View File

@ -44,17 +44,6 @@
#include "swad_parameter.h"
#include "swad_parameter_code.h"
/*****************************************************************************/
/****************************** Private constants ****************************/
/*****************************************************************************/
static const bool Hld_ICanEditHlds[Rol_NUM_ROLES] =
{
/* Users who can edit */
[Rol_INS_ADM] = true,
[Rol_SYS_ADM] = true,
};
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
@ -71,6 +60,8 @@ static struct Hld_Holiday *Hld_EditingHld = NULL; // Static variable to keep the
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static Usr_ICan_t Hld_CheckIfICanEditHlds (void);
static Hld_Order_t Hld_GetParHldOrder (void);
static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args);
static void Hld_PutIconsEditHolidays (__attribute__((unused)) void *Args);
@ -93,6 +84,22 @@ static void Hld_PutHeadHolidays (void);
static void Hld_EditingHolidayConstructor (void);
static void Hld_EditingHolidayDestructor (void);
/*****************************************************************************/
/************************ Check if I can edit holidays ***********************/
/*****************************************************************************/
static Usr_ICan_t Hld_CheckIfICanEditHlds (void)
{
static Usr_ICan_t Hld_ICanEditHlds[Rol_NUM_ROLES] =
{
/* Users who can edit */
[Rol_INS_ADM] = Usr_I_CAN,
[Rol_SYS_ADM] = Usr_I_CAN,
};
return Hld_ICanEditHlds[Gbl.Usrs.Me.Role.Logged];
}
/*****************************************************************************/
/************************* Reset departments context *************************/
/*****************************************************************************/
@ -234,9 +241,8 @@ static Hld_Order_t Hld_GetParHldOrder (void)
static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args)
{
/***** Edit holidays *****/
if (Hld_ICanEditHlds[Gbl.Usrs.Me.Role.Logged])
Ico_PutContextualIconToEdit (ActEdiHld,NULL,
NULL,NULL);
if (Hld_CheckIfICanEditHlds () == Usr_I_CAN)
Ico_PutContextualIconToEdit (ActEdiHld,NULL,NULL,NULL);
/***** View calendar *****/
Cal_PutIconToSeeCalendar ();
@ -245,8 +251,7 @@ static void Hld_PutIconsSeeHolidays (__attribute__((unused)) void *Args)
static void Hld_PutIconsEditHolidays (__attribute__((unused)) void *Args)
{
/***** Put icon to view holidays *****/
Ico_PutContextualIconToView (ActSeeHld,NULL,
NULL,NULL);
Ico_PutContextualIconToView (ActSeeHld,NULL,NULL,NULL);
/***** View calendar *****/
Cal_PutIconToSeeCalendar ();
@ -1007,7 +1012,7 @@ static void Hld_PutHeadHolidays (void)
/******************* Receive form to create a new holiday ********************/
/*****************************************************************************/
void Hld_ReceiveFormNewHoliday (void)
void Hld_ReceiveNewHoliday (void)
{
extern const char *Txt_Created_new_holiday_X;
extern const char *Txt_You_must_specify_the_name;

View File

@ -97,6 +97,6 @@ void Hld_ChangeStartDate (void);
void Hld_ChangeEndDate (void);
void Hld_RenameHoliday (void);
void Hld_ContEditAfterChgHld (void);
void Hld_ReceiveFormNewHoliday (void);
void Hld_ReceiveNewHoliday (void);
#endif

View File

@ -311,7 +311,7 @@ void Ico_PutContextualIconToConfigure (Act_Action_t NextAction,const char *Ancho
"cog.svg",Ico_BLACK);
}
void Ico_PutContextualIconToHideUnhide (const Act_Action_t NextAction[HidVis_NUM_HIDDEN_VISIBLE],
void Ico_PutContextualIconToHideUnhide (Act_Action_t NextAction[HidVis_NUM_HIDDEN_VISIBLE],
const char *Anchor,
void (*FuncPars) (void *Args),void *Args,
HidVis_HiddenOrVisible_t HiddenOrVisible)
@ -322,7 +322,7 @@ void Ico_PutContextualIconToHideUnhide (const Act_Action_t NextAction[HidVis_NUM
Ico_HiddenVisible[HiddenOrVisible].Color);
}
void Ico_PutContextualIconToExpand (const Act_Action_t NextAction,const char *Anchor,
void Ico_PutContextualIconToExpand (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args)
{
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,
@ -330,7 +330,7 @@ void Ico_PutContextualIconToExpand (const Act_Action_t NextAction,const char *An
"caret-right.svg",Ico_BLACK);
}
void Ico_PutContextualIconToContract (const Act_Action_t NextAction,const char *Anchor,
void Ico_PutContextualIconToContract (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args)
{
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,

View File

@ -93,13 +93,13 @@ void Ico_PutContextualIconToView (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args);
void Ico_PutContextualIconToConfigure (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args);
void Ico_PutContextualIconToHideUnhide (const Act_Action_t NextAction[HidVis_NUM_HIDDEN_VISIBLE],
void Ico_PutContextualIconToHideUnhide (Act_Action_t NextAction[HidVis_NUM_HIDDEN_VISIBLE],
const char *Anchor,
void (*FuncPars) (void *Args),void *Args,
HidVis_HiddenOrVisible_t HiddenOrVisible);
void Ico_PutContextualIconToExpand (const Act_Action_t NextAction,const char *Anchor,
void Ico_PutContextualIconToExpand (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args);
void Ico_PutContextualIconToContract (const Act_Action_t NextAction,const char *Anchor,
void Ico_PutContextualIconToContract (Act_Action_t NextAction,const char *Anchor,
void (*FuncPars) (void *Args),void *Args);
void Ico_PutContextualIconToPrint (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args);

View File

@ -100,7 +100,7 @@ static unsigned Ind_GetAndUpdateNumIndicatorsCrs (long CrsCod);
void Ind_ReqIndicatorsCourses (void)
{
extern const char *Hlp_ANALYTICS_Indicators;
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_Scope;
extern const char *Txt_Types_of_degree;
extern const char *Txt_only_if_the_scope_is_X;

View File

@ -60,7 +60,7 @@ extern struct Globals Gbl;
static const char *Inf_FileNamesForInfoType[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = Cfg_CRS_INFO_INTRODUCTION,
[Inf_INFORMATION ] = Cfg_CRS_INFO_INFORMATION,
[Inf_TEACHING_GUIDE] = Cfg_CRS_INFO_TEACHING_GUIDE,
[Inf_LECTURES ] = Cfg_CRS_INFO_LECTURES,
[Inf_PRACTICALS ] = Cfg_CRS_INFO_PRACTICALS,
@ -70,9 +70,9 @@ static const char *Inf_FileNamesForInfoType[Inf_NUM_TYPES] =
[Inf_ASSESSMENT ] = Cfg_CRS_INFO_ASSESSMENT,
};
static const Act_Action_t Inf_ActionsInfo[Inf_NUM_SOURCES][Inf_NUM_TYPES] =
static Act_Action_t Inf_ActionsInfo[Inf_NUM_SOURCES][Inf_NUM_TYPES] =
{
[Inf_NONE ][Inf_INTRODUCTION ] = ActUnk,
[Inf_NONE ][Inf_INFORMATION ] = ActUnk,
[Inf_NONE ][Inf_TEACHING_GUIDE] = ActUnk,
[Inf_NONE ][Inf_LECTURES ] = ActUnk,
[Inf_NONE ][Inf_PRACTICALS ] = ActUnk,
@ -81,7 +81,7 @@ static const Act_Action_t Inf_ActionsInfo[Inf_NUM_SOURCES][Inf_NUM_TYPES] =
[Inf_NONE ][Inf_LINKS ] = ActUnk,
[Inf_NONE ][Inf_ASSESSMENT ] = ActUnk,
[Inf_EDITOR ][Inf_INTRODUCTION ] = ActEditorCrsInf,
[Inf_EDITOR ][Inf_INFORMATION ] = ActEditorCrsInf,
[Inf_EDITOR ][Inf_TEACHING_GUIDE] = ActEditorTchGui,
[Inf_EDITOR ][Inf_LECTURES ] = ActEditorSyl,
[Inf_EDITOR ][Inf_PRACTICALS ] = ActEditorSyl,
@ -90,7 +90,7 @@ static const Act_Action_t Inf_ActionsInfo[Inf_NUM_SOURCES][Inf_NUM_TYPES] =
[Inf_EDITOR ][Inf_LINKS ] = ActEditorCrsLnk,
[Inf_EDITOR ][Inf_ASSESSMENT ] = ActEditorAss,
[Inf_PLAIN_TEXT][Inf_INTRODUCTION ] = ActPlaTxtEdiCrsInf,
[Inf_PLAIN_TEXT][Inf_INFORMATION ] = ActPlaTxtEdiCrsInf,
[Inf_PLAIN_TEXT][Inf_TEACHING_GUIDE] = ActPlaTxtEdiTchGui,
[Inf_PLAIN_TEXT][Inf_LECTURES ] = ActPlaTxtEdiSyl,
[Inf_PLAIN_TEXT][Inf_PRACTICALS ] = ActPlaTxtEdiSyl,
@ -99,7 +99,7 @@ static const Act_Action_t Inf_ActionsInfo[Inf_NUM_SOURCES][Inf_NUM_TYPES] =
[Inf_PLAIN_TEXT][Inf_LINKS ] = ActPlaTxtEdiCrsLnk,
[Inf_PLAIN_TEXT][Inf_ASSESSMENT ] = ActPlaTxtEdiAss,
[Inf_RICH_TEXT ][Inf_INTRODUCTION ] = ActRchTxtEdiCrsInf,
[Inf_RICH_TEXT ][Inf_INFORMATION ] = ActRchTxtEdiCrsInf,
[Inf_RICH_TEXT ][Inf_TEACHING_GUIDE] = ActRchTxtEdiTchGui,
[Inf_RICH_TEXT ][Inf_LECTURES ] = ActRchTxtEdiSyl,
[Inf_RICH_TEXT ][Inf_PRACTICALS ] = ActRchTxtEdiSyl,
@ -108,7 +108,7 @@ static const Act_Action_t Inf_ActionsInfo[Inf_NUM_SOURCES][Inf_NUM_TYPES] =
[Inf_RICH_TEXT ][Inf_LINKS ] = ActRchTxtEdiCrsLnk,
[Inf_RICH_TEXT ][Inf_ASSESSMENT ] = ActRchTxtEdiAss,
[Inf_PAGE ][Inf_INTRODUCTION ] = ActRcvPagCrsInf,
[Inf_PAGE ][Inf_INFORMATION ] = ActRcvPagCrsInf,
[Inf_PAGE ][Inf_TEACHING_GUIDE] = ActRcvPagTchGui,
[Inf_PAGE ][Inf_LECTURES ] = ActRcvPagSyl,
[Inf_PAGE ][Inf_PRACTICALS ] = ActRcvPagSyl,
@ -117,7 +117,7 @@ static const Act_Action_t Inf_ActionsInfo[Inf_NUM_SOURCES][Inf_NUM_TYPES] =
[Inf_PAGE ][Inf_LINKS ] = ActRcvPagCrsLnk,
[Inf_PAGE ][Inf_ASSESSMENT ] = ActRcvPagAss,
[Inf_URL ][Inf_INTRODUCTION ] = ActRcvURLCrsInf,
[Inf_URL ][Inf_INFORMATION ] = ActRcvURLCrsInf,
[Inf_URL ][Inf_TEACHING_GUIDE] = ActRcvURLTchGui,
[Inf_URL ][Inf_LECTURES ] = ActRcvURLSyl,
[Inf_URL ][Inf_PRACTICALS ] = ActRcvURLSyl,
@ -191,7 +191,7 @@ void Inf_ShowInfo (void)
bool ShowWarningNoInfo = false;
const char *Help[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = Hlp_COURSE_Information_textual_information,
[Inf_INFORMATION ] = Hlp_COURSE_Information_textual_information,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus,
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus,
@ -265,7 +265,7 @@ void Inf_ShowInfo (void)
case Inf_PRACTICALS:
ShowWarningNoInfo = !Syl_CheckAndShowSyllabus (&Syllabus);
break;
case Inf_INTRODUCTION:
case Inf_INFORMATION:
case Inf_TEACHING_GUIDE:
case Inf_BIBLIOGRAPHY:
case Inf_FAQ:
@ -305,14 +305,9 @@ void Inf_ShowInfo (void)
static void Inf_PutIconToViewInfo (void *Type)
{
extern Syl_WhichSyllabus_t Syl_WhichSyllabus[Syl_NUM_WHICH_SYLLABUS];
static struct
static struct Act_ActionFunc Inf_Actions[Inf_NUM_TYPES] =
{
const Act_Action_t NextAction;
void (*FuncPars) (void *Args);
void *Args;
} Inf_Actions[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = {ActSeeCrsInf,NULL,NULL},
[Inf_INFORMATION ] = {ActSeeCrsInf,NULL,NULL},
[Inf_TEACHING_GUIDE] = {ActSeeTchGui,NULL,NULL},
[Inf_LECTURES ] = {ActSeeSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_LECTURES ]},
[Inf_PRACTICALS ] = {ActSeeSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_PRACTICALS]},
@ -331,14 +326,9 @@ static void Inf_PutIconToViewInfo (void *Type)
void Inf_PutIconToEditInfo (void *Type)
{
extern Syl_WhichSyllabus_t Syl_WhichSyllabus[Syl_NUM_WHICH_SYLLABUS];
static struct
static struct Act_ActionFunc Inf_Actions[Inf_NUM_TYPES] =
{
const Act_Action_t NextAction;
void (*FuncPars) (void *Args);
void *Args;
} Inf_Actions[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = {ActEdiCrsInf,NULL,NULL},
[Inf_INFORMATION ] = {ActEdiCrsInf,NULL,NULL},
[Inf_TEACHING_GUIDE] = {ActEdiTchGui,NULL,NULL},
[Inf_LECTURES ] = {ActEdiSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_LECTURES ]},
[Inf_PRACTICALS ] = {ActEdiSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_PRACTICALS]},
@ -362,14 +352,9 @@ static void Inf_PutCheckboxForceStdsToReadInfo (bool MustBeRead,bool Disabled)
{
extern Syl_WhichSyllabus_t Syl_WhichSyllabus[Syl_NUM_WHICH_SYLLABUS];
extern const char *Txt_Force_students_to_read_this_information;
static struct
static struct Act_ActionFunc Inf_Actions[Inf_NUM_TYPES] =
{
const Act_Action_t NextAction;
void (*FuncPars) (void *Args);
void *Args;
} Inf_Actions[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = {ActChgFrcReaCrsInf,NULL,NULL},
[Inf_INFORMATION ] = {ActChgFrcReaCrsInf,NULL,NULL},
[Inf_TEACHING_GUIDE] = {ActChgFrcReaTchGui,NULL,NULL},
[Inf_LECTURES ] = {ActChgFrcReaSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_LECTURES ]},
[Inf_PRACTICALS ] = {ActChgFrcReaSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_PRACTICALS]},
@ -396,14 +381,9 @@ static void Inf_PutCheckboxConfirmIHaveReadInfo (void)
{
extern Syl_WhichSyllabus_t Syl_WhichSyllabus[Syl_NUM_WHICH_SYLLABUS];
extern const char *Txt_I_have_read_this_information;
static struct
static struct Act_ActionFunc Inf_Actions[Inf_NUM_TYPES] =
{
const Act_Action_t NextAction;
void (*FuncPars) (void *Args);
void *Args;
} Inf_Actions[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = {ActChgHavReaCrsInf,NULL,NULL},
[Inf_INFORMATION ] = {ActChgHavReaCrsInf,NULL,NULL},
[Inf_TEACHING_GUIDE] = {ActChgHavReaTchGui,NULL,NULL},
[Inf_LECTURES ] = {ActChgHavReaSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_LECTURES ]},
[Inf_PRACTICALS ] = {ActChgHavReaSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_PRACTICALS]},
@ -472,14 +452,9 @@ void Inf_WriteMsgYouMustReadInfo (void)
extern Syl_WhichSyllabus_t Syl_WhichSyllabus[Syl_NUM_WHICH_SYLLABUS];
extern const char *Txt_Required_reading;
extern const char *Txt_You_should_read_the_following_information;
static struct
static struct Act_ActionFunc Inf_Actions[Inf_NUM_TYPES] =
{
const Act_Action_t NextAction;
void (*FuncPars) (void *Args);
void *Args;
} Inf_Actions[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = {ActSeeCrsInf,NULL,NULL},
[Inf_INFORMATION ] = {ActSeeCrsInf,NULL,NULL},
[Inf_TEACHING_GUIDE] = {ActSeeTchGui,NULL,NULL},
[Inf_LECTURES ] = {ActSeeSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_LECTURES ]},
[Inf_PRACTICALS ] = {ActSeeSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_PRACTICALS]},
@ -840,9 +815,9 @@ void Inf_FormsToSelSendInfo (void)
struct Inf_FromDB FromDB;
Inf_Src_t InfoSrc;
bool InfoAvailable[Inf_NUM_SOURCES];
static const Act_Action_t Inf_ActionsSelecInfoSrc[Inf_NUM_TYPES] =
static Act_Action_t Inf_ActionsSelecInfoSrc[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = ActSelInfSrcCrsInf,
[Inf_INFORMATION ] = ActSelInfSrcCrsInf,
[Inf_TEACHING_GUIDE] = ActSelInfSrcTchGui,
[Inf_LECTURES ] = ActSelInfSrcSyl,
[Inf_PRACTICALS ] = ActSelInfSrcSyl,
@ -863,7 +838,7 @@ void Inf_FormsToSelSendInfo (void)
};
const char *HelpEdit[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = Hlp_COURSE_Information_edit,
[Inf_INFORMATION ] = Hlp_COURSE_Information_edit,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
@ -1128,7 +1103,7 @@ static void Inf_AsignInfoType (struct Inf_Info *Info,
switch (Act_GetSuperAction (Gbl.Action.Act))
{
case ActSeeCrsInf:
Info->Type = Inf_INTRODUCTION;
Info->Type = Inf_INFORMATION;
break;
case ActSeeTchGui:
Info->Type = Inf_TEACHING_GUIDE;
@ -1247,7 +1222,7 @@ void Inf_GetAndCheckInfoSrcFromDB (struct Syl_Syllabus *Syllabus,
if (!Syl_CheckSyllabus (Syllabus,CrsCod))
FromDB->Src = Inf_NONE;
break;
case Inf_INTRODUCTION:
case Inf_INFORMATION:
case Inf_TEACHING_GUIDE:
case Inf_BIBLIOGRAPHY:
case Inf_FAQ:
@ -1348,9 +1323,15 @@ static bool Inf_CheckAndShowPlainTxt (void)
if (TxtHTML[0])
{
if (Gbl.Crs.Info.Type == Inf_INTRODUCTION ||
Gbl.Crs.Info.Type == Inf_TEACHING_GUIDE)
Lay_WriteHeaderClassPhoto (Vie_VIEW);
switch (Gbl.Crs.Info.Type)
{
case Inf_INFORMATION:
case Inf_TEACHING_GUIDE:
Lay_WriteHeaderClassPhoto (Vie_VIEW);
break;
default:
break;
}
HTM_DIV_Begin ("class=\"LM DAT_%s\"",The_GetSuffix ());
@ -1413,9 +1394,15 @@ static bool Inf_CheckAndShowRichTxt (void)
if (TxtMD[0])
{
if (Gbl.Crs.Info.Type == Inf_INTRODUCTION ||
Gbl.Crs.Info.Type == Inf_TEACHING_GUIDE)
Lay_WriteHeaderClassPhoto (Vie_VIEW);
switch (Gbl.Crs.Info.Type)
{
case Inf_INFORMATION:
case Inf_TEACHING_GUIDE:
Lay_WriteHeaderClassPhoto (Vie_VIEW);
break;
default:
break;
}
HTM_DIV_Begin ("id=\"crs_info\" class=\"LM CRS_INFO_%s\"",
The_GetSuffix ());
@ -1510,14 +1497,9 @@ void Inf_EditPlainTxtInfo (void)
extern const char *Txt_Save_changes;
struct Syl_Syllabus Syllabus;
char TxtHTML[Cns_MAX_BYTES_LONG_TEXT + 1];
static struct
static struct Act_ActionFunc Inf_Actions[Inf_NUM_TYPES] =
{
const Act_Action_t NextAction;
void (*FuncPars) (void *Args);
void *Args;
} Inf_Actions[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = {ActRcvPlaTxtCrsInf,NULL,NULL},
[Inf_INFORMATION ] = {ActRcvPlaTxtCrsInf,NULL,NULL},
[Inf_TEACHING_GUIDE] = {ActRcvPlaTxtTchGui,NULL,NULL},
[Inf_LECTURES ] = {ActRcvPlaTxtSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_LECTURES ]},
[Inf_PRACTICALS ] = {ActRcvPlaTxtSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_PRACTICALS]},
@ -1528,7 +1510,7 @@ void Inf_EditPlainTxtInfo (void)
};
const char *HelpEdit[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = Hlp_COURSE_Information_edit,
[Inf_INFORMATION ] = Hlp_COURSE_Information_edit,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
@ -1551,9 +1533,15 @@ void Inf_EditPlainTxtInfo (void)
Box_BoxBegin (Txt_INFO_TITLE[Gbl.Crs.Info.Type],NULL,NULL,
HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
if (Gbl.Crs.Info.Type == Inf_INTRODUCTION ||
Gbl.Crs.Info.Type == Inf_TEACHING_GUIDE)
Lay_WriteHeaderClassPhoto (Vie_VIEW);
switch (Gbl.Crs.Info.Type)
{
case Inf_INFORMATION:
case Inf_TEACHING_GUIDE:
Lay_WriteHeaderClassPhoto (Vie_VIEW);
break;
default:
break;
}
/***** Get info text from database *****/
Inf_GetInfoTxtFromDB (Gbl.Hierarchy.Node[Hie_CRS].HieCod,Gbl.Crs.Info.Type,
@ -1585,14 +1573,9 @@ void Inf_EditRichTxtInfo (void)
extern const char *Txt_Save_changes;
struct Syl_Syllabus Syllabus;
char TxtHTML[Cns_MAX_BYTES_LONG_TEXT + 1];
static struct
static struct Act_ActionFunc Inf_Actions[Inf_NUM_TYPES] =
{
const Act_Action_t NextAction;
void (*FuncPars) (void *Args);
void *Args;
} Inf_Actions[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = {ActRcvRchTxtCrsInf,NULL,NULL},
[Inf_INFORMATION ] = {ActRcvRchTxtCrsInf,NULL,NULL},
[Inf_TEACHING_GUIDE] = {ActRcvRchTxtTchGui,NULL,NULL},
[Inf_LECTURES ] = {ActRcvRchTxtSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_LECTURES ]},
[Inf_PRACTICALS ] = {ActRcvRchTxtSyl ,Syl_PutParWhichSyllabus,&Syl_WhichSyllabus[Syl_PRACTICALS]},
@ -1603,7 +1586,7 @@ void Inf_EditRichTxtInfo (void)
};
const char *HelpEdit[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = Hlp_COURSE_Information_edit,
[Inf_INFORMATION ] = Hlp_COURSE_Information_edit,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
@ -1626,9 +1609,15 @@ void Inf_EditRichTxtInfo (void)
Box_BoxBegin (Txt_INFO_TITLE[Gbl.Crs.Info.Type],NULL,NULL,
HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
if (Gbl.Crs.Info.Type == Inf_INTRODUCTION ||
Gbl.Crs.Info.Type == Inf_TEACHING_GUIDE)
Lay_WriteHeaderClassPhoto (Vie_VIEW);
switch (Gbl.Crs.Info.Type)
{
case Inf_INFORMATION:
case Inf_TEACHING_GUIDE:
Lay_WriteHeaderClassPhoto (Vie_VIEW);
break;
default:
break;
}
/***** Get info text from database *****/
Inf_GetInfoTxtFromDB (Gbl.Hierarchy.Node[Hie_CRS].HieCod,Gbl.Crs.Info.Type,

View File

@ -39,7 +39,7 @@
#define Inf_NUM_TYPES 8
typedef enum
{
Inf_INTRODUCTION = 0,
Inf_INFORMATION = 0,
Inf_TEACHING_GUIDE = 1,
Inf_LECTURES = 2,
Inf_PRACTICALS = 3,

View File

@ -42,14 +42,14 @@ extern struct Globals Gbl;
static const char *Inf_DB_NamesForInfoType[Inf_NUM_TYPES] =
{
[Inf_INTRODUCTION ] = "intro", // TODO: Change this to "introduction"!
[Inf_TEACHING_GUIDE] = "description", // TODO: Change this to "guide"!
[Inf_LECTURES ] = "theory", // TODO: Change this to "lectures"!
[Inf_PRACTICALS ] = "practices", // TODO: Change this to "practicals"!
[Inf_BIBLIOGRAPHY ] = "bibliography",
[Inf_FAQ ] = "FAQ",
[Inf_LINKS ] = "links",
[Inf_ASSESSMENT ] = "assessment",
[Inf_INFORMATION ] = "intro", // TODO: Change this to "inf"
[Inf_TEACHING_GUIDE] = "description", // TODO: Change this to "gui"
[Inf_LECTURES ] = "theory", // TODO: Change this to "lec"
[Inf_PRACTICALS ] = "practices", // TODO: Change this to "pra"
[Inf_BIBLIOGRAPHY ] = "bibliography", // TODO: Change this to "bib"
[Inf_FAQ ] = "FAQ", // TODO: Change this to "faq"
[Inf_LINKS ] = "links", // TODO: Change this to "lnk"
[Inf_ASSESSMENT ] = "assessment", // TODO: Change this to "ass"
};
static const char *Inf_DB_NamesForInfoSrc[Inf_NUM_SOURCES] =

View File

@ -89,7 +89,7 @@ static void Ins_GetInstitDataFromRow (MYSQL_RES *mysql_res,
bool GetNumUsrsWhoClaimToBelongToIns);
static void Ins_ListInstitutionsForEdition (void);
static bool Ins_CheckIfICanEdit (struct Hie_Node *Ins);
static Usr_ICan_t Ins_CheckIfICanEdit (struct Hie_Node *Ins);
static void Ins_UpdateInsNameDB (long InsCod,const char *FldName,const char *NewName);
@ -97,7 +97,7 @@ static void Ins_ShowAlertAndButtonToGoToIns (void);
static void Ins_PutFormToCreateInstitution (void);
static void Ins_PutHeadInstitutionsForEdition (void);
static void Ins_ReceiveFormRequestOrCreateIns (Hie_Status_t Status);
static void Ins_ReceiveRequestOrCreateIns (Hie_Status_t Status);
static void Ins_EditingInstitutionConstructor ();
static void Ins_EditingInstitutionDestructor ();
@ -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);
@ -875,7 +873,7 @@ void Ins_WriteSelectorOfInstitution (void)
static void Ins_ListInstitutionsForEdition (void)
{
extern const char *Txt_INSTITUTION_STATUS[Hie_NUM_STATUS_TXT];
static const Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
static Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
{
[Nam_SHRT_NAME] = ActRenInsSho,
[Nam_FULL_NAME] = ActRenInsFul,
@ -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);
@ -1431,33 +1433,33 @@ static void Ins_PutHeadInstitutionsForEdition (void)
/*************** Receive form to request a new institution *******************/
/*****************************************************************************/
void Ins_ReceiveFormReqIns (void)
void Ins_ReceiveReqIns (void)
{
/***** Institution constructor *****/
Ins_EditingInstitutionConstructor ();
/***** Receive form to request a new institution *****/
Ins_ReceiveFormRequestOrCreateIns ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
Ins_ReceiveRequestOrCreateIns ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
}
/*****************************************************************************/
/***************** Receive form to create a new institution ******************/
/*****************************************************************************/
void Ins_ReceiveFormNewIns (void)
void Ins_ReceiveNewIns (void)
{
/***** Institution constructor *****/
Ins_EditingInstitutionConstructor ();
/***** Receive form to create a new institution *****/
Ins_ReceiveFormRequestOrCreateIns ((Hie_Status_t) 0);
Ins_ReceiveRequestOrCreateIns ((Hie_Status_t) 0);
}
/*****************************************************************************/
/*********** Receive form to request or create a new institution *************/
/*****************************************************************************/
static void Ins_ReceiveFormRequestOrCreateIns (Hie_Status_t Status)
static void Ins_ReceiveRequestOrCreateIns (Hie_Status_t Status)
{
extern const char *Txt_Created_new_institution_X;
char *Names[Nam_NUM_SHRT_FULL_NAMES];

View File

@ -64,8 +64,8 @@ void Ins_ChangeInsWWW (void);
void Ins_ChangeInsStatus (void);
void Ins_ContEditAfterChgIns (void);
void Ins_ReceiveFormReqIns (void);
void Ins_ReceiveFormNewIns (void);
void Ins_ReceiveReqIns (void);
void Ins_ReceiveNewIns (void);
unsigned Ins_GetCachedNumInssWithUsrs (Rol_Role_t Role);

View File

@ -299,7 +299,7 @@ static void InsCfg_Map (void)
static void InsCfg_Country (Vie_ViewType_t ViewType,Frm_PutForm_t PutForm)
{
extern const char *Par_CodeStr[];
extern const char *Par_CodeStr[Par_NUM_PAR_COD];
extern const char *Txt_HIERARCHY_SINGUL_Abc[Hie_NUM_LEVELS];
unsigned NumCty;
const struct Hie_Node *Cty;

View File

@ -220,7 +220,7 @@ void Lan_UpdateMyLanguageToCurrentLanguage (void)
Lan_Language_t Lan_GetParLanguage (void)
{
extern const unsigned Txt_Current_CGI_SWAD_Language;
extern unsigned Txt_Current_CGI_SWAD_Language;
return (Lan_Language_t)
Par_GetParUnsignedLong ("Lan",

View File

@ -117,7 +117,7 @@ static void Lay_HelpTextEditor (const char *Text,const char *InlineMath,const ch
void Lay_WriteStartOfPage (void)
{
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
extern const unsigned Txt_Current_CGI_SWAD_Language;
extern unsigned Txt_Current_CGI_SWAD_Language;
static const char *LayoutMainZone[Mnu_NUM_MENUS] =
{
[Mnu_MENU_HORIZONTAL] = "main_horizontal",
@ -655,9 +655,6 @@ static void Lay_WriteScripts (void)
default:
break;
}
/***** Script for Google Analytics *****/
HTM_Txt (Cfg_GOOGLE_ANALYTICS);
}
// Change page title
@ -1619,10 +1616,10 @@ void Lay_AdvertisementMobile (void)
/*****************************************************************************/
/****************** Indent forum, chat or course tree title ******************/
/*****************************************************************************/
// IsLastItemInLevel[] is a vector with at least 1 + Level elements
// IsLastItemInLevel is a vector with at least 1 + Level elements
void Lay_IndentDependingOnLevel (unsigned Level,
Lay_LastItem_t IsLastItemInLevel[],
const Lay_LastItem_t *IsLastItemInLevel,
Lay_HorizontalLineAtRight_t HorizontalLineAtRight)
{
static const char *Icons[Lay_NUM_HORIZONTAL_LINE_AT_RIGHT][Lay_NUM_LAST_ITEM] =

View File

@ -94,7 +94,7 @@ void Lay_WriteHeaderClassPhoto (Vie_ViewType_t ViewType);
void Lay_AdvertisementMobile (void);
void Lay_IndentDependingOnLevel (unsigned Level,
Lay_LastItem_t IsLastItemInLevel[],
const Lay_LastItem_t *IsLastItemInLevel,
Lay_HorizontalLineAtRight_t HorizontalLineAtRight);
void Lay_HelpPlainEditor (void);

View File

@ -45,16 +45,6 @@
#include "swad_parameter.h"
#include "swad_parameter_code.h"
/*****************************************************************************/
/****************************** Private constants ****************************/
/*****************************************************************************/
static const bool Lnk_ICanEditLinks[Rol_NUM_ROLES] =
{
/* Users who can edit */
[Rol_SYS_ADM] = true,
};
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
@ -81,6 +71,8 @@ static struct Lnk_Link *Lnk_EditingLnk = NULL; // Static variable to keep the li
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static Usr_ICan_t Lnk_CheckIfICanEditLinks (void);
static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args);
static void Lnk_PutIconToEditLinks (void);
static void Lnk_WriteListOfLinks (const struct Lnk_Links *Links,const char *Class);
@ -104,6 +96,21 @@ static void Lnk_PutHeadLinks (void);
static void Lnk_EditingLinkConstructor (void);
static void Lnk_EditingLinkDestructor (void);
/*****************************************************************************/
/************************* Check if I can edit links *************************/
/*****************************************************************************/
static Usr_ICan_t Lnk_CheckIfICanEditLinks (void)
{
static bool Lnk_ICanEditLinks[Rol_NUM_ROLES] =
{
/* Users who can edit */
[Rol_SYS_ADM] = Usr_I_CAN,
};
return Lnk_ICanEditLinks[Gbl.Usrs.Me.Role.Logged];
}
/*****************************************************************************/
/****************************** List all links *******************************/
/*****************************************************************************/
@ -142,7 +149,7 @@ void Lnk_SeeLinks (void)
static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args)
{
/***** Put icon to edit links *****/
if (Lnk_ICanEditLinks[Gbl.Usrs.Me.Role.Logged])
if (Lnk_CheckIfICanEditLinks () == Usr_I_CAN)
Lnk_PutIconToEditLinks ();
/***** Put icon to view banners *****/
@ -155,8 +162,7 @@ static void Lnk_PutIconsListingLinks (__attribute__((unused)) void *Args)
static void Lnk_PutIconToEditLinks (void)
{
Ico_PutContextualIconToEdit (ActEdiLnk,NULL,
NULL,NULL);
Ico_PutContextualIconToEdit (ActEdiLnk,NULL,NULL,NULL);
}
/*****************************************************************************/
@ -269,8 +275,7 @@ static void Lnk_EditLinksInternal (void)
static void Lnk_PutIconsEditingLinks (__attribute__((unused)) void *Args)
{
/***** Put icon to view links *****/
Ico_PutContextualIconToView (ActSeeLnk,NULL,
NULL,NULL);
Ico_PutContextualIconToView (ActSeeLnk,NULL,NULL,NULL);
/***** Put icon to view banners *****/
Ban_PutIconToViewBanners ();
@ -395,7 +400,7 @@ static void Lnk_FreeListLinks (struct Lnk_Links *Links)
static void Lnk_ListLinksForEdition (const struct Lnk_Links *Links)
{
static const Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
static Act_Action_t ActionRename[Nam_NUM_SHRT_FULL_NAMES] =
{
[Nam_SHRT_NAME] = ActRenLnkSho,
[Nam_FULL_NAME] = ActRenLnkFul,
@ -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\"");
@ -707,7 +712,7 @@ static void Lnk_PutHeadLinks (void)
/******************* Receive form to create a new link ***********************/
/*****************************************************************************/
void Lnk_ReceiveFormNewLink (void)
void Lnk_ReceiveNewLink (void)
{
extern const char *Txt_You_must_specify_the_web_address;
extern const char *Txt_Created_new_link_X;

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