mirror of https://github.com/acanas/swad-core.git
Compare commits
3 Commits
7c794da888
...
c9a75eb0ad
Author | SHA1 | Date |
---|---|---|
acanas | c9a75eb0ad | |
acanas | d6df495d93 | |
acanas | b44376b118 |
11
Makefile
11
Makefile
|
@ -37,11 +37,12 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_action_list.o \
|
|||
swad_building.o swad_building_database.o swad_button.o \
|
||||
swad_calendar.o swad_call_for_exam.o swad_call_for_exam_resource.o \
|
||||
swad_call_for_exam_database.o swad_center.o swad_center_config.o \
|
||||
swad_center_database.o swad_chat.o swad_chat_database.o swad_config.o \
|
||||
swad_connected.o swad_connected_database.o swad_constant.o \
|
||||
swad_cookie.o swad_cookie_database.o swad_country.o \
|
||||
swad_country_config.o swad_country_database.o swad_course.o \
|
||||
swad_course_config.o swad_course_database.o swad_cryptography.o \
|
||||
swad_center_database.o swad_chat.o swad_chat_database.o \
|
||||
swad_closed_open.o swad_config.o swad_connected.o \
|
||||
swad_connected_database.o swad_constant.o swad_cookie.o \
|
||||
swad_cookie_database.o swad_country.o swad_country_config.o \
|
||||
swad_country_database.o swad_course.o swad_course_config.o \
|
||||
swad_course_database.o swad_cryptography.o \
|
||||
swad_database.o swad_date.o swad_degree.o swad_degree_config.o \
|
||||
swad_degree_database.o swad_degree_type.o swad_department.o \
|
||||
swad_department_database.o swad_duplicate.o swad_duplicate_database.o \
|
||||
|
|
34
swad_API.c
34
swad_API.c
|
@ -2351,8 +2351,8 @@ int swad__getAttendanceEvents (struct soap *soap,
|
|||
|
||||
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].startTime = (int) Event.TimeUTC[Dat_STR_TIME];
|
||||
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].endTime = (int) Event.TimeUTC[Dat_END_TIME];
|
||||
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].commentsTeachersVisible = Event.Open ? 1 :
|
||||
0;
|
||||
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].commentsTeachersVisible = Event.Open == CloOpe_OPEN ? 1 :
|
||||
0;
|
||||
Length = strlen (Event.Title);
|
||||
getAttendanceEventsOut->eventsArray.__ptr[NumAttEvent].title =
|
||||
soap_malloc (soap,Length + 1);
|
||||
|
@ -5261,21 +5261,23 @@ int swad__getLastLocation (struct soap *soap,
|
|||
The other user does not have to share any course with me,
|
||||
but at least some course of each one has to share center.
|
||||
*/
|
||||
if (Roo_DB_CheckIfICanSeeUsrLocation ((long) userCode) == Usr_I_CAN)
|
||||
switch (Roo_DB_CheckIfICanSeeUsrLocation ((long) userCode))
|
||||
{
|
||||
/***** Get list of locations *****/
|
||||
NumLocs = Roo_DB_GetUsrLastLocation (&mysql_res,(long) userCode);
|
||||
API_GetLocationData (soap,
|
||||
&(getLastLocationOut->location),
|
||||
&(getLastLocationOut->checkinTime), // Get check in time
|
||||
&mysql_res,NumLocs);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* I can not see user's location ==> reset output */
|
||||
API_ResetLocation (soap, &(getLastLocationOut->location));
|
||||
getLastLocationOut->checkinTime = 0L;
|
||||
}
|
||||
case Usr_I_CAN:
|
||||
/***** Get list of locations *****/
|
||||
NumLocs = Roo_DB_GetUsrLastLocation (&mysql_res,(long) userCode);
|
||||
API_GetLocationData (soap,
|
||||
&(getLastLocationOut->location),
|
||||
&(getLastLocationOut->checkinTime), // Get check in time
|
||||
&mysql_res,NumLocs);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
/* I can not see user's location ==> reset output */
|
||||
API_ResetLocation (soap, &(getLastLocationOut->location));
|
||||
getLastLocationOut->checkinTime = 0L;
|
||||
break;
|
||||
}
|
||||
|
||||
return SOAP_OK;
|
||||
}
|
||||
|
|
333
swad_ID.c
333
swad_ID.c
|
@ -308,11 +308,12 @@ static bool ID_CheckIfUsrIDIsValidUsingMinDigits (const char *UsrID,unsigned Min
|
|||
void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor)
|
||||
{
|
||||
unsigned NumID;
|
||||
bool ICanSeeUsrID = (ID_ICanSeeOtherUsrIDs (UsrDat) == Usr_I_CAN);
|
||||
bool ICanConfirmUsrID = ICanSeeUsrID &&
|
||||
Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER && // Not me
|
||||
!Frm_CheckIfInside () && // Not inside another form
|
||||
Act_GetBrowserTab (Gbl.Action.Act) == Act_1ST_TAB; // Only in main browser tab
|
||||
Usr_ICan_t ICanSeeUsrID = ID_ICanSeeOtherUsrIDs (UsrDat);
|
||||
Usr_ICan_t ICanConfirmUsrID = (ICanSeeUsrID == Usr_I_CAN &&
|
||||
Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER && // Not me
|
||||
!Frm_CheckIfInside () && // Not inside another form
|
||||
Act_GetBrowserTab (Gbl.Action.Act) == Act_1ST_TAB) ? Usr_I_CAN : // Only in main browser tab
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
for (NumID = 0;
|
||||
NumID < UsrDat->IDs.Num;
|
||||
|
@ -327,14 +328,21 @@ void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor)
|
|||
UsrDat->IDs.List[NumID].Confirmed ? "USR_ID_C" :
|
||||
"USR_ID_NC",
|
||||
The_GetSuffix ());
|
||||
if (ICanSeeUsrID)
|
||||
HTM_Txt (UsrDat->IDs.List[NumID].ID);
|
||||
else
|
||||
HTM_Txt ("********");
|
||||
switch (ICanSeeUsrID)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
HTM_Txt (UsrDat->IDs.List[NumID].ID);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
HTM_Txt ("********");
|
||||
break;
|
||||
}
|
||||
HTM_SPAN_End ();
|
||||
|
||||
/* Put link to confirm ID? */
|
||||
if (ICanConfirmUsrID && !UsrDat->IDs.List[NumID].Confirmed)
|
||||
if (ICanConfirmUsrID == Usr_I_CAN &&
|
||||
!UsrDat->IDs.List[NumID].Confirmed)
|
||||
ID_PutLinkToConfirmID (UsrDat,NumID,Anchor);
|
||||
}
|
||||
}
|
||||
|
@ -690,22 +698,24 @@ void ID_RemoveOtherUsrID (void)
|
|||
{
|
||||
/***** Get other user's code from form and get user's data *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
{
|
||||
/***** Remove user's ID *****/
|
||||
ID_RemoveUsrID (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
|
||||
case Usr_I_CAN:
|
||||
/***** Remove user's ID *****/
|
||||
ID_RemoveUsrID (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
|
||||
|
||||
/***** Update list of IDs *****/
|
||||
ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat);
|
||||
/***** Update list of IDs *****/
|
||||
ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat);
|
||||
|
||||
/***** Show form again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
/***** Show form again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
else // User not found
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
@ -719,47 +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_You_can_not_delete_this_ID;
|
||||
char UsrID[ID_MAX_BYTES_USR_ID + 1];
|
||||
bool 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 *****/
|
||||
Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID);
|
||||
// Users' IDs are always stored internally in capitals and without leading zeros
|
||||
Str_RemoveLeadingZeros (UsrID);
|
||||
Str_ConvertToUpperText (UsrID);
|
||||
case Usr_I_CAN:
|
||||
/***** Get user's ID from form *****/
|
||||
Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID);
|
||||
// Users' IDs are always stored internally in capitals and without leading zeros
|
||||
Str_RemoveLeadingZeros (UsrID);
|
||||
Str_ConvertToUpperText (UsrID);
|
||||
|
||||
if (UsrDat->IDs.Num < 2) // One unique ID
|
||||
ICanRemove = false;
|
||||
else
|
||||
switch (MeOrOther)
|
||||
if (UsrDat->IDs.Num >= 2)
|
||||
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:
|
||||
// I can remove my ID only if it is not confirmed
|
||||
ICanRemove = !ID_DB_CheckIfConfirmed (UsrDat->UsrCod,UsrID);
|
||||
case Usr_I_CAN:
|
||||
/***** Remove one of the user's IDs *****/
|
||||
ID_DB_RemoveUsrID (UsrDat->UsrCod,UsrID);
|
||||
|
||||
/***** Show message *****/
|
||||
Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID,
|
||||
Txt_ID_X_removed,UsrID);
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
ICanRemove = true;
|
||||
Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID,
|
||||
Txt_You_can_not_delete_this_ID);
|
||||
break;
|
||||
}
|
||||
|
||||
if (ICanRemove)
|
||||
{
|
||||
/***** Remove one of the user's IDs *****/
|
||||
ID_DB_RemoveUsrID (UsrDat->UsrCod,UsrID);
|
||||
|
||||
/***** 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 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -786,22 +801,24 @@ void ID_ChangeOtherUsrID (void)
|
|||
{
|
||||
/***** Get other user's code from form and get user's data *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
{
|
||||
/***** Change user's ID *****/
|
||||
ID_ChangeUsrID (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
|
||||
case Usr_I_CAN:
|
||||
/***** Change user's ID *****/
|
||||
ID_ChangeUsrID (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
|
||||
|
||||
/***** Update list of IDs *****/
|
||||
ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat);
|
||||
/***** Update list of IDs *****/
|
||||
ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat);
|
||||
|
||||
/***** Show form again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
/***** Show form again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
else // User not found
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
@ -822,65 +839,69 @@ static void ID_ChangeUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOt
|
|||
bool AlreadyExists;
|
||||
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 *****/
|
||||
Par_GetParText ("NewID",NewID,ID_MAX_BYTES_USR_ID);
|
||||
// Users' IDs are always stored internally in capitals and without leading zeros
|
||||
Str_RemoveLeadingZeros (NewID);
|
||||
Str_ConvertToUpperText (NewID);
|
||||
case Usr_I_CAN:
|
||||
/***** Get new user's ID from form *****/
|
||||
Par_GetParText ("NewID",NewID,ID_MAX_BYTES_USR_ID);
|
||||
// Users' IDs are always stored internally in capitals and without leading zeros
|
||||
Str_RemoveLeadingZeros (NewID);
|
||||
Str_ConvertToUpperText (NewID);
|
||||
|
||||
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 (ID_CheckIfUsrIDIsValid (NewID)) // If new ID is valid
|
||||
{
|
||||
if (MeOrOther == Usr_ME || UsrDat->IDs.List[NumIDFound].Confirmed)
|
||||
Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID,
|
||||
Txt_The_ID_X_matches_one_of_the_existing,
|
||||
NewID);
|
||||
else // It's not me && !Confirmed
|
||||
/***** 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
|
||||
{
|
||||
/***** Mark this ID as confirmed *****/
|
||||
ID_DB_ConfirmUsrID (UsrDat->UsrCod,NewID);
|
||||
if (MeOrOther == Usr_ME || UsrDat->IDs.List[NumIDFound].Confirmed)
|
||||
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,
|
||||
Txt_The_ID_X_has_been_confirmed,
|
||||
NewID);
|
||||
Txt_The_ID_X_has_been_registered_successfully,
|
||||
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,
|
||||
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,
|
||||
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);
|
||||
Txt_The_ID_X_is_not_valid,
|
||||
NewID);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -892,7 +913,7 @@ void ID_ConfirmOtherUsrID (void)
|
|||
extern const char *Txt_ID_X_had_already_been_confirmed;
|
||||
extern const char *Txt_The_ID_X_has_been_confirmed;
|
||||
char UsrID[ID_MAX_BYTES_USR_ID + 1];
|
||||
bool ICanConfirm;
|
||||
Usr_ICan_t ICanConfirm;
|
||||
bool Found;
|
||||
unsigned NumID;
|
||||
unsigned NumIDFound = 0; // Initialized to avoid warning
|
||||
|
@ -901,7 +922,7 @@ void ID_ConfirmOtherUsrID (void)
|
|||
Gbl.Action.Original = Act_GetActionFromActCod (ParCod_GetPar (ParCod_OrgAct));
|
||||
|
||||
/***** Get other user's code from form and get user's data *****/
|
||||
ICanConfirm = false;
|
||||
ICanConfirm = Usr_I_CAN_NOT;
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_OTHER) // Not me
|
||||
{
|
||||
|
@ -912,51 +933,55 @@ void ID_ConfirmOtherUsrID (void)
|
|||
Gbl.Usrs.Other.UsrDat.Accepted = Enr_CheckIfUsrHasAcceptedInCurrentCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
|
||||
if (ID_ICanSeeOtherUsrIDs (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
ICanConfirm = true;
|
||||
ICanConfirm = Usr_I_CAN;
|
||||
}
|
||||
|
||||
if (ICanConfirm)
|
||||
switch (ICanConfirm)
|
||||
{
|
||||
/***** Get user's ID from form *****/
|
||||
Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID);
|
||||
// Users' IDs are always stored internally in capitals and without leading zeros
|
||||
Str_RemoveLeadingZeros (UsrID);
|
||||
Str_ConvertToUpperText (UsrID);
|
||||
case Usr_I_CAN:
|
||||
/***** Get user's ID from form *****/
|
||||
Par_GetParText ("UsrID",UsrID,ID_MAX_BYTES_USR_ID);
|
||||
// Users' IDs are always stored internally in capitals and without leading zeros
|
||||
Str_RemoveLeadingZeros (UsrID);
|
||||
Str_ConvertToUpperText (UsrID);
|
||||
|
||||
for (NumID = 0, Found = false;
|
||||
NumID < Gbl.Usrs.Other.UsrDat.IDs.Num && !Found;
|
||||
NumID++)
|
||||
if (!strcasecmp (UsrID,Gbl.Usrs.Other.UsrDat.IDs.List[NumID].ID))
|
||||
for (NumID = 0, Found = false;
|
||||
NumID < Gbl.Usrs.Other.UsrDat.IDs.Num && !Found;
|
||||
NumID++)
|
||||
if (!strcasecmp (UsrID,Gbl.Usrs.Other.UsrDat.IDs.List[NumID].ID))
|
||||
{
|
||||
Found = true;
|
||||
NumIDFound = NumID;
|
||||
}
|
||||
|
||||
if (Found) // Found
|
||||
{
|
||||
Found = true;
|
||||
NumIDFound = NumID;
|
||||
}
|
||||
if (Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].Confirmed)
|
||||
/***** 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
|
||||
{
|
||||
if (Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].Confirmed)
|
||||
/***** 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;
|
||||
|
||||
/***** 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);
|
||||
/***** 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 ();
|
||||
break;
|
||||
}
|
||||
else // I can not confirm
|
||||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
|
||||
/***** Show one or multiple records *****/
|
||||
switch (Gbl.Action.Original)
|
||||
|
|
|
@ -487,39 +487,41 @@ void Acc_ShowFormChgOtherUsrAccount (void)
|
|||
{
|
||||
/***** Get user whose account must be changed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
{
|
||||
/***** Get user's nickname and email address
|
||||
It's necessary because nickname or email could be just updated *****/
|
||||
Nck_DB_GetNicknameFromUsrCod (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.Usrs.Other.UsrDat.Nickname);
|
||||
Mai_GetEmailFromUsrCod (&Gbl.Usrs.Other.UsrDat);
|
||||
switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
/***** Get user's nickname and email address
|
||||
It's necessary because nickname or email could be just updated *****/
|
||||
Nck_DB_GetNicknameFromUsrCod (Gbl.Usrs.Other.UsrDat.UsrCod,Gbl.Usrs.Other.UsrDat.Nickname);
|
||||
Mai_GetEmailFromUsrCod (&Gbl.Usrs.Other.UsrDat);
|
||||
|
||||
/***** Show user's record *****/
|
||||
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
|
||||
&Gbl.Usrs.Other.UsrDat,NULL);
|
||||
/***** Show user's record *****/
|
||||
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
|
||||
&Gbl.Usrs.Other.UsrDat,NULL);
|
||||
|
||||
/***** Begin container for this user *****/
|
||||
HTM_DIV_Begin ("class=\"REC_USR\"");
|
||||
/***** Begin container for this user *****/
|
||||
HTM_DIV_Begin ("class=\"REC_USR\"");
|
||||
|
||||
/***** Show form to change password and nickname *****/
|
||||
HTM_DIV_Begin ("class=\"REC_LEFT\"");
|
||||
Pwd_ShowFormChgOtherUsrPwd ();
|
||||
Nck_ShowFormChangeOtherUsrNickname ();
|
||||
/***** Show form to change password and nickname *****/
|
||||
HTM_DIV_Begin ("class=\"REC_LEFT\"");
|
||||
Pwd_ShowFormChgOtherUsrPwd ();
|
||||
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 ();
|
||||
|
||||
/***** Show form to change email and ID *****/
|
||||
HTM_DIV_Begin ("class=\"REC_RIGHT\"");
|
||||
Mai_ShowFormChangeOtherUsrEmail ();
|
||||
ID_ShowFormChangeOtherUsrID ();
|
||||
HTM_DIV_End ();
|
||||
|
||||
/***** Begin container for this user *****/
|
||||
HTM_DIV_End ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
else // User not found
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
@ -770,13 +772,17 @@ void Acc_GetUsrCodAndRemUsrGbl (void)
|
|||
bool Error = false;
|
||||
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_I_CAN)
|
||||
Acc_ReqRemAccountOrRemAccount (Acc_REMOVE_USR);
|
||||
else
|
||||
Error = true;
|
||||
}
|
||||
else
|
||||
switch (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod))
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
Acc_ReqRemAccountOrRemAccount (Acc_REMOVE_USR);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Error = true;
|
||||
break;
|
||||
}
|
||||
else // User not found
|
||||
Error = true;
|
||||
|
||||
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 :
|
||||
Usr_I_CAN_NOT;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
// Only a system admin can eliminate other's account
|
||||
return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1103,7 +1110,6 @@ void Acc_PutIconToChangeUsrAccount (struct Usr_Data *UsrDat)
|
|||
"at.svg",Ico_BLACK);
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],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_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
|
||||
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
|
||||
{
|
||||
Ale_ShowAlert (Ale_INFO,Txt_THE_USER_X_is_already_an_administrator_of_Y,
|
||||
Gbl.Usrs.Other.UsrDat.FullName,
|
||||
Gbl.Hierarchy.Node[Level].FullName);
|
||||
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
|
||||
}
|
||||
else
|
||||
{
|
||||
/***** Show question and button to register user as administrator *****/
|
||||
/* Begin alert */
|
||||
Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Txt_Do_you_really_want_to_register_the_following_user_as_an_administrator_of_X,
|
||||
Gbl.Hierarchy.Node[Level].FullName);
|
||||
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,
|
||||
Gbl.Hierarchy.Node[Level].FullName);
|
||||
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
|
||||
}
|
||||
else
|
||||
{
|
||||
/***** Show question and button to register user as administrator *****/
|
||||
/* Begin alert */
|
||||
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 */
|
||||
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
|
||||
/* Show user's record */
|
||||
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
|
||||
|
||||
/* End alert */
|
||||
Ale_ShowAlertAndButtonEnd (Enr_ActNewAdm[Level],NULL,NULL,
|
||||
Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
|
||||
Btn_CREATE_BUTTON,Txt_Register_user_IN_A_COURSE_OR_DEGREE);
|
||||
}
|
||||
/* End alert */
|
||||
Ale_ShowAlertAndButtonEnd (Enr_ActNewAdm[Level],NULL,NULL,
|
||||
Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
|
||||
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
|
||||
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_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
if (ICanRegister == Usr_I_CAN)
|
||||
switch (ICanRegister)
|
||||
{
|
||||
/***** Register administrator in current institution/center/degree in database *****/
|
||||
Adm_RegisterAdmin (&Gbl.Usrs.Other.UsrDat,Level);
|
||||
case Usr_I_CAN:
|
||||
/***** Register administrator in current institution/center/degree in database *****/
|
||||
Adm_RegisterAdmin (&Gbl.Usrs.Other.UsrDat,Level);
|
||||
|
||||
/***** Show user's record *****/
|
||||
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
/***** Show user's record *****/
|
||||
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
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_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
|
||||
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 */
|
||||
if (Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Level))
|
||||
{ // 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);
|
||||
break;
|
||||
case Enr_REMOVE_USR: // Remove administrator from current institution
|
||||
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,
|
||||
Gbl.Usrs.Other.UsrDat.FullName,
|
||||
Gbl.Hierarchy.Node[Level].FullName);
|
||||
case Usr_I_CAN:
|
||||
/* Check if the other user is an admin of the current institution/center/degree */
|
||||
if (Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Level))
|
||||
{ // 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);
|
||||
break;
|
||||
case Enr_REMOVE_USR: // Remove administrator from current institution
|
||||
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,
|
||||
Gbl.Usrs.Other.UsrDat.FullName,
|
||||
Gbl.Hierarchy.Node[Level].FullName);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
|
|
|
@ -393,7 +393,6 @@ void Agd_ShowUsrAgenda (void)
|
|||
extern const char *Hlp_PROFILE_Agenda_public_agenda;
|
||||
extern const char *Txt_Public_agenda_USER;
|
||||
struct Agd_Agenda Agenda;
|
||||
bool Error = true;
|
||||
Usr_MeOrOther_t MeOrOther;
|
||||
char *Title;
|
||||
static struct Usr_Data *UsrDat[Usr_NUM_ME_OR_OTHER] =
|
||||
|
@ -409,33 +408,36 @@ void Agd_ShowUsrAgenda (void)
|
|||
|
||||
/***** Get user *****/
|
||||
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 *****/
|
||||
Agd_ResetAgenda (&Agenda);
|
||||
/***** Begin box *****/
|
||||
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 *****/
|
||||
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);
|
||||
/***** Show the current events in the user's agenda *****/
|
||||
Agd_ShowEventsToday (&Agenda,Agd_ANOTHER_AGENDA_TODAY);
|
||||
|
||||
/***** Show the current events in the user's agenda *****/
|
||||
Agd_ShowEventsToday (&Agenda,Agd_ANOTHER_AGENDA_TODAY);
|
||||
/***** Show all visible events in the user's agenda *****/
|
||||
Agd_ShowEvents (&Agenda,Agd_ANOTHER_AGENDA);
|
||||
|
||||
/***** Show all visible events in the user's agenda *****/
|
||||
Agd_ShowEvents (&Agenda,Agd_ANOTHER_AGENDA);
|
||||
|
||||
/***** End box *****/
|
||||
Box_BoxEnd ();
|
||||
/***** End box *****/
|
||||
Box_BoxEnd ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
|
||||
if (Error)
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
||||
|
|
|
@ -511,16 +511,16 @@ static void Asg_ShowAssignmentRow (struct Asg_Assignments *Assignments,
|
|||
case Vie_VIEW:
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
|
||||
Id,
|
||||
Assignments->Asg.Open ? HidVis_DateGreenClass[Assignments->Asg.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Assignments->Asg.HiddenOrVisible],
|
||||
Assignments->Asg.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Assignments->Asg.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Assignments->Asg.HiddenOrVisible],
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
break;
|
||||
case Vie_PRINT:
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
|
||||
Id,
|
||||
Assignments->Asg.Open ? HidVis_DateGreenClass[Assignments->Asg.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Assignments->Asg.HiddenOrVisible],
|
||||
Assignments->Asg.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Assignments->Asg.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Assignments->Asg.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
break;
|
||||
default:
|
||||
|
@ -659,7 +659,7 @@ static void Asg_WriteAssignmentFolder (struct Asg_Assignment *Asg,
|
|||
extern const char *Txt_Folder;
|
||||
Act_Action_t NextAction;
|
||||
bool ICanSendFiles = Asg->HiddenOrVisible == HidVis_VISIBLE && // It's visible (not hidden)
|
||||
Asg->Open && // It's open (inside dates)
|
||||
Asg->Open == CloOpe_OPEN && // It's open (inside dates)
|
||||
Asg->IBelongToCrsOrGrps; // I belong to course or groups
|
||||
|
||||
/***** Folder icon *****/
|
||||
|
@ -933,7 +933,8 @@ static void Asg_GetAssignmentDataFromRow (MYSQL_RES **mysql_res,
|
|||
Asg->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[4]);
|
||||
|
||||
/* Get whether the assignment is open or closed (row(5)) */
|
||||
Asg->Open = (row[5][0] == '1');
|
||||
Asg->Open = (row[5][0] == '1') ? CloOpe_OPEN :
|
||||
CloOpe_CLOSED;
|
||||
|
||||
/* Get the title (row[6]) and the folder (row[7]) of the assignment */
|
||||
Str_Copy (Asg->Title ,row[6],sizeof (Asg->Title ) - 1);
|
||||
|
@ -961,7 +962,7 @@ static void Asg_ResetAssignment (struct Asg_Assignment *Asg)
|
|||
Asg->UsrCod = -1L;
|
||||
Asg->TimeUTC[Dat_STR_TIME] =
|
||||
Asg->TimeUTC[Dat_END_TIME] = (time_t) 0;
|
||||
Asg->Open = false;
|
||||
Asg->Open = CloOpe_CLOSED;
|
||||
Asg->Title[0] = '\0';
|
||||
Asg->SendWork = Asg_DO_NOT_SEND_WORK;
|
||||
Asg->Folder[0] = '\0';
|
||||
|
@ -1184,7 +1185,7 @@ void Asg_ReqCreatOrEditAsg (void)
|
|||
Assignments.Asg.AsgCod = -1L;
|
||||
Assignments.Asg.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
|
||||
Assignments.Asg.TimeUTC[Dat_END_TIME] = Assignments.Asg.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours
|
||||
Assignments.Asg.Open = true;
|
||||
Assignments.Asg.Open = CloOpe_OPEN;
|
||||
Assignments.Asg.Title[0] = '\0';
|
||||
Assignments.Asg.SendWork = Asg_DO_NOT_SEND_WORK;
|
||||
Assignments.Asg.Folder[0] = '\0';
|
||||
|
@ -1661,8 +1662,8 @@ void Asg_WriteDatesAssignment (const struct Asg_Assignment *Asg)
|
|||
|
||||
/***** Begin table cell *****/
|
||||
HTM_TD_Begin ("colspan=\"2\" class=\"RM %s_%s %s\"",
|
||||
Asg->Open ? "ASG_LST_DATE_GREEN" :
|
||||
"ASG_LST_DATE_RED",
|
||||
Asg->Open == CloOpe_OPEN ? "ASG_LST_DATE_GREEN" :
|
||||
"ASG_LST_DATE_RED",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
|
||||
|
@ -1724,8 +1725,9 @@ Usr_ICan_t Asg_CheckIfICanCreateIntoAssigment (const struct Asg_Assignment *Asg)
|
|||
{
|
||||
case Rol_STD: // Students...
|
||||
case Rol_NET: // ...and non-editing teachers...
|
||||
return Asg->Open ? Usr_I_CAN : // ...can create inside open assignments
|
||||
Usr_I_CAN_NOT;
|
||||
// ...can create inside open assignments
|
||||
return (Asg->Open == CloOpe_OPEN) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_TCH: // Teachers...
|
||||
return Usr_I_CAN; // ...can create inside open or closed assignments
|
||||
default:
|
||||
|
|
|
@ -52,7 +52,7 @@ struct Asg_Assignment
|
|||
HidVis_HiddenOrVisible_t HiddenOrVisible;
|
||||
long UsrCod;
|
||||
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
||||
bool Open;
|
||||
CloOpe_ClosedOrOpen_t Open;
|
||||
char Title[Asg_MAX_BYTES_ASSIGNMENT_TITLE + 1];
|
||||
Asg_SendWork_t SendWork;
|
||||
char Folder[Brw_MAX_BYTES_FOLDER + 1];
|
||||
|
|
|
@ -467,14 +467,14 @@ static void Att_ShowOneEventRow (struct Att_Events *Events,
|
|||
if (ShowOnlyThisAttEventComplete)
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
|
||||
Id,
|
||||
Events->Event.Open ? HidVis_DateGreenClass[Events->Event.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Events->Event.HiddenOrVisible],
|
||||
Events->Event.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Events->Event.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Events->Event.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
else
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
|
||||
Id,
|
||||
Events->Event.Open ? HidVis_DateGreenClass[Events->Event.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Events->Event.HiddenOrVisible],
|
||||
Events->Event.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Events->Event.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Events->Event.HiddenOrVisible],
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Events->Event.TimeUTC[StartEndTime],
|
||||
|
@ -746,7 +746,7 @@ static void Att_ResetEvent (struct Att_Event *Event)
|
|||
Event->UsrCod = -1L;
|
||||
Event->TimeUTC[Dat_STR_TIME] =
|
||||
Event->TimeUTC[Dat_END_TIME] = (time_t) 0;
|
||||
Event->Open = false;
|
||||
Event->Open = CloOpe_CLOSED;
|
||||
Event->CommentTchVisible = false;
|
||||
Event->Title[0] = '\0';
|
||||
}
|
||||
|
@ -772,7 +772,8 @@ void Att_GetEventDataFromRow (MYSQL_ROW row,struct Att_Event *Event)
|
|||
Event->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[5]);
|
||||
|
||||
/***** Get whether the attendance event is open or closed (row(6)) *****/
|
||||
Event->Open = (row[6][0] == '1');
|
||||
Event->Open = (row[6][0] == '1') ? CloOpe_OPEN :
|
||||
CloOpe_CLOSED;
|
||||
|
||||
/***** Get whether the attendance event is visible or not (row[7]) *****/
|
||||
Event->CommentTchVisible = (row[7][0] == 'Y');
|
||||
|
@ -952,7 +953,7 @@ void Att_ReqCreatOrEditEvent (void)
|
|||
Events.Event.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
|
||||
Events.Event.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
|
||||
Events.Event.TimeUTC[Dat_END_TIME] = Events.Event.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours
|
||||
Events.Event.Open = true;
|
||||
Events.Event.Open = CloOpe_OPEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1486,7 +1487,7 @@ static void Att_ListEventOnlyMeAsStudent (struct Att_Event *Event)
|
|||
Hlp_USERS_Attendance,Box_NOT_CLOSABLE);
|
||||
|
||||
/***** Begin form *****/
|
||||
if (Event->Open)
|
||||
if (Event->Open == CloOpe_OPEN)
|
||||
{
|
||||
Frm_BeginForm (ActRecAttMe);
|
||||
ParCod_PutPar (ParCod_Att,Event->AttCod);
|
||||
|
@ -1515,7 +1516,7 @@ static void Att_ListEventOnlyMeAsStudent (struct Att_Event *Event)
|
|||
HTM_TABLE_End ();
|
||||
|
||||
/* Send button */
|
||||
if (Event->Open)
|
||||
if (Event->Open == CloOpe_OPEN)
|
||||
{
|
||||
Btn_PutConfirmButton (Txt_Save_changes);
|
||||
Frm_EndForm ();
|
||||
|
@ -1668,8 +1669,8 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
|
|||
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER)
|
||||
Err_ShowErrorAndExit ("Wrong call.");
|
||||
ICanChangeStdAttendance = Usr_I_CAN_NOT;
|
||||
ICanEditStdComment = Event->Open ? Usr_I_CAN : // Attendance event is open
|
||||
Usr_I_CAN_NOT;
|
||||
ICanEditStdComment = (Event->Open == CloOpe_OPEN) ? Usr_I_CAN : // Attendance event is open
|
||||
Usr_I_CAN_NOT;
|
||||
ICanEditTchComment = Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_TCH:
|
||||
|
@ -1757,20 +1758,22 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
|
|||
"DAT_SMALL",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanEditStdComment == Usr_I_CAN) // Show with form
|
||||
switch (ICanEditStdComment)
|
||||
{
|
||||
HTM_TEXTAREA_Begin ("name=\"CommentStd%s\" cols=\"40\" rows=\"3\""
|
||||
" class=\"INPUT_%s\"",
|
||||
UsrDat->EnUsrCod,
|
||||
The_GetSuffix ());
|
||||
case Usr_I_CAN: // Show with form
|
||||
HTM_TEXTAREA_Begin ("name=\"CommentStd%s\" cols=\"40\" rows=\"3\""
|
||||
" class=\"INPUT_%s\"",
|
||||
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_TEXTAREA_End ();
|
||||
}
|
||||
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);
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
|
@ -1780,22 +1783,27 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
|
|||
"DAT_SMALL",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanEditTchComment == Usr_I_CAN) // Show with form
|
||||
switch (ICanEditTchComment)
|
||||
{
|
||||
HTM_TEXTAREA_Begin ("name=\"CommentTch%s\" cols=\"40\" rows=\"3\""
|
||||
" class=\"INPUT_%s\"",
|
||||
UsrDat->EnUsrCod,
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (CommentTch);
|
||||
HTM_TEXTAREA_End ();
|
||||
}
|
||||
else if (Event->CommentTchVisible) // Show without form
|
||||
{
|
||||
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
|
||||
CommentTch,Cns_MAX_BYTES_TEXT,
|
||||
Str_DONT_REMOVE_SPACES);
|
||||
HTM_Txt (CommentTch);
|
||||
}
|
||||
case Usr_I_CAN: // Show with form
|
||||
HTM_TEXTAREA_Begin ("name=\"CommentTch%s\" cols=\"40\" rows=\"3\""
|
||||
" class=\"INPUT_%s\"",
|
||||
UsrDat->EnUsrCod,
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (CommentTch);
|
||||
HTM_TEXTAREA_End ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT: // Show without form
|
||||
default:
|
||||
if (Event->CommentTchVisible)
|
||||
{
|
||||
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 ();
|
||||
|
||||
/***** End table row *****/
|
||||
|
@ -1904,7 +1912,7 @@ void Att_RegisterMeAsStdInEvent (void)
|
|||
Events.Event.AttCod = ParCod_GetAndCheckPar (ParCod_Att);
|
||||
Att_GetEventDataByCodAndCheckCrs (&Events.Event); // This checks that event belong to current course
|
||||
|
||||
if (Events.Event.Open)
|
||||
if (Events.Event.Open == CloOpe_OPEN)
|
||||
{
|
||||
/***** Get comments for this student *****/
|
||||
Present = Att_CheckIfUsrIsPresentInEventAndGetComments (Events.Event.AttCod,Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||
|
|
|
@ -54,7 +54,7 @@ struct Att_Event
|
|||
HidVis_HiddenOrVisible_t HiddenOrVisible;
|
||||
long UsrCod;
|
||||
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
||||
bool Open;
|
||||
CloOpe_ClosedOrOpen_t Open;
|
||||
bool CommentTchVisible;
|
||||
char Title[Att_MAX_BYTES_ATTENDANCE_EVENT_TITLE + 1];
|
||||
|
||||
|
|
2473
swad_browser.c
2473
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];
|
||||
|
||||
/***** Build subquery about status depending on my role *****/
|
||||
if (Cfe_CheckIfICanEditCallsForExams () == Usr_I_CAN)
|
||||
sprintf (SubQueryStatus,"Status<>%u",
|
||||
(unsigned) Cfe_DELETED_CALL_FOR_EXAM);
|
||||
else
|
||||
sprintf (SubQueryStatus,"Status=%u",
|
||||
(unsigned) Cfe_VISIBLE_CALL_FOR_EXAM);
|
||||
switch (Cfe_CheckIfICanEditCallsForExams ())
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
sprintf (SubQueryStatus,"Status<>%u",(unsigned) Cfe_DELETED_CALL_FOR_EXAM);
|
||||
break;
|
||||
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)
|
||||
in current course from database *****/
|
||||
|
|
111
swad_center.c
111
swad_center.c
|
@ -793,39 +793,43 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
|
|||
|
||||
/* Place */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
switch (ICanEdit)
|
||||
{
|
||||
Frm_BeginForm (ActChgCtrPlc);
|
||||
ParCod_PutPar (ParCod_OthHie,Ctr->HieCod);
|
||||
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL,
|
||||
"name=\"PlcCod\""
|
||||
" class=\"PLC_SEL INPUT_%s\"",
|
||||
The_GetSuffix ());
|
||||
HTM_OPTION (HTM_Type_STRING,"0",
|
||||
Ctr->Specific.PlcCod == 0 ? HTM_OPTION_SELECTED :
|
||||
HTM_OPTION_UNSELECTED,
|
||||
HTM_OPTION_ENABLED,
|
||||
"%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,
|
||||
case Usr_I_CAN:
|
||||
Frm_BeginForm (ActChgCtrPlc);
|
||||
ParCod_PutPar (ParCod_OthHie,Ctr->HieCod);
|
||||
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL,
|
||||
"name=\"PlcCod\""
|
||||
" class=\"PLC_SEL INPUT_%s\"",
|
||||
The_GetSuffix ());
|
||||
HTM_OPTION (HTM_Type_STRING,"0",
|
||||
Ctr->Specific.PlcCod == 0 ? HTM_OPTION_SELECTED :
|
||||
HTM_OPTION_UNSELECTED,
|
||||
HTM_OPTION_ENABLED,
|
||||
"%s",Plc->ShrtName);
|
||||
}
|
||||
HTM_SELECT_End ();
|
||||
Frm_EndForm ();
|
||||
"%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,
|
||||
"%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 ();
|
||||
|
||||
/* Center short name and full name */
|
||||
|
@ -839,28 +843,30 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
|
|||
|
||||
/* Center WWW */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
switch (ICanEdit)
|
||||
{
|
||||
Frm_BeginForm (ActChgCtrWWW);
|
||||
ParCod_PutPar (ParCod_OthHie,Ctr->HieCod);
|
||||
HTM_INPUT_URL ("WWW",Ctr->WWW,HTM_SUBMIT_ON_CHANGE,
|
||||
"class=\"INPUT_WWW INPUT_%s\""
|
||||
" required=\"required\"",
|
||||
The_GetSuffix ());
|
||||
Frm_EndForm ();
|
||||
}
|
||||
else
|
||||
{
|
||||
Str_Copy (WWW,Ctr->WWW,sizeof (WWW) - 1);
|
||||
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\"");
|
||||
HTM_A_Begin ("href=\"%s\" target=\"_blank\""
|
||||
" class=\"DAT_%s\" title=\"%s\"",
|
||||
Ctr->WWW,
|
||||
The_GetSuffix (),
|
||||
Ctr->WWW);
|
||||
HTM_Txt (WWW);
|
||||
HTM_A_End ();
|
||||
HTM_DIV_End ();
|
||||
case Usr_I_CAN:
|
||||
Frm_BeginForm (ActChgCtrWWW);
|
||||
ParCod_PutPar (ParCod_OthHie,Ctr->HieCod);
|
||||
HTM_INPUT_URL ("WWW",Ctr->WWW,HTM_SUBMIT_ON_CHANGE,
|
||||
"class=\"INPUT_WWW INPUT_%s\""
|
||||
" required=\"required\"",
|
||||
The_GetSuffix ());
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Str_Copy (WWW,Ctr->WWW,sizeof (WWW) - 1);
|
||||
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\"");
|
||||
HTM_A_Begin ("href=\"%s\" target=\"_blank\""
|
||||
" class=\"DAT_%s\" title=\"%s\"",
|
||||
Ctr->WWW,
|
||||
The_GetSuffix (),
|
||||
Ctr->WWW);
|
||||
HTM_Txt (WWW);
|
||||
HTM_A_End ();
|
||||
HTM_DIV_End ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
|
@ -884,7 +890,8 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
|
|||
HTM_TD_End ();
|
||||
|
||||
/* Center status */
|
||||
Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM,
|
||||
Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT,
|
||||
Ctr->Status,ActChgCtrSta,Ctr->HieCod,
|
||||
Txt_CENTER_STATUS);
|
||||
|
||||
|
|
|
@ -327,7 +327,7 @@ static void CtrCfg_Map (const struct Map_Coordinates *Coord)
|
|||
/* Add popup */
|
||||
Map_AddPopup (Gbl.Hierarchy.Node[Hie_CTR].ShrtName,
|
||||
Gbl.Hierarchy.Node[Hie_INS].ShrtName,
|
||||
true); // Open
|
||||
CloOpe_OPEN); // Open
|
||||
|
||||
HTM_SCRIPT_End ();
|
||||
}
|
||||
|
|
|
@ -633,11 +633,14 @@ Me sale este error, no s
|
|||
"can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod')
|
||||
*/
|
||||
|
||||
#define Log_PLATFORM_VERSION "SWAD 23.72.1 (2024-04-01)"
|
||||
#define Log_PLATFORM_VERSION "SWAD 23.74 (2024-04-07)"
|
||||
#define CSS_FILE "swad23.67.2.css"
|
||||
#define JS_FILE "swad23.53.6.js"
|
||||
/*
|
||||
Version 23.72.1: Apr 01, 2024 New type Usr_ICan_t. (334912 lines)
|
||||
Version 23.74: Apr 07, 2024 New type CloOpe_ClosedOrOpen_t. (335553 lines)
|
||||
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.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.71.4: Mar 22, 2024 Code refactoring. (334860 lines)
|
||||
Version 23.71.3: Mar 22, 2024 Code refactoring. (334827 lines)
|
||||
|
|
|
@ -0,0 +1,101 @@
|
|||
// swad_closed_open.c: types and constants related to closed/open
|
||||
|
||||
/*
|
||||
SWAD (Shared Workspace At a Distance),
|
||||
is a web platform developed at the University of Granada (Spain),
|
||||
and used to support university teaching.
|
||||
|
||||
This file is part of SWAD core.
|
||||
Copyright (C) 1999-2024 Antonio Cañas Vargas
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General 3 License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/*****************************************************************************/
|
||||
/*********************************** Headers *********************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
#include "swad_closed_open.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************** Public constants *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Open in database fields */
|
||||
const char CloOpe_YN[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED] = 'Y',
|
||||
[CloOpe_OPEN ] = 'N',
|
||||
};
|
||||
/*
|
||||
const char *CloOpe_DateGreenClass[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED] = "DATE_GREEN_LIGHT",
|
||||
[CloOpe_OPEN ] = "DATE_GREEN",
|
||||
};
|
||||
const char *CloOpe_DateRedClass[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED] = "DATE_RED_LIGHT",
|
||||
[CloOpe_OPEN ] = "DATE_RED",
|
||||
};
|
||||
const char *CloOpe_DateBlueClass[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED ] = "DATE_BLUE_LIGHT",
|
||||
[CloOpe_OPEN] = "DATE_BLUE",
|
||||
};
|
||||
const char *CloOpe_TitleClass[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED] = "ASG_TITLE_LIGHT",
|
||||
[CloOpe_OPEN ] = "ASG_TITLE",
|
||||
};
|
||||
const char *CloOpe_GroupClass[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED] = "ASG_GRP_LIGHT",
|
||||
[CloOpe_OPEN ] = "ASG_GRP",
|
||||
};
|
||||
const char *CloOpe_LabelClass[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED] = "ASG_LABEL_LIGHT",
|
||||
[CloOpe_OPEN ] = "ASG_LABEL",
|
||||
};
|
||||
const char *CloOpe_DataClass[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED] = "DAT_LIGHT",
|
||||
[CloOpe_OPEN ] = "DAT",
|
||||
};
|
||||
const char *CloOpe_MsgClass[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED] = "MSG_AUT_LIGHT",
|
||||
[CloOpe_OPEN ] = "MSG_AUT",
|
||||
};
|
||||
const char *CloOpe_PrgClass[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED] = " PRG_HIDDEN",
|
||||
[CloOpe_OPEN ] = "",
|
||||
};
|
||||
const char *CloOpe_ShownStyle[CloOpe_NUM_CLOSED_OPEN] =
|
||||
{
|
||||
[CloOpe_CLOSED] = " style=\"display:none;\"",
|
||||
[CloOpe_OPEN ] = "",
|
||||
};
|
||||
*/
|
||||
/*****************************************************************************/
|
||||
/****************** Get if closed or open from a character *******************/
|
||||
/*****************************************************************************/
|
||||
|
||||
CloOpe_ClosedOrOpen_t CloOpe_GetClosedOrOpen (char Ch)
|
||||
{
|
||||
return (Ch == 'Y') ? CloOpe_OPEN :
|
||||
CloOpe_CLOSED;
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
// swad_closed_open.h: types and constants related to closed/open
|
||||
|
||||
#ifndef _SWAD_CLO_OPE
|
||||
#define _SWAD_CLO_OPE
|
||||
/*
|
||||
SWAD (Shared Workspace At a Distance in Spanish),
|
||||
is a web platform developed at the University of Granada (Spain),
|
||||
and used to support university teaching.
|
||||
|
||||
This file is part of SWAD core.
|
||||
Copyright (C) 1999-2024 Antonio Cañas Vargas
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*****************************************************************************/
|
||||
/***************************** Public constants ******************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
#define CloOpe_NUM_CLOSED_OPEN 2
|
||||
|
||||
/*****************************************************************************/
|
||||
/******************************* Public types ********************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CloOpe_CLOSED = 0,
|
||||
CloOpe_OPEN = 1,
|
||||
} CloOpe_ClosedOrOpen_t;
|
||||
|
||||
/*****************************************************************************/
|
||||
/****************************** Public prototypes ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
CloOpe_ClosedOrOpen_t CloOpe_GetClosedOrOpen (char c);
|
||||
|
||||
#endif
|
|
@ -539,7 +539,7 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
|
|||
const char *ClassTxt;
|
||||
long UsrCod;
|
||||
Usr_MeOrOther_t MeOrOther;
|
||||
struct Usr_Data *UsrDat;
|
||||
struct Usr_Data *UsrDat = NULL; // To avoid warning
|
||||
struct Usr_Data OtherUsrDat;
|
||||
|
||||
/***** Get user's code from list *****/
|
||||
|
@ -552,7 +552,6 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
|
|||
UsrDat = &Gbl.Usrs.Me.UsrDat;
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
/***** Initialize structure with user's data *****/
|
||||
OtherUsrDat.UsrCod = UsrCod;
|
||||
Usr_UsrDataConstructor (&OtherUsrDat);
|
||||
|
@ -609,7 +608,6 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
|
|||
case Usr_ME:
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
/***** Free memory used for user's data *****/
|
||||
Usr_UsrDataDestructor (&OtherUsrDat);
|
||||
break;
|
||||
|
|
|
@ -705,45 +705,53 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
|
|||
|
||||
/* Course year */
|
||||
HTM_TD_Begin ("class=\"CT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (ActChgCrsYea);
|
||||
ParCod_PutPar (ParCod_OthHie,Crs->HieCod);
|
||||
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL,
|
||||
"name=\"OthCrsYear\""
|
||||
" class=\"HIE_SEL_NARROW INPUT_%s\"",
|
||||
The_GetSuffix ());
|
||||
for (YearAux = 0;
|
||||
YearAux <= Deg_MAX_YEARS_PER_DEGREE;
|
||||
YearAux++) // All the years are permitted
|
||||
// because it's possible to move this course
|
||||
// to another degree (with other active years)
|
||||
HTM_OPTION (HTM_Type_UNSIGNED,&YearAux,
|
||||
YearAux == Crs->Specific.Year ? HTM_OPTION_SELECTED :
|
||||
HTM_OPTION_UNSELECTED,
|
||||
HTM_OPTION_ENABLED,
|
||||
"%s",Txt_YEAR_OF_DEGREE[YearAux]);
|
||||
HTM_SELECT_End ();
|
||||
Frm_EndForm ();
|
||||
}
|
||||
else
|
||||
HTM_Txt (Txt_YEAR_OF_DEGREE[Crs->Specific.Year]);
|
||||
switch (ICanEdit)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
Frm_BeginForm (ActChgCrsYea);
|
||||
ParCod_PutPar (ParCod_OthHie,Crs->HieCod);
|
||||
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL,
|
||||
"name=\"OthCrsYear\""
|
||||
" class=\"HIE_SEL_NARROW INPUT_%s\"",
|
||||
The_GetSuffix ());
|
||||
for (YearAux = 0;
|
||||
YearAux <= Deg_MAX_YEARS_PER_DEGREE;
|
||||
YearAux++) // All the years are permitted
|
||||
// because it's possible to move this course
|
||||
// to another degree (with other active years)
|
||||
HTM_OPTION (HTM_Type_UNSIGNED,&YearAux,
|
||||
YearAux == Crs->Specific.Year ? HTM_OPTION_SELECTED :
|
||||
HTM_OPTION_UNSELECTED,
|
||||
HTM_OPTION_ENABLED,
|
||||
"%s",Txt_YEAR_OF_DEGREE[YearAux]);
|
||||
HTM_SELECT_End ();
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
HTM_Txt (Txt_YEAR_OF_DEGREE[Crs->Specific.Year]);
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Institutional code of the course */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
switch (ICanEdit)
|
||||
{
|
||||
Frm_BeginForm (ActChgInsCrsCod);
|
||||
ParCod_PutPar (ParCod_OthHie,Crs->HieCod);
|
||||
HTM_INPUT_TEXT ("InsCrsCod",Hie_MAX_CHARS_INSTITUTIONAL_COD,
|
||||
Crs->InstitutionalCod,HTM_SUBMIT_ON_CHANGE,
|
||||
"class=\"INPUT_INS_CODE INPUT_%s\"",
|
||||
The_GetSuffix ());
|
||||
Frm_EndForm ();
|
||||
case Usr_I_CAN:
|
||||
Frm_BeginForm (ActChgInsCrsCod);
|
||||
ParCod_PutPar (ParCod_OthHie,Crs->HieCod);
|
||||
HTM_INPUT_TEXT ("InsCrsCod",Hie_MAX_CHARS_INSTITUTIONAL_COD,
|
||||
Crs->InstitutionalCod,HTM_SUBMIT_ON_CHANGE,
|
||||
"class=\"INPUT_INS_CODE INPUT_%s\"",
|
||||
The_GetSuffix ());
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
HTM_Txt (Crs->InstitutionalCod);
|
||||
break;
|
||||
}
|
||||
else
|
||||
HTM_Txt (Crs->InstitutionalCod);
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Course short name and full name */
|
||||
|
@ -773,7 +781,8 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
|
|||
HTM_TD_End ();
|
||||
|
||||
/* Course status */
|
||||
Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM,
|
||||
Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT,
|
||||
Crs->Status,ActChgCrsSta,Crs->HieCod,
|
||||
Txt_COURSE_STATUS);
|
||||
|
||||
|
|
109
swad_degree.c
109
swad_degree.c
|
@ -389,63 +389,69 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
|
|||
|
||||
/* Degree type */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
switch (ICanEdit)
|
||||
{
|
||||
Frm_BeginForm (ActChgDegTyp);
|
||||
ParCod_PutPar (ParCod_OthHie,Deg->HieCod);
|
||||
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL,
|
||||
"name=\"OthDegTypCod\""
|
||||
" class=\"HIE_SEL_NARROW INPUT_%s\"",
|
||||
The_GetSuffix ());
|
||||
for (NumDegTyp = 0;
|
||||
NumDegTyp < DegTypes->Num;
|
||||
NumDegTyp++)
|
||||
{
|
||||
DegTyp = &DegTypes->Lst[NumDegTyp];
|
||||
HTM_OPTION (HTM_Type_LONG,&DegTyp->DegTypCod,
|
||||
DegTyp->DegTypCod == Deg->Specific.TypCod ? HTM_OPTION_SELECTED :
|
||||
HTM_OPTION_UNSELECTED,
|
||||
HTM_OPTION_ENABLED,
|
||||
"%s",DegTyp->DegTypName);
|
||||
}
|
||||
HTM_SELECT_End ();
|
||||
Frm_EndForm ();
|
||||
case Usr_I_CAN:
|
||||
Frm_BeginForm (ActChgDegTyp);
|
||||
ParCod_PutPar (ParCod_OthHie,Deg->HieCod);
|
||||
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,NULL,
|
||||
"name=\"OthDegTypCod\""
|
||||
" class=\"HIE_SEL_NARROW INPUT_%s\"",
|
||||
The_GetSuffix ());
|
||||
for (NumDegTyp = 0;
|
||||
NumDegTyp < DegTypes->Num;
|
||||
NumDegTyp++)
|
||||
{
|
||||
DegTyp = &DegTypes->Lst[NumDegTyp];
|
||||
HTM_OPTION (HTM_Type_LONG,&DegTyp->DegTypCod,
|
||||
DegTyp->DegTypCod == Deg->Specific.TypCod ? HTM_OPTION_SELECTED :
|
||||
HTM_OPTION_UNSELECTED,
|
||||
HTM_OPTION_ENABLED,
|
||||
"%s",DegTyp->DegTypName);
|
||||
}
|
||||
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 ();
|
||||
|
||||
/* Degree WWW */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
switch (ICanEdit)
|
||||
{
|
||||
Frm_BeginForm (ActChgDegWWW);
|
||||
ParCod_PutPar (ParCod_OthHie,Deg->HieCod);
|
||||
HTM_INPUT_URL ("WWW",Deg->WWW,HTM_SUBMIT_ON_CHANGE,
|
||||
"class=\"INPUT_WWW INPUT_%s\""
|
||||
" required=\"required\"",
|
||||
The_GetSuffix ());
|
||||
Frm_EndForm ();
|
||||
}
|
||||
else
|
||||
{
|
||||
Str_Copy (WWW,Deg->WWW,sizeof (WWW) - 1);
|
||||
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\"");
|
||||
HTM_A_Begin ("href=\"%s\" target=\"_blank\" title=\"%s\""
|
||||
" class=\"DAT_%s\"",
|
||||
Deg->WWW,
|
||||
Deg->WWW,
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (WWW);
|
||||
HTM_A_End ();
|
||||
HTM_DIV_End ();
|
||||
case Usr_I_CAN:
|
||||
Frm_BeginForm (ActChgDegWWW);
|
||||
ParCod_PutPar (ParCod_OthHie,Deg->HieCod);
|
||||
HTM_INPUT_URL ("WWW",Deg->WWW,HTM_SUBMIT_ON_CHANGE,
|
||||
"class=\"INPUT_WWW INPUT_%s\""
|
||||
" required=\"required\"",
|
||||
The_GetSuffix ());
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Str_Copy (WWW,Deg->WWW,sizeof (WWW) - 1);
|
||||
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\"");
|
||||
HTM_A_Begin ("href=\"%s\" target=\"_blank\" title=\"%s\""
|
||||
" class=\"DAT_%s\"",
|
||||
Deg->WWW,
|
||||
Deg->WWW,
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (WWW);
|
||||
HTM_A_End ();
|
||||
HTM_DIV_End ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
|
@ -466,7 +472,8 @@ static void Deg_ListDegreesForEdition (const struct DegTyp_DegTypes *DegTypes)
|
|||
HTM_TD_End ();
|
||||
|
||||
/* Degree status */
|
||||
Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM,
|
||||
Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT,
|
||||
Deg->Status,ActChgDegSta,Deg->HieCod,
|
||||
Txt_DEGREE_STATUS);
|
||||
|
||||
|
|
|
@ -53,11 +53,11 @@
|
|||
/****************************** Private constants ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Dpt_ICanEditDpts[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t Dpt_ICanEditDpts[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_INS_ADM] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_INS_ADM] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -243,7 +243,7 @@ static Dpt_Order_t Dpt_GetParDptOrder (void)
|
|||
|
||||
static void Dpt_PutIconToEditDpts (__attribute__((unused)) void *Args)
|
||||
{
|
||||
if (Dpt_ICanEditDpts[Gbl.Usrs.Me.Role.Logged])
|
||||
if (Dpt_ICanEditDpts[Gbl.Usrs.Me.Role.Logged] == Usr_I_CAN)
|
||||
Ico_PutContextualIconToEdit (ActEdiDpt,NULL,NULL,NULL);
|
||||
}
|
||||
|
||||
|
|
|
@ -2443,12 +2443,18 @@ void Enr_ReqRegRemTch (void)
|
|||
|
||||
static void Enr_ReqRegRemUsr (Rol_Role_t Role)
|
||||
{
|
||||
if (Adm_CheckIfICanAdminOtherUsrs () == Usr_I_CAN)
|
||||
/***** Form to request the user's ID of another user *****/
|
||||
Enr_ReqAnotherUsrIDToRegisterRemove (Role);
|
||||
else
|
||||
/***** Form to request if register/remove me *****/
|
||||
Enr_AskIfRegRemMe (Role);
|
||||
switch (Adm_CheckIfICanAdminOtherUsrs ())
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
/***** Form to request the user's ID of another user *****/
|
||||
Enr_ReqAnotherUsrIDToRegisterRemove (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 *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Enr_CheckIfICanRemUsrFromCrs () == Usr_I_CAN)
|
||||
Enr_AskIfRemoveUsrFromCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
switch (Enr_CheckIfICanRemUsrFromCrs ())
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
Enr_AskIfRemoveUsrFromCrs (&Gbl.Usrs.Other.UsrDat);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
@ -2692,14 +2702,19 @@ void Enr_RemUsrFromCrs1 (void)
|
|||
{
|
||||
/***** Get user to be removed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Enr_CheckIfICanRemUsrFromCrs () == Usr_I_CAN)
|
||||
Enr_EffectivelyRemUsrFromCrs (&Gbl.Usrs.Other.UsrDat,&Gbl.Hierarchy.Node[Hie_CRS],
|
||||
Enr_DO_NOT_REMOVE_USR_PRODUCTION,
|
||||
Cns_VERBOSE);
|
||||
else
|
||||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
switch (Enr_CheckIfICanRemUsrFromCrs ())
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
Enr_EffectivelyRemUsrFromCrs (&Gbl.Usrs.Other.UsrDat,
|
||||
&Gbl.Hierarchy.Node[Hie_CRS],
|
||||
Enr_DO_NOT_REMOVE_USR_PRODUCTION,
|
||||
Cns_VERBOSE);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
@ -2951,7 +2966,6 @@ void Enr_ModifyUsr1 (void)
|
|||
Grp_ChangeMyGrps (Cns_QUIET);
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
Grp_ChangeOtherUsrGrps ();
|
||||
break;
|
||||
}
|
||||
|
@ -3206,7 +3220,6 @@ static void Enr_EffectivelyRemUsrFromCrs (struct Usr_Data *UsrDat,
|
|||
Rol_SetMyRoles ();
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
/* Now he/she does not belong to current course */
|
||||
UsrDat->Accepted = false;
|
||||
UsrDat->Roles.InCurrentCrs = Rol_USR;
|
||||
|
|
|
@ -2325,7 +2325,6 @@ unsigned Exa_DB_GetResults (MYSQL_RES **mysql_res,
|
|||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
case Usr_OTHER: // A teacher/admin watching the results of other users
|
||||
default:
|
||||
if (asprintf (&HidSesSubQuery,"%s","") < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
|
@ -2368,7 +2367,6 @@ unsigned Exa_DB_GetResults (MYSQL_RES **mysql_res,
|
|||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
case Usr_OTHER: // A teacher/admin watching the results of other users
|
||||
default:
|
||||
if (asprintf (&HidExaSubQuery,"%s","") < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
break;
|
||||
|
|
|
@ -178,55 +178,59 @@ void ExaPrn_ShowExamPrint (void)
|
|||
ExaSes_GetAndCheckPars (&Exams,&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 *****/
|
||||
Print.SesCod = Session.SesCod;
|
||||
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 *****/
|
||||
case Usr_I_CAN:
|
||||
/***** Set basic data of exam print *****/
|
||||
Print.SesCod = Session.SesCod;
|
||||
Print.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
|
||||
|
||||
/***** Get questions from database *****/
|
||||
ExaPrn_GetQuestionsForNewPrintFromDB (&Print,Exams.Exam.ExaCod);
|
||||
/***** Get exam print data from database *****/
|
||||
ExaPrn_GetPrintDataBySesCodAndUsrCod (&Print);
|
||||
|
||||
if (Print.NumQsts.All)
|
||||
if (Print.PrnCod <= 0) // Exam print does not exists ==> create it
|
||||
{
|
||||
/***** Create new exam print in database *****/
|
||||
ExaPrn_CreatePrint (&Print);
|
||||
/***** Set again basic data of exam 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 *****/
|
||||
ExaLog_SetPrnCod (Print.PrnCod);
|
||||
ExaLog_SetAction (ExaLog_START_EXAM);
|
||||
ExaLog_SetAction (ExaLog_RESUME_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 *****/
|
||||
ExaLog_SetPrnCod (Print.PrnCod);
|
||||
ExaLog_SetAction (ExaLog_RESUME_EXAM);
|
||||
ExaLog_SetIfCanAnswer (true);
|
||||
}
|
||||
|
||||
/***** Show test to be answered *****/
|
||||
ExaPrn_ShowExamPrintToFillIt (&Exams,&Print);
|
||||
/***** Show test to be answered *****/
|
||||
ExaPrn_ShowExamPrintToFillIt (&Exams,&Print);
|
||||
break;
|
||||
case Usr_I_CAN_NOT: // Session not open or accessible
|
||||
default:
|
||||
/***** Show warning *****/
|
||||
Ale_ShowAlert (Ale_INFO,Txt_You_dont_have_access_to_the_exam);
|
||||
break;
|
||||
}
|
||||
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);
|
||||
|
||||
/***** 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 ****/
|
||||
ExaLog_SetIfCanAnswer (true);
|
||||
case Usr_I_CAN:
|
||||
/***** Set log open to true ****/
|
||||
ExaLog_SetIfCanAnswer (true);
|
||||
|
||||
/***** Get questions and current user's answers of exam print from database *****/
|
||||
ExaPrn_GetPrintQuestionsFromDB (&Print);
|
||||
/***** Get questions and current user's answers of exam print from database *****/
|
||||
ExaPrn_GetPrintQuestionsFromDB (&Print);
|
||||
|
||||
/***** Get answers from form to assess a test *****/
|
||||
ExaPrn_GetAnswerFromForm (&Print,QstInd);
|
||||
/***** Get answers from form to assess a test *****/
|
||||
ExaPrn_GetAnswerFromForm (&Print,QstInd);
|
||||
|
||||
/***** Update answer in database *****/
|
||||
/* Compute question score and store in database */
|
||||
ExaPrn_ComputeScoreAndStoreQuestionOfPrint (&Print,QstInd);
|
||||
/***** Update answer in database *****/
|
||||
/* Compute question score and store in database */
|
||||
ExaPrn_ComputeScoreAndStoreQuestionOfPrint (&Print,QstInd);
|
||||
|
||||
/* Update exam print in database */
|
||||
Print.NumQsts.NotBlank = Exa_DB_GetNumQstsNotBlankInPrint (Print.PrnCod);
|
||||
Print.Score.All = Exa_DB_ComputeTotalScoreOfPrint (Print.PrnCod);
|
||||
Exa_DB_UpdatePrint (&Print);
|
||||
/* Update exam print in database */
|
||||
Print.NumQsts.NotBlank = Exa_DB_GetNumQstsNotBlankInPrint (Print.PrnCod);
|
||||
Print.Score.All = Exa_DB_ComputeTotalScoreOfPrint (Print.PrnCod);
|
||||
Exa_DB_UpdatePrint (&Print);
|
||||
|
||||
/***** Show table with questions to answer *****/
|
||||
ExaPrn_ShowTableWithQstsToFill (&Exams,&Print);
|
||||
}
|
||||
else // Not accessible to answer
|
||||
{
|
||||
/***** Set log open to false ****/
|
||||
ExaLog_SetIfCanAnswer (false);
|
||||
/***** Show table with questions to answer *****/
|
||||
ExaPrn_ShowTableWithQstsToFill (&Exams,&Print);
|
||||
break;
|
||||
case Usr_I_CAN_NOT: // Not accessible to answer
|
||||
default:
|
||||
/***** Set log open to false ****/
|
||||
ExaLog_SetIfCanAnswer (false);
|
||||
|
||||
/***** Show warning *****/
|
||||
Ale_ShowAlert (Ale_INFO,Txt_You_dont_have_access_to_the_exam);
|
||||
/***** Show warning *****/
|
||||
Ale_ShowAlert (Ale_INFO,Txt_You_dont_have_access_to_the_exam);
|
||||
|
||||
/***** Form to end/close this exam print *****/
|
||||
Frm_BeginForm (ActEndExaPrn);
|
||||
ExaSes_PutParsEdit (&Exams);
|
||||
Btn_PutCreateButton (Txt_Continue);
|
||||
Frm_EndForm ();
|
||||
/***** Form to end/close this exam print *****/
|
||||
Frm_BeginForm (ActEndExaPrn);
|
||||
ExaSes_PutParsEdit (&Exams);
|
||||
Btn_PutCreateButton (Txt_Continue);
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -825,8 +825,7 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
|
||||
/* Write session title */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
HTM_Txt (Session.Title);
|
||||
HTM_TD_End ();
|
||||
|
||||
|
@ -850,183 +849,224 @@ static void ExaRes_ShowResults (struct Exa_Exams *Exams,
|
|||
|
||||
/* Write total number of questions */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Valid questions */
|
||||
HTM_TD_Begin ("class=\"RT DAT_GREEN_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Total)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Total);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
if (Print.NumQsts.Valid.Total)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Total);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Invalid questions */
|
||||
HTM_TD_Begin ("class=\"RT DAT_RED_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
NumQstsInvalid = Print.NumQsts.All - Print.NumQsts.Valid.Total;
|
||||
if (NumQstsInvalid)
|
||||
HTM_Unsigned (NumQstsInvalid);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
NumQstsInvalid = Print.NumQsts.All -
|
||||
Print.NumQsts.Valid.Total;
|
||||
if (NumQstsInvalid)
|
||||
HTM_Unsigned (NumQstsInvalid);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write number of correct questions */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Correct)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Correct);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
if (Print.NumQsts.Valid.Correct)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Correct);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write number of wrong questions */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Wrong.Negative)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Negative);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
if (Print.NumQsts.Valid.Wrong.Negative)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Negative);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Wrong.Zero)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Zero);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
if (Print.NumQsts.Valid.Wrong.Zero)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Zero);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Wrong.Positive)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Positive);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
if (Print.NumQsts.Valid.Wrong.Positive)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Wrong.Positive);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write number of blank questions */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
if (Print.NumQsts.Valid.Blank)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Blank);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
if (Print.NumQsts.Valid.Blank)
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Blank);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write score valid (taking into account only valid questions) */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
HTM_Double2Decimals (Print.Score.Valid);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Total);
|
||||
case Usr_I_CAN:
|
||||
HTM_Double2Decimals (Print.Score.Valid);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print.NumQsts.Valid.Total);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write average score per question (taking into account only valid questions) */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
HTM_Double2Decimals (Print.NumQsts.Valid.Total ? Print.Score.Valid /
|
||||
(double) Print.NumQsts.Valid.Total :
|
||||
0.0);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
HTM_Double2Decimals (Print.NumQsts.Valid.Total ? Print.Score.Valid /
|
||||
(double) Print.NumQsts.Valid.Total :
|
||||
0.0);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write grade over maximum grade (taking into account only valid questions) */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid.Total,Print.Score.Valid,Exam.MaxGrade);
|
||||
TstPrn_ShowGrade (Grade,Exam.MaxGrade);
|
||||
TotalGrade += Grade;
|
||||
case Usr_I_CAN:
|
||||
Grade = TstPrn_ComputeGrade (Print.NumQsts.Valid.Total,Print.Score.Valid,Exam.MaxGrade);
|
||||
TstPrn_ShowGrade (Grade,Exam.MaxGrade);
|
||||
TotalGrade += Grade;
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Link to show this result */
|
||||
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",The_GetColorRows ());
|
||||
switch (ICanView.Result)
|
||||
{
|
||||
Exams->Exam.ExaCod = Session.ExaCod;
|
||||
Exams->SesCod = Session.SesCod;
|
||||
switch (MeOrOther)
|
||||
{
|
||||
case Usr_ME:
|
||||
Frm_BeginForm (ActSeeOneExaResMe);
|
||||
ExaSes_PutParsEdit (Exams);
|
||||
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneExaResMe);
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
Frm_BeginForm (ActSeeOneExaResOth);
|
||||
ExaSes_PutParsEdit (Exams);
|
||||
Usr_PutParOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
|
||||
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneExaResOth);
|
||||
break;
|
||||
}
|
||||
Frm_EndForm ();
|
||||
case Usr_I_CAN:
|
||||
Exams->Exam.ExaCod = Session.ExaCod;
|
||||
Exams->SesCod = Session.SesCod;
|
||||
switch (MeOrOther)
|
||||
{
|
||||
case Usr_ME:
|
||||
Frm_BeginForm (ActSeeOneExaResMe);
|
||||
ExaSes_PutParsEdit (Exams);
|
||||
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneExaResMe);
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
Frm_BeginForm (ActSeeOneExaResOth);
|
||||
ExaSes_PutParsEdit (Exams);
|
||||
Usr_PutParOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
|
||||
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneExaResOth);
|
||||
break;
|
||||
}
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
HTM_TR_End ();
|
||||
|
@ -1280,7 +1320,6 @@ void ExaRes_ShowOneExaResult (void)
|
|||
UsrDat = &Gbl.Usrs.Me.UsrDat;
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
UsrDat = &Gbl.Usrs.Other.UsrDat;
|
||||
Usr_GetParOtherUsrCodEncrypted (UsrDat);
|
||||
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...
|
||||
// ...because I should be able to see old exams made in old groups to which I belonged
|
||||
|
||||
if (ICanView->Result == Usr_I_CAN)
|
||||
// Depends on 5 visibility icons associated to exam
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (Exam->Visibility) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
else
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
switch (ICanView->Result)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
// Depends on 5 visibility icons associated to exam
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (Exam->Visibility) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
|
@ -1602,32 +1647,36 @@ static void ExaRes_ShowExamResultNumQsts (struct ExaPrn_Print *Print,
|
|||
|
||||
/***** Number of questions *****/
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanView->Result == Usr_I_CAN)
|
||||
switch (ICanView->Result)
|
||||
{
|
||||
HTM_TxtF ("%u",Print->NumQsts.All);
|
||||
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
||||
{
|
||||
HTM_Txt (" (");
|
||||
case Usr_I_CAN:
|
||||
HTM_TxtF ("%u",Print->NumQsts.All);
|
||||
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
||||
{
|
||||
HTM_Txt (" (");
|
||||
|
||||
/* Valid questions */
|
||||
HTM_SPAN_Begin ("class=\"DAT_GREEN_%s\"",The_GetSuffix ());
|
||||
HTM_TxtColonNBSP (Txt_QUESTIONS_valid);
|
||||
HTM_Unsigned (Print->NumQsts.Valid.Total);
|
||||
HTM_SPAN_End ();
|
||||
/* Valid questions */
|
||||
HTM_SPAN_Begin ("class=\"DAT_GREEN_%s\"",The_GetSuffix ());
|
||||
HTM_TxtColonNBSP (Txt_QUESTIONS_valid);
|
||||
HTM_Unsigned (Print->NumQsts.Valid.Total);
|
||||
HTM_SPAN_End ();
|
||||
|
||||
HTM_TxtF ("; ");
|
||||
HTM_TxtF ("; ");
|
||||
|
||||
/* Invalid questions */
|
||||
HTM_SPAN_Begin ("class=\"DAT_RED_%s\"",The_GetSuffix ());
|
||||
HTM_TxtColonNBSP (Txt_QUESTIONS_invalid);
|
||||
HTM_Unsigned (Print->NumQsts.All - Print->NumQsts.Valid.Total);
|
||||
HTM_SPAN_End ();
|
||||
/* Invalid questions */
|
||||
HTM_SPAN_Begin ("class=\"DAT_RED_%s\"",The_GetSuffix ());
|
||||
HTM_TxtColonNBSP (Txt_QUESTIONS_invalid);
|
||||
HTM_Unsigned (Print->NumQsts.All - Print->NumQsts.Valid.Total);
|
||||
HTM_SPAN_End ();
|
||||
|
||||
HTM_Txt (")");
|
||||
}
|
||||
HTM_Txt (")");
|
||||
}
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/***** Row end *****/
|
||||
|
@ -1656,19 +1705,25 @@ static void ExaRes_ShowExamResultNumAnss (struct ExaPrn_Print *Print,
|
|||
|
||||
/***** Number of answers *****/
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanView->Score == Usr_I_CAN)
|
||||
HTM_TxtF ("%s(<em>p<sub>i</sub></em>=1): %u; "
|
||||
"%s(-1≤<em>p<sub>i</sub></em><0): %u; "
|
||||
"%s(<em>p<sub>i</sub></em>=0): %u; "
|
||||
"%s(0<<em>p<sub>i</sub></em><1): %u; "
|
||||
"%s(<em>p<sub>i</sub></em>=0): %u",
|
||||
Txt_ANSWERS_correct,Print->NumQsts.Valid.Correct,
|
||||
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Negative,
|
||||
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Zero,
|
||||
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Positive,
|
||||
Txt_ANSWERS_blank ,Print->NumQsts.Valid.Blank);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
switch (ICanView->Score)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
HTM_TxtF ("%s(<em>p<sub>i</sub></em>=1): %u; "
|
||||
"%s(-1≤<em>p<sub>i</sub></em><0): %u; "
|
||||
"%s(<em>p<sub>i</sub></em>=0): %u; "
|
||||
"%s(0<<em>p<sub>i</sub></em><1): %u; "
|
||||
"%s(<em>p<sub>i</sub></em>=0): %u",
|
||||
Txt_ANSWERS_correct,Print->NumQsts.Valid.Correct,
|
||||
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Negative,
|
||||
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Zero,
|
||||
Txt_ANSWERS_wrong ,Print->NumQsts.Valid.Wrong.Positive,
|
||||
Txt_ANSWERS_blank ,Print->NumQsts.Valid.Blank);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
/***** Row end *****/
|
||||
|
@ -1695,31 +1750,35 @@ static void ExaRes_ShowExamResultScore (struct ExaPrn_Print *Print,
|
|||
|
||||
/***** Score *****/
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanView->Score == Usr_I_CAN)
|
||||
switch (ICanView->Score)
|
||||
{
|
||||
/* Score counting all questions */
|
||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||
HTM_STRONG_Begin ();
|
||||
HTM_Double2Decimals (Print->Score.All);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print->NumQsts.All);
|
||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||
HTM_STRONG_End ();
|
||||
case Usr_I_CAN:
|
||||
/* Score counting all questions */
|
||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||
HTM_STRONG_Begin ();
|
||||
HTM_Double2Decimals (Print->Score.All);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print->NumQsts.All);
|
||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||
HTM_STRONG_End ();
|
||||
|
||||
/* Scoure counting only valid questions */
|
||||
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
||||
{
|
||||
HTM_Txt ("; ");
|
||||
HTM_TxtColonNBSP (Txt_valid_score);
|
||||
HTM_STRONG_Begin ();
|
||||
HTM_Double2Decimals (Print->Score.Valid);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print->NumQsts.Valid.Total);
|
||||
HTM_STRONG_End ();
|
||||
}
|
||||
/* Scoure counting only valid questions */
|
||||
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
||||
{
|
||||
HTM_Txt ("; ");
|
||||
HTM_TxtColonNBSP (Txt_valid_score);
|
||||
HTM_STRONG_Begin ();
|
||||
HTM_Double2Decimals (Print->Score.Valid);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print->NumQsts.Valid.Total);
|
||||
HTM_STRONG_End ();
|
||||
}
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/***** Row end *****/
|
||||
|
@ -1747,27 +1806,33 @@ static void ExaRes_ShowExamResultGrade (const struct Exa_Exam *Exam,
|
|||
|
||||
/***** Grade *****/
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanView->Score == Usr_I_CAN)
|
||||
switch (ICanView->Score)
|
||||
{
|
||||
/* Grade counting all questions */
|
||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||
HTM_STRONG_Begin ();
|
||||
TstPrn_ComputeAndShowGrade (Print->NumQsts.All,Print->Score.All,Exam->MaxGrade);
|
||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||
HTM_STRONG_End ();
|
||||
case Usr_I_CAN:
|
||||
/* Grade counting all questions */
|
||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||
HTM_STRONG_Begin ();
|
||||
TstPrn_ComputeAndShowGrade (Print->NumQsts.All,Print->Score.All,Exam->MaxGrade);
|
||||
if (Print->NumQsts.All == Print->NumQsts.Valid.Total)
|
||||
HTM_STRONG_End ();
|
||||
|
||||
/* Grade counting only valid questions */
|
||||
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
||||
{
|
||||
HTM_Txt ("; ");
|
||||
HTM_TxtColonNBSP (Txt_valid_grade);
|
||||
HTM_STRONG_Begin ();
|
||||
TstPrn_ComputeAndShowGrade (Print->NumQsts.Valid.Total,Print->Score.Valid,Exam->MaxGrade);
|
||||
HTM_STRONG_End ();
|
||||
}
|
||||
/* Grade counting only valid questions */
|
||||
if (Print->NumQsts.All != Print->NumQsts.Valid.Total)
|
||||
{
|
||||
HTM_Txt ("; ");
|
||||
HTM_TxtColonNBSP (Txt_valid_grade);
|
||||
HTM_STRONG_Begin ();
|
||||
TstPrn_ComputeAndShowGrade (Print->NumQsts.Valid.Total,
|
||||
Print->Score.Valid,
|
||||
Exam->MaxGrade);
|
||||
HTM_STRONG_End ();
|
||||
}
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/***** Row end *****/
|
||||
|
|
|
@ -127,7 +127,7 @@ void ExaSes_ResetSession (struct ExaSes_Session *Session)
|
|||
Session->TimeUTC[StartEndTime] = (time_t) 0;
|
||||
Session->Title[0] = '\0';
|
||||
Session->HiddenOrVisible = HidVis_VISIBLE;
|
||||
Session->Open = false;
|
||||
Session->Open = CloOpe_CLOSED;
|
||||
Session->ShowUsrResults = false;
|
||||
};
|
||||
|
||||
|
@ -469,8 +469,8 @@ static void ExaSes_ListOneOrMoreSessionsTimes (const struct ExaSes_Session *Sess
|
|||
StartEndTime <= (Dat_StartEndTime_t) (Dat_NUM_START_END_TIME - 1);
|
||||
StartEndTime++)
|
||||
{
|
||||
DateClass = Session->Open ? HidVis_DateGreenClass[Session->HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Session->HiddenOrVisible];
|
||||
DateClass = Session->Open == CloOpe_OPEN ? HidVis_DateGreenClass[Session->HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Session->HiddenOrVisible];
|
||||
|
||||
if (asprintf (&Id,"exa_time_%u_%u",(unsigned) StartEndTime,UniqueId) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
|
@ -500,27 +500,29 @@ static void ExaSes_ListOneOrMoreSessionsTitleGrps (struct Exa_Exams *Exams,
|
|||
|
||||
/***** Session title *****/
|
||||
HTM_ARTICLE_Begin (Anchor);
|
||||
if (ExaSes_CheckIfICanAnswerThisSession (&Exams->Exam,Session) == Usr_I_CAN)
|
||||
switch (ExaSes_CheckIfICanAnswerThisSession (&Exams->Exam,Session))
|
||||
{
|
||||
Frm_BeginForm (ActSeeExaPrn);
|
||||
Exa_PutPars (Exams);
|
||||
ParCod_PutPar (ParCod_Ses,Session->SesCod);
|
||||
HTM_BUTTON_Submit_Begin (Gbl.Usrs.Me.Role.Logged == Rol_STD ? Txt_Play :
|
||||
Txt_Resume,
|
||||
"class=\"LT BT_LINK %s_%s\"",
|
||||
HidVis_TitleClass[Session->HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
case Usr_I_CAN:
|
||||
Frm_BeginForm (ActSeeExaPrn);
|
||||
Exa_PutPars (Exams);
|
||||
ParCod_PutPar (ParCod_Ses,Session->SesCod);
|
||||
HTM_BUTTON_Submit_Begin (Gbl.Usrs.Me.Role.Logged == Rol_STD ? Txt_Play :
|
||||
Txt_Resume,
|
||||
"class=\"LT BT_LINK %s_%s\"",
|
||||
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_BUTTON_End ();
|
||||
Frm_EndForm ();
|
||||
}
|
||||
else
|
||||
{
|
||||
HTM_SPAN_Begin ("class=\"%s_%s\"",
|
||||
HidVis_TitleClass[Session->HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Session->Title);
|
||||
HTM_SPAN_End ();
|
||||
HTM_SPAN_End ();
|
||||
break;
|
||||
}
|
||||
HTM_ARTICLE_End ();
|
||||
|
||||
|
@ -650,25 +652,27 @@ static void ExaSes_ListOneOrMoreSessionsResultTch (struct Exa_Exams *Exams,
|
|||
"trophy.svg",Ico_BLACK);
|
||||
|
||||
/***** 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 *****/
|
||||
if (Session->ShowUsrResults)
|
||||
Lay_PutContextualLinkOnlyIcon (ActChgVisExaRes,NULL,
|
||||
ExaSes_PutParsEdit,Exams,
|
||||
"eye.svg",Ico_GREEN);
|
||||
else
|
||||
Lay_PutContextualLinkOnlyIcon (ActChgVisExaRes,NULL,
|
||||
ExaSes_PutParsEdit,Exams,
|
||||
"eye-slash.svg",Ico_RED);
|
||||
}
|
||||
else // Don't put form
|
||||
{
|
||||
/***** Put icon showing the current visibility of session results *****/
|
||||
if (Session->ShowUsrResults)
|
||||
Ico_PutIconOff ("eye.svg" ,Ico_GREEN,Txt_Visible_results);
|
||||
else
|
||||
Ico_PutIconOff ("eye-slash.svg",Ico_RED ,Txt_Hidden_results);
|
||||
case Usr_I_CAN:
|
||||
/***** Put form to change visibility of session results *****/
|
||||
if (Session->ShowUsrResults)
|
||||
Lay_PutContextualLinkOnlyIcon (ActChgVisExaRes,NULL,
|
||||
ExaSes_PutParsEdit,Exams,
|
||||
"eye.svg",Ico_GREEN);
|
||||
else
|
||||
Lay_PutContextualLinkOnlyIcon (ActChgVisExaRes,NULL,
|
||||
ExaSes_PutParsEdit,Exams,
|
||||
"eye-slash.svg",Ico_RED);
|
||||
break;
|
||||
case Usr_I_CAN_NOT: // Don't put form
|
||||
default:
|
||||
/***** Put icon showing the current visibility of session results *****/
|
||||
if (Session->ShowUsrResults)
|
||||
Ico_PutIconOff ("eye.svg" ,Ico_GREEN,Txt_Visible_results);
|
||||
else
|
||||
Ico_PutIconOff ("eye-slash.svg",Ico_RED ,Txt_Hidden_results);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -747,7 +751,8 @@ static void ExaSes_GetSessionDataFromRow (MYSQL_RES *mysql_res,
|
|||
Session->TimeUTC[StartEndTime] = Dat_GetUNIXTimeFromStr (row[4 + StartEndTime]);
|
||||
|
||||
/* Get whether the session is open or closed (row(6)) */
|
||||
Session->Open = (row[6][0] == '1');
|
||||
Session->Open = (row[6][0] == '1') ? CloOpe_OPEN :
|
||||
CloOpe_CLOSED;
|
||||
|
||||
/* Get the title of the session (row[7]) */
|
||||
if (row[7])
|
||||
|
@ -1214,7 +1219,7 @@ Usr_ICan_t ExaSes_CheckIfICanAnswerThisSession (const struct Exa_Exam *Exam,
|
|||
2. Hidden or closed sessions are not accesible *****/
|
||||
if (Exam->HiddenOrVisible == HidVis_HIDDEN ||
|
||||
Session->HiddenOrVisible == HidVis_HIDDEN ||
|
||||
!Session->Open)
|
||||
Session->Open == CloOpe_CLOSED)
|
||||
return Usr_I_CAN_NOT;
|
||||
|
||||
/***** Exam is visible, session is visible and open ==>
|
||||
|
|
|
@ -588,11 +588,17 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams,
|
|||
The_GetColorRows ());
|
||||
|
||||
/* Put icon to remove the set */
|
||||
if (ICanEditSets == Usr_I_CAN)
|
||||
Ico_PutContextualIconToRemove (ActReqRemExaSet,NULL,
|
||||
ExaSet_PutParsOneSet,Exams);
|
||||
else
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
switch (ICanEditSets)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
Ico_PutContextualIconToRemove (ActReqRemExaSet,NULL,
|
||||
ExaSet_PutParsOneSet,Exams);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
break;
|
||||
}
|
||||
|
||||
/* Put icon to move up the question */
|
||||
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 ());
|
||||
|
||||
/* Put icon to remove the question */
|
||||
if (ICanEditQuestions == Usr_I_CAN)
|
||||
Ico_PutContextualIconToRemove (ActReqRemSetQst,NULL,
|
||||
ExaSet_PutParsOneQst,Exams);
|
||||
else
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
switch (ICanEditQuestions)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
Ico_PutContextualIconToRemove (ActReqRemSetQst,NULL,
|
||||
ExaSet_PutParsOneQst,Exams);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
break;
|
||||
}
|
||||
|
||||
/* Put icon to validate/invalidate the question */
|
||||
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)
|
||||
{
|
||||
if (Exa_CheckIfICanEditExams () == Usr_I_CAN)
|
||||
/***** Questions are editable only if exam has no sessions *****/
|
||||
return (Exam->NumSess == 0) ? Usr_I_CAN : // Exams with sessions should not be edited
|
||||
Usr_I_CAN_NOT;
|
||||
else
|
||||
return Usr_I_CAN_NOT; // Sets of questions are not editable
|
||||
switch (Exa_CheckIfICanEditExams ())
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
/***** Questions are editable only if exam has no sessions *****/
|
||||
return (Exam->NumSess == 0) ? Usr_I_CAN : // Exams with sessions should not be edited
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
return Usr_I_CAN_NOT; // Sets of questions are not editable
|
||||
break;
|
||||
}
|
||||
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -148,8 +148,8 @@ struct ExaSes_Session
|
|||
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
||||
char Title[ExaSes_MAX_BYTES_TITLE + 1];
|
||||
HidVis_HiddenOrVisible_t HiddenOrVisible;
|
||||
bool Open; // If now is between start and end dates
|
||||
bool ShowUsrResults; // Show exam with results of all questions for the student
|
||||
CloOpe_ClosedOrOpen_t Open; // If now is between start and end dates
|
||||
bool ShowUsrResults; // Show exam with results of all questions for the student
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
209
swad_forum.c
209
swad_forum.c
|
@ -322,7 +322,7 @@ static void For_PutParsNewPost (void *Forums);
|
|||
static void For_ShowAForumPost (struct For_Forums *Forums,
|
||||
unsigned PstNum,
|
||||
bool LastPst,char LastSubject[Cns_MAX_BYTES_SUBJECT + 1],
|
||||
bool NewPst,bool ICanModerateForum);
|
||||
bool NewPst,Usr_ICan_t ICanModerateForum);
|
||||
static void For_GetPstData (long PstCod,long *UsrCod,time_t *CreatTimeUTC,
|
||||
char Subject[Cns_MAX_BYTES_SUBJECT + 1],
|
||||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1],
|
||||
|
@ -711,7 +711,7 @@ void For_ShowPostsOfAThread (struct For_Forums *Forums,
|
|||
time_t CreatTimeUTC; // Creation time of post
|
||||
struct Pag_Pagination PaginationPsts;
|
||||
bool NewPst = false;
|
||||
bool ICanModerateForum = false;
|
||||
Usr_ICan_t ICanModerateForum = Usr_I_CAN_NOT;
|
||||
|
||||
/***** Get data of the thread *****/
|
||||
Thread.ThrCod =
|
||||
|
@ -751,26 +751,31 @@ void For_ShowPostsOfAThread (struct For_Forums *Forums,
|
|||
case For_FORUM_GLOBAL_TCHS:
|
||||
case For_FORUM__SWAD__USRS:
|
||||
case For_FORUM__SWAD__TCHS:
|
||||
ICanModerateForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
|
||||
ICanModerateForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_INSTIT_USRS:
|
||||
case For_FORUM_INSTIT_TCHS:
|
||||
ICanModerateForum = (Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM);
|
||||
ICanModerateForum = (Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_CENTER_USRS:
|
||||
case For_FORUM_CENTER_TCHS:
|
||||
ICanModerateForum = (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM);
|
||||
ICanModerateForum = (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_DEGREE_USRS:
|
||||
case For_FORUM_DEGREE_TCHS:
|
||||
case For_FORUM_COURSE_TCHS:
|
||||
ICanModerateForum = (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM);
|
||||
ICanModerateForum = (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_COURSE_USRS:
|
||||
ICanModerateForum = (Gbl.Usrs.Me.Role.Logged >= Rol_TCH);
|
||||
ICanModerateForum = (Gbl.Usrs.Me.Role.Logged >= Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
default:
|
||||
ICanModerateForum = false;
|
||||
ICanModerateForum = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -896,7 +901,7 @@ static void For_PutParsNewPost (void *Forums)
|
|||
static void For_ShowAForumPost (struct For_Forums *Forums,
|
||||
unsigned PstNum,
|
||||
bool LastPst,char LastSubject[Cns_MAX_BYTES_SUBJECT + 1],
|
||||
bool NewPst,bool ICanModerateForum)
|
||||
bool NewPst,Usr_ICan_t ICanModerateForum)
|
||||
{
|
||||
extern const char *Txt_MSG_New;
|
||||
extern const char *Txt_MSG_Open;
|
||||
|
@ -999,22 +1004,24 @@ static void For_ShowAForumPost (struct For_Forums *Forums,
|
|||
/***** Form to ban/unban post *****/
|
||||
HTM_TD_Begin ("class=\"CONTEXT_COL\"");
|
||||
|
||||
if (ICanModerateForum)
|
||||
switch (ICanModerateForum)
|
||||
{
|
||||
NextAction = DisabledOrEnabled == Cns_ENABLED ? For_ActionsDisPstFor[Forums->Forum.Type] :
|
||||
For_ActionsEnbPstFor[Forums->Forum.Type];
|
||||
Frm_BeginFormAnchor (NextAction,For_FORUM_POSTS_SECTION_ID);
|
||||
For_PutParsForum (Forums);
|
||||
Ico_PutIconLink (Icon[DisabledOrEnabled],Color[DisabledOrEnabled],NextAction);
|
||||
Frm_EndForm ();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (asprintf (&Title,*TxtAllowedBanned[DisabledOrEnabled],PstNum) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
Ico_PutIcon (Icon[DisabledOrEnabled],Color[DisabledOrEnabled],Title,
|
||||
"ICO_HIDDEN ICO16x16");
|
||||
free (Title);
|
||||
case Usr_I_CAN:
|
||||
NextAction = DisabledOrEnabled == Cns_ENABLED ? For_ActionsDisPstFor[Forums->Forum.Type] :
|
||||
For_ActionsEnbPstFor[Forums->Forum.Type];
|
||||
Frm_BeginFormAnchor (NextAction,For_FORUM_POSTS_SECTION_ID);
|
||||
For_PutParsForum (Forums);
|
||||
Ico_PutIconLink (Icon[DisabledOrEnabled],Color[DisabledOrEnabled],NextAction);
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
if (asprintf (&Title,*TxtAllowedBanned[DisabledOrEnabled],PstNum) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
Ico_PutIcon (Icon[DisabledOrEnabled],Color[DisabledOrEnabled],Title,
|
||||
"ICO_HIDDEN ICO16x16");
|
||||
free (Title);
|
||||
break;
|
||||
}
|
||||
|
||||
/***** Form to remove post *****/
|
||||
|
@ -1228,9 +1235,9 @@ void For_ShowForumList (struct For_Forums *Forums)
|
|||
unsigned NumDegs;
|
||||
unsigned NumCrs;
|
||||
unsigned NumCrss;
|
||||
bool ICanSeeInsForum;
|
||||
bool ICanSeeCtrForum;
|
||||
bool ICanSeeDegForum;
|
||||
Usr_ICan_t ICanSeeInsForum;
|
||||
Usr_ICan_t ICanSeeCtrForum;
|
||||
Usr_ICan_t ICanSeeDegForum;
|
||||
|
||||
/***** Get if there is a thread ready to be moved *****/
|
||||
if (For_CheckIfICanMoveThreads () == Usr_I_CAN)
|
||||
|
@ -1257,40 +1264,43 @@ void For_ShowForumList (struct For_Forums *Forums)
|
|||
if (Gbl.Hierarchy.Node[Hie_INS].HieCod > 0)
|
||||
{
|
||||
if (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM)
|
||||
ICanSeeInsForum = true;
|
||||
ICanSeeInsForum = Usr_I_CAN;
|
||||
else
|
||||
ICanSeeInsForum = Hie_CheckIfIBelongTo (Hie_INS,Gbl.Hierarchy.Node[Hie_INS].HieCod);
|
||||
ICanSeeInsForum = Hie_CheckIfIBelongTo (Hie_INS,Gbl.Hierarchy.Node[Hie_INS].HieCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
else
|
||||
ICanSeeInsForum = false;
|
||||
ICanSeeInsForum = Usr_I_CAN_NOT;
|
||||
|
||||
/***** Links to forums about the platform *****/
|
||||
For_WriteLinksToPlatformForums (Forums,true,IsLastItemInLevel);
|
||||
|
||||
if (ICanSeeInsForum)
|
||||
if (ICanSeeInsForum == Usr_I_CAN)
|
||||
{
|
||||
if (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM)
|
||||
ICanSeeCtrForum = true;
|
||||
ICanSeeCtrForum = Usr_I_CAN;
|
||||
else
|
||||
ICanSeeCtrForum = Hie_CheckIfIBelongTo (Hie_CTR,Gbl.Hierarchy.Node[Hie_CTR].HieCod);
|
||||
ICanSeeCtrForum = Hie_CheckIfIBelongTo (Hie_CTR,Gbl.Hierarchy.Node[Hie_CTR].HieCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
/***** Links to forums of current institution *****/
|
||||
if (For_WriteLinksToInsForums (Forums,Gbl.Hierarchy.Node[Hie_INS].HieCod,
|
||||
true,
|
||||
IsLastItemInLevel) > 0)
|
||||
if (ICanSeeCtrForum)
|
||||
if (ICanSeeCtrForum == Usr_I_CAN)
|
||||
{
|
||||
if (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM)
|
||||
ICanSeeDegForum = true;
|
||||
ICanSeeDegForum = Usr_I_CAN;
|
||||
else
|
||||
ICanSeeDegForum = Hie_CheckIfIBelongTo (Hie_DEG,Gbl.Hierarchy.Node[Hie_DEG].HieCod);
|
||||
ICanSeeDegForum = Hie_CheckIfIBelongTo (Hie_DEG,Gbl.Hierarchy.Node[Hie_DEG].HieCod) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
/***** Links to forums of current center *****/
|
||||
if (For_WriteLinksToCtrForums (Forums,
|
||||
Gbl.Hierarchy.Node[Hie_CTR].HieCod,
|
||||
true,
|
||||
IsLastItemInLevel) > 0)
|
||||
if (ICanSeeDegForum)
|
||||
if (ICanSeeDegForum == Usr_I_CAN)
|
||||
/***** Links to forums of current degree *****/
|
||||
if (For_WriteLinksToDegForums (Forums,
|
||||
Gbl.Hierarchy.Node[Hie_DEG].HieCod,
|
||||
|
@ -1455,14 +1465,15 @@ static void For_WriteLinksToGblForums (const struct For_Forums *Forums,
|
|||
Lay_LastItem_t IsLastItemInLevel[1 + For_FORUM_MAX_LEVELS])
|
||||
{
|
||||
Lay_Highlight_t Highlight;
|
||||
bool ICanSeeTeacherForum;
|
||||
Usr_ICan_t ICanSeeTeacherForum;
|
||||
struct For_Forum Forum;
|
||||
|
||||
/***** Can I see teachers's forums? *****/
|
||||
Rol_GetRolesInAllCrss (&Gbl.Usrs.Me.UsrDat);
|
||||
ICanSeeTeacherForum = Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
(Gbl.Usrs.Me.UsrDat.Roles.InCrss & ((1 << Rol_NET) |
|
||||
(1 << Rol_TCH)));
|
||||
ICanSeeTeacherForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
(Gbl.Usrs.Me.UsrDat.Roles.InCrss & ((1 << Rol_NET) |
|
||||
(1 << Rol_TCH)))) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
/***** Link to forum global *****/
|
||||
Forum.Type = For_FORUM_GLOBAL_USRS;
|
||||
|
@ -1474,7 +1485,7 @@ static void For_WriteLinksToGblForums (const struct For_Forums *Forums,
|
|||
|
||||
/***** Link to forum of teachers global *****/
|
||||
Rol_GetRolesInAllCrss (&Gbl.Usrs.Me.UsrDat);
|
||||
if (ICanSeeTeacherForum)
|
||||
if (ICanSeeTeacherForum == Usr_I_CAN)
|
||||
{
|
||||
Forum.Type = For_FORUM_GLOBAL_TCHS;
|
||||
Forum.HieCod = -1L;
|
||||
|
@ -1494,26 +1505,28 @@ static void For_WriteLinksToPlatformForums (const struct For_Forums *Forums,
|
|||
Lay_LastItem_t IsLastItemInLevel[1 + For_FORUM_MAX_LEVELS])
|
||||
{
|
||||
Lay_Highlight_t Highlight;
|
||||
bool ICanSeeTeacherForum;
|
||||
Usr_ICan_t ICanSeeTeacherForum;
|
||||
struct For_Forum Forum;
|
||||
|
||||
/***** Can I see teachers's forums? *****/
|
||||
Rol_GetRolesInAllCrss (&Gbl.Usrs.Me.UsrDat);
|
||||
ICanSeeTeacherForum = Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
(Gbl.Usrs.Me.UsrDat.Roles.InCrss & ((1 << Rol_NET) |
|
||||
(1 << Rol_TCH)));
|
||||
ICanSeeTeacherForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
(Gbl.Usrs.Me.UsrDat.Roles.InCrss & ((1 << Rol_NET) |
|
||||
(1 << Rol_TCH)))) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
/***** Link to forum of users about the platform *****/
|
||||
Forum.Type = For_FORUM__SWAD__USRS;
|
||||
Forum.HieCod = -1L;
|
||||
Highlight = (Forums->Forum.Type == For_FORUM__SWAD__USRS) ? Lay_HIGHLIGHT :
|
||||
Lay_NO_HIGHLIGHT;
|
||||
IsLastItemInLevel[1] = (IsLastForum && !ICanSeeTeacherForum) ? Lay_LAST_ITEM :
|
||||
Lay_NO_LAST_ITEM;
|
||||
IsLastItemInLevel[1] = (IsLastForum &&
|
||||
ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM :
|
||||
Lay_NO_LAST_ITEM;
|
||||
For_WriteLinkToForum (Forums,&Forum,Highlight,1,IsLastItemInLevel);
|
||||
|
||||
/***** Link to forum of teachers about the platform *****/
|
||||
if (ICanSeeTeacherForum)
|
||||
if (ICanSeeTeacherForum == Usr_I_CAN)
|
||||
{
|
||||
Forum.Type = For_FORUM__SWAD__TCHS;
|
||||
Forum.HieCod = -1L;
|
||||
|
@ -1536,15 +1549,16 @@ static long For_WriteLinksToInsForums (const struct For_Forums *Forums,
|
|||
{
|
||||
Lay_Highlight_t Highlight;
|
||||
Rol_Role_t MaxRoleInIns;
|
||||
bool ICanSeeTeacherForum;
|
||||
Usr_ICan_t ICanSeeTeacherForum;
|
||||
struct For_Forum Forum;
|
||||
|
||||
if (InsCod > 0)
|
||||
{
|
||||
MaxRoleInIns = Rol_GetMyMaxRoleIn (Hie_INS,InsCod);
|
||||
ICanSeeTeacherForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRoleInIns == Rol_NET ||
|
||||
MaxRoleInIns == Rol_TCH);
|
||||
ICanSeeTeacherForum = ((Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRoleInIns == Rol_NET ||
|
||||
MaxRoleInIns == Rol_TCH)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
/***** Link to the forum of users from this institution *****/
|
||||
Forum.Type = For_FORUM_INSTIT_USRS;
|
||||
|
@ -1552,12 +1566,13 @@ static long For_WriteLinksToInsForums (const struct For_Forums *Forums,
|
|||
Highlight = (Forums->Forum.Type == For_FORUM_INSTIT_USRS &&
|
||||
Forums->Forum.HieCod == InsCod) ? Lay_HIGHLIGHT :
|
||||
Lay_NO_HIGHLIGHT;
|
||||
IsLastItemInLevel[2] = (IsLastIns && !ICanSeeTeacherForum) ? Lay_LAST_ITEM :
|
||||
Lay_NO_LAST_ITEM;
|
||||
IsLastItemInLevel[2] = (IsLastIns &&
|
||||
ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM :
|
||||
Lay_NO_LAST_ITEM;
|
||||
For_WriteLinkToForum (Forums,&Forum,Highlight,2,IsLastItemInLevel);
|
||||
|
||||
/***** Link to forum of teachers from this institution *****/
|
||||
if (ICanSeeTeacherForum)
|
||||
if (ICanSeeTeacherForum == Usr_I_CAN)
|
||||
{
|
||||
Forum.Type = For_FORUM_INSTIT_TCHS;
|
||||
Forum.HieCod = InsCod;
|
||||
|
@ -1583,15 +1598,16 @@ static long For_WriteLinksToCtrForums (const struct For_Forums *Forums,
|
|||
{
|
||||
Lay_Highlight_t Highlight;
|
||||
Rol_Role_t MaxRoleInCtr;
|
||||
bool ICanSeeTeacherForum;
|
||||
Usr_ICan_t ICanSeeTeacherForum;
|
||||
struct For_Forum Forum;
|
||||
|
||||
if (CtrCod > 0)
|
||||
{
|
||||
MaxRoleInCtr = Rol_GetMyMaxRoleIn (Hie_CTR,CtrCod);
|
||||
ICanSeeTeacherForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRoleInCtr == Rol_NET ||
|
||||
MaxRoleInCtr == Rol_TCH);
|
||||
ICanSeeTeacherForum = ((Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRoleInCtr == Rol_NET ||
|
||||
MaxRoleInCtr == Rol_TCH)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
/***** Link to the forum of users from this center *****/
|
||||
Forum.Type = For_FORUM_CENTER_USRS;
|
||||
|
@ -1599,12 +1615,13 @@ static long For_WriteLinksToCtrForums (const struct For_Forums *Forums,
|
|||
Highlight = (Forums->Forum.Type == For_FORUM_CENTER_USRS &&
|
||||
Forums->Forum.HieCod == CtrCod) ? Lay_HIGHLIGHT :
|
||||
Lay_NO_HIGHLIGHT;
|
||||
IsLastItemInLevel[3] = (IsLastCtr && !ICanSeeTeacherForum) ? Lay_LAST_ITEM :
|
||||
Lay_NO_LAST_ITEM;
|
||||
IsLastItemInLevel[3] = (IsLastCtr &&
|
||||
ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM :
|
||||
Lay_NO_LAST_ITEM;
|
||||
For_WriteLinkToForum (Forums,&Forum,Highlight,3,IsLastItemInLevel);
|
||||
|
||||
/***** Link to forum of teachers from this center *****/
|
||||
if (ICanSeeTeacherForum)
|
||||
if (ICanSeeTeacherForum == Usr_I_CAN)
|
||||
{
|
||||
Forum.Type = For_FORUM_CENTER_TCHS;
|
||||
Forum.HieCod = CtrCod;
|
||||
|
@ -1630,15 +1647,16 @@ static long For_WriteLinksToDegForums (const struct For_Forums *Forums,
|
|||
{
|
||||
Lay_Highlight_t Highlight;
|
||||
Rol_Role_t MaxRoleInDeg;
|
||||
bool ICanSeeTeacherForum;
|
||||
Usr_ICan_t ICanSeeTeacherForum;
|
||||
struct For_Forum Forum;
|
||||
|
||||
if (DegCod > 0)
|
||||
{
|
||||
MaxRoleInDeg = Rol_GetMyMaxRoleIn (Hie_DEG,DegCod);
|
||||
ICanSeeTeacherForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRoleInDeg == Rol_NET ||
|
||||
MaxRoleInDeg == Rol_TCH);
|
||||
ICanSeeTeacherForum = ((Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRoleInDeg == Rol_NET ||
|
||||
MaxRoleInDeg == Rol_TCH)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
/***** Link to the forum of users from this degree *****/
|
||||
Forum.Type = For_FORUM_DEGREE_USRS;
|
||||
|
@ -1646,12 +1664,13 @@ static long For_WriteLinksToDegForums (const struct For_Forums *Forums,
|
|||
Highlight = (Forums->Forum.Type == For_FORUM_DEGREE_USRS &&
|
||||
Forums->Forum.HieCod == DegCod) ? Lay_HIGHLIGHT :
|
||||
Lay_NO_HIGHLIGHT;
|
||||
IsLastItemInLevel[4] = (IsLastDeg && !ICanSeeTeacherForum) ? Lay_LAST_ITEM :
|
||||
Lay_NO_LAST_ITEM;
|
||||
IsLastItemInLevel[4] = (IsLastDeg &&
|
||||
ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM :
|
||||
Lay_NO_LAST_ITEM;
|
||||
For_WriteLinkToForum (Forums,&Forum,Highlight,4,IsLastItemInLevel);
|
||||
|
||||
/***** Link to forum of teachers from this degree *****/
|
||||
if (ICanSeeTeacherForum)
|
||||
if (ICanSeeTeacherForum == Usr_I_CAN)
|
||||
{
|
||||
Forum.Type = For_FORUM_DEGREE_TCHS;
|
||||
Forum.HieCod = DegCod;
|
||||
|
@ -1677,15 +1696,16 @@ static long For_WriteLinksToCrsForums (const struct For_Forums *Forums,
|
|||
{
|
||||
Lay_Highlight_t Highlight;
|
||||
Rol_Role_t MyRoleInCrs;
|
||||
bool ICanSeeTeacherForum;
|
||||
Usr_ICan_t ICanSeeTeacherForum;
|
||||
struct For_Forum Forum;
|
||||
|
||||
if (CrsCod > 0)
|
||||
{
|
||||
MyRoleInCrs = Rol_GetMyRoleInCrs (CrsCod);
|
||||
ICanSeeTeacherForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MyRoleInCrs == Rol_NET ||
|
||||
MyRoleInCrs == Rol_TCH);
|
||||
ICanSeeTeacherForum = ((Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MyRoleInCrs == Rol_NET ||
|
||||
MyRoleInCrs == Rol_TCH)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
/***** Link to the forum of users from this course *****/
|
||||
Forum.Type = For_FORUM_COURSE_USRS;
|
||||
|
@ -1693,12 +1713,12 @@ static long For_WriteLinksToCrsForums (const struct For_Forums *Forums,
|
|||
Highlight = (Forums->Forum.Type == For_FORUM_COURSE_USRS &&
|
||||
Forums->Forum.HieCod == CrsCod) ? Lay_HIGHLIGHT :
|
||||
Lay_NO_HIGHLIGHT;
|
||||
IsLastItemInLevel[5] = (IsLastCrs && !ICanSeeTeacherForum) ? Lay_LAST_ITEM :
|
||||
Lay_NO_LAST_ITEM;
|
||||
IsLastItemInLevel[5] = (IsLastCrs && ICanSeeTeacherForum == Usr_I_CAN_NOT) ? Lay_LAST_ITEM :
|
||||
Lay_NO_LAST_ITEM;
|
||||
For_WriteLinkToForum (Forums,&Forum,Highlight,5,IsLastItemInLevel);
|
||||
|
||||
/***** Link to forum of teachers from this course *****/
|
||||
if (ICanSeeTeacherForum)
|
||||
if (ICanSeeTeacherForum == Usr_I_CAN)
|
||||
{
|
||||
Forum.Type = For_FORUM_COURSE_TCHS;
|
||||
Forum.HieCod = CrsCod;
|
||||
|
@ -2674,78 +2694,87 @@ static void For_SetForumType (struct For_Forums *Forums)
|
|||
static void For_RestrictAccess (const struct For_Forums *Forums)
|
||||
{
|
||||
Rol_Role_t MaxRole;
|
||||
bool ICanSeeForum;
|
||||
Usr_ICan_t ICanSeeForum;
|
||||
|
||||
/***** Restrict access *****/
|
||||
switch (Forums->Forum.Type)
|
||||
{
|
||||
case For_FORUM_GLOBAL_USRS:
|
||||
case For_FORUM__SWAD__USRS:
|
||||
ICanSeeForum = true;
|
||||
ICanSeeForum = Usr_I_CAN;
|
||||
break;
|
||||
case For_FORUM_GLOBAL_TCHS:
|
||||
case For_FORUM__SWAD__TCHS:
|
||||
Rol_GetRolesInAllCrss (&Gbl.Usrs.Me.UsrDat);
|
||||
ICanSeeForum = (Gbl.Usrs.Me.UsrDat.Roles.InCrss & ((1 << Rol_NET) |
|
||||
(1 << Rol_TCH)));
|
||||
(1 << Rol_TCH))) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_INSTIT_USRS:
|
||||
MaxRole = Rol_GetMyMaxRoleIn (Hie_INS,Forums->Forum.HieCod);
|
||||
ICanSeeForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRole == Rol_STD ||
|
||||
MaxRole == Rol_NET ||
|
||||
MaxRole == Rol_TCH);
|
||||
MaxRole == Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_INSTIT_TCHS:
|
||||
MaxRole = Rol_GetMyMaxRoleIn (Hie_INS,Forums->Forum.HieCod);
|
||||
ICanSeeForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRole == Rol_NET ||
|
||||
MaxRole == Rol_TCH);
|
||||
MaxRole == Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_CENTER_USRS:
|
||||
MaxRole = Rol_GetMyMaxRoleIn (Hie_CTR,Forums->Forum.HieCod);
|
||||
ICanSeeForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRole >= Rol_STD ||
|
||||
MaxRole == Rol_NET ||
|
||||
MaxRole == Rol_TCH);
|
||||
MaxRole == Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_CENTER_TCHS:
|
||||
MaxRole = Rol_GetMyMaxRoleIn (Hie_CTR,Forums->Forum.HieCod);
|
||||
ICanSeeForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRole == Rol_NET ||
|
||||
MaxRole == Rol_TCH);
|
||||
MaxRole == Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_DEGREE_USRS:
|
||||
MaxRole = Rol_GetMyMaxRoleIn (Hie_DEG,Forums->Forum.HieCod);
|
||||
ICanSeeForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRole >= Rol_STD ||
|
||||
MaxRole == Rol_NET ||
|
||||
MaxRole == Rol_TCH);
|
||||
MaxRole == Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_DEGREE_TCHS:
|
||||
MaxRole = Rol_GetMyMaxRoleIn (Hie_DEG,Forums->Forum.HieCod);
|
||||
ICanSeeForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRole == Rol_NET ||
|
||||
MaxRole == Rol_TCH);
|
||||
MaxRole == Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_COURSE_USRS:
|
||||
MaxRole = Rol_GetMyRoleInCrs (Forums->Forum.HieCod);
|
||||
ICanSeeForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRole >= Rol_STD ||
|
||||
MaxRole == Rol_NET ||
|
||||
MaxRole == Rol_TCH);
|
||||
MaxRole == Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case For_FORUM_COURSE_TCHS:
|
||||
MaxRole = Rol_GetMyRoleInCrs (Forums->Forum.HieCod);
|
||||
ICanSeeForum = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
|
||||
MaxRole == Rol_NET ||
|
||||
MaxRole == Rol_TCH);
|
||||
MaxRole == Rol_TCH) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
default:
|
||||
ICanSeeForum = false;
|
||||
ICanSeeForum = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
if (!ICanSeeForum)
|
||||
if (ICanSeeForum == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
}
|
||||
|
||||
|
|
46
swad_game.c
46
swad_game.c
|
@ -348,10 +348,10 @@ static void Gam_ListAllGamesHeading (const struct Gam_Games *Games)
|
|||
|
||||
static Usr_ICan_t Gam_CheckIfICanEditGames (void)
|
||||
{
|
||||
static bool ICanEditGames[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t ICanEditGames[Rol_NUM_ROLES] =
|
||||
{
|
||||
[Rol_TCH ] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_TCH ] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return ICanEditGames[Gbl.Usrs.Me.Role.Logged];
|
||||
|
@ -1636,16 +1636,24 @@ static void Gam_ListGameQuestions (struct Gam_Games *Games)
|
|||
MYSQL_RES *mysql_res;
|
||||
unsigned NumQsts;
|
||||
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 *****/
|
||||
NumQsts = Gam_DB_GetGameQuestionsBasic (&mysql_res,Games->Game.GamCod);
|
||||
|
||||
/***** Begin box *****/
|
||||
Box_BoxBegin (Txt_Questions,
|
||||
ICanEditQuestions == Usr_I_CAN ? Gam_PutIconToAddNewQuestions :
|
||||
NULL,
|
||||
ICanEditQuestions == Usr_I_CAN ? Games :
|
||||
NULL,
|
||||
FunctionToDrawContextualIcons[ICanEditQuestions],
|
||||
Args[ICanEditQuestions],
|
||||
Hlp_ASSESSMENT_Games_questions,Box_NOT_CLOSABLE);
|
||||
|
||||
/***** Show table with questions *****/
|
||||
|
@ -1736,11 +1744,17 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games,
|
|||
HTM_TD_Begin ("class=\"BT %s\"",The_GetColorRows ());
|
||||
|
||||
/* Put icon to remove the question */
|
||||
if (ICanEditQuestions == Usr_I_CAN)
|
||||
Ico_PutContextualIconToRemove (ActReqRemGamQst,NULL,
|
||||
Gam_PutParsOneQst,Games);
|
||||
else
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
switch (ICanEditQuestions)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
Ico_PutContextualIconToRemove (ActReqRemGamQst,NULL,
|
||||
Gam_PutParsOneQst,Games);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
break;
|
||||
}
|
||||
|
||||
/* Put icon to move up the question */
|
||||
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)
|
||||
/***** Questions are editable only if game has no matches *****/
|
||||
return Game->NumMchs == 0 ? Usr_I_CAN : // Games with matches should not be edited
|
||||
Usr_I_CAN_NOT;
|
||||
else
|
||||
return Usr_I_CAN_NOT; // Questions are not editable
|
||||
if (Game->NumMchs == 0)
|
||||
return Usr_I_CAN;
|
||||
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -174,7 +174,7 @@ void Gbl_InitializeGlobals (void)
|
|||
Gbl.Crs.Grps.GrpName[0] = '\0';
|
||||
Gbl.Crs.Grps.RooCod = -1L; // -1L stands for no room assigned
|
||||
Gbl.Crs.Grps.MaxStudents = Grp_NUM_STUDENTS_NOT_LIMITED;
|
||||
Gbl.Crs.Grps.Open = false;
|
||||
Gbl.Crs.Grps.Open = CloOpe_CLOSED;
|
||||
Gbl.Crs.Grps.LstGrpsSel.GrpCods = NULL;
|
||||
Gbl.Crs.Grps.LstGrpsSel.NumGrps = 0;
|
||||
Gbl.Crs.Grps.LstGrpsSel.NestedCalls = 0;
|
||||
|
|
382
swad_group.c
382
swad_group.c
|
@ -107,8 +107,8 @@ static void Grp_WriteHeadingGroups (void);
|
|||
static void Grp_PutIconToEditGroups (__attribute__((unused)) void *Args);
|
||||
|
||||
static void Grp_ShowWarningToStdsToChangeGrps (void);
|
||||
static bool Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
|
||||
unsigned *NumGrpsThisTypeIBelong);
|
||||
static Usr_ICan_t Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
|
||||
unsigned *NumGrpsThisTypeIBelong);
|
||||
static void Grp_ListGrpsToAddOrRemUsrs (struct GroupType *GrpTyp,long UsrCod);
|
||||
static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp);
|
||||
static void Grp_WriteGrpHead (struct GroupType *GrpTyp);
|
||||
|
@ -348,19 +348,24 @@ void Grp_ShowFormToSelectSeveralGroups (Act_Action_t NextAction,
|
|||
extern const char *Txt_Groups;
|
||||
extern const char *Txt_Update_users;
|
||||
unsigned NumGrpTyp;
|
||||
bool 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 *****/
|
||||
if (!Gbl.Crs.Grps.NumGrps)
|
||||
return;
|
||||
|
||||
/***** Begin box *****/
|
||||
ICanEdit = !Frm_CheckIfInside () &&
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
|
||||
ICanEdit = (!Frm_CheckIfInside () &&
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
Box_BoxBegin (Txt_Groups,
|
||||
ICanEdit ? Grp_PutIconToEditGroups :
|
||||
NULL,NULL,
|
||||
FunctionToDrawContextualIcons[ICanEdit],NULL,
|
||||
Hlp_USERS_Groups,Box_CLOSABLE);
|
||||
|
||||
/***** Begin form to update the students listed
|
||||
|
@ -405,7 +410,7 @@ void Grp_ShowFormToSelectSeveralGroups (Act_Action_t NextAction,
|
|||
static void Grp_PutCheckboxAllGrps (void)
|
||||
{
|
||||
extern const char *Txt_All_groups;
|
||||
bool ICanSelUnselGroup;
|
||||
Usr_ICan_t ICanSelUnselGroup;
|
||||
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
|
@ -414,10 +419,10 @@ static void Grp_PutCheckboxAllGrps (void)
|
|||
case Rol_CTR_ADM:
|
||||
case Rol_INS_ADM:
|
||||
case Rol_SYS_ADM:
|
||||
ICanSelUnselGroup = true;
|
||||
ICanSelUnselGroup = Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
ICanSelUnselGroup = false;
|
||||
ICanSelUnselGroup = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -425,10 +430,10 @@ static void Grp_PutCheckboxAllGrps (void)
|
|||
HTM_LABEL_Begin ("class=\"FORM_IN_%s\"",The_GetSuffix ());
|
||||
HTM_INPUT_CHECKBOX ("AllGroups",HTM_DONT_SUBMIT_ON_CHANGE,
|
||||
"value=\"Y\"%s",
|
||||
ICanSelUnselGroup ? (Gbl.Crs.Grps.AllGrps ? " checked=\"checked\""
|
||||
" onclick=\"togglecheckChildren(this,'GrpCods')\"" :
|
||||
" onclick=\"togglecheckChildren(this,'GrpCods')\"") :
|
||||
" disabled=\"disabled\"");
|
||||
ICanSelUnselGroup == Usr_I_CAN ? (Gbl.Crs.Grps.AllGrps ? " checked=\"checked\""
|
||||
" onclick=\"togglecheckChildren(this,'GrpCods')\"" :
|
||||
" onclick=\"togglecheckChildren(this,'GrpCods')\"") :
|
||||
" disabled=\"disabled\"");
|
||||
HTM_NBSPTxt (Txt_All_groups);
|
||||
HTM_LABEL_End ();
|
||||
HTM_DIV_End ();
|
||||
|
@ -628,50 +633,50 @@ void Grp_ChangeMyGrps (Cns_QuietOrVerbose_t QuietOrVerbose)
|
|||
bool ChangesMade;
|
||||
|
||||
/***** 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 *****/
|
||||
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)
|
||||
ChangesMade = Grp_ChangeMyGrpsAtomically (&LstGrpsIWant);
|
||||
if (QuietOrVerbose == Cns_VERBOSE)
|
||||
{
|
||||
ChangesMade = Grp_ChangeMyGrpsAtomically (&LstGrpsIWant);
|
||||
if (QuietOrVerbose == Cns_VERBOSE)
|
||||
{
|
||||
if (ChangesMade)
|
||||
Ale_CreateAlert (Ale_SUCCESS,NULL,
|
||||
Txt_The_requested_group_changes_were_successful);
|
||||
else
|
||||
Ale_CreateAlert (Ale_WARNING,NULL,
|
||||
Txt_There_has_been_no_change_in_groups);
|
||||
}
|
||||
if (ChangesMade)
|
||||
Ale_CreateAlert (Ale_SUCCESS,NULL,
|
||||
Txt_The_requested_group_changes_were_successful);
|
||||
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);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -687,36 +692,36 @@ void Grp_ChangeOtherUsrGrps (void)
|
|||
bool SelectionIsValid;
|
||||
|
||||
/***** Can I change another user's groups? *****/
|
||||
if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN)
|
||||
{
|
||||
/***** Get list of groups types and groups in current course *****/
|
||||
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
|
||||
if (Grp_CheckIfICanChangeGrps () == Usr_I_CAN_NOT)
|
||||
return;
|
||||
|
||||
/***** Get the list of groups to which register this user *****/
|
||||
LstGrpsUsrWants.GrpCods = NULL; // Initialized to avoid bug reported by Coverity
|
||||
LstGrpsUsrWants.NumGrps = 0; // Initialized to avoid bug reported by Coverity
|
||||
Grp_GetLstCodsGrpWanted (&LstGrpsUsrWants);
|
||||
/***** Get list of groups types and groups in current course *****/
|
||||
Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS);
|
||||
|
||||
/***** A student can not be enroled in more than one group
|
||||
if the type of group is of single enrolment *****/
|
||||
SelectionIsValid = Grp_CheckIfSelectionGrpsSingleEnrolmentIsValid (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs,
|
||||
&LstGrpsUsrWants);
|
||||
/***** Get the list of groups to which register this user *****/
|
||||
LstGrpsUsrWants.GrpCods = NULL; // Initialized to avoid bug reported by Coverity
|
||||
LstGrpsUsrWants.NumGrps = 0; // Initialized to avoid bug reported by Coverity
|
||||
Grp_GetLstCodsGrpWanted (&LstGrpsUsrWants);
|
||||
|
||||
/***** 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 groups atomically
|
||||
Grp_FreeListGrpTypesAndGrps ();
|
||||
/***** A student can not be enroled in more than one group
|
||||
if the type of group is of single enrolment *****/
|
||||
SelectionIsValid = Grp_CheckIfSelectionGrpsSingleEnrolmentIsValid (Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs,
|
||||
&LstGrpsUsrWants);
|
||||
|
||||
/***** Register user in the selected groups *****/
|
||||
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 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 groups atomically
|
||||
Grp_FreeListGrpTypesAndGrps ();
|
||||
|
||||
/***** Free memory with the list of groups to/from which register/remove users *****/
|
||||
Grp_FreeListCodGrp (&LstGrpsUsrWants);
|
||||
}
|
||||
/***** Register user in the selected groups *****/
|
||||
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);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -773,7 +778,7 @@ bool Grp_ChangeMyGrpsAtomically (struct ListCodGrps *LstGrpsIWant)
|
|||
NumGrpThisType < GrpTyp->NumGrps && !ITryToLeaveAClosedGroup;
|
||||
NumGrpThisType++)
|
||||
if ((GrpTyp->LstGrps[NumGrpThisType]).GrpCod == LstGrpsIBelong.GrpCods[NumGrpIBelong])
|
||||
if (!((GrpTyp->LstGrps[NumGrpThisType]).Open))
|
||||
if ((GrpTyp->LstGrps[NumGrpThisType]).Open == CloOpe_CLOSED)
|
||||
ITryToLeaveAClosedGroup = true;
|
||||
}
|
||||
}
|
||||
|
@ -809,7 +814,7 @@ bool Grp_ChangeMyGrpsAtomically (struct ListCodGrps *LstGrpsIWant)
|
|||
if ((GrpTyp->LstGrps[NumGrpThisType]).GrpCod == LstGrpsIWant->GrpCods[NumGrpIWant])
|
||||
{
|
||||
/* Check if the group is closed */
|
||||
if (!((GrpTyp->LstGrps[NumGrpThisType]).Open))
|
||||
if ((GrpTyp->LstGrps[NumGrpThisType]).Open == CloOpe_CLOSED)
|
||||
ITryToRegisterInAClosedGroup = true;
|
||||
/* Check if the group is full */
|
||||
else if ((GrpTyp->LstGrps[NumGrpThisType]).NumUsrs[Rol_STD] >=
|
||||
|
@ -1423,16 +1428,16 @@ static void Grp_ListGroupsForEdition (const struct Roo_Rooms *Rooms)
|
|||
|
||||
/***** Icon to open/close group *****/
|
||||
HTM_TD_Begin ("class=\"BM\"");
|
||||
Frm_BeginFormAnchor (Grp->Open ? ActCloGrp :
|
||||
ActOpeGrp,
|
||||
Frm_BeginFormAnchor (Grp->Open == CloOpe_OPEN ? ActCloGrp :
|
||||
ActOpeGrp,
|
||||
Grp_GROUPS_SECTION_ID);
|
||||
ParCod_PutPar (ParCod_Grp,Grp->GrpCod);
|
||||
Ico_PutIconLink (Grp->Open ? "unlock.svg" :
|
||||
"lock.svg",
|
||||
Grp->Open ? Ico_GREEN :
|
||||
Ico_RED,
|
||||
Grp->Open ? ActCloGrp :
|
||||
ActOpeGrp);
|
||||
Ico_PutIconLink (Grp->Open == CloOpe_OPEN ? "unlock.svg" :
|
||||
"lock.svg",
|
||||
Grp->Open == CloOpe_OPEN ? Ico_GREEN :
|
||||
Ico_RED,
|
||||
Grp->Open == CloOpe_OPEN ? ActCloGrp :
|
||||
ActOpeGrp);
|
||||
Frm_EndForm ();
|
||||
HTM_TD_End ();
|
||||
|
||||
|
@ -1707,10 +1712,16 @@ void Grp_ShowLstGrpsToChgMyGrps (void)
|
|||
unsigned NumGrpsIBelong = 0;
|
||||
Frm_PutForm_t PutFormToChangeGrps = Frm_CheckIfInside () ? Frm_DONT_PUT_FORM : // Inside another form (record card)?
|
||||
Frm_PUT_FORM;
|
||||
bool ICanEdit = !Frm_CheckIfInside () &&
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
|
||||
bool ICanChangeMyGrps = false;
|
||||
Usr_ICan_t ICanEdit = (!Frm_CheckIfInside () &&
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
|
||||
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
|
||||
{
|
||||
|
@ -1725,9 +1736,7 @@ void Grp_ShowLstGrpsToChgMyGrps (void)
|
|||
|
||||
/***** Begin box *****/
|
||||
Box_BoxBegin (Txt_My_groups,
|
||||
ICanEdit ? Grp_PutIconToEditGroups :
|
||||
NULL,
|
||||
NULL,
|
||||
FunctionToDrawContextualIcons[ICanEdit],NULL,
|
||||
Hlp_USERS_Groups,Box_NOT_CLOSABLE);
|
||||
|
||||
if (Gbl.Crs.Grps.NumGrps) // This course has groups
|
||||
|
@ -1743,8 +1752,9 @@ void Grp_ShowLstGrpsToChgMyGrps (void)
|
|||
NumGrpTyp++)
|
||||
if (Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].NumGrps) // If there are groups of this type
|
||||
{
|
||||
ICanChangeMyGrps |= Grp_ListGrpsForChangeMySelection (&Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp],
|
||||
&NumGrpsThisTypeIBelong);
|
||||
if (Grp_ListGrpsForChangeMySelection (&Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp],
|
||||
&NumGrpsThisTypeIBelong) == Usr_I_CAN)
|
||||
ICanChangeMyGrps = Usr_I_CAN;
|
||||
NumGrpsIBelong += NumGrpsThisTypeIBelong;
|
||||
}
|
||||
HTM_TABLE_End ();
|
||||
|
@ -1752,7 +1762,7 @@ void Grp_ShowLstGrpsToChgMyGrps (void)
|
|||
/***** End form *****/
|
||||
if (PutFormToChangeGrps)
|
||||
{
|
||||
if (ICanChangeMyGrps)
|
||||
if (ICanChangeMyGrps == Usr_I_CAN)
|
||||
Btn_PutConfirmButton (NumGrpsIBelong ? Txt_Change_my_groups :
|
||||
Txt_Enrol_in_groups);
|
||||
Frm_EndForm ();
|
||||
|
@ -1821,16 +1831,16 @@ static void Grp_ShowWarningToStdsToChangeGrps (void)
|
|||
/*****************************************************************************/
|
||||
// Returns true if I can change my selection
|
||||
|
||||
static bool Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
|
||||
unsigned *NumGrpsThisTypeIBelong)
|
||||
static Usr_ICan_t Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
|
||||
unsigned *NumGrpsThisTypeIBelong)
|
||||
{
|
||||
struct ListCodGrps LstGrpsIBelong;
|
||||
unsigned NumGrpThisType;
|
||||
struct Group *Grp;
|
||||
bool IBelongToThisGroup;
|
||||
bool IBelongToAClosedGroup;
|
||||
bool ICanChangeMySelectionForThisGrpTyp;
|
||||
bool ICanChangeMySelectionForThisGrp;
|
||||
Usr_ICan_t ICanChangeMySelectionForThisGrpTyp;
|
||||
Usr_ICan_t ICanChangeMySelectionForThisGrp;
|
||||
char StrGrpCod[32];
|
||||
|
||||
/***** Write heading *****/
|
||||
|
@ -1847,19 +1857,20 @@ static bool Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
|
|||
case Rol_STD:
|
||||
if (GrpTyp->MultipleEnrolment) // Enrolment is multiple
|
||||
{
|
||||
for (NumGrpThisType = 0, ICanChangeMySelectionForThisGrpTyp = false;
|
||||
NumGrpThisType < GrpTyp->NumGrps && !ICanChangeMySelectionForThisGrpTyp;
|
||||
for (NumGrpThisType = 0, ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN_NOT;
|
||||
NumGrpThisType < GrpTyp->NumGrps &&
|
||||
ICanChangeMySelectionForThisGrpTyp == Usr_I_CAN_NOT;
|
||||
NumGrpThisType++)
|
||||
{
|
||||
Grp = &(GrpTyp->LstGrps[NumGrpThisType]);
|
||||
if (Grp->Open) // If group is open
|
||||
if (Grp->Open == CloOpe_OPEN) // If group is open
|
||||
{
|
||||
IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong);
|
||||
if (IBelongToThisGroup) // I belong to this group
|
||||
ICanChangeMySelectionForThisGrpTyp = true; // I can unregister from group
|
||||
ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN; // I can unregister from group
|
||||
else // I don't belong
|
||||
if (Grp->NumUsrs[Rol_STD] < Grp->MaxStudents) // Group is not full
|
||||
ICanChangeMySelectionForThisGrpTyp = true; // I can register into group
|
||||
ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN; // I can register into group
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1871,7 +1882,7 @@ static bool Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
|
|||
NumGrpThisType++)
|
||||
{
|
||||
Grp = &(GrpTyp->LstGrps[NumGrpThisType]);
|
||||
if (!Grp->Open) // If group is closed
|
||||
if (Grp->Open == CloOpe_CLOSED) // If group is closed
|
||||
{
|
||||
IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong);
|
||||
if (IBelongToThisGroup) // I belong to this group
|
||||
|
@ -1880,30 +1891,31 @@ static bool Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
|
|||
}
|
||||
|
||||
if (IBelongToAClosedGroup) // I belong to a closed group
|
||||
ICanChangeMySelectionForThisGrpTyp = false; // I can not unregister
|
||||
ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN_NOT; // I can not unregister
|
||||
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 */
|
||||
for (NumGrpThisType = 0, ICanChangeMySelectionForThisGrpTyp = false;
|
||||
NumGrpThisType < GrpTyp->NumGrps && !ICanChangeMySelectionForThisGrpTyp;
|
||||
for (NumGrpThisType = 0, ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN_NOT;
|
||||
NumGrpThisType < GrpTyp->NumGrps &&
|
||||
ICanChangeMySelectionForThisGrpTyp == Usr_I_CAN_NOT;
|
||||
NumGrpThisType++)
|
||||
{
|
||||
Grp = &(GrpTyp->LstGrps[NumGrpThisType]);
|
||||
if (Grp->Open && // If group is open...
|
||||
if (Grp->Open == CloOpe_OPEN && // If group is open...
|
||||
Grp->NumUsrs[Rol_STD] < Grp->MaxStudents) // ...and not full
|
||||
{
|
||||
IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong);
|
||||
if (!IBelongToThisGroup) // I don't belong to this group
|
||||
ICanChangeMySelectionForThisGrpTyp = true; // I can register into this group
|
||||
ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN; // I can register into this group
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
ICanChangeMySelectionForThisGrpTyp = true; // I can not register/unregister
|
||||
ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN; // I can not register/unregister
|
||||
break;
|
||||
default:
|
||||
ICanChangeMySelectionForThisGrpTyp = false; // I can not register/unregister
|
||||
ICanChangeMySelectionForThisGrpTyp = Usr_I_CAN_NOT; // I can not register/unregister
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1916,23 +1928,29 @@ static bool Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
|
|||
IBelongToThisGroup = Grp_CheckIfGrpIsInList (Grp->GrpCod,&LstGrpsIBelong);
|
||||
|
||||
/* Selection disabled? */
|
||||
if (ICanChangeMySelectionForThisGrpTyp) // I can change my selection for this group type
|
||||
switch (ICanChangeMySelectionForThisGrpTyp) // I can change my selection for this group type
|
||||
{
|
||||
ICanChangeMySelectionForThisGrp = true;
|
||||
if (Gbl.Usrs.Me.Role.Logged == Rol_STD)
|
||||
{
|
||||
if (Grp->Open) // If group is open
|
||||
{
|
||||
if (!IBelongToThisGroup && // I don't belong to group
|
||||
Grp->NumUsrs[Rol_STD] >= Grp->MaxStudents) // Group is full
|
||||
ICanChangeMySelectionForThisGrp = false;
|
||||
}
|
||||
else // If group is closed
|
||||
ICanChangeMySelectionForThisGrp = false;
|
||||
}
|
||||
}
|
||||
else // I can not change my selection for this group type
|
||||
ICanChangeMySelectionForThisGrp = false;
|
||||
case Usr_I_CAN:
|
||||
ICanChangeMySelectionForThisGrp = Usr_I_CAN;
|
||||
if (Gbl.Usrs.Me.Role.Logged == Rol_STD)
|
||||
switch (Grp->Open)
|
||||
{
|
||||
case CloOpe_OPEN: // If group is open
|
||||
if (!IBelongToThisGroup && // I don't belong to group
|
||||
Grp->NumUsrs[Rol_STD] >= Grp->MaxStudents) // Group is full
|
||||
ICanChangeMySelectionForThisGrp = Usr_I_CAN_NOT;
|
||||
break;
|
||||
case CloOpe_CLOSED: // If group is closed
|
||||
default:
|
||||
ICanChangeMySelectionForThisGrp = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Usr_I_CAN_NOT: // I can not change my selection for this group type
|
||||
default:
|
||||
ICanChangeMySelectionForThisGrp = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Put radio item or checkbox to select the group */
|
||||
HTM_TR_Begin (NULL);
|
||||
|
@ -1951,18 +1969,18 @@ static bool Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
|
|||
"id=\"Grp%ld\" value=\"%ld\"%s%s",
|
||||
Grp->GrpCod,Grp->GrpCod,
|
||||
IBelongToThisGroup ? " checked=\"checked\"" : "", // Group selected?
|
||||
ICanChangeMySelectionForThisGrp ? "" :
|
||||
IBelongToThisGroup ? " readonly" : // I can not unregister (disabled does not work because the value is not submitted)
|
||||
" disabled=\"disabled\""); // I can not register
|
||||
ICanChangeMySelectionForThisGrp == Usr_I_CAN ? "" :
|
||||
IBelongToThisGroup ? " readonly" : // I can not unregister (disabled does not work because the value is not submitted)
|
||||
" disabled=\"disabled\""); // I can not register
|
||||
else // If the enrolment is not mandatory, I can select no groups
|
||||
HTM_INPUT_RADIO (StrGrpCod,HTM_DONT_SUBMIT_ON_CLICK,
|
||||
"id=\"Grp%ld\" value=\"%ld\"%s%s"
|
||||
" onclick=\"selectUnselectRadio(this,this.form.GrpCod%ld,%u)\"",
|
||||
Grp->GrpCod,Grp->GrpCod,
|
||||
IBelongToThisGroup ? " checked=\"checked\"" : "", // Group selected?
|
||||
ICanChangeMySelectionForThisGrp ? "" :
|
||||
IBelongToThisGroup ? " readonly" : // I can not unregister (disabled does not work because the value is not submitted)
|
||||
" disabled=\"disabled\"", // I can not register
|
||||
ICanChangeMySelectionForThisGrp == Usr_I_CAN ? "" :
|
||||
IBelongToThisGroup ? " readonly" : // I can not unregister (disabled does not work because the value is not submitted)
|
||||
" disabled=\"disabled\"", // I can not register
|
||||
GrpTyp->GrpTypCod,GrpTyp->NumGrps);
|
||||
}
|
||||
else
|
||||
|
@ -1971,9 +1989,9 @@ static bool Grp_ListGrpsForChangeMySelection (struct GroupType *GrpTyp,
|
|||
"id=\"Grp%ld\" value=\"%ld\"%s%s",
|
||||
Grp->GrpCod,Grp->GrpCod,
|
||||
IBelongToThisGroup ? " checked=\"checked\"" : "",
|
||||
ICanChangeMySelectionForThisGrp ? "" :
|
||||
IBelongToThisGroup ? " readonly" : // I can not unregister (disabled does not work because the value is not submitted)
|
||||
" disabled=\"disabled\""); // I can not register
|
||||
ICanChangeMySelectionForThisGrp == Usr_I_CAN ? "" :
|
||||
IBelongToThisGroup ? " readonly" : // I can not unregister (disabled does not work because the value is not submitted)
|
||||
" disabled=\"disabled\""); // I can not register
|
||||
|
||||
HTM_TD_End ();
|
||||
|
||||
|
@ -2097,7 +2115,7 @@ static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp)
|
|||
unsigned NumGrpSel;
|
||||
struct ListCodGrps LstGrpsIBelong;
|
||||
bool IBelongToThisGroup;
|
||||
bool ICanSelUnselGroup;
|
||||
Usr_ICan_t ICanSelUnselGroup;
|
||||
bool Checked;
|
||||
struct Group *Grp;
|
||||
Rol_Role_t Role;
|
||||
|
@ -2122,23 +2140,24 @@ static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp)
|
|||
|
||||
/* Check if I can select / unselect this group */
|
||||
if (IBelongToThisGroup)
|
||||
ICanSelUnselGroup = true;
|
||||
ICanSelUnselGroup = Usr_I_CAN;
|
||||
else
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD:
|
||||
case Rol_NET:
|
||||
ICanSelUnselGroup = IBelongToThisGroup;
|
||||
ICanSelUnselGroup = IBelongToThisGroup ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_TCH:
|
||||
case Rol_DEG_ADM:
|
||||
case Rol_CTR_ADM:
|
||||
case Rol_INS_ADM:
|
||||
case Rol_SYS_ADM:
|
||||
ICanSelUnselGroup = true; // GroupsSelectable is ignored
|
||||
ICanSelUnselGroup = Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
ICanSelUnselGroup = false; // GroupsSelectable is ignored
|
||||
ICanSelUnselGroup = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2165,8 +2184,8 @@ static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp)
|
|||
Grp->GrpCod,Grp->GrpCod,
|
||||
Checked ? " checked=\"checked\"" :
|
||||
"",
|
||||
ICanSelUnselGroup ? " onclick=\"checkParent(this,'AllGroups')\"" :
|
||||
" disabled=\"disabled\"");
|
||||
ICanSelUnselGroup == Usr_I_CAN ? " onclick=\"checkParent(this,'AllGroups')\"" :
|
||||
" disabled=\"disabled\"");
|
||||
HTM_TD_End ();
|
||||
|
||||
Grp_WriteRowGrp (Grp,IBelongToThisGroup ? Lay_HIGHLIGHT :
|
||||
|
@ -2181,23 +2200,28 @@ static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp)
|
|||
/***** Write rows to select the students who don't belong to any group *****/
|
||||
/* To get the students who don't belong to a type of group, use group code -(GrpTyp->GrpTypCod) */
|
||||
/* Write checkbox to select the group */
|
||||
ICanSelUnselGroup = (Gbl.Usrs.Me.Role.Logged >= Rol_STD);
|
||||
if (ICanSelUnselGroup)
|
||||
ICanSelUnselGroup = (Gbl.Usrs.Me.Role.Logged >= Rol_STD) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
switch (ICanSelUnselGroup)
|
||||
{
|
||||
if (Gbl.Crs.Grps.AllGrps)
|
||||
Checked = true;
|
||||
else
|
||||
for (NumGrpSel = 0, Checked = false;
|
||||
NumGrpSel < Gbl.Crs.Grps.LstGrpsSel.NumGrps;
|
||||
NumGrpSel++)
|
||||
if (Gbl.Crs.Grps.LstGrpsSel.GrpCods[NumGrpSel] == -(GrpTyp->GrpTypCod))
|
||||
{
|
||||
Checked = true;
|
||||
break;
|
||||
}
|
||||
case Usr_I_CAN:
|
||||
if (Gbl.Crs.Grps.AllGrps)
|
||||
Checked = true;
|
||||
else
|
||||
for (NumGrpSel = 0, Checked = false;
|
||||
NumGrpSel < Gbl.Crs.Grps.LstGrpsSel.NumGrps;
|
||||
NumGrpSel++)
|
||||
if (Gbl.Crs.Grps.LstGrpsSel.GrpCods[NumGrpSel] == -(GrpTyp->GrpTypCod))
|
||||
{
|
||||
Checked = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Checked = false;
|
||||
break;
|
||||
}
|
||||
else
|
||||
Checked = false;
|
||||
|
||||
HTM_TR_Begin (NULL);
|
||||
|
||||
|
@ -2206,9 +2230,9 @@ static void Grp_ListGrpsForMultipleSelection (struct GroupType *GrpTyp)
|
|||
"id=\"Grp%ld\" value=\"%ld\"%s"
|
||||
" onclick=\"checkParent(this,'AllGroups')\"",
|
||||
-GrpTyp->GrpTypCod,-GrpTyp->GrpTypCod,
|
||||
ICanSelUnselGroup ? (Checked ? " checked=\"checked\"" :
|
||||
"") :
|
||||
" disabled=\"disabled\"");
|
||||
ICanSelUnselGroup == Usr_I_CAN ? (Checked ? " checked=\"checked\"" :
|
||||
"") :
|
||||
" disabled=\"disabled\"");
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Column closed/open */
|
||||
|
@ -2315,14 +2339,14 @@ static void Grp_WriteRowGrp (struct Group *Grp,Lay_Highlight_t Highlight)
|
|||
|
||||
/***** Write icon to show if group is open or closed *****/
|
||||
HTM_TD_Begin ("class=\"BM%s\"",HighlightClass[Highlight]);
|
||||
if (asprintf (&Title,Grp->Open ? Txt_Group_X_open :
|
||||
Txt_Group_X_closed,
|
||||
if (asprintf (&Title,Grp->Open == CloOpe_OPEN ? Txt_Group_X_open :
|
||||
Txt_Group_X_closed,
|
||||
Grp->GrpName) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
Ico_PutIconOff (Grp->Open ? "unlock.svg" :
|
||||
"lock.svg",
|
||||
Grp->Open ? Ico_GREEN :
|
||||
Ico_RED,
|
||||
Ico_PutIconOff (Grp->Open == CloOpe_OPEN ? "unlock.svg" :
|
||||
"lock.svg",
|
||||
Grp->Open == CloOpe_OPEN ? Ico_GREEN :
|
||||
Ico_RED,
|
||||
Title);
|
||||
free (Title);
|
||||
HTM_TD_End ();
|
||||
|
@ -2824,7 +2848,8 @@ void Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_WhichGroupTypes_t WhichGroupTypes)
|
|||
|
||||
/* Get whether group is open ('Y') or closed ('N') (row[5]),
|
||||
and whether group have file zones ('Y') or not ('N') (row[6]) */
|
||||
Grp->Open = (row[5][0] == 'Y');
|
||||
Grp->Open = (row[5][0] == 'Y') ? CloOpe_OPEN :
|
||||
CloOpe_CLOSED;
|
||||
Grp->FileZones = (row[6][0] == 'Y');
|
||||
}
|
||||
}
|
||||
|
@ -2937,7 +2962,7 @@ void Grp_GetGroupDataByCod (struct GroupData *GrpDat)
|
|||
GrpDat->Room.ShrtName[0] = '\0';
|
||||
GrpDat->MaxStudents = 0;
|
||||
GrpDat->Vacant = 0;
|
||||
GrpDat->Open = false;
|
||||
GrpDat->Open = CloOpe_CLOSED;
|
||||
GrpDat->FileZones = false;
|
||||
GrpDat->MultipleEnrolment = false;
|
||||
|
||||
|
@ -2981,7 +3006,8 @@ void Grp_GetGroupDataByCod (struct GroupData *GrpDat)
|
|||
|
||||
/* Get whether group is open or closed (row[8]),
|
||||
and whether group has file zones (row[9]) */
|
||||
GrpDat->Open = (row[8][0] == 'Y');
|
||||
GrpDat->Open = (row[8][0] == 'Y') ? CloOpe_OPEN :
|
||||
CloOpe_CLOSED;
|
||||
GrpDat->FileZones = (row[9][0] == 'Y');
|
||||
}
|
||||
|
||||
|
@ -3576,7 +3602,7 @@ void Grp_OpenGroup (void)
|
|||
GrpDat.GrpName);
|
||||
|
||||
/***** Show the form again *****/
|
||||
Gbl.Crs.Grps.Open = true;
|
||||
Gbl.Crs.Grps.Open = CloOpe_OPEN;
|
||||
Grp_ReqEditGroupsInternal (Ale_INFO,NULL,
|
||||
Ale_SUCCESS,AlertTxt);
|
||||
}
|
||||
|
@ -3606,7 +3632,7 @@ void Grp_CloseGroup (void)
|
|||
GrpDat.GrpName);
|
||||
|
||||
/***** Show the form again *****/
|
||||
Gbl.Crs.Grps.Open = false;
|
||||
Gbl.Crs.Grps.Open = CloOpe_CLOSED;
|
||||
Grp_ReqEditGroupsInternal (Ale_INFO,NULL,
|
||||
Ale_SUCCESS,AlertTxt);
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ struct GroupData
|
|||
} Room;
|
||||
unsigned MaxStudents;
|
||||
int Vacant;
|
||||
bool Open; // Group is open?
|
||||
CloOpe_ClosedOrOpen_t Open; // Group is open?
|
||||
bool FileZones; // Group has file zones?
|
||||
bool MultipleEnrolment;
|
||||
};
|
||||
|
@ -87,7 +87,7 @@ struct Group
|
|||
} Room;
|
||||
unsigned NumUsrs[Rol_NUM_ROLES]; // Number of users in the group
|
||||
unsigned MaxStudents; // Maximum number of students in the group
|
||||
bool Open; // Group is open?
|
||||
CloOpe_ClosedOrOpen_t Open; // Group is open?
|
||||
bool FileZones; // Group has file zones?
|
||||
bool ShowFileZone; // Show file zone of this group?
|
||||
};
|
||||
|
@ -152,7 +152,7 @@ struct Grp_Groups
|
|||
char GrpName[Grp_MAX_BYTES_GROUP_NAME + 1];
|
||||
long RooCod;
|
||||
unsigned MaxStudents;
|
||||
bool Open;
|
||||
CloOpe_ClosedOrOpen_t Open;
|
||||
bool FileZones;
|
||||
bool AllGrps; // All groups selected?
|
||||
struct ListCodGrps LstGrpsSel;
|
||||
|
|
|
@ -746,7 +746,7 @@ void Hie_WriteStatusCell (Hie_Status_t Status,
|
|||
HTM_TD_End ();
|
||||
}
|
||||
|
||||
void Hie_WriteStatusCellEditable (bool ICanEdit,Hie_Status_t Status,
|
||||
void Hie_WriteStatusCellEditable (Usr_ICan_t ICanEdit,Hie_Status_t Status,
|
||||
Act_Action_t NextAction,long HieCod,
|
||||
const char *Txt[Hie_NUM_STATUS_TXT])
|
||||
{
|
||||
|
@ -755,7 +755,7 @@ void Hie_WriteStatusCellEditable (bool ICanEdit,Hie_Status_t Status,
|
|||
|
||||
/***** Begin cell *****/
|
||||
HTM_TD_Begin ("class=\"LM DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit && StatusTxt == Hie_STATUS_PENDING)
|
||||
if (ICanEdit == Usr_I_CAN && StatusTxt == Hie_STATUS_PENDING)
|
||||
{
|
||||
/* Begin form */
|
||||
Frm_BeginForm (NextAction);
|
||||
|
|
|
@ -54,7 +54,7 @@ Usr_ICan_t Hie_CheckIfICanEdit (void);
|
|||
void Hie_WriteStatusCell (Hie_Status_t Status,
|
||||
const char *Class,const char *BgColor,
|
||||
const char *Txt[Hie_NUM_STATUS_TXT]);
|
||||
void Hie_WriteStatusCellEditable (bool ICanEdit,Hie_Status_t Status,
|
||||
void Hie_WriteStatusCellEditable (Usr_ICan_t ICanEdit,Hie_Status_t Status,
|
||||
Act_Action_t NextAction,long HieCod,
|
||||
const char *Txt[Hie_NUM_STATUS_TXT]);
|
||||
Hie_Status_t Hie_GetParStatus (void);
|
||||
|
|
|
@ -380,12 +380,12 @@ void Ico_PutContextualIconToPaste (Act_Action_t NextAction,
|
|||
|
||||
void Ico_PutContextualIconToCreateInFolder (Act_Action_t NextAction,
|
||||
void (*FuncPars) (void *Args),void *Args,
|
||||
bool Open)
|
||||
CloOpe_ClosedOrOpen_t Open)
|
||||
{
|
||||
Lay_PutContextualLinkOnlyIcon (NextAction,NULL,
|
||||
FuncPars,Args,
|
||||
Open ? "folder-open-yellow-plus.png" :
|
||||
"folder-yellow-plus.png",
|
||||
Open == CloOpe_OPEN ? "folder-open-yellow-plus.png" :
|
||||
"folder-yellow-plus.png",
|
||||
Ico_UNCHANGED);
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
/********************************* Headers ***********************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
#include "swad_closed_open.h"
|
||||
#include "swad_hidden_visible.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -113,7 +114,7 @@ void Ico_PutContextualIconToPaste (Act_Action_t NextAction,
|
|||
void (*FuncPars) (void *Args),void *Args);
|
||||
void Ico_PutContextualIconToCreateInFolder (Act_Action_t NextAction,
|
||||
void (*FuncPars) (void *Args),void *Args,
|
||||
bool Open);
|
||||
CloOpe_ClosedOrOpen_t Open);
|
||||
void Ico_PutContextualIconToShowResults (Act_Action_t NextAction,const char *Anchor,
|
||||
void (*FuncPars) (void *Args),void *Args);
|
||||
void Ico_PutContextualIconToShowAttendanceList (Act_Action_t NextAction,
|
||||
|
|
145
swad_info.c
145
swad_info.c
|
@ -127,23 +127,6 @@ static Act_Action_t Inf_ActionsInfo[Inf_NUM_SOURCES][Inf_NUM_TYPES] =
|
|||
[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 *****************************/
|
||||
/*****************************************************************************/
|
||||
|
@ -181,24 +164,42 @@ static bool Inf_CheckAndShowRichTxt (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_No_information;
|
||||
struct Syl_Syllabus Syllabus;
|
||||
struct Inf_FromDB FromDB;
|
||||
bool Disabled;
|
||||
bool ICanEdit = (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
|
||||
Usr_ICan_t ICanEdit = (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
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,
|
||||
[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,
|
||||
[Usr_I_CAN_NOT] = NULL,
|
||||
[Usr_I_CAN ] = Inf_PutIconToEditInfo,
|
||||
};
|
||||
static void *Args[Usr_NUM_I_CAN] =
|
||||
{
|
||||
[Usr_I_CAN_NOT] = NULL,
|
||||
[Usr_I_CAN ] = &Gbl.Crs.Info.Type,
|
||||
};
|
||||
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 *****/
|
||||
|
@ -244,11 +245,8 @@ void Inf_ShowInfo (void)
|
|||
|
||||
/***** Begin box *****/
|
||||
Box_BoxBegin (Txt_INFO_TITLE[Gbl.Crs.Info.Type],
|
||||
ICanEdit ? Inf_PutIconToEditInfo :
|
||||
NULL,
|
||||
ICanEdit ? &Gbl.Crs.Info.Type :
|
||||
NULL,
|
||||
Help[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
|
||||
FunctionToDrawContextualIcons[ICanEdit],Args[ICanEdit],
|
||||
*Help[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
|
||||
|
||||
/****** Form to select syllabus *****/
|
||||
Syl_PutFormWhichSyllabus (Syllabus.WhichSyllabus);
|
||||
|
@ -808,6 +806,13 @@ void Inf_SetInfoSrc (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_INFO_SRC_FULL_TEXT[Inf_NUM_SOURCES];
|
||||
extern const char *Txt_INFO_SRC_HELP[Inf_NUM_SOURCES];
|
||||
|
@ -836,16 +841,16 @@ void Inf_FormsToSelSendInfo (void)
|
|||
[Inf_PAGE ] = Inf_FormToSendPage,
|
||||
[Inf_URL ] = Inf_FormToSendURL,
|
||||
};
|
||||
const char *HelpEdit[Inf_NUM_TYPES] =
|
||||
static const char **HelpEdit[Inf_NUM_TYPES] =
|
||||
{
|
||||
[Inf_INFORMATION ] = Hlp_COURSE_Information_edit,
|
||||
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
|
||||
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit,
|
||||
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit,
|
||||
[Inf_LINKS ] = Hlp_COURSE_Links_edit,
|
||||
[Inf_ASSESSMENT ] = Hlp_COURSE_Assessment_edit,
|
||||
[Inf_INFORMATION ] = &Hlp_COURSE_Information_edit,
|
||||
[Inf_TEACHING_GUIDE] = &Hlp_COURSE_Guide_edit,
|
||||
[Inf_LECTURES ] = &Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_PRACTICALS ] = &Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_BIBLIOGRAPHY ] = &Hlp_COURSE_Bibliography_edit,
|
||||
[Inf_FAQ ] = &Hlp_COURSE_FAQ_edit,
|
||||
[Inf_LINKS ] = &Hlp_COURSE_Links_edit,
|
||||
[Inf_ASSESSMENT ] = &Hlp_COURSE_Assessment_edit,
|
||||
};
|
||||
|
||||
/***** Reset syllabus context *****/
|
||||
|
@ -879,7 +884,7 @@ void Inf_FormsToSelSendInfo (void)
|
|||
/* Begin box and table */
|
||||
Box_BoxTableBegin (Txt_Source_of_information,
|
||||
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 */
|
||||
for (InfoSrc = (Inf_Src_t) 0;
|
||||
|
@ -1492,6 +1497,13 @@ static bool Inf_CheckAndShowRichTxt (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 const char *Txt_INFO_TITLE[Inf_NUM_TYPES];
|
||||
extern const char *Txt_Save_changes;
|
||||
|
@ -1508,16 +1520,16 @@ void Inf_EditPlainTxtInfo (void)
|
|||
[Inf_LINKS ] = {ActRcvPlaTxtCrsLnk,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_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
|
||||
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit,
|
||||
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit,
|
||||
[Inf_LINKS ] = Hlp_COURSE_Links_edit,
|
||||
[Inf_ASSESSMENT ] = Hlp_COURSE_Assessment_edit,
|
||||
[Inf_INFORMATION ] = &Hlp_COURSE_Information_edit,
|
||||
[Inf_TEACHING_GUIDE] = &Hlp_COURSE_Guide_edit,
|
||||
[Inf_LECTURES ] = &Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_PRACTICALS ] = &Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_BIBLIOGRAPHY ] = &Hlp_COURSE_Bibliography_edit,
|
||||
[Inf_FAQ ] = &Hlp_COURSE_FAQ_edit,
|
||||
[Inf_LINKS ] = &Hlp_COURSE_Links_edit,
|
||||
[Inf_ASSESSMENT ] = &Hlp_COURSE_Assessment_edit,
|
||||
};
|
||||
|
||||
/***** Reset syllabus context *****/
|
||||
|
@ -1531,7 +1543,7 @@ void Inf_EditPlainTxtInfo (void)
|
|||
if (Inf_Actions[Gbl.Crs.Info.Type].FuncPars)
|
||||
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,
|
||||
HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
|
||||
*HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
|
||||
|
||||
switch (Gbl.Crs.Info.Type)
|
||||
{
|
||||
|
@ -1568,6 +1580,13 @@ void Inf_EditPlainTxtInfo (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 const char *Txt_INFO_TITLE[Inf_NUM_TYPES];
|
||||
extern const char *Txt_Save_changes;
|
||||
|
@ -1584,16 +1603,16 @@ void Inf_EditRichTxtInfo (void)
|
|||
[Inf_LINKS ] = {ActRcvRchTxtCrsLnk,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_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
|
||||
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit,
|
||||
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit,
|
||||
[Inf_LINKS ] = Hlp_COURSE_Links_edit,
|
||||
[Inf_ASSESSMENT ] = Hlp_COURSE_Assessment_edit,
|
||||
[Inf_INFORMATION ] = &Hlp_COURSE_Information_edit,
|
||||
[Inf_TEACHING_GUIDE] = &Hlp_COURSE_Guide_edit,
|
||||
[Inf_LECTURES ] = &Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_PRACTICALS ] = &Hlp_COURSE_Syllabus_edit,
|
||||
[Inf_BIBLIOGRAPHY ] = &Hlp_COURSE_Bibliography_edit,
|
||||
[Inf_FAQ ] = &Hlp_COURSE_FAQ_edit,
|
||||
[Inf_LINKS ] = &Hlp_COURSE_Links_edit,
|
||||
[Inf_ASSESSMENT ] = &Hlp_COURSE_Assessment_edit,
|
||||
};
|
||||
|
||||
/***** Reset syllabus context *****/
|
||||
|
@ -1607,7 +1626,7 @@ void Inf_EditRichTxtInfo (void)
|
|||
if (Inf_Actions[Gbl.Crs.Info.Type].FuncPars)
|
||||
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,
|
||||
HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
|
||||
*HelpEdit[Gbl.Crs.Info.Type],Box_NOT_CLOSABLE);
|
||||
|
||||
switch (Gbl.Crs.Info.Type)
|
||||
{
|
||||
|
|
|
@ -950,28 +950,30 @@ static void Ins_ListInstitutionsForEdition (void)
|
|||
|
||||
/* Institution WWW */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s\"",The_GetSuffix ());
|
||||
if (ICanEdit == Usr_I_CAN)
|
||||
switch (ICanEdit)
|
||||
{
|
||||
Frm_BeginForm (ActChgInsWWW);
|
||||
ParCod_PutPar (ParCod_OthHie,Ins->HieCod);
|
||||
HTM_INPUT_URL ("WWW",Ins->WWW,HTM_SUBMIT_ON_CHANGE,
|
||||
"class=\"INPUT_WWW INPUT_%s\""
|
||||
" required=\"required\"",
|
||||
The_GetSuffix ());
|
||||
Frm_EndForm ();
|
||||
}
|
||||
else
|
||||
{
|
||||
Str_Copy (WWW,Ins->WWW,sizeof (WWW) - 1);
|
||||
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\"");
|
||||
HTM_A_Begin ("href=\"%s\" target=\"_blank\" title=\"%s\""
|
||||
" class=\"DAT_%s\"",
|
||||
Ins->WWW,
|
||||
The_GetSuffix (),
|
||||
Ins->WWW);
|
||||
HTM_Txt (WWW);
|
||||
HTM_A_End ();
|
||||
HTM_DIV_End ();
|
||||
case Usr_I_CAN:
|
||||
Frm_BeginForm (ActChgInsWWW);
|
||||
ParCod_PutPar (ParCod_OthHie,Ins->HieCod);
|
||||
HTM_INPUT_URL ("WWW",Ins->WWW,HTM_SUBMIT_ON_CHANGE,
|
||||
"class=\"INPUT_WWW INPUT_%s\""
|
||||
" required=\"required\"",
|
||||
The_GetSuffix ());
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Str_Copy (WWW,Ins->WWW,sizeof (WWW) - 1);
|
||||
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHRT\"");
|
||||
HTM_A_Begin ("href=\"%s\" target=\"_blank\" title=\"%s\""
|
||||
" class=\"DAT_%s\"",
|
||||
Ins->WWW,
|
||||
The_GetSuffix (),
|
||||
Ins->WWW);
|
||||
HTM_Txt (WWW);
|
||||
HTM_A_End ();
|
||||
HTM_DIV_End ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
|
@ -995,7 +997,8 @@ static void Ins_ListInstitutionsForEdition (void)
|
|||
HTM_TD_End ();
|
||||
|
||||
/* Institution status */
|
||||
Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM,
|
||||
Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT,
|
||||
Ins->Status,ActChgInsSta,Ins->HieCod,
|
||||
Txt_INSTITUTION_STATUS);
|
||||
|
||||
|
|
|
@ -102,7 +102,7 @@ static void Lnk_EditingLinkDestructor (void);
|
|||
|
||||
static Usr_ICan_t Lnk_CheckIfICanEditLinks (void)
|
||||
{
|
||||
static bool Lnk_ICanEditLinks[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t Lnk_ICanEditLinks[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
|
|
177
swad_mail.c
177
swad_mail.c
|
@ -1296,18 +1296,20 @@ void Mai_RemoveOtherUsrEmail (void)
|
|||
{
|
||||
/***** Get other user's code from form and get user's data *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
{
|
||||
/***** Remove user's email *****/
|
||||
Mai_RemoveEmail (&Gbl.Usrs.Other.UsrDat);
|
||||
case Usr_I_CAN:
|
||||
/***** Remove user's email *****/
|
||||
Mai_RemoveEmail (&Gbl.Usrs.Other.UsrDat);
|
||||
|
||||
/***** Show form again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
/***** Show form again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
else // User not found
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
@ -1321,24 +1323,28 @@ static void Mai_RemoveEmail (struct Usr_Data *UsrDat)
|
|||
extern const char *Txt_Email_X_removed;
|
||||
char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
|
||||
|
||||
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
|
||||
switch (Usr_CheckIfICanEditOtherUsr (UsrDat))
|
||||
{
|
||||
/***** Get new email from form *****/
|
||||
Par_GetParText ("Email",Email,Cns_MAX_BYTES_EMAIL_ADDRESS);
|
||||
case Usr_I_CAN:
|
||||
/***** Get new email from form *****/
|
||||
Par_GetParText ("Email",Email,Cns_MAX_BYTES_EMAIL_ADDRESS);
|
||||
|
||||
/***** Remove one of user's old email addresses *****/
|
||||
Mai_DB_RemoveEmail (UsrDat->UsrCod,Email);
|
||||
/***** Remove one of user's old email addresses *****/
|
||||
Mai_DB_RemoveEmail (UsrDat->UsrCod,Email);
|
||||
|
||||
/***** Create alert *****/
|
||||
Ale_CreateAlert (Ale_SUCCESS,Mai_EMAIL_SECTION_ID,
|
||||
Txt_Email_X_removed,
|
||||
Email);
|
||||
/***** Create alert *****/
|
||||
Ale_CreateAlert (Ale_SUCCESS,Mai_EMAIL_SECTION_ID,
|
||||
Txt_Email_X_removed,
|
||||
Email);
|
||||
|
||||
/***** Update list of emails *****/
|
||||
Mai_GetEmailFromUsrCod (UsrDat);
|
||||
/***** Update list of emails *****/
|
||||
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 *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
{
|
||||
/***** Change user's ID *****/
|
||||
Mai_ChangeUsrEmail (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
|
||||
case Usr_I_CAN:
|
||||
/***** Change user's ID *****/
|
||||
Mai_ChangeUsrEmail (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
|
||||
|
||||
/***** Show form again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
/***** Show form again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
else // User not found
|
||||
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;
|
||||
char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
|
||||
|
||||
if (Usr_CheckIfICanEditOtherUsr (UsrDat) == Usr_I_CAN)
|
||||
switch (Usr_CheckIfICanEditOtherUsr (UsrDat))
|
||||
{
|
||||
/***** Get new email from form *****/
|
||||
Par_GetParText ("NewEmail",NewEmail,Cns_MAX_BYTES_EMAIL_ADDRESS);
|
||||
case Usr_I_CAN:
|
||||
/***** Get new email from form *****/
|
||||
Par_GetParText ("NewEmail",NewEmail,Cns_MAX_BYTES_EMAIL_ADDRESS);
|
||||
|
||||
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_CheckIfEmailIsValid (NewEmail)) // New email is valid
|
||||
{
|
||||
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
|
||||
/***** 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_had_been_registered_by_another_user,
|
||||
Txt_The_email_address_X_matches_one_previously_registered,
|
||||
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
|
||||
Ale_CreateAlert (Ale_WARNING,Mai_EMAIL_SECTION_ID,
|
||||
Txt_The_email_address_entered_X_is_not_valid,
|
||||
NewEmail);
|
||||
else // New email is not valid
|
||||
Ale_CreateAlert (Ale_WARNING,Mai_EMAIL_SECTION_ID,
|
||||
Txt_The_email_address_entered_X_is_not_valid,
|
||||
NewEmail);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1666,11 +1678,11 @@ void Mai_WriteFootNoteEMail (FILE *FileMail,Lan_Language_t Language)
|
|||
/**************** Check if I can see another user's email ********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
bool Mai_ICanSeeOtherUsrEmail (const struct Usr_Data *UsrDat)
|
||||
Usr_ICan_t Mai_ICanSeeOtherUsrEmail (const struct Usr_Data *UsrDat)
|
||||
{
|
||||
/***** I can see my email *****/
|
||||
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
|
||||
/***** Check if I have permission to see another user's email *****/
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
|
@ -1678,37 +1690,42 @@ bool Mai_ICanSeeOtherUsrEmail (const struct Usr_Data *UsrDat)
|
|||
case Rol_STD:
|
||||
/* If I am a student in the current course,
|
||||
I can see the email of confirmed teachers */
|
||||
return (UsrDat->Roles.InCurrentCrs == Rol_NET || // A non-editing teacher
|
||||
UsrDat->Roles.InCurrentCrs == Rol_TCH) && // or a teacher
|
||||
UsrDat->Accepted; // who accepted registration
|
||||
return ((UsrDat->Roles.InCurrentCrs == Rol_NET || // A non-editing teacher
|
||||
UsrDat->Roles.InCurrentCrs == Rol_TCH) && // or a teacher
|
||||
UsrDat->Accepted) ? Usr_I_CAN : // who accepted registration
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
/* If I am a teacher in the current course,
|
||||
I can see the email of confirmed students and teachers */
|
||||
return Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat) && // A user belonging to the current course
|
||||
UsrDat->Accepted; // who accepted registration
|
||||
return (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat) && // A user belonging to the current course
|
||||
UsrDat->Accepted) ? Usr_I_CAN : // who accepted registration
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_DEG_ADM:
|
||||
/* If I am an administrator of current degree,
|
||||
I only can see the user's email of users from current degree */
|
||||
return Hie_CheckIfUsrBelongsTo (Hie_DEG,UsrDat->UsrCod,
|
||||
Gbl.Hierarchy.Node[Hie_DEG].HieCod,
|
||||
true); // count only accepted courses
|
||||
true) ? Usr_I_CAN : // count only accepted courses
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_CTR_ADM:
|
||||
/* If I am an administrator of current center,
|
||||
I only can see the user's email of users from current center */
|
||||
return Hie_CheckIfUsrBelongsTo (Hie_CTR,UsrDat->UsrCod,
|
||||
Gbl.Hierarchy.Node[Hie_CTR].HieCod,
|
||||
true); // count only accepted courses
|
||||
true) ? Usr_I_CAN : // count only accepted courses
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_INS_ADM:
|
||||
/* If I am an administrator of current institution,
|
||||
I only can see the user's email of users from current institution */
|
||||
return Hie_CheckIfUsrBelongsTo (Hie_INS,UsrDat->UsrCod,
|
||||
Gbl.Hierarchy.Node[Hie_INS].HieCod,
|
||||
true); // count only accepted courses
|
||||
true) ? Usr_I_CAN : // count only accepted courses
|
||||
Usr_I_CAN_NOT;
|
||||
case Rol_SYS_ADM:
|
||||
return true;
|
||||
return Usr_I_CAN;
|
||||
default:
|
||||
return false;
|
||||
return Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ void Mai_WriteWelcomeNoteEMail (FILE *FileMail,const struct Usr_Data *UsrDat,
|
|||
Lan_Language_t ToUsrLanguage);
|
||||
void Mai_WriteFootNoteEMail (FILE *FileMail,Lan_Language_t Language);
|
||||
|
||||
bool Mai_ICanSeeOtherUsrEmail (const struct Usr_Data *UsrDat);
|
||||
Usr_ICan_t Mai_ICanSeeOtherUsrEmail (const struct Usr_Data *UsrDat);
|
||||
|
||||
int Mai_SendMailMsg (const char FileNameMail[PATH_MAX + 1],
|
||||
const char *Subject,
|
||||
|
|
|
@ -131,7 +131,7 @@ void Map_AddMarker (const struct Map_Coordinates *Coord)
|
|||
/************************* Add a marker to our map ***************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Map_AddPopup (const char *Title,const char *Subtitle,bool Open)
|
||||
void Map_AddPopup (const char *Title,const char *Subtitle,CloOpe_ClosedOrOpen_t Open)
|
||||
{
|
||||
/* The bindPopup method attaches a popup with the specified HTML content
|
||||
to your marker so the popup appears when you click on the object,
|
||||
|
@ -140,7 +140,7 @@ void Map_AddPopup (const char *Title,const char *Subtitle,bool Open)
|
|||
HTM_TxtF ("\t"
|
||||
"marker.bindPopup(\"<strong>%s</strong><br />%s\")",
|
||||
Title,Subtitle);
|
||||
if (Open)
|
||||
if (Open == CloOpe_OPEN)
|
||||
HTM_Txt (".openPopup()");
|
||||
HTM_Txt (";\n");
|
||||
}
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
|
||||
#include <stdbool.h> // For boolean type
|
||||
|
||||
#include "swad_closed_open.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************** Public types and constants ***********************/
|
||||
/*****************************************************************************/
|
||||
|
@ -50,7 +52,7 @@ void Map_CreateMap (const char *ContainerId,
|
|||
const struct Map_Coordinates *Coord,unsigned Zoom);
|
||||
void Map_AddTileLayer (void);
|
||||
void Map_AddMarker (const struct Map_Coordinates *Coord);
|
||||
void Map_AddPopup (const char *Title,const char *Subtitle,bool Open);
|
||||
void Map_AddPopup (const char *Title,const char *Subtitle,CloOpe_ClosedOrOpen_t Open);
|
||||
void Map_GetCoordAndZoom (struct Map_Coordinates *Coord,unsigned *Zoom,
|
||||
const char *Query);
|
||||
double Map_GetLatitudeFromStr (char *Str);
|
||||
|
|
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 ());
|
||||
|
||||
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 *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemMch,NULL,Mch_PutParsEdit,Games);
|
||||
/***** Put icon to remove the match *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemMch,NULL,Mch_PutParsEdit,Games);
|
||||
|
||||
/***** Put icon to edit the match *****/
|
||||
Ico_PutContextualIconToEdit (ActReqChgMch,Anchor,Mch_PutParsEdit,Games);
|
||||
/***** Put icon to edit the match *****/
|
||||
Ico_PutContextualIconToEdit (ActReqChgMch,Anchor,Mch_PutParsEdit,Games);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconRemovalNotAllowed ();
|
||||
|
||||
HTM_TD_End ();
|
||||
}
|
||||
|
@ -835,25 +839,27 @@ static void Mch_ListOneOrMoreMatchesResultTch (struct Gam_Games *Games,
|
|||
"trophy.svg",Ico_BLACK);
|
||||
|
||||
/***** Check if visibility of session results can be changed *****/
|
||||
if (Mch_CheckIfICanChangeVisibilityOfResults (Match) == Usr_I_CAN)
|
||||
switch (Mch_CheckIfICanChangeVisibilityOfResults (Match))
|
||||
{
|
||||
/* I can edit visibility */
|
||||
if (Match->Status.ShowUsrResults)
|
||||
Lay_PutContextualLinkOnlyIcon (ActChgVisResMchUsr,NULL,
|
||||
Mch_PutParsEdit,Games,
|
||||
"eye.svg",Ico_GREEN);
|
||||
else
|
||||
Lay_PutContextualLinkOnlyIcon (ActChgVisResMchUsr,NULL,
|
||||
Mch_PutParsEdit,Games,
|
||||
"eye-slash.svg",Ico_RED);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* I can not edit visibility */
|
||||
if (Match->Status.ShowUsrResults)
|
||||
Ico_PutIconOff ("eye.svg" ,Ico_GREEN,Txt_Visible_results);
|
||||
else
|
||||
Ico_PutIconOff ("eye-slash.svg",Ico_RED ,Txt_Hidden_results );
|
||||
case Usr_I_CAN:
|
||||
/* I can edit visibility */
|
||||
if (Match->Status.ShowUsrResults)
|
||||
Lay_PutContextualLinkOnlyIcon (ActChgVisResMchUsr,NULL,
|
||||
Mch_PutParsEdit,Games,
|
||||
"eye.svg",Ico_GREEN);
|
||||
else
|
||||
Lay_PutContextualLinkOnlyIcon (ActChgVisResMchUsr,NULL,
|
||||
Mch_PutParsEdit,Games,
|
||||
"eye-slash.svg",Ico_RED);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
/* I can not edit visibility */
|
||||
if (Match->Status.ShowUsrResults)
|
||||
Ico_PutIconOff ("eye.svg" ,Ico_GREEN,Txt_Visible_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)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT DAT_%s %s\"",
|
||||
Id,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
Id,The_GetSuffix (),The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
|
||||
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
|
||||
true,true,false,0x7);
|
||||
|
@ -772,8 +771,7 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
|
|||
|
||||
/* Write match title */
|
||||
HTM_TD_Begin ("class=\"LT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
HTM_Txt (Match.Title);
|
||||
HTM_TD_End ();
|
||||
|
||||
|
@ -787,110 +785,137 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
|
|||
|
||||
/* Write number of questions */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write number of non-blank answers */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
if (Print.NumQsts.NotBlank)
|
||||
HTM_Unsigned (Print.NumQsts.NotBlank);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
if (Print.NumQsts.NotBlank)
|
||||
HTM_Unsigned (Print.NumQsts.NotBlank);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write number of blank answers */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank;
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
if (NumQstsBlank)
|
||||
HTM_Unsigned (NumQstsBlank);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
if (NumQstsBlank)
|
||||
HTM_Unsigned (NumQstsBlank);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write score */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
case Usr_I_CAN:
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write average score per question */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
|
||||
(double) Print.NumQsts.All :
|
||||
0.0);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
|
||||
(double) Print.NumQsts.All :
|
||||
0.0);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write grade over maximum grade */
|
||||
HTM_TD_Begin ("class=\"RT DAT_%s LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
Grade = TstPrn_ComputeGrade (Print.NumQsts.All,Print.Score,Games->Game.MaxGrade);
|
||||
TstPrn_ShowGrade (Grade,Games->Game.MaxGrade);
|
||||
TotalGrade += Grade;
|
||||
case Usr_I_CAN:
|
||||
Grade = TstPrn_ComputeGrade (Print.NumQsts.All,Print.Score,
|
||||
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 ();
|
||||
|
||||
/* Link to show this result */
|
||||
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
switch (ICanView.Result)
|
||||
{
|
||||
Games->Game.GamCod = Match.GamCod;
|
||||
Games->MchCod = Match.MchCod;
|
||||
switch (MeOrOther)
|
||||
{
|
||||
case Usr_ME:
|
||||
Frm_BeginForm (ActSeeOneMchResMe);
|
||||
Mch_PutParsEdit (Games);
|
||||
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneMchResMe);
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
Frm_BeginForm (ActSeeOneMchResOth);
|
||||
Mch_PutParsEdit (Games);
|
||||
Usr_PutParOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
|
||||
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneMchResOth);
|
||||
break;
|
||||
}
|
||||
Frm_EndForm ();
|
||||
case Usr_I_CAN:
|
||||
Games->Game.GamCod = Match.GamCod;
|
||||
Games->MchCod = Match.MchCod;
|
||||
switch (MeOrOther)
|
||||
{
|
||||
case Usr_ME:
|
||||
Frm_BeginForm (ActSeeOneMchResMe);
|
||||
Mch_PutParsEdit (Games);
|
||||
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneMchResMe);
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
Frm_BeginForm (ActSeeOneMchResOth);
|
||||
Mch_PutParsEdit (Games);
|
||||
Usr_PutParOtherUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
|
||||
Ico_PutIconLink ("tasks.svg",Ico_BLACK,ActSeeOneMchResOth);
|
||||
break;
|
||||
}
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
HTM_TR_End ();
|
||||
|
@ -1071,7 +1096,6 @@ void MchRes_ShowOneMchResult (void)
|
|||
UsrDat = &Gbl.Usrs.Me.UsrDat;
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
UsrDat = &Gbl.Usrs.Other.UsrDat;
|
||||
Usr_GetParOtherUsrCodEncrypted (UsrDat);
|
||||
break;
|
||||
|
@ -1201,16 +1225,20 @@ void MchRes_ShowOneMchResult (void)
|
|||
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||
The_GetSuffix ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
HTM_STRONG_Begin ();
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
HTM_STRONG_End ();
|
||||
case Usr_I_CAN:
|
||||
HTM_STRONG_Begin ();
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
HTM_Txt ("/");
|
||||
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_TR_End ();
|
||||
|
@ -1225,14 +1253,19 @@ void MchRes_ShowOneMchResult (void)
|
|||
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||
The_GetSuffix ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
HTM_STRONG_Begin ();
|
||||
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Games.Game.MaxGrade);
|
||||
HTM_STRONG_End ();
|
||||
case Usr_I_CAN:
|
||||
HTM_STRONG_Begin ();
|
||||
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_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...
|
||||
// ...because I should be able to see old matches made in old groups to which I belonged
|
||||
|
||||
if (ICanView->Result == Usr_I_CAN)
|
||||
// Depends on 5 visibility icons associated to game
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (Game->Visibility) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
else
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
switch (ICanView->Result)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
// Depends on 5 visibility icons associated to game
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (Game->Visibility) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
|
|
|
@ -154,7 +154,7 @@ static void Msg_GetMsgContent (long MsgCod,
|
|||
|
||||
static void Msg_WriteSentOrReceivedMsgSubject (struct Msg_Messages *Messages,
|
||||
long MsgCod,const char *Subject,
|
||||
bool Open,bool Expanded);
|
||||
CloOpe_ClosedOrOpen_t Open,bool Expanded);
|
||||
|
||||
static bool Msg_WriteCrsOrgMsg (long CrsCod);
|
||||
|
||||
|
@ -2015,7 +2015,7 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
|
|||
char Content[Cns_MAX_BYTES_LONG_TEXT + 1];
|
||||
struct Med_Media Media;
|
||||
bool Deleted;
|
||||
bool Open = true;
|
||||
CloOpe_ClosedOrOpen_t Open = CloOpe_OPEN;
|
||||
bool Replied = false; // Initialized to avoid warning
|
||||
bool Expanded = false;
|
||||
|
||||
|
@ -2040,9 +2040,9 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
|
|||
switch (Messages->TypeOfMessages)
|
||||
{
|
||||
case Msg_RECEIVED:
|
||||
Title = (Open ? (Replied ? Txt_MSG_Replied :
|
||||
Txt_MSG_Not_replied) :
|
||||
Txt_MSG_Unopened);
|
||||
Title = (Open == CloOpe_OPEN ? (Replied ? Txt_MSG_Replied :
|
||||
Txt_MSG_Not_replied) :
|
||||
Txt_MSG_Unopened);
|
||||
break;
|
||||
case Msg_SENT:
|
||||
Title = Txt_MSG_Sent;
|
||||
|
@ -2055,15 +2055,15 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
|
|||
|
||||
/***** Icons *****/
|
||||
HTM_TD_Begin ("class=\"CONTEXT_COL %s_%s\"",
|
||||
Messages->TypeOfMessages == Msg_RECEIVED ? (Open ? "MSG_BG" :
|
||||
"MSG_BG_NEW") :
|
||||
Messages->TypeOfMessages == Msg_RECEIVED ? (Open == CloOpe_OPEN ? "MSG_BG" :
|
||||
"MSG_BG_NEW") :
|
||||
"MSG_BG",
|
||||
The_GetSuffix ());
|
||||
|
||||
/* Type of message icon (envelope, reply...) */
|
||||
Ico_PutIcon (Messages->TypeOfMessages == Msg_RECEIVED ? (Open ? (Replied ? "reply.svg" :
|
||||
"envelope-open-text.svg") :
|
||||
"envelope.svg") :
|
||||
Ico_PutIcon (Messages->TypeOfMessages == Msg_RECEIVED ? (Open == CloOpe_OPEN ? (Replied ? "reply.svg" :
|
||||
"envelope-open-text.svg") :
|
||||
"envelope.svg") :
|
||||
"share.svg",
|
||||
Ico_BLACK,Title,"ICO16x16");
|
||||
|
||||
|
@ -2076,14 +2076,14 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
|
|||
HTM_TD_End ();
|
||||
|
||||
/***** Number *****/
|
||||
Msg_WriteMsgNumber (MsgNum,!Open);
|
||||
Msg_WriteMsgNumber (MsgNum,Open == CloOpe_CLOSED);
|
||||
|
||||
/***** Author *****/
|
||||
HTM_TD_Begin ("class=\"LT %s_%s %s_%s\"",
|
||||
Open ? "MSG_AUT" :
|
||||
"MSG_AUT_NEW",The_GetSuffix (),
|
||||
Open ? "MSG_BG" :
|
||||
"MSG_BG_NEW",The_GetSuffix ());
|
||||
Open == CloOpe_OPEN ? "MSG_AUT" :
|
||||
"MSG_AUT_NEW",The_GetSuffix (),
|
||||
Open == CloOpe_OPEN ? "MSG_BG" :
|
||||
"MSG_BG_NEW",The_GetSuffix ());
|
||||
Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat,
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS);
|
||||
|
@ -2095,10 +2095,10 @@ static void Msg_ShowASentOrReceivedMessage (struct Msg_Messages *Messages,
|
|||
|
||||
/***** Date-time *****/
|
||||
Msg_WriteMsgDate (CreatTimeUTC,
|
||||
Open ? "MSG_TIT" :
|
||||
"MSG_TIT_NEW",
|
||||
Open ? "MSG_BG" :
|
||||
"MSG_BG_NEW");
|
||||
Open == CloOpe_OPEN ? "MSG_TIT" :
|
||||
"MSG_TIT_NEW",
|
||||
Open == CloOpe_OPEN ? "MSG_BG" :
|
||||
"MSG_BG_NEW");
|
||||
|
||||
HTM_TR_End ();
|
||||
|
||||
|
@ -2249,7 +2249,7 @@ void Msg_WriteMsgNumber (unsigned long MsgNum,bool NewMsg)
|
|||
|
||||
static void Msg_WriteSentOrReceivedMsgSubject (struct Msg_Messages *Messages,
|
||||
long MsgCod,const char *Subject,
|
||||
bool Open,bool Expanded)
|
||||
CloOpe_ClosedOrOpen_t Open,bool Expanded)
|
||||
{
|
||||
extern const char *Txt_Hide_message;
|
||||
extern const char *Txt_See_message;
|
||||
|
@ -2257,10 +2257,10 @@ static void Msg_WriteSentOrReceivedMsgSubject (struct Msg_Messages *Messages,
|
|||
|
||||
/***** Begin cell *****/
|
||||
HTM_TD_Begin ("class=\"LT %s_%s %s_%s\"",
|
||||
Open ? "MSG_TIT" :
|
||||
"MSG_TIT_NEW",The_GetSuffix (),
|
||||
Open ? "MSG_BG" :
|
||||
"MSG_BG_NEW" ,The_GetSuffix ());
|
||||
Open == CloOpe_OPEN ? "MSG_TIT" :
|
||||
"MSG_TIT_NEW",The_GetSuffix (),
|
||||
Open == CloOpe_OPEN ? "MSG_BG" :
|
||||
"MSG_BG_NEW" ,The_GetSuffix ());
|
||||
|
||||
/***** Begin form to expand/contract the message *****/
|
||||
Frm_BeginForm (Messages->TypeOfMessages == Msg_RECEIVED ? (Expanded ? ActConRcvMsg :
|
||||
|
|
|
@ -727,7 +727,7 @@ bool Msg_DB_GetStatusOfSntMsg (long MsgCod)
|
|||
/*****************************************************************************/
|
||||
|
||||
void Msg_DB_GetStatusOfRcvMsg (long MsgCod,
|
||||
bool *Open,bool *Replied,bool *Expanded)
|
||||
CloOpe_ClosedOrOpen_t *Open,bool *Replied,bool *Expanded)
|
||||
{
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row;
|
||||
|
@ -751,7 +751,8 @@ void Msg_DB_GetStatusOfRcvMsg (long MsgCod,
|
|||
/***** Get if message has been read by me (row[0]),
|
||||
if message has been replied (row[1]), and
|
||||
if message is expanded (row[2]) *****/
|
||||
*Open = (row[0][0] == 'Y');
|
||||
*Open = (row[0][0] == 'Y') ? CloOpe_OPEN :
|
||||
CloOpe_CLOSED;
|
||||
*Replied = (row[1][0] == 'Y');
|
||||
*Expanded = (row[2][0] == 'Y');
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ unsigned Msg_DB_GetMsgContent (MYSQL_RES **mysql_res,long MsgCod);
|
|||
unsigned Msg_DB_GetMsgSntData (MYSQL_RES **mysql_res,long MsgCod,bool *Deleted);
|
||||
bool Msg_DB_GetStatusOfSntMsg (long MsgCod);
|
||||
void Msg_DB_GetStatusOfRcvMsg (long MsgCod,
|
||||
bool *Open,bool *Replied,bool *Expanded);
|
||||
CloOpe_ClosedOrOpen_t *Open,bool *Replied,bool *Expanded);
|
||||
bool Msg_DB_CheckIfSntMsgIsDeleted (long MsgCod);
|
||||
bool Msg_DB_CheckIfRcvMsgIsDeletedForAllItsRecipients (long MsgCod);
|
||||
long Msg_DB_GetSender (long MsgCod);
|
||||
|
|
|
@ -423,27 +423,29 @@ void Nck_RemoveOtherUsrNick (void)
|
|||
|
||||
/***** Get user whose nick must be removed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
{
|
||||
/***** Get nickname from form *****/
|
||||
Par_GetParText ("Nick",NickWithoutArr,
|
||||
Nck_MAX_BYTES_NICK_WITHOUT_ARROBA);
|
||||
case Usr_I_CAN:
|
||||
/***** Get nickname from form *****/
|
||||
Par_GetParText ("Nick",NickWithoutArr,
|
||||
Nck_MAX_BYTES_NICK_WITHOUT_ARROBA);
|
||||
|
||||
/***** Remove one of the old nicknames *****/
|
||||
Nck_DB_RemoveNickname (Gbl.Usrs.Other.UsrDat.UsrCod,NickWithoutArr);
|
||||
/***** Remove one of the old nicknames *****/
|
||||
Nck_DB_RemoveNickname (Gbl.Usrs.Other.UsrDat.UsrCod,NickWithoutArr);
|
||||
|
||||
/***** Show message *****/
|
||||
Ale_CreateAlert (Ale_SUCCESS,Nck_NICKNAME_SECTION_ID,
|
||||
Txt_Nickname_X_removed,
|
||||
NickWithoutArr);
|
||||
/***** Show message *****/
|
||||
Ale_CreateAlert (Ale_SUCCESS,Nck_NICKNAME_SECTION_ID,
|
||||
Txt_Nickname_X_removed,
|
||||
NickWithoutArr);
|
||||
|
||||
/***** Show user's account again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
/***** Show user's account again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
else // User not found
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
@ -469,18 +471,20 @@ void Nck_ChangeOtherUsrNick (void)
|
|||
{
|
||||
/***** Get user whose nick must be changed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
{
|
||||
/***** Update user's nickname *****/
|
||||
Nck_ChangeUsrNick (&Gbl.Usrs.Other.UsrDat);
|
||||
case Usr_I_CAN:
|
||||
/***** Update user's nickname *****/
|
||||
Nck_ChangeUsrNick (&Gbl.Usrs.Other.UsrDat);
|
||||
|
||||
/***** Show user's account again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
/***** Show user's account again *****/
|
||||
Acc_ShowFormChgOtherUsrAccount ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
else // User not found
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
|
|
|
@ -176,13 +176,17 @@ void Pwd_UpdateOtherUsrPwd (void)
|
|||
{
|
||||
/***** Get other user's code from form and get user's data *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
/***** Check and update password *****/
|
||||
Pwd_CheckAndUpdateNewPwd (&Gbl.Usrs.Other.UsrDat);
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
switch (Usr_CheckIfICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
/***** Check and update password *****/
|
||||
Pwd_CheckAndUpdateNewPwd (&Gbl.Usrs.Other.UsrDat);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else // User not found
|
||||
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);
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
if (Pho_ICanChangeOtherUsrPhoto (UsrDat) == Usr_I_CAN)
|
||||
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL,
|
||||
Rec_PutParUsrCodEncrypted,NULL,
|
||||
|
@ -318,7 +317,6 @@ static void Pho_ReqPhoto (const struct Usr_Data *UsrDat)
|
|||
Frm_BeginForm (ActDetMyPho);
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
Frm_BeginForm (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs]);
|
||||
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
|
||||
break;
|
||||
|
@ -368,7 +366,6 @@ void Pho_SendPhotoUsr (void)
|
|||
Pho_ReqMyPhoto ();
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
/***** Form to send another user's photo *****/
|
||||
Pho_ReqOtherUsrPhoto ();
|
||||
break;
|
||||
|
@ -521,32 +518,34 @@ void Pho_ReqRemUsrPhoto (void)
|
|||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat,
|
||||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CRS))
|
||||
{
|
||||
if (Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat) == Usr_I_CAN)
|
||||
switch (Pho_ICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat))
|
||||
{
|
||||
/***** 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 */
|
||||
Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_photo_of_X,
|
||||
Gbl.Usrs.Other.UsrDat.FullName);
|
||||
case Usr_I_CAN:
|
||||
/***** 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 */
|
||||
Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_photo_of_X,
|
||||
Gbl.Usrs.Other.UsrDat.FullName);
|
||||
|
||||
/* Show current photo */
|
||||
Pho_ShowUsrPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL,
|
||||
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_NO_ZOOM);
|
||||
/* Show current photo */
|
||||
Pho_ShowUsrPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL,
|
||||
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_NO_ZOOM);
|
||||
|
||||
/* End alert */
|
||||
Ale_ShowAlertAndButtonEnd (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs],NULL,NULL,
|
||||
Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
|
||||
Btn_REMOVE_BUTTON,Txt_Remove);
|
||||
}
|
||||
else
|
||||
Ale_ShowAlert (Ale_INFO,Txt_The_photo_no_longer_exists);
|
||||
/* End alert */
|
||||
Ale_ShowAlertAndButtonEnd (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs],NULL,NULL,
|
||||
Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
|
||||
Btn_REMOVE_BUTTON,Txt_Remove);
|
||||
}
|
||||
else
|
||||
Ale_ShowAlert (Ale_INFO,Txt_The_photo_no_longer_exists);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
|
||||
|
|
12
swad_place.c
12
swad_place.c
|
@ -61,7 +61,7 @@ static struct Plc_Place *Plc_EditingPlc = NULL; // Static variable to keep the p
|
|||
/***************************** Private prototypes ****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Plc_CheckIfICanEditPlaces (void);
|
||||
static Usr_ICan_t Plc_CheckIfICanEditPlaces (void);
|
||||
|
||||
static Plc_Order_t Plc_GetParPlcOrder (void);
|
||||
static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args);
|
||||
|
@ -86,13 +86,13 @@ static void Plc_EditingPlaceDestructor (void);
|
|||
/************************* Check if I can edit places ************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Plc_CheckIfICanEditPlaces (void)
|
||||
static Usr_ICan_t Plc_CheckIfICanEditPlaces (void)
|
||||
{
|
||||
static bool Plc_ICanEditPlaces[Rol_NUM_ROLES] =
|
||||
static Usr_ICan_t Plc_ICanEditPlaces[Rol_NUM_ROLES] =
|
||||
{
|
||||
/* Users who can edit */
|
||||
[Rol_INS_ADM] = true,
|
||||
[Rol_SYS_ADM] = true,
|
||||
[Rol_INS_ADM] = Usr_I_CAN,
|
||||
[Rol_SYS_ADM] = Usr_I_CAN,
|
||||
};
|
||||
|
||||
return Plc_ICanEditPlaces[Gbl.Usrs.Me.Role.Logged];
|
||||
|
@ -238,7 +238,7 @@ static Plc_Order_t Plc_GetParPlcOrder (void)
|
|||
static void Plc_PutIconsListingPlaces (__attribute__((unused)) void *Args)
|
||||
{
|
||||
/***** Put icon to edit places *****/
|
||||
if (Plc_CheckIfICanEditPlaces ())
|
||||
if (Plc_CheckIfICanEditPlaces () == Usr_I_CAN)
|
||||
Plc_PutIconToEditPlaces ();
|
||||
}
|
||||
|
||||
|
|
|
@ -1337,7 +1337,7 @@ static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,
|
|||
[PhoSha_SHAPE_OVAL ] = "PHOTOO30x40",
|
||||
[PhoSha_SHAPE_RECTANGLE] = "PHOTOR30x40",
|
||||
};
|
||||
bool Visible = (Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat) == Usr_I_CAN);
|
||||
Usr_ICan_t ICanView = Pri_CheckIfICanView (UsrDat->BaPrfVisibility,UsrDat);
|
||||
|
||||
HTM_TD_Begin ("class=\"RM %s_%s %s\"",
|
||||
Class[MeOrOther],
|
||||
|
@ -1348,7 +1348,7 @@ static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,
|
|||
|
||||
/***** Check if I can see the public profile *****/
|
||||
HTM_TD_Begin ("class=\"RANK_PHOTO %s\"",The_GetColorRows ());
|
||||
if (Visible)
|
||||
if (ICanView == Usr_I_CAN)
|
||||
/***** User's photo *****/
|
||||
Pho_ShowUsrPhotoIfAllowed (UsrDat,
|
||||
ClassPhoto[Gbl.Prefs.PhotoShape],Pho_ZOOM);
|
||||
|
@ -1359,7 +1359,7 @@ static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,
|
|||
Class[MeOrOther],
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (Visible)
|
||||
if (ICanView == Usr_I_CAN)
|
||||
{
|
||||
Frm_BeginForm (ActSeeOthPubPrf);
|
||||
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
|
||||
|
|
|
@ -557,8 +557,8 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
|
|||
Err_NotEnoughMemoryExit ();
|
||||
HTM_DIV_Begin ("id=\"%s\" class=\"%s_%s%s\"",
|
||||
Id,
|
||||
Item->Open ? "DATE_GREEN" :
|
||||
"DATE_RED",
|
||||
Item->Open == CloOpe_OPEN ? "DATE_GREEN" :
|
||||
"DATE_RED",
|
||||
The_GetSuffix (),
|
||||
HidVis_PrgClass[HiddenOrVisible]);
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Item->TimeUTC[StartEndTime],
|
||||
|
@ -1223,7 +1223,8 @@ static void Prg_GetItemDataFromRow (MYSQL_RES **mysql_res,
|
|||
Item->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[6]);
|
||||
|
||||
/* Get whether the program item is open or closed (row(7)) */
|
||||
Item->Open = (row[7][0] == '1');
|
||||
Item->Open = (row[7][0] == '1') ? CloOpe_OPEN :
|
||||
CloOpe_CLOSED;
|
||||
|
||||
/* Get the title of the program item (row[8]) */
|
||||
Str_Copy (Item->Title,row[8],sizeof (Item->Title) - 1);
|
||||
|
@ -1265,7 +1266,7 @@ void Prg_ResetItem (struct Prg_Item *Item)
|
|||
Item->UsrCod = -1L;
|
||||
Item->TimeUTC[Dat_STR_TIME] =
|
||||
Item->TimeUTC[Dat_END_TIME] = (time_t) 0;
|
||||
Item->Open = false;
|
||||
Item->Open = CloOpe_CLOSED;
|
||||
Item->Title[0] = '\0';
|
||||
Prg_ResetResource (Item);
|
||||
}
|
||||
|
@ -1894,7 +1895,7 @@ static void Prg_ShowFormToCreateItem (long ParentItmCod)
|
|||
Prg_ResetItem (&Item);
|
||||
Item.TimeUTC[Dat_STR_TIME] = Dat_GetStartExecutionTimeUTC ();
|
||||
Item.TimeUTC[Dat_END_TIME] = Item.TimeUTC[Dat_STR_TIME] + (2 * 60 * 60); // +2 hours
|
||||
Item.Open = true;
|
||||
Item.Open = CloOpe_OPEN;
|
||||
|
||||
/***** Show pending alerts */
|
||||
Ale_ShowAlerts (NULL);
|
||||
|
|
|
@ -62,7 +62,7 @@ struct Prg_Item
|
|||
unsigned NumItem;
|
||||
long UsrCod;
|
||||
time_t TimeUTC[Dat_NUM_START_END_TIME];
|
||||
bool Open;
|
||||
CloOpe_ClosedOrOpen_t Open;
|
||||
char Title[Prg_MAX_BYTES_PROGRAM_ITEM_TITLE + 1];
|
||||
struct
|
||||
{
|
||||
|
|
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 *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Prj_CheckIfICanEditProject (&Projects->Prj) == Usr_I_CAN)
|
||||
switch (Prj_CheckIfICanEditProject (&Projects->Prj))
|
||||
{
|
||||
/***** Show question and button to remove user as a role from project *****/
|
||||
/* Begin alert */
|
||||
Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Question[Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)],
|
||||
Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex],
|
||||
Projects->Prj.Title);
|
||||
case Usr_I_CAN:
|
||||
/***** Show question and button to remove user as a role from project *****/
|
||||
/* Begin alert */
|
||||
Ale_ShowAlertAndButtonBegin (Ale_QUESTION,Question[Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)],
|
||||
Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex],
|
||||
Projects->Prj.Title);
|
||||
|
||||
/* Show user's record */
|
||||
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
|
||||
/* Show user's record */
|
||||
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
|
||||
|
||||
/* Show form to request confirmation */
|
||||
Frm_BeginForm (ActionRemUsr[RoleInPrj]);
|
||||
Prj_PutCurrentPars (Projects);
|
||||
if (asprintf (&TxtButton,Txt_Remove_USER_from_this_project,
|
||||
Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex]) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
Btn_PutRemoveButton (TxtButton);
|
||||
free (TxtButton);
|
||||
Frm_EndForm ();
|
||||
/* Show form to request confirmation */
|
||||
Frm_BeginForm (ActionRemUsr[RoleInPrj]);
|
||||
Prj_PutCurrentPars (Projects);
|
||||
if (asprintf (&TxtButton,Txt_Remove_USER_from_this_project,
|
||||
Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex]) < 0)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
Btn_PutRemoveButton (TxtButton);
|
||||
free (TxtButton);
|
||||
Frm_EndForm ();
|
||||
|
||||
/* End alert */
|
||||
Ale_ShowAlertAndButtonEnd (ActUnk,NULL,NULL,NULL,NULL,Btn_NO_BUTTON,NULL);
|
||||
/* End alert */
|
||||
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
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
|
||||
|
@ -3128,25 +3130,27 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInPrj)
|
|||
|
||||
/***** Get user to be removed *****/
|
||||
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
|
||||
{
|
||||
if (Prj_CheckIfICanEditProject (&Projects.Prj) == Usr_I_CAN)
|
||||
switch (Prj_CheckIfICanEditProject (&Projects.Prj))
|
||||
{
|
||||
/***** Remove user from the table of project-users *****/
|
||||
Prj_DB_RemoveUsrFromPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod);
|
||||
case Usr_I_CAN:
|
||||
/***** Remove user from the table of project-users *****/
|
||||
Prj_DB_RemoveUsrFromPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod);
|
||||
|
||||
/***** Flush cache *****/
|
||||
if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME)
|
||||
Prj_FlushCacheMyRolesInProject ();
|
||||
/***** Flush cache *****/
|
||||
if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME)
|
||||
Prj_FlushCacheMyRolesInProject ();
|
||||
|
||||
/***** Show success alert *****/
|
||||
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_removed_as_a_Y_from_the_project_Z,
|
||||
Gbl.Usrs.Other.UsrDat.FullName,
|
||||
Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex],
|
||||
Projects.Prj.Title);
|
||||
/***** Show success alert *****/
|
||||
Ale_ShowAlert (Ale_SUCCESS,Txt_THE_USER_X_has_been_removed_as_a_Y_from_the_project_Z,
|
||||
Gbl.Usrs.Other.UsrDat.FullName,
|
||||
Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex],
|
||||
Projects.Prj.Title);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
}
|
||||
else
|
||||
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
|
||||
|
||||
|
@ -3208,17 +3212,21 @@ static void Prj_PutIconsToRemEditOnePrj (struct Prj_Projects *Projects,
|
|||
Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutCurrentPars,Projects);
|
||||
|
||||
/***** Locked/unlocked project edition *****/
|
||||
if (PrjCfg_CheckIfICanConfig () == Usr_I_CAN)
|
||||
switch (PrjCfg_CheckIfICanConfig ())
|
||||
{
|
||||
/* Icon to lock/unlock project edition */
|
||||
HTM_DIV_Begin ("id=\"prj_lck_%ld\" class=\"PRJ_LOCK\"",
|
||||
Projects->Prj.PrjCod);
|
||||
Prj_FormLockUnlock (&Projects->Prj);
|
||||
HTM_DIV_End ();
|
||||
case Usr_I_CAN:
|
||||
/* Icon to lock/unlock project edition */
|
||||
HTM_DIV_Begin ("id=\"prj_lck_%ld\" class=\"PRJ_LOCK\"",
|
||||
Projects->Prj.PrjCod);
|
||||
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 *****/
|
||||
if (Rsc_CheckIfICanGetLink () == Usr_I_CAN)
|
||||
|
@ -4680,10 +4688,16 @@ void Prj_ChangeCriterionScore (void)
|
|||
Err_WrongRubricExit ();
|
||||
|
||||
/***** Update review *****/
|
||||
if (Prj_CheckIfICanFillRubric (Prj.PrjCod,WhichRubric) == Usr_I_CAN)
|
||||
Rub_DB_UpdateScore (Rsc_PROJECT,Prj.PrjCod,-1L,CriCod,Score);
|
||||
else
|
||||
Err_NoPermission ();
|
||||
switch (Prj_CheckIfICanFillRubric (Prj.PrjCod,WhichRubric))
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
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 *****/
|
||||
Prj_FreeMemProject (&Prj);
|
||||
|
|
108
swad_record.c
108
swad_record.c
|
@ -1575,13 +1575,13 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
|
|||
[Rec_CRS_PRINT_ONE_RECORD ] = NULL,
|
||||
[Rec_CRS_PRINT_SEVERAL_RECORDS ] = NULL,
|
||||
};
|
||||
bool ICanEdit = false;
|
||||
Usr_ICan_t ICanEdit = Usr_I_CAN_NOT;
|
||||
unsigned NumField;
|
||||
MYSQL_RES *mysql_res;
|
||||
MYSQL_ROW row = NULL; // Initialized to avoid warning
|
||||
bool ShowField;
|
||||
bool ThisFieldHasText;
|
||||
bool ICanEditThisField;
|
||||
Usr_ICan_t ICanEditThisField;
|
||||
char Text[Cns_MAX_BYTES_TEXT + 1];
|
||||
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
|
@ -1614,7 +1614,7 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
|
|||
NumField++)
|
||||
if (Gbl.Crs.Records.LstFields.Lst[NumField].Visibility == Rec_EDITABLE_FIELD)
|
||||
{
|
||||
ICanEdit = true;
|
||||
ICanEdit = Usr_I_CAN;
|
||||
Frm_BeginForm (ActRcvRecCrs);
|
||||
break;
|
||||
}
|
||||
|
@ -1626,7 +1626,7 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
|
|||
if (TypeOfView == Rec_CRS_LIST_ONE_RECORD ||
|
||||
TypeOfView == Rec_CRS_LIST_SEVERAL_RECORDS)
|
||||
{
|
||||
ICanEdit = true;
|
||||
ICanEdit = Usr_I_CAN;
|
||||
Frm_BeginFormAnchor (ActRcvRecOthUsr,Anchor);
|
||||
ParCod_PutPar (ParCod_OrgAct,Act_GetActCod (ActSeeRecSevStd)); // Original action, used to know where we came from
|
||||
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
|
||||
|
@ -1682,15 +1682,17 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
|
|||
{
|
||||
case Rol_STD:
|
||||
ICanEditThisField = (TypeOfView == Rec_CRS_MY_RECORD_AS_STUDENT_FORM &&
|
||||
Gbl.Crs.Records.LstFields.Lst[NumField].Visibility == Rec_EDITABLE_FIELD);
|
||||
Gbl.Crs.Records.LstFields.Lst[NumField].Visibility == Rec_EDITABLE_FIELD) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
ICanEditThisField = (TypeOfView == Rec_CRS_LIST_ONE_RECORD ||
|
||||
TypeOfView == Rec_CRS_LIST_SEVERAL_RECORDS);
|
||||
TypeOfView == Rec_CRS_LIST_SEVERAL_RECORDS) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
default:
|
||||
ICanEditThisField = false;
|
||||
ICanEditThisField = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1698,8 +1700,8 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
|
|||
HTM_TR_Begin (NULL);
|
||||
|
||||
HTM_TD_Begin ("class=\"REC_C1_BOT %s_%s RT %s\"",
|
||||
ICanEditThisField ? "FORM_IN" :
|
||||
"REC_DAT_SMALL", // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
ICanEditThisField == Usr_I_CAN ? "FORM_IN" :
|
||||
"REC_DAT_SMALL", // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
HTM_TxtColon (Gbl.Crs.Records.LstFields.Lst[NumField].Name);
|
||||
|
@ -1731,29 +1733,31 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
|
|||
HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT_STRONG_%s %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanEditThisField) // Show with form
|
||||
switch (ICanEditThisField)
|
||||
{
|
||||
HTM_TEXTAREA_Begin ("name=\"Field%ld\" rows=\"%u\""
|
||||
" class=\"REC_C2_BOT_INPUT INPUT_%s\"",
|
||||
Gbl.Crs.Records.LstFields.Lst[NumField].FieldCod,
|
||||
Gbl.Crs.Records.LstFields.Lst[NumField].NumLines,
|
||||
The_GetSuffix ());
|
||||
case Usr_I_CAN: // Show with form
|
||||
HTM_TEXTAREA_Begin ("name=\"Field%ld\" rows=\"%u\""
|
||||
" class=\"REC_C2_BOT_INPUT INPUT_%s\"",
|
||||
Gbl.Crs.Records.LstFields.Lst[NumField].FieldCod,
|
||||
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)
|
||||
HTM_Txt (row[0]);
|
||||
HTM_TEXTAREA_End ();
|
||||
}
|
||||
else // Show without form
|
||||
{
|
||||
if (ThisFieldHasText)
|
||||
{
|
||||
Str_Copy (Text,row[0],sizeof (Text));
|
||||
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
|
||||
Text,Cns_MAX_BYTES_TEXT,
|
||||
Str_DONT_REMOVE_SPACES);
|
||||
HTM_Txt (Text);
|
||||
}
|
||||
else
|
||||
HTM_Hyphen ();
|
||||
{
|
||||
Str_Copy (Text,row[0],sizeof (Text));
|
||||
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
|
||||
Text,Cns_MAX_BYTES_TEXT,
|
||||
Str_DONT_REMOVE_SPACES);
|
||||
HTM_Txt (Text);
|
||||
}
|
||||
else
|
||||
HTM_Hyphen ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
|
@ -1765,17 +1769,21 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
|
|||
}
|
||||
|
||||
/***** End box *****/
|
||||
if (ICanEdit)
|
||||
switch (ICanEdit)
|
||||
{
|
||||
/* End table, send button and end box */
|
||||
Box_BoxTableWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes);
|
||||
case Usr_I_CAN:
|
||||
/* End table, send button and end box */
|
||||
Box_BoxTableWithButtonEnd (Btn_CONFIRM_BUTTON,Txt_Save_changes);
|
||||
|
||||
/* End form */
|
||||
Frm_EndForm ();
|
||||
/* End form */
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
/* End table and box */
|
||||
Box_BoxTableEnd ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
/* End table and box */
|
||||
Box_BoxTableEnd ();
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -2252,7 +2260,6 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
|
|||
Grp_ShowLstGrpsToChgMyGrps ();
|
||||
break;
|
||||
case Usr_OTHER:
|
||||
default:
|
||||
Grp_ShowLstGrpsToChgOtherUsrsGrps (UsrDat->UsrCod);
|
||||
break;
|
||||
}
|
||||
|
@ -2677,20 +2684,21 @@ static void Rec_ShowEmail (struct Usr_Data *UsrDat)
|
|||
Frm_LabelColumn ("REC_C1_BOT RM",NULL,Txt_Email);
|
||||
|
||||
/* Data */
|
||||
HTM_TD_Begin ("class=\"REC_C2_BOT LM DAT_STRONG_%s\"",
|
||||
The_GetSuffix ());
|
||||
HTM_TD_Begin ("class=\"REC_C2_BOT LM DAT_STRONG_%s\"",The_GetSuffix ());
|
||||
if (UsrDat->Email[0])
|
||||
{
|
||||
if (Mai_ICanSeeOtherUsrEmail (UsrDat))
|
||||
switch (Mai_ICanSeeOtherUsrEmail (UsrDat))
|
||||
{
|
||||
HTM_A_Begin ("href=\"mailto:%s\" class=\"DAT_STRONG_%s\"",
|
||||
UsrDat->Email,The_GetSuffix ());
|
||||
HTM_Txt (UsrDat->Email);
|
||||
HTM_A_End ();
|
||||
case Usr_I_CAN:
|
||||
HTM_A_Begin ("href=\"mailto:%s\" class=\"DAT_STRONG_%s\"",
|
||||
UsrDat->Email,The_GetSuffix ());
|
||||
HTM_Txt (UsrDat->Email);
|
||||
HTM_A_End ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
HTM_Txt ("********");
|
||||
break;
|
||||
}
|
||||
else
|
||||
HTM_Txt ("********");
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
HTM_TR_End ();
|
||||
|
|
23
swad_role.c
23
swad_role.c
|
@ -70,11 +70,11 @@ extern struct Globals Gbl;
|
|||
|
||||
void Rol_SetMyRoles (void)
|
||||
{
|
||||
bool ICanBeAdm[Hie_NUM_LEVELS] =
|
||||
Usr_ICan_t ICanBeAdm[Hie_NUM_LEVELS] =
|
||||
{
|
||||
[Hie_INS] = false,
|
||||
[Hie_CTR] = false,
|
||||
[Hie_DEG] = false,
|
||||
[Hie_INS] = Usr_I_CAN_NOT,
|
||||
[Hie_CTR] = Usr_I_CAN_NOT,
|
||||
[Hie_DEG] = Usr_I_CAN_NOT,
|
||||
};
|
||||
|
||||
/***** Get my role in current course if not yet filled *****/
|
||||
|
@ -109,16 +109,19 @@ void Rol_SetMyRoles (void)
|
|||
{
|
||||
/* Check if I am and administrator of current institution */
|
||||
ICanBeAdm[Hie_INS] = Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||
Hie_INS);
|
||||
Hie_INS) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
if (Gbl.Hierarchy.Node[Hie_CTR].HieCod > 0)
|
||||
{
|
||||
/* Check if I am and administrator of current center */
|
||||
ICanBeAdm[Hie_CTR] = Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||
Hie_CTR);
|
||||
Hie_CTR) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
if (Gbl.Hierarchy.Node[Hie_DEG].HieCod > 0)
|
||||
/* Check if I am and administrator of current degree */
|
||||
ICanBeAdm[Hie_DEG] = Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||
Hie_DEG);
|
||||
Hie_DEG) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -185,11 +188,11 @@ void Rol_SetMyRoles (void)
|
|||
else
|
||||
Gbl.Usrs.Me.Role.Available = (1 << Rol_GST);
|
||||
|
||||
if (ICanBeAdm[Hie_INS])
|
||||
if (ICanBeAdm[Hie_INS] == Usr_I_CAN)
|
||||
Gbl.Usrs.Me.Role.Available |= (1 << Rol_INS_ADM);
|
||||
if (ICanBeAdm[Hie_CTR])
|
||||
if (ICanBeAdm[Hie_CTR] == Usr_I_CAN)
|
||||
Gbl.Usrs.Me.Role.Available |= (1 << Rol_CTR_ADM);
|
||||
if (ICanBeAdm[Hie_DEG])
|
||||
if (ICanBeAdm[Hie_DEG] == Usr_I_CAN)
|
||||
Gbl.Usrs.Me.Role.Available |= (1 << Rol_DEG_ADM);
|
||||
if (Usr_CheckIfUsrIsSuperuser (Gbl.Usrs.Me.UsrDat.UsrCod))
|
||||
Gbl.Usrs.Me.Role.Available |= (1 << Rol_SYS_ADM);
|
||||
|
|
|
@ -246,6 +246,7 @@ Usr_ICan_t Rub_CheckIfICanEditRubrics (void)
|
|||
bool Rub_CheckIfEditable (void)
|
||||
{
|
||||
if (Rub_CheckIfICanEditRubrics () == Usr_I_CAN)
|
||||
{
|
||||
/***** Rubric is editable only if ... *****/
|
||||
// TODO: Change to control that a rubric is not edited in some circunstances?
|
||||
/*
|
||||
|
@ -253,8 +254,9 @@ bool Rub_CheckIfEditable (void)
|
|||
Rubric->NumCriteria != 0;
|
||||
*/
|
||||
return true;
|
||||
else
|
||||
return false; // Questions are not editable
|
||||
}
|
||||
|
||||
return false; // Questions are not editable
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -527,7 +527,8 @@ void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics)
|
|||
MYSQL_RES *mysql_res;
|
||||
unsigned MaxCriInd;
|
||||
unsigned NumCriteria;
|
||||
bool ICanEditCriteria = Rub_CheckIfEditable ();
|
||||
Usr_ICan_t ICanEditCriteria = Rub_CheckIfEditable () ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
/***** Get maximum criterion index *****/
|
||||
MaxCriInd = Rub_DB_GetMaxCriterionIndexInRubric (Rubrics->Rubric.RubCod);
|
||||
|
@ -546,7 +547,7 @@ void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics)
|
|||
NumCriteria,mysql_res);
|
||||
|
||||
/***** Put forms to create/edit a criterion *****/
|
||||
if (ICanEditCriteria)
|
||||
if (ICanEditCriteria == Usr_I_CAN)
|
||||
RubCri_PutFormNewCriterion (Rubrics,MaxCriInd);
|
||||
|
||||
/***** End box *****/
|
||||
|
|
|
@ -74,7 +74,7 @@ static struct Sch_Search Sch_Search =
|
|||
/*****************************************************************************/
|
||||
|
||||
static void Sch_PutFormToSearchWithWhatToSearchAndScope (Hie_Level_t DefaultScope);
|
||||
static bool Sch_CheckIfIHavePermissionToSearch (Sch_WhatToSearch_t WhatToSearch);
|
||||
static Usr_ICan_t Sch_CheckIfICanSearch (Sch_WhatToSearch_t WhatToSearch);
|
||||
static void Sch_GetParSearchStr (void);
|
||||
static void Sch_SearchInDB (void);
|
||||
|
||||
|
@ -190,7 +190,7 @@ static void Sch_PutFormToSearchWithWhatToSearchAndScope (Hie_Level_t DefaultScop
|
|||
for (WhatToSearch = (Sch_WhatToSearch_t) 0;
|
||||
WhatToSearch <= (Sch_WhatToSearch_t) (Sch_NUM_WHAT_TO_SEARCH - 1);
|
||||
WhatToSearch++)
|
||||
if (Sch_CheckIfIHavePermissionToSearch (WhatToSearch))
|
||||
if (Sch_CheckIfICanSearch (WhatToSearch) == Usr_I_CAN)
|
||||
{
|
||||
WTS = (unsigned) WhatToSearch;
|
||||
HTM_OPTION (HTM_Type_UNSIGNED,&WTS,
|
||||
|
@ -222,7 +222,7 @@ static void Sch_PutFormToSearchWithWhatToSearchAndScope (Hie_Level_t DefaultScop
|
|||
/************* Check if I have permission to execute an action ***************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Sch_CheckIfIHavePermissionToSearch (Sch_WhatToSearch_t WhatToSearch)
|
||||
static Usr_ICan_t Sch_CheckIfICanSearch (Sch_WhatToSearch_t WhatToSearch)
|
||||
{
|
||||
static unsigned Permissions[Sch_NUM_WHAT_TO_SEARCH] =
|
||||
{
|
||||
|
@ -242,7 +242,8 @@ static bool Sch_CheckIfIHavePermissionToSearch (Sch_WhatToSearch_t WhatToSearch)
|
|||
[Sch_SEARCH_MY_DOCUMENTS ] = 0x3FE, // Only if I am logged
|
||||
};
|
||||
|
||||
return (Permissions[WhatToSearch] & (1 << Gbl.Usrs.Me.Role.Logged));
|
||||
return (Permissions[WhatToSearch] & (1 << Gbl.Usrs.Me.Role.Logged)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -488,7 +489,7 @@ static unsigned Sch_SearchCountrsInDB (const char *RangeQuery)
|
|||
Gbl.Scope.Current != Hie_DEG &&
|
||||
Gbl.Scope.Current != Hie_CRS)
|
||||
/***** Check user's permission *****/
|
||||
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_COUNTRIES))
|
||||
if (Sch_CheckIfICanSearch (Sch_SEARCH_COUNTRIES) == Usr_I_CAN)
|
||||
{
|
||||
/***** Split countries string into words *****/
|
||||
snprintf (FldName,sizeof (FldName),"Name_%s",
|
||||
|
@ -523,7 +524,7 @@ static unsigned Sch_SearchInstitsInDB (const char *RangeQuery)
|
|||
Gbl.Scope.Current != Hie_DEG &&
|
||||
Gbl.Scope.Current != Hie_CRS)
|
||||
/***** Check user's permission *****/
|
||||
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_INSTITS))
|
||||
if (Sch_CheckIfICanSearch (Sch_SEARCH_INSTITS) == Usr_I_CAN)
|
||||
/***** Split institutions string into words *****/
|
||||
if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
|
||||
"ins_instits.FullName",NULL,NULL))
|
||||
|
@ -552,7 +553,7 @@ static unsigned Sch_SearchCentersInDB (const char *RangeQuery)
|
|||
if (Gbl.Scope.Current != Hie_DEG &&
|
||||
Gbl.Scope.Current != Hie_CRS)
|
||||
/***** Check user's permission *****/
|
||||
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_CENTERS))
|
||||
if (Sch_CheckIfICanSearch (Sch_SEARCH_CENTERS) == Usr_I_CAN)
|
||||
/***** Split center string into words *****/
|
||||
if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
|
||||
"ctr_centers.FullName",NULL,NULL))
|
||||
|
@ -580,7 +581,7 @@ static unsigned Sch_SearchDegreesInDB (const char *RangeQuery)
|
|||
/***** Check scope *****/
|
||||
if (Gbl.Scope.Current != Hie_CRS)
|
||||
/***** Check user's permission *****/
|
||||
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_DEGREES))
|
||||
if (Sch_CheckIfICanSearch (Sch_SEARCH_DEGREES) == Usr_I_CAN)
|
||||
/***** Split degree string into words *****/
|
||||
if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
|
||||
"deg_degrees.FullName",NULL,NULL))
|
||||
|
@ -606,7 +607,7 @@ static unsigned Sch_SearchCoursesInDB (const char *RangeQuery)
|
|||
unsigned NumCrss;
|
||||
|
||||
/***** Check user's permission *****/
|
||||
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_COURSES))
|
||||
if (Sch_CheckIfICanSearch (Sch_SEARCH_COURSES) == Usr_I_CAN)
|
||||
/***** Split course string into words *****/
|
||||
if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
|
||||
"crs_courses.FullName",NULL,NULL))
|
||||
|
@ -662,7 +663,7 @@ static unsigned Sch_SearchOpenDocumentsInDB (const char *RangeQuery)
|
|||
unsigned NumDocs;
|
||||
|
||||
/***** Check user's permission *****/
|
||||
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_OPEN_DOCUMENTS))
|
||||
if (Sch_CheckIfICanSearch (Sch_SEARCH_OPEN_DOCUMENTS) == Usr_I_CAN)
|
||||
/***** Split document string into words *****/
|
||||
if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
|
||||
"SUBSTRING_INDEX(brw_files.Path,'/',-1)",
|
||||
|
@ -695,7 +696,7 @@ static unsigned Sch_SearchDocumentsInMyCoursesInDB (const char *RangeQuery)
|
|||
unsigned NumDocs;
|
||||
|
||||
/***** Check user's permission *****/
|
||||
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_DOCUM_IN_MY_COURSES))
|
||||
if (Sch_CheckIfICanSearch (Sch_SEARCH_DOCUM_IN_MY_COURSES) == Usr_I_CAN)
|
||||
/***** Split document string into words *****/
|
||||
if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
|
||||
"SUBSTRING_INDEX(brw_files.Path,'/',-1)",
|
||||
|
@ -728,7 +729,7 @@ static unsigned Sch_SearchMyDocumentsInDB (const char *RangeQuery)
|
|||
unsigned NumDocs;
|
||||
|
||||
/***** Check user's permission *****/
|
||||
if (Sch_CheckIfIHavePermissionToSearch (Sch_SEARCH_MY_DOCUMENTS))
|
||||
if (Sch_CheckIfICanSearch (Sch_SEARCH_MY_DOCUMENTS) == Usr_I_CAN)
|
||||
/***** Split document string into words *****/
|
||||
if (Sch_BuildSearchQuery (SearchQuery,Sch_GetSearch (),
|
||||
"SUBSTRING_INDEX(brw_files.Path,'/',-1)",
|
||||
|
|
|
@ -791,7 +791,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
Sta_ClicksDetailedOrGrouped_t DetailedOrGrouped = Sta_CLICKS_GROUPED;
|
||||
char BrowserTimeZone[Dat_MAX_BYTES_TIME_ZONE + 1];
|
||||
unsigned NumDays;
|
||||
bool ICanQueryWholeRange;
|
||||
Usr_ICan_t ICanQueryWholeRange;
|
||||
unsigned NumUsrsInList = 0;
|
||||
long *LstSelectedUsrCods = NULL;
|
||||
|
||||
|
@ -932,19 +932,21 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse)
|
|||
/***** Check if range of dates is forbidden for me *****/
|
||||
NumDays = Dat_GetNumDaysBetweenDates (Dat_GetRangeDate (Dat_STR_TIME),
|
||||
Dat_GetRangeDate (Dat_END_TIME));
|
||||
ICanQueryWholeRange = (Gbl.Usrs.Me.Role.Logged >= Rol_TCH && Stats.GlobalOrCourse == Sta_SHOW_COURSE_ACCESSES) ||
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_TCH && Gbl.Scope.Current == Hie_CRS) ||
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_DEG_ADM && (Gbl.Scope.Current == Hie_DEG ||
|
||||
Gbl.Scope.Current == Hie_CRS)) ||
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_CTR_ADM && (Gbl.Scope.Current == Hie_CTR ||
|
||||
Gbl.Scope.Current == Hie_DEG ||
|
||||
Gbl.Scope.Current == Hie_CRS)) ||
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_INS_ADM && (Gbl.Scope.Current == Hie_INS ||
|
||||
Gbl.Scope.Current == Hie_CTR ||
|
||||
Gbl.Scope.Current == Hie_DEG ||
|
||||
Gbl.Scope.Current == Hie_CRS)) ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM;
|
||||
if (!ICanQueryWholeRange && NumDays > Cfg_DAYS_IN_RECENT_LOG)
|
||||
ICanQueryWholeRange = ((Gbl.Usrs.Me.Role.Logged >= Rol_TCH && Stats.GlobalOrCourse == Sta_SHOW_COURSE_ACCESSES) ||
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_TCH && Gbl.Scope.Current == Hie_CRS) ||
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_DEG_ADM && (Gbl.Scope.Current == Hie_DEG ||
|
||||
Gbl.Scope.Current == Hie_CRS)) ||
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_CTR_ADM && (Gbl.Scope.Current == Hie_CTR ||
|
||||
Gbl.Scope.Current == Hie_DEG ||
|
||||
Gbl.Scope.Current == Hie_CRS)) ||
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_INS_ADM && (Gbl.Scope.Current == Hie_INS ||
|
||||
Gbl.Scope.Current == Hie_CTR ||
|
||||
Gbl.Scope.Current == Hie_DEG ||
|
||||
Gbl.Scope.Current == Hie_CRS)) ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
if (ICanQueryWholeRange == Usr_I_CAN_NOT &&
|
||||
NumDays > Cfg_DAYS_IN_RECENT_LOG)
|
||||
{
|
||||
/* ...write warning message and show the form again */
|
||||
Ale_ShowAlert (Ale_WARNING,Txt_The_date_range_must_be_less_than_or_equal_to_X_days,
|
||||
|
|
|
@ -450,14 +450,14 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
if (ShowOnlyThisSvyComplete)
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
|
||||
Id,
|
||||
Surveys->Svy.Status.Open ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
Surveys->Svy.Status.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
else
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
|
||||
Id,
|
||||
Surveys->Svy.Status.Open ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
Surveys->Svy.Status.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Surveys->Svy.TimeUTC[Dat_STR_TIME],
|
||||
|
@ -472,14 +472,14 @@ static void Svy_ShowOneSurvey (struct Svy_Surveys *Surveys,
|
|||
if (ShowOnlyThisSvyComplete)
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s\"",
|
||||
Id,
|
||||
Surveys->Svy.Status.Open ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
Surveys->Svy.Status.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
else
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
|
||||
Id,
|
||||
Surveys->Svy.Status.Open ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
Surveys->Svy.Status.Open == CloOpe_OPEN ? HidVis_DateGreenClass[Surveys->Svy.Status.HiddenOrVisible] :
|
||||
HidVis_DateRedClass[Surveys->Svy.Status.HiddenOrVisible],
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Surveys->Svy.TimeUTC[Dat_END_TIME],
|
||||
|
@ -736,19 +736,21 @@ static void Svy_WriteStatus (struct Svy_Survey *Svy)
|
|||
HTM_LI_End ();
|
||||
|
||||
/* Write whether survey is open or closed */
|
||||
if (Svy->Status.Open)
|
||||
switch (Svy->Status.Open)
|
||||
{
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
HidVis_DateGreenClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_Open_survey);
|
||||
}
|
||||
else
|
||||
{
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
HidVis_DateRedClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_Closed_survey);
|
||||
case CloOpe_OPEN:
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
HidVis_DateGreenClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_Open_survey);
|
||||
break;
|
||||
case CloOpe_CLOSED:
|
||||
default:
|
||||
HTM_LI_Begin ("class=\"%s_%s\"",
|
||||
HidVis_DateRedClass[Svy->Status.HiddenOrVisible],
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Txt_Closed_survey);
|
||||
break;
|
||||
}
|
||||
HTM_LI_End ();
|
||||
|
||||
|
@ -1134,7 +1136,8 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
|
|||
Svy->TimeUTC[Dat_END_TIME] = Dat_GetUNIXTimeFromStr (row[7]);
|
||||
|
||||
/* Get whether the survey is open or closed (row(8)) */
|
||||
Svy->Status.Open = (row[8][0] == '1');
|
||||
Svy->Status.Open = (row[8][0] == '1') ? CloOpe_OPEN :
|
||||
CloOpe_CLOSED;
|
||||
|
||||
/* Get the title of the survey (row[9]) */
|
||||
Str_Copy (Svy->Title,row[9],sizeof (Svy->Title) - 1);
|
||||
|
@ -1173,7 +1176,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
|
|||
/* Can I answer survey? */
|
||||
Svy->Status.ICanAnswer = ( Svy->NumQsts != 0) &&
|
||||
Svy->Status.HiddenOrVisible == HidVis_VISIBLE &&
|
||||
Svy->Status.Open &&
|
||||
Svy->Status.Open == CloOpe_OPEN &&
|
||||
Svy->Status.IAmLoggedWithAValidRoleToAnswer &&
|
||||
Svy->Status.IBelongToScope &&
|
||||
!Svy->Status.IHaveAnswered;
|
||||
|
@ -1191,7 +1194,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
|
|||
Svy->Level == Hie_SYS) &&
|
||||
(Svy->NumQsts != 0) &&
|
||||
Svy->Status.HiddenOrVisible == HidVis_VISIBLE &&
|
||||
Svy->Status.Open &&
|
||||
Svy->Status.Open == CloOpe_OPEN &&
|
||||
Svy->Status.IAmLoggedWithAValidRoleToAnswer &&
|
||||
Svy->Status.IBelongToScope &&
|
||||
Svy->Status.IHaveAnswered;
|
||||
|
@ -1280,7 +1283,7 @@ void Svy_GetSurveyDataByCod (struct Svy_Survey *Svy)
|
|||
Svy->NumQsts = 0;
|
||||
Svy->NumUsrs = 0;
|
||||
Svy->Status.HiddenOrVisible = HidVis_VISIBLE;
|
||||
Svy->Status.Open = false;
|
||||
Svy->Status.Open = CloOpe_CLOSED;
|
||||
Svy->Status.IAmLoggedWithAValidRoleToAnswer = false;
|
||||
Svy->Status.IBelongToScope = false;
|
||||
Svy->Status.IHaveAnswered = false;
|
||||
|
@ -1605,7 +1608,7 @@ void Svy_ReqCreatOrEditSvy (void)
|
|||
Surveys.Svy.NumQsts = 0;
|
||||
Surveys.Svy.NumUsrs = 0;
|
||||
Surveys.Svy.Status.HiddenOrVisible = HidVis_VISIBLE;
|
||||
Surveys.Svy.Status.Open = true;
|
||||
Surveys.Svy.Status.Open = CloOpe_OPEN;
|
||||
Surveys.Svy.Status.IAmLoggedWithAValidRoleToAnswer = false;
|
||||
Surveys.Svy.Status.IBelongToScope = false;
|
||||
Surveys.Svy.Status.IHaveAnswered = false;
|
||||
|
@ -1738,7 +1741,7 @@ void Svy_ReqCreatOrEditSvy (void)
|
|||
|
||||
static void Svy_SetAllowedScopes (struct Svy_Survey *Svy)
|
||||
{
|
||||
bool ICanEdit = false;
|
||||
Usr_ICan_t ICanEdit = Usr_I_CAN_NOT;
|
||||
|
||||
/***** Set allowed scopes *****/
|
||||
Gbl.Scope.Allowed = 0;
|
||||
|
@ -1753,7 +1756,7 @@ static void Svy_SetAllowedScopes (struct Svy_Survey *Svy)
|
|||
if (Svy->Level == Hie_CRS)
|
||||
{
|
||||
Gbl.Scope.Allowed = 1 << Hie_CRS;
|
||||
ICanEdit = true;
|
||||
ICanEdit = Usr_I_CAN;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -1763,7 +1766,7 @@ static void Svy_SetAllowedScopes (struct Svy_Survey *Svy)
|
|||
if (Svy->Level == Hie_DEG)
|
||||
{
|
||||
Gbl.Scope.Allowed = 1 << Hie_DEG;
|
||||
ICanEdit = true;
|
||||
ICanEdit = Usr_I_CAN;
|
||||
}
|
||||
break;
|
||||
case Rol_CTR_ADM: // Center admins only can edit center surveys
|
||||
|
@ -1772,7 +1775,7 @@ static void Svy_SetAllowedScopes (struct Svy_Survey *Svy)
|
|||
if (Svy->Level == Hie_CTR)
|
||||
{
|
||||
Gbl.Scope.Allowed = 1 << Hie_CTR;
|
||||
ICanEdit = true;
|
||||
ICanEdit = Usr_I_CAN;
|
||||
}
|
||||
break;
|
||||
case Rol_INS_ADM: // Institution admins only can edit institution surveys
|
||||
|
@ -1781,7 +1784,7 @@ static void Svy_SetAllowedScopes (struct Svy_Survey *Svy)
|
|||
if (Svy->Level == Hie_INS)
|
||||
{
|
||||
Gbl.Scope.Allowed = 1 << Hie_INS;
|
||||
ICanEdit = true;
|
||||
ICanEdit = Usr_I_CAN;
|
||||
}
|
||||
break;
|
||||
case Rol_SYS_ADM:// System admins can edit any survey
|
||||
|
@ -1795,13 +1798,13 @@ static void Svy_SetAllowedScopes (struct Svy_Survey *Svy)
|
|||
1 << Hie_CTR |
|
||||
1 << Hie_DEG |
|
||||
1 << Hie_CRS;
|
||||
ICanEdit = true;
|
||||
ICanEdit = Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ICanEdit)
|
||||
if (ICanEdit == Usr_I_CAN_NOT)
|
||||
Err_NoPermissionExit ();
|
||||
}
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ struct Svy_Survey
|
|||
struct
|
||||
{
|
||||
HidVis_HiddenOrVisible_t HiddenOrVisible; // Survey is hidden or visible?
|
||||
bool Open; // Start date <= now <= end date
|
||||
CloOpe_ClosedOrOpen_t Open; // Start date <= now <= end date
|
||||
bool IAmLoggedWithAValidRoleToAnswer; // I am logged with a valid role to answer this survey
|
||||
bool IBelongToScope; // I belong to the scope of this survey
|
||||
bool IHaveAnswered; // I have already answered this survey
|
||||
|
|
|
@ -60,8 +60,8 @@
|
|||
|
||||
struct TstRes_ICanView
|
||||
{
|
||||
bool Result;
|
||||
bool Score;
|
||||
Usr_ICan_t Result;
|
||||
Usr_ICan_t Score;
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -680,8 +680,7 @@ static void TstPrn_WriteQstAndAnsExam (struct Usr_Data *UsrDat,
|
|||
/* Write score retrieved from database */
|
||||
if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE] == Usr_I_CAN)
|
||||
{
|
||||
HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"",
|
||||
The_GetSuffix ());
|
||||
HTM_DIV_Begin ("class=\"LM DAT_SMALL_%s\"",The_GetSuffix ());
|
||||
HTM_TxtColonNBSP (Txt_Score);
|
||||
HTM_SPAN_Begin ("class=\"%s_%s\"",
|
||||
PrintedQuestions[QstInd].StrAnswers[0] ?
|
||||
|
@ -1239,8 +1238,7 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
|
|||
}
|
||||
else
|
||||
{
|
||||
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",
|
||||
The_GetSuffix ());
|
||||
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
|
||||
HTM_Txt ("?");
|
||||
HTM_TD_End ();
|
||||
}
|
||||
|
@ -1250,10 +1248,16 @@ static void TstPrn_WriteIntAnsPrint (struct Usr_Data *UsrDat,
|
|||
|
||||
/***** Write the correct answer *****/
|
||||
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
HTM_Long (Question->Answer.Integer);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
HTM_Long (Question->Answer.Integer);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
HTM_TR_End ();
|
||||
|
@ -1308,16 +1312,20 @@ static void TstPrn_WriteFltAnsPrint (struct Usr_Data *UsrDat,
|
|||
|
||||
/***** Write the correct answer *****/
|
||||
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
{
|
||||
HTM_Txt ("[");
|
||||
HTM_Double (Question->Answer.FloatingPoint[0]);
|
||||
HTM_Txt ("; ");
|
||||
HTM_Double (Question->Answer.FloatingPoint[1]);
|
||||
HTM_Txt ("]");
|
||||
case Usr_I_CAN:
|
||||
HTM_Txt ("[");
|
||||
HTM_Double (Question->Answer.FloatingPoint[0]);
|
||||
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_TR_End ();
|
||||
|
@ -1366,10 +1374,16 @@ static void TstPrn_WriteTF_AnsPrint (struct Usr_Data *UsrDat,
|
|||
|
||||
/***** Write the correct answer *****/
|
||||
HTM_TD_Begin ("class=\"CM Qst_ANS_0_%s\"",The_GetSuffix ());
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
Qst_WriteAnsTF (Question->Answer.TF);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
Qst_WriteAnsTF (Question->Answer.TF);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
HTM_TR_End ();
|
||||
|
@ -1430,25 +1444,26 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
|
|||
/* Draw icon depending on user's answer */
|
||||
if (UsrAnswers[Indexes[NumOpt]]) // This answer has been selected by the user
|
||||
{
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
{
|
||||
if (Question->Answer.Options[Indexes[NumOpt]].Correct)
|
||||
{
|
||||
Ans.Class = "Qst_ANS_OK"; // Correct
|
||||
Ans.Str = "✓";
|
||||
}
|
||||
else
|
||||
{
|
||||
Ans.Class = "Qst_ANS_BAD"; // Wrong
|
||||
Ans.Str = "✗";
|
||||
}
|
||||
case Usr_I_CAN:
|
||||
if (Question->Answer.Options[Indexes[NumOpt]].Correct)
|
||||
{
|
||||
Ans.Class = "Qst_ANS_OK"; // Correct
|
||||
Ans.Str = "✓";
|
||||
}
|
||||
else
|
||||
{
|
||||
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\"",
|
||||
Ans.Class,The_GetSuffix (),
|
||||
Txt_TST_Answer_given_by_the_user);
|
||||
|
@ -1459,47 +1474,50 @@ static void TstPrn_WriteChoAnsPrint (struct Usr_Data *UsrDat,
|
|||
HTM_TD_Empty (1);
|
||||
|
||||
/* Draw icon that indicates whether the answer is correct */
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
{
|
||||
if (Question->Answer.Options[Indexes[NumOpt]].Correct)
|
||||
{
|
||||
HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\" title=\"%s\"",
|
||||
The_GetSuffix (),
|
||||
Txt_TST_Answer_given_by_the_teachers);
|
||||
HTM_Txt ("•");
|
||||
case Usr_I_CAN:
|
||||
if (Question->Answer.Options[Indexes[NumOpt]].Correct)
|
||||
{
|
||||
HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\" title=\"%s\"",
|
||||
The_GetSuffix (),
|
||||
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 ();
|
||||
}
|
||||
else
|
||||
HTM_TD_Empty (1);
|
||||
}
|
||||
else
|
||||
{
|
||||
HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\"",
|
||||
The_GetSuffix ());
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
break;
|
||||
}
|
||||
|
||||
/* Answer letter (a, b, c,...) */
|
||||
HTM_TD_Begin ("class=\"LT %s_%s\"",
|
||||
ClassTxt,The_GetSuffix ());
|
||||
HTM_TD_Begin ("class=\"LT %s_%s\"",ClassTxt,The_GetSuffix ());
|
||||
HTM_TxtF ("%c) ",'a' + (char) NumOpt);
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Answer text and feedback */
|
||||
HTM_TD_Begin ("class=\"LT\"");
|
||||
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",
|
||||
ClassTxt,The_GetSuffix ());
|
||||
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] == Usr_I_CAN)
|
||||
HTM_DIV_Begin ("class=\"%s_%s\"",ClassTxt,The_GetSuffix ());
|
||||
switch (ICanView[TstVis_VISIBLE_QST_ANS_TXT])
|
||||
{
|
||||
HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text);
|
||||
Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media,
|
||||
"Tst_MED_SHOW_CONT",
|
||||
"Tst_MED_SHOW");
|
||||
case Usr_I_CAN:
|
||||
HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text);
|
||||
Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media,
|
||||
"Tst_MED_SHOW_CONT",
|
||||
"Tst_MED_SHOW");
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_DIV_End ();
|
||||
|
||||
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);
|
||||
|
||||
/***** Write the correct answers *****/
|
||||
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER] == Usr_I_CAN)
|
||||
switch (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
|
||||
{
|
||||
HTM_TD_Begin ("class=\"CT\"");
|
||||
HTM_TABLE_BeginPadding (2);
|
||||
case Usr_I_CAN:
|
||||
HTM_TD_Begin ("class=\"CT\"");
|
||||
HTM_TABLE_BeginPadding (2);
|
||||
|
||||
for (NumOpt = 0;
|
||||
NumOpt < Question->Answer.NumOptions;
|
||||
NumOpt++)
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
for (NumOpt = 0;
|
||||
NumOpt < Question->Answer.NumOptions;
|
||||
NumOpt++)
|
||||
{
|
||||
HTM_TR_Begin (NULL);
|
||||
|
||||
/* Answer letter (a, b, c,...) */
|
||||
HTM_TD_Begin ("class=\"LT Qst_ANS_0_%s\"",
|
||||
The_GetSuffix ());
|
||||
HTM_TxtF ("%c) ",'a' + (char) NumOpt);
|
||||
HTM_TD_End ();
|
||||
/* Answer letter (a, b, c,...) */
|
||||
HTM_TD_Begin ("class=\"LT Qst_ANS_0_%s\"",
|
||||
The_GetSuffix ());
|
||||
HTM_TxtF ("%c) ",'a' + (char) NumOpt);
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Answer text and feedback */
|
||||
HTM_TD_Begin ("class=\"LT\"");
|
||||
/* Answer text and feedback */
|
||||
HTM_TD_Begin ("class=\"LT\"");
|
||||
|
||||
HTM_DIV_Begin ("class=\"Qst_ANS_0_%s\"",
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Question->Answer.Options[NumOpt].Text);
|
||||
HTM_DIV_End ();
|
||||
HTM_DIV_Begin ("class=\"Qst_ANS_0_%s\"",
|
||||
The_GetSuffix ());
|
||||
HTM_Txt (Question->Answer.Options[NumOpt].Text);
|
||||
HTM_DIV_End ();
|
||||
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
|
||||
if (Question->Answer.Options[NumOpt].Feedback)
|
||||
if (Question->Answer.Options[NumOpt].Feedback[0])
|
||||
{
|
||||
HTM_DIV_Begin ("class=\"Qst_TXT_LIGHT\"");
|
||||
HTM_Txt (Question->Answer.Options[NumOpt].Feedback);
|
||||
HTM_DIV_End ();
|
||||
}
|
||||
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT] == Usr_I_CAN)
|
||||
if (Question->Answer.Options[NumOpt].Feedback)
|
||||
if (Question->Answer.Options[NumOpt].Feedback[0])
|
||||
{
|
||||
HTM_DIV_Begin ("class=\"Qst_TXT_LIGHT\"");
|
||||
HTM_Txt (Question->Answer.Options[NumOpt].Feedback);
|
||||
HTM_DIV_End ();
|
||||
}
|
||||
|
||||
HTM_TD_End ();
|
||||
HTM_TD_End ();
|
||||
|
||||
HTM_TR_End ();
|
||||
}
|
||||
HTM_TR_End ();
|
||||
}
|
||||
|
||||
HTM_TABLE_End ();
|
||||
HTM_TD_End ();
|
||||
}
|
||||
else
|
||||
{
|
||||
HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\"",
|
||||
The_GetSuffix ());
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
HTM_TABLE_End ();
|
||||
HTM_TD_End ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
HTM_TD_Begin ("class=\"CT Qst_ANS_0_%s\"",The_GetSuffix ());
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
break;
|
||||
}
|
||||
|
||||
HTM_TR_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)
|
||||
Err_NotEnoughMemoryExit ();
|
||||
HTM_TD_Begin ("id=\"%s\" class=\"LT %s_%s %s\"",
|
||||
Id,ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
Id,ClassDat,The_GetSuffix (),The_GetColorRows ());
|
||||
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
|
||||
Gbl.Prefs.DateFormat,Dat_SEPARATOR_BREAK,
|
||||
true,true,false,0x7);
|
||||
|
@ -1933,96 +1952,124 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
|
|||
|
||||
/* Write number of questions */
|
||||
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
ClassDat,The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Result)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write number of non-blank answers */
|
||||
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
ClassDat,The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Result)
|
||||
{
|
||||
if (Print.NumQsts.NotBlank)
|
||||
HTM_Unsigned (Print.NumQsts.NotBlank);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
if (Print.NumQsts.NotBlank)
|
||||
HTM_Unsigned (Print.NumQsts.NotBlank);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write number of blank answers */
|
||||
HTM_TD_Begin ("class=\"RT %s_%s %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
ClassDat,The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Result)
|
||||
{
|
||||
NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank;
|
||||
if (NumQstsBlank)
|
||||
HTM_Unsigned (NumQstsBlank);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
case Usr_I_CAN:
|
||||
NumQstsBlank = Print.NumQsts.All - Print.NumQsts.NotBlank;
|
||||
if (NumQstsBlank)
|
||||
HTM_Unsigned (NumQstsBlank);
|
||||
else
|
||||
HTM_Light0 ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write score */
|
||||
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
ClassDat,The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
case Usr_I_CAN:
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write average score per question */
|
||||
HTM_TD_Begin ("class=\"RT %s_%s %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
|
||||
(double) Print.NumQsts.All :
|
||||
0.0);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
ClassDat,The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
HTM_Double2Decimals (Print.NumQsts.All ? Print.Score /
|
||||
(double) Print.NumQsts.All :
|
||||
0.0);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Write grade */
|
||||
HTM_TD_Begin ("class=\"RT %s_%s LINE_LEFT %s\"",
|
||||
ClassDat,The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX);
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
ClassDat,The_GetSuffix (),The_GetColorRows ());
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,
|
||||
Tst_SCORE_MAX);
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
HTM_TD_End ();
|
||||
|
||||
/* Link to show this test */
|
||||
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",
|
||||
The_GetColorRows ());
|
||||
if (ICanView.Result == Usr_I_CAN)
|
||||
HTM_TD_Begin ("class=\"RT LINE_LEFT %s\"",The_GetColorRows ());
|
||||
switch (ICanView.Result)
|
||||
{
|
||||
Frm_BeginForm (Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe :
|
||||
ActSeeOneTstResOth);
|
||||
ParCod_PutPar (ParCod_Prn,Print.PrnCod);
|
||||
Ico_PutIconLink ("tasks.svg",Ico_BLACK,
|
||||
Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe :
|
||||
ActSeeOneTstResOth);
|
||||
Frm_EndForm ();
|
||||
case Usr_I_CAN:
|
||||
Frm_BeginForm (Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe :
|
||||
ActSeeOneTstResOth);
|
||||
ParCod_PutPar (ParCod_Prn,Print.PrnCod);
|
||||
Ico_PutIconLink ("tasks.svg",Ico_BLACK,
|
||||
Gbl.Action.Act == ActSeeMyTstResCrs ? ActSeeOneTstResMe :
|
||||
ActSeeOneTstResOth);
|
||||
Frm_EndForm ();
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
Ico_PutIconNotVisible ();
|
||||
break;
|
||||
}
|
||||
else
|
||||
Ico_PutIconNotVisible ();
|
||||
HTM_TD_End ();
|
||||
|
||||
HTM_TR_End ();
|
||||
|
@ -2087,27 +2134,29 @@ static void TstPrn_ShowPrintsSummaryRow (Usr_MeOrOther_t MeOrOther,
|
|||
double TotalScore)
|
||||
{
|
||||
extern const char *Txt_Visible_tests;
|
||||
bool ICanViewTotalScore;
|
||||
Usr_ICan_t ICanViewTotalScore;
|
||||
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_STD:
|
||||
ICanViewTotalScore = MeOrOther == Usr_ME &&
|
||||
TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ());
|
||||
ICanViewTotalScore = (MeOrOther == Usr_ME &&
|
||||
TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ())) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
case Rol_DEG_ADM:
|
||||
case Rol_CTR_ADM:
|
||||
case Rol_INS_ADM:
|
||||
ICanViewTotalScore = MeOrOther == Usr_ME ||
|
||||
NumPrints;
|
||||
ICanViewTotalScore = (MeOrOther == Usr_ME ||
|
||||
NumPrints) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_SYS_ADM:
|
||||
ICanViewTotalScore = true;
|
||||
ICanViewTotalScore = Usr_I_CAN;
|
||||
break;
|
||||
default:
|
||||
ICanViewTotalScore = false;
|
||||
ICanViewTotalScore = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2151,7 +2200,7 @@ static void TstPrn_ShowPrintsSummaryRow (Usr_MeOrOther_t MeOrOther,
|
|||
HTM_TD_Begin ("class=\"RM DAT_STRONG_%s LINE_TOP LINE_BOTTOM LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanViewTotalScore)
|
||||
if (ICanViewTotalScore == Usr_I_CAN)
|
||||
{
|
||||
HTM_Double2Decimals (TotalScore);
|
||||
HTM_Txt ("/");
|
||||
|
@ -2163,7 +2212,7 @@ static void TstPrn_ShowPrintsSummaryRow (Usr_MeOrOther_t MeOrOther,
|
|||
HTM_TD_Begin ("class=\"RM DAT_STRONG_%s LINE_TOP LINE_BOTTOM %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanViewTotalScore)
|
||||
if (ICanViewTotalScore == Usr_I_CAN)
|
||||
HTM_Double2Decimals (NumTotalQsts->All ? TotalScore / (double) NumTotalQsts->All :
|
||||
0.0);
|
||||
HTM_TD_End ();
|
||||
|
@ -2172,7 +2221,7 @@ static void TstPrn_ShowPrintsSummaryRow (Usr_MeOrOther_t MeOrOther,
|
|||
HTM_TD_Begin ("class=\"RM DAT_STRONG_%s LINE_TOP LINE_BOTTOM LINE_LEFT %s\"",
|
||||
The_GetSuffix (),
|
||||
The_GetColorRows ());
|
||||
if (ICanViewTotalScore)
|
||||
if (ICanViewTotalScore == Usr_I_CAN)
|
||||
TstPrn_ComputeAndShowGrade (NumTotalQsts->All,TotalScore,Tst_SCORE_MAX);
|
||||
HTM_TD_End ();
|
||||
|
||||
|
@ -2337,16 +2386,20 @@ void TstPrn_ShowOnePrint (void)
|
|||
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||
The_GetSuffix ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
HTM_STRONG_Begin ();
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
HTM_Txt ("/");
|
||||
HTM_Unsigned (Print.NumQsts.All);
|
||||
HTM_STRONG_End ();
|
||||
case Usr_I_CAN:
|
||||
HTM_STRONG_Begin ();
|
||||
HTM_Double2Decimals (Print.Score);
|
||||
HTM_Txt ("/");
|
||||
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_TR_End ();
|
||||
|
@ -2361,14 +2414,19 @@ void TstPrn_ShowOnePrint (void)
|
|||
|
||||
HTM_TD_Begin ("class=\"LB DAT_%s\"",
|
||||
The_GetSuffix ());
|
||||
if (ICanView.Score == Usr_I_CAN)
|
||||
switch (ICanView.Score)
|
||||
{
|
||||
HTM_STRONG_Begin ();
|
||||
TstPrn_ComputeAndShowGrade (Print.NumQsts.All,Print.Score,Tst_SCORE_MAX);
|
||||
HTM_STRONG_End ();
|
||||
case Usr_I_CAN:
|
||||
HTM_STRONG_Begin ();
|
||||
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_TR_End ();
|
||||
|
@ -2418,12 +2476,18 @@ static void TstRes_CheckIfICanSeePrintResult (const struct TstPrn_Print *Print,
|
|||
// if the print is not sent ==> I can not view results
|
||||
ICanView->Result = (Print->Sent && Usr_ItsMe (UsrCod) == Usr_ME) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
if (ICanView->Result == Usr_I_CAN)
|
||||
// Depends on 5 visibility icons associated to tests
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ()) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
else
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
switch (ICanView->Result)
|
||||
{
|
||||
case Usr_I_CAN:
|
||||
// Depends on 5 visibility icons associated to tests
|
||||
ICanView->Score = TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ()) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Usr_I_CAN_NOT:
|
||||
default:
|
||||
ICanView->Score = Usr_I_CAN_NOT;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
|
|
|
@ -298,7 +298,6 @@ void TmlUsr_PutIconFavSha (TmlUsr_FavSha_t FavSha,
|
|||
TmlUsr_PutDisabledIconFavSha (FavSha,NumUsrs);
|
||||
break;
|
||||
case Usr_OTHER: // I am not the author
|
||||
default:
|
||||
TmlFrm_PutFormToFavUnfShaUns (FavSha,Cod);
|
||||
break;
|
||||
}
|
||||
|
|
49
swad_user.c
49
swad_user.c
|
@ -234,8 +234,8 @@ static void Usr_PutLinkToSeeAdmins (void);
|
|||
static void Usr_PutLinkToSeeGuests (void);
|
||||
|
||||
static Frm_PutForm_t Usr_SetOptionsListUsrsAllowed (Rol_Role_t UsrsRole,
|
||||
bool ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS]);
|
||||
static void Usr_PutOptionsListUsrs (const bool ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS]);
|
||||
Usr_ICan_t ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS]);
|
||||
static void Usr_PutOptionsListUsrs (const Usr_ICan_t ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS]);
|
||||
static void Usr_ShowOneListUsrsOption (Usr_ListUsrsOption_t ListUsrsAction,
|
||||
const char *Label);
|
||||
static Usr_ListUsrsOption_t Usr_GetListUsrsOption (Usr_ListUsrsOption_t DefaultAction);
|
||||
|
@ -2622,23 +2622,23 @@ static void Usr_WriteMainUsrDataExceptUsrID (struct Usr_Data *UsrDat,
|
|||
|
||||
static void Usr_WriteEmail (struct Usr_Data *UsrDat,const char *BgColor)
|
||||
{
|
||||
bool ShowEmail;
|
||||
Usr_ICan_t ShowEmail;
|
||||
char MailLink[7 + Cns_MAX_BYTES_EMAIL_ADDRESS + 1]; // mailto:mail_address
|
||||
|
||||
if (UsrDat->Email[0])
|
||||
{
|
||||
ShowEmail = Mai_ICanSeeOtherUsrEmail (UsrDat);
|
||||
if (ShowEmail)
|
||||
if (ShowEmail == Usr_I_CAN)
|
||||
snprintf (MailLink,sizeof (MailLink),"mailto:%s",UsrDat->Email);
|
||||
}
|
||||
else
|
||||
ShowEmail = false;
|
||||
ShowEmail = Usr_I_CAN_NOT;
|
||||
Usr_WriteUsrData (BgColor,
|
||||
UsrDat->Email[0] ? (ShowEmail ? UsrDat->Email :
|
||||
"********") :
|
||||
UsrDat->Email[0] ? (ShowEmail == Usr_I_CAN ? UsrDat->Email :
|
||||
"********") :
|
||||
" ",
|
||||
ShowEmail ? MailLink :
|
||||
NULL,
|
||||
ShowEmail == Usr_I_CAN ? MailLink :
|
||||
NULL,
|
||||
true,UsrDat->Accepted);
|
||||
}
|
||||
|
||||
|
@ -5022,7 +5022,7 @@ void Usr_SeeGuests (void)
|
|||
extern const char *Hlp_USERS_Guests;
|
||||
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
||||
extern const char *Txt_Scope;
|
||||
bool ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS];
|
||||
Usr_ICan_t ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS];
|
||||
Frm_PutForm_t PutForm;
|
||||
|
||||
/***** Contextual menu *****/
|
||||
|
@ -5142,7 +5142,7 @@ void Usr_SeeStudents (void)
|
|||
extern const char *Hlp_USERS_Students;
|
||||
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
||||
extern const char *Txt_Scope;
|
||||
bool ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS];
|
||||
Usr_ICan_t ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS];
|
||||
Frm_PutForm_t PutForm;
|
||||
|
||||
/***** Put contextual links *****/
|
||||
|
@ -5301,7 +5301,7 @@ void Usr_SeeTeachers (void)
|
|||
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
|
||||
extern const char *Txt_Scope;
|
||||
unsigned NumUsrs;
|
||||
bool ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS];
|
||||
Usr_ICan_t ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS];
|
||||
Frm_PutForm_t PutForm;
|
||||
|
||||
/***** Put contextual links *****/
|
||||
|
@ -5477,7 +5477,7 @@ void Usr_SeeTeachers (void)
|
|||
// Returns true if any option is allowed
|
||||
|
||||
static Frm_PutForm_t Usr_SetOptionsListUsrsAllowed (Rol_Role_t UsrsRole,
|
||||
bool ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS])
|
||||
Usr_ICan_t ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS])
|
||||
{
|
||||
Usr_ListUsrsOption_t Opt;
|
||||
|
||||
|
@ -5486,13 +5486,14 @@ static Frm_PutForm_t Usr_SetOptionsListUsrsAllowed (Rol_Role_t UsrsRole,
|
|||
for (Opt = (Usr_ListUsrsOption_t) 1; // Skip unknown option
|
||||
Opt <= (Usr_ListUsrsOption_t) (Usr_LIST_USRS_NUM_OPTIONS - 1);
|
||||
Opt++)
|
||||
ICanChooseOption[Opt] = false;
|
||||
ICanChooseOption[Opt] = Usr_I_CAN_NOT;
|
||||
|
||||
/* Activate some options depending on users' role, on my role, etc. */
|
||||
switch (UsrsRole)
|
||||
{
|
||||
case Rol_GST:
|
||||
ICanChooseOption[Usr_OPTION_RECORDS] = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
|
||||
ICanChooseOption[Usr_OPTION_RECORDS] = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_STD:
|
||||
ICanChooseOption[Usr_OPTION_RECORDS] =
|
||||
|
@ -5502,14 +5503,16 @@ static Frm_PutForm_t Usr_SetOptionsListUsrsAllowed (Rol_Role_t UsrsRole,
|
|||
(Gbl.Usrs.Me.Role.Logged == Rol_STD ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_NET ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
|
||||
ICanChooseOption[Usr_OPTION_HOMEWORK] =
|
||||
ICanChooseOption[Usr_OPTION_ATTENDANCE] =
|
||||
ICanChooseOption[Usr_OPTION_EMAIL] = (Gbl.Scope.Current == Hie_CRS &&
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_NET ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
case Rol_TCH:
|
||||
ICanChooseOption[Usr_OPTION_RECORDS] =
|
||||
|
@ -5520,11 +5523,13 @@ static Frm_PutForm_t Usr_SetOptionsListUsrsAllowed (Rol_Role_t UsrsRole,
|
|||
(Gbl.Usrs.Me.Role.Logged == Rol_STD ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_NET ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
ICanChooseOption[Usr_OPTION_HOMEWORK] = (Gbl.Scope.Current == Hie_CRS &&
|
||||
(Gbl.Usrs.Me.Role.Logged == Rol_NET ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
|
||||
Usr_I_CAN_NOT;
|
||||
break;
|
||||
default:
|
||||
return Frm_DONT_PUT_FORM;
|
||||
|
@ -5534,7 +5539,7 @@ static Frm_PutForm_t Usr_SetOptionsListUsrsAllowed (Rol_Role_t UsrsRole,
|
|||
for (Opt = (Usr_ListUsrsOption_t) 1; // Skip unknown option
|
||||
Opt <= (Usr_ListUsrsOption_t) (Usr_LIST_USRS_NUM_OPTIONS - 1);
|
||||
Opt++)
|
||||
if (ICanChooseOption[Opt])
|
||||
if (ICanChooseOption[Opt] == Usr_I_CAN)
|
||||
return Frm_PUT_FORM;
|
||||
|
||||
return Frm_DONT_PUT_FORM;
|
||||
|
@ -5545,7 +5550,7 @@ static Frm_PutForm_t Usr_SetOptionsListUsrsAllowed (Rol_Role_t UsrsRole,
|
|||
/*****************************************************************************/
|
||||
// Returns true if at least one action can be shown
|
||||
|
||||
static void Usr_PutOptionsListUsrs (const bool ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS])
|
||||
static void Usr_PutOptionsListUsrs (const Usr_ICan_t ICanChooseOption[Usr_LIST_USRS_NUM_OPTIONS])
|
||||
{
|
||||
extern const char *Txt_View_records;
|
||||
extern const char *Txt_View_homework;
|
||||
|
@ -5579,7 +5584,7 @@ static void Usr_PutOptionsListUsrs (const bool ICanChooseOption[Usr_LIST_USRS_NU
|
|||
for (Opt = (Usr_ListUsrsOption_t) 1; // Skip unknown option
|
||||
Opt <= (Usr_ListUsrsOption_t) (Usr_LIST_USRS_NUM_OPTIONS - 1);
|
||||
Opt++)
|
||||
if (ICanChooseOption[Opt])
|
||||
if (ICanChooseOption[Opt] == Usr_I_CAN)
|
||||
Usr_ShowOneListUsrsOption (Opt,*Label[Opt]);
|
||||
|
||||
/* End list of options */
|
||||
|
|
Loading…
Reference in New Issue