mirror of https://github.com/acanas/swad-core.git
Version 23.73: Apr 06, 2024 Code refactoring related to new type Usr_ICan_t.
This commit is contained in:
parent
b44376b118
commit
d6df495d93
30
swad_API.c
30
swad_API.c
|
@ -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
317
swad_ID.c
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
114
swad_admin.c
114
swad_admin.c
|
@ -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 ();
|
||||||
|
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 *****/
|
||||||
|
|
2435
swad_browser.c
2435
swad_browser.c
File diff suppressed because it is too large
Load Diff
|
@ -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 *****/
|
||||||
|
|
108
swad_center.c
108
swad_center.c
|
@ -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 ();
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
106
swad_degree.c
106
swad_degree.c
|
@ -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 ();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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): %u; "
|
{
|
||||||
"%s(-1≤<em>p<sub>i</sub></em><0): %u; "
|
case Usr_I_CAN:
|
||||||
"%s(<em>p<sub>i</sub></em>=0): %u; "
|
HTM_TxtF ("%s(<em>p<sub>i</sub></em>=1): %u; "
|
||||||
"%s(0<<em>p<sub>i</sub></em><1): %u; "
|
"%s(-1≤<em>p<sub>i</sub></em><0): %u; "
|
||||||
"%s(<em>p<sub>i</sub></em>=0): %u",
|
"%s(<em>p<sub>i</sub></em>=0): %u; "
|
||||||
Txt_ANSWERS_correct,Print->NumQsts.Valid.Correct,
|
"%s(0<<em>p<sub>i</sub></em><1): %u; "
|
||||||
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Negative,
|
"%s(<em>p<sub>i</sub></em>=0): %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 *****/
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
52
swad_forum.c
52
swad_forum.c
|
@ -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 *****/
|
||||||
|
|
40
swad_game.c
40
swad_game.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
216
swad_group.c
216
swad_group.c
|
@ -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);
|
||||||
|
|
||||||
|
|
140
swad_info.c
140
swad_info.c
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
||||||
|
|
148
swad_mail.c
148
swad_mail.c
|
@ -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 ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
58
swad_match.c
58
swad_match.c
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
49
swad_photo.c
49
swad_photo.c
|
@ -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 ();
|
||||||
|
|
||||||
|
|
116
swad_project.c
116
swad_project.c
|
@ -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);
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -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 = "✓";
|
Ans.Class = "Qst_ANS_OK"; // Correct
|
||||||
}
|
Ans.Str = "✓";
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
Ans.Class = "Qst_ANS_BAD"; // Wrong
|
{
|
||||||
Ans.Str = "✗";
|
Ans.Class = "Qst_ANS_BAD"; // Wrong
|
||||||
}
|
Ans.Str = "✗";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Usr_I_CAN_NOT:
|
||||||
|
default:
|
||||||
|
Ans.Class = "Qst_ANS_0"; // Blank answer
|
||||||
|
Ans.Str = "•";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
Ans.Class = "Qst_ANS_0"; // Blank answer
|
|
||||||
Ans.Str = "•";
|
|
||||||
}
|
|
||||||
|
|
||||||
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 ("•");
|
Txt_TST_Answer_given_by_the_teachers);
|
||||||
|
HTM_Txt ("•");
|
||||||
|
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) ",'a' + (char) NumOpt);
|
HTM_TxtF ("%c) ",'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) ",'a' + (char) NumOpt);
|
HTM_TxtF ("%c) ",'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:
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue