Version 23.73: Apr 06, 2024 Code refactoring related to new type Usr_ICan_t.

This commit is contained in:
acanas 2024-04-06 21:23:53 +02:00
parent b44376b118
commit d6df495d93
35 changed files with 3150 additions and 2719 deletions

View File

@ -5261,21 +5261,23 @@ int swad__getLastLocation (struct soap *soap,
The other user does not have to share any course with me, The other user does not have to share any course with me,
but at least some course of each one has to share center. but at least some course of each one has to share center.
*/ */
if (Roo_DB_CheckIfICanSeeUsrLocation ((long) userCode) == Usr_I_CAN) switch (Roo_DB_CheckIfICanSeeUsrLocation ((long) userCode))
{ {
/***** Get list of locations *****/ case Usr_I_CAN:
NumLocs = Roo_DB_GetUsrLastLocation (&mysql_res,(long) userCode); /***** Get list of locations *****/
API_GetLocationData (soap, NumLocs = Roo_DB_GetUsrLastLocation (&mysql_res,(long) userCode);
&(getLastLocationOut->location), API_GetLocationData (soap,
&(getLastLocationOut->checkinTime), // Get check in time &(getLastLocationOut->location),
&mysql_res,NumLocs); &(getLastLocationOut->checkinTime), // Get check in time
} &mysql_res,NumLocs);
else break;
{ case Usr_I_CAN_NOT:
/* I can not see user's location ==> reset output */ default:
API_ResetLocation (soap, &(getLastLocationOut->location)); /* I can not see user's location ==> reset output */
getLastLocationOut->checkinTime = 0L; API_ResetLocation (soap, &(getLastLocationOut->location));
} getLastLocationOut->checkinTime = 0L;
break;
}
return SOAP_OK; return SOAP_OK;
} }

317
swad_ID.c
View File

@ -328,14 +328,21 @@ void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor)
UsrDat->IDs.List[NumID].Confirmed ? "USR_ID_C" : UsrDat->IDs.List[NumID].Confirmed ? "USR_ID_C" :
"USR_ID_NC", "USR_ID_NC",
The_GetSuffix ()); The_GetSuffix ());
if (ICanSeeUsrID == Usr_I_CAN) switch (ICanSeeUsrID)
HTM_Txt (UsrDat->IDs.List[NumID].ID); {
else case Usr_I_CAN:
HTM_Txt ("********"); HTM_Txt (UsrDat->IDs.List[NumID].ID);
break;
case Usr_I_CAN_NOT:
default:
HTM_Txt ("********");
break;
}
HTM_SPAN_End (); HTM_SPAN_End ();
/* Put link to confirm ID? */ /* Put link to confirm ID? */
if (ICanConfirmUsrID == Usr_I_CAN && !UsrDat->IDs.List[NumID].Confirmed) if (ICanConfirmUsrID == Usr_I_CAN &&
!UsrDat->IDs.List[NumID].Confirmed)
ID_PutLinkToConfirmID (UsrDat,NumID,Anchor); ID_PutLinkToConfirmID (UsrDat,NumID,Anchor);
} }
} }
@ -691,22 +698,24 @@ void ID_RemoveOtherUsrID (void)
{ {
/***** Get other user's code from form and get user's data *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Remove user's ID *****/ case Usr_I_CAN:
ID_RemoveUsrID (&Gbl.Usrs.Other.UsrDat, /***** Remove user's ID *****/
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)); ID_RemoveUsrID (&Gbl.Usrs.Other.UsrDat,
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
/***** Update list of IDs *****/ /***** Update list of IDs *****/
ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat); ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat);
/***** Show form again *****/ /***** Show form again *****/
Acc_ShowFormChgOtherUsrAccount (); Acc_ShowFormChgOtherUsrAccount ();
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else // User not found else // User not found
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
@ -720,48 +729,52 @@ static void ID_RemoveUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOt
extern const char *Txt_ID_X_removed; extern const char *Txt_ID_X_removed;
extern const char *Txt_You_can_not_delete_this_ID; extern const char *Txt_You_can_not_delete_this_ID;
char UsrID[ID_MAX_BYTES_USR_ID + 1]; char UsrID[ID_MAX_BYTES_USR_ID + 1];
Usr_ICan_t ICanRemove; Usr_ICan_t ICanRemove = Usr_I_CAN_NOT;
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN) switch (Usr_CheckIfICanEditOtherUsr (UsrDat))
{ {
/***** Get user's ID from form *****/ case Usr_I_CAN:
Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID); /***** Get user's ID from form *****/
// Users' IDs are always stored internally in capitals and without leading zeros Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID);
Str_RemoveLeadingZeros (UsrID); // Users' IDs are always stored internally in capitals and without leading zeros
Str_ConvertToUpperText (UsrID); Str_RemoveLeadingZeros (UsrID);
Str_ConvertToUpperText (UsrID);
if (UsrDat->IDs.Num < 2) // One unique ID if (UsrDat->IDs.Num >= 2)
ICanRemove = Usr_I_CAN_NOT; switch (MeOrOther)
else {
switch (MeOrOther) case Usr_ME:
// I can remove my ID only if it is not confirmed
ICanRemove = ID_DB_CheckIfConfirmed (UsrDat->UsrCod,UsrID) ? Usr_I_CAN_NOT :
Usr_I_CAN;
break;
case Usr_OTHER:
ICanRemove = Usr_I_CAN;
break;
}
switch (ICanRemove)
{ {
case Usr_ME: case Usr_I_CAN:
// I can remove my ID only if it is not confirmed /***** Remove one of the user's IDs *****/
ICanRemove = ID_DB_CheckIfConfirmed (UsrDat->UsrCod,UsrID) ? Usr_I_CAN_NOT : ID_DB_RemoveUsrID (UsrDat->UsrCod,UsrID);
Usr_I_CAN;
/***** Show message *****/
Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID,
Txt_ID_X_removed,UsrID);
break; break;
case Usr_OTHER: case Usr_I_CAN_NOT:
default: default:
ICanRemove = Usr_I_CAN; Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID,
Txt_You_can_not_delete_this_ID);
break; break;
} }
break;
if (ICanRemove == Usr_I_CAN) case Usr_I_CAN_NOT:
{ default:
/***** Remove one of the user's IDs *****/ Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
ID_DB_RemoveUsrID (UsrDat->UsrCod,UsrID); break;
}
/***** Show message *****/
Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID,
Txt_ID_X_removed,
UsrID);
}
else
Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID,
Txt_You_can_not_delete_this_ID);
}
else
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
} }
/*****************************************************************************/ /*****************************************************************************/
@ -788,22 +801,24 @@ void ID_ChangeOtherUsrID (void)
{ {
/***** Get other user's code from form and get user's data *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Change user's ID *****/ case Usr_I_CAN:
ID_ChangeUsrID (&Gbl.Usrs.Other.UsrDat, /***** Change user's ID *****/
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)); ID_ChangeUsrID (&Gbl.Usrs.Other.UsrDat,
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
/***** Update list of IDs *****/ /***** Update list of IDs *****/
ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat); ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat);
/***** Show form again *****/ /***** Show form again *****/
Acc_ShowFormChgOtherUsrAccount (); Acc_ShowFormChgOtherUsrAccount ();
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else // User not found else // User not found
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
@ -824,65 +839,69 @@ static void ID_ChangeUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOt
bool AlreadyExists; bool AlreadyExists;
unsigned NumIDFound = 0; // Initialized to avoid warning unsigned NumIDFound = 0; // Initialized to avoid warning
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN) switch (Usr_CheckIfICanEditOtherUsr (UsrDat))
{ {
/***** Get new user's ID from form *****/ case Usr_I_CAN:
Par_GetParText ("NewID",NewID,ID_MAX_BYTES_USR_ID); /***** Get new user's ID from form *****/
// Users' IDs are always stored internally in capitals and without leading zeros Par_GetParText ("NewID",NewID,ID_MAX_BYTES_USR_ID);
Str_RemoveLeadingZeros (NewID); // Users' IDs are always stored internally in capitals and without leading zeros
Str_ConvertToUpperText (NewID); Str_RemoveLeadingZeros (NewID);
Str_ConvertToUpperText (NewID);
if (ID_CheckIfUsrIDIsValid (NewID)) // If new ID is valid if (ID_CheckIfUsrIDIsValid (NewID)) // If new ID is valid
{
/***** Check if the new ID matches any of the old IDs *****/
for (NumID = 0, AlreadyExists = false;
NumID < UsrDat->IDs.Num && !AlreadyExists;
NumID++)
if (!strcasecmp (UsrDat->IDs.List[NumID].ID,NewID))
{
AlreadyExists = true;
NumIDFound = NumID;
}
if (AlreadyExists) // This new ID was already associated to this user
{ {
if (MeOrOther == Usr_ME || UsrDat->IDs.List[NumIDFound].Confirmed) /***** Check if the new ID matches any of the old IDs *****/
Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID, for (NumID = 0, AlreadyExists = false;
Txt_The_ID_X_matches_one_of_the_existing, NumID < UsrDat->IDs.Num && !AlreadyExists;
NewID); NumID++)
else // It's not me && !Confirmed if (!strcasecmp (UsrDat->IDs.List[NumID].ID,NewID))
{
AlreadyExists = true;
NumIDFound = NumID;
}
if (AlreadyExists) // This new ID was already associated to this user
{ {
/***** Mark this ID as confirmed *****/ if (MeOrOther == Usr_ME || UsrDat->IDs.List[NumIDFound].Confirmed)
ID_DB_ConfirmUsrID (UsrDat->UsrCod,NewID); Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID,
Txt_The_ID_X_matches_one_of_the_existing,
NewID);
else // It's not me && !Confirmed
{
/***** Mark this ID as confirmed *****/
ID_DB_ConfirmUsrID (UsrDat->UsrCod,NewID);
Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID,
Txt_The_ID_X_has_been_confirmed,
NewID);
}
}
else if (UsrDat->IDs.Num >= ID_MAX_IDS_PER_USER)
Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID,
Txt_A_user_can_not_have_more_than_X_IDs,
ID_MAX_IDS_PER_USER);
else // OK ==> add this new ID to my list of IDs
{
/***** Save this new ID *****/
// It's me ==> ID not confirmed
// Not me ==> ID confirmed
ID_DB_InsertANewUsrID (UsrDat->UsrCod,NewID,MeOrOther == Usr_OTHER);
Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID, Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID,
Txt_The_ID_X_has_been_confirmed, Txt_The_ID_X_has_been_registered_successfully,
NewID); NewID);
} }
} }
else if (UsrDat->IDs.Num >= ID_MAX_IDS_PER_USER) else // New ID is not valid
Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID, Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID,
Txt_A_user_can_not_have_more_than_X_IDs, Txt_The_ID_X_is_not_valid,
ID_MAX_IDS_PER_USER); NewID);
else // OK ==> add this new ID to my list of IDs break;
{ case Usr_I_CAN_NOT:
/***** Save this new ID *****/ default:
// It's me ==> ID not confirmed Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
// Not me ==> ID confirmed break;
ID_DB_InsertANewUsrID (UsrDat->UsrCod,NewID,MeOrOther == Usr_OTHER);
Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID,
Txt_The_ID_X_has_been_registered_successfully,
NewID);
}
}
else // New ID is not valid
Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID,
Txt_The_ID_X_is_not_valid,
NewID);
} }
else
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
} }
/*****************************************************************************/ /*****************************************************************************/
@ -917,48 +936,52 @@ void ID_ConfirmOtherUsrID (void)
ICanConfirm = Usr_I_CAN; ICanConfirm = Usr_I_CAN;
} }
if (ICanConfirm == Usr_I_CAN) switch (ICanConfirm)
{ {
/***** Get user's ID from form *****/ case Usr_I_CAN:
Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID); /***** Get user's ID from form *****/
// Users' IDs are always stored internally in capitals and without leading zeros Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID);
Str_RemoveLeadingZeros (UsrID); // Users' IDs are always stored internally in capitals and without leading zeros
Str_ConvertToUpperText (UsrID); Str_RemoveLeadingZeros (UsrID);
Str_ConvertToUpperText (UsrID);
for (NumID = 0, Found = false; for (NumID = 0, Found = false;
NumID < Gbl.Usrs.Other.UsrDat.IDs.Num && !Found; NumID < Gbl.Usrs.Other.UsrDat.IDs.Num && !Found;
NumID++) NumID++)
if (!strcasecmp (UsrID,Gbl.Usrs.Other.UsrDat.IDs.List[NumID].ID)) if (!strcasecmp (UsrID,Gbl.Usrs.Other.UsrDat.IDs.List[NumID].ID))
{
Found = true;
NumIDFound = NumID;
}
if (Found) // Found
{ {
Found = true; if (Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].Confirmed)
NumIDFound = NumID; /***** ID found and already confirmed *****/
} Ale_CreateAlert (Ale_INFO,ID_ID_SECTION_ID,
Txt_ID_X_had_already_been_confirmed,
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID);
else
{
/***** Mark this ID as confirmed *****/
ID_DB_ConfirmUsrID (Gbl.Usrs.Other.UsrDat.UsrCod,
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID);
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].Confirmed = true;
if (Found) // Found /***** Write success message *****/
{ Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID,
if (Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].Confirmed) Txt_The_ID_X_has_been_confirmed,
/***** ID found and already confirmed *****/ Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID);
Ale_CreateAlert (Ale_INFO,ID_ID_SECTION_ID, }
Txt_ID_X_had_already_been_confirmed,
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID);
else
{
/***** Mark this ID as confirmed *****/
ID_DB_ConfirmUsrID (Gbl.Usrs.Other.UsrDat.UsrCod,
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID);
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].Confirmed = true;
/***** Write success message *****/
Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID,
Txt_The_ID_X_has_been_confirmed,
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID);
} }
} else // User's ID not found
else // User's ID not found Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break;
case Usr_I_CAN_NOT:
default:
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else // I can not confirm
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
/***** Show one or multiple records *****/ /***** Show one or multiple records *****/
switch (Gbl.Action.Original) switch (Gbl.Action.Original)

View File

@ -487,39 +487,41 @@ void Acc_ShowFormChgOtherUsrAccount (void)
{ {
/***** Get user whose account must be changed *****/ /***** Get user whose account must be changed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) {
{ case Usr_I_CAN:
/***** Get user's nickname and email address /***** Get user's nickname and email address
It's necessary because nickname or email could be just updated *****/ It's necessary because nickname or email could be just updated *****/
Nck_DB_GetNicknameFromUsrCod (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.Usrs.Other.UsrDat.Nickname); Nck_DB_GetNicknameFromUsrCod (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.Usrs.Other.UsrDat.Nickname);
Mai_GetEmailFromUsrCod (&Gbl.Usrs.Other.UsrDat); Mai_GetEmailFromUsrCod (&Gbl.Usrs.Other.UsrDat);
/***** Show user's record *****/ /***** Show user's record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST, Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
&Gbl.Usrs.Other.UsrDat,NULL); &Gbl.Usrs.Other.UsrDat,NULL);
/***** Begin container for this user *****/ /***** Begin container for this user *****/
HTM_DIV_Begin ("class=\"REC_USR\""); HTM_DIV_Begin ("class=\"REC_USR\"");
/***** Show form to change password and nickname *****/ /***** Show form to change password and nickname *****/
HTM_DIV_Begin ("class=\"REC_LEFT\""); HTM_DIV_Begin ("class=\"REC_LEFT\"");
Pwd_ShowFormChgOtherUsrPwd (); Pwd_ShowFormChgOtherUsrPwd ();
Nck_ShowFormChangeOtherUsrNickname (); Nck_ShowFormChangeOtherUsrNickname ();
HTM_DIV_End ();
/***** Show form to change email and ID *****/
HTM_DIV_Begin ("class=\"REC_RIGHT\"");
Mai_ShowFormChangeOtherUsrEmail ();
ID_ShowFormChangeOtherUsrID ();
HTM_DIV_End ();
/***** End container for this user *****/
HTM_DIV_End (); HTM_DIV_End ();
break;
/***** Show form to change email and ID *****/ case Usr_I_CAN_NOT:
HTM_DIV_Begin ("class=\"REC_RIGHT\""); default:
Mai_ShowFormChangeOtherUsrEmail (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
ID_ShowFormChangeOtherUsrID (); break;
HTM_DIV_End ();
/***** Begin container for this user *****/
HTM_DIV_End ();
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else // User not found else // User not found
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
@ -770,13 +772,17 @@ void Acc_GetUsrCodAndRemUsrGbl (void)
bool Error = false; bool Error = false;
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod))
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_I_CAN) {
Acc_ReqRemAccountOrRemAccount (Acc_REMOVE_USR); case Usr_I_CAN:
else Acc_ReqRemAccountOrRemAccount (Acc_REMOVE_USR);
Error = true; break;
} case Usr_I_CAN_NOT:
else default:
Error = true;
break;
}
else // User not found
Error = true; Error = true;
if (Error) if (Error)
@ -827,11 +833,12 @@ Usr_ICan_t Acc_CheckIfICanEliminateAccount (long UsrCod)
return (Gbl.Usrs.Me.Role.Available & (1 << Rol_SYS_ADM)) == 0 ? Usr_I_CAN : return (Gbl.Usrs.Me.Role.Available & (1 << Rol_SYS_ADM)) == 0 ? Usr_I_CAN :
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
case Usr_OTHER: case Usr_OTHER:
default:
// Only a system admin can eliminate other's account // Only a system admin can eliminate other's account
return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ? Usr_I_CAN : return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ? Usr_I_CAN :
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
} }
return Usr_I_CAN_NOT;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1103,7 +1110,6 @@ void Acc_PutIconToChangeUsrAccount (struct Usr_Data *UsrDat)
"at.svg",Ico_BLACK); "at.svg",Ico_BLACK);
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN) if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL, Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,

View File

@ -102,33 +102,37 @@ void Adm_ReqAddAdm (Hie_Level_t Level)
(Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) || (Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN : (Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
if (ICanRegister == Usr_I_CAN) switch (ICanRegister)
{ {
if (Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Level)) // User is already an administrator of current institution/center/degree case Usr_I_CAN:
{ if (Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Level)) // User is already an administrator of current institution/center/degree
Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_is_already_an_administrator_of_Y, {
Gbl.Usrs.Other.UsrDat.FullName, Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_is_already_an_administrator_of_Y,
Gbl.Hierarchy.Node[Level].FullName); Gbl.Usrs.Other.UsrDat.FullName,
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); Gbl.Hierarchy.Node[Level].FullName);
} Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
else }
{ else
/***** Show question and button to register user as administrator *****/ {
/* Begin alert */ /***** Show question and button to register user as administrator *****/
Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Txt_Do_you_really_want_to_register_the_following_user_as_an_administrator_of_X, /* Begin alert */
Gbl.Hierarchy.Node[Level].FullName); Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Txt_Do_you_really_want_to_register_the_following_user_as_an_administrator_of_X,
Gbl.Hierarchy.Node[Level].FullName);
/* Show user's record */ /* Show user's record */
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
/* End alert */ /* End alert */
Ale_ShowAlertAndButtonEnd (Enr_ActNewAdm[Level],NULL,NULL, Ale_ShowAlertAndButtonEnd (Enr_ActNewAdm[Level],NULL,NULL,
Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod, Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
Btn_CREATE_BUTTON,Txt_Register_user_IN_A_COURSE_OR_DEGREE); Btn_CREATE_BUTTON,Txt_Register_user_IN_A_COURSE_OR_DEGREE);
} }
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
else else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
@ -198,16 +202,20 @@ static void Adm_AddAdm (Hie_Level_t Level)
(Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) || (Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN : (Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
if (ICanRegister == Usr_I_CAN) switch (ICanRegister)
{ {
/***** Register administrator in current institution/center/degree in database *****/ case Usr_I_CAN:
Adm_RegisterAdmin (&Gbl.Usrs.Other.UsrDat,Level); /***** Register administrator in current institution/center/degree in database *****/
Adm_RegisterAdmin (&Gbl.Usrs.Other.UsrDat,Level);
/***** Show user's record *****/ /***** Show user's record *****/
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
} break;
else case Usr_I_CAN_NOT:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
}
} }
else else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
@ -314,28 +322,32 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
(Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) || (Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN : (Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
if (ICanRemove == Usr_I_CAN) switch (ICanRemove)
{ {
/* Check if the other user is an admin of the current institution/center/degree */ case Usr_I_CAN:
if (Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Level)) /* Check if the other user is an admin of the current institution/center/degree */
{ // The other user is an administrator of current institution/center/degree ==> ask for removing or remove her/him if (Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Level))
switch (ReqDelOrDelUsr) { // The other user is an administrator of current institution/center/degree ==> ask for removing or remove her/him
{ switch (ReqDelOrDelUsr)
case Enr_REQUEST_REMOVE_USR: // Ask if remove administrator from current institution {
Adm_AskIfRemAdm (MeOrOther,Level); case Enr_REQUEST_REMOVE_USR: // Ask if remove administrator from current institution
break; Adm_AskIfRemAdm (MeOrOther,Level);
case Enr_REMOVE_USR: // Remove administrator from current institution break;
Adm_EffectivelyRemAdm (&Gbl.Usrs.Other.UsrDat,Level); case Enr_REMOVE_USR: // Remove administrator from current institution
break; Adm_EffectivelyRemAdm (&Gbl.Usrs.Other.UsrDat,Level);
} break;
} }
else // The other user is not an administrator of current institution }
Ale_ShowAlert (Ale_WARNING,Txt_THE_USER_X_is_not_an_administrator_of_Y, else // The other user is not an administrator of current institution
Gbl.Usrs.Other.UsrDat.FullName, Ale_ShowAlert (Ale_WARNING,Txt_THE_USER_X_is_not_an_administrator_of_Y,
Gbl.Hierarchy.Node[Level].FullName); Gbl.Usrs.Other.UsrDat.FullName,
Gbl.Hierarchy.Node[Level].FullName);
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
else else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();

View File

@ -393,7 +393,6 @@ void Agd_ShowUsrAgenda (void)
extern const char *Hlp_PROFILE_Agenda_public_agenda; extern const char *Hlp_PROFILE_Agenda_public_agenda;
extern const char *Txt_Public_agenda_USER; extern const char *Txt_Public_agenda_USER;
struct Agd_Agenda Agenda; struct Agd_Agenda Agenda;
bool Error = true;
Usr_MeOrOther_t MeOrOther; Usr_MeOrOther_t MeOrOther;
char *Title; char *Title;
static struct Usr_Data *UsrDat[Usr_NUM_ME_OR_OTHER] = static struct Usr_Data *UsrDat[Usr_NUM_ME_OR_OTHER] =
@ -409,33 +408,36 @@ void Agd_ShowUsrAgenda (void)
/***** Get user *****/ /***** Get user *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
if (Agd_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) switch (Agd_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat))
{ {
Error = false; case Usr_I_CAN:
/***** Reset agenda context *****/
Agd_ResetAgenda (&Agenda);
/***** Reset agenda context *****/ /***** Begin box *****/
Agd_ResetAgenda (&Agenda); MeOrOther = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
if (asprintf (&Title,Txt_Public_agenda_USER,UsrDat[MeOrOther]->FullName) < 0)
Err_NotEnoughMemoryExit ();
Box_BoxBegin (Title,
FuncPutIcons[MeOrOther],UsrDat[MeOrOther]->EnUsrCod,
Hlp_PROFILE_Agenda_public_agenda,Box_NOT_CLOSABLE);
free (Title);
/***** Begin box *****/ /***** Show the current events in the user's agenda *****/
MeOrOther = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); Agd_ShowEventsToday (&Agenda,Agd_ANOTHER_AGENDA_TODAY);
if (asprintf (&Title,Txt_Public_agenda_USER,UsrDat[MeOrOther]->FullName) < 0)
Err_NotEnoughMemoryExit ();
Box_BoxBegin (Title,
FuncPutIcons[MeOrOther],UsrDat[MeOrOther]->EnUsrCod,
Hlp_PROFILE_Agenda_public_agenda,Box_NOT_CLOSABLE);
free (Title);
/***** Show the current events in the user's agenda *****/ /***** Show all visible events in the user's agenda *****/
Agd_ShowEventsToday (&Agenda,Agd_ANOTHER_AGENDA_TODAY); Agd_ShowEvents (&Agenda,Agd_ANOTHER_AGENDA);
/***** Show all visible events in the user's agenda *****/ /***** End box *****/
Agd_ShowEvents (&Agenda,Agd_ANOTHER_AGENDA); Box_BoxEnd ();
break;
/***** End box *****/ case Usr_I_CAN_NOT:
Box_BoxEnd (); default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
if (Error)
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }

View File

@ -1757,20 +1757,22 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
"DAT_SMALL", "DAT_SMALL",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanEditStdComment == Usr_I_CAN) // Show with form switch (ICanEditStdComment)
{ {
HTM_TEXTAREA_Begin ("name=\"CommentStd%s\" cols=\"40\" rows=\"3\"" case Usr_I_CAN: // Show with form
" class=\"INPUT_%s\"", HTM_TEXTAREA_Begin ("name=\"CommentStd%s\" cols=\"40\" rows=\"3\""
UsrDat->EnUsrCod, " class=\"INPUT_%s\"",
The_GetSuffix ()); UsrDat->EnUsrCod,
The_GetSuffix ());
HTM_Txt (CommentStd);
HTM_TEXTAREA_End ();
break;
case Usr_I_CAN_NOT: // Show without form
default:
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
CommentStd,Cns_MAX_BYTES_TEXT,Str_DONT_REMOVE_SPACES);
HTM_Txt (CommentStd); HTM_Txt (CommentStd);
HTM_TEXTAREA_End (); break;
}
else // Show without form
{
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
CommentStd,Cns_MAX_BYTES_TEXT,Str_DONT_REMOVE_SPACES);
HTM_Txt (CommentStd);
} }
HTM_TD_End (); HTM_TD_End ();
@ -1780,22 +1782,27 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
"DAT_SMALL", "DAT_SMALL",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanEditTchComment == Usr_I_CAN) // Show with form switch (ICanEditTchComment)
{ {
HTM_TEXTAREA_Begin ("name=\"CommentTch%s\" cols=\"40\" rows=\"3\"" case Usr_I_CAN: // Show with form
" class=\"INPUT_%s\"", HTM_TEXTAREA_Begin ("name=\"CommentTch%s\" cols=\"40\" rows=\"3\""
UsrDat->EnUsrCod, " class=\"INPUT_%s\"",
The_GetSuffix ()); UsrDat->EnUsrCod,
HTM_Txt (CommentTch); The_GetSuffix ());
HTM_TEXTAREA_End (); HTM_Txt (CommentTch);
} HTM_TEXTAREA_End ();
else if (Event->CommentTchVisible) // Show without form break;
{ case Usr_I_CAN_NOT: // Show without form
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, default:
CommentTch,Cns_MAX_BYTES_TEXT, if (Event->CommentTchVisible)
Str_DONT_REMOVE_SPACES); {
HTM_Txt (CommentTch); Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
} CommentTch,Cns_MAX_BYTES_TEXT,
Str_DONT_REMOVE_SPACES);
HTM_Txt (CommentTch);
}
break;
}
HTM_TD_End (); HTM_TD_End ();
/***** End table row *****/ /***** End table row *****/

File diff suppressed because it is too large Load Diff

View File

@ -85,12 +85,16 @@ unsigned Cfe_DB_GetCallsForExamsInCurrentCrs (MYSQL_RES **mysql_res)
char SubQueryStatus[64]; char SubQueryStatus[64];
/***** Build subquery about status depending on my role *****/ /***** Build subquery about status depending on my role *****/
if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN) switch (Cfe_CheckIfICanEditCallsForExams ())
sprintf (SubQueryStatus,"Status<>%u", {
(unsigned) Cfe_DELETED_CALL_FOR_EXAM); case Usr_I_CAN:
else sprintf (SubQueryStatus,"Status<>%u",(unsigned) Cfe_DELETED_CALL_FOR_EXAM);
sprintf (SubQueryStatus,"Status=%u", break;
(unsigned) Cfe_VISIBLE_CALL_FOR_EXAM); case Usr_I_CAN_NOT:
default:
sprintf (SubQueryStatus,"Status=%u",(unsigned) Cfe_VISIBLE_CALL_FOR_EXAM);
break;
}
/***** Get calls for exams (the most recent first) /***** Get calls for exams (the most recent first)
in current course from database *****/ in current course from database *****/

View File

@ -793,39 +793,43 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
/* Place */ /* Place */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit == Usr_I_CAN) switch (ICanEdit)
{ {
Frm_BeginForm (ActChgCtrPlc); case Usr_I_CAN:
ParCod_PutPar (ParCod_OthHie,Ctr->HieCod); Frm_BeginForm (ActChgCtrPlc);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL, ParCod_PutPar (ParCod_OthHie,Ctr->HieCod);
"name=\"PlcCod\"" HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL,
" class=\"PLC_SEL INPUT_%s\"", "name=\"PlcCod\""
The_GetSuffix ()); " class=\"PLC_SEL INPUT_%s\"",
HTM_OPTION (HTM_Type_STRING,"0", The_GetSuffix ());
Ctr->Specific.PlcCod == 0 ? HTM_OPTION_SELECTED : HTM_OPTION (HTM_Type_STRING,"0",
HTM_OPTION_UNSELECTED, Ctr->Specific.PlcCod == 0 ? HTM_OPTION_SELECTED :
HTM_OPTION_ENABLED, HTM_OPTION_UNSELECTED,
"%s",Txt_Another_place);
for (NumPlc = 0;
NumPlc < Places->Num;
NumPlc++)
{
Plc = &Places->Lst[NumPlc];
HTM_OPTION (HTM_Type_LONG,&Plc->PlcCod,
Plc->PlcCod == Ctr->Specific.PlcCod ? HTM_OPTION_SELECTED :
HTM_OPTION_UNSELECTED,
HTM_OPTION_ENABLED, HTM_OPTION_ENABLED,
"%s",Plc->ShrtName); "%s",Txt_Another_place);
} for (NumPlc = 0;
HTM_SELECT_End (); NumPlc < Places->Num;
Frm_EndForm (); NumPlc++)
{
Plc = &Places->Lst[NumPlc];
HTM_OPTION (HTM_Type_LONG,&Plc->PlcCod,
Plc->PlcCod == Ctr->Specific.PlcCod ? HTM_OPTION_SELECTED :
HTM_OPTION_UNSELECTED,
HTM_OPTION_ENABLED,
"%s",Plc->ShrtName);
}
HTM_SELECT_End ();
Frm_EndForm ();
break;
case Usr_I_CAN_NOT:
default:
for (NumPlc = 0;
NumPlc < Places->Num;
NumPlc++)
if (Places->Lst[NumPlc].PlcCod == Ctr->Specific.PlcCod)
HTM_Txt (Places->Lst[NumPlc].ShrtName);
break;
} }
else
for (NumPlc = 0;
NumPlc < Places->Num;
NumPlc++)
if (Places->Lst[NumPlc].PlcCod == Ctr->Specific.PlcCod)
HTM_Txt (Places->Lst[NumPlc].ShrtName);
HTM_TD_End (); HTM_TD_End ();
/* Center short name and full name */ /* Center short name and full name */
@ -839,28 +843,30 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
/* Center WWW */ /* Center WWW */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit == Usr_I_CAN) switch (ICanEdit)
{ {
Frm_BeginForm (ActChgCtrWWW); case Usr_I_CAN:
ParCod_PutPar (ParCod_OthHie,Ctr->HieCod); Frm_BeginForm (ActChgCtrWWW);
HTM_INPUT_URL ("WWW",Ctr->WWW,HTM_SUBMIT_ON_CHANGE, ParCod_PutPar (ParCod_OthHie,Ctr->HieCod);
"class=\"INPUT_WWW INPUT_%s\"" HTM_INPUT_URL ("WWW",Ctr->WWW,HTM_SUBMIT_ON_CHANGE,
" required=\"required\"", "class=\"INPUT_WWW INPUT_%s\""
The_GetSuffix ()); " required=\"required\"",
Frm_EndForm (); The_GetSuffix ());
} Frm_EndForm ();
else break;
{ case Usr_I_CAN_NOT:
Str_Copy (WWW,Ctr->WWW,sizeof (WWW) - 1); default:
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\""); Str_Copy (WWW,Ctr->WWW,sizeof (WWW) - 1);
HTM_A_Begin ("href=\"%s\" target=\"_blank\"" HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\"");
" class=\"DAT_%s\" title=\"%s\"", HTM_A_Begin ("href=\"%s\" target=\"_blank\""
Ctr->WWW, " class=\"DAT_%s\" title=\"%s\"",
The_GetSuffix (), Ctr->WWW,
Ctr->WWW); The_GetSuffix (),
HTM_Txt (WWW); Ctr->WWW);
HTM_A_End (); HTM_Txt (WWW);
HTM_DIV_End (); HTM_A_End ();
HTM_DIV_End ();
break;
} }
HTM_TD_End (); HTM_TD_End ();

View File

@ -633,10 +633,11 @@ Me sale este error, no s
"can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod') "can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod')
*/ */
#define Log_PLATFORM_VERSION "SWAD 23.72.2 (2024-04-02)" #define Log_PLATFORM_VERSION "SWAD 23.73 (2024-04-06)"
#define CSS_FILE "swad23.67.2.css" #define CSS_FILE "swad23.67.2.css"
#define JS_FILE "swad23.53.6.js" #define JS_FILE "swad23.53.6.js"
/* /*
Version 23.73: Apr 06, 2024 Code refactoring related to new type Usr_ICan_t. (335399 lines)
Version 23.72.2: Apr 02, 2024 Code refactoring related to new type Usr_ICan_t. (334970 lines) Version 23.72.2: Apr 02, 2024 Code refactoring related to new type Usr_ICan_t. (334970 lines)
Version 23.72.1: Apr 01, 2024 Code refactoring related to new type Usr_ICan_t. (334912 lines) Version 23.72.1: Apr 01, 2024 Code refactoring related to new type Usr_ICan_t. (334912 lines)
Version 23.72: Apr 01, 2024 New type Usr_ICan_t. (334879 lines) Version 23.72: Apr 01, 2024 New type Usr_ICan_t. (334879 lines)

View File

@ -539,7 +539,7 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
const char *ClassTxt; const char *ClassTxt;
long UsrCod; long UsrCod;
Usr_MeOrOther_t MeOrOther; Usr_MeOrOther_t MeOrOther;
struct Usr_Data *UsrDat; struct Usr_Data *UsrDat = NULL; // To avoid warning
struct Usr_Data OtherUsrDat; struct Usr_Data OtherUsrDat;
/***** Get user's code from list *****/ /***** Get user's code from list *****/
@ -552,7 +552,6 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
UsrDat = &Gbl.Usrs.Me.UsrDat; UsrDat = &Gbl.Usrs.Me.UsrDat;
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
/***** Initialize structure with user's data *****/ /***** Initialize structure with user's data *****/
OtherUsrDat.UsrCod = UsrCod; OtherUsrDat.UsrCod = UsrCod;
Usr_UsrDataConstructor (&OtherUsrDat); Usr_UsrDataConstructor (&OtherUsrDat);
@ -609,7 +608,6 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
case Usr_ME: case Usr_ME:
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
/***** Free memory used for user's data *****/ /***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&OtherUsrDat); Usr_UsrDataDestructor (&OtherUsrDat);
break; break;

View File

@ -705,45 +705,53 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
/* Course year */ /* Course year */
HTM_TD_Begin ("class=\"CT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"CT DAT_%s\"",The_GetSuffix ());
if (ICanEdit == Usr_I_CAN) switch (ICanEdit)
{ {
Frm_BeginForm (ActChgCrsYea); case Usr_I_CAN:
ParCod_PutPar (ParCod_OthHie,Crs->HieCod); Frm_BeginForm (ActChgCrsYea);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL, ParCod_PutPar (ParCod_OthHie,Crs->HieCod);
"name=\"OthCrsYear\"" HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL,
" class=\"HIE_SEL_NARROW INPUT_%s\"", "name=\"OthCrsYear\""
The_GetSuffix ()); " class=\"HIE_SEL_NARROW INPUT_%s\"",
for (YearAux = 0; The_GetSuffix ());
YearAux <= Deg_MAX_YEARS_PER_DEGREE; for (YearAux = 0;
YearAux++) // All the years are permitted YearAux <= Deg_MAX_YEARS_PER_DEGREE;
// because it's possible to move this course YearAux++) // All the years are permitted
// to another degree (with other active years) // because it's possible to move this course
HTM_OPTION (HTM_Type_UNSIGNED,&YearAux, // to another degree (with other active years)
YearAux == Crs->Specific.Year ? HTM_OPTION_SELECTED : HTM_OPTION (HTM_Type_UNSIGNED,&YearAux,
HTM_OPTION_UNSELECTED, YearAux == Crs->Specific.Year ? HTM_OPTION_SELECTED :
HTM_OPTION_ENABLED, HTM_OPTION_UNSELECTED,
"%s",Txt_YEAR_OF_DEGREE[YearAux]); HTM_OPTION_ENABLED,
HTM_SELECT_End (); "%s",Txt_YEAR_OF_DEGREE[YearAux]);
Frm_EndForm (); HTM_SELECT_End ();
} Frm_EndForm ();
else break;
HTM_Txt (Txt_YEAR_OF_DEGREE[Crs->Specific.Year]); case Usr_I_CAN_NOT:
default:
HTM_Txt (Txt_YEAR_OF_DEGREE[Crs->Specific.Year]);
break;
}
HTM_TD_End (); HTM_TD_End ();
/* Institutional code of the course */ /* Institutional code of the course */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit == Usr_I_CAN) switch (ICanEdit)
{ {
Frm_BeginForm (ActChgInsCrsCod); case Usr_I_CAN:
ParCod_PutPar (ParCod_OthHie,Crs->HieCod); Frm_BeginForm (ActChgInsCrsCod);
HTM_INPUT_TEXT ("InsCrsCod",Hie_MAX_CHARS_INSTITUTIONAL_COD, ParCod_PutPar (ParCod_OthHie,Crs->HieCod);
Crs->InstitutionalCod,HTM_SUBMIT_ON_CHANGE, HTM_INPUT_TEXT ("InsCrsCod",Hie_MAX_CHARS_INSTITUTIONAL_COD,
"class=\"INPUT_INS_CODE INPUT_%s\"", Crs->InstitutionalCod,HTM_SUBMIT_ON_CHANGE,
The_GetSuffix ()); "class=\"INPUT_INS_CODE INPUT_%s\"",
Frm_EndForm (); The_GetSuffix ());
Frm_EndForm ();
break;
case Usr_I_CAN_NOT:
default:
HTM_Txt (Crs->InstitutionalCod);
break;
} }
else
HTM_Txt (Crs->InstitutionalCod);
HTM_TD_End (); HTM_TD_End ();
/* Course short name and full name */ /* Course short name and full name */

View File

@ -389,63 +389,69 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
/* Degree type */ /* Degree type */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit == Usr_I_CAN) switch (ICanEdit)
{ {
Frm_BeginForm (ActChgDegTyp); case Usr_I_CAN:
ParCod_PutPar (ParCod_OthHie,Deg->HieCod); Frm_BeginForm (ActChgDegTyp);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL, ParCod_PutPar (ParCod_OthHie,Deg->HieCod);
"name=\"OthDegTypCod\"" HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL,
" class=\"HIE_SEL_NARROW INPUT_%s\"", "name=\"OthDegTypCod\""
The_GetSuffix ()); " class=\"HIE_SEL_NARROW INPUT_%s\"",
for (NumDegTyp = 0; The_GetSuffix ());
NumDegTyp < DegTypes->Num; for (NumDegTyp = 0;
NumDegTyp++) NumDegTyp < DegTypes->Num;
{ NumDegTyp++)
DegTyp = &DegTypes->Lst[NumDegTyp]; {
HTM_OPTION (HTM_Type_LONG,&DegTyp->DegTypCod, DegTyp = &DegTypes->Lst[NumDegTyp];
DegTyp->DegTypCod == Deg->Specific.TypCod ? HTM_OPTION_SELECTED : HTM_OPTION (HTM_Type_LONG,&DegTyp->DegTypCod,
HTM_OPTION_UNSELECTED, DegTyp->DegTypCod == Deg->Specific.TypCod ? HTM_OPTION_SELECTED :
HTM_OPTION_ENABLED, HTM_OPTION_UNSELECTED,
"%s",DegTyp->DegTypName); HTM_OPTION_ENABLED,
} "%s",DegTyp->DegTypName);
HTM_SELECT_End (); }
Frm_EndForm (); HTM_SELECT_End ();
Frm_EndForm ();
break;
case Usr_I_CAN_NOT:
default:
for (NumDegTyp = 0;
NumDegTyp < DegTypes->Num;
NumDegTyp++)
{
DegTyp = &DegTypes->Lst[NumDegTyp];
if (DegTyp->DegTypCod == Deg->Specific.TypCod)
HTM_Txt (DegTyp->DegTypName);
}
break;
} }
else
for (NumDegTyp = 0;
NumDegTyp < DegTypes->Num;
NumDegTyp++)
{
DegTyp = &DegTypes->Lst[NumDegTyp];
if (DegTyp->DegTypCod == Deg->Specific.TypCod)
HTM_Txt (DegTyp->DegTypName);
}
HTM_TD_End (); HTM_TD_End ();
/* Degree WWW */ /* Degree WWW */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit == Usr_I_CAN) switch (ICanEdit)
{ {
Frm_BeginForm (ActChgDegWWW); case Usr_I_CAN:
ParCod_PutPar (ParCod_OthHie,Deg->HieCod); Frm_BeginForm (ActChgDegWWW);
HTM_INPUT_URL ("WWW",Deg->WWW,HTM_SUBMIT_ON_CHANGE, ParCod_PutPar (ParCod_OthHie,Deg->HieCod);
"class=\"INPUT_WWW INPUT_%s\"" HTM_INPUT_URL ("WWW",Deg->WWW,HTM_SUBMIT_ON_CHANGE,
" required=\"required\"", "class=\"INPUT_WWW INPUT_%s\""
The_GetSuffix ()); " required=\"required\"",
Frm_EndForm (); The_GetSuffix ());
} Frm_EndForm ();
else break;
{ case Usr_I_CAN_NOT:
Str_Copy (WWW,Deg->WWW,sizeof (WWW) - 1); default:
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\""); Str_Copy (WWW,Deg->WWW,sizeof (WWW) - 1);
HTM_A_Begin ("href=\"%s\" target=\"_blank\" title=\"%s\"" HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\"");
" class=\"DAT_%s\"", HTM_A_Begin ("href=\"%s\" target=\"_blank\" title=\"%s\""
Deg->WWW, " class=\"DAT_%s\"",
Deg->WWW, Deg->WWW,
The_GetSuffix ()); Deg->WWW,
HTM_Txt (WWW); The_GetSuffix ());
HTM_A_End (); HTM_Txt (WWW);
HTM_DIV_End (); HTM_A_End ();
HTM_DIV_End ();
break;
} }
HTM_TD_End (); HTM_TD_End ();

View File

@ -2443,12 +2443,18 @@ void Enr_ReqRegRemTch (void)
static void Enr_ReqRegRemUsr (Rol_Role_t Role) static void Enr_ReqRegRemUsr (Rol_Role_t Role)
{ {
if (Adm_CheckIfICanAdminOtherUsrs () == Usr_I_CAN) switch (Adm_CheckIfICanAdminOtherUsrs ())
/***** Form to request the user's ID of another user *****/ {
Enr_ReqAnotherUsrIDToRegisterRemove (Role); case Usr_I_CAN:
else /***** Form to request the user's ID of another user *****/
/***** Form to request if register/remove me *****/ Enr_ReqAnotherUsrIDToRegisterRemove (Role);
Enr_AskIfRegRemMe (Role); break;
case Usr_I_CAN_NOT:
default:
/***** Form to request if register/remove me *****/
Enr_AskIfRegRemMe (Role);
break;
}
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2672,12 +2678,16 @@ void Enr_ReqRemUsrFromCrs (void)
{ {
/***** Get user to be removed *****/ /***** Get user to be removed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Enr_CheckIfICanRemUsrFromCrs ())
if (Enr_CheckIfICanRemUsrFromCrs () == Usr_I_CAN) {
Enr_AskIfRemoveUsrFromCrs (&Gbl.Usrs.Other.UsrDat); case Usr_I_CAN:
else Enr_AskIfRemoveUsrFromCrs (&Gbl.Usrs.Other.UsrDat);
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); break;
} case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
}
else else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
@ -2692,14 +2702,19 @@ void Enr_RemUsrFromCrs1 (void)
{ {
/***** Get user to be removed *****/ /***** Get user to be removed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Enr_CheckIfICanRemUsrFromCrs ())
if (Enr_CheckIfICanRemUsrFromCrs () == Usr_I_CAN) {
Enr_EffectivelyRemUsrFromCrs (&Gbl.Usrs.Other.UsrDat,&Gbl.Hierarchy.Node[Hie_CRS], case Usr_I_CAN:
Enr_DO_NOT_REMOVE_USR_PRODUCTION, Enr_EffectivelyRemUsrFromCrs (&Gbl.Usrs.Other.UsrDat,
Cns_VERBOSE); &Gbl.Hierarchy.Node[Hie_CRS],
else Enr_DO_NOT_REMOVE_USR_PRODUCTION,
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Cns_VERBOSE);
} break;
case Usr_I_CAN_NOT:
default:
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break;
}
else else
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
} }
@ -2951,7 +2966,6 @@ void Enr_ModifyUsr1 (void)
Grp_ChangeMyGrps (Cns_QUIET); Grp_ChangeMyGrps (Cns_QUIET);
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
Grp_ChangeOtherUsrGrps (); Grp_ChangeOtherUsrGrps ();
break; break;
} }
@ -3206,7 +3220,6 @@ static void Enr_EffectivelyRemUsrFromCrs (struct Usr_Data *UsrDat,
Rol_SetMyRoles (); Rol_SetMyRoles ();
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
/* Now he/she does not belong to current course */ /* Now he/she does not belong to current course */
UsrDat->Accepted = false; UsrDat->Accepted = false;
UsrDat->Roles.InCurrentCrs = Rol_USR; UsrDat->Roles.InCurrentCrs = Rol_USR;

View File

@ -2325,7 +2325,6 @@ unsigned Exa_DB_GetResults (MYSQL_RES **mysql_res,
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
break; break;
case Usr_OTHER: // A teacher/admin watching the results of other users case Usr_OTHER: // A teacher/admin watching the results of other users
default:
if (asprintf (&HidSesSubQuery,"%s","") < 0) if (asprintf (&HidSesSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
break; break;
@ -2368,7 +2367,6 @@ unsigned Exa_DB_GetResults (MYSQL_RES **mysql_res,
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
break; break;
case Usr_OTHER: // A teacher/admin watching the results of other users case Usr_OTHER: // A teacher/admin watching the results of other users
default:
if (asprintf (&HidExaSubQuery,"%s","") < 0) if (asprintf (&HidExaSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
break; break;

View File

@ -178,55 +178,59 @@ void ExaPrn_ShowExamPrint (void)
ExaSes_GetAndCheckPars (&Exams,&Session); ExaSes_GetAndCheckPars (&Exams,&Session);
/***** Check if I can access to this session *****/ /***** Check if I can access to this session *****/
if (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session) == Usr_I_CAN) switch (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session))
{ {
/***** Set basic data of exam print *****/ case Usr_I_CAN:
Print.SesCod = Session.SesCod; /***** Set basic data of exam print *****/
Print.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
/***** Get exam print data from database *****/
ExaPrn_GetPrintDataBySesCodAndUsrCod (&Print);
if (Print.PrnCod <= 0) // Exam print does not exists ==> create it
{
/***** Set again basic data of exam print *****/
Print.SesCod = Session.SesCod; Print.SesCod = Session.SesCod;
Print.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod; Print.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
/***** Get questions from database *****/ /***** Get exam print data from database *****/
ExaPrn_GetQuestionsForNewPrintFromDB (&Print,Exams.Exam.ExaCod); ExaPrn_GetPrintDataBySesCodAndUsrCod (&Print);
if (Print.NumQsts.All) if (Print.PrnCod <= 0) // Exam print does not exists ==> create it
{ {
/***** Create new exam print in database *****/ /***** Set again basic data of exam print *****/
ExaPrn_CreatePrint (&Print); Print.SesCod = Session.SesCod;
Print.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
/***** Get questions from database *****/
ExaPrn_GetQuestionsForNewPrintFromDB (&Print,Exams.Exam.ExaCod);
if (Print.NumQsts.All)
{
/***** Create new exam print in database *****/
ExaPrn_CreatePrint (&Print);
/***** Set log print code and action *****/
ExaLog_SetPrnCod (Print.PrnCod);
ExaLog_SetAction (ExaLog_START_EXAM);
ExaLog_SetIfCanAnswer (true);
}
}
else // Exam print exists
{
/***** Get exam print data from database *****/
ExaPrn_GetPrintDataBySesCodAndUsrCod (&Print);
/***** Get questions and current user's answers from database *****/
ExaPrn_GetPrintQuestionsFromDB (&Print);
/***** Set log print code and action *****/ /***** Set log print code and action *****/
ExaLog_SetPrnCod (Print.PrnCod); ExaLog_SetPrnCod (Print.PrnCod);
ExaLog_SetAction (ExaLog_START_EXAM); ExaLog_SetAction (ExaLog_RESUME_EXAM);
ExaLog_SetIfCanAnswer (true); ExaLog_SetIfCanAnswer (true);
} }
}
else // Exam print exists
{
/***** Get exam print data from database *****/
ExaPrn_GetPrintDataBySesCodAndUsrCod (&Print);
/***** Get questions and current user's answers from database *****/ /***** Show test to be answered *****/
ExaPrn_GetPrintQuestionsFromDB (&Print); ExaPrn_ShowExamPrintToFillIt (&Exams,&Print);
break;
/***** Set log print code and action *****/ case Usr_I_CAN_NOT: // Session not open or accessible
ExaLog_SetPrnCod (Print.PrnCod); default:
ExaLog_SetAction (ExaLog_RESUME_EXAM); /***** Show warning *****/
ExaLog_SetIfCanAnswer (true); Ale_ShowAlert (Ale_INFO,Txt_You_dont_have_access_to_the_exam);
} break;
/***** Show test to be answered *****/
ExaPrn_ShowExamPrintToFillIt (&Exams,&Print);
} }
else // Session not open or accessible
/***** Show warning *****/
Ale_ShowAlert (Ale_INFO,Txt_You_dont_have_access_to_the_exam);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -996,42 +1000,44 @@ void ExaPrn_ReceivePrintAnswer (void)
ExaLog_SetQstInd (QstInd); ExaLog_SetQstInd (QstInd);
/***** Check if session if visible and open *****/ /***** Check if session if visible and open *****/
if (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session) == Usr_I_CAN) switch (ExaSes_CheckIfICanAnswerThisSession (&Exams.Exam,&Session))
{ {
/***** Set log open to true ****/ case Usr_I_CAN:
ExaLog_SetIfCanAnswer (true); /***** Set log open to true ****/
ExaLog_SetIfCanAnswer (true);
/***** Get questions and current user's answers of exam print from database *****/ /***** Get questions and current user's answers of exam print from database *****/
ExaPrn_GetPrintQuestionsFromDB (&Print); ExaPrn_GetPrintQuestionsFromDB (&Print);
/***** Get answers from form to assess a test *****/ /***** Get answers from form to assess a test *****/
ExaPrn_GetAnswerFromForm (&Print,QstInd); ExaPrn_GetAnswerFromForm (&Print,QstInd);
/***** Update answer in database *****/ /***** Update answer in database *****/
/* Compute question score and store in database */ /* Compute question score and store in database */
ExaPrn_ComputeScoreAndStoreQuestionOfPrint (&Print,QstInd); ExaPrn_ComputeScoreAndStoreQuestionOfPrint (&Print,QstInd);
/* Update exam print in database */ /* Update exam print in database */
Print.NumQsts.NotBlank = Exa_DB_GetNumQstsNotBlankInPrint (Print.PrnCod); Print.NumQsts.NotBlank = Exa_DB_GetNumQstsNotBlankInPrint (Print.PrnCod);
Print.Score.All = Exa_DB_ComputeTotalScoreOfPrint (Print.PrnCod); Print.Score.All = Exa_DB_ComputeTotalScoreOfPrint (Print.PrnCod);
Exa_DB_UpdatePrint (&Print); Exa_DB_UpdatePrint (&Print);
/***** Show table with questions to answer *****/ /***** Show table with questions to answer *****/
ExaPrn_ShowTableWithQstsToFill (&Exams,&Print); ExaPrn_ShowTableWithQstsToFill (&Exams,&Print);
} break;
else // Not accessible to answer case Usr_I_CAN_NOT: // Not accessible to answer
{ default:
/***** Set log open to false ****/ /***** Set log open to false ****/
ExaLog_SetIfCanAnswer (false); ExaLog_SetIfCanAnswer (false);
/***** Show warning *****/ /***** Show warning *****/
Ale_ShowAlert (Ale_INFO,Txt_You_dont_have_access_to_the_exam); Ale_ShowAlert (Ale_INFO,Txt_You_dont_have_access_to_the_exam);
/***** Form to end/close this exam print *****/ /***** Form to end/close this exam print *****/
Frm_BeginForm (ActEndExaPrn); Frm_BeginForm (ActEndExaPrn);
ExaSes_PutParsEdit (&Exams); ExaSes_PutParsEdit (&Exams);
Btn_PutCreateButton (Txt_Continue); Btn_PutCreateButton (Txt_Continue);
Frm_EndForm (); Frm_EndForm ();
break;
} }
} }

View File

@ -825,8 +825,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
/* Write session title */ /* Write session title */
HTM_TD_Begin ("class=\"LT DAT_%s %s\"", HTM_TD_Begin ("class=\"LT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ());
HTM_Txt (Session.Title); HTM_Txt (Session.Title);
HTM_TD_End (); HTM_TD_End ();
@ -850,183 +849,224 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
/* Write total number of questions */ /* Write total number of questions */
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN) {
HTM_Unsigned (Print.NumQsts.All); case Usr_I_CAN:
else HTM_Unsigned (Print.NumQsts.All);
Ico_PutIconNotVisible (); break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
}
HTM_TD_End (); HTM_TD_End ();
/* Valid questions */ /* Valid questions */
HTM_TD_Begin ("class=\"RT DAT_GREEN_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_GREEN_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Total) case Usr_I_CAN:
HTM_Unsigned (Print.NumQsts.Valid.Total); if (Print.NumQsts.Valid.Total)
else HTM_Unsigned (Print.NumQsts.Valid.Total);
HTM_Light0 (); else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Invalid questions */ /* Invalid questions */
HTM_TD_Begin ("class=\"RT DAT_RED_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_RED_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
NumQstsInvalid = Print.NumQsts.All - Print.NumQsts.Valid.Total; case Usr_I_CAN:
if (NumQstsInvalid) NumQstsInvalid = Print.NumQsts.All -
HTM_Unsigned (NumQstsInvalid); Print.NumQsts.Valid.Total;
else if (NumQstsInvalid)
HTM_Light0 (); HTM_Unsigned (NumQstsInvalid);
else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write number of correct questions */ /* Write number of correct questions */
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Correct) case Usr_I_CAN:
HTM_Unsigned (Print.NumQsts.Valid.Correct); if (Print.NumQsts.Valid.Correct)
else HTM_Unsigned (Print.NumQsts.Valid.Correct);
HTM_Light0 (); else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write number of wrong questions */ /* Write number of wrong questions */
HTM_TD_Begin ("class=\"RT DAT_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Wrong.Negative) case Usr_I_CAN:
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Negative); if (Print.NumQsts.Valid.Wrong.Negative)
else HTM_Unsigned (Print.NumQsts.Valid.Wrong.Negative);
HTM_Light0 (); else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"RT DAT_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Wrong.Zero) case Usr_I_CAN:
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Zero); if (Print.NumQsts.Valid.Wrong.Zero)
else HTM_Unsigned (Print.NumQsts.Valid.Wrong.Zero);
HTM_Light0 (); else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
HTM_TD_Begin ("class=\"RT DAT_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Wrong.Positive) case Usr_I_CAN:
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Positive); if (Print.NumQsts.Valid.Wrong.Positive)
else HTM_Unsigned (Print.NumQsts.Valid.Wrong.Positive);
HTM_Light0 (); else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write number of blank questions */ /* Write number of blank questions */
HTM_TD_Begin ("class=\"RT DAT_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.Valid.Blank) case Usr_I_CAN:
HTM_Unsigned (Print.NumQsts.Valid.Blank); if (Print.NumQsts.Valid.Blank)
else HTM_Unsigned (Print.NumQsts.Valid.Blank);
HTM_Light0 (); else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write score valid (taking into account only valid questions) */ /* Write score valid (taking into account only valid questions) */
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
HTM_Double2Decimals (Print.Score.Valid); case Usr_I_CAN:
HTM_Txt ("/"); HTM_Double2Decimals (Print.Score.Valid);
HTM_Unsigned (Print.NumQsts.Valid.Total); HTM_Txt ("/");
HTM_Unsigned (Print.NumQsts.Valid.Total);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write average score per question (taking into account only valid questions) */ /* Write average score per question (taking into account only valid questions) */
HTM_TD_Begin ("class=\"RT DAT_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN) {
HTM_Double2Decimals (Print.NumQsts.Valid.Total ? Print.Score.Valid / case Usr_I_CAN:
(double) Print.NumQsts.Valid.Total : HTM_Double2Decimals (Print.NumQsts.Valid.Total ? Print.Score.Valid /
0.0); (double) Print.NumQsts.Valid.Total :
else 0.0);
Ico_PutIconNotVisible (); break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
}
HTM_TD_End (); HTM_TD_End ();
/* Write grade over maximum grade (taking into account only valid questions) */ /* Write grade over maximum grade (taking into account only valid questions) */
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid.Total,Print.Score.Valid,Exam.MaxGrade); case Usr_I_CAN:
TstPrn_ShowGrade (Grade,Exam.MaxGrade); Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid.Total,Print.Score.Valid,Exam.MaxGrade);
TotalGrade += Grade; TstPrn_ShowGrade (Grade,Exam.MaxGrade);
TotalGrade += Grade;
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Link to show this result */ /* Link to show this result */
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Result)
if (ICanView.Result == Usr_I_CAN)
{ {
Exams->Exam.ExaCod = Session.ExaCod; case Usr_I_CAN:
Exams->SesCod = Session.SesCod; Exams->Exam.ExaCod = Session.ExaCod;
switch (MeOrOther) Exams->SesCod = Session.SesCod;
{ switch (MeOrOther)
case Usr_ME: {
Frm_BeginForm (ActSeeOneExaResMe); case Usr_ME:
ExaSes_PutParsEdit (Exams); Frm_BeginForm (ActSeeOneExaResMe);
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneExaResMe); ExaSes_PutParsEdit (Exams);
break; Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneExaResMe);
case Usr_OTHER: break;
Frm_BeginForm (ActSeeOneExaResOth); case Usr_OTHER:
ExaSes_PutParsEdit (Exams); Frm_BeginForm (ActSeeOneExaResOth);
Usr_PutParOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod); ExaSes_PutParsEdit (Exams);
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneExaResOth); Usr_PutParOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
break; Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneExaResOth);
} break;
Frm_EndForm (); }
Frm_EndForm ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -1280,7 +1320,6 @@ void ExaRes_ShowOneExaResult (void)
UsrDat = &Gbl.Usrs.Me.UsrDat; UsrDat = &Gbl.Usrs.Me.UsrDat;
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
UsrDat = &Gbl.Usrs.Other.UsrDat; UsrDat = &Gbl.Usrs.Other.UsrDat;
Usr_GetParOtherUsrCodEncrypted (UsrDat); Usr_GetParOtherUsrCodEncrypted (UsrDat);
break; break;
@ -1403,12 +1442,18 @@ static void ExaRes_CheckIfICanViewResult (const struct Exa_Exam *Exam,
// Whether I belong or not to groups of session is not checked here... // Whether I belong or not to groups of session is not checked here...
// ...because I should be able to see old exams made in old groups to which I belonged // ...because I should be able to see old exams made in old groups to which I belonged
if (ICanView->Result == Usr_I_CAN) switch (ICanView->Result)
// Depends on 5 visibility icons associated to exam {
ICanView->Score = TstVis_IsVisibleTotalScore (Exam->Visibility) ? Usr_I_CAN : case Usr_I_CAN:
Usr_I_CAN_NOT; // Depends on 5 visibility icons associated to exam
else ICanView->Score = TstVis_IsVisibleTotalScore (Exam->Visibility) ? Usr_I_CAN :
ICanView->Score = Usr_I_CAN_NOT; Usr_I_CAN_NOT;
break;
case Usr_I_CAN_NOT:
default:
ICanView->Score = Usr_I_CAN_NOT;
break;
}
break; break;
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:
@ -1602,32 +1647,36 @@ static void ExaRes_ShowExamResultNumQsts (struct ExaPrn_Print *Print,
/***** Number of questions *****/ /***** Number of questions *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Result == Usr_I_CAN) switch (ICanView->Result)
{ {
HTM_TxtF ("%u",Print->NumQsts.All); case Usr_I_CAN:
if (Print->NumQsts.All != Print->NumQsts.Valid.Total) HTM_TxtF ("%u",Print->NumQsts.All);
{ if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
HTM_Txt (" ("); {
HTM_Txt (" (");
/* Valid questions */ /* Valid questions */
HTM_SPAN_Begin ("class=\"DAT_GREEN_%s\"",The_GetSuffix ()); HTM_SPAN_Begin ("class=\"DAT_GREEN_%s\"",The_GetSuffix ());
HTM_TxtColonNBSP (Txt_QUESTIONS_valid); HTM_TxtColonNBSP (Txt_QUESTIONS_valid);
HTM_Unsigned (Print->NumQsts.Valid.Total); HTM_Unsigned (Print->NumQsts.Valid.Total);
HTM_SPAN_End (); HTM_SPAN_End ();
HTM_TxtF ("; "); HTM_TxtF ("; ");
/* Invalid questions */ /* Invalid questions */
HTM_SPAN_Begin ("class=\"DAT_RED_%s\"",The_GetSuffix ()); HTM_SPAN_Begin ("class=\"DAT_RED_%s\"",The_GetSuffix ());
HTM_TxtColonNBSP (Txt_QUESTIONS_invalid); HTM_TxtColonNBSP (Txt_QUESTIONS_invalid);
HTM_Unsigned (Print->NumQsts.All - Print->NumQsts.Valid.Total); HTM_Unsigned (Print->NumQsts.All - Print->NumQsts.Valid.Total);
HTM_SPAN_End (); HTM_SPAN_End ();
HTM_Txt (")"); HTM_Txt (")");
} }
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/***** Row end *****/ /***** Row end *****/
@ -1656,19 +1705,25 @@ static void ExaRes_ShowExamResultNumAnss (struct ExaPrn_Print *Print,
/***** Number of answers *****/ /***** Number of answers *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Score == Usr_I_CAN) switch (ICanView->Score)
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; " case Usr_I_CAN:
"%s(<em>p<sub>i</sub></em>=0):&nbsp;%u; " HTM_TxtF ("%s(<em>p<sub>i</sub></em>=1):&nbsp;%u; "
"%s(0&lt;<em>p<sub>i</sub></em>&lt;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", "%s(<em>p<sub>i</sub></em>=0):&nbsp;%u; "
Txt_ANSWERS_correct,Print->NumQsts.Valid.Correct, "%s(0&lt;<em>p<sub>i</sub></em>&lt;1):&nbsp;%u; "
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Negative, "%s(<em>p<sub>i</sub></em>=0):&nbsp;%u",
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Zero, Txt_ANSWERS_correct,Print->NumQsts.Valid.Correct,
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Positive, Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Negative,
Txt_ANSWERS_blank ,Print->NumQsts.Valid.Blank); Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Zero,
else Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Positive,
Ico_PutIconNotVisible (); Txt_ANSWERS_blank ,Print->NumQsts.Valid.Blank);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
}
HTM_TD_End (); HTM_TD_End ();
/***** Row end *****/ /***** Row end *****/
@ -1695,31 +1750,35 @@ static void ExaRes_ShowExamResultScore (struct ExaPrn_Print *Print,
/***** Score *****/ /***** Score *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Score == Usr_I_CAN) switch (ICanView->Score)
{ {
/* Score counting all questions */ case Usr_I_CAN:
if (Print->NumQsts.All == Print->NumQsts.Valid.Total) /* Score counting all questions */
HTM_STRONG_Begin (); if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
HTM_Double2Decimals (Print->Score.All); HTM_STRONG_Begin ();
HTM_Txt ("/"); HTM_Double2Decimals (Print->Score.All);
HTM_Unsigned (Print->NumQsts.All); HTM_Txt ("/");
if (Print->NumQsts.All == Print->NumQsts.Valid.Total) HTM_Unsigned (Print->NumQsts.All);
HTM_STRONG_End (); if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
HTM_STRONG_End ();
/* Scoure counting only valid questions */ /* Scoure counting only valid questions */
if (Print->NumQsts.All != Print->NumQsts.Valid.Total) if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
{ {
HTM_Txt ("; "); HTM_Txt ("; ");
HTM_TxtColonNBSP (Txt_valid_score); HTM_TxtColonNBSP (Txt_valid_score);
HTM_STRONG_Begin (); HTM_STRONG_Begin ();
HTM_Double2Decimals (Print->Score.Valid); HTM_Double2Decimals (Print->Score.Valid);
HTM_Txt ("/"); HTM_Txt ("/");
HTM_Unsigned (Print->NumQsts.Valid.Total); HTM_Unsigned (Print->NumQsts.Valid.Total);
HTM_STRONG_End (); HTM_STRONG_End ();
} }
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/***** Row end *****/ /***** Row end *****/
@ -1747,27 +1806,33 @@ static void ExaRes_ShowExamResultGrade (const struct Exa_Exam *Exam,
/***** Grade *****/ /***** Grade *****/
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
if (ICanView->Score == Usr_I_CAN) switch (ICanView->Score)
{ {
/* Grade counting all questions */ case Usr_I_CAN:
if (Print->NumQsts.All == Print->NumQsts.Valid.Total) /* Grade counting all questions */
HTM_STRONG_Begin (); if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
TstPrn_ComputeAndShowGrade (Print->NumQsts.All,Print->Score.All,Exam->MaxGrade); HTM_STRONG_Begin ();
if (Print->NumQsts.All == Print->NumQsts.Valid.Total) TstPrn_ComputeAndShowGrade (Print->NumQsts.All,Print->Score.All,Exam->MaxGrade);
HTM_STRONG_End (); if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
HTM_STRONG_End ();
/* Grade counting only valid questions */ /* Grade counting only valid questions */
if (Print->NumQsts.All != Print->NumQsts.Valid.Total) if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
{ {
HTM_Txt ("; "); HTM_Txt ("; ");
HTM_TxtColonNBSP (Txt_valid_grade); HTM_TxtColonNBSP (Txt_valid_grade);
HTM_STRONG_Begin (); HTM_STRONG_Begin ();
TstPrn_ComputeAndShowGrade (Print->NumQsts.Valid.Total,Print->Score.Valid,Exam->MaxGrade); TstPrn_ComputeAndShowGrade (Print->NumQsts.Valid.Total,
HTM_STRONG_End (); Print->Score.Valid,
} Exam->MaxGrade);
HTM_STRONG_End ();
}
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/***** Row end *****/ /***** Row end *****/

View File

@ -500,27 +500,29 @@ static void ExaSes_ListOneOrMoreSessionsTitleGrps (struct Exa_Exams *Exams,
/***** Session title *****/ /***** Session title *****/
HTM_ARTICLE_Begin (Anchor); HTM_ARTICLE_Begin (Anchor);
if (ExaSes_CheckIfICanAnswerThisSession (&Exams->Exam,Session) == Usr_I_CAN) switch (ExaSes_CheckIfICanAnswerThisSession (&Exams->Exam,Session))
{ {
Frm_BeginForm (ActSeeExaPrn); case Usr_I_CAN:
Exa_PutPars (Exams); Frm_BeginForm (ActSeeExaPrn);
ParCod_PutPar (ParCod_Ses,Session->SesCod); Exa_PutPars (Exams);
HTM_BUTTON_Submit_Begin (Gbl.Usrs.Me.Role.Logged == Rol_STD ? Txt_Play : ParCod_PutPar (ParCod_Ses,Session->SesCod);
Txt_Resume, HTM_BUTTON_Submit_Begin (Gbl.Usrs.Me.Role.Logged == Rol_STD ? Txt_Play :
"class=\"LT BT_LINK %s_%s\"", Txt_Resume,
HidVis_TitleClass[Session->HiddenOrVisible], "class=\"LT BT_LINK %s_%s\"",
The_GetSuffix ()); HidVis_TitleClass[Session->HiddenOrVisible],
The_GetSuffix ());
HTM_Txt (Session->Title);
HTM_BUTTON_End ();
Frm_EndForm ();
break;
case Usr_I_CAN_NOT:
default:
HTM_SPAN_Begin ("class=\"%s_%s\"",
HidVis_TitleClass[Session->HiddenOrVisible],
The_GetSuffix ());
HTM_Txt (Session->Title); HTM_Txt (Session->Title);
HTM_BUTTON_End (); HTM_SPAN_End ();
Frm_EndForm (); break;
}
else
{
HTM_SPAN_Begin ("class=\"%s_%s\"",
HidVis_TitleClass[Session->HiddenOrVisible],
The_GetSuffix ());
HTM_Txt (Session->Title);
HTM_SPAN_End ();
} }
HTM_ARTICLE_End (); HTM_ARTICLE_End ();
@ -650,25 +652,27 @@ static void ExaSes_ListOneOrMoreSessionsResultTch (struct Exa_Exams *Exams,
"trophy.svg",Ico_BLACK); "trophy.svg",Ico_BLACK);
/***** Check if visibility of session results can be changed *****/ /***** Check if visibility of session results can be changed *****/
if (ExaSes_CheckIfICanChangeVisibilityOfResults (Session) == Usr_I_CAN) switch (ExaSes_CheckIfICanChangeVisibilityOfResults (Session))
{ {
/***** Put form to change visibility of session results *****/ case Usr_I_CAN:
if (Session->ShowUsrResults) /***** Put form to change visibility of session results *****/
Lay_PutContextualLinkOnlyIcon (ActChgVisExaRes,NULL, if (Session->ShowUsrResults)
ExaSes_PutParsEdit,Exams, Lay_PutContextualLinkOnlyIcon (ActChgVisExaRes,NULL,
"eye.svg",Ico_GREEN); ExaSes_PutParsEdit,Exams,
else "eye.svg",Ico_GREEN);
Lay_PutContextualLinkOnlyIcon (ActChgVisExaRes,NULL, else
ExaSes_PutParsEdit,Exams, Lay_PutContextualLinkOnlyIcon (ActChgVisExaRes,NULL,
"eye-slash.svg",Ico_RED); ExaSes_PutParsEdit,Exams,
} "eye-slash.svg",Ico_RED);
else // Don't put form break;
{ case Usr_I_CAN_NOT: // Don't put form
/***** Put icon showing the current visibility of session results *****/ default:
if (Session->ShowUsrResults) /***** Put icon showing the current visibility of session results *****/
Ico_PutIconOff ("eye.svg" ,Ico_GREEN,Txt_Visible_results); if (Session->ShowUsrResults)
else Ico_PutIconOff ("eye.svg" ,Ico_GREEN,Txt_Visible_results);
Ico_PutIconOff ("eye-slash.svg",Ico_RED ,Txt_Hidden_results); else
Ico_PutIconOff ("eye-slash.svg",Ico_RED ,Txt_Hidden_results);
break;
} }
} }

View File

@ -588,11 +588,17 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
The_GetColorRows ()); The_GetColorRows ());
/* Put icon to remove the set */ /* Put icon to remove the set */
if (ICanEditSets == Usr_I_CAN) switch (ICanEditSets)
Ico_PutContextualIconToRemove (ActReqRemExaSet,NULL, {
ExaSet_PutParsOneSet,Exams); case Usr_I_CAN:
else Ico_PutContextualIconToRemove (ActReqRemExaSet,NULL,
Ico_PutIconRemovalNotAllowed (); ExaSet_PutParsOneSet,Exams);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconRemovalNotAllowed ();
break;
}
/* Put icon to move up the question */ /* Put icon to move up the question */
if (ICanEditSets == Usr_I_CAN && Set.SetInd > 1) if (ICanEditSets == Usr_I_CAN && Set.SetInd > 1)
@ -841,11 +847,17 @@ static void ExaSet_ListOneOrMoreQuestionsForEdition (struct Exa_Exams *Exams,
HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ()); HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ());
/* Put icon to remove the question */ /* Put icon to remove the question */
if (ICanEditQuestions == Usr_I_CAN) switch (ICanEditQuestions)
Ico_PutContextualIconToRemove (ActReqRemSetQst,NULL, {
ExaSet_PutParsOneQst,Exams); case Usr_I_CAN:
else Ico_PutContextualIconToRemove (ActReqRemSetQst,NULL,
Ico_PutIconRemovalNotAllowed (); ExaSet_PutParsOneQst,Exams);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconRemovalNotAllowed ();
break;
}
/* Put icon to validate/invalidate the question */ /* Put icon to validate/invalidate the question */
Lay_PutContextualLinkOnlyIcon (ValInv[Question.Validity].NextAction,Anchor, Lay_PutContextualLinkOnlyIcon (ValInv[Question.Validity].NextAction,Anchor,
@ -1405,12 +1417,20 @@ void ExaSet_MoveDownSet (void)
static Usr_ICan_t ExaSet_CheckIfICanEditExamSets (const struct Exa_Exam *Exam) static Usr_ICan_t ExaSet_CheckIfICanEditExamSets (const struct Exa_Exam *Exam)
{ {
if (Exa_CheckIfICanEditExams () == Usr_I_CAN) switch (Exa_CheckIfICanEditExams ())
/***** Questions are editable only if exam has no sessions *****/ {
return (Exam->NumSess == 0) ? Usr_I_CAN : // Exams with sessions should not be edited case Usr_I_CAN:
Usr_I_CAN_NOT; /***** Questions are editable only if exam has no sessions *****/
else return (Exam->NumSess == 0) ? Usr_I_CAN : // Exams with sessions should not be edited
return Usr_I_CAN_NOT; // Sets of questions are not editable Usr_I_CAN_NOT;
break;
case Usr_I_CAN_NOT:
default:
return Usr_I_CAN_NOT; // Sets of questions are not editable
break;
}
return Usr_I_CAN_NOT;
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -1004,22 +1004,24 @@ static void For_ShowAForumPost (struct For_Forums *Forums,
/***** Form to ban/unban post *****/ /***** Form to ban/unban post *****/
HTM_TD_Begin ("class=\"CONTEXT_COL\""); HTM_TD_Begin ("class=\"CONTEXT_COL\"");
if (ICanModerateForum == Usr_I_CAN) switch (ICanModerateForum)
{ {
NextAction = DisabledOrEnabled == Cns_ENABLED ? For_ActionsDisPstFor[Forums->Forum.Type] : case Usr_I_CAN:
For_ActionsEnbPstFor[Forums->Forum.Type]; NextAction = DisabledOrEnabled == Cns_ENABLED ? For_ActionsDisPstFor[Forums->Forum.Type] :
Frm_BeginFormAnchor (NextAction,For_FORUM_POSTS_SECTION_ID); For_ActionsEnbPstFor[Forums->Forum.Type];
For_PutParsForum (Forums); Frm_BeginFormAnchor (NextAction,For_FORUM_POSTS_SECTION_ID);
Ico_PutIconLink (Icon[DisabledOrEnabled],Color[DisabledOrEnabled],NextAction); For_PutParsForum (Forums);
Frm_EndForm (); Ico_PutIconLink (Icon[DisabledOrEnabled],Color[DisabledOrEnabled],NextAction);
} Frm_EndForm ();
else break;
{ case Usr_I_CAN_NOT:
if (asprintf (&Title,*TxtAllowedBanned[DisabledOrEnabled],PstNum) < 0) default:
Err_NotEnoughMemoryExit (); if (asprintf (&Title,*TxtAllowedBanned[DisabledOrEnabled],PstNum) < 0)
Ico_PutIcon (Icon[DisabledOrEnabled],Color[DisabledOrEnabled],Title, Err_NotEnoughMemoryExit ();
"ICO_HIDDEN ICO16x16"); Ico_PutIcon (Icon[DisabledOrEnabled],Color[DisabledOrEnabled],Title,
free (Title); "ICO_HIDDEN ICO16x16");
free (Title);
break;
} }
/***** Form to remove post *****/ /***** Form to remove post *****/
@ -1518,8 +1520,9 @@ static void For_WriteLinksToPlatformForums (const struct For_Forums *Forums,
Forum.HieCod = -1L; Forum.HieCod = -1L;
Highlight = (Forums->Forum.Type == For_FORUM__SWAD__USRS) ? Lay_HIGHLIGHT : Highlight = (Forums->Forum.Type == For_FORUM__SWAD__USRS) ? Lay_HIGHLIGHT :
Lay_NO_HIGHLIGHT; Lay_NO_HIGHLIGHT;
IsLastItemInLevel[1] = (IsLastForum && ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM : IsLastItemInLevel[1] = (IsLastForum &&
Lay_NO_LAST_ITEM; ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM :
Lay_NO_LAST_ITEM;
For_WriteLinkToForum (Forums,&Forum,Highlight,1,IsLastItemInLevel); For_WriteLinkToForum (Forums,&Forum,Highlight,1,IsLastItemInLevel);
/***** Link to forum of teachers about the platform *****/ /***** Link to forum of teachers about the platform *****/
@ -1563,8 +1566,9 @@ static long For_WriteLinksToInsForums (const struct For_Forums *Forums,
Highlight = (Forums->Forum.Type == For_FORUM_INSTIT_USRS && Highlight = (Forums->Forum.Type == For_FORUM_INSTIT_USRS &&
Forums->Forum.HieCod == InsCod) ? Lay_HIGHLIGHT : Forums->Forum.HieCod == InsCod) ? Lay_HIGHLIGHT :
Lay_NO_HIGHLIGHT; Lay_NO_HIGHLIGHT;
IsLastItemInLevel[2] = (IsLastIns && ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM : IsLastItemInLevel[2] = (IsLastIns &&
Lay_NO_LAST_ITEM; ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM :
Lay_NO_LAST_ITEM;
For_WriteLinkToForum (Forums,&Forum,Highlight,2,IsLastItemInLevel); For_WriteLinkToForum (Forums,&Forum,Highlight,2,IsLastItemInLevel);
/***** Link to forum of teachers from this institution *****/ /***** Link to forum of teachers from this institution *****/
@ -1611,8 +1615,9 @@ static long For_WriteLinksToCtrForums (const struct For_Forums *Forums,
Highlight = (Forums->Forum.Type == For_FORUM_CENTER_USRS && Highlight = (Forums->Forum.Type == For_FORUM_CENTER_USRS &&
Forums->Forum.HieCod == CtrCod) ? Lay_HIGHLIGHT : Forums->Forum.HieCod == CtrCod) ? Lay_HIGHLIGHT :
Lay_NO_HIGHLIGHT; Lay_NO_HIGHLIGHT;
IsLastItemInLevel[3] = (IsLastCtr && ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM : IsLastItemInLevel[3] = (IsLastCtr &&
Lay_NO_LAST_ITEM; ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM :
Lay_NO_LAST_ITEM;
For_WriteLinkToForum (Forums,&Forum,Highlight,3,IsLastItemInLevel); For_WriteLinkToForum (Forums,&Forum,Highlight,3,IsLastItemInLevel);
/***** Link to forum of teachers from this center *****/ /***** Link to forum of teachers from this center *****/
@ -1659,8 +1664,9 @@ static long For_WriteLinksToDegForums (const struct For_Forums *Forums,
Highlight = (Forums->Forum.Type == For_FORUM_DEGREE_USRS && Highlight = (Forums->Forum.Type == For_FORUM_DEGREE_USRS &&
Forums->Forum.HieCod == DegCod) ? Lay_HIGHLIGHT : Forums->Forum.HieCod == DegCod) ? Lay_HIGHLIGHT :
Lay_NO_HIGHLIGHT; Lay_NO_HIGHLIGHT;
IsLastItemInLevel[4] = (IsLastDeg && ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM : IsLastItemInLevel[4] = (IsLastDeg &&
Lay_NO_LAST_ITEM; ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM :
Lay_NO_LAST_ITEM;
For_WriteLinkToForum (Forums,&Forum,Highlight,4,IsLastItemInLevel); For_WriteLinkToForum (Forums,&Forum,Highlight,4,IsLastItemInLevel);
/***** Link to forum of teachers from this degree *****/ /***** Link to forum of teachers from this degree *****/

View File

@ -1636,16 +1636,24 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games)
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
unsigned NumQsts; unsigned NumQsts;
Usr_ICan_t ICanEditQuestions = Gam_CheckIfICanEditGame (&Games->Game); Usr_ICan_t ICanEditQuestions = Gam_CheckIfICanEditGame (&Games->Game);
static void (*FunctionToDrawContextualIcons[Usr_NUM_I_CAN]) (void *Args) =
{
[Usr_I_CAN_NOT] = NULL,
[Usr_I_CAN ] = Gam_PutIconToAddNewQuestions,
};
void *Args[Usr_NUM_I_CAN] =
{
[Usr_I_CAN_NOT] = NULL,
[Usr_I_CAN ] = Games,
};
/***** Get data of questions from database *****/ /***** Get data of questions from database *****/
NumQsts = Gam_DB_GetGameQuestionsBasic (&mysql_res,Games->Game.GamCod); NumQsts = Gam_DB_GetGameQuestionsBasic (&mysql_res,Games->Game.GamCod);
/***** Begin box *****/ /***** Begin box *****/
Box_BoxBegin (Txt_Questions, Box_BoxBegin (Txt_Questions,
ICanEditQuestions == Usr_I_CAN ? Gam_PutIconToAddNewQuestions : FunctionToDrawContextualIcons[ICanEditQuestions],
NULL, Args[ICanEditQuestions],
ICanEditQuestions == Usr_I_CAN ? Games :
NULL,
Hlp_ASSESSMENT_Games_questions,Box_NOT_CLOSABLE); Hlp_ASSESSMENT_Games_questions,Box_NOT_CLOSABLE);
/***** Show table with questions *****/ /***** Show table with questions *****/
@ -1736,11 +1744,17 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ()); HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ());
/* Put icon to remove the question */ /* Put icon to remove the question */
if (ICanEditQuestions == Usr_I_CAN) switch (ICanEditQuestions)
Ico_PutContextualIconToRemove (ActReqRemGamQst,NULL, {
Gam_PutParsOneQst,Games); case Usr_I_CAN:
else Ico_PutContextualIconToRemove (ActReqRemGamQst,NULL,
Ico_PutIconRemovalNotAllowed (); Gam_PutParsOneQst,Games);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconRemovalNotAllowed ();
break;
}
/* Put icon to move up the question */ /* Put icon to move up the question */
if (ICanEditQuestions == Usr_I_CAN && QstInd > 1) if (ICanEditQuestions == Usr_I_CAN && QstInd > 1)
@ -2154,10 +2168,10 @@ static Usr_ICan_t Gam_CheckIfICanEditGame (const struct Gam_Game *Game)
{ {
if (Gam_CheckIfICanEditGames () == Usr_I_CAN) if (Gam_CheckIfICanEditGames () == Usr_I_CAN)
/***** Questions are editable only if game has no matches *****/ /***** Questions are editable only if game has no matches *****/
return Game->NumMchs == 0 ? Usr_I_CAN : // Games with matches should not be edited if (Game->NumMchs == 0)
Usr_I_CAN_NOT; return Usr_I_CAN;
else
return Usr_I_CAN_NOT; // Questions are not editable return Usr_I_CAN_NOT;
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -349,6 +349,11 @@ void Grp_ShowFormToSelectSeveralGroups (Act_Action_t NextAction,
extern const char *Txt_Update_users; extern const char *Txt_Update_users;
unsigned NumGrpTyp; unsigned NumGrpTyp;
Usr_ICan_t ICanEdit; Usr_ICan_t ICanEdit;
static void (*FunctionToDrawContextualIcons[Usr_NUM_I_CAN]) (void *Args) =
{
[Usr_I_CAN_NOT] = NULL,
[Usr_I_CAN ] = Grp_PutIconToEditGroups,
};
/***** Trivial check: if no groups ==> nothing to do *****/ /***** Trivial check: if no groups ==> nothing to do *****/
if (!Gbl.Crs.Grps.NumGrps) if (!Gbl.Crs.Grps.NumGrps)
@ -360,9 +365,7 @@ void Grp_ShowFormToSelectSeveralGroups (Act_Action_t NextAction,
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN : Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
Box_BoxBegin (Txt_Groups, Box_BoxBegin (Txt_Groups,
ICanEdit == Usr_I_CAN ? Grp_PutIconToEditGroups : FunctionToDrawContextualIcons[ICanEdit],NULL,
NULL,
NULL,
Hlp_USERS_Groups,Box_CLOSABLE); Hlp_USERS_Groups,Box_CLOSABLE);
/***** Begin form to update the students listed /***** Begin form to update the students listed
@ -630,50 +633,50 @@ void Grp_ChangeMyGrps (Cns_QuietOrVerbose_t QuietOrVerbose)
bool ChangesMade; bool ChangesMade;
/***** Can I change my groups? *****/ /***** Can I change my groups? *****/
if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN) if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN_NOT)
return;
/***** Get list of groups types and groups in this course *****/
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
/***** Get the group codes which I want to join to *****/
LstGrpsIWant.GrpCods = NULL; // Initialized to avoid bug reported by Coverity
LstGrpsIWant.NumGrps = 0; // Initialized to avoid bug reported by Coverity
Grp_GetLstCodsGrpWanted (&LstGrpsIWant);
/***** A student can not be enroled in more than one group
if the type of group is of single enrolment *****/
// As the form to register in groups of single enrolment...
// ...is a radio-based form and not a checkbox-based form...
// ...this check is made only to avoid problems...
// ...if the student manipulates the form
MySelectionIsValid = Grp_CheckIfSelectionGrpsSingleEnrolmentIsValid (Gbl.Usrs.Me.Role.Logged,&LstGrpsIWant);
/***** Free list of groups types and groups in this course *****/
// The lists of group types and groups need to be freed here...
// ...in order to get them again when changing my groups atomically
Grp_FreeListGrpTypesAndGrps ();
/***** Change my groups *****/
if (MySelectionIsValid)
{ {
/***** Get list of groups types and groups in this course *****/ ChangesMade = Grp_ChangeMyGrpsAtomically (&LstGrpsIWant);
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS); if (QuietOrVerbose == Cns_VERBOSE)
/***** Get the group codes which I want to join to *****/
LstGrpsIWant.GrpCods = NULL; // Initialized to avoid bug reported by Coverity
LstGrpsIWant.NumGrps = 0; // Initialized to avoid bug reported by Coverity
Grp_GetLstCodsGrpWanted (&LstGrpsIWant);
/***** A student can not be enroled in more than one group
if the type of group is of single enrolment *****/
// As the form to register in groups of single enrolment...
// ...is a radio-based form and not a checkbox-based form...
// ...this check is made only to avoid problems...
// ...if the student manipulates the form
MySelectionIsValid = Grp_CheckIfSelectionGrpsSingleEnrolmentIsValid (Gbl.Usrs.Me.Role.Logged,&LstGrpsIWant);
/***** Free list of groups types and groups in this course *****/
// The lists of group types and groups need to be freed here...
// ...in order to get them again when changing my groups atomically
Grp_FreeListGrpTypesAndGrps ();
/***** Change my groups *****/
if (MySelectionIsValid)
{ {
ChangesMade = Grp_ChangeMyGrpsAtomically (&LstGrpsIWant); if (ChangesMade)
if (QuietOrVerbose == Cns_VERBOSE) Ale_CreateAlert (Ale_SUCCESS,NULL,
{ Txt_The_requested_group_changes_were_successful);
if (ChangesMade) else
Ale_CreateAlert (Ale_SUCCESS,NULL, Ale_CreateAlert (Ale_WARNING,NULL,
Txt_The_requested_group_changes_were_successful); Txt_There_has_been_no_change_in_groups);
else
Ale_CreateAlert (Ale_WARNING,NULL,
Txt_There_has_been_no_change_in_groups);
}
} }
else if (QuietOrVerbose == Cns_VERBOSE)
Ale_CreateAlert (Ale_WARNING,NULL,
Txt_In_a_type_of_group_with_single_enrolment_students_can_not_be_registered_in_more_than_one_group);
/***** Free memory with the list of groups which I want to belong to *****/
Grp_FreeListCodGrp (&LstGrpsIWant);
} }
else if (QuietOrVerbose == Cns_VERBOSE)
Ale_CreateAlert (Ale_WARNING,NULL,
Txt_In_a_type_of_group_with_single_enrolment_students_can_not_be_registered_in_more_than_one_group);
/***** Free memory with the list of groups which I want to belong to *****/
Grp_FreeListCodGrp (&LstGrpsIWant);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -689,36 +692,36 @@ void Grp_ChangeOtherUsrGrps (void)
bool SelectionIsValid; bool SelectionIsValid;
/***** Can I change another user's groups? *****/ /***** Can I change another user's groups? *****/
if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN) if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN_NOT)
{ return;
/***** Get list of groups types and groups in current course *****/
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
/***** Get the list of groups to which register this user *****/ /***** Get list of groups types and groups in current course *****/
LstGrpsUsrWants.GrpCods = NULL; // Initialized to avoid bug reported by Coverity Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
LstGrpsUsrWants.NumGrps = 0; // Initialized to avoid bug reported by Coverity
Grp_GetLstCodsGrpWanted (&LstGrpsUsrWants);
/***** A student can not be enroled in more than one group /***** Get the list of groups to which register this user *****/
if the type of group is of single enrolment *****/ LstGrpsUsrWants.GrpCods = NULL; // Initialized to avoid bug reported by Coverity
SelectionIsValid = Grp_CheckIfSelectionGrpsSingleEnrolmentIsValid (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs, LstGrpsUsrWants.NumGrps = 0; // Initialized to avoid bug reported by Coverity
&LstGrpsUsrWants); Grp_GetLstCodsGrpWanted (&LstGrpsUsrWants);
/***** Free list of groups types and groups in this course *****/ /***** A student can not be enroled in more than one group
// The lists of group types and groups need to be freed here... if the type of group is of single enrolment *****/
// ...in order to get them again when changing groups atomically SelectionIsValid = Grp_CheckIfSelectionGrpsSingleEnrolmentIsValid (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs,
Grp_FreeListGrpTypesAndGrps (); &LstGrpsUsrWants);
/***** Register user in the selected groups *****/ /***** Free list of groups types and groups in this course *****/
if (SelectionIsValid) // The lists of group types and groups need to be freed here...
Grp_ChangeGrpsOtherUsrAtomically (&LstGrpsUsrWants); // ...in order to get them again when changing groups atomically
else Grp_FreeListGrpTypesAndGrps ();
Ale_CreateAlert (Ale_WARNING,NULL,
Txt_In_a_type_of_group_with_single_enrolment_students_can_not_be_registered_in_more_than_one_group);
/***** Free memory with the list of groups to/from which register/remove users *****/ /***** Register user in the selected groups *****/
Grp_FreeListCodGrp (&LstGrpsUsrWants); if (SelectionIsValid)
} Grp_ChangeGrpsOtherUsrAtomically (&LstGrpsUsrWants);
else
Ale_CreateAlert (Ale_WARNING,NULL,
Txt_In_a_type_of_group_with_single_enrolment_students_can_not_be_registered_in_more_than_one_group);
/***** Free memory with the list of groups to/from which register/remove users *****/
Grp_FreeListCodGrp (&LstGrpsUsrWants);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1714,6 +1717,11 @@ void Grp_ShowLstGrpsToChgMyGrps (void)
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN : Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
Usr_ICan_t ICanChangeMyGrps = Usr_I_CAN_NOT; Usr_ICan_t ICanChangeMyGrps = Usr_I_CAN_NOT;
static void (*FunctionToDrawContextualIcons[Usr_NUM_I_CAN]) (void *Args) =
{
[Usr_I_CAN_NOT] = NULL,
[Usr_I_CAN ] = Grp_PutIconToEditGroups,
};
if (Gbl.Crs.Grps.NumGrps) // This course has groups if (Gbl.Crs.Grps.NumGrps) // This course has groups
{ {
@ -1728,9 +1736,7 @@ void Grp_ShowLstGrpsToChgMyGrps (void)
/***** Begin box *****/ /***** Begin box *****/
Box_BoxBegin (Txt_My_groups, Box_BoxBegin (Txt_My_groups,
ICanEdit == Usr_I_CAN ? Grp_PutIconToEditGroups : FunctionToDrawContextualIcons[ICanEdit],NULL,
NULL,
NULL,
Hlp_USERS_Groups,Box_NOT_CLOSABLE); Hlp_USERS_Groups,Box_NOT_CLOSABLE);
if (Gbl.Crs.Grps.NumGrps) // This course has groups if (Gbl.Crs.Grps.NumGrps) // This course has groups
@ -1852,7 +1858,8 @@ static Usr_ICan_t Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
if (GrpTyp->MultipleEnrolment) // Enrolment is multiple if (GrpTyp->MultipleEnrolment) // Enrolment is multiple
{ {
for (NumGrpThisType = 0, ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN_NOT; for (NumGrpThisType = 0, ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN_NOT;
NumGrpThisType < GrpTyp->NumGrps && ICanChangeMySelectionForThisGrpTyp == Usr_I_CAN_NOT; NumGrpThisType < GrpTyp->NumGrps &&
ICanChangeMySelectionForThisGrpTyp == Usr_I_CAN_NOT;
NumGrpThisType++) NumGrpThisType++)
{ {
Grp = &(GrpTyp->LstGrps[NumGrpThisType]); Grp = &(GrpTyp->LstGrps[NumGrpThisType]);
@ -1888,7 +1895,8 @@ static Usr_ICan_t Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
else // I don't belong to a closed group else // I don't belong to a closed group
/* Step 2: Check if I can register in at least one group to which I don't belong */ /* Step 2: Check if I can register in at least one group to which I don't belong */
for (NumGrpThisType = 0, ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN_NOT; for (NumGrpThisType = 0, ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN_NOT;
NumGrpThisType < GrpTyp->NumGrps && ICanChangeMySelectionForThisGrpTyp == Usr_I_CAN_NOT; NumGrpThisType < GrpTyp->NumGrps &&
ICanChangeMySelectionForThisGrpTyp == Usr_I_CAN_NOT;
NumGrpThisType++) NumGrpThisType++)
{ {
Grp = &(GrpTyp->LstGrps[NumGrpThisType]); Grp = &(GrpTyp->LstGrps[NumGrpThisType]);
@ -1920,23 +1928,27 @@ static Usr_ICan_t Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong); IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong);
/* Selection disabled? */ /* Selection disabled? */
if (ICanChangeMySelectionForThisGrpTyp == Usr_I_CAN) // I can change my selection for this group type switch (ICanChangeMySelectionForThisGrpTyp) // I can change my selection for this group type
{ {
ICanChangeMySelectionForThisGrp = Usr_I_CAN; case Usr_I_CAN:
if (Gbl.Usrs.Me.Role.Logged == Rol_STD) ICanChangeMySelectionForThisGrp = Usr_I_CAN;
{ if (Gbl.Usrs.Me.Role.Logged == Rol_STD)
if (Grp->Open) // If group is open
{ {
if (!IBelongToThisGroup && // I don't belong to group if (Grp->Open) // If group is open
Grp->NumUsrs[Rol_STD] >= Grp->MaxStudents) // Group is full {
if (!IBelongToThisGroup && // I don't belong to group
Grp->NumUsrs[Rol_STD] >= Grp->MaxStudents) // Group is full
ICanChangeMySelectionForThisGrp = Usr_I_CAN_NOT;
}
else // If group is closed
ICanChangeMySelectionForThisGrp = Usr_I_CAN_NOT; ICanChangeMySelectionForThisGrp = Usr_I_CAN_NOT;
} }
else // If group is closed break;
ICanChangeMySelectionForThisGrp = Usr_I_CAN_NOT; case Usr_I_CAN_NOT: // I can not change my selection for this group type
} default:
} ICanChangeMySelectionForThisGrp = Usr_I_CAN_NOT;
else // I can not change my selection for this group type break;
ICanChangeMySelectionForThisGrp = Usr_I_CAN_NOT; }
/* Put radio item or checkbox to select the group */ /* Put radio item or checkbox to select the group */
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
@ -2188,22 +2200,26 @@ static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp)
/* Write checkbox to select the group */ /* Write checkbox to select the group */
ICanSelUnselGroup = (Gbl.Usrs.Me.Role.Logged >= Rol_STD) ? Usr_I_CAN : ICanSelUnselGroup = (Gbl.Usrs.Me.Role.Logged >= Rol_STD) ? Usr_I_CAN :
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
if (ICanSelUnselGroup == Usr_I_CAN) switch (ICanSelUnselGroup)
{ {
if (Gbl.Crs.Grps.AllGrps) case Usr_I_CAN:
Checked = true; if (Gbl.Crs.Grps.AllGrps)
else Checked = true;
for (NumGrpSel = 0, Checked = false; else
NumGrpSel < Gbl.Crs.Grps.LstGrpsSel.NumGrps; for (NumGrpSel = 0, Checked = false;
NumGrpSel++) NumGrpSel < Gbl.Crs.Grps.LstGrpsSel.NumGrps;
if (Gbl.Crs.Grps.LstGrpsSel.GrpCods[NumGrpSel] == -(GrpTyp->GrpTypCod)) NumGrpSel++)
{ if (Gbl.Crs.Grps.LstGrpsSel.GrpCods[NumGrpSel] == -(GrpTyp->GrpTypCod))
Checked = true; {
break; Checked = true;
} break;
}
break;
case Usr_I_CAN_NOT:
default:
Checked = false;
break;
} }
else
Checked = false;
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);

View File

@ -127,23 +127,6 @@ static Act_Action_t Inf_ActionsInfo[Inf_NUM_SOURCES][Inf_NUM_TYPES] =
[Inf_URL ][Inf_ASSESSMENT ] = ActRcvURLAss, [Inf_URL ][Inf_ASSESSMENT ] = ActRcvURLAss,
}; };
/***** Help *****/
extern const char *Hlp_COURSE_Information_textual_information;
extern const char *Hlp_COURSE_Guide;
extern const char *Hlp_COURSE_Syllabus;
extern const char *Hlp_COURSE_Bibliography;
extern const char *Hlp_COURSE_FAQ;
extern const char *Hlp_COURSE_Links;
extern const char *Hlp_COURSE_Assessment;
extern const char *Hlp_COURSE_Information_edit;
extern const char *Hlp_COURSE_Guide_edit;
extern const char *Hlp_COURSE_Syllabus_edit;
extern const char *Hlp_COURSE_Bibliography_edit;
extern const char *Hlp_COURSE_FAQ_edit;
extern const char *Hlp_COURSE_Links_edit;
extern const char *Hlp_COURSE_Assessment_edit;
/*****************************************************************************/ /*****************************************************************************/
/**************************** Private prototypes *****************************/ /**************************** Private prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -181,6 +164,13 @@ static bool Inf_CheckAndShowRichTxt (void);
void Inf_ShowInfo (void) void Inf_ShowInfo (void)
{ {
extern const char *Hlp_COURSE_Information_textual_information;
extern const char *Hlp_COURSE_Guide;
extern const char *Hlp_COURSE_Syllabus;
extern const char *Hlp_COURSE_Bibliography;
extern const char *Hlp_COURSE_FAQ;
extern const char *Hlp_COURSE_Links;
extern const char *Hlp_COURSE_Assessment;
extern const char *Txt_INFO_TITLE[Inf_NUM_TYPES]; extern const char *Txt_INFO_TITLE[Inf_NUM_TYPES];
extern const char *Txt_No_information; extern const char *Txt_No_information;
struct Syl_Syllabus Syllabus; struct Syl_Syllabus Syllabus;
@ -190,16 +180,26 @@ void Inf_ShowInfo (void)
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN : Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
bool ShowWarningNoInfo = false; bool ShowWarningNoInfo = false;
const char *Help[Inf_NUM_TYPES] = static void (*FunctionToDrawContextualIcons[Usr_NUM_I_CAN]) (void *Args) =
{ {
[Inf_INFORMATION ] = Hlp_COURSE_Information_textual_information, [Usr_I_CAN_NOT] = NULL,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide, [Usr_I_CAN ] = Inf_PutIconToEditInfo,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus, };
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus, static void *Args[Usr_NUM_I_CAN] =
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography, {
[Inf_FAQ ] = Hlp_COURSE_FAQ, [Usr_I_CAN_NOT] = NULL,
[Inf_LINKS ] = Hlp_COURSE_Links, [Usr_I_CAN ] = &Gbl.Crs.Info.Type,
[Inf_ASSESSMENT ] = Hlp_COURSE_Assessment, };
static const char **Help[Inf_NUM_TYPES] =
{
[Inf_INFORMATION ] = &Hlp_COURSE_Information_textual_information,
[Inf_TEACHING_GUIDE] = &Hlp_COURSE_Guide,
[Inf_LECTURES ] = &Hlp_COURSE_Syllabus,
[Inf_PRACTICALS ] = &Hlp_COURSE_Syllabus,
[Inf_BIBLIOGRAPHY ] = &Hlp_COURSE_Bibliography,
[Inf_FAQ ] = &Hlp_COURSE_FAQ,
[Inf_LINKS ] = &Hlp_COURSE_Links,
[Inf_ASSESSMENT ] = &Hlp_COURSE_Assessment,
}; };
/***** Reset syllabus context *****/ /***** Reset syllabus context *****/
@ -245,11 +245,8 @@ void Inf_ShowInfo (void)
/***** Begin box *****/ /***** Begin box *****/
Box_BoxBegin (Txt_INFO_TITLE[Gbl.Crs.Info.Type], Box_BoxBegin (Txt_INFO_TITLE[Gbl.Crs.Info.Type],
(ICanEdit == Usr_I_CAN) ? Inf_PutIconToEditInfo : FunctionToDrawContextualIcons[ICanEdit],Args[ICanEdit],
NULL, *Help[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
(ICanEdit == Usr_I_CAN) ? &Gbl.Crs.Info.Type :
NULL,
Help[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
/****** Form to select syllabus *****/ /****** Form to select syllabus *****/
Syl_PutFormWhichSyllabus (Syllabus.WhichSyllabus); Syl_PutFormWhichSyllabus (Syllabus.WhichSyllabus);
@ -809,6 +806,13 @@ void Inf_SetInfoSrc (void)
void Inf_FormsToSelSendInfo (void) void Inf_FormsToSelSendInfo (void)
{ {
extern const char *Hlp_COURSE_Information_edit;
extern const char *Hlp_COURSE_Guide_edit;
extern const char *Hlp_COURSE_Syllabus_edit;
extern const char *Hlp_COURSE_Bibliography_edit;
extern const char *Hlp_COURSE_FAQ_edit;
extern const char *Hlp_COURSE_Links_edit;
extern const char *Hlp_COURSE_Assessment_edit;
extern const char *Txt_Source_of_information; extern const char *Txt_Source_of_information;
extern const char *Txt_INFO_SRC_FULL_TEXT[Inf_NUM_SOURCES]; extern const char *Txt_INFO_SRC_FULL_TEXT[Inf_NUM_SOURCES];
extern const char *Txt_INFO_SRC_HELP[Inf_NUM_SOURCES]; extern const char *Txt_INFO_SRC_HELP[Inf_NUM_SOURCES];
@ -837,16 +841,16 @@ void Inf_FormsToSelSendInfo (void)
[Inf_PAGE ] = Inf_FormToSendPage, [Inf_PAGE ] = Inf_FormToSendPage,
[Inf_URL ] = Inf_FormToSendURL, [Inf_URL ] = Inf_FormToSendURL,
}; };
const char *HelpEdit[Inf_NUM_TYPES] = static const char **HelpEdit[Inf_NUM_TYPES] =
{ {
[Inf_INFORMATION ] = Hlp_COURSE_Information_edit, [Inf_INFORMATION ] = &Hlp_COURSE_Information_edit,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit, [Inf_TEACHING_GUIDE] = &Hlp_COURSE_Guide_edit,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit, [Inf_LECTURES ] = &Hlp_COURSE_Syllabus_edit,
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit, [Inf_PRACTICALS ] = &Hlp_COURSE_Syllabus_edit,
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit, [Inf_BIBLIOGRAPHY ] = &Hlp_COURSE_Bibliography_edit,
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit, [Inf_FAQ ] = &Hlp_COURSE_FAQ_edit,
[Inf_LINKS ] = Hlp_COURSE_Links_edit, [Inf_LINKS ] = &Hlp_COURSE_Links_edit,
[Inf_ASSESSMENT ] = Hlp_COURSE_Assessment_edit, [Inf_ASSESSMENT ] = &Hlp_COURSE_Assessment_edit,
}; };
/***** Reset syllabus context *****/ /***** Reset syllabus context *****/
@ -880,7 +884,7 @@ void Inf_FormsToSelSendInfo (void)
/* Begin box and table */ /* Begin box and table */
Box_BoxTableBegin (Txt_Source_of_information, Box_BoxTableBegin (Txt_Source_of_information,
Inf_PutIconToViewInfo,&Gbl.Crs.Info.Type, Inf_PutIconToViewInfo,&Gbl.Crs.Info.Type,
HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE,4); *HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE,4);
/* Options */ /* Options */
for (InfoSrc = (Inf_Src_t) 0; for (InfoSrc = (Inf_Src_t) 0;
@ -1493,6 +1497,13 @@ static bool Inf_CheckAndShowRichTxt (void)
void Inf_EditPlainTxtInfo (void) void Inf_EditPlainTxtInfo (void)
{ {
extern const char *Hlp_COURSE_Information_edit;
extern const char *Hlp_COURSE_Guide_edit;
extern const char *Hlp_COURSE_Syllabus_edit;
extern const char *Hlp_COURSE_Bibliography_edit;
extern const char *Hlp_COURSE_FAQ_edit;
extern const char *Hlp_COURSE_Links_edit;
extern const char *Hlp_COURSE_Assessment_edit;
extern Syl_WhichSyllabus_t Syl_WhichSyllabus[Syl_NUM_WHICH_SYLLABUS]; extern Syl_WhichSyllabus_t Syl_WhichSyllabus[Syl_NUM_WHICH_SYLLABUS];
extern const char *Txt_INFO_TITLE[Inf_NUM_TYPES]; extern const char *Txt_INFO_TITLE[Inf_NUM_TYPES];
extern const char *Txt_Save_changes; extern const char *Txt_Save_changes;
@ -1509,16 +1520,16 @@ void Inf_EditPlainTxtInfo (void)
[Inf_LINKS ] = {ActRcvPlaTxtCrsLnk,NULL,NULL}, [Inf_LINKS ] = {ActRcvPlaTxtCrsLnk,NULL,NULL},
[Inf_ASSESSMENT ] = {ActRcvPlaTxtAss ,NULL,NULL}, [Inf_ASSESSMENT ] = {ActRcvPlaTxtAss ,NULL,NULL},
}; };
const char *HelpEdit[Inf_NUM_TYPES] = static const char **HelpEdit[Inf_NUM_TYPES] =
{ {
[Inf_INFORMATION ] = Hlp_COURSE_Information_edit, [Inf_INFORMATION ] = &Hlp_COURSE_Information_edit,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit, [Inf_TEACHING_GUIDE] = &Hlp_COURSE_Guide_edit,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit, [Inf_LECTURES ] = &Hlp_COURSE_Syllabus_edit,
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit, [Inf_PRACTICALS ] = &Hlp_COURSE_Syllabus_edit,
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit, [Inf_BIBLIOGRAPHY ] = &Hlp_COURSE_Bibliography_edit,
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit, [Inf_FAQ ] = &Hlp_COURSE_FAQ_edit,
[Inf_LINKS ] = Hlp_COURSE_Links_edit, [Inf_LINKS ] = &Hlp_COURSE_Links_edit,
[Inf_ASSESSMENT ] = Hlp_COURSE_Assessment_edit, [Inf_ASSESSMENT ] = &Hlp_COURSE_Assessment_edit,
}; };
/***** Reset syllabus context *****/ /***** Reset syllabus context *****/
@ -1532,7 +1543,7 @@ void Inf_EditPlainTxtInfo (void)
if (Inf_Actions[Gbl.Crs.Info.Type].FuncPars) if (Inf_Actions[Gbl.Crs.Info.Type].FuncPars)
Inf_Actions[Gbl.Crs.Info.Type].FuncPars (Inf_Actions[Gbl.Crs.Info.Type].Args); Inf_Actions[Gbl.Crs.Info.Type].FuncPars (Inf_Actions[Gbl.Crs.Info.Type].Args);
Box_BoxBegin (Txt_INFO_TITLE[Gbl.Crs.Info.Type],NULL,NULL, Box_BoxBegin (Txt_INFO_TITLE[Gbl.Crs.Info.Type],NULL,NULL,
HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE); *HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
switch (Gbl.Crs.Info.Type) switch (Gbl.Crs.Info.Type)
{ {
@ -1569,6 +1580,13 @@ void Inf_EditPlainTxtInfo (void)
void Inf_EditRichTxtInfo (void) void Inf_EditRichTxtInfo (void)
{ {
extern const char *Hlp_COURSE_Information_edit;
extern const char *Hlp_COURSE_Guide_edit;
extern const char *Hlp_COURSE_Syllabus_edit;
extern const char *Hlp_COURSE_Bibliography_edit;
extern const char *Hlp_COURSE_FAQ_edit;
extern const char *Hlp_COURSE_Links_edit;
extern const char *Hlp_COURSE_Assessment_edit;
extern Syl_WhichSyllabus_t Syl_WhichSyllabus[Syl_NUM_WHICH_SYLLABUS]; extern Syl_WhichSyllabus_t Syl_WhichSyllabus[Syl_NUM_WHICH_SYLLABUS];
extern const char *Txt_INFO_TITLE[Inf_NUM_TYPES]; extern const char *Txt_INFO_TITLE[Inf_NUM_TYPES];
extern const char *Txt_Save_changes; extern const char *Txt_Save_changes;
@ -1585,16 +1603,16 @@ void Inf_EditRichTxtInfo (void)
[Inf_LINKS ] = {ActRcvRchTxtCrsLnk,NULL,NULL}, [Inf_LINKS ] = {ActRcvRchTxtCrsLnk,NULL,NULL},
[Inf_ASSESSMENT ] = {ActRcvRchTxtAss ,NULL,NULL}, [Inf_ASSESSMENT ] = {ActRcvRchTxtAss ,NULL,NULL},
}; };
const char *HelpEdit[Inf_NUM_TYPES] = static const char **HelpEdit[Inf_NUM_TYPES] =
{ {
[Inf_INFORMATION ] = Hlp_COURSE_Information_edit, [Inf_INFORMATION ] = &Hlp_COURSE_Information_edit,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit, [Inf_TEACHING_GUIDE] = &Hlp_COURSE_Guide_edit,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit, [Inf_LECTURES ] = &Hlp_COURSE_Syllabus_edit,
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit, [Inf_PRACTICALS ] = &Hlp_COURSE_Syllabus_edit,
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit, [Inf_BIBLIOGRAPHY ] = &Hlp_COURSE_Bibliography_edit,
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit, [Inf_FAQ ] = &Hlp_COURSE_FAQ_edit,
[Inf_LINKS ] = Hlp_COURSE_Links_edit, [Inf_LINKS ] = &Hlp_COURSE_Links_edit,
[Inf_ASSESSMENT ] = Hlp_COURSE_Assessment_edit, [Inf_ASSESSMENT ] = &Hlp_COURSE_Assessment_edit,
}; };
/***** Reset syllabus context *****/ /***** Reset syllabus context *****/
@ -1608,7 +1626,7 @@ void Inf_EditRichTxtInfo (void)
if (Inf_Actions[Gbl.Crs.Info.Type].FuncPars) if (Inf_Actions[Gbl.Crs.Info.Type].FuncPars)
Inf_Actions[Gbl.Crs.Info.Type].FuncPars (Inf_Actions[Gbl.Crs.Info.Type].Args); Inf_Actions[Gbl.Crs.Info.Type].FuncPars (Inf_Actions[Gbl.Crs.Info.Type].Args);
Box_BoxBegin (Txt_INFO_TITLE[Gbl.Crs.Info.Type],NULL,NULL, Box_BoxBegin (Txt_INFO_TITLE[Gbl.Crs.Info.Type],NULL,NULL,
HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE); *HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
switch (Gbl.Crs.Info.Type) switch (Gbl.Crs.Info.Type)
{ {

View File

@ -950,28 +950,30 @@ static void Ins_ListInstitutionsForEdition (void)
/* Institution WWW */ /* Institution WWW */
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
if (ICanEdit == Usr_I_CAN) switch (ICanEdit)
{ {
Frm_BeginForm (ActChgInsWWW); case Usr_I_CAN:
ParCod_PutPar (ParCod_OthHie,Ins->HieCod); Frm_BeginForm (ActChgInsWWW);
HTM_INPUT_URL ("WWW",Ins->WWW,HTM_SUBMIT_ON_CHANGE, ParCod_PutPar (ParCod_OthHie,Ins->HieCod);
"class=\"INPUT_WWW INPUT_%s\"" HTM_INPUT_URL ("WWW",Ins->WWW,HTM_SUBMIT_ON_CHANGE,
" required=\"required\"", "class=\"INPUT_WWW INPUT_%s\""
The_GetSuffix ()); " required=\"required\"",
Frm_EndForm (); The_GetSuffix ());
} Frm_EndForm ();
else break;
{ case Usr_I_CAN_NOT:
Str_Copy (WWW,Ins->WWW,sizeof (WWW) - 1); default:
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\""); Str_Copy (WWW,Ins->WWW,sizeof (WWW) - 1);
HTM_A_Begin ("href=\"%s\" target=\"_blank\" title=\"%s\"" HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\"");
" class=\"DAT_%s\"", HTM_A_Begin ("href=\"%s\" target=\"_blank\" title=\"%s\""
Ins->WWW, " class=\"DAT_%s\"",
The_GetSuffix (), Ins->WWW,
Ins->WWW); The_GetSuffix (),
HTM_Txt (WWW); Ins->WWW);
HTM_A_End (); HTM_Txt (WWW);
HTM_DIV_End (); HTM_A_End ();
HTM_DIV_End ();
break;
} }
HTM_TD_End (); HTM_TD_End ();

View File

@ -1296,18 +1296,20 @@ void Mai_RemoveOtherUsrEmail (void)
{ {
/***** Get other user's code from form and get user's data *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Remove user's email *****/ case Usr_I_CAN:
Mai_RemoveEmail (&Gbl.Usrs.Other.UsrDat); /***** Remove user's email *****/
Mai_RemoveEmail (&Gbl.Usrs.Other.UsrDat);
/***** Show form again *****/ /***** Show form again *****/
Acc_ShowFormChgOtherUsrAccount (); Acc_ShowFormChgOtherUsrAccount ();
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else // User not found else // User not found
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
@ -1321,24 +1323,28 @@ static void Mai_RemoveEmail (struct Usr_Data *UsrDat)
extern const char *Txt_Email_X_removed; extern const char *Txt_Email_X_removed;
char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]; char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN) switch (Usr_CheckIfICanEditOtherUsr (UsrDat))
{ {
/***** Get new email from form *****/ case Usr_I_CAN:
Par_GetParText ("Email",Email,Cns_MAX_BYTES_EMAIL_ADDRESS); /***** Get new email from form *****/
Par_GetParText ("Email",Email,Cns_MAX_BYTES_EMAIL_ADDRESS);
/***** Remove one of user's old email addresses *****/ /***** Remove one of user's old email addresses *****/
Mai_DB_RemoveEmail (UsrDat->UsrCod,Email); Mai_DB_RemoveEmail (UsrDat->UsrCod,Email);
/***** Create alert *****/ /***** Create alert *****/
Ale_CreateAlert (Ale_SUCCESS,Mai_EMAIL_SECTION_ID, Ale_CreateAlert (Ale_SUCCESS,Mai_EMAIL_SECTION_ID,
Txt_Email_X_removed, Txt_Email_X_removed,
Email); Email);
/***** Update list of emails *****/ /***** Update list of emails *****/
Mai_GetEmailFromUsrCod (UsrDat); Mai_GetEmailFromUsrCod (UsrDat);
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1362,19 +1368,21 @@ void Mai_ChangeOtherUsrEmail (void)
{ {
/***** Get other user's code from form and get user's data *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Change user's ID *****/ case Usr_I_CAN:
Mai_ChangeUsrEmail (&Gbl.Usrs.Other.UsrDat, /***** Change user's ID *****/
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)); Mai_ChangeUsrEmail (&Gbl.Usrs.Other.UsrDat,
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
/***** Show form again *****/ /***** Show form again *****/
Acc_ShowFormChgOtherUsrAccount (); Acc_ShowFormChgOtherUsrAccount ();
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else // User not found else // User not found
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
@ -1391,49 +1399,53 @@ static void Mai_ChangeUsrEmail (struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOthe
extern const char *Txt_The_email_address_entered_X_is_not_valid; extern const char *Txt_The_email_address_entered_X_is_not_valid;
char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]; char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN) switch (Usr_CheckIfICanEditOtherUsr (UsrDat))
{ {
/***** Get new email from form *****/ case Usr_I_CAN:
Par_GetParText ("NewEmail",NewEmail,Cns_MAX_BYTES_EMAIL_ADDRESS); /***** Get new email from form *****/
Par_GetParText ("NewEmail",NewEmail,Cns_MAX_BYTES_EMAIL_ADDRESS);
if (Mai_CheckIfEmailIsValid (NewEmail)) // New email is valid if (Mai_CheckIfEmailIsValid (NewEmail)) // New email is valid
{
/***** Check if new email exists in database *****/
if (UsrDat->EmailConfirmed &&
!strcmp (UsrDat->Email,NewEmail)) // User's current confirmed email match exactly the new email
Ale_CreateAlert (Ale_WARNING,Mai_EMAIL_SECTION_ID,
Txt_The_email_address_X_matches_one_previously_registered,
NewEmail);
else
{ {
if (Mai_UpdateEmailInDB (UsrDat,NewEmail)) /***** Check if new email exists in database *****/
{ if (UsrDat->EmailConfirmed &&
/***** Email updated sucessfully *****/ !strcmp (UsrDat->Email,NewEmail)) // User's current confirmed email match exactly the new email
Ale_CreateAlert (Ale_SUCCESS,Mai_EMAIL_SECTION_ID,
Txt_The_email_address_X_has_been_registered_successfully,
NewEmail);
/***** Update list of emails *****/
Mai_GetEmailFromUsrCod (UsrDat);
/***** Send message via email
to confirm the new email address *****/
if (MeOrOther == Usr_ME)
Mai_SendMailMsgToConfirmEmail ();
}
else
Ale_CreateAlert (Ale_WARNING,Mai_EMAIL_SECTION_ID, Ale_CreateAlert (Ale_WARNING,Mai_EMAIL_SECTION_ID,
Txt_The_email_address_X_had_been_registered_by_another_user, Txt_The_email_address_X_matches_one_previously_registered,
NewEmail); NewEmail);
else
{
if (Mai_UpdateEmailInDB (UsrDat,NewEmail))
{
/***** Email updated sucessfully *****/
Ale_CreateAlert (Ale_SUCCESS,Mai_EMAIL_SECTION_ID,
Txt_The_email_address_X_has_been_registered_successfully,
NewEmail);
/***** Update list of emails *****/
Mai_GetEmailFromUsrCod (UsrDat);
/***** Send message via email
to confirm the new email address *****/
if (MeOrOther == Usr_ME)
Mai_SendMailMsgToConfirmEmail ();
}
else
Ale_CreateAlert (Ale_WARNING,Mai_EMAIL_SECTION_ID,
Txt_The_email_address_X_had_been_registered_by_another_user,
NewEmail);
}
} }
} else // New email is not valid
else // New email is not valid Ale_CreateAlert (Ale_WARNING,Mai_EMAIL_SECTION_ID,
Ale_CreateAlert (Ale_WARNING,Mai_EMAIL_SECTION_ID, Txt_The_email_address_entered_X_is_not_valid,
Txt_The_email_address_entered_X_is_not_valid, NewEmail);
NewEmail); break;
case Usr_I_CAN_NOT:
default:
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -551,18 +551,22 @@ static void Mch_ListOneOrMoreMatchesIcons (struct Gam_Games *Games,
{ {
HTM_TD_Begin ("rowspan=\"2\" class=\"BT %s\"",The_GetColorRows ()); HTM_TD_Begin ("rowspan=\"2\" class=\"BT %s\"",The_GetColorRows ());
if (Mch_CheckIfICanEditThisMatch (Match) == Usr_I_CAN) switch (Mch_CheckIfICanEditThisMatch (Match))
{ {
Games->MchCod = Match->MchCod; case Usr_I_CAN:
Games->MchCod = Match->MchCod;
/***** Put icon to remove the match *****/ /***** Put icon to remove the match *****/
Ico_PutContextualIconToRemove (ActReqRemMch,NULL,Mch_PutParsEdit,Games); Ico_PutContextualIconToRemove (ActReqRemMch,NULL,Mch_PutParsEdit,Games);
/***** Put icon to edit the match *****/ /***** Put icon to edit the match *****/
Ico_PutContextualIconToEdit (ActReqChgMch,Anchor,Mch_PutParsEdit,Games); Ico_PutContextualIconToEdit (ActReqChgMch,Anchor,Mch_PutParsEdit,Games);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconRemovalNotAllowed ();
break;
} }
else
Ico_PutIconRemovalNotAllowed ();
HTM_TD_End (); HTM_TD_End ();
} }
@ -835,25 +839,27 @@ static void Mch_ListOneOrMoreMatchesResultTch (struct Gam_Games *Games,
"trophy.svg",Ico_BLACK); "trophy.svg",Ico_BLACK);
/***** Check if visibility of session results can be changed *****/ /***** Check if visibility of session results can be changed *****/
if (Mch_CheckIfICanChangeVisibilityOfResults (Match) == Usr_I_CAN) switch (Mch_CheckIfICanChangeVisibilityOfResults (Match))
{ {
/* I can edit visibility */ case Usr_I_CAN:
if (Match->Status.ShowUsrResults) /* I can edit visibility */
Lay_PutContextualLinkOnlyIcon (ActChgVisResMchUsr,NULL, if (Match->Status.ShowUsrResults)
Mch_PutParsEdit,Games, Lay_PutContextualLinkOnlyIcon (ActChgVisResMchUsr,NULL,
"eye.svg",Ico_GREEN); Mch_PutParsEdit,Games,
else "eye.svg",Ico_GREEN);
Lay_PutContextualLinkOnlyIcon (ActChgVisResMchUsr,NULL, else
Mch_PutParsEdit,Games, Lay_PutContextualLinkOnlyIcon (ActChgVisResMchUsr,NULL,
"eye-slash.svg",Ico_RED); Mch_PutParsEdit,Games,
} "eye-slash.svg",Ico_RED);
else break;
{ case Usr_I_CAN_NOT:
/* I can not edit visibility */ default:
if (Match->Status.ShowUsrResults) /* I can not edit visibility */
Ico_PutIconOff ("eye.svg" ,Ico_GREEN,Txt_Visible_results); if (Match->Status.ShowUsrResults)
else Ico_PutIconOff ("eye.svg" ,Ico_GREEN,Txt_Visible_results);
Ico_PutIconOff ("eye-slash.svg",Ico_RED ,Txt_Hidden_results ); else
Ico_PutIconOff ("eye-slash.svg",Ico_RED ,Txt_Hidden_results );
break;
} }
} }

View File

@ -761,8 +761,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
(unsigned) StartEndTime,UniqueId) < 0) (unsigned) StartEndTime,UniqueId) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
HTM_TD_Begin ("id=\"%s\" class=\"LT DAT_%s %s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT DAT_%s %s\"",
Id,The_GetSuffix (), Id,The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ());
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime], Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK, Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
true,true,false,0x7); true,true,false,0x7);
@ -772,8 +771,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
/* Write match title */ /* Write match title */
HTM_TD_Begin ("class=\"LT DAT_%s %s\"", HTM_TD_Begin ("class=\"LT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ());
HTM_Txt (Match.Title); HTM_Txt (Match.Title);
HTM_TD_End (); HTM_TD_End ();
@ -787,110 +785,137 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
/* Write number of questions */ /* Write number of questions */
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN) {
HTM_Unsigned (Print.NumQsts.All); case Usr_I_CAN:
else HTM_Unsigned (Print.NumQsts.All);
Ico_PutIconNotVisible (); break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
}
HTM_TD_End (); HTM_TD_End ();
/* Write number of non-blank answers */ /* Write number of non-blank answers */
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
if (Print.NumQsts.NotBlank) case Usr_I_CAN:
HTM_Unsigned (Print.NumQsts.NotBlank); if (Print.NumQsts.NotBlank)
else HTM_Unsigned (Print.NumQsts.NotBlank);
HTM_Light0 (); else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write number of blank answers */ /* Write number of blank answers */
HTM_TD_Begin ("class=\"RT DAT_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ());
NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank; NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank;
if (ICanView.Score == Usr_I_CAN) switch (ICanView.Score)
{ {
if (NumQstsBlank) case Usr_I_CAN:
HTM_Unsigned (NumQstsBlank); if (NumQstsBlank)
else HTM_Unsigned (NumQstsBlank);
HTM_Light0 (); else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write score */ /* Write score */
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
HTM_Double2Decimals (Print.Score); case Usr_I_CAN:
HTM_Txt ("/"); HTM_Double2Decimals (Print.Score);
HTM_Unsigned (Print.NumQsts.All); HTM_Txt ("/");
HTM_Unsigned (Print.NumQsts.All);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write average score per question */ /* Write average score per question */
HTM_TD_Begin ("class=\"RT DAT_%s %s\"", HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN) {
HTM_Double2Decimals (Print.NumQsts.All ? Print.Score / case Usr_I_CAN:
(double) Print.NumQsts.All : HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
0.0); (double) Print.NumQsts.All :
else 0.0);
Ico_PutIconNotVisible (); break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
}
HTM_TD_End (); HTM_TD_End ();
/* Write grade over maximum grade */ /* Write grade over maximum grade */
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
The_GetSuffix (), The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
Grade = TstPrn_ComputeGrade (Print.NumQsts.All,Print.Score,Games->Game.MaxGrade); case Usr_I_CAN:
TstPrn_ShowGrade (Grade,Games->Game.MaxGrade); Grade = TstPrn_ComputeGrade (Print.NumQsts.All,Print.Score,
TotalGrade += Grade; Games->Game.MaxGrade);
TstPrn_ShowGrade (Grade,Games->Game.MaxGrade);
TotalGrade += Grade;
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Link to show this result */ /* Link to show this result */
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
The_GetColorRows ()); The_GetColorRows ());
if (ICanView.Result == Usr_I_CAN) switch (ICanView.Result)
{ {
Games->Game.GamCod = Match.GamCod; case Usr_I_CAN:
Games->MchCod = Match.MchCod; Games->Game.GamCod = Match.GamCod;
switch (MeOrOther) Games->MchCod = Match.MchCod;
{ switch (MeOrOther)
case Usr_ME: {
Frm_BeginForm (ActSeeOneMchResMe); case Usr_ME:
Mch_PutParsEdit (Games); Frm_BeginForm (ActSeeOneMchResMe);
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneMchResMe); Mch_PutParsEdit (Games);
break; Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneMchResMe);
case Usr_OTHER: break;
Frm_BeginForm (ActSeeOneMchResOth); case Usr_OTHER:
Mch_PutParsEdit (Games); Frm_BeginForm (ActSeeOneMchResOth);
Usr_PutParOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod); Mch_PutParsEdit (Games);
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneMchResOth); Usr_PutParOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
break; Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneMchResOth);
} break;
Frm_EndForm (); }
Frm_EndForm ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -1071,7 +1096,6 @@ void MchRes_ShowOneMchResult (void)
UsrDat = &Gbl.Usrs.Me.UsrDat; UsrDat = &Gbl.Usrs.Me.UsrDat;
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
UsrDat = &Gbl.Usrs.Other.UsrDat; UsrDat = &Gbl.Usrs.Other.UsrDat;
Usr_GetParOtherUsrCodEncrypted (UsrDat); Usr_GetParOtherUsrCodEncrypted (UsrDat);
break; break;
@ -1201,16 +1225,20 @@ void MchRes_ShowOneMchResult (void)
HTM_TD_Begin ("class=\"LB DAT_%s\"", HTM_TD_Begin ("class=\"LB DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ICanView.Score == Usr_I_CAN) switch (ICanView.Score)
{ {
HTM_STRONG_Begin (); case Usr_I_CAN:
HTM_Double2Decimals (Print.Score); HTM_STRONG_Begin ();
HTM_Txt ("/"); HTM_Double2Decimals (Print.Score);
HTM_Unsigned (Print.NumQsts.All); HTM_Txt ("/");
HTM_STRONG_End (); HTM_Unsigned (Print.NumQsts.All);
HTM_STRONG_End ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -1225,14 +1253,19 @@ void MchRes_ShowOneMchResult (void)
HTM_TD_Begin ("class=\"LB DAT_%s\"", HTM_TD_Begin ("class=\"LB DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ICanView.Score == Usr_I_CAN) switch (ICanView.Score)
{ {
HTM_STRONG_Begin (); case Usr_I_CAN:
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Games.Game.MaxGrade); HTM_STRONG_Begin ();
HTM_STRONG_End (); TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,
Games.Game.MaxGrade);
HTM_STRONG_End ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -1287,12 +1320,18 @@ static void MchRes_CheckIfICanViewMatchResult (const struct Gam_Game *Game,
// Whether I belong or not to groups of match is not checked here... // Whether I belong or not to groups of match is not checked here...
// ...because I should be able to see old matches made in old groups to which I belonged // ...because I should be able to see old matches made in old groups to which I belonged
if (ICanView->Result == Usr_I_CAN) switch (ICanView->Result)
// Depends on 5 visibility icons associated to game {
ICanView->Score = TstVis_IsVisibleTotalScore (Game->Visibility) ? Usr_I_CAN : case Usr_I_CAN:
Usr_I_CAN_NOT; // Depends on 5 visibility icons associated to game
else ICanView->Score = TstVis_IsVisibleTotalScore (Game->Visibility) ? Usr_I_CAN :
ICanView->Score = Usr_I_CAN_NOT; Usr_I_CAN_NOT;
break;
case Usr_I_CAN_NOT:
default:
ICanView->Score = Usr_I_CAN_NOT;
break;
}
break; break;
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:

View File

@ -423,27 +423,29 @@ void Nck_RemoveOtherUsrNick (void)
/***** Get user whose nick must be removed *****/ /***** Get user whose nick must be removed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Get nickname from form *****/ case Usr_I_CAN:
Par_GetParText ("Nick",NickWithoutArr, /***** Get nickname from form *****/
Nck_MAX_BYTES_NICK_WITHOUT_ARROBA); Par_GetParText ("Nick",NickWithoutArr,
Nck_MAX_BYTES_NICK_WITHOUT_ARROBA);
/***** Remove one of the old nicknames *****/ /***** Remove one of the old nicknames *****/
Nck_DB_RemoveNickname (Gbl.Usrs.Other.UsrDat.UsrCod,NickWithoutArr); Nck_DB_RemoveNickname (Gbl.Usrs.Other.UsrDat.UsrCod,NickWithoutArr);
/***** Show message *****/ /***** Show message *****/
Ale_CreateAlert (Ale_SUCCESS,Nck_NICKNAME_SECTION_ID, Ale_CreateAlert (Ale_SUCCESS,Nck_NICKNAME_SECTION_ID,
Txt_Nickname_X_removed, Txt_Nickname_X_removed,
NickWithoutArr); NickWithoutArr);
/***** Show user's account again *****/ /***** Show user's account again *****/
Acc_ShowFormChgOtherUsrAccount (); Acc_ShowFormChgOtherUsrAccount ();
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else // User not found else // User not found
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
@ -469,18 +471,20 @@ void Nck_ChangeOtherUsrNick (void)
{ {
/***** Get user whose nick must be changed *****/ /***** Get user whose nick must be changed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Update user's nickname *****/ case Usr_I_CAN:
Nck_ChangeUsrNick (&Gbl.Usrs.Other.UsrDat); /***** Update user's nickname *****/
Nck_ChangeUsrNick (&Gbl.Usrs.Other.UsrDat);
/***** Show user's account again *****/ /***** Show user's account again *****/
Acc_ShowFormChgOtherUsrAccount (); Acc_ShowFormChgOtherUsrAccount ();
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else // User not found else // User not found
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }

View File

@ -176,13 +176,17 @@ void Pwd_UpdateOtherUsrPwd (void)
{ {
/***** Get other user's code from form and get user's data *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN) {
/***** Check and update password *****/ case Usr_I_CAN:
Pwd_CheckAndUpdateNewPwd (&Gbl.Usrs.Other.UsrDat); /***** Check and update password *****/
else Pwd_CheckAndUpdateNewPwd (&Gbl.Usrs.Other.UsrDat);
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); break;
} case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
}
else // User not found else // User not found
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }

View File

@ -198,7 +198,6 @@ void Pho_PutIconToChangeUsrPhoto (struct Usr_Data *UsrDat)
"camera.svg",Ico_BLACK); "camera.svg",Ico_BLACK);
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
if (Pho_ICanChangeOtherUsrPhoto (UsrDat) == Usr_I_CAN) if (Pho_ICanChangeOtherUsrPhoto (UsrDat) == Usr_I_CAN)
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL, Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
@ -318,7 +317,6 @@ static void Pho_ReqPhoto (const struct Usr_Data *UsrDat)
Frm_BeginForm (ActDetMyPho); Frm_BeginForm (ActDetMyPho);
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
Frm_BeginForm (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs]); Frm_BeginForm (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs]);
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod); Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
break; break;
@ -368,7 +366,6 @@ void Pho_SendPhotoUsr (void)
Pho_ReqMyPhoto (); Pho_ReqMyPhoto ();
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
/***** Form to send another user's photo *****/ /***** Form to send another user's photo *****/
Pho_ReqOtherUsrPhoto (); Pho_ReqOtherUsrPhoto ();
break; break;
@ -521,32 +518,34 @@ void Pho_ReqRemUsrPhoto (void)
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat, if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CRS)) Usr_DONT_GET_ROLE_IN_CRS))
{ switch (Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat))
if (Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
{ {
/***** Show current photo and help message *****/ case Usr_I_CAN:
if (Pho_BuildLinkToPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL)) /***** Show current photo and help message *****/
{ if (Pho_BuildLinkToPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL))
/***** Show question and button to remove user's photo *****/ {
/* Begin alert */ /***** Show question and button to remove user's photo *****/
Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_photo_of_X, /* Begin alert */
Gbl.Usrs.Other.UsrDat.FullName); Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_photo_of_X,
Gbl.Usrs.Other.UsrDat.FullName);
/* Show current photo */ /* Show current photo */
Pho_ShowUsrPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL, Pho_ShowUsrPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL,
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_NO_ZOOM); ClassPhoto[Gbl.Prefs.PhotoShape],Pho_NO_ZOOM);
/* End alert */ /* End alert */
Ale_ShowAlertAndButtonEnd (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs],NULL,NULL, Ale_ShowAlertAndButtonEnd (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs],NULL,NULL,
Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod, Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
Btn_REMOVE_BUTTON,Txt_Remove); Btn_REMOVE_BUTTON,Txt_Remove);
} }
else else
Ale_ShowAlert (Ale_INFO,Txt_The_photo_no_longer_exists); Ale_ShowAlert (Ale_INFO,Txt_The_photo_no_longer_exists);
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();

View File

@ -3050,34 +3050,36 @@ static void Prj_ReqRemUsrFromPrj (struct Prj_Projects *Projects,
/***** Get user to be removed *****/ /***** Get user to be removed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Prj_CheckIfICanEditProject (&Projects->Prj))
if (Prj_CheckIfICanEditProject (&Projects->Prj) == Usr_I_CAN)
{ {
/***** Show question and button to remove user as a role from project *****/ case Usr_I_CAN:
/* Begin alert */ /***** Show question and button to remove user as a role from project *****/
Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Question[Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)], /* Begin alert */
Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex], Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Question[Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)],
Projects->Prj.Title); Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex],
Projects->Prj.Title);
/* Show user's record */ /* Show user's record */
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
/* Show form to request confirmation */ /* Show form to request confirmation */
Frm_BeginForm (ActionRemUsr[RoleInPrj]); Frm_BeginForm (ActionRemUsr[RoleInPrj]);
Prj_PutCurrentPars (Projects); Prj_PutCurrentPars (Projects);
if (asprintf (&TxtButton,Txt_Remove_USER_from_this_project, if (asprintf (&TxtButton,Txt_Remove_USER_from_this_project,
Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex]) < 0) Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex]) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
Btn_PutRemoveButton (TxtButton); Btn_PutRemoveButton (TxtButton);
free (TxtButton); free (TxtButton);
Frm_EndForm (); Frm_EndForm ();
/* End alert */ /* End alert */
Ale_ShowAlertAndButtonEnd (ActUnk,NULL,NULL,NULL,NULL,Btn_NO_BUTTON,NULL); Ale_ShowAlertAndButtonEnd (ActUnk,NULL,NULL,NULL,NULL,Btn_NO_BUTTON,NULL);
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
@ -3128,25 +3130,27 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInPrj)
/***** Get user to be removed *****/ /***** Get user to be removed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ switch (Prj_CheckIfICanEditProject (&Projects.Prj))
if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN)
{ {
/***** Remove user from the table of project-users *****/ case Usr_I_CAN:
Prj_DB_RemoveUsrFromPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod); /***** Remove user from the table of project-users *****/
Prj_DB_RemoveUsrFromPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Flush cache *****/ /***** Flush cache *****/
if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME) if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME)
Prj_FlushCacheMyRolesInProject (); Prj_FlushCacheMyRolesInProject ();
/***** Show success alert *****/ /***** Show success alert *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_removed_as_a_Y_from_the_project_Z, Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_removed_as_a_Y_from_the_project_Z,
Gbl.Usrs.Other.UsrDat.FullName, Gbl.Usrs.Other.UsrDat.FullName,
Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex], Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex],
Projects.Prj.Title); Projects.Prj.Title);
break;
case Usr_I_CAN_NOT:
default:
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
break;
} }
else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
}
else else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
@ -3208,17 +3212,21 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutCurrentPars,Projects); Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutCurrentPars,Projects);
/***** Locked/unlocked project edition *****/ /***** Locked/unlocked project edition *****/
if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN) switch (PrjCfg_CheckIfICanConfig ())
{ {
/* Icon to lock/unlock project edition */ case Usr_I_CAN:
HTM_DIV_Begin ("id=\"prj_lck_%ld\" class=\"PRJ_LOCK\"", /* Icon to lock/unlock project edition */
Projects->Prj.PrjCod); HTM_DIV_Begin ("id=\"prj_lck_%ld\" class=\"PRJ_LOCK\"",
Prj_FormLockUnlock (&Projects->Prj); Projects->Prj.PrjCod);
HTM_DIV_End (); Prj_FormLockUnlock (&Projects->Prj);
HTM_DIV_End ();
break;
case Usr_I_CAN_NOT:
default:
/* Icon to inform about locked/unlocked project edition */
Prj_PutIconOffLockedUnlocked (&Projects->Prj);
break;
} }
else
/* Icon to inform about locked/unlocked project edition */
Prj_PutIconOffLockedUnlocked (&Projects->Prj);
/***** Link to get resource link *****/ /***** Link to get resource link *****/
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN) if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
@ -4680,10 +4688,16 @@ void Prj_ChangeCriterionScore (void)
Err_WrongRubricExit (); Err_WrongRubricExit ();
/***** Update review *****/ /***** Update review *****/
if (Prj_CheckIfICanFillRubric (Prj.PrjCod,WhichRubric) == Usr_I_CAN) switch (Prj_CheckIfICanFillRubric (Prj.PrjCod,WhichRubric))
Rub_DB_UpdateScore (Rsc_PROJECT,Prj.PrjCod,-1L,CriCod,Score); {
else case Usr_I_CAN:
Err_NoPermission (); Rub_DB_UpdateScore (Rsc_PROJECT,Prj.PrjCod,-1L,CriCod,Score);
break;
case Usr_I_CAN_NOT:
default:
Err_NoPermission ();
break;
}
/***** Free memory of the project *****/ /***** Free memory of the project *****/
Prj_FreeMemProject (&Prj); Prj_FreeMemProject (&Prj);

View File

@ -1733,29 +1733,31 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT_STRONG_%s %s\"", HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT_STRONG_%s %s\"",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (ICanEditThisField == Usr_I_CAN) // Show with form switch (ICanEditThisField)
{ {
HTM_TEXTAREA_Begin ("name=\"Field%ld\" rows=\"%u\"" case Usr_I_CAN: // Show with form
" class=\"REC_C2_BOT_INPUT INPUT_%s\"", HTM_TEXTAREA_Begin ("name=\"Field%ld\" rows=\"%u\""
Gbl.Crs.Records.LstFields.Lst[NumField].FieldCod, " class=\"REC_C2_BOT_INPUT INPUT_%s\"",
Gbl.Crs.Records.LstFields.Lst[NumField].NumLines, Gbl.Crs.Records.LstFields.Lst[NumField].FieldCod,
The_GetSuffix ()); Gbl.Crs.Records.LstFields.Lst[NumField].NumLines,
The_GetSuffix ());
if (ThisFieldHasText)
HTM_Txt (row[0]);
HTM_TEXTAREA_End ();
break;
case Usr_I_CAN_NOT: // Show without form
default:
if (ThisFieldHasText) if (ThisFieldHasText)
HTM_Txt (row[0]); {
HTM_TEXTAREA_End (); Str_Copy (Text,row[0],sizeof (Text));
} Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
else // Show without form Text,Cns_MAX_BYTES_TEXT,
{ Str_DONT_REMOVE_SPACES);
if (ThisFieldHasText) HTM_Txt (Text);
{ }
Str_Copy (Text,row[0],sizeof (Text)); else
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, HTM_Hyphen ();
Text,Cns_MAX_BYTES_TEXT, break;
Str_DONT_REMOVE_SPACES);
HTM_Txt (Text);
}
else
HTM_Hyphen ();
} }
HTM_TD_End (); HTM_TD_End ();
@ -1767,17 +1769,21 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
} }
/***** End box *****/ /***** End box *****/
if (ICanEdit == Usr_I_CAN) switch (ICanEdit)
{ {
/* End table, send button and end box */ case Usr_I_CAN:
Box_BoxTableWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes); /* End table, send button and end box */
Box_BoxTableWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes);
/* End form */ /* End form */
Frm_EndForm (); Frm_EndForm ();
break;
case Usr_I_CAN_NOT:
default:
/* End table and box */
Box_BoxTableEnd ();
break;
} }
else
/* End table and box */
Box_BoxTableEnd ();
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2254,7 +2260,6 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
Grp_ShowLstGrpsToChgMyGrps (); Grp_ShowLstGrpsToChgMyGrps ();
break; break;
case Usr_OTHER: case Usr_OTHER:
default:
Grp_ShowLstGrpsToChgOtherUsrsGrps (UsrDat->UsrCod); Grp_ShowLstGrpsToChgOtherUsrsGrps (UsrDat->UsrCod);
break; break;
} }
@ -2679,20 +2684,21 @@ static void Rec_ShowEmail (struct Usr_Data *UsrDat)
Frm_LabelColumn ("REC_C1_BOT RM",NULL,Txt_Email); Frm_LabelColumn ("REC_C1_BOT RM",NULL,Txt_Email);
/* Data */ /* Data */
HTM_TD_Begin ("class=\"REC_C2_BOT LM DAT_STRONG_%s\"", HTM_TD_Begin ("class=\"REC_C2_BOT LM DAT_STRONG_%s\"",The_GetSuffix ());
The_GetSuffix ());
if (UsrDat->Email[0]) if (UsrDat->Email[0])
{ switch (Mai_ICanSeeOtherUsrEmail (UsrDat))
if (Mai_ICanSeeOtherUsrEmail (UsrDat) == Usr_I_CAN)
{ {
HTM_A_Begin ("href=\"mailto:%s\" class=\"DAT_STRONG_%s\"", case Usr_I_CAN:
UsrDat->Email,The_GetSuffix ()); HTM_A_Begin ("href=\"mailto:%s\" class=\"DAT_STRONG_%s\"",
HTM_Txt (UsrDat->Email); UsrDat->Email,The_GetSuffix ());
HTM_A_End (); HTM_Txt (UsrDat->Email);
HTM_A_End ();
break;
case Usr_I_CAN_NOT:
default:
HTM_Txt ("********");
break;
} }
else
HTM_Txt ("********");
}
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();

View File

@ -246,6 +246,7 @@ Usr_ICan_t Rub_CheckIfICanEditRubrics (void)
bool Rub_CheckIfEditable (void) bool Rub_CheckIfEditable (void)
{ {
if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN) if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN)
{
/***** Rubric is editable only if ... *****/ /***** Rubric is editable only if ... *****/
// TODO: Change to control that a rubric is not edited in some circunstances? // TODO: Change to control that a rubric is not edited in some circunstances?
/* /*
@ -253,8 +254,9 @@ bool Rub_CheckIfEditable (void)
Rubric->NumCriteria != 0; Rubric->NumCriteria != 0;
*/ */
return true; return true;
else }
return false; // Questions are not editable
return false; // Questions are not editable
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -60,8 +60,8 @@
struct TstRes_ICanView struct TstRes_ICanView
{ {
bool Result; Usr_ICan_t Result;
bool Score; Usr_ICan_t Score;
}; };
/*****************************************************************************/ /*****************************************************************************/
@ -680,8 +680,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
/* Write score retrieved from database */ /* Write score retrieved from database */
if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE] == Usr_I_CAN) if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE] == Usr_I_CAN)
{ {
HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"", HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"",The_GetSuffix ());
The_GetSuffix ());
HTM_TxtColonNBSP (Txt_Score); HTM_TxtColonNBSP (Txt_Score);
HTM_SPAN_Begin ("class=\"%s_%s\"", HTM_SPAN_Begin ("class=\"%s_%s\"",
PrintedQuestions[QstInd].StrAnswers[0] ? PrintedQuestions[QstInd].StrAnswers[0] ?
@ -1239,8 +1238,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
} }
else else
{ {
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"", HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
The_GetSuffix ());
HTM_Txt ("?"); HTM_Txt ("?");
HTM_TD_End (); HTM_TD_End ();
} }
@ -1250,10 +1248,16 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
/***** Write the correct answer *****/ /***** Write the correct answer *****/
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
HTM_Long (Question->Answer.Integer); {
else case Usr_I_CAN:
Ico_PutIconNotVisible (); HTM_Long (Question->Answer.Integer);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
}
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -1308,16 +1312,20 @@ static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
/***** Write the correct answer *****/ /***** Write the correct answer *****/
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
{ {
HTM_Txt ("["); case Usr_I_CAN:
HTM_Double (Question->Answer.FloatingPoint[0]); HTM_Txt ("[");
HTM_Txt ("; "); HTM_Double (Question->Answer.FloatingPoint[0]);
HTM_Double (Question->Answer.FloatingPoint[1]); HTM_Txt ("; ");
HTM_Txt ("]"); HTM_Double (Question->Answer.FloatingPoint[1]);
HTM_Txt ("]");
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -1366,10 +1374,16 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
/***** Write the correct answer *****/ /***** Write the correct answer *****/
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ()); HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
Qst_WriteAnsTF (Question->Answer.TF); {
else case Usr_I_CAN:
Ico_PutIconNotVisible (); Qst_WriteAnsTF (Question->Answer.TF);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
}
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -1430,25 +1444,26 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
/* Draw icon depending on user's answer */ /* Draw icon depending on user's answer */
if (UsrAnswers[Indexes[NumOpt]]) // This answer has been selected by the user if (UsrAnswers[Indexes[NumOpt]]) // This answer has been selected by the user
{ {
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
{ {
if (Question->Answer.Options[Indexes[NumOpt]].Correct) case Usr_I_CAN:
{ if (Question->Answer.Options[Indexes[NumOpt]].Correct)
Ans.Class = "Qst_ANS_OK"; // Correct {
Ans.Str = "&check;"; Ans.Class = "Qst_ANS_OK"; // Correct
} Ans.Str = "&check;";
else }
{ else
Ans.Class = "Qst_ANS_BAD"; // Wrong {
Ans.Str = "&cross;"; Ans.Class = "Qst_ANS_BAD"; // Wrong
} Ans.Str = "&cross;";
}
break;
case Usr_I_CAN_NOT:
default:
Ans.Class = "Qst_ANS_0"; // Blank answer
Ans.Str = "&bull;";
break;
} }
else
{
Ans.Class = "Qst_ANS_0"; // Blank answer
Ans.Str = "&bull;";
}
HTM_TD_Begin ("class=\"CT %s_%s\" title=\"%s\"", HTM_TD_Begin ("class=\"CT %s_%s\" title=\"%s\"",
Ans.Class,The_GetSuffix (), Ans.Class,The_GetSuffix (),
Txt_TST_Answer_given_by_the_user); Txt_TST_Answer_given_by_the_user);
@ -1459,47 +1474,50 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
HTM_TD_Empty (1); HTM_TD_Empty (1);
/* Draw icon that indicates whether the answer is correct */ /* Draw icon that indicates whether the answer is correct */
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
{ {
if (Question->Answer.Options[Indexes[NumOpt]].Correct) case Usr_I_CAN:
{ if (Question->Answer.Options[Indexes[NumOpt]].Correct)
HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\" title=\"%s\"", {
The_GetSuffix (), HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\" title=\"%s\"",
Txt_TST_Answer_given_by_the_teachers); The_GetSuffix (),
HTM_Txt ("&bull;"); Txt_TST_Answer_given_by_the_teachers);
HTM_Txt ("&bull;");
HTM_TD_End ();
}
else
HTM_TD_Empty (1);
break;
case Usr_I_CAN_NOT:
default:
HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\"",The_GetSuffix ());
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
} break;
else
HTM_TD_Empty (1);
}
else
{
HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\"",
The_GetSuffix ());
Ico_PutIconNotVisible ();
HTM_TD_End ();
} }
/* Answer letter (a, b, c,...) */ /* Answer letter (a, b, c,...) */
HTM_TD_Begin ("class=\"LT %s_%s\"", HTM_TD_Begin ("class=\"LT %s_%s\"",ClassTxt,The_GetSuffix ());
ClassTxt,The_GetSuffix ());
HTM_TxtF ("%c)&nbsp;",'a' + (char) NumOpt); HTM_TxtF ("%c)&nbsp;",'a' + (char) NumOpt);
HTM_TD_End (); HTM_TD_End ();
/* Answer text and feedback */ /* Answer text and feedback */
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
HTM_DIV_Begin ("class=\"%s_%s\"", HTM_DIV_Begin ("class=\"%s_%s\"",ClassTxt,The_GetSuffix ());
ClassTxt,The_GetSuffix ()); switch (ICanView[TstVis_VISIBLE_QST_ANS_TXT])
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN)
{ {
HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text); case Usr_I_CAN:
Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media, HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text);
"Tst_MED_SHOW_CONT", Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media,
"Tst_MED_SHOW"); "Tst_MED_SHOW_CONT",
"Tst_MED_SHOW");
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_DIV_End (); HTM_DIV_End ();
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
@ -1593,55 +1611,57 @@ static void TstPrn_WriteTxtAnsPrint (struct Usr_Data *UsrDat,
HTM_TD_Empty (1); HTM_TD_Empty (1);
/***** Write the correct answers *****/ /***** Write the correct answers *****/
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN) switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
{ {
HTM_TD_Begin ("class=\"CT\""); case Usr_I_CAN:
HTM_TABLE_BeginPadding (2); HTM_TD_Begin ("class=\"CT\"");
HTM_TABLE_BeginPadding (2);
for (NumOpt = 0; for (NumOpt = 0;
NumOpt < Question->Answer.NumOptions; NumOpt < Question->Answer.NumOptions;
NumOpt++) NumOpt++)
{ {
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/* Answer letter (a, b, c,...) */ /* Answer letter (a, b, c,...) */
HTM_TD_Begin ("class=\"LT Qst_ANS_0_%s\"", HTM_TD_Begin ("class=\"LT Qst_ANS_0_%s\"",
The_GetSuffix ()); The_GetSuffix ());
HTM_TxtF ("%c)&nbsp;",'a' + (char) NumOpt); HTM_TxtF ("%c)&nbsp;",'a' + (char) NumOpt);
HTM_TD_End (); HTM_TD_End ();
/* Answer text and feedback */ /* Answer text and feedback */
HTM_TD_Begin ("class=\"LT\""); HTM_TD_Begin ("class=\"LT\"");
HTM_DIV_Begin ("class=\"Qst_ANS_0_%s\"", HTM_DIV_Begin ("class=\"Qst_ANS_0_%s\"",
The_GetSuffix ()); The_GetSuffix ());
HTM_Txt (Question->Answer.Options[NumOpt].Text); HTM_Txt (Question->Answer.Options[NumOpt].Text);
HTM_DIV_End (); HTM_DIV_End ();
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN) if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
if (Question->Answer.Options[NumOpt].Feedback) if (Question->Answer.Options[NumOpt].Feedback)
if (Question->Answer.Options[NumOpt].Feedback[0]) if (Question->Answer.Options[NumOpt].Feedback[0])
{ {
HTM_DIV_Begin ("class=\"Qst_TXT_LIGHT\""); HTM_DIV_Begin ("class=\"Qst_TXT_LIGHT\"");
HTM_Txt (Question->Answer.Options[NumOpt].Feedback); HTM_Txt (Question->Answer.Options[NumOpt].Feedback);
HTM_DIV_End (); HTM_DIV_End ();
} }
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
} }
HTM_TABLE_End (); HTM_TABLE_End ();
HTM_TD_End (); HTM_TD_End ();
} break;
else case Usr_I_CAN_NOT:
{ default:
HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\"", HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\"",The_GetSuffix ());
The_GetSuffix ()); Ico_PutIconNotVisible ();
Ico_PutIconNotVisible (); HTM_TD_End ();
HTM_TD_End (); break;
} }
HTM_TR_End (); HTM_TR_End ();
HTM_TABLE_End (); HTM_TABLE_End ();
@ -1914,8 +1934,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
if (asprintf (&Id,"tst_date_%u_%u",(unsigned) StartEndTime,UniqueId) < 0) if (asprintf (&Id,"tst_date_%u_%u",(unsigned) StartEndTime,UniqueId) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"", HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
Id,ClassDat,The_GetSuffix (), Id,ClassDat,The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ());
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime], Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK, Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
true,true,false,0x7); true,true,false,0x7);
@ -1933,96 +1952,124 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
/* Write number of questions */ /* Write number of questions */
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Result)
if (ICanView.Result == Usr_I_CAN) {
HTM_Unsigned (Print.NumQsts.All); case Usr_I_CAN:
else HTM_Unsigned (Print.NumQsts.All);
Ico_PutIconNotVisible (); break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
}
HTM_TD_End (); HTM_TD_End ();
/* Write number of non-blank answers */ /* Write number of non-blank answers */
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Result)
if (ICanView.Result == Usr_I_CAN)
{ {
if (Print.NumQsts.NotBlank) case Usr_I_CAN:
HTM_Unsigned (Print.NumQsts.NotBlank); if (Print.NumQsts.NotBlank)
else HTM_Unsigned (Print.NumQsts.NotBlank);
HTM_Light0 (); else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write number of blank answers */ /* Write number of blank answers */
HTM_TD_Begin ("class=\"RT %s_%s %s\"", HTM_TD_Begin ("class=\"RT %s_%s %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Result)
if (ICanView.Result == Usr_I_CAN)
{ {
NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank; case Usr_I_CAN:
if (NumQstsBlank) NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank;
HTM_Unsigned (NumQstsBlank); if (NumQstsBlank)
else HTM_Unsigned (NumQstsBlank);
HTM_Light0 (); else
HTM_Light0 ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write score */ /* Write score */
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN)
{ {
HTM_Double2Decimals (Print.Score); case Usr_I_CAN:
HTM_Txt ("/"); HTM_Double2Decimals (Print.Score);
HTM_Unsigned (Print.NumQsts.All); HTM_Txt ("/");
HTM_Unsigned (Print.NumQsts.All);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
/* Write average score per question */ /* Write average score per question */
HTM_TD_Begin ("class=\"RT %s_%s %s\"", HTM_TD_Begin ("class=\"RT %s_%s %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN) {
HTM_Double2Decimals (Print.NumQsts.All ? Print.Score / case Usr_I_CAN:
(double) Print.NumQsts.All : HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
0.0); (double) Print.NumQsts.All :
else 0.0);
Ico_PutIconNotVisible (); break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
}
HTM_TD_End (); HTM_TD_End ();
/* Write grade */ /* Write grade */
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
ClassDat,The_GetSuffix (), ClassDat,The_GetSuffix (),The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Score)
if (ICanView.Score == Usr_I_CAN) {
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX); case Usr_I_CAN:
else TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,
Ico_PutIconNotVisible (); Tst_SCORE_MAX);
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
}
HTM_TD_End (); HTM_TD_End ();
/* Link to show this test */ /* Link to show this test */
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"", HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",The_GetColorRows ());
The_GetColorRows ()); switch (ICanView.Result)
if (ICanView.Result == Usr_I_CAN)
{ {
Frm_BeginForm (Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe : case Usr_I_CAN:
ActSeeOneTstResOth); Frm_BeginForm (Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe :
ParCod_PutPar (ParCod_Prn,Print.PrnCod); ActSeeOneTstResOth);
Ico_PutIconLink ("tasks.svg",Ico_BLACK, ParCod_PutPar (ParCod_Prn,Print.PrnCod);
Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe : Ico_PutIconLink ("tasks.svg",Ico_BLACK,
ActSeeOneTstResOth); Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe :
Frm_EndForm (); ActSeeOneTstResOth);
Frm_EndForm ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -2339,16 +2386,20 @@ void TstPrn_ShowOnePrint (void)
HTM_TD_Begin ("class=\"LB DAT_%s\"", HTM_TD_Begin ("class=\"LB DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ICanView.Score == Usr_I_CAN) switch (ICanView.Score)
{ {
HTM_STRONG_Begin (); case Usr_I_CAN:
HTM_Double2Decimals (Print.Score); HTM_STRONG_Begin ();
HTM_Txt ("/"); HTM_Double2Decimals (Print.Score);
HTM_Unsigned (Print.NumQsts.All); HTM_Txt ("/");
HTM_STRONG_End (); HTM_Unsigned (Print.NumQsts.All);
HTM_STRONG_End ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -2363,14 +2414,19 @@ void TstPrn_ShowOnePrint (void)
HTM_TD_Begin ("class=\"LB DAT_%s\"", HTM_TD_Begin ("class=\"LB DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ICanView.Score == Usr_I_CAN) switch (ICanView.Score)
{ {
HTM_STRONG_Begin (); case Usr_I_CAN:
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX); HTM_STRONG_Begin ();
HTM_STRONG_End (); TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,
Tst_SCORE_MAX);
HTM_STRONG_End ();
break;
case Usr_I_CAN_NOT:
default:
Ico_PutIconNotVisible ();
break;
} }
else
Ico_PutIconNotVisible ();
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -2420,12 +2476,18 @@ static void TstRes_CheckIfICanSeePrintResult (const struct TstPrn_Print *Print,
// if the print is not sent ==> I can not view results // if the print is not sent ==> I can not view results
ICanView->Result = (Print->Sent && Usr_ItsMe (UsrCod) == Usr_ME) ? Usr_I_CAN : ICanView->Result = (Print->Sent && Usr_ItsMe (UsrCod) == Usr_ME) ? Usr_I_CAN :
Usr_I_CAN_NOT; Usr_I_CAN_NOT;
if (ICanView->Result == Usr_I_CAN) switch (ICanView->Result)
// Depends on 5 visibility icons associated to tests {
ICanView->Score = TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ()) ? Usr_I_CAN : case Usr_I_CAN:
Usr_I_CAN_NOT; // Depends on 5 visibility icons associated to tests
else ICanView->Score = TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ()) ? Usr_I_CAN :
ICanView->Score = Usr_I_CAN_NOT; Usr_I_CAN_NOT;
break;
case Usr_I_CAN_NOT:
default:
ICanView->Score = Usr_I_CAN_NOT;
break;
}
break; break;
case Rol_NET: case Rol_NET:
case Rol_TCH: case Rol_TCH:

View File

@ -298,7 +298,6 @@ void TmlUsr_PutIconFavSha (TmlUsr_FavSha_t FavSha,
TmlUsr_PutDisabledIconFavSha (FavSha,NumUsrs); TmlUsr_PutDisabledIconFavSha (FavSha,NumUsrs);
break; break;
case Usr_OTHER: // I am not the author case Usr_OTHER: // I am not the author
default:
TmlFrm_PutFormToFavUnfShaUns (FavSha,Cod); TmlFrm_PutFormToFavUnfShaUns (FavSha,Cod);
break; break;
} }