Version 22.90: Apr 04, 2023 Code refactoring checking user.

This commit is contained in:
acanas 2023-04-04 13:46:51 +02:00
parent feffae7ee3
commit 9bdfd8d91c
38 changed files with 813 additions and 624 deletions

View File

@ -3248,7 +3248,7 @@ int swad__sendMessage (struct soap *soap,
Usr_DONT_GET_ROLE_IN_CURRENT_CRS)) Usr_DONT_GET_ROLE_IN_CURRENT_CRS))
{ {
/* This received message must be notified by email? */ /* This received message must be notified by email? */
NotifyByEmail = (!Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) && NotifyByEmail = (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_OTHER &&
(Gbl.Usrs.Other.UsrDat.NtfEvents.SendEmail & (1 << Ntf_EVENT_MESSAGE))); (Gbl.Usrs.Other.UsrDat.NtfEvents.SendEmail & (1 << Ntf_EVENT_MESSAGE)));
/* Send message to this user */ /* Send message to this user */

154
swad_ID.c
View File

@ -75,13 +75,13 @@ static bool ID_CheckIfUsrIDIsValidUsingMinDigits (const char *UsrID,unsigned Min
static void ID_PutLinkToConfirmID (struct Usr_Data *UsrDat,unsigned NumID, static void ID_PutLinkToConfirmID (struct Usr_Data *UsrDat,unsigned NumID,
const char *Anchor); const char *Anchor);
static void ID_ShowFormChangeUsrID (bool ItsMe,bool IShouldFillInID); static void ID_ShowFormChangeUsrID (Usr_MeOrOther_t MeOrOther,bool IShouldFillInID);
static void ID_PutParsRemoveMyID (void *ID); static void ID_PutParsRemoveMyID (void *ID);
static void ID_PutParsRemoveOtherID (void *ID); static void ID_PutParsRemoveOtherID (void *ID);
static void ID_RemoveUsrID (const struct Usr_Data *UsrDat,bool ItsMe); static void ID_RemoveUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOther);
static void ID_NewUsrID (const struct Usr_Data *UsrDat,bool ItsMe); static void ID_ChangeUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOther);
/*****************************************************************************/ /*****************************************************************************/
/********************** Get list of IDs of a user ****************************/ /********************** Get list of IDs of a user ****************************/
@ -346,7 +346,8 @@ void ID_WriteUsrIDs (struct Usr_Data *UsrDat,const char *Anchor)
bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat) bool ID_ICanSeeOtherUsrIDs (const struct Usr_Data *UsrDat)
{ {
if (Usr_ItsMe (UsrDat->UsrCod)) /***** Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** Check if I have permission to see another user's IDs *****/ /***** Check if I have permission to see another user's IDs *****/
@ -457,7 +458,7 @@ void ID_ShowFormChangeMyID (bool IShouldFillInID)
Hlp_PROFILE_Account,Box_NOT_CLOSABLE); Hlp_PROFILE_Account,Box_NOT_CLOSABLE);
/***** Show form to change ID *****/ /***** Show form to change ID *****/
ID_ShowFormChangeUsrID (true, // ItsMe ID_ShowFormChangeUsrID (Usr_ME,
IShouldFillInID); IShouldFillInID);
/***** End box *****/ /***** End box *****/
@ -487,7 +488,7 @@ void ID_ShowFormChangeOtherUsrID (void)
Hlp_PROFILE_Account,Box_NOT_CLOSABLE); Hlp_PROFILE_Account,Box_NOT_CLOSABLE);
/***** Show form to change ID *****/ /***** Show form to change ID *****/
ID_ShowFormChangeUsrID (false, // ItsMe ID_ShowFormChangeUsrID (Usr_OTHER,
false); // IShouldFillInID false); // IShouldFillInID
/***** End box *****/ /***** End box *****/
@ -501,7 +502,7 @@ void ID_ShowFormChangeOtherUsrID (void)
/*********************** Show form to change my user's ID ********************/ /*********************** Show form to change my user's ID ********************/
/*****************************************************************************/ /*****************************************************************************/
static void ID_ShowFormChangeUsrID (bool ItsMe,bool IShouldFillInID) static void ID_ShowFormChangeUsrID (Usr_MeOrOther_t MeOrOther,bool IShouldFillInID)
{ {
extern const char *Hlp_PROFILE_Account; extern const char *Hlp_PROFILE_Account;
extern const char *Txt_Please_fill_in_your_ID; extern const char *Txt_Please_fill_in_your_ID;
@ -516,22 +517,41 @@ static void ID_ShowFormChangeUsrID (bool ItsMe,bool IShouldFillInID)
static const struct static const struct
{ {
Act_Action_t Remove; Act_Action_t Remove;
Act_Action_t New; Act_Action_t Change;
} NextAction[Rol_NUM_ROLES] = } NextAction[Rol_NUM_ROLES] =
{ {
[Rol_UNK ] = {ActRemID_Oth,ActNewID_Oth}, [Rol_UNK ] = {ActRemID_Oth,ActChgID_Oth},
[Rol_GST ] = {ActRemID_Oth,ActNewID_Oth}, [Rol_GST ] = {ActRemID_Oth,ActChgID_Oth},
[Rol_USR ] = {ActRemID_Oth,ActNewID_Oth}, [Rol_USR ] = {ActRemID_Oth,ActChgID_Oth},
[Rol_STD ] = {ActRemID_Std,ActNewID_Std}, [Rol_STD ] = {ActRemID_Std,ActChgID_Std},
[Rol_NET ] = {ActRemID_Tch,ActNewID_Tch}, [Rol_NET ] = {ActRemID_Tch,ActChgID_Tch},
[Rol_TCH ] = {ActRemID_Tch,ActNewID_Tch}, [Rol_TCH ] = {ActRemID_Tch,ActChgID_Tch},
[Rol_DEG_ADM] = {ActRemID_Oth,ActNewID_Oth}, [Rol_DEG_ADM] = {ActRemID_Oth,ActChgID_Oth},
[Rol_CTR_ADM] = {ActRemID_Oth,ActNewID_Oth}, [Rol_CTR_ADM] = {ActRemID_Oth,ActChgID_Oth},
[Rol_INS_ADM] = {ActRemID_Oth,ActNewID_Oth}, [Rol_INS_ADM] = {ActRemID_Oth,ActChgID_Oth},
[Rol_SYS_ADM] = {ActRemID_Oth,ActNewID_Oth}, [Rol_SYS_ADM] = {ActRemID_Oth,ActChgID_Oth},
};
static const struct Usr_Data *UsrDat[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = &Gbl.Usrs.Me.UsrDat,
[Usr_OTHER] = &Gbl.Usrs.Other.UsrDat
};
static void (*FuncParsRemove[Usr_NUM_ME_OR_OTHER]) (void *ID) =
{
[Usr_ME ] = ID_PutParsRemoveMyID,
[Usr_OTHER] = ID_PutParsRemoveOtherID
};
struct
{
Act_Action_t Remove;
Act_Action_t Change;
} ActID[Rol_NUM_ROLES] =
{
[Usr_ME ] = {.Remove = ActRemMyID,
.Change = ActChgMyID},
[Usr_OTHER] = {.Remove = NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs].Remove,
.Change = NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs].Change}
}; };
const struct Usr_Data *UsrDat = (ItsMe ? &Gbl.Usrs.Me.UsrDat :
&Gbl.Usrs.Other.UsrDat);
/***** Show possible alerts *****/ /***** Show possible alerts *****/
Ale_ShowAlerts (ID_ID_SECTION_ID); Ale_ShowAlerts (ID_ID_SECTION_ID);
@ -545,7 +565,7 @@ static void ID_ShowFormChangeUsrID (bool ItsMe,bool IShouldFillInID)
/***** List existing user's IDs *****/ /***** List existing user's IDs *****/
for (NumID = 0; for (NumID = 0;
NumID < UsrDat->IDs.Num; NumID < UsrDat[MeOrOther]->IDs.Num;
NumID++) NumID++)
{ {
if (NumID == 0) if (NumID == 0)
@ -561,46 +581,41 @@ static void ID_ShowFormChangeUsrID (bool ItsMe,bool IShouldFillInID)
else // NumID >= 1 else // NumID >= 1
HTM_BR (); HTM_BR ();
if (UsrDat->IDs.Num > 1) // I have two or more IDs if (UsrDat[MeOrOther]->IDs.Num > 1) // I have two or more IDs
{ {
if (ItsMe && UsrDat->IDs.List[NumID].Confirmed) // I can not remove my confirmed IDs if (MeOrOther == Usr_ME &&
UsrDat[MeOrOther]->IDs.List[NumID].Confirmed) // I can not remove my confirmed IDs
/* Put disabled icon to remove user's ID */ /* Put disabled icon to remove user's ID */
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
else // I can remove else // I can remove
{
/* Form to remove user's ID */ /* Form to remove user's ID */
if (ItsMe) Ico_PutContextualIconToRemove (ActID[MeOrOther].Remove,ID_ID_SECTION_ID,
Ico_PutContextualIconToRemove (ActRemMyID,ID_ID_SECTION_ID, FuncParsRemove[MeOrOther],UsrDat[MeOrOther]->IDs.List[NumID].ID);
ID_PutParsRemoveMyID,UsrDat->IDs.List[NumID].ID);
else
Ico_PutContextualIconToRemove (NextAction[UsrDat->Roles.InCurrentCrs].Remove,ID_ID_SECTION_ID,
ID_PutParsRemoveOtherID,UsrDat->IDs.List[NumID].ID);
}
} }
/* User's ID */ /* User's ID */
if (asprintf (&Title,UsrDat->IDs.List[NumID].Confirmed ? Txt_ID_X_confirmed : if (asprintf (&Title,UsrDat[MeOrOther]->IDs.List[NumID].Confirmed ? Txt_ID_X_confirmed :
Txt_ID_X_not_confirmed, Txt_ID_X_not_confirmed,
UsrDat->IDs.List[NumID].ID) < 0) UsrDat[MeOrOther]->IDs.List[NumID].ID) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
HTM_SPAN_Begin ("class=\"%s\" title=\"%s\"", HTM_SPAN_Begin ("class=\"%s\" title=\"%s\"",
UsrDat->IDs.List[NumID].Confirmed ? "USR_ID_C" : UsrDat[MeOrOther]->IDs.List[NumID].Confirmed ? "USR_ID_C" :
"USR_ID_NC", "USR_ID_NC",
Title); Title);
free (Title); free (Title);
HTM_Txt (UsrDat->IDs.List[NumID].ID); HTM_Txt (UsrDat[MeOrOther]->IDs.List[NumID].ID);
HTM_Txt (UsrDat->IDs.List[NumID].Confirmed ? "&check;" : HTM_Txt (UsrDat[MeOrOther]->IDs.List[NumID].Confirmed ? "&check;" :
""); "");
HTM_SPAN_End (); HTM_SPAN_End ();
if (NumID == UsrDat->IDs.Num - 1) if (NumID == UsrDat[MeOrOther]->IDs.Num - 1)
{ {
HTM_TD_End (); HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
} }
} }
if (UsrDat->IDs.Num < ID_MAX_IDS_PER_USER) if (UsrDat[MeOrOther]->IDs.Num < ID_MAX_IDS_PER_USER)
{ {
/***** Write help text *****/ /***** Write help text *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
@ -617,22 +632,18 @@ static void ID_ShowFormChangeUsrID (bool ItsMe,bool IShouldFillInID)
/* Label */ /* Label */
Frm_LabelColumn ("REC_C1_BOT RT","NewID", Frm_LabelColumn ("REC_C1_BOT RT","NewID",
UsrDat->IDs.Num ? Txt_Another_ID : // A new user's ID UsrDat[MeOrOther]->IDs.Num ? Txt_Another_ID : // A new user's ID
Txt_ID); // The first user's ID Txt_ID); // The first user's ID
/* Data */ /* Data */
HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT_%s\"", HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ItsMe) Frm_BeginFormAnchor (ActID[MeOrOther].Change,ID_ID_SECTION_ID);
Frm_BeginFormAnchor (ActChgMyID,ID_ID_SECTION_ID); if (MeOrOther == Usr_OTHER)
else Usr_PutParUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
{
Frm_BeginFormAnchor (NextAction[UsrDat->Roles.InCurrentCrs].New,ID_ID_SECTION_ID);
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
}
HTM_INPUT_TEXT ("NewID",ID_MAX_BYTES_USR_ID, HTM_INPUT_TEXT ("NewID",ID_MAX_BYTES_USR_ID,
UsrDat->IDs.Num ? UsrDat->IDs.List[UsrDat->IDs.Num - 1].ID : UsrDat[MeOrOther]->IDs.Num ? UsrDat[MeOrOther]->IDs.List[UsrDat[MeOrOther]->IDs.Num - 1].ID :
"", // Show the most recent ID "", // Show the most recent ID
HTM_DONT_SUBMIT_ON_CHANGE, HTM_DONT_SUBMIT_ON_CHANGE,
"id=\"NewID\" class=\"INPUT_%s\" size=\"18\"", "id=\"NewID\" class=\"INPUT_%s\" size=\"18\"",
The_GetSuffix ()); The_GetSuffix ());
@ -712,7 +723,7 @@ void ID_RemoveOtherUsrID (void)
/***************************** Remove user's ID ******************************/ /***************************** Remove user's ID ******************************/
/*****************************************************************************/ /*****************************************************************************/
static void ID_RemoveUsrID (const struct Usr_Data *UsrDat,bool ItsMe) static void ID_RemoveUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOther)
{ {
extern const char *Txt_ID_X_removed; extern const char *Txt_ID_X_removed;
extern const char *Txt_You_can_not_delete_this_ID; extern const char *Txt_You_can_not_delete_this_ID;
@ -729,11 +740,18 @@ static void ID_RemoveUsrID (const struct Usr_Data *UsrDat,bool ItsMe)
if (UsrDat->IDs.Num < 2) // One unique ID if (UsrDat->IDs.Num < 2) // One unique ID
ICanRemove = false; ICanRemove = false;
else if (ItsMe)
// I can remove my ID only if it is not confirmed
ICanRemove = !ID_DB_CheckIfConfirmed (UsrDat->UsrCod,UsrID);
else else
ICanRemove = true; switch (MeOrOther)
{
case Usr_ME:
// I can remove my ID only if it is not confirmed
ICanRemove = !ID_DB_CheckIfConfirmed (UsrDat->UsrCod,UsrID);
break;
case Usr_OTHER:
default:
ICanRemove = true;
break;
}
if (ICanRemove) if (ICanRemove)
{ {
@ -760,7 +778,7 @@ static void ID_RemoveUsrID (const struct Usr_Data *UsrDat,bool ItsMe)
void ID_NewMyUsrID (void) void ID_NewMyUsrID (void)
{ {
/***** New user's ID *****/ /***** New user's ID *****/
ID_NewUsrID (&Gbl.Usrs.Me.UsrDat, ID_ChangeUsrID (&Gbl.Usrs.Me.UsrDat,
true); // It's me true); // It's me
/***** Update list of IDs *****/ /***** Update list of IDs *****/
@ -771,19 +789,19 @@ void ID_NewMyUsrID (void)
} }
/*****************************************************************************/ /*****************************************************************************/
/********************* New user's ID for another user ************************/ /************************* Change another user's ID **************************/
/*****************************************************************************/ /*****************************************************************************/
void ID_NewOtherUsrID (void) void ID_ChangeOtherUsrID (void)
{ {
/***** Get other user's code from form and get user's data *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
{ {
/***** New user's ID *****/ /***** Change user's ID *****/
ID_NewUsrID (&Gbl.Usrs.Other.UsrDat, ID_ChangeUsrID (&Gbl.Usrs.Other.UsrDat,
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)); Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
/***** Update list of IDs *****/ /***** Update list of IDs *****/
ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat); ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat);
@ -799,10 +817,10 @@ void ID_NewOtherUsrID (void)
} }
/*****************************************************************************/ /*****************************************************************************/
/***************************** New user's ID *********************************/ /***************************** Change user's ID ******************************/
/*****************************************************************************/ /*****************************************************************************/
static void ID_NewUsrID (const struct Usr_Data *UsrDat,bool ItsMe) static void ID_ChangeUsrID (const struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOther)
{ {
extern const char *Txt_The_ID_X_matches_one_of_the_existing; extern const char *Txt_The_ID_X_matches_one_of_the_existing;
extern const char *Txt_The_ID_X_has_been_confirmed; extern const char *Txt_The_ID_X_has_been_confirmed;
@ -836,7 +854,7 @@ static void ID_NewUsrID (const struct Usr_Data *UsrDat,bool ItsMe)
if (AlreadyExists) // This new ID was already associated to this user if (AlreadyExists) // This new ID was already associated to this user
{ {
if (ItsMe || UsrDat->IDs.List[NumIDFound].Confirmed) if (MeOrOther == Usr_ME || UsrDat->IDs.List[NumIDFound].Confirmed)
Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID, Ale_CreateAlert (Ale_WARNING,ID_ID_SECTION_ID,
Txt_The_ID_X_matches_one_of_the_existing, Txt_The_ID_X_matches_one_of_the_existing,
NewID); NewID);
@ -859,7 +877,7 @@ static void ID_NewUsrID (const struct Usr_Data *UsrDat,bool ItsMe)
/***** Save this new ID *****/ /***** Save this new ID *****/
// It's me ==> ID not confirmed // It's me ==> ID not confirmed
// Not me ==> ID confirmed // Not me ==> ID confirmed
ID_DB_InsertANewUsrID (UsrDat->UsrCod,NewID,!ItsMe); ID_DB_InsertANewUsrID (UsrDat->UsrCod,NewID,MeOrOther == Usr_OTHER);
Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID, Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID,
Txt_The_ID_X_has_been_registered_successfully, Txt_The_ID_X_has_been_registered_successfully,
@ -895,7 +913,7 @@ void ID_ConfirmOtherUsrID (void)
/***** Get other user's code from form and get user's data *****/ /***** Get other user's code from form and get user's data *****/
ICanConfirm = false; ICanConfirm = false;
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
if (!Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)) // Not me if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_OTHER) // Not me
{ {
/* If user is a student in current course, /* If user is a student in current course,
check if he/she has accepted */ check if he/she has accepted */

View File

@ -78,7 +78,7 @@ void ID_ShowFormChangeOtherUsrID (void);
void ID_RemoveMyUsrID (void); void ID_RemoveMyUsrID (void);
void ID_RemoveOtherUsrID (void); void ID_RemoveOtherUsrID (void);
void ID_NewMyUsrID (void); void ID_NewMyUsrID (void);
void ID_NewOtherUsrID (void); void ID_ChangeOtherUsrID (void);
void ID_ConfirmOtherUsrID (void); void ID_ConfirmOtherUsrID (void);

View File

@ -75,6 +75,7 @@
#include "swad_setting_database.h" #include "swad_setting_database.h"
#include "swad_test_print.h" #include "swad_test_print.h"
#include "swad_timeline.h" #include "swad_timeline.h"
#include "swad_user.h"
#include "swad_user_database.h" #include "swad_user_database.h"
/*****************************************************************************/ /*****************************************************************************/
@ -98,7 +99,7 @@ static void Acc_CreateNewEncryptedUsrCod (struct Usr_Data *UsrDat);
static void Acc_PutParsToRemoveMyAccount (void *EncryptedUsrCod); static void Acc_PutParsToRemoveMyAccount (void *EncryptedUsrCod);
static void Acc_AskIfRemoveUsrAccount (bool ItsMe); static void Acc_AskIfRemoveUsrAccount (Usr_MeOrOther_t MeOrOther);
static void Acc_AskIfRemoveOtherUsrAccount (void); static void Acc_AskIfRemoveOtherUsrAccount (void);
static void Acc_RemoveUsrBriefcase (struct Usr_Data *UsrDat); static void Acc_RemoveUsrBriefcase (struct Usr_Data *UsrDat);
@ -832,12 +833,12 @@ void Acc_GetUsrCodAndRemUsrGbl (void)
void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove) void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove)
{ {
bool ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); Usr_MeOrOther_t MeOrOther = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
switch (RequestOrRemove) switch (RequestOrRemove)
{ {
case Acc_REQUEST_REMOVE_USR: // Ask if eliminate completely the user from the platform case Acc_REQUEST_REMOVE_USR: // Ask if eliminate completely the user from the platform
Acc_AskIfRemoveUsrAccount (ItsMe); Acc_AskIfRemoveUsrAccount (MeOrOther);
break; break;
case Acc_REMOVE_USR: // Eliminate completely the user from the platform case Acc_REMOVE_USR: // Eliminate completely the user from the platform
if (Pwd_GetConfirmationOnDangerousAction ()) if (Pwd_GetConfirmationOnDangerousAction ())
@ -848,7 +849,7 @@ void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove)
Msg_DB_MoveUnusedMsgsContentToDeleted (); Msg_DB_MoveUnusedMsgsContentToDeleted ();
} }
else else
Acc_AskIfRemoveUsrAccount (ItsMe); Acc_AskIfRemoveUsrAccount (MeOrOther);
break; break;
} }
} }
@ -859,27 +860,33 @@ void Acc_ReqRemAccountOrRemAccount (Acc_ReqOrRemUsr_t RequestOrRemove)
bool Acc_CheckIfICanEliminateAccount (long UsrCod) bool Acc_CheckIfICanEliminateAccount (long UsrCod)
{ {
bool ItsMe = Usr_ItsMe (UsrCod); Usr_MeOrOther_t MeOrOther = Usr_ItsMe (UsrCod);
// A user logged as superuser can eliminate any user except her/him // A user logged as superuser can eliminate any user except her/him
// Other users only can eliminate themselves // Other users only can eliminate themselves
return (( ItsMe && // It's me switch (MeOrOther)
(Gbl.Usrs.Me.Role.Available & (1 << Rol_SYS_ADM)) == 0) // I can not be system admin {
|| case Usr_ME:
(!ItsMe && // It's not me return (Gbl.Usrs.Me.Role.Available & (1 << Rol_SYS_ADM)) == 0; // I can not be system admin
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)); // I am logged as system admin case Usr_OTHER:
default:
return Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM; // I am logged as system admin
}
} }
/*****************************************************************************/ /*****************************************************************************/
/*********** Ask if really wanted to eliminate completely a user *************/ /*********** Ask if really wanted to eliminate completely a user *************/
/*****************************************************************************/ /*****************************************************************************/
static void Acc_AskIfRemoveUsrAccount (bool ItsMe) static void Acc_AskIfRemoveUsrAccount (Usr_MeOrOther_t MeOrOther)
{ {
if (ItsMe) static void (*FuncAskIfRemoveUsrAccount[Usr_NUM_ME_OR_OTHER]) (void) =
Acc_AskIfRemoveMyAccount (); {
else [Usr_ME ] = Acc_AskIfRemoveMyAccount,
Acc_AskIfRemoveOtherUsrAccount (); [Usr_OTHER] = Acc_AskIfRemoveOtherUsrAccount
};
FuncAskIfRemoveUsrAccount[MeOrOther] ();
} }
void Acc_AskIfRemoveMyAccount (void) void Acc_AskIfRemoveMyAccount (void)
@ -1128,13 +1135,19 @@ void Acc_PutIconToChangeUsrAccount (struct Usr_Data *UsrDat)
}; };
/***** Link for changing the account *****/ /***** Link for changing the account *****/
if (Usr_ItsMe (UsrDat->UsrCod)) switch (Usr_ItsMe (UsrDat->UsrCod))
Lay_PutContextualLinkOnlyIcon (ActFrmMyAcc,NULL, {
NULL,NULL, case Usr_ME:
"at.svg",Ico_BLACK); Lay_PutContextualLinkOnlyIcon (ActFrmMyAcc,NULL,
else // Not me NULL,NULL,
if (Usr_ICanEditOtherUsr (UsrDat)) "at.svg",Ico_BLACK);
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL, break;
Rec_PutParUsrCodEncrypted,NULL, case Usr_OTHER:
"at.svg",Ico_BLACK); default:
if (Usr_ICanEditOtherUsr (UsrDat))
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL,
Rec_PutParUsrCodEncrypted,NULL,
"at.svg",Ico_BLACK);
break;
}
} }

View File

@ -1463,9 +1463,9 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActDetStdPho ] = {1436,-1,TabUnk,ActLstStd ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_DATA,Act_BRW_1ST_TAB,NULL ,Pho_RecOtherUsrPhotoDetFaces ,NULL}, [ActDetStdPho ] = {1436,-1,TabUnk,ActLstStd ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_DATA,Act_BRW_1ST_TAB,NULL ,Pho_RecOtherUsrPhotoDetFaces ,NULL},
[ActDetTchPho ] = {1437,-1,TabUnk,ActLstTch ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_DATA,Act_BRW_1ST_TAB,NULL ,Pho_RecOtherUsrPhotoDetFaces ,NULL}, [ActDetTchPho ] = {1437,-1,TabUnk,ActLstTch ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_DATA,Act_BRW_1ST_TAB,NULL ,Pho_RecOtherUsrPhotoDetFaces ,NULL},
[ActUpdOthPho ] = {1438,-1,TabUnk,ActLstOth ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,Pho_UpdateUsrPhoto1 ,Pho_UpdateUsrPhoto2 ,NULL}, [ActChgOthPho ] = {1438,-1,TabUnk,ActLstOth ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,Pho_ChangeUsrPhoto1 ,Pho_ChangeUsrPhoto2 ,NULL},
[ActUpdStdPho ] = {1439,-1,TabUnk,ActLstStd ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,Pho_UpdateUsrPhoto1 ,Pho_UpdateUsrPhoto2 ,NULL}, [ActChgStdPho ] = {1439,-1,TabUnk,ActLstStd ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,Pho_ChangeUsrPhoto1 ,Pho_ChangeUsrPhoto2 ,NULL},
[ActUpdTchPho ] = {1440,-1,TabUnk,ActLstTch ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,Pho_UpdateUsrPhoto1 ,Pho_UpdateUsrPhoto2 ,NULL}, [ActChgTchPho ] = {1440,-1,TabUnk,ActLstTch ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,Pho_ChangeUsrPhoto1 ,Pho_ChangeUsrPhoto2 ,NULL},
[ActReqRemOthPho ] = {1574,-1,TabUnk,ActLstOth ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Pho_ReqRemUsrPhoto ,NULL}, [ActReqRemOthPho ] = {1574,-1,TabUnk,ActLstOth ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Pho_ReqRemUsrPhoto ,NULL},
[ActReqRemStdPho ] = {1575,-1,TabUnk,ActLstStd ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Pho_ReqRemUsrPhoto ,NULL}, [ActReqRemStdPho ] = {1575,-1,TabUnk,ActLstStd ,0x3E0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Pho_ReqRemUsrPhoto ,NULL},
@ -1515,19 +1515,19 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActFrmAccStd ] = {1736,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Acc_ShowFormChgOtherUsrAccount ,NULL}, [ActFrmAccStd ] = {1736,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Acc_ShowFormChgOtherUsrAccount ,NULL},
[ActFrmAccTch ] = {1737,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Acc_ShowFormChgOtherUsrAccount ,NULL}, [ActFrmAccTch ] = {1737,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Acc_ShowFormChgOtherUsrAccount ,NULL},
[ActRemOldNicOth ] = {1738,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_RemoveOtherUsrNick ,NULL}, [ActRemNicOth ] = {1738,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_RemoveOtherUsrNick ,NULL},
[ActRemOldNicStd ] = {1739,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_RemoveOtherUsrNick ,NULL}, [ActRemNicStd ] = {1739,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_RemoveOtherUsrNick ,NULL},
[ActRemOldNicTch ] = {1740,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_RemoveOtherUsrNick ,NULL}, [ActRemNicTch ] = {1740,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_RemoveOtherUsrNick ,NULL},
[ActChgNicOth ] = {1741,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_UpdateOtherUsrNick ,NULL}, [ActChgNicOth ] = {1741,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_ChangeOtherUsrNick ,NULL},
[ActChgNicStd ] = {1742,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_UpdateOtherUsrNick ,NULL}, [ActChgNicStd ] = {1742,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_ChangeOtherUsrNick ,NULL},
[ActChgNicTch ] = {1743,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_UpdateOtherUsrNick ,NULL}, [ActChgNicTch ] = {1743,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Nck_ChangeOtherUsrNick ,NULL},
[ActRemID_Oth ] = {1450,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_RemoveOtherUsrID ,NULL}, [ActRemID_Oth ] = {1450,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_RemoveOtherUsrID ,NULL},
[ActRemID_Std ] = {1451,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_RemoveOtherUsrID ,NULL}, [ActRemID_Std ] = {1451,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_RemoveOtherUsrID ,NULL},
[ActRemID_Tch ] = {1452,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_RemoveOtherUsrID ,NULL}, [ActRemID_Tch ] = {1452,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_RemoveOtherUsrID ,NULL},
[ActNewID_Oth ] = {1453,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_NewOtherUsrID ,NULL}, [ActChgID_Oth ] = {1453,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_ChangeOtherUsrID ,NULL},
[ActNewID_Std ] = {1454,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_NewOtherUsrID ,NULL}, [ActChgID_Std ] = {1454,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_ChangeOtherUsrID ,NULL},
[ActNewID_Tch ] = {1455,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_NewOtherUsrID ,NULL}, [ActChgID_Tch ] = {1455,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ID_ChangeOtherUsrID ,NULL},
[ActChgPwdOth ] = {1467,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,Pwd_UpdateOtherUsrPwd ,Acc_ShowFormChgOtherUsrAccount ,NULL}, [ActChgPwdOth ] = {1467,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,Pwd_UpdateOtherUsrPwd ,Acc_ShowFormChgOtherUsrAccount ,NULL},
[ActChgPwdStd ] = {1468,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,Pwd_UpdateOtherUsrPwd ,Acc_ShowFormChgOtherUsrAccount ,NULL}, [ActChgPwdStd ] = {1468,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,Pwd_UpdateOtherUsrPwd ,Acc_ShowFormChgOtherUsrAccount ,NULL},
@ -1536,9 +1536,9 @@ const struct Act_Actions ActLst_Actions[ActLst_NUM_ACTIONS] =
[ActRemMaiOth ] = {1478,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_RemoveOtherUsrEmail ,NULL}, [ActRemMaiOth ] = {1478,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_RemoveOtherUsrEmail ,NULL},
[ActRemMaiStd ] = {1479,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_RemoveOtherUsrEmail ,NULL}, [ActRemMaiStd ] = {1479,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_RemoveOtherUsrEmail ,NULL},
[ActRemMaiTch ] = {1480,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_RemoveOtherUsrEmail ,NULL}, [ActRemMaiTch ] = {1480,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_RemoveOtherUsrEmail ,NULL},
[ActNewMaiOth ] = {1481,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_NewOtherUsrEmail ,NULL}, [ActChgMaiOth ] = {1481,-1,TabUnk,ActLstOth ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_ChangeOtherUsrEmail ,NULL},
[ActNewMaiStd ] = {1482,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_NewOtherUsrEmail ,NULL}, [ActChgMaiStd ] = {1482,-1,TabUnk,ActLstStd ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_ChangeOtherUsrEmail ,NULL},
[ActNewMaiTch ] = {1483,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_NewOtherUsrEmail ,NULL}, [ActChgMaiTch ] = {1483,-1,TabUnk,ActLstTch ,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,0x3C0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_ChangeOtherUsrEmail ,NULL},
[ActRemStdCrs ] = {1462,-1,TabUnk,ActLstStd ,0x3F8,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Enr_RemUsrFromCrs1 ,Enr_RemUsrFromCrs2 ,NULL}, [ActRemStdCrs ] = {1462,-1,TabUnk,ActLstStd ,0x3F8,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Enr_RemUsrFromCrs1 ,Enr_RemUsrFromCrs2 ,NULL},
[ActRemNETCrs ] = {1647,-1,TabUnk,ActLstTch ,0x3F0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Enr_RemUsrFromCrs1 ,Enr_RemUsrFromCrs2 ,NULL}, [ActRemNETCrs ] = {1647,-1,TabUnk,ActLstTch ,0x3F0,0x3C0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Enr_RemUsrFromCrs1 ,Enr_RemUsrFromCrs2 ,NULL},
@ -3329,9 +3329,9 @@ Act_Action_t ActLst_FromActCodToAction[1 + ActLst_MAX_ACTION_COD] = // Do not re
ActDetOthPho, // #1435 ActDetOthPho, // #1435
ActDetStdPho, // #1436 ActDetStdPho, // #1436
ActDetTchPho, // #1437 ActDetTchPho, // #1437
ActUpdOthPho, // #1438 ActChgOthPho, // #1438
ActUpdStdPho, // #1439 ActChgStdPho, // #1439
ActUpdTchPho, // #1440 ActChgTchPho, // #1440
ActRemOthPho, // #1441 ActRemOthPho, // #1441
ActRemStdPho, // #1442 ActRemStdPho, // #1442
ActRemTchPho, // #1443 ActRemTchPho, // #1443
@ -3344,9 +3344,9 @@ Act_Action_t ActLst_FromActCodToAction[1 + ActLst_MAX_ACTION_COD] = // Do not re
ActRemID_Oth, // #1450 ActRemID_Oth, // #1450
ActRemID_Std, // #1451 ActRemID_Std, // #1451
ActRemID_Tch, // #1452 ActRemID_Tch, // #1452
ActNewID_Oth, // #1453 ActChgID_Oth, // #1453
ActNewID_Std, // #1454 ActChgID_Std, // #1454
ActNewID_Tch, // #1455 ActChgID_Tch, // #1455
ActReqAccEnrStd, // #1456 ActReqAccEnrStd, // #1456
ActReqAccEnrTch, // #1457 ActReqAccEnrTch, // #1457
ActAccEnrStd, // #1458 ActAccEnrStd, // #1458
@ -3372,9 +3372,9 @@ Act_Action_t ActLst_FromActCodToAction[1 + ActLst_MAX_ACTION_COD] = // Do not re
ActRemMaiOth, // #1478 ActRemMaiOth, // #1478
ActRemMaiStd, // #1479 ActRemMaiStd, // #1479
ActRemMaiTch, // #1480 ActRemMaiTch, // #1480
ActNewMaiOth, // #1481 ActChgMaiOth, // #1481
ActNewMaiStd, // #1482 ActChgMaiStd, // #1482
ActNewMaiTch, // #1483 ActChgMaiTch, // #1483
ActChg1stDay, // #1484 ActChg1stDay, // #1484
-1, // #1485 (obsolete action) -1, // #1485 (obsolete action)
ActChgCrsTT1stDay, // #1486 ActChgCrsTT1stDay, // #1486
@ -3629,9 +3629,9 @@ Act_Action_t ActLst_FromActCodToAction[1 + ActLst_MAX_ACTION_COD] = // Do not re
ActFrmAccOth, // #1735 ActFrmAccOth, // #1735
ActFrmAccStd, // #1736 ActFrmAccStd, // #1736
ActFrmAccTch, // #1737 ActFrmAccTch, // #1737
ActRemOldNicOth, // #1738 ActRemNicOth, // #1738
ActRemOldNicStd, // #1739 ActRemNicStd, // #1739
ActRemOldNicTch, // #1740 ActRemNicTch, // #1740
ActChgNicOth, // #1741 ActChgNicOth, // #1741
ActChgNicStd, // #1742 ActChgNicStd, // #1742
ActChgNicTch, // #1743 ActChgNicTch, // #1743

View File

@ -1370,15 +1370,16 @@
#define ActDetOthPho (ActRemOldBrf + 94) #define ActDetOthPho (ActRemOldBrf + 94)
#define ActDetStdPho (ActRemOldBrf + 95) #define ActDetStdPho (ActRemOldBrf + 95)
#define ActDetTchPho (ActRemOldBrf + 96) #define ActDetTchPho (ActRemOldBrf + 96)
#define ActUpdOthPho (ActRemOldBrf + 97) #define ActChgOthPho (ActRemOldBrf + 97)
#define ActUpdStdPho (ActRemOldBrf + 98) #define ActChgStdPho (ActRemOldBrf + 98)
#define ActUpdTchPho (ActRemOldBrf + 99) #define ActChgTchPho (ActRemOldBrf + 99)
#define ActReqRemOthPho (ActRemOldBrf + 100) #define ActReqRemOthPho (ActRemOldBrf + 100)
#define ActReqRemStdPho (ActRemOldBrf + 101) #define ActReqRemStdPho (ActRemOldBrf + 101)
#define ActReqRemTchPho (ActRemOldBrf + 102) #define ActReqRemTchPho (ActRemOldBrf + 102)
#define ActRemOthPho (ActRemOldBrf + 103) #define ActRemOthPho (ActRemOldBrf + 103)
#define ActRemStdPho (ActRemOldBrf + 104) #define ActRemStdPho (ActRemOldBrf + 104)
#define ActRemTchPho (ActRemOldBrf + 105) #define ActRemTchPho (ActRemOldBrf + 105)
#define ActCreOth (ActRemOldBrf + 106) #define ActCreOth (ActRemOldBrf + 106)
#define ActCreStd (ActRemOldBrf + 107) #define ActCreStd (ActRemOldBrf + 107)
#define ActCreNET (ActRemOldBrf + 108) #define ActCreNET (ActRemOldBrf + 108)
@ -1417,9 +1418,9 @@
#define ActFrmAccStd (ActRemOldBrf + 136) #define ActFrmAccStd (ActRemOldBrf + 136)
#define ActFrmAccTch (ActRemOldBrf + 137) #define ActFrmAccTch (ActRemOldBrf + 137)
#define ActRemOldNicOth (ActRemOldBrf + 138) #define ActRemNicOth (ActRemOldBrf + 138)
#define ActRemOldNicStd (ActRemOldBrf + 139) #define ActRemNicStd (ActRemOldBrf + 139)
#define ActRemOldNicTch (ActRemOldBrf + 140) #define ActRemNicTch (ActRemOldBrf + 140)
#define ActChgNicOth (ActRemOldBrf + 141) #define ActChgNicOth (ActRemOldBrf + 141)
#define ActChgNicStd (ActRemOldBrf + 142) #define ActChgNicStd (ActRemOldBrf + 142)
#define ActChgNicTch (ActRemOldBrf + 143) #define ActChgNicTch (ActRemOldBrf + 143)
@ -1427,18 +1428,20 @@
#define ActRemID_Oth (ActRemOldBrf + 144) #define ActRemID_Oth (ActRemOldBrf + 144)
#define ActRemID_Std (ActRemOldBrf + 145) #define ActRemID_Std (ActRemOldBrf + 145)
#define ActRemID_Tch (ActRemOldBrf + 146) #define ActRemID_Tch (ActRemOldBrf + 146)
#define ActNewID_Oth (ActRemOldBrf + 147) #define ActChgID_Oth (ActRemOldBrf + 147)
#define ActNewID_Std (ActRemOldBrf + 148) #define ActChgID_Std (ActRemOldBrf + 148)
#define ActNewID_Tch (ActRemOldBrf + 149) #define ActChgID_Tch (ActRemOldBrf + 149)
#define ActChgPwdOth (ActRemOldBrf + 150) #define ActChgPwdOth (ActRemOldBrf + 150)
#define ActChgPwdStd (ActRemOldBrf + 151) #define ActChgPwdStd (ActRemOldBrf + 151)
#define ActChgPwdTch (ActRemOldBrf + 152) #define ActChgPwdTch (ActRemOldBrf + 152)
#define ActRemMaiOth (ActRemOldBrf + 153) #define ActRemMaiOth (ActRemOldBrf + 153)
#define ActRemMaiStd (ActRemOldBrf + 154) #define ActRemMaiStd (ActRemOldBrf + 154)
#define ActRemMaiTch (ActRemOldBrf + 155) #define ActRemMaiTch (ActRemOldBrf + 155)
#define ActNewMaiOth (ActRemOldBrf + 156) #define ActChgMaiOth (ActRemOldBrf + 156)
#define ActNewMaiStd (ActRemOldBrf + 157) #define ActChgMaiStd (ActRemOldBrf + 157)
#define ActNewMaiTch (ActRemOldBrf + 158) #define ActChgMaiTch (ActRemOldBrf + 158)
#define ActRemStdCrs (ActRemOldBrf + 159) #define ActRemStdCrs (ActRemOldBrf + 159)
#define ActRemNETCrs (ActRemOldBrf + 160) #define ActRemNETCrs (ActRemOldBrf + 160)

View File

@ -75,7 +75,7 @@ static void Adm_RegisterAdmin (struct Usr_Data *UsrDat,
static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr, static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
HieLvl_Level_t Scope,long Cod, HieLvl_Level_t Scope,long Cod,
const char *InsCtrDegName); const char *InsCtrDegName);
static void Adm_AskIfRemAdm (bool ItsMe,HieLvl_Level_t Scope, static void Adm_AskIfRemAdm (Usr_MeOrOther_t MeOrOther,HieLvl_Level_t Scope,
const char *InsCtrDegName); const char *InsCtrDegName);
static void Adm_EffectivelyRemAdm (struct Usr_Data *UsrDat, static void Adm_EffectivelyRemAdm (struct Usr_Data *UsrDat,
HieLvl_Level_t Scope,long Cod, HieLvl_Level_t Scope,long Cod,
@ -345,7 +345,7 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
const char *InsCtrDegName) const char *InsCtrDegName)
{ {
extern const char *Txt_THE_USER_X_is_not_an_administrator_of_Y; extern const char *Txt_THE_USER_X_is_not_an_administrator_of_Y;
bool ItsMe; Usr_MeOrOther_t MeOrOther;
bool ICanRemove; bool ICanRemove;
if (Cod > 0) if (Cod > 0)
@ -354,8 +354,8 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
/* Check if it's forbidden to remove an administrator */ /* Check if it's forbidden to remove an administrator */
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); MeOrOther = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
ICanRemove = (ItsMe || ICanRemove = (MeOrOther == Usr_ME ||
(Scope == HieLvl_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) || (Scope == HieLvl_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Scope == HieLvl_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) || (Scope == HieLvl_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
(Scope == HieLvl_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)); (Scope == HieLvl_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
@ -367,7 +367,7 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
switch (ReqDelOrDelUsr) switch (ReqDelOrDelUsr)
{ {
case Enr_REQUEST_REMOVE_USR: // Ask if remove administrator from current institution case Enr_REQUEST_REMOVE_USR: // Ask if remove administrator from current institution
Adm_AskIfRemAdm (ItsMe,Scope,InsCtrDegName); Adm_AskIfRemAdm (MeOrOther,Scope,InsCtrDegName);
break; break;
case Enr_REMOVE_USR: // Remove administrator from current institution case Enr_REMOVE_USR: // Remove administrator from current institution
Adm_EffectivelyRemAdm (&Gbl.Usrs.Other.UsrDat,Scope, Adm_EffectivelyRemAdm (&Gbl.Usrs.Other.UsrDat,Scope,
@ -391,14 +391,14 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
/** Ask if really wanted to remove an administrator from current institution */ /** Ask if really wanted to remove an administrator from current institution */
/*****************************************************************************/ /*****************************************************************************/
static void Adm_AskIfRemAdm (bool ItsMe,HieLvl_Level_t Scope, static void Adm_AskIfRemAdm (Usr_MeOrOther_t MeOrOther,HieLvl_Level_t Scope,
const char *InsCtrDegName) const char *InsCtrDegName)
{ {
extern const char *Txt_Do_you_really_want_to_be_removed_as_an_administrator_of_X; extern const char *Txt_Do_you_really_want_to_be_removed_as_an_administrator_of_X;
extern const char *Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_X; extern const char *Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_X;
extern const char *Txt_Remove_me_as_an_administrator; extern const char *Txt_Remove_me_as_an_administrator;
extern const char *Txt_Remove_USER_as_an_administrator; extern const char *Txt_Remove_USER_as_an_administrator;
static const Act_Action_t Enr_ActRemAdm[HieLvl_NUM_LEVELS] = static const Act_Action_t ActRemAdm[HieLvl_NUM_LEVELS] =
{ {
[HieLvl_UNK] = ActUnk, [HieLvl_UNK] = ActUnk,
[HieLvl_SYS] = ActUnk, [HieLvl_SYS] = ActUnk,
@ -408,24 +408,30 @@ static void Adm_AskIfRemAdm (bool ItsMe,HieLvl_Level_t Scope,
[HieLvl_DEG] = ActRemAdmDeg, [HieLvl_DEG] = ActRemAdmDeg,
[HieLvl_CRS] = ActUnk, [HieLvl_CRS] = ActUnk,
}; };
const char *Question[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_Do_you_really_want_to_be_removed_as_an_administrator_of_X,
[Usr_OTHER] = Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_X,
};
const char *TxtButton[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_Remove_me_as_an_administrator,
[Usr_OTHER] = Txt_Remove_USER_as_an_administrator,
};
if (Usr_DB_ChkIfUsrCodExists (Gbl.Usrs.Other.UsrDat.UsrCod)) if (Usr_DB_ChkIfUsrCodExists (Gbl.Usrs.Other.UsrDat.UsrCod))
{ {
/***** Show question and button to remove user as administrator *****/ /***** Show question and button to remove user as administrator *****/
/* Begin alert */ /* Begin alert */
Ale_ShowAlertAndButton1 (Ale_QUESTION,ItsMe ? Txt_Do_you_really_want_to_be_removed_as_an_administrator_of_X : Ale_ShowAlertAndButton1 (Ale_QUESTION,Question[MeOrOther],InsCtrDegName);
Txt_Do_you_really_want_to_remove_the_following_user_as_an_administrator_of_X,
InsCtrDegName);
/* Show user's record */ /* Show user's record */
Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedRecordUnmodifiable (&Gbl.Usrs.Other.UsrDat);
/* End alert */ /* End alert */
Ale_ShowAlertAndButton2 (Enr_ActRemAdm[Scope],NULL,NULL, Ale_ShowAlertAndButton2 (ActRemAdm[Scope],NULL,NULL,
Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod, Usr_PutParOtherUsrCodEncrypted,Gbl.Usrs.Other.UsrDat.EnUsrCod,
Btn_REMOVE_BUTTON, Btn_REMOVE_BUTTON,TxtButton[MeOrOther]);
ItsMe ? Txt_Remove_me_as_an_administrator :
Txt_Remove_USER_as_an_administrator);
} }
else else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();

View File

@ -377,8 +377,18 @@ void Agd_ShowUsrAgenda (void)
extern const char *Txt_Public_agenda_USER; extern const char *Txt_Public_agenda_USER;
struct Agd_Agenda Agenda; struct Agd_Agenda Agenda;
bool Error = true; bool Error = true;
bool ItsMe; Usr_MeOrOther_t MeOrOther;
char *Title; char *Title;
static struct Usr_Data *UsrDat[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = &Gbl.Usrs.Me.UsrDat,
[Usr_OTHER] = &Gbl.Usrs.Other.UsrDat,
};
static void (*FuncPutIcons[Usr_NUM_ME_OR_OTHER]) (void *EncryptedUsrCod) =
{
[Usr_ME ] = Agd_PutIconsMyPublicAgenda,
[Usr_OTHER] = Agd_PutIconsOtherPublicAgenda,
};
/***** Get user *****/ /***** Get user *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
@ -390,16 +400,11 @@ void Agd_ShowUsrAgenda (void)
Agd_ResetAgenda (&Agenda); Agd_ResetAgenda (&Agenda);
/***** Begin box *****/ /***** Begin box *****/
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); MeOrOther = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
if (asprintf (&Title,Txt_Public_agenda_USER, if (asprintf (&Title,Txt_Public_agenda_USER,UsrDat[MeOrOther]->FullName) < 0)
ItsMe ? Gbl.Usrs.Me.UsrDat.FullName :
Gbl.Usrs.Other.UsrDat.FullName) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
Box_BoxBegin ("100%",Title, Box_BoxBegin ("100%",Title,
ItsMe ? Agd_PutIconsMyPublicAgenda : FuncPutIcons[MeOrOther],UsrDat[MeOrOther]->EnUsrCod,
Agd_PutIconsOtherPublicAgenda,
ItsMe ? Gbl.Usrs.Me.UsrDat.EnUsrCod :
Gbl.Usrs.Other.UsrDat.EnUsrCod,
Hlp_PROFILE_Agenda_public_agenda,Box_NOT_CLOSABLE); Hlp_PROFILE_Agenda_public_agenda,Box_NOT_CLOSABLE);
free (Title); free (Title);
@ -428,8 +433,18 @@ void Agd_ShowOtherAgendaAfterLogIn (void)
extern const char *Txt_Public_agenda_USER; extern const char *Txt_Public_agenda_USER;
extern const char *Txt_Switching_to_LANGUAGE[1 + Lan_NUM_LANGUAGES]; extern const char *Txt_Switching_to_LANGUAGE[1 + Lan_NUM_LANGUAGES];
struct Agd_Agenda Agenda; struct Agd_Agenda Agenda;
bool ItsMe; Usr_MeOrOther_t MeOrOther;
char *Title; char *Title;
static struct Usr_Data *UsrDat[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = &Gbl.Usrs.Me.UsrDat,
[Usr_OTHER] = &Gbl.Usrs.Other.UsrDat,
};
static void (*FuncPutIcons[Usr_NUM_ME_OR_OTHER]) (void *EncryptedUsrCod) =
{
[Usr_ME ] = Agd_PutIconToViewEditMyFullAgenda,
[Usr_OTHER] = Agd_PutIconsOtherPublicAgenda,
};
if (Gbl.Usrs.Me.Logged) if (Gbl.Usrs.Me.Logged)
{ {
@ -445,16 +460,11 @@ void Agd_ShowOtherAgendaAfterLogIn (void)
Agd_ResetAgenda (&Agenda); Agd_ResetAgenda (&Agenda);
/***** Begin box *****/ /***** Begin box *****/
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); MeOrOther = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
if (asprintf (&Title,Txt_Public_agenda_USER, if (asprintf (&Title,Txt_Public_agenda_USER,UsrDat[MeOrOther]->FullName) < 0)
ItsMe ? Gbl.Usrs.Me.UsrDat.FullName :
Gbl.Usrs.Other.UsrDat.FullName) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
Box_BoxBegin ("100%",Title, Box_BoxBegin ("100%",Title,
ItsMe ? Agd_PutIconToViewEditMyFullAgenda : FuncPutIcons[MeOrOther],UsrDat[MeOrOther]->EnUsrCod,
Agd_PutIconsOtherPublicAgenda,
ItsMe ? Gbl.Usrs.Me.UsrDat.EnUsrCod :
Gbl.Usrs.Other.UsrDat.EnUsrCod,
Hlp_PROFILE_Agenda_public_agenda,Box_NOT_CLOSABLE); Hlp_PROFILE_Agenda_public_agenda,Box_NOT_CLOSABLE);
free (Title); free (Title);

View File

@ -1715,7 +1715,7 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
{ {
case Rol_STD: case Rol_STD:
// A student can see only her/his attendance // A student can see only her/his attendance
if (!Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER)
Err_ShowErrorAndExit ("Wrong call."); Err_ShowErrorAndExit ("Wrong call.");
ICanChangeStdAttendance = false; ICanChangeStdAttendance = false;
ICanEditStdComment = Event->Open; // Attendance event is open ICanEditStdComment = Event->Open; // Attendance event is open

View File

@ -629,10 +629,11 @@ TODO: Emilce Barrera Mesa: Podr
TODO: Emilce Barrera Mesa: Mis estudiantes presentan muchas dificultades a la hora de poner la foto porque la plataforma es muy exigente respecto al fondo de la imagen. TODO: Emilce Barrera Mesa: Mis estudiantes presentan muchas dificultades a la hora de poner la foto porque la plataforma es muy exigente respecto al fondo de la imagen.
*/ */
#define Log_PLATFORM_VERSION "SWAD 22.89.1 (2023-04-04)" #define Log_PLATFORM_VERSION "SWAD 22.90 (2023-04-04)"
#define CSS_FILE "swad22.88.css" #define CSS_FILE "swad22.88.css"
#define JS_FILE "swad22.49.js" #define JS_FILE "swad22.49.js"
/* /*
Version 22.90: Apr 04, 2023 Code refactoring checking user. (338807 lines)
Version 22.89.1: Apr 04, 2023 Code refactoring in projects configuration. (338622 lines) Version 22.89.1: Apr 04, 2023 Code refactoring in projects configuration. (338622 lines)
Version 22.89: Apr 01, 2023 New module swad_project_config for projects configuration. (338613 lines) Version 22.89: Apr 01, 2023 New module swad_project_config for projects configuration. (338613 lines)
Version 22.88: Mar 31, 2023 Code refactoring in resources. (338538 lines) Version 22.88: Mar 31, 2023 Code refactoring in resources. (338538 lines)

View File

@ -561,28 +561,32 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
}; };
const char *ClassTxt; const char *ClassTxt;
long UsrCod; long UsrCod;
bool ItsMe; Usr_MeOrOther_t MeOrOther;
struct Usr_Data *UsrDat; struct Usr_Data *UsrDat;
struct Usr_Data OtherUsrDat; struct Usr_Data OtherUsrDat;
/***** Get user's code from list *****/ /***** Get user's code from list *****/
UsrCod = Gbl.Usrs.Connected.Lst[Gbl.Usrs.Connected.NumUsr].UsrCod; UsrCod = Gbl.Usrs.Connected.Lst[Gbl.Usrs.Connected.NumUsr].UsrCod;
ItsMe = Usr_ItsMe (UsrCod); MeOrOther = Usr_ItsMe (UsrCod);
if (ItsMe) switch (MeOrOther)
UsrDat = &Gbl.Usrs.Me.UsrDat;
else
{ {
/***** Initialize structure with user's data *****/ case Usr_ME:
OtherUsrDat.UsrCod = UsrCod; UsrDat = &Gbl.Usrs.Me.UsrDat;
Usr_UsrDataConstructor (&OtherUsrDat); break;
case Usr_OTHER:
default:
/***** Initialize structure with user's data *****/
OtherUsrDat.UsrCod = UsrCod;
Usr_UsrDataConstructor (&OtherUsrDat);
/***** Get user's data *****/ /***** Get user's data *****/
Usr_GetAllUsrDataFromUsrCod (&OtherUsrDat, Usr_GetAllUsrDataFromUsrCod (&OtherUsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CURRENT_CRS); Usr_DONT_GET_ROLE_IN_CURRENT_CRS);
UsrDat = &OtherUsrDat; UsrDat = &OtherUsrDat;
break;
} }
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
@ -623,9 +627,16 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
HTM_TR_End (); HTM_TR_End ();
if (!ItsMe) switch (MeOrOther)
/***** Free memory used for user's data *****/ {
Usr_UsrDataDestructor (&OtherUsrDat); case Usr_ME:
break;
case Usr_OTHER:
default:
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&OtherUsrDat);
break;
}
The_ChangeRowColor (); The_ChangeRowColor ();
} }

View File

@ -73,7 +73,7 @@ void Dup_ReportUsrAsPossibleDuplicate (void)
{ {
/* Check if it's allowed to me to report users as possible duplicatedr */ /* Check if it's allowed to me to report users as possible duplicatedr */
if (Gbl.Usrs.Me.Role.Logged >= Rol_TCH && if (Gbl.Usrs.Me.Role.Logged >= Rol_TCH &&
!Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)) Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_OTHER)
{ {
/***** Insert possible duplicate into database *****/ /***** Insert possible duplicate into database *****/
Dup_DB_AddUsrToDuplicated (Gbl.Usrs.Other.UsrDat.UsrCod); Dup_DB_AddUsrToDuplicated (Gbl.Usrs.Other.UsrDat.UsrCod);

View File

@ -114,16 +114,16 @@ static void Enr_PutActionsRegRemSeveralUsrs (void);
static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role); static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role);
static void Enr_PutActionModifyOneUsr (bool *OptionChecked, static void Enr_PutActionModifyOneUsr (bool *OptionChecked,
bool UsrBelongsToCrs,bool ItsMe); bool UsrBelongsToCrs,Usr_MeOrOther_t MeOrOther);
static void Enr_PutActionRegOneDegAdm (bool *OptionChecked); static void Enr_PutActionRegOneDegAdm (bool *OptionChecked);
static void Enr_PutActionRegOneCtrAdm (bool *OptionChecked); static void Enr_PutActionRegOneCtrAdm (bool *OptionChecked);
static void Enr_PutActionRegOneInsAdm (bool *OptionChecked); static void Enr_PutActionRegOneInsAdm (bool *OptionChecked);
static void Enr_PutActionRepUsrAsDup (bool *OptionChecked); static void Enr_PutActionRepUsrAsDup (bool *OptionChecked);
static void Enr_PutActionRemUsrFromCrs (bool *OptionChecked,bool ItsMe); static void Enr_PutActionRemUsrFromCrs (bool *OptionChecked,Usr_MeOrOther_t MeOrOther);
static void Enr_PutActionRemUsrAsDegAdm (bool *OptionChecked,bool ItsMe); static void Enr_PutActionRemUsrAsDegAdm (bool *OptionChecked,Usr_MeOrOther_t MeOrOther);
static void Enr_PutActionRemUsrAsCtrAdm (bool *OptionChecked,bool ItsMe); static void Enr_PutActionRemUsrAsCtrAdm (bool *OptionChecked,Usr_MeOrOther_t MeOrOther);
static void Enr_PutActionRemUsrAsInsAdm (bool *OptionChecked,bool ItsMe); static void Enr_PutActionRemUsrAsInsAdm (bool *OptionChecked,Usr_MeOrOther_t MeOrOther);
static void Enr_PutActionRemUsrAcc (bool *OptionChecked,bool ItsMe); static void Enr_PutActionRemUsrAcc (bool *OptionChecked,Usr_MeOrOther_t MeOrOther);
static void Enr_RegRemOneUsrActionBegin (Enr_RegRemOneUsrAction_t RegRemOneUsrAction, static void Enr_RegRemOneUsrActionBegin (Enr_RegRemOneUsrAction_t RegRemOneUsrAction,
bool *OptionChecked); bool *OptionChecked);
static void Enr_RegRemOneUsrActionEnd (void); static void Enr_RegRemOneUsrActionEnd (void);
@ -315,7 +315,7 @@ static void Enr_NotifyAfterEnrolment (const struct Usr_Data *UsrDat,
/***** Create new notification ******/ /***** Create new notification ******/
CreateNotif = (UsrDat->NtfEvents.CreateNotif & (1 << NotifyEvent[NewRole])); CreateNotif = (UsrDat->NtfEvents.CreateNotif & (1 << NotifyEvent[NewRole]));
NotifyByEmail = CreateNotif && !Usr_ItsMe (UsrDat->UsrCod) && NotifyByEmail = CreateNotif && Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER &&
(UsrDat->NtfEvents.SendEmail & (1 << NotifyEvent[NewRole])); (UsrDat->NtfEvents.SendEmail & (1 << NotifyEvent[NewRole]));
if (CreateNotif) if (CreateNotif)
Ntf_DB_StoreNotifyEventToUsr (NotifyEvent[NewRole],UsrDat->UsrCod,-1L, Ntf_DB_StoreNotifyEventToUsr (NotifyEvent[NewRole],UsrDat->UsrCod,-1L,
@ -1306,7 +1306,7 @@ static void Enr_ReceiveFormUsrsCrs (Rol_Role_t Role)
/*****************************************************************************/ /*****************************************************************************/
// Returns true if at least one action can be shown // Returns true if at least one action can be shown
bool Enr_PutActionsRegRemOneUsr (bool ItsMe) bool Enr_PutActionsRegRemOneUsr (Usr_MeOrOther_t MeOrOther)
{ {
bool OptionsShown = false; bool OptionsShown = false;
bool UsrBelongsToCrs = false; bool UsrBelongsToCrs = false;
@ -1347,7 +1347,7 @@ bool Enr_PutActionsRegRemOneUsr (bool ItsMe)
/***** Register user in course / Modify user's data *****/ /***** Register user in course / Modify user's data *****/
if (Gbl.Hierarchy.Level == HieLvl_CRS && Gbl.Usrs.Me.Role.Logged >= Rol_STD) if (Gbl.Hierarchy.Level == HieLvl_CRS && Gbl.Usrs.Me.Role.Logged >= Rol_STD)
{ {
Enr_PutActionModifyOneUsr (&OptionChecked,UsrBelongsToCrs,ItsMe); Enr_PutActionModifyOneUsr (&OptionChecked,UsrBelongsToCrs,MeOrOther);
OptionsShown = true; OptionsShown = true;
} }
@ -1380,7 +1380,7 @@ bool Enr_PutActionsRegRemOneUsr (bool ItsMe)
} }
/***** Report user as possible duplicate *****/ /***** Report user as possible duplicate *****/
if (!ItsMe && Gbl.Usrs.Me.Role.Logged >= Rol_TCH) if (MeOrOther == Usr_OTHER && Gbl.Usrs.Me.Role.Logged >= Rol_TCH)
{ {
Enr_PutActionRepUsrAsDup (&OptionChecked); Enr_PutActionRepUsrAsDup (&OptionChecked);
OptionsShown = true; OptionsShown = true;
@ -1389,7 +1389,7 @@ bool Enr_PutActionsRegRemOneUsr (bool ItsMe)
/***** Remove user from the course *****/ /***** Remove user from the course *****/
if (UsrBelongsToCrs) if (UsrBelongsToCrs)
{ {
Enr_PutActionRemUsrFromCrs (&OptionChecked,ItsMe); Enr_PutActionRemUsrFromCrs (&OptionChecked,MeOrOther);
OptionsShown = true; OptionsShown = true;
} }
@ -1399,24 +1399,27 @@ bool Enr_PutActionsRegRemOneUsr (bool ItsMe)
{ {
if (Gbl.Hierarchy.Ins.InsCod > 0) if (Gbl.Hierarchy.Ins.InsCod > 0)
/***** Remove user as an administrator of the degree *****/ /***** Remove user as an administrator of the degree *****/
if (UsrIsDegAdmin && (ItsMe || Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM)) if (UsrIsDegAdmin &&
(MeOrOther == Usr_ME || Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM))
{ {
Enr_PutActionRemUsrAsDegAdm (&OptionChecked,ItsMe); Enr_PutActionRemUsrAsDegAdm (&OptionChecked,MeOrOther);
OptionsShown = true; OptionsShown = true;
} }
/***** Remove user as an administrator of the center *****/ /***** Remove user as an administrator of the center *****/
if (UsrIsCtrAdmin && (ItsMe || Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM)) if (UsrIsCtrAdmin &&
(MeOrOther == Usr_ME || Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM))
{ {
Enr_PutActionRemUsrAsCtrAdm (&OptionChecked,ItsMe); Enr_PutActionRemUsrAsCtrAdm (&OptionChecked,MeOrOther);
OptionsShown = true; OptionsShown = true;
} }
} }
/***** Remove user as an administrator of the institution *****/ /***** Remove user as an administrator of the institution *****/
if (UsrIsInsAdmin && (ItsMe || Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) if (UsrIsInsAdmin &&
(MeOrOther == Usr_ME || Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM))
{ {
Enr_PutActionRemUsrAsInsAdm (&OptionChecked,ItsMe); Enr_PutActionRemUsrAsInsAdm (&OptionChecked,MeOrOther);
OptionsShown = true; OptionsShown = true;
} }
} }
@ -1424,7 +1427,7 @@ bool Enr_PutActionsRegRemOneUsr (bool ItsMe)
/***** Eliminate user completely from platform *****/ /***** Eliminate user completely from platform *****/
if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod)) if (Acc_CheckIfICanEliminateAccount (Gbl.Usrs.Other.UsrDat.UsrCod))
{ {
Enr_PutActionRemUsrAcc (&OptionChecked,ItsMe); Enr_PutActionRemUsrAcc (&OptionChecked,MeOrOther);
OptionsShown = true; OptionsShown = true;
} }
@ -1439,19 +1442,22 @@ bool Enr_PutActionsRegRemOneUsr (bool ItsMe)
/*****************************************************************************/ /*****************************************************************************/
static void Enr_PutActionModifyOneUsr (bool *OptionChecked, static void Enr_PutActionModifyOneUsr (bool *OptionChecked,
bool UsrBelongsToCrs,bool ItsMe) bool UsrBelongsToCrs,Usr_MeOrOther_t MeOrOther)
{ {
extern const char *Txt_Modify_me_in_the_course_X;
extern const char *Txt_Modify_user_in_the_course_X;
extern const char *Txt_Register_me_in_X; extern const char *Txt_Register_me_in_X;
extern const char *Txt_Register_USER_in_the_course_X; extern const char *Txt_Register_USER_in_the_course_X;
extern const char *Txt_Modify_me_in_the_course_X;
extern const char *Txt_Modify_user_in_the_course_X;
const char *Txt[2][Usr_NUM_ME_OR_OTHER] =
{
[false][Usr_ME ] = Txt_Register_me_in_X,
[false][Usr_OTHER] = Txt_Register_USER_in_the_course_X,
[true ][Usr_ME ] = Txt_Modify_me_in_the_course_X,
[true ][Usr_OTHER] = Txt_Modify_user_in_the_course_X,
};
Enr_RegRemOneUsrActionBegin (Enr_REGISTER_MODIFY_ONE_USR_IN_CRS,OptionChecked); Enr_RegRemOneUsrActionBegin (Enr_REGISTER_MODIFY_ONE_USR_IN_CRS,OptionChecked);
HTM_TxtF (UsrBelongsToCrs ? (ItsMe ? Txt_Modify_me_in_the_course_X : HTM_TxtF (Txt[UsrBelongsToCrs][MeOrOther],Gbl.Hierarchy.Crs.ShrtName);
Txt_Modify_user_in_the_course_X) :
(ItsMe ? Txt_Register_me_in_X :
Txt_Register_USER_in_the_course_X),
Gbl.Hierarchy.Crs.ShrtName);
Enr_RegRemOneUsrActionEnd (); Enr_RegRemOneUsrActionEnd ();
} }
@ -1514,15 +1520,18 @@ static void Enr_PutActionRepUsrAsDup (bool *OptionChecked)
/****************** Put action to remove user from course ********************/ /****************** Put action to remove user from course ********************/
/*****************************************************************************/ /*****************************************************************************/
static void Enr_PutActionRemUsrFromCrs (bool *OptionChecked,bool ItsMe) static void Enr_PutActionRemUsrFromCrs (bool *OptionChecked,Usr_MeOrOther_t MeOrOther)
{ {
extern const char *Txt_Remove_me_from_THE_COURSE_X; extern const char *Txt_Remove_me_from_THE_COURSE_X;
extern const char *Txt_Remove_USER_from_THE_COURSE_X; extern const char *Txt_Remove_USER_from_THE_COURSE_X;
const char *Txt[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_Remove_me_from_THE_COURSE_X,
[Usr_OTHER] = Txt_Remove_USER_from_THE_COURSE_X,
};
Enr_RegRemOneUsrActionBegin (Enr_REMOVE_ONE_USR_FROM_CRS,OptionChecked); Enr_RegRemOneUsrActionBegin (Enr_REMOVE_ONE_USR_FROM_CRS,OptionChecked);
HTM_TxtF (ItsMe ? Txt_Remove_me_from_THE_COURSE_X : HTM_TxtF (Txt[MeOrOther],Gbl.Hierarchy.Crs.ShrtName);
Txt_Remove_USER_from_THE_COURSE_X,
Gbl.Hierarchy.Crs.ShrtName);
Enr_RegRemOneUsrActionEnd (); Enr_RegRemOneUsrActionEnd ();
} }
@ -1530,15 +1539,18 @@ static void Enr_PutActionRemUsrFromCrs (bool *OptionChecked,bool ItsMe)
/***************** Put action to remove user as degree admin *****************/ /***************** Put action to remove user as degree admin *****************/
/*****************************************************************************/ /*****************************************************************************/
static void Enr_PutActionRemUsrAsDegAdm (bool *OptionChecked,bool ItsMe) static void Enr_PutActionRemUsrAsDegAdm (bool *OptionChecked,Usr_MeOrOther_t MeOrOther)
{ {
extern const char *Txt_Remove_me_as_an_administrator_of_the_degree_X; extern const char *Txt_Remove_me_as_an_administrator_of_the_degree_X;
extern const char *Txt_Remove_USER_as_an_administrator_of_the_degree_X; extern const char *Txt_Remove_USER_as_an_administrator_of_the_degree_X;
const char *Txt[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_Remove_me_as_an_administrator_of_the_degree_X,
[Usr_OTHER] = Txt_Remove_USER_as_an_administrator_of_the_degree_X,
};
Enr_RegRemOneUsrActionBegin (Enr_REMOVE_ONE_DEGREE_ADMIN,OptionChecked); Enr_RegRemOneUsrActionBegin (Enr_REMOVE_ONE_DEGREE_ADMIN,OptionChecked);
HTM_TxtF (ItsMe ? Txt_Remove_me_as_an_administrator_of_the_degree_X : HTM_TxtF (Txt[MeOrOther],Gbl.Hierarchy.Deg.ShrtName);
Txt_Remove_USER_as_an_administrator_of_the_degree_X,
Gbl.Hierarchy.Deg.ShrtName);
Enr_RegRemOneUsrActionEnd (); Enr_RegRemOneUsrActionEnd ();
} }
@ -1546,15 +1558,18 @@ static void Enr_PutActionRemUsrAsDegAdm (bool *OptionChecked,bool ItsMe)
/***************** Put action to remove user as center admin *****************/ /***************** Put action to remove user as center admin *****************/
/*****************************************************************************/ /*****************************************************************************/
static void Enr_PutActionRemUsrAsCtrAdm (bool *OptionChecked,bool ItsMe) static void Enr_PutActionRemUsrAsCtrAdm (bool *OptionChecked,Usr_MeOrOther_t MeOrOther)
{ {
extern const char *Txt_Remove_me_as_an_administrator_of_the_center_X; extern const char *Txt_Remove_me_as_an_administrator_of_the_center_X;
extern const char *Txt_Remove_USER_as_an_administrator_of_the_center_X; extern const char *Txt_Remove_USER_as_an_administrator_of_the_center_X;
const char *Txt[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_Remove_me_as_an_administrator_of_the_center_X,
[Usr_OTHER] = Txt_Remove_USER_as_an_administrator_of_the_center_X,
};
Enr_RegRemOneUsrActionBegin (Enr_REMOVE_ONE_CENTER_ADMIN,OptionChecked); Enr_RegRemOneUsrActionBegin (Enr_REMOVE_ONE_CENTER_ADMIN,OptionChecked);
HTM_TxtF (ItsMe ? Txt_Remove_me_as_an_administrator_of_the_center_X : HTM_TxtF (Txt[MeOrOther],Gbl.Hierarchy.Ctr.ShrtName);
Txt_Remove_USER_as_an_administrator_of_the_center_X,
Gbl.Hierarchy.Ctr.ShrtName);
Enr_RegRemOneUsrActionEnd (); Enr_RegRemOneUsrActionEnd ();
} }
@ -1562,15 +1577,18 @@ static void Enr_PutActionRemUsrAsCtrAdm (bool *OptionChecked,bool ItsMe)
/************** Put action to remove user as institution admin ***************/ /************** Put action to remove user as institution admin ***************/
/*****************************************************************************/ /*****************************************************************************/
static void Enr_PutActionRemUsrAsInsAdm (bool *OptionChecked,bool ItsMe) static void Enr_PutActionRemUsrAsInsAdm (bool *OptionChecked,Usr_MeOrOther_t MeOrOther)
{ {
extern const char *Txt_Remove_me_as_an_administrator_of_the_institution_X; extern const char *Txt_Remove_me_as_an_administrator_of_the_institution_X;
extern const char *Txt_Remove_USER_as_an_administrator_of_the_institution_X; extern const char *Txt_Remove_USER_as_an_administrator_of_the_institution_X;
const char *Txt[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_Remove_me_as_an_administrator_of_the_institution_X,
[Usr_OTHER] = Txt_Remove_USER_as_an_administrator_of_the_institution_X,
};
Enr_RegRemOneUsrActionBegin (Enr_REMOVE_ONE_INSTITUTION_ADMIN,OptionChecked); Enr_RegRemOneUsrActionBegin (Enr_REMOVE_ONE_INSTITUTION_ADMIN,OptionChecked);
HTM_TxtF (ItsMe ? Txt_Remove_me_as_an_administrator_of_the_institution_X : HTM_TxtF (Txt[MeOrOther],Gbl.Hierarchy.Ins.ShrtName);
Txt_Remove_USER_as_an_administrator_of_the_institution_X,
Gbl.Hierarchy.Ins.ShrtName);
Enr_RegRemOneUsrActionEnd (); Enr_RegRemOneUsrActionEnd ();
} }
@ -1578,14 +1596,18 @@ static void Enr_PutActionRemUsrAsInsAdm (bool *OptionChecked,bool ItsMe)
/********************* Put action to remove user account *********************/ /********************* Put action to remove user account *********************/
/*****************************************************************************/ /*****************************************************************************/
static void Enr_PutActionRemUsrAcc (bool *OptionChecked,bool ItsMe) static void Enr_PutActionRemUsrAcc (bool *OptionChecked,Usr_MeOrOther_t MeOrOther)
{ {
extern const char *Txt_Eliminate_my_user_account; extern const char *Txt_Eliminate_my_user_account;
extern const char *Txt_Eliminate_user_account; extern const char *Txt_Eliminate_user_account;
const char *Txt[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_Eliminate_my_user_account,
[Usr_OTHER] = Txt_Eliminate_user_account,
};
Enr_RegRemOneUsrActionBegin (Enr_ELIMINATE_ONE_USR_FROM_PLATFORM,OptionChecked); Enr_RegRemOneUsrActionBegin (Enr_ELIMINATE_ONE_USR_FROM_PLATFORM,OptionChecked);
HTM_Txt (ItsMe ? Txt_Eliminate_my_user_account : HTM_Txt (Txt[MeOrOther]);
Txt_Eliminate_user_account);
Enr_RegRemOneUsrActionEnd (); Enr_RegRemOneUsrActionEnd ();
} }
@ -2698,7 +2720,7 @@ static bool Enr_CheckIfICanRemUsrFromCrs (void)
case Rol_STD: case Rol_STD:
case Rol_NET: case Rol_NET:
// A student or non-editing teacher can remove herself/himself // A student or non-editing teacher can remove herself/himself
return Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); return Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME;
case Rol_TCH: case Rol_TCH:
case Rol_DEG_ADM: case Rol_DEG_ADM:
case Rol_CTR_ADM: case Rol_CTR_ADM:
@ -2846,7 +2868,7 @@ void Enr_ModifyUsr1 (void)
extern const char *Txt_The_role_of_THE_USER_X_in_the_course_Y_has_changed_from_A_to_B; extern const char *Txt_The_role_of_THE_USER_X_in_the_course_Y_has_changed_from_A_to_B;
extern const char *Txt_ROLES_SINGUL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; extern const char *Txt_ROLES_SINGUL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_THE_USER_X_has_been_enroled_in_the_course_Y; extern const char *Txt_THE_USER_X_has_been_enroled_in_the_course_Y;
bool ItsMe; Usr_MeOrOther_t MeOrOther;
Rol_Role_t OldRole; Rol_Role_t OldRole;
Rol_Role_t NewRole; Rol_Role_t NewRole;
static const Act_Action_t Action[Rol_NUM_ROLES] = static const Act_Action_t Action[Rol_NUM_ROLES] =
@ -2860,7 +2882,7 @@ void Enr_ModifyUsr1 (void)
/***** Get user from form *****/ /***** Get user from form *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); MeOrOther = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Get the action to do *****/ /***** Get the action to do *****/
Gbl.Usrs.RegRemAction = (Enr_RegRemOneUsrAction_t) Gbl.Usrs.RegRemAction = (Enr_RegRemOneUsrAction_t)
@ -2871,7 +2893,7 @@ void Enr_ModifyUsr1 (void)
switch (Gbl.Usrs.RegRemAction) switch (Gbl.Usrs.RegRemAction)
{ {
case Enr_REGISTER_MODIFY_ONE_USR_IN_CRS: case Enr_REGISTER_MODIFY_ONE_USR_IN_CRS:
if (ItsMe || Gbl.Usrs.Me.Role.Logged >= Rol_TCH) if (MeOrOther == Usr_ME || Gbl.Usrs.Me.Role.Logged >= Rol_TCH)
{ {
/***** Get user's name from record form *****/ /***** Get user's name from record form *****/
if (Usr_ICanChangeOtherUsrData (&Gbl.Usrs.Other.UsrDat)) if (Usr_ICanChangeOtherUsrData (&Gbl.Usrs.Other.UsrDat))
@ -2918,15 +2940,19 @@ void Enr_ModifyUsr1 (void)
/***** Change user's groups *****/ /***** Change user's groups *****/
if (Gbl.Crs.Grps.NumGrps) // This course has groups? if (Gbl.Crs.Grps.NumGrps) // This course has groups?
{ switch (MeOrOther)
if (ItsMe) {
Grp_ChangeMyGrps (Cns_QUIET); case Usr_ME:
else Grp_ChangeMyGrps (Cns_QUIET);
Grp_ChangeOtherUsrGrps (); break;
} case Usr_OTHER:
default:
Grp_ChangeOtherUsrGrps ();
break;
}
/***** If it's me, change my roles *****/ /***** If it's me, change my roles *****/
if (ItsMe) if (MeOrOther == Usr_ME)
{ {
Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs = Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs; Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs = Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs;
Gbl.Usrs.Me.UsrDat.Roles.InCrss = Gbl.Usrs.Other.UsrDat.Roles.InCrss; Gbl.Usrs.Me.UsrDat.Roles.InCrss = Gbl.Usrs.Other.UsrDat.Roles.InCrss;
@ -2956,23 +2982,23 @@ void Enr_ModifyUsr1 (void)
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break; break;
case Enr_REPORT_USR_AS_POSSIBLE_DUPLICATE: case Enr_REPORT_USR_AS_POSSIBLE_DUPLICATE:
if (ItsMe || Gbl.Usrs.Me.Role.Logged < Rol_TCH) if (MeOrOther == Usr_ME || Gbl.Usrs.Me.Role.Logged < Rol_TCH)
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break; break;
case Enr_REMOVE_ONE_USR_FROM_CRS: case Enr_REMOVE_ONE_USR_FROM_CRS:
if (!ItsMe && Gbl.Usrs.Me.Role.Logged < Rol_TCH) if (MeOrOther == Usr_OTHER && Gbl.Usrs.Me.Role.Logged < Rol_TCH)
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break; break;
case Enr_REMOVE_ONE_DEGREE_ADMIN: case Enr_REMOVE_ONE_DEGREE_ADMIN:
if (!ItsMe && Gbl.Usrs.Me.Role.Logged < Rol_CTR_ADM) if (MeOrOther == Usr_OTHER && Gbl.Usrs.Me.Role.Logged < Rol_CTR_ADM)
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break; break;
case Enr_REMOVE_ONE_CENTER_ADMIN: case Enr_REMOVE_ONE_CENTER_ADMIN:
if (!ItsMe && Gbl.Usrs.Me.Role.Logged < Rol_INS_ADM) if (MeOrOther == Usr_OTHER && Gbl.Usrs.Me.Role.Logged < Rol_INS_ADM)
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break; break;
case Enr_REMOVE_ONE_INSTITUTION_ADMIN: case Enr_REMOVE_ONE_INSTITUTION_ADMIN:
if (!ItsMe && Gbl.Usrs.Me.Role.Logged != Rol_SYS_ADM) if (MeOrOther == Usr_OTHER && Gbl.Usrs.Me.Role.Logged != Rol_SYS_ADM)
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
break; break;
case Enr_ELIMINATE_ONE_USR_FROM_PLATFORM: case Enr_ELIMINATE_ONE_USR_FROM_PLATFORM:
@ -3050,23 +3076,31 @@ static void Enr_AskIfRemoveUsrFromCrs (struct Usr_Data *UsrDat)
extern const char *Txt_Do_you_really_want_to_remove_the_following_user_from_the_course_X; extern const char *Txt_Do_you_really_want_to_remove_the_following_user_from_the_course_X;
extern const char *Txt_Remove_me_from_this_course; extern const char *Txt_Remove_me_from_this_course;
extern const char *Txt_Remove_user_from_this_course; extern const char *Txt_Remove_user_from_this_course;
bool ItsMe; Usr_MeOrOther_t MeOrOther;
static const Act_Action_t NextAction[Rol_NUM_ROLES] = static const Act_Action_t NextAction[Rol_NUM_ROLES] =
{ {
[Rol_STD] = ActRemStdCrs, [Rol_STD] = ActRemStdCrs,
[Rol_NET] = ActRemNETCrs, [Rol_NET] = ActRemNETCrs,
[Rol_TCH] = ActRemTchCrs, [Rol_TCH] = ActRemTchCrs,
}; };
const char *Question[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_Do_you_really_want_to_be_removed_from_the_course_X,
[Usr_OTHER] = Txt_Do_you_really_want_to_remove_the_following_user_from_the_course_X
};
const char *TxtButton[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_Remove_me_from_this_course,
[Usr_OTHER] = Txt_Remove_user_from_this_course
};
if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat)) if (Enr_CheckIfUsrBelongsToCurrentCrs (UsrDat))
{ {
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod); MeOrOther = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Show question and button to remove user as administrator *****/ /***** Show question and button to remove user as administrator *****/
/* Begin alert */ /* Begin alert */
Ale_ShowAlertAndButton1 (Ale_QUESTION,ItsMe ? Txt_Do_you_really_want_to_be_removed_from_the_course_X : Ale_ShowAlertAndButton1 (Ale_QUESTION,Question[MeOrOther],Gbl.Hierarchy.Crs.FullName);
Txt_Do_you_really_want_to_remove_the_following_user_from_the_course_X,
Gbl.Hierarchy.Crs.FullName);
/* Show user's record */ /* Show user's record */
Rec_ShowSharedRecordUnmodifiable (UsrDat); Rec_ShowSharedRecordUnmodifiable (UsrDat);
@ -3077,8 +3111,7 @@ static void Enr_AskIfRemoveUsrFromCrs (struct Usr_Data *UsrDat)
Frm_BeginForm (NextAction[UsrDat->Roles.InCurrentCrs]); Frm_BeginForm (NextAction[UsrDat->Roles.InCurrentCrs]);
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod); Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
Pwd_AskForConfirmationOnDangerousAction (); Pwd_AskForConfirmationOnDangerousAction ();
Btn_PutRemoveButton (ItsMe ? Txt_Remove_me_from_this_course : Btn_PutRemoveButton (TxtButton[MeOrOther]);
Txt_Remove_user_from_this_course);
Frm_EndForm (); Frm_EndForm ();
/* End alert */ /* End alert */
@ -3143,33 +3176,35 @@ static void Enr_EffectivelyRemUsrFromCrs (struct Usr_Data *UsrDat,
Usr_FlushCachesUsr (); Usr_FlushCachesUsr ();
/***** If it's me, change my roles *****/ /***** If it's me, change my roles *****/
if (Usr_ItsMe (UsrDat->UsrCod)) switch (Usr_ItsMe (UsrDat->UsrCod))
{ {
/* Now I don't belong to current course */ case Usr_ME:
Gbl.Usrs.Me.IBelongToCurrentCrs = /* Now I don't belong to current course */
Gbl.Usrs.Me.UsrDat.Accepted = false; Gbl.Usrs.Me.IBelongToCurrentCrs =
Gbl.Usrs.Me.UsrDat.Accepted = false;
/* Fill the list with the courses I belong to */ /* Fill the list with the courses I belong to */
Gbl.Usrs.Me.MyCrss.Filled = false; Gbl.Usrs.Me.MyCrss.Filled = false;
Enr_GetMyCourses (); Enr_GetMyCourses ();
/* Set my roles */ /* Set my roles */
Gbl.Usrs.Me.Role.FromSession = Gbl.Usrs.Me.Role.FromSession =
Gbl.Usrs.Me.Role.Logged = Gbl.Usrs.Me.Role.Logged =
Gbl.Usrs.Me.Role.LoggedBeforeCloseSession = Gbl.Usrs.Me.Role.LoggedBeforeCloseSession =
Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs = Gbl.Usrs.Me.UsrDat.Roles.InCurrentCrs =
UsrDat->Roles.InCurrentCrs = Rol_UNK; UsrDat->Roles.InCurrentCrs = Rol_UNK;
Gbl.Usrs.Me.UsrDat.Roles.InCrss = Gbl.Usrs.Me.UsrDat.Roles.InCrss =
UsrDat->Roles.InCrss = -1; // not yet filled/calculated UsrDat->Roles.InCrss = -1; // not yet filled/calculated
Rol_SetMyRoles (); Rol_SetMyRoles ();
} break;
else // Not me case Usr_OTHER:
{ default:
/* Now he/she does not belong to current course */ /* Now he/she does not belong to current course */
UsrDat->Accepted = false; UsrDat->Accepted = false;
UsrDat->Roles.InCurrentCrs = Rol_USR; UsrDat->Roles.InCurrentCrs = Rol_USR;
break;
} }
if (QuietOrVerbose == Cns_VERBOSE) if (QuietOrVerbose == Cns_VERBOSE)
@ -3405,7 +3440,7 @@ bool Enr_CheckIfUsrSharesAnyOfMyCrs (struct Usr_Data *UsrDat)
return false; return false;
/***** 3. Fast check: It's me? *****/ /***** 3. Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** 4. Fast check: Is already calculated if user shares any course with me? *****/ /***** 4. Fast check: Is already calculated if user shares any course with me? *****/

View File

@ -101,7 +101,7 @@ void Enr_ReceiveFormAdminStds (void);
void Enr_ReceiveFormAdminNonEditTchs (void); void Enr_ReceiveFormAdminNonEditTchs (void);
void Enr_ReceiveFormAdminTchs (void); void Enr_ReceiveFormAdminTchs (void);
bool Enr_PutActionsRegRemOneUsr (bool ItsMe); bool Enr_PutActionsRegRemOneUsr (Usr_MeOrOther_t MeOrOther);
void Enr_PutLinkToAdminSeveralUsrs (Rol_Role_t Role); void Enr_PutLinkToAdminSeveralUsrs (Rol_Role_t Role);
void Enr_AskRemAllStdsThisCrs (void); void Enr_AskRemAllStdsThisCrs (void);

View File

@ -1408,10 +1408,10 @@ static void ExaRes_CheckIfICanViewResult (const struct Exa_Exam *Exam,
{ {
case Rol_STD: case Rol_STD:
// Depends on visibility of exam, session and result (eye icons) // Depends on visibility of exam, session and result (eye icons)
ICanView->Result = (Usr_ItsMe (UsrCod) && // The result is mine ICanView->Result = (Usr_ItsMe (UsrCod) == Usr_ME && // The result is mine
!Exam->Hidden && // The exam is visible !Exam->Hidden && // The exam is visible
!Session->Hidden && // The session is visible !Session->Hidden && // The session is visible
Session->ShowUsrResults); // The results of the session are visible to users Session->ShowUsrResults); // The results of the session are visible to users
// Whether I belong or not to groups of session is not checked here... // Whether I belong or not to groups of session is not checked here...
// ...because I should be able to see old exams made in old groups to which I belonged // ...because I should be able to see old exams made in old groups to which I belonged

View File

@ -353,8 +353,8 @@ void Fol_ShowFollowingAndFollowers (const struct Usr_Data *UsrDat,
/* I follow user? */ /* I follow user? */
HTM_DIV_Begin ("id=\"follow_usr\""); HTM_DIV_Begin ("id=\"follow_usr\"");
if (Gbl.Usrs.Me.Logged && // Logged if (Gbl.Usrs.Me.Logged && // Logged
!Usr_ItsMe (UsrDat->UsrCod)) // Not me! Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER) // Not me!
{ {
Frm_BeginForm (IFollowUsr ? ActUnfUsr : Frm_BeginForm (IFollowUsr ? ActUnfUsr :
ActFolUsr); ActFolUsr);
@ -585,7 +585,7 @@ static void Fol_ListFollowersUsr (struct Usr_Data *UsrDat)
DB_FreeMySQLResult (&mysql_res); DB_FreeMySQLResult (&mysql_res);
/***** If it's me, mark possible notification as seen *****/ /***** If it's me, mark possible notification as seen *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
Ntf_DB_MarkNotifsAsSeen (Ntf_EVENT_FOLLOWER); Ntf_DB_MarkNotifsAsSeen (Ntf_EVENT_FOLLOWER);
} }
else else
@ -633,8 +633,8 @@ static void Fol_ShowFollowedOrFollower (struct Usr_Data *UsrDat)
Frm_EndForm (); Frm_EndForm ();
} }
if (!Gbl.Usrs.Me.Logged || // Not logged if (!Gbl.Usrs.Me.Logged || // Not logged
Usr_ItsMe (UsrDat->UsrCod)) // It's me Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) // It's me
/* Inactive icon to follow/unfollow */ /* Inactive icon to follow/unfollow */
Fol_PutInactiveIconToFollowUnfollow (); Fol_PutInactiveIconToFollowUnfollow ();
else // It's not me else // It's not me
@ -698,8 +698,8 @@ static void Fol_WriteRowUsrToFollowOnRightColumn (struct Usr_Data *UsrDat)
/***** Icon to follow *****/ /***** Icon to follow *****/
HTM_TD_Begin ("class=\"CON_ICON_FOLLOW RM %s\"", HTM_TD_Begin ("class=\"CON_ICON_FOLLOW RM %s\"",
The_GetColorRows ()); The_GetColorRows ());
if (!Gbl.Usrs.Me.Logged || // Not logged if (!Gbl.Usrs.Me.Logged || // Not logged
Usr_ItsMe (UsrDat->UsrCod)) // It's me Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) // It's me
/* Inactive icon to follow/unfollow */ /* Inactive icon to follow/unfollow */
Fol_PutInactiveIconToFollowUnfollow (); Fol_PutInactiveIconToFollowUnfollow ();
else // It's not me else // It's not me

View File

@ -971,7 +971,7 @@ static void For_ShowAForumPost (struct For_Forums *Forums,
/***** Form to remove post *****/ /***** Form to remove post *****/
if (LastPst) if (LastPst)
if (Usr_ItsMe (UsrDat.UsrCod)) if (Usr_ItsMe (UsrDat.UsrCod) == Usr_ME)
// Post can be removed if post is the last (without answers) and it's mine // Post can be removed if post is the last (without answers) and it's mine
Ico_PutContextualIconToRemove (For_ActionsDelPstFor[Forums->Forum.Type], Ico_PutContextualIconToRemove (For_ActionsDelPstFor[Forums->Forum.Type],
PstNum == 1 ? For_FORUM_THREADS_SECTION_ID : // First and unique post in thread PstNum == 1 ? For_FORUM_THREADS_SECTION_ID : // First and unique post in thread
@ -2914,7 +2914,7 @@ void For_RemovePost (void)
Err_WrongPostExit (); Err_WrongPostExit ();
/* Check if I am the author of the message */ /* Check if I am the author of the message */
if (!Usr_ItsMe (UsrDat.UsrCod)) if (Usr_ItsMe (UsrDat.UsrCod) == Usr_OTHER)
Err_NoPermissionExit (); Err_NoPermissionExit ();
/* Check if the message is the last message in the thread */ /* Check if the message is the last message in the thread */

View File

@ -1173,7 +1173,7 @@ void Grp_RemUsrFromAllGrpsInCrs (long UsrCod,long CrsCod)
/***** Flush caches *****/ /***** Flush caches *****/
Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs (); Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs ();
if (Usr_ItsMe (UsrCod)) if (Usr_ItsMe (UsrCod) == Usr_ME)
Grp_FlushCacheIBelongToGrp (); Grp_FlushCacheIBelongToGrp ();
} }
@ -1188,7 +1188,7 @@ void Grp_RemUsrFromAllGrps (long UsrCod)
/***** Flush caches *****/ /***** Flush caches *****/
Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs (); Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs ();
if (Usr_ItsMe (UsrCod)) if (Usr_ItsMe (UsrCod) == Usr_ME)
Grp_FlushCacheIBelongToGrp (); Grp_FlushCacheIBelongToGrp ();
} }
@ -1203,7 +1203,7 @@ static void Grp_RemoveUsrFromGroup (long UsrCod,long GrpCod)
/***** Flush caches *****/ /***** Flush caches *****/
Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs (); Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs ();
if (Usr_ItsMe (UsrCod)) if (Usr_ItsMe (UsrCod) == Usr_ME)
Grp_FlushCacheIBelongToGrp (); Grp_FlushCacheIBelongToGrp ();
} }
@ -3051,7 +3051,7 @@ bool Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (const struct Usr_Data *UsrDat)
return false; return false;
/***** 5. Fast check: It's me? *****/ /***** 5. Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** 6. Fast check: Is already calculated if user shares /***** 6. Fast check: Is already calculated if user shares

View File

@ -99,14 +99,14 @@ static void Mai_PutHeadMailDomains (void);
static void Mai_PutFormToSelectUsrsToListEmails (__attribute__((unused)) void *Args); static void Mai_PutFormToSelectUsrsToListEmails (__attribute__((unused)) void *Args);
static void Mai_ListEmails (__attribute__((unused)) void *Args); static void Mai_ListEmails (__attribute__((unused)) void *Args);
static void Mai_ShowFormChangeUsrEmail (bool ItsMe, static void Mai_ShowFormChangeUsrEmail (Usr_MeOrOther_t MeOrOther,
bool IMustFillInEmail, bool IMustFillInEmail,
bool IShouldConfirmEmail); bool IShouldConfirmEmail);
static void Mai_PutParsRemoveMyEmail (void *Email); static void Mai_PutParsRemoveMyEmail (void *Email);
static void Mai_PutParsRemoveOtherEmail (void *Email); static void Mai_PutParsRemoveOtherEmail (void *Email);
static void Mai_RemoveEmail (struct Usr_Data *UsrDat); static void Mai_RemoveEmail (struct Usr_Data *UsrDat);
static void Mai_NewUsrEmail (struct Usr_Data *UsrDat,bool ItsMe); static void Mai_ChangeUsrEmail (struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOther);
static void Mai_InsertMailKey (const char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1], static void Mai_InsertMailKey (const char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1],
const char MailKey[Mai_LENGTH_EMAIL_CONFIRM_KEY + 1]); const char MailKey[Mai_LENGTH_EMAIL_CONFIRM_KEY + 1]);
@ -1032,7 +1032,7 @@ void Mai_ShowFormChangeMyEmail (bool IMustFillInEmail,bool IShouldConfirmEmail)
Hlp_PROFILE_Account,Box_NOT_CLOSABLE); Hlp_PROFILE_Account,Box_NOT_CLOSABLE);
/***** Show form to change email *****/ /***** Show form to change email *****/
Mai_ShowFormChangeUsrEmail (true, // ItsMe Mai_ShowFormChangeUsrEmail (Usr_ME,
IMustFillInEmail, IMustFillInEmail,
IShouldConfirmEmail); IShouldConfirmEmail);
@ -1063,7 +1063,7 @@ void Mai_ShowFormChangeOtherUsrEmail (void)
Hlp_PROFILE_Account,Box_NOT_CLOSABLE); Hlp_PROFILE_Account,Box_NOT_CLOSABLE);
/***** Show form to change email *****/ /***** Show form to change email *****/
Mai_ShowFormChangeUsrEmail (false, // ItsMe Mai_ShowFormChangeUsrEmail (Usr_OTHER,
false, // IMustFillInEmail false, // IMustFillInEmail
false); // IShouldConfirmEmail false); // IShouldConfirmEmail
@ -1078,7 +1078,7 @@ void Mai_ShowFormChangeOtherUsrEmail (void)
/********************** Show form to change user's email *********************/ /********************** Show form to change user's email *********************/
/*****************************************************************************/ /*****************************************************************************/
static void Mai_ShowFormChangeUsrEmail (bool ItsMe, static void Mai_ShowFormChangeUsrEmail (Usr_MeOrOther_t MeOrOther,
bool IMustFillInEmail, bool IMustFillInEmail,
bool IShouldConfirmEmail) bool IShouldConfirmEmail)
{ {
@ -1102,22 +1102,41 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe,
static const struct static const struct
{ {
Act_Action_t Remove; Act_Action_t Remove;
Act_Action_t New; Act_Action_t Change;
} NextAction[Rol_NUM_ROLES] = } NextAction[Rol_NUM_ROLES] =
{ {
[Rol_UNK ] = {ActRemMaiOth,ActNewMaiOth}, [Rol_UNK ] = {ActRemMaiOth,ActChgMaiOth},
[Rol_GST ] = {ActRemMaiOth,ActNewMaiOth}, [Rol_GST ] = {ActRemMaiOth,ActChgMaiOth},
[Rol_USR ] = {ActRemMaiOth,ActNewMaiOth}, [Rol_USR ] = {ActRemMaiOth,ActChgMaiOth},
[Rol_STD ] = {ActRemMaiStd,ActNewMaiStd}, [Rol_STD ] = {ActRemMaiStd,ActChgMaiStd},
[Rol_NET ] = {ActRemMaiTch,ActNewMaiTch}, [Rol_NET ] = {ActRemMaiTch,ActChgMaiTch},
[Rol_TCH ] = {ActRemMaiTch,ActNewMaiTch}, [Rol_TCH ] = {ActRemMaiTch,ActChgMaiTch},
[Rol_DEG_ADM] = {ActRemMaiOth,ActNewMaiOth}, [Rol_DEG_ADM] = {ActRemMaiOth,ActChgMaiOth},
[Rol_CTR_ADM] = {ActRemMaiOth,ActNewMaiOth}, [Rol_CTR_ADM] = {ActRemMaiOth,ActChgMaiOth},
[Rol_INS_ADM] = {ActRemMaiOth,ActNewMaiOth}, [Rol_INS_ADM] = {ActRemMaiOth,ActChgMaiOth},
[Rol_SYS_ADM] = {ActRemMaiOth,ActNewMaiOth}, [Rol_SYS_ADM] = {ActRemMaiOth,ActChgMaiOth},
};
static const struct Usr_Data *UsrDat[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = &Gbl.Usrs.Me.UsrDat,
[Usr_OTHER] = &Gbl.Usrs.Other.UsrDat
};
static void (*FuncParsRemove[Usr_NUM_ME_OR_OTHER]) (void *ID) =
{
[Usr_ME ] = Mai_PutParsRemoveMyEmail,
[Usr_OTHER] = Mai_PutParsRemoveOtherEmail
};
struct
{
Act_Action_t Remove;
Act_Action_t Change;
} ActMail[Rol_NUM_ROLES] =
{
[Usr_ME ] = {.Remove = ActRemMyMai,
.Change = ActChgMyMai},
[Usr_OTHER] = {.Remove = NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs].Remove,
.Change = NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs].Change}
}; };
const struct Usr_Data *UsrDat = (ItsMe ? &Gbl.Usrs.Me.UsrDat :
&Gbl.Usrs.Other.UsrDat);
/***** Show possible alerts *****/ /***** Show possible alerts *****/
Ale_ShowAlerts (Mai_EMAIL_SECTION_ID); Ale_ShowAlerts (Mai_EMAIL_SECTION_ID);
@ -1129,7 +1148,7 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe,
Ale_ShowAlert (Ale_WARNING,Txt_Please_confirm_your_email_address); Ale_ShowAlert (Ale_WARNING,Txt_Please_confirm_your_email_address);
/***** Get my emails *****/ /***** Get my emails *****/
NumEmails = Mai_DB_GetMyEmails (&mysql_res,UsrDat->UsrCod); NumEmails = Mai_DB_GetMyEmails (&mysql_res,UsrDat[MeOrOther]->UsrCod);
/***** Begin table *****/ /***** Begin table *****/
HTM_TABLE_BeginWidePadding (2); HTM_TABLE_BeginWidePadding (2);
@ -1167,12 +1186,8 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe,
} }
/* Form to remove email */ /* Form to remove email */
if (ItsMe) Ico_PutContextualIconToRemove (ActMail[MeOrOther].Remove,Mai_EMAIL_SECTION_ID,
Ico_PutContextualIconToRemove (ActRemMyMai,Mai_EMAIL_SECTION_ID, FuncParsRemove[MeOrOther],row[0]);
Mai_PutParsRemoveMyEmail,row[0]);
else
Ico_PutContextualIconToRemove (NextAction[UsrDat->Roles.InCurrentCrs].Remove,Mai_EMAIL_SECTION_ID,
Mai_PutParsRemoveOtherEmail,row[0]);
/* Email */ /* Email */
HTM_Txt (row[0]); HTM_Txt (row[0]);
@ -1187,19 +1202,15 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe,
} }
/* Form to change user's email */ /* Form to change user's email */
if (NumEmail > 1 || (ItsMe && !Confirmed)) if (NumEmail > 1 || (MeOrOther == Usr_ME && !Confirmed))
{ {
HTM_BR (); HTM_BR ();
if (ItsMe) Frm_BeginFormAnchor (ActMail[MeOrOther].Change,Mai_EMAIL_SECTION_ID);
Frm_BeginFormAnchor (ActChgMyMai,Mai_EMAIL_SECTION_ID); if (MeOrOther == Usr_OTHER)
else Usr_PutParUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
{
Frm_BeginFormAnchor (NextAction[UsrDat->Roles.InCurrentCrs].New,Mai_EMAIL_SECTION_ID);
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
}
Par_PutParString (NULL,"NewEmail",row[0]); Par_PutParString (NULL,"NewEmail",row[0]);
Btn_PutConfirmButtonInline ((ItsMe && NumEmail == 1) ? Txt_Confirm_email : Btn_PutConfirmButtonInline ((MeOrOther == Usr_ME && NumEmail == 1) ? Txt_Confirm_email :
Txt_Use_this_email); Txt_Use_this_email);
Frm_EndForm (); Frm_EndForm ();
} }
@ -1224,19 +1235,15 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe,
/* Data */ /* Data */
HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT_%s\"", HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ItsMe) Frm_BeginFormAnchor (ActMail[MeOrOther].Change,Mai_EMAIL_SECTION_ID);
Frm_BeginFormAnchor (ActChgMyMai,Mai_EMAIL_SECTION_ID); if (MeOrOther == Usr_OTHER)
else Usr_PutParUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
{ HTM_INPUT_EMAIL ("NewEmail",Cns_MAX_CHARS_EMAIL_ADDRESS,UsrDat[MeOrOther]->Email,
Frm_BeginFormAnchor (NextAction[UsrDat->Roles.InCurrentCrs].New,Mai_EMAIL_SECTION_ID);
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
}
HTM_INPUT_EMAIL ("NewEmail",Cns_MAX_CHARS_EMAIL_ADDRESS,Gbl.Usrs.Me.UsrDat.Email,
"id=\"NewEmail\" class=\"INPUT_%s\" size=\"18\"", "id=\"NewEmail\" class=\"INPUT_%s\" size=\"18\"",
The_GetSuffix ()); The_GetSuffix ());
HTM_BR (); HTM_BR ();
Btn_PutCreateButtonInline (NumEmails ? Txt_Change_email : // User already has an email address Btn_PutCreateButtonInline (NumEmails ? Txt_Change_email : // User already has an email address
Txt_Save_changes); // User has no email address yet Txt_Save_changes); // User has no email address yet
Frm_EndForm (); Frm_EndForm ();
HTM_TD_End (); HTM_TD_End ();
@ -1334,7 +1341,7 @@ static void Mai_RemoveEmail (struct Usr_Data *UsrDat)
void May_NewMyUsrEmail (void) void May_NewMyUsrEmail (void)
{ {
/***** Remove user's email *****/ /***** Remove user's email *****/
Mai_NewUsrEmail (&Gbl.Usrs.Me.UsrDat, Mai_ChangeUsrEmail (&Gbl.Usrs.Me.UsrDat,
true); // It's me true); // It's me
/***** Show my account again *****/ /***** Show my account again *****/
@ -1342,19 +1349,19 @@ void May_NewMyUsrEmail (void)
} }
/*****************************************************************************/ /*****************************************************************************/
/********************* New user's email for another user *********************/ /************************ Change another user's email ************************/
/*****************************************************************************/ /*****************************************************************************/
void Mai_NewOtherUsrEmail (void) void Mai_ChangeOtherUsrEmail (void)
{ {
/***** Get other user's code from form and get user's data *****/ /***** Get other user's code from form and get user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
{ {
/***** New user's ID *****/ /***** Change user's ID *****/
Mai_NewUsrEmail (&Gbl.Usrs.Other.UsrDat, Mai_ChangeUsrEmail (&Gbl.Usrs.Other.UsrDat,
Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)); Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod));
/***** Show form again *****/ /***** Show form again *****/
Acc_ShowFormChgOtherUsrAccount (); Acc_ShowFormChgOtherUsrAccount ();
@ -1367,10 +1374,10 @@ void Mai_NewOtherUsrEmail (void)
} }
/*****************************************************************************/ /*****************************************************************************/
/************************* Update my email address ***************************/ /*************************** Change email address ****************************/
/*****************************************************************************/ /*****************************************************************************/
static void Mai_NewUsrEmail (struct Usr_Data *UsrDat,bool ItsMe) static void Mai_ChangeUsrEmail (struct Usr_Data *UsrDat,Usr_MeOrOther_t MeOrOther)
{ {
extern const char *Txt_The_email_address_X_matches_one_previously_registered; extern const char *Txt_The_email_address_X_matches_one_previously_registered;
extern const char *Txt_The_email_address_X_has_been_registered_successfully; extern const char *Txt_The_email_address_X_has_been_registered_successfully;
@ -1405,7 +1412,7 @@ static void Mai_NewUsrEmail (struct Usr_Data *UsrDat,bool ItsMe)
/***** Send message via email /***** Send message via email
to confirm the new email address *****/ to confirm the new email address *****/
if (ItsMe) if (MeOrOther == Usr_ME)
Mai_SendMailMsgToConfirmEmail (); Mai_SendMailMsgToConfirmEmail ();
} }
else else
@ -1656,7 +1663,7 @@ void Mai_WriteFootNoteEMail (FILE *FileMail,Lan_Language_t Language)
bool Mai_ICanSeeOtherUsrEmail (const struct Usr_Data *UsrDat) bool Mai_ICanSeeOtherUsrEmail (const struct Usr_Data *UsrDat)
{ {
/***** I can see my email *****/ /***** I can see my email *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** Check if I have permission to see another user's email *****/ /***** Check if I have permission to see another user's email *****/

View File

@ -86,7 +86,7 @@ void Mai_RemoveMyUsrEmail (void);
void Mai_RemoveOtherUsrEmail (void); void Mai_RemoveOtherUsrEmail (void);
void May_NewMyUsrEmail (void); void May_NewMyUsrEmail (void);
void Mai_NewOtherUsrEmail (void); void Mai_ChangeOtherUsrEmail (void);
bool Mai_UpdateEmailInDB (const struct Usr_Data *UsrDat,const char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]); bool Mai_UpdateEmailInDB (const struct Usr_Data *UsrDat,const char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]);

View File

@ -1306,7 +1306,7 @@ static void MchRes_CheckIfICanSeeMatchResult (const struct Gam_Game *Game,
// Depends on visibility of game and result (eye icons) // Depends on visibility of game and result (eye icons)
ICanView->Result = (!Game->Hidden && // The game is visible ICanView->Result = (!Game->Hidden && // The game is visible
Match->Status.ShowUsrResults && // The results of the match are visible to users Match->Status.ShowUsrResults && // The results of the match are visible to users
Usr_ItsMe (UsrCod)); // The result is mine Usr_ItsMe (UsrCod) == Usr_ME); // The result is mine
// Whether I belong or not to groups of match is not checked here... // Whether I belong or not to groups of match is not checked here...
// ...because I should be able to see old matches made in old groups to which I belonged // ...because I should be able to see old matches made in old groups to which I belonged

View File

@ -56,12 +56,12 @@ const char *Nck_NICKNAME_SECTION_ID = "nickname_section";
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
static void Nck_ShowFormChangeUsrNickname (bool ItsMe, static void Nck_ShowFormChangeUsrNickname (Usr_MeOrOther_t MeOrOther,
bool IMustFillNickname); bool IMustFillNickname);
static void Nck_PutParsRemoveMyNick (void *Nick); static void Nck_PutParsRemoveMyNick (void *Nick);
static void Nck_PutParsRemoveOtherNick (void *Nick); static void Nck_PutParsRemoveOtherNick (void *Nick);
static void Nck_UpdateUsrNick (struct Usr_Data *UsrDat); static void Nck_ChangeUsrNick (struct Usr_Data *UsrDat);
/*****************************************************************************/ /*****************************************************************************/
/********* Check whether a nickname (with initial arroba) if valid ***********/ /********* Check whether a nickname (with initial arroba) if valid ***********/
@ -130,7 +130,7 @@ long Nck_GetUsrCodFromNickname (const char *NickWithArr)
void Nck_ShowFormChangeMyNickname (bool IMustFillNickname) void Nck_ShowFormChangeMyNickname (bool IMustFillNickname)
{ {
Nck_ShowFormChangeUsrNickname (true, // ItsMe Nck_ShowFormChangeUsrNickname (Usr_ME,
IMustFillNickname); IMustFillNickname);
} }
@ -140,7 +140,7 @@ void Nck_ShowFormChangeMyNickname (bool IMustFillNickname)
void Nck_ShowFormChangeOtherUsrNickname (void) void Nck_ShowFormChangeOtherUsrNickname (void)
{ {
Nck_ShowFormChangeUsrNickname (false, // ItsMe Nck_ShowFormChangeUsrNickname (Usr_OTHER,
false); // IMustFillNickname false); // IMustFillNickname
} }
@ -148,7 +148,7 @@ void Nck_ShowFormChangeOtherUsrNickname (void)
/*********************** Show form to change my nickname *********************/ /*********************** Show form to change my nickname *********************/
/*****************************************************************************/ /*****************************************************************************/
static void Nck_ShowFormChangeUsrNickname (bool ItsMe, static void Nck_ShowFormChangeUsrNickname (Usr_MeOrOther_t MeOrOther,
bool IMustFillNickname) bool IMustFillNickname)
{ {
extern const char *Hlp_PROFILE_Account; extern const char *Hlp_PROFILE_Account;
@ -166,16 +166,16 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe,
Act_Action_t Change; Act_Action_t Change;
} NextAction[Rol_NUM_ROLES] = } NextAction[Rol_NUM_ROLES] =
{ {
[Rol_UNK ] = {ActRemOldNicOth,ActChgNicOth}, [Rol_UNK ] = {ActRemNicOth,ActChgNicOth},
[Rol_GST ] = {ActRemOldNicOth,ActChgNicOth}, [Rol_GST ] = {ActRemNicOth,ActChgNicOth},
[Rol_USR ] = {ActRemOldNicOth,ActChgNicOth}, [Rol_USR ] = {ActRemNicOth,ActChgNicOth},
[Rol_STD ] = {ActRemOldNicStd,ActChgNicStd}, [Rol_STD ] = {ActRemNicStd,ActChgNicStd},
[Rol_NET ] = {ActRemOldNicTch,ActChgNicTch}, [Rol_NET ] = {ActRemNicTch,ActChgNicTch},
[Rol_TCH ] = {ActRemOldNicTch,ActChgNicTch}, [Rol_TCH ] = {ActRemNicTch,ActChgNicTch},
[Rol_DEG_ADM] = {ActRemOldNicOth,ActChgNicOth}, [Rol_DEG_ADM] = {ActRemNicOth,ActChgNicOth},
[Rol_CTR_ADM] = {ActRemOldNicOth,ActChgNicOth}, [Rol_CTR_ADM] = {ActRemNicOth,ActChgNicOth},
[Rol_INS_ADM] = {ActRemOldNicOth,ActChgNicOth}, [Rol_INS_ADM] = {ActRemNicOth,ActChgNicOth},
[Rol_SYS_ADM] = {ActRemOldNicOth,ActChgNicOth}, [Rol_SYS_ADM] = {ActRemNicOth,ActChgNicOth},
}; };
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
@ -183,14 +183,33 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe,
unsigned NumNicks; unsigned NumNicks;
unsigned NumNick; unsigned NumNick;
char NickWithArr[Nck_MAX_BYTES_NICK_WITH_ARROBA + 1]; char NickWithArr[Nck_MAX_BYTES_NICK_WITH_ARROBA + 1];
const struct Usr_Data *UsrDat = (ItsMe ? &Gbl.Usrs.Me.UsrDat : static struct Usr_Data *UsrDat[Usr_NUM_ME_OR_OTHER] =
&Gbl.Usrs.Other.UsrDat); {
[Usr_ME ] = &Gbl.Usrs.Me.UsrDat,
[Usr_OTHER] = &Gbl.Usrs.Other.UsrDat
};
static void (*FuncParsRemove[Usr_NUM_ME_OR_OTHER]) (void *ID) =
{
[Usr_ME ] = Nck_PutParsRemoveMyNick,
[Usr_OTHER] = Nck_PutParsRemoveOtherNick
};
struct
{
Act_Action_t Remove;
Act_Action_t Change;
} ActNck[Rol_NUM_ROLES] =
{
[Usr_ME ] = {.Remove = ActRemMyNck,
.Change = ActChgMyNck},
[Usr_OTHER] = {.Remove = NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs].Remove,
.Change = NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs].Change}
};
/***** Begin section *****/ /***** Begin section *****/
HTM_SECTION_Begin (Nck_NICKNAME_SECTION_ID); HTM_SECTION_Begin (Nck_NICKNAME_SECTION_ID);
/***** Get my nicknames *****/ /***** Get my nicknames *****/
NumNicks = Nck_DB_GetUsrNicknames (&mysql_res,UsrDat->UsrCod); NumNicks = Nck_DB_GetUsrNicknames (&mysql_res,UsrDat[MeOrOther]->UsrCod);
/***** Begin box *****/ /***** Begin box *****/
snprintf (StrRecordWidth,sizeof (StrRecordWidth),"%upx",Rec_RECORD_WIDTH); snprintf (StrRecordWidth,sizeof (StrRecordWidth),"%upx",Rec_RECORD_WIDTH);
@ -242,34 +261,25 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe,
} }
/* Form to remove old nickname */ /* Form to remove old nickname */
if (ItsMe) Ico_PutContextualIconToRemove (ActNck[MeOrOther].Remove,Nck_NICKNAME_SECTION_ID,
Ico_PutContextualIconToRemove (ActRemMyNck,Nck_NICKNAME_SECTION_ID, FuncParsRemove[MeOrOther],row[0]);
Nck_PutParsRemoveMyNick,row[0]);
else
Ico_PutContextualIconToRemove (NextAction[UsrDat->Roles.InCurrentCrs].Remove,Nck_NICKNAME_SECTION_ID,
Nck_PutParsRemoveOtherNick,row[0]);
} }
/* Nickname */ /* Nickname */
HTM_TxtF ("@%s",row[0]); HTM_TxtF ("@%s",row[0]);
/* Link to QR code */ /* Link to QR code */
if (NumNick == 1 && UsrDat->Nickname[0]) if (NumNick == 1 && UsrDat[MeOrOther]->Nickname[0])
QR_PutLinkToPrintQRCode (ActPrnUsrQR, QR_PutLinkToPrintQRCode (ActPrnUsrQR,
Usr_PutParMyUsrCodEncrypted,Gbl.Usrs.Me.UsrDat.EnUsrCod); Usr_PutParOtherUsrCodEncrypted,UsrDat[MeOrOther]->EnUsrCod);
/* Form to change the nickname */ /* Form to change the nickname */
if (NumNick > 1) if (NumNick > 1)
{ {
HTM_BR (); HTM_BR ();
if (ItsMe) Frm_BeginFormAnchor (ActNck[MeOrOther].Change,Nck_NICKNAME_SECTION_ID);
Frm_BeginFormAnchor (ActChgMyNck,Nck_NICKNAME_SECTION_ID); if (MeOrOther == Usr_OTHER)
else Usr_PutParUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
{
Frm_BeginFormAnchor (NextAction[UsrDat->Roles.InCurrentCrs].Change,Nck_NICKNAME_SECTION_ID);
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
}
snprintf (NickWithArr,sizeof (NickWithArr),"@%s",row[0]); snprintf (NickWithArr,sizeof (NickWithArr),"@%s",row[0]);
Par_PutParString (NULL,"NewNick",NickWithArr); // Nickname Par_PutParString (NULL,"NewNick",NickWithArr); // Nickname
Btn_PutConfirmButtonInline (Txt_Use_this_nickname); Btn_PutConfirmButtonInline (Txt_Use_this_nickname);
@ -297,15 +307,11 @@ static void Nck_ShowFormChangeUsrNickname (bool ItsMe,
/* Data */ /* Data */
HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT_%s\"", HTM_TD_Begin ("class=\"REC_C2_BOT LT DAT_%s\"",
The_GetSuffix ()); The_GetSuffix ());
if (ItsMe) Frm_BeginFormAnchor (ActNck[MeOrOther].Change,Nck_NICKNAME_SECTION_ID);
Frm_BeginFormAnchor (ActChgMyNck,Nck_NICKNAME_SECTION_ID); if (MeOrOther == Usr_OTHER)
else Usr_PutParUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
{
Frm_BeginFormAnchor (NextAction[UsrDat->Roles.InCurrentCrs].Change,Nck_NICKNAME_SECTION_ID);
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
}
snprintf (NickWithArr,sizeof (NickWithArr),"@%s", snprintf (NickWithArr,sizeof (NickWithArr),"@%s",
Gbl.Usrs.Me.UsrDat.Nickname); UsrDat[MeOrOther]->Nickname);
HTM_INPUT_TEXT ("NewNick",1 + Nck_MAX_CHARS_NICK_WITHOUT_ARROBA, HTM_INPUT_TEXT ("NewNick",1 + Nck_MAX_CHARS_NICK_WITHOUT_ARROBA,
NickWithArr,HTM_DONT_SUBMIT_ON_CHANGE, NickWithArr,HTM_DONT_SUBMIT_ON_CHANGE,
"id=\"NewNick\" class=\"INPUT_%s\"" "id=\"NewNick\" class=\"INPUT_%s\""
@ -416,25 +422,25 @@ void Nck_RemoveOtherUsrNick (void)
void Nck_UpdateMyNick (void) void Nck_UpdateMyNick (void)
{ {
/***** Update my nickname *****/ /***** Update my nickname *****/
Nck_UpdateUsrNick (&Gbl.Usrs.Me.UsrDat); Nck_ChangeUsrNick (&Gbl.Usrs.Me.UsrDat);
/***** Show my account again *****/ /***** Show my account again *****/
Acc_ShowFormChgMyAccount (); Acc_ShowFormChgMyAccount ();
} }
/*****************************************************************************/ /*****************************************************************************/
/*********************** Update another user's nickname **********************/ /*********************** Change another user's nickname **********************/
/*****************************************************************************/ /*****************************************************************************/
void Nck_UpdateOtherUsrNick (void) void Nck_ChangeOtherUsrNick (void)
{ {
/***** Get user whose nick must be changed *****/ /***** Get user whose nick must be changed *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
{ {
if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat)) if (Usr_ICanEditOtherUsr (&Gbl.Usrs.Other.UsrDat))
{ {
/***** Update my nickname *****/ /***** Update user's nickname *****/
Nck_UpdateUsrNick (&Gbl.Usrs.Other.UsrDat); Nck_ChangeUsrNick (&Gbl.Usrs.Other.UsrDat);
/***** Show user's account again *****/ /***** Show user's account again *****/
Acc_ShowFormChgOtherUsrAccount (); Acc_ShowFormChgOtherUsrAccount ();
@ -447,10 +453,10 @@ void Nck_UpdateOtherUsrNick (void)
} }
/*****************************************************************************/ /*****************************************************************************/
/*************************** Update user's nickname **************************/ /*************************** Change user's nickname **************************/
/*****************************************************************************/ /*****************************************************************************/
static void Nck_UpdateUsrNick (struct Usr_Data *UsrDat) static void Nck_ChangeUsrNick (struct Usr_Data *UsrDat)
{ {
extern const char *Txt_The_nickname_matches_the_one_you_had_previously_registered; extern const char *Txt_The_nickname_matches_the_one_you_had_previously_registered;
extern const char *Txt_The_nickname_had_been_registered_by_another_user; extern const char *Txt_The_nickname_had_been_registered_by_another_user;

View File

@ -49,6 +49,6 @@ void Nck_RemoveMyNick (void);
void Nck_RemoveOtherUsrNick (void); void Nck_RemoveOtherUsrNick (void);
void Nck_UpdateMyNick (void); void Nck_UpdateMyNick (void);
void Nck_UpdateOtherUsrNick (void); void Nck_ChangeOtherUsrNick (void);
#endif #endif

View File

@ -94,10 +94,11 @@ static void Pho_ReqOtherUsrPhoto (void);
static void Pho_ReqPhoto (const struct Usr_Data *UsrDat); static void Pho_ReqPhoto (const struct Usr_Data *UsrDat);
static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct Usr_Data *UsrDat); static bool Pho_ReceivePhotoAndDetectFaces (Usr_MeOrOther_t MeOrOther,
const struct Usr_Data *UsrDat);
static void Pho_UpdatePhoto1 (struct Usr_Data *UsrDat); static void Pho_ChangePhoto1 (struct Usr_Data *UsrDat);
static void Pho_UpdatePhoto2 (void); static void Pho_ChangePhoto2 (void);
static long Pho_GetDegWithAvgPhotoLeastRecentlyUpdated (void); static long Pho_GetDegWithAvgPhotoLeastRecentlyUpdated (void);
static long Pho_GetTimeAvgPhotoWasComputed (long DegCod); static long Pho_GetTimeAvgPhotoWasComputed (long DegCod);
@ -143,7 +144,7 @@ static void Pho_ComputePhotoSize (const struct Pho_DegPhotos *DegPhotos,
bool Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat) bool Pho_ICanChangeOtherUsrPhoto (struct Usr_Data *UsrDat)
{ {
/***** I can change my photo *****/ /***** I can change my photo *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** Check if I have permission to change user's photo *****/ /***** Check if I have permission to change user's photo *****/
@ -188,15 +189,21 @@ void Pho_PutIconToChangeUsrPhoto (struct Usr_Data *UsrDat)
}; };
/***** Link for changing / uploading the photo *****/ /***** Link for changing / uploading the photo *****/
if (Usr_ItsMe (UsrDat->UsrCod)) switch (Usr_ItsMe (UsrDat->UsrCod))
Lay_PutContextualLinkOnlyIcon (ActReqMyPho,NULL, {
NULL,NULL, case Usr_ME:
"camera.svg",Ico_BLACK); Lay_PutContextualLinkOnlyIcon (ActReqMyPho,NULL,
else // Not me NULL,NULL,
if (Pho_ICanChangeOtherUsrPhoto (UsrDat)) "camera.svg",Ico_BLACK);
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL, break;
Rec_PutParUsrCodEncrypted,NULL, case Usr_OTHER:
"camera.svg",Ico_BLACK); default:
if (Pho_ICanChangeOtherUsrPhoto (UsrDat))
Lay_PutContextualLinkOnlyIcon (NextAction[UsrDat->Roles.InCurrentCrs],NULL,
Rec_PutParUsrCodEncrypted,NULL,
"camera.svg",Ico_BLACK);
break;
}
} }
/*****************************************************************************/ /*****************************************************************************/
@ -277,7 +284,6 @@ static void Pho_ReqPhoto (const struct Usr_Data *UsrDat)
extern const char *Txt_Photo; extern const char *Txt_Photo;
extern const char *Txt_You_can_send_a_file_with_an_image_in_JPEG_format_; extern const char *Txt_You_can_send_a_file_with_an_image_in_JPEG_format_;
extern const char *Txt_File_with_the_photo; extern const char *Txt_File_with_the_photo;
bool ItsMe = Usr_ItsMe (UsrDat->UsrCod);
static const Act_Action_t NextAction[Rol_NUM_ROLES] = static const Act_Action_t NextAction[Rol_NUM_ROLES] =
{ {
[Rol_UNK ] = ActDetOthPho, [Rol_UNK ] = ActDetOthPho,
@ -291,20 +297,29 @@ static void Pho_ReqPhoto (const struct Usr_Data *UsrDat)
[Rol_INS_ADM] = ActDetOthPho, [Rol_INS_ADM] = ActDetOthPho,
[Rol_SYS_ADM] = ActDetOthPho, [Rol_SYS_ADM] = ActDetOthPho,
}; };
static void (*FunctionToDrawContextualIcons[Usr_NUM_ME_OR_OTHER]) (void *Args) =
{
[Usr_ME ] = Pho_PutIconToReqRemMyPhoto,
[Usr_OTHER] = Pho_PutIconToReqRemOtherUsrPhoto
};
Usr_MeOrOther_t MeOrOther = Usr_ItsMe (UsrDat->UsrCod);
/***** Begin box *****/ /***** Begin box *****/
Box_BoxBegin (NULL,Txt_Photo, Box_BoxBegin (NULL,Txt_Photo,
ItsMe ? Pho_PutIconToReqRemMyPhoto : FunctionToDrawContextualIcons[MeOrOther],NULL,
Pho_PutIconToReqRemOtherUsrPhoto,NULL,
Hlp_PROFILE_Photo,Box_NOT_CLOSABLE); Hlp_PROFILE_Photo,Box_NOT_CLOSABLE);
/***** Begin form *****/ /***** Begin form *****/
if (ItsMe) switch (MeOrOther)
Frm_BeginForm (ActDetMyPho); {
else case Usr_ME:
{ Frm_BeginForm (ActDetMyPho);
Frm_BeginForm (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs]); break;
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod); case Usr_OTHER:
default:
Frm_BeginForm (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs]);
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
break;
} }
/***** Show help message *****/ /***** Show help message *****/
@ -344,12 +359,18 @@ void Pho_SendPhotoUsr (void)
return; return;
} }
if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)) switch (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod))
/***** Form to send my photo *****/ {
Pho_ReqMyPhoto (); case Usr_ME:
else // Not me /***** Form to send my photo *****/
/***** Form to send another user's photo *****/ Pho_ReqMyPhoto ();
Pho_ReqOtherUsrPhoto (); break;
case Usr_OTHER:
default:
/***** Form to send another user's photo *****/
Pho_ReqOtherUsrPhoto ();
break;
}
} }
/*****************************************************************************/ /*****************************************************************************/
@ -555,7 +576,8 @@ void Pho_RemoveUsrPhoto (void)
/*****************************************************************************/ /*****************************************************************************/
// Return false if no "green" faces detected // Return false if no "green" faces detected
static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct Usr_Data *UsrDat) static bool Pho_ReceivePhotoAndDetectFaces (Usr_MeOrOther_t MeOrOther,
const struct Usr_Data *UsrDat)
{ {
extern const char *Txt_The_file_is_not_X; extern const char *Txt_The_file_is_not_X;
extern const char *Txt_Could_not_detect_any_face_in_front_position_; extern const char *Txt_Could_not_detect_any_face_in_front_position_;
@ -593,16 +615,21 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct Usr_Data *Us
char StrFileName[NAME_MAX + 1]; char StrFileName[NAME_MAX + 1];
static const Act_Action_t NextAction[Rol_NUM_ROLES] = static const Act_Action_t NextAction[Rol_NUM_ROLES] =
{ {
[Rol_UNK ] = ActUpdOthPho, [Rol_UNK ] = ActChgOthPho,
[Rol_GST ] = ActUpdOthPho, [Rol_GST ] = ActChgOthPho,
[Rol_USR ] = ActUpdOthPho, [Rol_USR ] = ActChgOthPho,
[Rol_STD ] = ActUpdStdPho, [Rol_STD ] = ActChgStdPho,
[Rol_NET ] = ActUpdTchPho, [Rol_NET ] = ActChgTchPho,
[Rol_TCH ] = ActUpdTchPho, [Rol_TCH ] = ActChgTchPho,
[Rol_DEG_ADM] = ActUpdOthPho, [Rol_DEG_ADM] = ActChgOthPho,
[Rol_CTR_ADM] = ActUpdOthPho, [Rol_CTR_ADM] = ActChgOthPho,
[Rol_INS_ADM] = ActUpdOthPho, [Rol_INS_ADM] = ActChgOthPho,
[Rol_SYS_ADM] = ActUpdOthPho, [Rol_SYS_ADM] = ActChgOthPho,
};
Act_Action_t ActChgPho[Rol_NUM_ROLES] =
{
[Usr_ME ] = ActUpdMyPho,
[Usr_OTHER] = NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs]
}; };
char ErrorTxt[256]; char ErrorTxt[256];
char *Icon; char *Icon;
@ -683,15 +710,11 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct Usr_Data *Us
if (BackgroundCode == 1) if (BackgroundCode == 1)
{ {
snprintf (FormId,sizeof (FormId),"photo_%u",++NumFaces.Green); snprintf (FormId,sizeof (FormId),"photo_%u",++NumFaces.Green);
if (ItsMe) Frm_BeginFormId (ActChgPho[MeOrOther],FormId);
Frm_BeginFormId (ActUpdMyPho,FormId); if (MeOrOther == Usr_OTHER)
else Usr_PutParUsrCodEncrypted (Gbl.Usrs.Other.UsrDat.EnUsrCod);
{
Frm_BeginFormId (NextAction[Gbl.Usrs.Other.UsrDat.Roles.InCurrentCrs],FormId);
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
}
Par_PutParString (NULL,"FileName",StrFileName); Par_PutParString (NULL,"FileName",StrFileName);
Frm_EndForm (); Frm_EndForm ();
} }
else else
NumFaces.Red++; NumFaces.Red++;
@ -789,7 +812,7 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct Usr_Data *Us
void Pho_UpdateMyPhoto1 (void) void Pho_UpdateMyPhoto1 (void)
{ {
Pho_UpdatePhoto1 (&Gbl.Usrs.Me.UsrDat); Pho_ChangePhoto1 (&Gbl.Usrs.Me.UsrDat);
/***** The link to my photo is not valid now, so build it again before writing the web page *****/ /***** The link to my photo is not valid now, so build it again before writing the web page *****/
Gbl.Usrs.Me.MyPhotoExists = Pho_BuildLinkToPhoto (&Gbl.Usrs.Me.UsrDat,Gbl.Usrs.Me.PhotoURL); Gbl.Usrs.Me.MyPhotoExists = Pho_BuildLinkToPhoto (&Gbl.Usrs.Me.UsrDat,Gbl.Usrs.Me.PhotoURL);
@ -797,38 +820,38 @@ void Pho_UpdateMyPhoto1 (void)
void Pho_UpdateMyPhoto2 (void) void Pho_UpdateMyPhoto2 (void)
{ {
Pho_UpdatePhoto2 (); Pho_ChangePhoto2 ();
/***** Show my record and other data *****/ /***** Show my record and other data *****/
Rec_ShowMySharedRecordAndMore (); Rec_ShowMySharedRecordAndMore ();
} }
/*****************************************************************************/ /*****************************************************************************/
/*********************** Update another user's photo *************************/ /*********************** Change another user's photo *************************/
/*****************************************************************************/ /*****************************************************************************/
void Pho_UpdateUsrPhoto1 (void) void Pho_ChangeUsrPhoto1 (void)
{ {
/***** Get user's code from form and user's data *****/ /***** Get user's code from form and user's data *****/
if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParOtherUsrCodEncryptedAndGetUsrData ())
Pho_UpdatePhoto1 (&Gbl.Usrs.Other.UsrDat); Pho_ChangePhoto1 (&Gbl.Usrs.Other.UsrDat);
else else
Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission (); Ale_ShowAlertUserNotFoundOrYouDoNotHavePermission ();
} }
void Pho_UpdateUsrPhoto2 (void) void Pho_ChangeUsrPhoto2 (void)
{ {
Pho_UpdatePhoto2 (); Pho_ChangePhoto2 ();
/***** Show another user's record card *****/ /***** Show another user's record card *****/
Rec_ShowPublicSharedRecordOtherUsr (); Rec_ShowPublicSharedRecordOtherUsr ();
} }
/*****************************************************************************/ /*****************************************************************************/
/*************** Update a user's photo with a selected face ******************/ /*************** Change a user's photo with a selected face ******************/
/*****************************************************************************/ /*****************************************************************************/
static void Pho_UpdatePhoto1 (struct Usr_Data *UsrDat) static void Pho_ChangePhoto1 (struct Usr_Data *UsrDat)
{ {
extern const char *Txt_Photo_has_been_updated; extern const char *Txt_Photo_has_been_updated;
char PathPhotoTmp[PATH_MAX + 1]; // Full name (including path and .jpg) of the temporary file with the selected face char PathPhotoTmp[PATH_MAX + 1]; // Full name (including path and .jpg) of the temporary file with the selected face
@ -862,7 +885,7 @@ static void Pho_UpdatePhoto1 (struct Usr_Data *UsrDat)
"Error updating photo."); "Error updating photo.");
} }
static void Pho_UpdatePhoto2 (void) static void Pho_ChangePhoto2 (void)
{ {
extern const char *Txt_PHOTO_PROCESSING_CAPTIONS[3]; extern const char *Txt_PHOTO_PROCESSING_CAPTIONS[3];
unsigned NumPhoto; unsigned NumPhoto;

View File

@ -110,8 +110,8 @@ void Pho_RemoveUsrPhoto (void);
void Pho_UpdateMyPhoto1 (void); void Pho_UpdateMyPhoto1 (void);
void Pho_UpdateMyPhoto2 (void); void Pho_UpdateMyPhoto2 (void);
void Pho_UpdateUsrPhoto1 (void); void Pho_ChangeUsrPhoto1 (void);
void Pho_UpdateUsrPhoto2 (void); void Pho_ChangeUsrPhoto2 (void);
unsigned Pho_UpdateMyClicksWithoutPhoto (void); unsigned Pho_UpdateMyClicksWithoutPhoto (void);

View File

@ -256,7 +256,7 @@ Pri_Visibility_t Pri_GetParVisibility (const char *ParName,
bool Pri_ShowingIsAllowed (Pri_Visibility_t Visibility,struct Usr_Data *UsrDat) bool Pri_ShowingIsAllowed (Pri_Visibility_t Visibility,struct Usr_Data *UsrDat)
{ {
/***** I always can see my things *****/ /***** I always can see my things *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** System admins always can see others' profiles *****/ /***** System admins always can see others' profiles *****/

View File

@ -109,7 +109,8 @@ static void Prf_GetNumMessagesSentAndStoreAsUsrFigure (long UsrCod);
static void Prf_ResetUsrFigures (struct Prf_UsrFigures *UsrFigures); static void Prf_ResetUsrFigures (struct Prf_UsrFigures *UsrFigures);
static void Prf_GetAndShowRankingFigure (const char *FldName); static void Prf_GetAndShowRankingFigure (const char *FldName);
static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,bool ItsMe); static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,
Usr_MeOrOther_t MeOrOther);
/*****************************************************************************/ /*****************************************************************************/
/************* Suggest who to follow or request user's profile ***************/ /************* Suggest who to follow or request user's profile ***************/
@ -265,7 +266,7 @@ void Prf_GetUsrDatAndShowUserProfile (void)
} }
/***** If it's not me, mark possible notification as seen *****/ /***** If it's not me, mark possible notification as seen *****/
if (!Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)) // Not me if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_OTHER) // Not me
Ntf_DB_MarkNotifAsSeenUsingCod (Ntf_EVENT_FOLLOWER, Ntf_DB_MarkNotifAsSeenUsingCod (Ntf_EVENT_FOLLOWER,
Gbl.Usrs.Other.UsrDat.UsrCod); Gbl.Usrs.Other.UsrDat.UsrCod);
} }
@ -277,11 +278,16 @@ void Prf_GetUsrDatAndShowUserProfile (void)
bool Prf_ShowUserProfile (struct Usr_Data *UsrDat) bool Prf_ShowUserProfile (struct Usr_Data *UsrDat)
{ {
static void (*PutLinkToUsrProfile[Usr_NUM_ME_OR_OTHER]) (void) =
{
[Usr_ME ] = Prf_PutLinkRequestAnotherUserProfile, // Request another user's profile
[Usr_OTHER] = Prf_PutLinkMyPublicProfile // My public profile
};
unsigned NumFollowing; unsigned NumFollowing;
unsigned NumFollowers; unsigned NumFollowers;
bool UsrFollowsMe; bool UsrFollowsMe;
bool IFollowUsr; bool IFollowUsr;
bool ItsMe = Usr_ItsMe (UsrDat->UsrCod); Usr_MeOrOther_t MeOrOther = Usr_ItsMe (UsrDat->UsrCod);
/***** Check if I can see the public profile *****/ /***** Check if I can see the public profile *****/
if (Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat)) if (Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat))
@ -290,16 +296,13 @@ bool Prf_ShowUserProfile (struct Usr_Data *UsrDat)
{ {
/***** Contextual menu *****/ /***** Contextual menu *****/
Mnu_ContextMenuBegin (); Mnu_ContextMenuBegin ();
if (ItsMe) PutLinkToUsrProfile[MeOrOther] (); // Public profile
Prf_PutLinkRequestAnotherUserProfile (); // Request another user's profile Fol_PutLinkWhoToFollow (); // Users to follow
else // Not me
Prf_PutLinkMyPublicProfile (); // My public profile
Fol_PutLinkWhoToFollow (); // Users to follow
Mnu_ContextMenuEnd (); Mnu_ContextMenuEnd ();
} }
/***** Shared record card *****/ /***** Shared record card *****/
if (!ItsMe && // If not me... if (MeOrOther == Usr_OTHER && // If not me...
Gbl.Hierarchy.Level == HieLvl_CRS) // ...and a course is selected Gbl.Hierarchy.Level == HieLvl_CRS) // ...and a course is selected
{ {
/* Get user's role in current course */ /* Get user's role in current course */
@ -1170,11 +1173,16 @@ static void Prf_GetAndShowRankingFigure (const char *FldName)
void Prf_ShowRankingFigure (MYSQL_RES **mysql_res,unsigned NumUsrs) void Prf_ShowRankingFigure (MYSQL_RES **mysql_res,unsigned NumUsrs)
{ {
static const char *Class[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = "DAT_SMALL_STRONG",
[Usr_OTHER] = "DAT_SMALL"
};
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumUsr; unsigned NumUsr;
unsigned Rank; unsigned Rank;
struct Usr_Data UsrDat; struct Usr_Data UsrDat;
bool ItsMe; Usr_MeOrOther_t MeOrOther;
long FigureHigh = LONG_MAX; long FigureHigh = LONG_MAX;
long Figure; long Figure;
@ -1197,7 +1205,6 @@ void Prf_ShowRankingFigure (MYSQL_RES **mysql_res,unsigned NumUsrs)
Usr_GetAllUsrDataFromUsrCod (&UsrDat, Usr_GetAllUsrDataFromUsrCod (&UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CURRENT_CRS); Usr_DONT_GET_ROLE_IN_CURRENT_CRS);
ItsMe = Usr_ItsMe (UsrDat.UsrCod);
/* Get figure (row[1]) */ /* Get figure (row[1]) */
if (sscanf (row[1],"%ld",&Figure) != 1) if (sscanf (row[1],"%ld",&Figure) != 1)
@ -1211,10 +1218,10 @@ void Prf_ShowRankingFigure (MYSQL_RES **mysql_res,unsigned NumUsrs)
/***** Show row *****/ /***** Show row *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
Prf_ShowUsrInRanking (&UsrDat,Rank,ItsMe); MeOrOther = Usr_ItsMe (UsrDat.UsrCod);
Prf_ShowUsrInRanking (&UsrDat,Rank,MeOrOther);
HTM_TD_Begin ("class=\"RM %s_%s %s\"", HTM_TD_Begin ("class=\"RM %s_%s %s\"",
ItsMe ? "DAT_SMALL_STRONG" : Class[MeOrOther],
"DAT_SMALL",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
HTM_Long (Figure); HTM_Long (Figure);
@ -1238,13 +1245,18 @@ void Prf_ShowRankingFigure (MYSQL_RES **mysql_res,unsigned NumUsrs)
void Prf_GetAndShowRankingClicksPerDay (void) void Prf_GetAndShowRankingClicksPerDay (void)
{ {
static const char *Class[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = "DAT_SMALL_STRONG",
[Usr_OTHER] = "DAT_SMALL"
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumUsrs = 0; // Initialized to avoid warning unsigned NumUsrs = 0; // Initialized to avoid warning
unsigned NumUsr; unsigned NumUsr;
unsigned Rank; unsigned Rank;
struct Usr_Data UsrDat; struct Usr_Data UsrDat;
bool ItsMe; Usr_MeOrOther_t MeOrOther;
double NumClicksPerDayHigh = (double) LONG_MAX; double NumClicksPerDayHigh = (double) LONG_MAX;
double NumClicksPerDay; double NumClicksPerDay;
@ -1268,7 +1280,6 @@ void Prf_GetAndShowRankingClicksPerDay (void)
Usr_GetAllUsrDataFromUsrCod (&UsrDat, Usr_GetAllUsrDataFromUsrCod (&UsrDat,
Usr_DONT_GET_PREFS, Usr_DONT_GET_PREFS,
Usr_DONT_GET_ROLE_IN_CURRENT_CRS); Usr_DONT_GET_ROLE_IN_CURRENT_CRS);
ItsMe = Usr_ItsMe (UsrDat.UsrCod);
/* Get average number of clicks per day (row[1]) */ /* Get average number of clicks per day (row[1]) */
NumClicksPerDay = Str_GetDoubleFromStr (row[1]); NumClicksPerDay = Str_GetDoubleFromStr (row[1]);
@ -1280,10 +1291,9 @@ void Prf_GetAndShowRankingClicksPerDay (void)
/***** Show row *****/ /***** Show row *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
Prf_ShowUsrInRanking (&UsrDat,Rank,ItsMe); MeOrOther = Usr_ItsMe (UsrDat.UsrCod);
HTM_TD_Begin ("class=\"RM %s_%s %s\"", Prf_ShowUsrInRanking (&UsrDat,Rank,MeOrOther);
ItsMe ? "DAT_SMALL_STRONG" : HTM_TD_Begin ("class=\"RM %s_%s %s\"",Class[MeOrOther],
"DAT_SMALL",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
HTM_DoubleFewDigits (NumClicksPerDay); HTM_DoubleFewDigits (NumClicksPerDay);
@ -1305,9 +1315,15 @@ void Prf_GetAndShowRankingClicksPerDay (void)
/************** Show user's photo and nickname in ranking list ***************/ /************** Show user's photo and nickname in ranking list ***************/
/*****************************************************************************/ /*****************************************************************************/
static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,bool ItsMe) static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,
Usr_MeOrOther_t MeOrOther)
{ {
extern const char *Txt_Another_user_s_profile; extern const char *Txt_Another_user_s_profile;
static const char *Class[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = "DAT_SMALL_STRONG",
[Usr_OTHER] = "DAT_SMALL"
};
static const char *ClassPhoto[PhoSha_NUM_SHAPES] = static const char *ClassPhoto[PhoSha_NUM_SHAPES] =
{ {
[PhoSha_SHAPE_CIRCLE ] = "PHOTOC30x40", [PhoSha_SHAPE_CIRCLE ] = "PHOTOC30x40",
@ -1318,8 +1334,7 @@ static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,bool Its
bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat); bool Visible = Pri_ShowingIsAllowed (UsrDat->BaPrfVisibility,UsrDat);
HTM_TD_Begin ("class=\"RM %s_%s %s\"", HTM_TD_Begin ("class=\"RM %s_%s %s\"",
ItsMe ? "DAT_SMALL_STRONG" : Class[MeOrOther],
"DAT_SMALL",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
HTM_TxtF ("#%u",Rank); HTM_TxtF ("#%u",Rank);
@ -1335,8 +1350,7 @@ static void Prf_ShowUsrInRanking (struct Usr_Data *UsrDat,unsigned Rank,bool Its
/***** Put form to go to public profile *****/ /***** Put form to go to public profile *****/
HTM_TD_Begin ("class=\"RANK_USR %s_%s %s\"", // Limited width HTM_TD_Begin ("class=\"RANK_USR %s_%s %s\"", // Limited width
ItsMe ? "DAT_SMALL_STRONG" : Class[MeOrOther],
"DAT_SMALL",
The_GetSuffix (), The_GetSuffix (),
The_GetColorRows ()); The_GetColorRows ());
if (Visible) if (Visible)

View File

@ -2962,7 +2962,7 @@ static void Prj_AddUsrsToProject (Prj_RoleInProject_t RoleInPrj)
Prj_DB_AddUsrToPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod); Prj_DB_AddUsrToPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod);
/* Flush cache */ /* Flush cache */
if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)) if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME)
Prj_FlushCacheMyRolesInProject (); Prj_FlushCacheMyRolesInProject ();
/* Show success alert */ /* Show success alert */
@ -3027,6 +3027,11 @@ static void Prj_ReqRemUsrFromPrj (struct Prj_Projects *Projects,
[Prj_ROLE_TUT] = ActRemTutPrj, // Tutor [Prj_ROLE_TUT] = ActRemTutPrj, // Tutor
[Prj_ROLE_EVL] = ActRemEvlPrj, // Evaluator [Prj_ROLE_EVL] = ActRemEvlPrj, // Evaluator
}; };
const char *Question[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_Do_you_really_want_to_be_removed_as_a_X_from_the_project_Y,
[Usr_OTHER] = Txt_Do_you_really_want_to_remove_the_following_user_as_a_X_from_the_project_Y
};
char *TxtButton; char *TxtButton;
/***** Allocate memory for the project *****/ /***** Allocate memory for the project *****/
@ -3046,8 +3051,7 @@ static void Prj_ReqRemUsrFromPrj (struct Prj_Projects *Projects,
{ {
/***** Show question and button to remove user as a role from project *****/ /***** Show question and button to remove user as a role from project *****/
/* Begin alert */ /* Begin alert */
Ale_ShowAlertAndButton1 (Ale_QUESTION,Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) ? Txt_Do_you_really_want_to_be_removed_as_a_X_from_the_project_Y : Ale_ShowAlertAndButton1 (Ale_QUESTION,Question[Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)],
Txt_Do_you_really_want_to_remove_the_following_user_as_a_X_from_the_project_Y,
Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex], Txt_PROJECT_ROLES_SINGUL_abc[RoleInPrj][Gbl.Usrs.Other.UsrDat.Sex],
Projects->Prj.Title); Projects->Prj.Title);
@ -3127,7 +3131,7 @@ static void Prj_RemUsrFromPrj (Prj_RoleInProject_t RoleInPrj)
Prj_DB_RemoveUsrFromPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod); Prj_DB_RemoveUsrFromPrj (Projects.Prj.PrjCod,RoleInPrj,Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Flush cache *****/ /***** Flush cache *****/
if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)) if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME)
Prj_FlushCacheMyRolesInProject (); Prj_FlushCacheMyRolesInProject ();
/***** Show success alert *****/ /***** Show success alert *****/
@ -4528,7 +4532,7 @@ void Prj_RemoveUsrFromProjects (long UsrCod)
Prj_DB_RemoveUsrFromProjects (UsrCod); Prj_DB_RemoveUsrFromProjects (UsrCod);
/***** Flush cache *****/ /***** Flush cache *****/
if (Usr_ItsMe (UsrCod)) if (Usr_ItsMe (UsrCod) == Usr_ME)
Prj_FlushCacheMyRolesInProject (); Prj_FlushCacheMyRolesInProject ();
} }

View File

@ -128,8 +128,8 @@ static void Rec_ShowMyCrsRecordUpdated (void);
static bool Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility); static bool Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility);
static void Rec_PutIconsCommands (__attribute__((unused)) void *Args); static void Rec_PutIconsCommands (__attribute__((unused)) void *Args);
static void Rec_PutParsMyTsts (__attribute__((unused)) void *Args); static void Rec_PutParsMyResults (__attribute__((unused)) void *Args);
static void Rec_PutParsStdTsts (__attribute__((unused)) void *Args); static void Rec_PutParsStdResults (__attribute__((unused)) void *Args);
static void Rec_PutParsWorks (__attribute__((unused)) void *Args); static void Rec_PutParsWorks (__attribute__((unused)) void *Args);
static void Rec_PutParsStudent (__attribute__((unused)) void *Args); static void Rec_PutParsStudent (__attribute__((unused)) void *Args);
static void Rec_PutParsMsgUsr (__attribute__((unused)) void *Args); static void Rec_PutParsMsgUsr (__attribute__((unused)) void *Args);
@ -1014,7 +1014,7 @@ static void Rec_ShowRecordOneStdCrs (void)
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)) if (Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME)
{ {
HTM_DIV_Begin ("class=\"REC_RIGHT\""); HTM_DIV_Begin ("class=\"REC_RIGHT\"");
Rec_ShowCrsRecord (Rec_CRS_MY_RECORD_AS_STUDENT_FORM,&Gbl.Usrs.Other.UsrDat,NULL); Rec_ShowCrsRecord (Rec_CRS_MY_RECORD_AS_STUDENT_FORM,&Gbl.Usrs.Other.UsrDat,NULL);
@ -1143,7 +1143,7 @@ static void Rec_ListRecordsStds (Rec_SharedRecordViewType_t ShaTypeOfView,
Gbl.Usrs.Me.Role.Logged == Rol_TCH || Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM || Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ||
(Gbl.Usrs.Me.Role.Logged == Rol_STD && // I am student in this course... (Gbl.Usrs.Me.Role.Logged == Rol_STD && // I am student in this course...
Usr_ItsMe (UsrDat.UsrCod))) // ...and it's me Usr_ItsMe (UsrDat.UsrCod) == Usr_ME)) // ...and it's me
{ {
HTM_DIV_Begin ("class=\"REC_RIGHT\""); HTM_DIV_Begin ("class=\"REC_RIGHT\"");
Rec_ShowCrsRecord (CrsTypeOfView,&UsrDat,RecordSectionId); Rec_ShowCrsRecord (CrsTypeOfView,&UsrDat,RecordSectionId);
@ -1590,7 +1590,7 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: // I am a student case Rol_STD: // I am a student
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
{ {
switch (TypeOfView) switch (TypeOfView)
{ {
@ -2037,7 +2037,7 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
[Rol_SYS_ADM] = NULL, [Rol_SYS_ADM] = NULL,
}; };
char StrRecordWidth[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; char StrRecordWidth[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
bool ItsMe; Usr_MeOrOther_t MeOrOther;
bool IAmLoggedAsTeacherOrSysAdm; bool IAmLoggedAsTeacherOrSysAdm;
bool CountryForm; bool CountryForm;
bool ICanEdit; bool ICanEdit;
@ -2052,12 +2052,12 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
Act_Action_t NextAction; Act_Action_t NextAction;
/***** Initializations *****/ /***** Initializations *****/
ItsMe = Usr_ItsMe (UsrDat->UsrCod); MeOrOther = Usr_ItsMe (UsrDat->UsrCod);
IAmLoggedAsTeacherOrSysAdm = (Gbl.Usrs.Me.Role.Logged == Rol_NET || // My current role is non-editing teacher IAmLoggedAsTeacherOrSysAdm = (Gbl.Usrs.Me.Role.Logged == Rol_NET || // My current role is non-editing teacher
Gbl.Usrs.Me.Role.Logged == Rol_TCH || // My current role is teacher Gbl.Usrs.Me.Role.Logged == Rol_TCH || // My current role is teacher
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); // My current role is system admin Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); // My current role is system admin
CountryForm = (TypeOfView == Rec_SHA_MY_RECORD_FORM); CountryForm = (TypeOfView == Rec_SHA_MY_RECORD_FORM);
ShowData = (ItsMe || ShowData = (MeOrOther == Usr_ME ||
Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM || Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM ||
UsrDat->Accepted); UsrDat->Accepted);
ShowIDRows = (TypeOfView != Rec_SHA_RECORD_PUBLIC); ShowIDRows = (TypeOfView != Rec_SHA_RECORD_PUBLIC);
@ -2265,19 +2265,21 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
case Rec_SHA_OTHER_EXISTING_USR_FORM: case Rec_SHA_OTHER_EXISTING_USR_FORM:
/***** Show list of groups to register/remove me/user *****/ /***** Show list of groups to register/remove me/user *****/
if (Gbl.Crs.Grps.NumGrps) // This course has groups? if (Gbl.Crs.Grps.NumGrps) // This course has groups?
{ switch (MeOrOther)
if (ItsMe)
{ {
// Don't show groups if I don't belong to course case Usr_ME:
if (Gbl.Usrs.Me.IBelongToCurrentCrs) // Don't show groups if I don't belong to course
Grp_ShowLstGrpsToChgMyGrps (); if (Gbl.Usrs.Me.IBelongToCurrentCrs)
Grp_ShowLstGrpsToChgMyGrps ();
break;
case Usr_OTHER:
default:
Grp_ShowLstGrpsToChgOtherUsrsGrps (UsrDat->UsrCod);
break;
} }
else // Not me
Grp_ShowLstGrpsToChgOtherUsrsGrps (UsrDat->UsrCod);
}
/***** Which action, register or removing? *****/ /***** Which action, register or removing? *****/
if (Enr_PutActionsRegRemOneUsr (ItsMe)) if (Enr_PutActionsRegRemOneUsr (MeOrOther))
Btn_PutConfirmButton (Txt_Confirm); Btn_PutConfirmButton (Txt_Confirm);
Frm_EndForm (); Frm_EndForm ();
@ -2300,7 +2302,7 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
static void Rec_PutIconsCommands (__attribute__((unused)) void *Args) static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
{ {
bool ItsMe = Usr_ItsMe (Rec_Record.UsrDat->UsrCod); Usr_MeOrOther_t MeOrOther = Usr_ItsMe (Rec_Record.UsrDat->UsrCod);
bool ICanViewUsrProfile; bool ICanViewUsrProfile;
bool RecipientHasBannedMe; bool RecipientHasBannedMe;
static const Act_Action_t NextAction[Rol_NUM_ROLES] = static const Act_Action_t NextAction[Rol_NUM_ROLES] =
@ -2316,6 +2318,56 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
[Rol_INS_ADM] = ActReqMdfOth, [Rol_INS_ADM] = ActReqMdfOth,
[Rol_SYS_ADM] = ActReqMdfOth, [Rol_SYS_ADM] = ActReqMdfOth,
}; };
static Act_Action_t ActSeeAgd[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = ActSeeMyAgd,
[Usr_OTHER] = ActSeeUsrAgd,
};
static Act_Action_t ActSeeTstResCrs[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = ActSeeMyTstResCrs,
[Usr_OTHER] = ActSeeUsrTstResCrs,
};
static Act_Action_t ActSeeExaResCrs[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = ActSeeMyExaResCrs,
[Usr_OTHER] = ActSeeUsrExaResCrs,
};
static Act_Action_t ActSeeMchResCrs[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = ActSeeMyMchResCrs,
[Usr_OTHER] = ActSeeUsrMchResCrs,
};
static Act_Action_t ActAdmAsgWrk[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = ActAdmAsgWrkUsr,
[Usr_OTHER] = ActAdmAsgWrkCrs, // Not me, I am not a student in current course
};
static Act_Action_t ActSeeLstAtt[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = ActSeeLstMyAtt,
[Usr_OTHER] = ActSeeLstUsrAtt,
};
static void (*FuncPutParsAgd[Usr_NUM_ME_OR_OTHER]) (void *Args) =
{
[Usr_ME ] = NULL,
[Usr_OTHER] = Rec_PutParUsrCodEncrypted,
};
static void (*FuncPutParsResults[Usr_NUM_ME_OR_OTHER]) (void *Args) =
{
[Usr_ME ] = Rec_PutParsMyResults,
[Usr_OTHER] = Rec_PutParsStdResults,
};
static void (*FuncPutParsAdmAsgWrk[Usr_NUM_ME_OR_OTHER]) (void *Args) =
{
[Usr_ME ] = NULL,
[Usr_OTHER] = Rec_PutParsWorks, // Not me, I am not a student in current course
};
static void (*FuncPutParsSeeLstAtt[Usr_NUM_ME_OR_OTHER]) (void *Args) =
{
[Usr_ME ] = NULL,
[Usr_OTHER] = Rec_PutParsStudent,
};
if (!Frm_CheckIfInside () && // Only if not inside another form if (!Frm_CheckIfInside () && // Only if not inside another form
Act_GetBrowserTab (Gbl.Action.Act) == Act_BRW_1ST_TAB && // Only in main browser tab Act_GetBrowserTab (Gbl.Action.Act) == Act_BRW_1ST_TAB && // Only in main browser tab
@ -2327,13 +2379,14 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
/***** Begin container *****/ /***** Begin container *****/
HTM_DIV_Begin ("class=\"FRAME_ICO\""); HTM_DIV_Begin ("class=\"FRAME_ICO\"");
if (ItsMe) /***** Button to edit my record card *****/
/***** Button to edit my record card *****/ if (MeOrOther == Usr_ME)
Lay_PutContextualLinkOnlyIcon (ActReqEdiRecSha,NULL, Lay_PutContextualLinkOnlyIcon (ActReqEdiRecSha,NULL,
NULL,NULL, NULL,NULL,
"pen.svg",Ico_BLACK); "pen.svg",Ico_BLACK);
/***** Button to view user's profile *****/
if (ICanViewUsrProfile) if (ICanViewUsrProfile)
/***** Button to view user's profile *****/
Lay_PutContextualLinkOnlyIcon (ActSeeOthPubPrf,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeOthPubPrf,NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
"user.svg",Ico_BLACK); "user.svg",Ico_BLACK);
@ -2345,22 +2398,19 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
"address-card.svg",Ico_BLACK); "address-card.svg",Ico_BLACK);
else if (Usr_CheckIfICanViewRecordTch (Rec_Record.UsrDat)) else if (Usr_CheckIfICanViewRecordTch (Rec_Record.UsrDat))
/* View teacher's record card and timetable */
Lay_PutContextualLinkOnlyIcon (ActSeeRecOneTch,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeRecOneTch,NULL,
Rec_PutParUsrCodEncrypted,NULL, Rec_PutParUsrCodEncrypted,NULL,
"address-card.svg",Ico_BLACK); "address-card.svg",Ico_BLACK);
/***** Button to view user's agenda *****/ /***** Button to view user's agenda *****/
if (ItsMe) if (Usr_CheckIfICanViewUsrAgenda (Rec_Record.UsrDat))
Lay_PutContextualLinkOnlyIcon (ActSeeMyAgd,NULL, Lay_PutContextualLinkOnlyIcon (ActSeeAgd[MeOrOther],NULL,
NULL,NULL, FuncPutParsAgd[MeOrOther],NULL,
"calendar.svg",Ico_BLACK);
else if (Usr_CheckIfICanViewUsrAgenda (Rec_Record.UsrDat))
Lay_PutContextualLinkOnlyIcon (ActSeeUsrAgd,NULL,
Rec_PutParUsrCodEncrypted,NULL,
"calendar.svg",Ico_BLACK); "calendar.svg",Ico_BLACK);
/***** Button to admin user *****/ /***** Button to admin user *****/
if (ItsMe || if (MeOrOther == Usr_ME ||
Gbl.Usrs.Me.Role.Logged == Rol_TCH || Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
Gbl.Usrs.Me.Role.Logged == Rol_DEG_ADM || Gbl.Usrs.Me.Role.Logged == Rol_DEG_ADM ||
Gbl.Usrs.Me.Role.Logged == Rol_CTR_ADM || Gbl.Usrs.Me.Role.Logged == Rol_CTR_ADM ||
@ -2377,63 +2427,31 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
/***** Buttons to view student's test, exam and match results *****/ /***** Buttons to view student's test, exam and match results *****/
if (Usr_CheckIfICanViewTstExaMchResult (Rec_Record.UsrDat)) if (Usr_CheckIfICanViewTstExaMchResult (Rec_Record.UsrDat))
{ {
if (ItsMe) /* Test results in course */
{ Lay_PutContextualLinkOnlyIcon (ActSeeTstResCrs[MeOrOther],NULL,
/* My test results in course */ FuncPutParsResults[MeOrOther],NULL,
Lay_PutContextualLinkOnlyIcon (ActSeeMyTstResCrs,NULL, "check.svg",Ico_BLACK);
Rec_PutParsMyTsts,NULL, /* Exam results in course */
"check.svg",Ico_BLACK); Lay_PutContextualLinkOnlyIcon (ActSeeExaResCrs[MeOrOther],NULL,
/* My exam results in course */ FuncPutParsResults[MeOrOther],NULL,
Lay_PutContextualLinkOnlyIcon (ActSeeMyExaResCrs,NULL, "file-signature.svg",Ico_BLACK);
Rec_PutParsMyTsts,NULL, /* Match results in course */
"file-signature.svg",Ico_BLACK); Lay_PutContextualLinkOnlyIcon (ActSeeMchResCrs[MeOrOther],NULL,
/* My match results in course */ FuncPutParsResults[MeOrOther],NULL,
Lay_PutContextualLinkOnlyIcon (ActSeeMyMchResCrs,NULL, "gamepad.svg",Ico_BLACK);
Rec_PutParsMyTsts,NULL,
"gamepad.svg",Ico_BLACK);
}
else // Not me
{
/* User's test results in course */
Lay_PutContextualLinkOnlyIcon (ActSeeUsrTstResCrs,NULL,
Rec_PutParsStdTsts,NULL,
"check.svg",Ico_BLACK);
/* User's exam results in course */
Lay_PutContextualLinkOnlyIcon (ActSeeUsrExaResCrs,NULL,
Rec_PutParsStdTsts,NULL,
"file-signature.svg",Ico_BLACK);
/* User's match results in course */
Lay_PutContextualLinkOnlyIcon (ActSeeUsrMchResCrs,NULL,
Rec_PutParsStdTsts,NULL,
"gamepad.svg",Ico_BLACK);
}
} }
/***** Button to view student's assignments and works *****/ /***** Button to view student's assignments and works *****/
if (Usr_CheckIfICanViewAsgWrk (Rec_Record.UsrDat)) if (Usr_CheckIfICanViewAsgWrk (Rec_Record.UsrDat))
{ Lay_PutContextualLinkOnlyIcon (ActAdmAsgWrk[MeOrOther],NULL,
if (ItsMe) FuncPutParsAdmAsgWrk[MeOrOther],NULL,
Lay_PutContextualLinkOnlyIcon (ActAdmAsgWrkUsr,NULL, "folder-open.svg",Ico_BLACK);
NULL,NULL,
"folder-open.svg",Ico_BLACK);
else // Not me, I am not a student in current course
Lay_PutContextualLinkOnlyIcon (ActAdmAsgWrkCrs,NULL,
Rec_PutParsWorks,NULL,
"folder-open.svg",Ico_BLACK);
}
/***** Button to view student's attendance *****/ /***** Button to view student's attendance *****/
if (Usr_CheckIfICanViewAtt (Rec_Record.UsrDat)) if (Usr_CheckIfICanViewAtt (Rec_Record.UsrDat))
{ Lay_PutContextualLinkOnlyIcon (ActSeeLstAtt[MeOrOther],NULL,
if (ItsMe) FuncPutParsSeeLstAtt[MeOrOther],NULL,
Lay_PutContextualLinkOnlyIcon (ActSeeLstMyAtt,NULL, "calendar-check.svg",Ico_BLACK);
NULL,NULL,
"calendar-check.svg",Ico_BLACK);
else // Not me
Lay_PutContextualLinkOnlyIcon (ActSeeLstUsrAtt,NULL,
Rec_PutParsStudent,NULL,
"calendar-check.svg",Ico_BLACK);
}
} }
} }
@ -2450,7 +2468,7 @@ static void Rec_PutIconsCommands (__attribute__((unused)) void *Args)
"envelope.svg",Ico_BLACK); "envelope.svg",Ico_BLACK);
/***** Button to follow / unfollow *****/ /***** Button to follow / unfollow *****/
if (!ItsMe) // Not me if (MeOrOther == Usr_OTHER) // Not me
{ {
if (Fol_DB_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod, if (Fol_DB_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod,
Rec_Record.UsrDat->UsrCod)) Rec_Record.UsrDat->UsrCod))
@ -2480,13 +2498,13 @@ void Rec_PutParUsrCodEncrypted (__attribute__((unused)) void *Args)
Usr_PutParUsrCodEncrypted (Rec_Record.UsrDat->EnUsrCod); Usr_PutParUsrCodEncrypted (Rec_Record.UsrDat->EnUsrCod);
} }
static void Rec_PutParsMyTsts (__attribute__((unused)) void *Args) static void Rec_PutParsMyResults (__attribute__((unused)) void *Args)
{ {
Dat_SetIniEndDatesToPastAndNow (); Dat_SetIniEndDatesToPastAndNow ();
Dat_WriteParsIniEndDates (); Dat_WriteParsIniEndDates ();
} }
static void Rec_PutParsStdTsts (__attribute__((unused)) void *Args) static void Rec_PutParsStdResults (__attribute__((unused)) void *Args)
{ {
Rec_PutParsStudent (NULL); Rec_PutParsStudent (NULL);
Dat_SetIniEndDatesToPastAndNow (); Dat_SetIniEndDatesToPastAndNow ();
@ -2615,7 +2633,11 @@ static void Rec_ShowNickname (struct Usr_Data *UsrDat,bool PutFormLinks)
{ {
extern const char *Txt_My_public_profile; extern const char *Txt_My_public_profile;
extern const char *Txt_Another_user_s_profile; extern const char *Txt_Another_user_s_profile;
bool ItsMe; const char *Title[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_My_public_profile,
[Usr_OTHER] = Txt_Another_user_s_profile
};
HTM_TD_Begin ("class=\"REC_C2_MID LB\""); HTM_TD_Begin ("class=\"REC_C2_MID LB\"");
HTM_DIV_Begin ("class=\"REC_NICK\""); HTM_DIV_Begin ("class=\"REC_NICK\"");
@ -2624,11 +2646,9 @@ static void Rec_ShowNickname (struct Usr_Data *UsrDat,bool PutFormLinks)
if (PutFormLinks) if (PutFormLinks)
{ {
/* Put form to go to public profile */ /* Put form to go to public profile */
ItsMe = Usr_ItsMe (UsrDat->UsrCod);
Frm_BeginForm (ActSeeOthPubPrf); Frm_BeginForm (ActSeeOthPubPrf);
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod); Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
HTM_BUTTON_Submit_Begin (ItsMe ? Txt_My_public_profile : HTM_BUTTON_Submit_Begin (Title[Usr_ItsMe (UsrDat->UsrCod)],
Txt_Another_user_s_profile,
"class=\"BT_LINK\""); "class=\"BT_LINK\"");
} }
HTM_TxtF ("@%s",UsrDat->Nickname); HTM_TxtF ("@%s",UsrDat->Nickname);

View File

@ -340,7 +340,7 @@ void Str_AnalyzeTxtAndStoreNotifyEventToMentionedUsrs (long PubCod,const char *T
UsrDat.Nickname[Nickname.Length] = '\0'; UsrDat.Nickname[Nickname.Length] = '\0';
if ((UsrDat.UsrCod = Nck_GetUsrCodFromNickname (UsrDat.Nickname)) > 0) if ((UsrDat.UsrCod = Nck_GetUsrCodFromNickname (UsrDat.Nickname)) > 0)
if (!Usr_ItsMe (UsrDat.UsrCod)) // Not me if (Usr_ItsMe (UsrDat.UsrCod) == Usr_OTHER) // Not me
{ {
/* Get user's data */ /* Get user's data */
Usr_GetAllUsrDataFromUsrCod (&UsrDat, Usr_GetAllUsrDataFromUsrCod (&UsrDat,

View File

@ -162,7 +162,7 @@ static void TstPrn_PutFormToSelectUsrsToViewUsrsPrints (__attribute__((unused))
static void TstPrn_ShowUsrsPrints (__attribute__((unused)) void *Args); static void TstPrn_ShowUsrsPrints (__attribute__((unused)) void *Args);
static void TstPrn_ShowHeaderPrints (Usr_MeOrOther_t MeOrOther); static void TstPrn_ShowHeaderPrints (Usr_MeOrOther_t MeOrOther);
static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat); static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat);
static void TstPrn_ShowPrintsSummaryRow (bool ItsMe, static void TstPrn_ShowPrintsSummaryRow (Usr_MeOrOther_t MeOrOther,
unsigned NumPrints, unsigned NumPrints,
struct TstPrn_NumQuestions *NumTotalQsts, struct TstPrn_NumQuestions *NumTotalQsts,
double TotalScore); double TotalScore);
@ -2024,7 +2024,8 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
} }
/***** Write totals for this user *****/ /***** Write totals for this user *****/
TstPrn_ShowPrintsSummaryRow (Usr_ItsMe (UsrDat->UsrCod),NumPrintsVisibleByTchs, TstPrn_ShowPrintsSummaryRow (Usr_ItsMe (UsrDat->UsrCod),
NumPrintsVisibleByTchs,
&NumTotalQsts,TotalScore); &NumTotalQsts,TotalScore);
} }
else else
@ -2072,7 +2073,7 @@ static void TstPrn_ShowUsrPrints (struct Usr_Data *UsrDat)
/****************** Show row with summary of user's tess *********************/ /****************** Show row with summary of user's tess *********************/
/*****************************************************************************/ /*****************************************************************************/
static void TstPrn_ShowPrintsSummaryRow (bool ItsMe, static void TstPrn_ShowPrintsSummaryRow (Usr_MeOrOther_t MeOrOther,
unsigned NumPrints, unsigned NumPrints,
struct TstPrn_NumQuestions *NumTotalQsts, struct TstPrn_NumQuestions *NumTotalQsts,
double TotalScore) double TotalScore)
@ -2083,7 +2084,7 @@ static void TstPrn_ShowPrintsSummaryRow (bool ItsMe,
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
{ {
case Rol_STD: case Rol_STD:
ICanViewTotalScore = ItsMe && ICanViewTotalScore = MeOrOther == Usr_ME &&
TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ()); TstVis_IsVisibleTotalScore (TstCfg_GetConfigVisibility ());
break; break;
case Rol_NET: case Rol_NET:
@ -2091,7 +2092,7 @@ static void TstPrn_ShowPrintsSummaryRow (bool ItsMe,
case Rol_DEG_ADM: case Rol_DEG_ADM:
case Rol_CTR_ADM: case Rol_CTR_ADM:
case Rol_INS_ADM: case Rol_INS_ADM:
ICanViewTotalScore = ItsMe || ICanViewTotalScore = MeOrOther == Usr_ME ||
NumPrints; NumPrints;
break; break;
case Rol_SYS_ADM: case Rol_SYS_ADM:
@ -2414,7 +2415,7 @@ static void TstRes_CheckIfICanSeePrintResult (const struct TstPrn_Print *Print,
case Rol_STD: case Rol_STD:
// Depends on whether the print is sent or not // Depends on whether the print is sent or not
// if the print is not sent ==> I can not view results // if the print is not sent ==> I can not view results
ICanView->Result = Print->Sent && Usr_ItsMe (UsrCod); ICanView->Result = Print->Sent && Usr_ItsMe (UsrCod) == Usr_ME;
if (ICanView->Result) if (ICanView->Result)
// Depends on 5 visibility icons associated to tests // Depends on 5 visibility icons associated to tests
@ -2431,7 +2432,8 @@ static void TstRes_CheckIfICanSeePrintResult (const struct TstPrn_Print *Print,
// if the print is not sent ==> I can not view results // if the print is not sent ==> I can not view results
// if teachers are not allowed ==> I can not view results (except if the print is mine) // if teachers are not allowed ==> I can not view results (except if the print is mine)
ICanView->Result = ICanView->Result =
ICanView->Score = Print->Sent && (Print->AllowTeachers || Usr_ItsMe (UsrCod)); ICanView->Score = Print->Sent &&
(Print->AllowTeachers || Usr_ItsMe (UsrCod) == Usr_ME);
break; break;
case Rol_SYS_ADM: case Rol_SYS_ADM:
ICanView->Result = ICanView->Result =

View File

@ -26742,7 +26742,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Send teacher's photo and detect faces on it" // Çeviri lazim! "Send teacher's photo and detect faces on it" // Çeviri lazim!
#endif #endif
, ,
[ActUpdOthPho] = [ActChgOthPho] =
#if L==1 // ca #if L==1 // ca
"Update a user's photo" // Necessita traducció "Update a user's photo" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -26765,7 +26765,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Update a user's photo" // Çeviri lazim! "Update a user's photo" // Çeviri lazim!
#endif #endif
, ,
[ActUpdStdPho] = [ActChgStdPho] =
#if L==1 // ca #if L==1 // ca
"Update a student's photo" // Necessita traducció "Update a student's photo" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -26788,7 +26788,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Update a student's photo" // Çeviri lazim! "Update a student's photo" // Çeviri lazim!
#endif #endif
, ,
[ActUpdTchPho] = [ActChgTchPho] =
#if L==1 // ca #if L==1 // ca
"Update a teacher's photo" // Necessita traducció "Update a teacher's photo" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -27685,7 +27685,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Forms to the change a teacher's account" // Çeviri lazim! "Forms to the change a teacher's account" // Çeviri lazim!
#endif #endif
, ,
[ActRemOldNicOth] = [ActRemNicOth] =
#if L==1 // ca #if L==1 // ca
"Remove user's nickname" // Necessita traducció "Remove user's nickname" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -27708,7 +27708,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Remove user's nickname" // Çeviri lazim! "Remove user's nickname" // Çeviri lazim!
#endif #endif
, ,
[ActRemOldNicStd] = [ActRemNicStd] =
#if L==1 // ca #if L==1 // ca
"Remove student's nickname" // Necessita traducció "Remove student's nickname" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -27731,7 +27731,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Remove student's nickname" // Çeviri lazim! "Remove student's nickname" // Çeviri lazim!
#endif #endif
, ,
[ActRemOldNicTch] = [ActRemNicTch] =
#if L==1 // ca #if L==1 // ca
"Remove teacher's nickname" // Necessita traducció "Remove teacher's nickname" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -27892,7 +27892,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Remove teacher's ID" // Çeviri lazim! "Remove teacher's ID" // Çeviri lazim!
#endif #endif
, ,
[ActNewID_Oth] = [ActChgID_Oth] =
#if L==1 // ca #if L==1 // ca
"Create new user's ID" // Necessita traducció "Create new user's ID" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -27915,7 +27915,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Create new user's ID" // Çeviri lazim! "Create new user's ID" // Çeviri lazim!
#endif #endif
, ,
[ActNewID_Std] = [ActChgID_Std] =
#if L==1 // ca #if L==1 // ca
"Create new student's ID" // Necessita traducció "Create new student's ID" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -27938,7 +27938,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Create new student's ID" // Çeviri lazim! "Create new student's ID" // Çeviri lazim!
#endif #endif
, ,
[ActNewID_Tch] = [ActChgID_Tch] =
#if L==1 // ca #if L==1 // ca
"Create new teacher's ID" // Necessita traducció "Create new teacher's ID" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -28099,7 +28099,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Remove teacher's email" // Çeviri lazim! "Remove teacher's email" // Çeviri lazim!
#endif #endif
, ,
[ActNewMaiOth] = [ActChgMaiOth] =
#if L==1 // ca #if L==1 // ca
"Create new user's email" // Necessita traducció "Create new user's email" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -28122,7 +28122,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Create new user's email" // Çeviri lazim! "Create new user's email" // Çeviri lazim!
#endif #endif
, ,
[ActNewMaiStd] = [ActChgMaiStd] =
#if L==1 // ca #if L==1 // ca
"Create new student's email" // Necessita traducció "Create new student's email" // Necessita traducció
#elif L==2 // de #elif L==2 // de
@ -28145,7 +28145,7 @@ const char *Txt_Actions[ActLst_NUM_ACTIONS] =
"Create new student's email" // Çeviri lazim! "Create new student's email" // Çeviri lazim!
#endif #endif
, ,
[ActNewMaiTch] = [ActChgMaiTch] =
#if L==1 // ca #if L==1 // ca
"Create new teacher's email" // Necessita traducció "Create new teacher's email" // Necessita traducció
#elif L==2 // de #elif L==2 // de

View File

@ -427,7 +427,7 @@ static void Tml_ShowTimeline (struct Tml_Timeline *Timeline,
TmlWho_PutFormWho (Timeline); TmlWho_PutFormWho (Timeline);
/***** Form to write a new post *****/ /***** Form to write a new post *****/
if (GlobalTimeline || Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod)) if (GlobalTimeline || Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod) == Usr_ME)
TmlPst_PutPhotoAndFormToWriteNewPost (Timeline); TmlPst_PutPhotoAndFormToWriteNewPost (Timeline);
/***** New publications refreshed dynamically via AJAX *****/ /***** New publications refreshed dynamically via AJAX *****/

View File

@ -615,6 +615,11 @@ static void TmlCom_WriteAuthorName (const struct Usr_Data *UsrDat) // Author
{ {
extern const char *Txt_My_public_profile; extern const char *Txt_My_public_profile;
extern const char *Txt_Another_user_s_profile; extern const char *Txt_Another_user_s_profile;
const char *Title[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_My_public_profile,
[Usr_OTHER] = Txt_Another_user_s_profile,
};
/***** Show user's name inside form to go to user's public profile *****/ /***** Show user's name inside form to go to user's public profile *****/
/* Begin form */ /* Begin form */
@ -622,8 +627,7 @@ static void TmlCom_WriteAuthorName (const struct Usr_Data *UsrDat) // Author
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod); Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
/* Author's name */ /* Author's name */
HTM_BUTTON_Submit_Begin (Usr_ItsMe (UsrDat->UsrCod) ? Txt_My_public_profile : HTM_BUTTON_Submit_Begin (Title[Usr_ItsMe (UsrDat->UsrCod)],
Txt_Another_user_s_profile,
"class=\"Tml_COM_AUTHOR Tml_COM_AUTHOR_WIDTH BT_LINK DAT_%s BOLD\"", "class=\"Tml_COM_AUTHOR Tml_COM_AUTHOR_WIDTH BT_LINK DAT_%s BOLD\"",
The_GetSuffix ()); The_GetSuffix ());
HTM_Txt (UsrDat->FullName); HTM_Txt (UsrDat->FullName);
@ -678,7 +682,7 @@ static void TmlCom_WriteButtons (const struct Tml_Timeline *Timeline,
/***** Foot column 2: icon to remove this comment *****/ /***** Foot column 2: icon to remove this comment *****/
HTM_DIV_Begin ("class=\"Tml_REM\""); HTM_DIV_Begin ("class=\"Tml_REM\"");
if (Usr_ItsMe (UsrDat->UsrCod)) // I am the author if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) // I am the author
TmlCom_PutFormToRemoveComm (Timeline,Com->PubCod); TmlCom_PutFormToRemoveComm (Timeline,Com->PubCod);
HTM_DIV_End (); HTM_DIV_End ();
@ -990,8 +994,8 @@ static void TmlCom_RemoveComm (void)
return; return;
} }
/***** Trivial check 2: only if I am the author of this comment *****/ /***** Trivial check 2: only if I am the author of this comment? *****/
if (!Usr_ItsMe (Com.UsrCod)) if (Usr_ItsMe (Com.UsrCod) == Usr_OTHER)
{ {
Med_MediaDestructor (&Com.Content.Media); Med_MediaDestructor (&Com.Content.Media);
Err_NoPermission (); Err_NoPermission ();

View File

@ -351,6 +351,11 @@ void TmlNot_WriteAuthorName (const struct Usr_Data *UsrDat,
{ {
extern const char *Txt_My_public_profile; extern const char *Txt_My_public_profile;
extern const char *Txt_Another_user_s_profile; extern const char *Txt_Another_user_s_profile;
const char *Title[Usr_NUM_ME_OR_OTHER] =
{
[Usr_ME ] = Txt_My_public_profile,
[Usr_OTHER] = Txt_Another_user_s_profile,
};
/***** Show user's name inside form to go to user's public profile *****/ /***** Show user's name inside form to go to user's public profile *****/
/* Begin form */ /* Begin form */
@ -358,8 +363,7 @@ void TmlNot_WriteAuthorName (const struct Usr_Data *UsrDat,
Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod); Usr_PutParUsrCodEncrypted (UsrDat->EnUsrCod);
/* Author's name */ /* Author's name */
HTM_BUTTON_Submit_Begin (Usr_ItsMe (UsrDat->UsrCod) ? Txt_My_public_profile : HTM_BUTTON_Submit_Begin (Title[Usr_ItsMe (UsrDat->UsrCod)],
Txt_Another_user_s_profile,
"class=\"%s\"",Class); "class=\"%s\"",Class);
HTM_Txt (UsrDat->FullName); HTM_Txt (UsrDat->FullName);
HTM_BUTTON_End (); HTM_BUTTON_End ();
@ -847,7 +851,7 @@ static void TmlNot_WriteFavShaRem (const struct Tml_Timeline *Timeline,
/***** Foot column 3: icon to remove this note *****/ /***** Foot column 3: icon to remove this note *****/
HTM_DIV_Begin ("class=\"Tml_REM\""); HTM_DIV_Begin ("class=\"Tml_REM\"");
if (Usr_ItsMe (UsrDat->UsrCod)) // I am the author if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME) // I am the author
TmlNot_PutFormToRemoveNote (Timeline,Not->NotCod); TmlNot_PutFormToRemoveNote (Timeline,Not->NotCod);
HTM_DIV_End (); HTM_DIV_End ();
@ -1115,8 +1119,8 @@ static void TmlNot_RemoveNote (void)
return; return;
} }
/***** Trivial check 2: Am I the author of this note *****/ /***** Trivial check 2: Am I the author of this note? *****/
if (!Usr_ItsMe (Not.UsrCod)) if (Usr_ItsMe (Not.UsrCod) == Usr_OTHER)
{ {
Err_NoPermission (); Err_NoPermission ();
return; return;

View File

@ -292,10 +292,16 @@ void TmlUsr_PutIconFavSha (TmlUsr_FavSha_t FavSha,
HTM_DIV_Begin ("class=\"Tml_ICO\""); HTM_DIV_Begin ("class=\"Tml_ICO\"");
/* Icon to fav/unfav or share/unshare this note/comment */ /* Icon to fav/unfav or share/unshare this note/comment */
if (Usr_ItsMe (UsrCod)) // I am the author ==> I can not fav/unfav or share/unshare switch (Usr_ItsMe (UsrCod))
TmlUsr_PutDisabledIconFavSha (FavSha,NumUsrs); {
else // I am not the author case Usr_ME: // I am the author ==> I can not fav/unfav or share/unshare
TmlFrm_PutFormToFavUnfShaUns (FavSha,Cod); TmlUsr_PutDisabledIconFavSha (FavSha,NumUsrs);
break;
case Usr_OTHER: // I am not the author
default:
TmlFrm_PutFormToFavUnfShaUns (FavSha,Cod);
break;
}
/* End container */ /* End container */
HTM_DIV_End (); HTM_DIV_End ();
@ -385,7 +391,7 @@ bool TmlUsr_CheckIfICanFavSha (long Cod,long UsrCod)
/***** Trivial check 2: I must be logged /***** Trivial check 2: I must be logged
I can not fav/share my own notes/comments *****/ I can not fav/share my own notes/comments *****/
if (!Gbl.Usrs.Me.Logged || Usr_ItsMe (UsrCod)) if (!Gbl.Usrs.Me.Logged || Usr_ItsMe (UsrCod) == Usr_ME)
{ {
Err_NoPermission (); Err_NoPermission ();
return false; return false;
@ -411,7 +417,7 @@ bool TmlUsr_CheckIfICanRemove (long Cod,long UsrCod)
/***** Trivial check 2: I must be logged /***** Trivial check 2: I must be logged
I can only remove my own notes/comments *****/ I can only remove my own notes/comments *****/
if (!Gbl.Usrs.Me.Logged || !Usr_ItsMe (UsrCod)) if (!Gbl.Usrs.Me.Logged || Usr_ItsMe (UsrCod) == Usr_OTHER)
{ {
Err_NoPermission (); Err_NoPermission ();
return false; return false;

View File

@ -426,10 +426,11 @@ void Usr_FreeListUsrCods (struct Usr_ListUsrCods *ListUsrCods)
/************************ Check if I am a given user *************************/ /************************ Check if I am a given user *************************/
/*****************************************************************************/ /*****************************************************************************/
bool Usr_ItsMe (long UsrCod) Usr_MeOrOther_t Usr_ItsMe (long UsrCod)
{ {
return Gbl.Usrs.Me.Logged && return (Gbl.Usrs.Me.Logged &&
(UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod); UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) ? Usr_ME :
Usr_OTHER;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -768,7 +769,7 @@ bool Usr_CheckIfUsrIsSuperuser (long UsrCod)
bool Usr_ICanChangeOtherUsrData (const struct Usr_Data *UsrDat) bool Usr_ICanChangeOtherUsrData (const struct Usr_Data *UsrDat)
{ {
/***** I can change my data *****/ /***** I can change my data *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** Check if I have permission to see another user's IDs *****/ /***** Check if I have permission to see another user's IDs *****/
@ -801,7 +802,7 @@ bool Usr_ICanChangeOtherUsrData (const struct Usr_Data *UsrDat)
bool Usr_ICanEditOtherUsr (const struct Usr_Data *UsrDat) bool Usr_ICanEditOtherUsr (const struct Usr_Data *UsrDat)
{ {
/***** I can edit me *****/ /***** I can edit me *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
switch (Gbl.Usrs.Me.Role.Logged) switch (Gbl.Usrs.Me.Role.Logged)
@ -868,7 +869,7 @@ bool Usr_CheckIfICanViewRecordStd (const struct Usr_Data *UsrDat)
return false; return false;
/***** 7. Fast check: It's me? *****/ /***** 7. Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** 8. Fast / slow check: Does he/she belong to the current course? *****/ /***** 8. Fast / slow check: Does he/she belong to the current course? *****/
@ -941,7 +942,7 @@ bool Usr_CheckIfICanViewTstExaMchResult (const struct Usr_Data *UsrDat)
return false; return false;
/***** 6. Fast check: It's me? *****/ /***** 6. Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** 7. Fast check: Does he/she belong to the current course? *****/ /***** 7. Fast check: Does he/she belong to the current course? *****/
@ -992,7 +993,7 @@ bool Usr_CheckIfICanViewAsgWrk (const struct Usr_Data *UsrDat)
return false; return false;
/***** 7. Fast check: It's me? *****/ /***** 7. Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** 8. Fast / slow check depending on roles *****/ /***** 8. Fast / slow check depending on roles *****/
@ -1034,7 +1035,7 @@ bool Usr_CheckIfICanViewAtt (const struct Usr_Data *UsrDat)
return false; return false;
/***** 6. Fast check: It's me? *****/ /***** 6. Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** 7. Fast / slow check depending on roles *****/ /***** 7. Fast / slow check depending on roles *****/
@ -1060,7 +1061,7 @@ bool Usr_CheckIfICanViewUsrAgenda (struct Usr_Data *UsrDat)
return false; return false;
/***** 2. Fast check: It's me? *****/ /***** 2. Fast check: It's me? *****/
if (Usr_ItsMe (UsrDat->UsrCod)) if (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME)
return true; return true;
/***** 3. Fast check: Am I logged as system admin? *****/ /***** 3. Fast check: Am I logged as system admin? *****/
@ -2466,7 +2467,7 @@ static void Usr_WriteRowTchAllData (struct Usr_Data *UsrDat)
struct Ins_Instit Ins; struct Ins_Instit Ins;
struct Ctr_Center Ctr; struct Ctr_Center Ctr;
struct Dpt_Department Dpt; struct Dpt_Department Dpt;
bool ShowData = (Usr_ItsMe (UsrDat->UsrCod) || UsrDat->Accepted || bool ShowData = (Usr_ItsMe (UsrDat->UsrCod) == Usr_ME || UsrDat->Accepted ||
Gbl.Usrs.Me.Role.Logged == Rol_DEG_ADM || Gbl.Usrs.Me.Role.Logged == Rol_DEG_ADM ||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);

View File

@ -137,6 +137,7 @@ typedef enum
} Usr_ListUsrsOption_t; } Usr_ListUsrsOption_t;
#define Usr_LIST_USRS_DEFAULT_OPTION Usr_OPTION_RECORDS #define Usr_LIST_USRS_DEFAULT_OPTION Usr_OPTION_RECORDS
#define Usr_NUM_ME_OR_OTHER 2
typedef enum typedef enum
{ {
Usr_ME, Usr_ME,
@ -287,7 +288,7 @@ void Usr_GetAllUsrDataFromUsrCod (struct Usr_Data *UsrDat,
Usr_GetRoleInCurrentCrs_t GetRoleInCurrentCrs); Usr_GetRoleInCurrentCrs_t GetRoleInCurrentCrs);
void Usr_AllocateListUsrCods (struct Usr_ListUsrCods *ListUsrCods); void Usr_AllocateListUsrCods (struct Usr_ListUsrCods *ListUsrCods);
void Usr_FreeListUsrCods (struct Usr_ListUsrCods *ListUsrCods); void Usr_FreeListUsrCods (struct Usr_ListUsrCods *ListUsrCods);
bool Usr_ItsMe (long UsrCod); Usr_MeOrOther_t Usr_ItsMe (long UsrCod);
void Usr_GetUsrCodFromEncryptedUsrCod (struct Usr_Data *UsrDat); void Usr_GetUsrCodFromEncryptedUsrCod (struct Usr_Data *UsrDat);
void Usr_GetUsrDataFromUsrCod (struct Usr_Data *UsrDat, void Usr_GetUsrDataFromUsrCod (struct Usr_Data *UsrDat,
Usr_GetPrefs_t GetPrefs, Usr_GetPrefs_t GetPrefs,