Version 16.209

This commit is contained in:
Antonio Cañas Vargas 2017-05-09 20:56:02 +02:00
parent 749c36c333
commit 2e70dadb76
32 changed files with 387 additions and 313 deletions

183
swad_ID.c
View File

@ -54,12 +54,6 @@ extern struct Globals Gbl;
/******************************* Private types *******************************/ /******************************* Private types *******************************/
/*****************************************************************************/ /*****************************************************************************/
typedef enum
{
ID_REQUEST_CONFIRM_ID,
ID_CONFIRM_ID,
} ID_ReqConfOrConfID_t;
/*****************************************************************************/ /*****************************************************************************/
/***************************** Private variables *****************************/ /***************************** Private variables *****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -70,9 +64,8 @@ typedef enum
static bool ID_CheckIfUsrIDIsValidUsingMinDigits (const char *UsrID,unsigned MinDigits); static bool ID_CheckIfUsrIDIsValidUsingMinDigits (const char *UsrID,unsigned MinDigits);
static void ID_PutLinkToReqConfirmID (struct UsrData *UsrDat,unsigned NumID); static void ID_PutLinkToConfirmID (struct UsrData *UsrDat,unsigned NumID,
static void ID_PutButtonToConfirmID (unsigned NumID); const char *Anchor);
static void ID_PutParamsConfirmID (void);
static void ID_RemoveUsrID (const struct UsrData *UsrDat,bool ItsMe); static void ID_RemoveUsrID (const struct UsrData *UsrDat,bool ItsMe);
static bool ID_CheckIfConfirmed (long UsrCod,const char *UsrID); static bool ID_CheckIfConfirmed (long UsrCod,const char *UsrID);
@ -80,8 +73,6 @@ static void ID_RemoveUsrIDFromDB (long UsrCod,const char *UsrID);
static void ID_NewUsrID (const struct UsrData *UsrDat,bool ItsMe); static void ID_NewUsrID (const struct UsrData *UsrDat,bool ItsMe);
static void ID_InsertANewUsrIDInDB (long UsrCod,const char *NewID,bool Confirmed); static void ID_InsertANewUsrIDInDB (long UsrCod,const char *NewID,bool Confirmed);
static void ID_ReqConfOrConfOtherUsrID (ID_ReqConfOrConfID_t ReqConfOrConfID);
/*****************************************************************************/ /*****************************************************************************/
/********************** Get list of IDs of a user ****************************/ /********************** Get list of IDs of a user ****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -368,7 +359,7 @@ static bool ID_CheckIfUsrIDIsValidUsingMinDigits (const char *UsrID,unsigned Min
/*************************** Write list of user's ID *************************/ /*************************** Write list of user's ID *************************/
/*****************************************************************************/ /*****************************************************************************/
void ID_WriteUsrIDs (struct UsrData *UsrDat) void ID_WriteUsrIDs (struct UsrData *UsrDat,const char *Anchor)
{ {
extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS]; extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS];
unsigned NumID; unsigned NumID;
@ -399,7 +390,7 @@ void ID_WriteUsrIDs (struct UsrData *UsrDat)
if (ICanConfirmUsrID && if (ICanConfirmUsrID &&
!UsrDat->IDs.List[NumID].Confirmed) !UsrDat->IDs.List[NumID].Confirmed)
ID_PutLinkToReqConfirmID (UsrDat,NumID); ID_PutLinkToConfirmID (UsrDat,NumID,Anchor);
} }
} }
@ -448,55 +439,49 @@ bool ID_ICanSeeOtherUsrIDs (const struct UsrData *UsrDat)
} }
/*****************************************************************************/ /*****************************************************************************/
/******** Put a link to request the confirmation of another user's ID ********/ /****************** Put a link to confirm of another user's ID ***************/
/*****************************************************************************/ /*****************************************************************************/
static void ID_PutLinkToReqConfirmID (struct UsrData *UsrDat,unsigned NumID) static void ID_PutLinkToConfirmID (struct UsrData *UsrDat,unsigned NumID,
const char *Anchor)
{ {
extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS];
extern const char *The_ClassFormBold[The_NUM_THEMES]; extern const char *The_ClassFormBold[The_NUM_THEMES];
extern const char *Txt_Confirm_ID; extern const char *Txt_Confirm_ID;
Act_FormStart ( UsrDat->RoleInCurrentCrsDB == Rol_STUDENT ? ActReqCnfID_Std : /***** Start form *****/
(UsrDat->RoleInCurrentCrsDB == Rol_TEACHER ? ActReqCnfID_Tch : Act_FormStartAnchor ( UsrDat->RoleInCurrentCrsDB == Rol_STUDENT ? ActCnfID_Std :
ActReqCnfID_Oth)); // Guest, visitor or admin (UsrDat->RoleInCurrentCrsDB == Rol_TEACHER ? ActCnfID_Tch :
ActCnfID_Oth),
Anchor);
if (Gbl.Action.Original != ActUnk)
{
Par_PutHiddenParamLong ("OriginalActCod",Act_Actions[Gbl.Action.Original].ActCod); // Original action, used to know where we came from
switch (Gbl.Action.Original)
{
case ActSeeRecSevGst:
Usr_PutHiddenParUsrCodAll (ActCnfID_Oth,Gbl.Usrs.Select.All);
break;
case ActSeeRecSevStd:
Usr_PutHiddenParUsrCodAll (ActCnfID_Std,Gbl.Usrs.Select.All);
break;
case ActSeeRecSevTch:
Usr_PutHiddenParUsrCodAll (ActCnfID_Tch,Gbl.Usrs.Select.All);
break;
}
}
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod); Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
fprintf (Gbl.F.Out,"<input type=\"hidden\" name=\"UsrID\" value=\"%s\" />", fprintf (Gbl.F.Out,"<input type=\"hidden\" name=\"UsrID\" value=\"%s\" />",
UsrDat->IDs.List[NumID].ID); UsrDat->IDs.List[NumID].ID);
/***** Put link *****/
Lay_PutIconLink ("ok_on16x16.gif",Txt_Confirm_ID,Txt_Confirm_ID, Lay_PutIconLink ("ok_on16x16.gif",Txt_Confirm_ID,Txt_Confirm_ID,
The_ClassFormBold[Gbl.Prefs.Theme],NULL); The_ClassFormBold[Gbl.Prefs.Theme],NULL);
/***** End form *****/
Act_FormEnd (); Act_FormEnd ();
} }
/*****************************************************************************/
/**************** Put a button to confirm another user's ID ******************/
/*****************************************************************************/
static void ID_PutButtonToConfirmID (unsigned NumID)
{
extern const char *Txt_Do_you_want_to_confirm_the_ID_X;
extern const char *Txt_Confirm_ID;
Gbl.Usrs.Other.NumIDToConfirm = NumID;
/***** Ask for confirmation *****/
sprintf (Gbl.Title,Txt_Do_you_want_to_confirm_the_ID_X,
Gbl.Usrs.Other.UsrDat.IDs.List[NumID].ID);
Lay_ShowAlertAndButton1 (Lay_QUESTION,Gbl.Title);
Lay_ShowAlertAndButton2 ( Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_STUDENT ? ActCnfID_Std :
(Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_TEACHER ? ActCnfID_Tch :
ActCnfID_Oth), // Guest, visitor or admin
NULL,
ID_PutParamsConfirmID,
Lay_CREATE_BUTTON,Txt_Confirm_ID);
}
static void ID_PutParamsConfirmID (void)
{
Usr_PutParamOtherUsrCodEncrypted ();
fprintf (Gbl.F.Out,"<input type=\"hidden\" name=\"UsrID\" value=\"%s\" />",
Gbl.Usrs.Other.UsrDat.IDs.List[Gbl.Usrs.Other.NumIDToConfirm].ID);
}
/*****************************************************************************/ /*****************************************************************************/
/*********** Put a link to the action used to request user's IDs *************/ /*********** Put a link to the action used to request user's IDs *************/
/*****************************************************************************/ /*****************************************************************************/
@ -539,7 +524,8 @@ void ID_ShowFormOthIDs (void)
Lay_StartRoundFrame (NULL,Txt_ID,NULL,NULL); Lay_StartRoundFrame (NULL,Txt_ID,NULL,NULL);
/***** Show user's record *****/ /***** Show user's record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
&Gbl.Usrs.Other.UsrDat,NULL);
/***** Form with the user's ID *****/ /***** Form with the user's ID *****/
Lay_StartTableWide (2); Lay_StartTableWide (2);
@ -719,7 +705,8 @@ void ID_RemoveOtherUsrID (void)
ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat); ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat);
/***** Show user's record *****/ /***** Show user's record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
&Gbl.Usrs.Other.UsrDat,NULL);
} }
else // User not found else // User not found
Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);
@ -834,7 +821,8 @@ void ID_NewOtherUsrID (void)
ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat); ID_GetListIDsFromUsrCod (&Gbl.Usrs.Other.UsrDat);
/***** Show user's record *****/ /***** Show user's record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
&Gbl.Usrs.Other.UsrDat,NULL);
} }
else // User not found else // User not found
Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);
@ -945,39 +933,29 @@ static void ID_InsertANewUsrIDInDB (long UsrCod,const char *NewID,bool Confirmed
DB_QueryINSERT (Query,"can not insert a new ID"); DB_QueryINSERT (Query,"can not insert a new ID");
} }
/*****************************************************************************/
/*************** Request the confirmation of another user's ID ***************/
/*****************************************************************************/
void ID_RequestConfirmOtherUsrID (void)
{
ID_ReqConfOrConfOtherUsrID (ID_REQUEST_CONFIRM_ID);
}
/*****************************************************************************/ /*****************************************************************************/
/************************ Confirm another user's ID **************************/ /************************ Confirm another user's ID **************************/
/*****************************************************************************/ /*****************************************************************************/
void ID_ConfirmOtherUsrID (void) void ID_ConfirmOtherUsrID (void)
{
ID_ReqConfOrConfOtherUsrID (ID_CONFIRM_ID);
}
/*****************************************************************************/
/********** Request the confirmation or confirm another user's ID ************/
/*****************************************************************************/
static void ID_ReqConfOrConfOtherUsrID (ID_ReqConfOrConfID_t ReqConfOrConfID)
{ {
extern const char *Txt_ID_X_had_already_been_confirmed; extern const char *Txt_ID_X_had_already_been_confirmed;
extern const char *Txt_The_ID_X_has_been_confirmed; extern const char *Txt_The_ID_X_has_been_confirmed;
extern const char *Txt_User_not_found_or_you_do_not_have_permission_; extern const char *Txt_User_not_found_or_you_do_not_have_permission_;
long OriginalActCod;
char UsrID[ID_MAX_BYTES_USR_ID + 1]; char UsrID[ID_MAX_BYTES_USR_ID + 1];
bool ICanConfirm; bool ICanConfirm;
bool Found; bool Found;
unsigned NumID; unsigned NumID;
unsigned NumIDFound = 0; // Initialized to avoid warning unsigned NumIDFound = 0; // Initialized to avoid warning
/***** Initialize alert type and message *****/
Gbl.AlertType = Lay_NONE; // Do not show alert
/***** Get where we came from *****/
OriginalActCod = Par_GetParToLong ("OriginalActCod");
Gbl.Action.Original = Act_GetActionFromActCod (OriginalActCod);
/***** 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_GetParamOtherUsrCodEncryptedAndGetUsrData ()) if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
@ -1007,40 +985,59 @@ static void ID_ReqConfOrConfOtherUsrID (ID_ReqConfOrConfID_t ReqConfOrConfID)
if (Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].Confirmed) if (Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].Confirmed)
{ {
/***** ID found and already confirmed *****/ /***** ID found and already confirmed *****/
Gbl.AlertType = Lay_INFO;
sprintf (Gbl.Message,Txt_ID_X_had_already_been_confirmed, sprintf (Gbl.Message,Txt_ID_X_had_already_been_confirmed,
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID); Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID);
Lay_ShowAlert (Lay_INFO,Gbl.Message);
} }
else else
{ {
switch (ReqConfOrConfID) /***** Mark this ID as confirmed *****/
{ ID_ConfirmUsrID (&Gbl.Usrs.Other.UsrDat,
case ID_REQUEST_CONFIRM_ID: // Ask if confirm ID Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID);
/***** Put button to confirm ID *****/ Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].Confirmed = true;
ID_PutButtonToConfirmID (NumIDFound);
break;
case ID_CONFIRM_ID: // Confirm ID
/***** Mark this ID as confirmed *****/
ID_ConfirmUsrID (&Gbl.Usrs.Other.UsrDat,
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID);
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].Confirmed = true;
/***** Write success message *****/ /***** Write success message *****/
sprintf (Gbl.Message,Txt_The_ID_X_has_been_confirmed, Gbl.AlertType = Lay_SUCCESS;
Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID); sprintf (Gbl.Message,Txt_The_ID_X_has_been_confirmed,
Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); Gbl.Usrs.Other.UsrDat.IDs.List[NumIDFound].ID);
break;
}
} }
} }
else // User's ID not found else // User's ID not found
Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); {
Gbl.AlertType = Lay_WARNING;
/***** Show user's record *****/ sprintf (Gbl.Message,"%s",Txt_User_not_found_or_you_do_not_have_permission_);
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat); }
}
else // I can not confirm
{
Gbl.AlertType = Lay_WARNING;
sprintf (Gbl.Message,"%s",Txt_User_not_found_or_you_do_not_have_permission_);
}
/***** Show one or multiple records *****/
switch (Gbl.Action.Original)
{
case ActSeeRecSevGst:
/* Show multiple records of guests again (including the updated one) */
Rec_ListRecordsGstsShow ();
break;
case ActSeeRecSevStd:
/* Show multiple records of students again (including the updated one) */
Rec_ListRecordsStdsShow ();
break;
case ActSeeRecSevTch:
/* Show multiple records of teachers again (including the updated one) */
Rec_ListRecordsTchsShow ();
break;
default:
/* Show optional alert */
Lay_ShowPendingAlert ();
/* Show only the updated record of this user */
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
&Gbl.Usrs.Other.UsrDat,NULL);
break;
} }
else // User not found
Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -69,7 +69,7 @@ void ID_GetParamOtherUsrIDPlain (void);
bool ID_CheckIfUsrIDIsValid (const char *UsrID); bool ID_CheckIfUsrIDIsValid (const char *UsrID);
bool ID_CheckIfUsrIDSeemsAValidID (const char *UsrID); bool ID_CheckIfUsrIDSeemsAValidID (const char *UsrID);
void ID_WriteUsrIDs (struct UsrData *UsrDat); void ID_WriteUsrIDs (struct UsrData *UsrDat,const char *Anchor);
bool ID_ICanSeeOtherUsrIDs (const struct UsrData *UsrDat); bool ID_ICanSeeOtherUsrIDs (const struct UsrData *UsrDat);
void ID_PutLinkToChangeUsrIDs (void); void ID_PutLinkToChangeUsrIDs (void);
@ -80,7 +80,6 @@ void ID_RemoveOtherUsrID (void);
void ID_NewMyUsrID (void); void ID_NewMyUsrID (void);
void ID_NewOtherUsrID (void); void ID_NewOtherUsrID (void);
void ID_RequestConfirmOtherUsrID (void);
void ID_ConfirmOtherUsrID (void); void ID_ConfirmOtherUsrID (void);
void ID_ConfirmUsrID (const struct UsrData *UsrDat,const char *UsrID); void ID_ConfirmUsrID (const struct UsrData *UsrDat,const char *UsrID);

View File

@ -1079,9 +1079,6 @@ Users:
884. ActRcvFrmEnrSevStd Receive a form with IDs of users to be registeres/removed to/from current course 884. ActRcvFrmEnrSevStd Receive a form with IDs of users to be registeres/removed to/from current course
885. ActRcvFrmEnrSevTch Receive a form with IDs of users to be registeres/removed to/from current course 885. ActRcvFrmEnrSevTch Receive a form with IDs of users to be registeres/removed to/from current course
886. ActReqCnfID_Oth Request the confirmation of another user's ID
887. ActReqCnfID_Std Request the confirmation of another user's ID
888. ActReqCnfID_Tch Request the confirmation of another user's ID
889. ActCnfID_Oth Confirm another user's ID 889. ActCnfID_Oth Confirm another user's ID
890. ActCnfID_Std Confirm another user's ID 890. ActCnfID_Std Confirm another user's ID
891. ActCnfID_Tch Confirm another user's ID 891. ActCnfID_Tch Confirm another user's ID
@ -2453,12 +2450,12 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActSeeRecOneStd */{1174,-1,TabUnk,ActLstStd ,0x118,0x100, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_GetUsrAndShowRecordOneStdCrs,NULL}, /* ActSeeRecOneStd */{1174,-1,TabUnk,ActLstStd ,0x118,0x100, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_GetUsrAndShowRecordOneStdCrs,NULL},
/* ActSeeRecOneTch */{1175,-1,TabUnk,ActLstTch ,0x1FC,0x1FC,0x1FC,0x1FC,0x1FC,0x1FC,0x1FC,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_GetUsrAndShowRecordOneTchCrs,NULL}, /* ActSeeRecOneTch */{1175,-1,TabUnk,ActLstTch ,0x1FC,0x1FC,0x1FC,0x1FC,0x1FC,0x1FC,0x1FC,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_GetUsrAndShowRecordOneTchCrs,NULL},
/* ActSeeRecSevGst */{1187,-1,TabUnk,ActLstOth ,0x100,0x100,0x100,0x100,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ListRecordsGsts ,NULL}, /* ActSeeRecSevGst */{1187,-1,TabUnk,ActLstOth ,0x100,0x100,0x100,0x100,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ListRecordsGstsShow ,NULL},
/* ActSeeRecSevStd */{ 89,-1,TabUnk,ActLstStd ,0x118,0x100, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ListRecordsStdsForEdit ,NULL}, /* ActSeeRecSevStd */{ 89,-1,TabUnk,ActLstStd ,0x118,0x100, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ListRecordsStdsShow ,NULL},
/* ActSeeRecSevTch */{ 22,-1,TabUnk,ActLstTch ,0x1FF,0x1FF, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ListRecordsTchs ,NULL}, /* ActSeeRecSevTch */{ 22,-1,TabUnk,ActLstTch ,0x1FF,0x1FF, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ListRecordsTchsShow ,NULL},
/* ActPrnRecSevGst */{1188,-1,TabUnk,ActLstOth ,0x100,0x100,0x100,0x100,0x100,0x100,0x100,Act_CONT_NORM,Act_BLNK_WINDOW,NULL ,Rec_ListRecordsGsts ,NULL}, /* ActPrnRecSevGst */{1188,-1,TabUnk,ActLstOth ,0x100,0x100,0x100,0x100,0x100,0x100,0x100,Act_CONT_NORM,Act_BLNK_WINDOW,NULL ,Rec_ListRecordsGstsPrint ,NULL},
/* ActPrnRecSevStd */{ 111,-1,TabUnk,ActLstStd ,0x118,0x100, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BLNK_WINDOW,NULL ,Rec_ListRecordsStdsForPrint ,NULL}, /* ActPrnRecSevStd */{ 111,-1,TabUnk,ActLstStd ,0x118,0x100, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BLNK_WINDOW,NULL ,Rec_ListRecordsStdsPrint ,NULL},
/* ActPrnRecSevTch */{ 127,-1,TabUnk,ActLstTch ,0x1FF,0x1FF, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BLNK_WINDOW,NULL ,Rec_ListRecordsTchs ,NULL}, /* ActPrnRecSevTch */{ 127,-1,TabUnk,ActLstTch ,0x1FF,0x1FF, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BLNK_WINDOW,NULL ,Rec_ListRecordsTchsPrint ,NULL},
/* ActRcvRecOthUsr */{ 300,-1,TabUnk,ActLstStd ,0x110,0x100, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_UpdateAndShowOtherCrsRecord,NULL}, /* ActRcvRecOthUsr */{ 300,-1,TabUnk,ActLstStd ,0x110,0x100, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_UpdateAndShowOtherCrsRecord,NULL},
/* ActEdiRecFie */{ 292,-1,TabUnk,ActLstStd ,0x110,0x100, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ReqEditRecordFields ,NULL}, /* ActEdiRecFie */{ 292,-1,TabUnk,ActLstStd ,0x110,0x100, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ReqEditRecordFields ,NULL},
@ -2554,9 +2551,6 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActRcvFrmEnrSevStd*/{1428,-1,TabUnk,ActLstStd ,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Enr_ReceiveFormAdminStds ,NULL}, /* ActRcvFrmEnrSevStd*/{1428,-1,TabUnk,ActLstStd ,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Enr_ReceiveFormAdminStds ,NULL},
/* ActRcvFrmEnrSevTch*/{1429,-1,TabUnk,ActLstTch ,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Enr_ReceiveFormAdminTchs ,NULL}, /* ActRcvFrmEnrSevTch*/{1429,-1,TabUnk,ActLstTch ,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,0x1FE,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Enr_ReceiveFormAdminTchs ,NULL},
/* ActReqCnfID_Oth */{1565,-1,TabUnk,ActLstOth ,0x1F0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,ID_RequestConfirmOtherUsrID ,NULL},
/* ActReqCnfID_Std */{1566,-1,TabUnk,ActLstStd ,0x1F0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,ID_RequestConfirmOtherUsrID ,NULL},
/* ActReqCnfID_Tch */{1567,-1,TabUnk,ActLstTch ,0x1F0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,ID_RequestConfirmOtherUsrID ,NULL},
/* ActCnfID_Oth */{1568,-1,TabUnk,ActLstOth ,0x1F0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,ID_ConfirmOtherUsrID ,NULL}, /* ActCnfID_Oth */{1568,-1,TabUnk,ActLstOth ,0x1F0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,ID_ConfirmOtherUsrID ,NULL},
/* ActCnfID_Std */{1569,-1,TabUnk,ActLstStd ,0x1F0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,ID_ConfirmOtherUsrID ,NULL}, /* ActCnfID_Std */{1569,-1,TabUnk,ActLstStd ,0x1F0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,ID_ConfirmOtherUsrID ,NULL},
/* ActCnfID_Tch */{1570,-1,TabUnk,ActLstTch ,0x1F0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,ID_ConfirmOtherUsrID ,NULL}, /* ActCnfID_Tch */{1570,-1,TabUnk,ActLstTch ,0x1F0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,0x1E0,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,ID_ConfirmOtherUsrID ,NULL},
@ -4555,9 +4549,9 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActReqDatTchGrp, // #1562 ActReqDatTchGrp, // #1562
ActChgDatTchGrp, // #1563 ActChgDatTchGrp, // #1563
ActDowTchGrp, // #1564 ActDowTchGrp, // #1564
ActReqCnfID_Oth, // #1565 -1, // #1565 (obsolete action)
ActReqCnfID_Std, // #1566 -1, // #1566 (obsolete action)
ActReqCnfID_Tch, // #1567 -1, // #1567 (obsolete action)
ActCnfID_Oth, // #1568 ActCnfID_Oth, // #1568
ActCnfID_Std, // #1569 ActCnfID_Std, // #1569
ActCnfID_Tch, // #1570 ActCnfID_Tch, // #1570
@ -4638,6 +4632,18 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
static void Act_FormStartInternal (Act_Action_t NextAction,bool PutParameterLocationIfNoSesion, static void Act_FormStartInternal (Act_Action_t NextAction,bool PutParameterLocationIfNoSesion,
const char *Id,const char *Anchor,const char *OnSubmit); const char *Id,const char *Anchor,const char *OnSubmit);
/*****************************************************************************/
/****************** Get action from permanent action code ********************/
/*****************************************************************************/
Act_Action_t Act_GetActionFromActCod (long ActCod)
{
if (ActCod >= 0 && ActCod <= Act_MAX_ACTION_COD)
return Act_FromActCodToAction[ActCod];
return ActUnk;
}
/*****************************************************************************/ /*****************************************************************************/
/************* Check if I have permission to execute an action ***************/ /************* Check if I have permission to execute an action ***************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -57,7 +57,7 @@ typedef enum
typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_NUM_ACTIONS (1 + 9 + 43 + 17 + 47 + 32 + 24 + 115 + 72 + 416 + 159 + 172 + 42 + 14 + 97) #define Act_NUM_ACTIONS (1 + 9 + 43 + 17 + 47 + 32 + 24 + 115 + 72 + 416 + 156 + 172 + 42 + 14 + 97)
#define Act_MAX_ACTION_COD 1638 #define Act_MAX_ACTION_COD 1638
@ -1096,53 +1096,50 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActRcvFrmEnrSevStd (ActChgNumRowFooGrp + 117) #define ActRcvFrmEnrSevStd (ActChgNumRowFooGrp + 117)
#define ActRcvFrmEnrSevTch (ActChgNumRowFooGrp + 118) #define ActRcvFrmEnrSevTch (ActChgNumRowFooGrp + 118)
#define ActReqCnfID_Oth (ActChgNumRowFooGrp + 119) #define ActCnfID_Oth (ActChgNumRowFooGrp + 119)
#define ActReqCnfID_Std (ActChgNumRowFooGrp + 120) #define ActCnfID_Std (ActChgNumRowFooGrp + 120)
#define ActReqCnfID_Tch (ActChgNumRowFooGrp + 121) #define ActCnfID_Tch (ActChgNumRowFooGrp + 121)
#define ActCnfID_Oth (ActChgNumRowFooGrp + 122)
#define ActCnfID_Std (ActChgNumRowFooGrp + 123)
#define ActCnfID_Tch (ActChgNumRowFooGrp + 124)
#define ActFrmIDsOth (ActChgNumRowFooGrp + 125) #define ActFrmIDsOth (ActChgNumRowFooGrp + 122)
#define ActFrmIDsStd (ActChgNumRowFooGrp + 126) #define ActFrmIDsStd (ActChgNumRowFooGrp + 123)
#define ActFrmIDsTch (ActChgNumRowFooGrp + 127) #define ActFrmIDsTch (ActChgNumRowFooGrp + 124)
#define ActRemID_Oth (ActChgNumRowFooGrp + 128) #define ActRemID_Oth (ActChgNumRowFooGrp + 125)
#define ActRemID_Std (ActChgNumRowFooGrp + 129) #define ActRemID_Std (ActChgNumRowFooGrp + 126)
#define ActRemID_Tch (ActChgNumRowFooGrp + 130) #define ActRemID_Tch (ActChgNumRowFooGrp + 127)
#define ActNewID_Oth (ActChgNumRowFooGrp + 131) #define ActNewID_Oth (ActChgNumRowFooGrp + 128)
#define ActNewID_Std (ActChgNumRowFooGrp + 132) #define ActNewID_Std (ActChgNumRowFooGrp + 129)
#define ActNewID_Tch (ActChgNumRowFooGrp + 133) #define ActNewID_Tch (ActChgNumRowFooGrp + 130)
#define ActFrmPwdOth (ActChgNumRowFooGrp + 134) #define ActFrmPwdOth (ActChgNumRowFooGrp + 131)
#define ActFrmPwdStd (ActChgNumRowFooGrp + 135) #define ActFrmPwdStd (ActChgNumRowFooGrp + 132)
#define ActFrmPwdTch (ActChgNumRowFooGrp + 136) #define ActFrmPwdTch (ActChgNumRowFooGrp + 133)
#define ActChgPwdOth (ActChgNumRowFooGrp + 137) #define ActChgPwdOth (ActChgNumRowFooGrp + 134)
#define ActChgPwdStd (ActChgNumRowFooGrp + 138) #define ActChgPwdStd (ActChgNumRowFooGrp + 135)
#define ActChgPwdTch (ActChgNumRowFooGrp + 139) #define ActChgPwdTch (ActChgNumRowFooGrp + 136)
#define ActFrmMaiOth (ActChgNumRowFooGrp + 140) #define ActFrmMaiOth (ActChgNumRowFooGrp + 137)
#define ActFrmMaiStd (ActChgNumRowFooGrp + 141) #define ActFrmMaiStd (ActChgNumRowFooGrp + 138)
#define ActFrmMaiTch (ActChgNumRowFooGrp + 142) #define ActFrmMaiTch (ActChgNumRowFooGrp + 139)
#define ActRemMaiOth (ActChgNumRowFooGrp + 143) #define ActRemMaiOth (ActChgNumRowFooGrp + 140)
#define ActRemMaiStd (ActChgNumRowFooGrp + 144) #define ActRemMaiStd (ActChgNumRowFooGrp + 141)
#define ActRemMaiTch (ActChgNumRowFooGrp + 145) #define ActRemMaiTch (ActChgNumRowFooGrp + 142)
#define ActNewMaiOth (ActChgNumRowFooGrp + 146) #define ActNewMaiOth (ActChgNumRowFooGrp + 143)
#define ActNewMaiStd (ActChgNumRowFooGrp + 147) #define ActNewMaiStd (ActChgNumRowFooGrp + 144)
#define ActNewMaiTch (ActChgNumRowFooGrp + 148) #define ActNewMaiTch (ActChgNumRowFooGrp + 145)
#define ActRemStdCrs (ActChgNumRowFooGrp + 149) #define ActRemStdCrs (ActChgNumRowFooGrp + 146)
#define ActRemTchCrs (ActChgNumRowFooGrp + 150) #define ActRemTchCrs (ActChgNumRowFooGrp + 147)
#define ActRemUsrGbl (ActChgNumRowFooGrp + 151) #define ActRemUsrGbl (ActChgNumRowFooGrp + 148)
#define ActReqRemAllStdCrs (ActChgNumRowFooGrp + 152) #define ActReqRemAllStdCrs (ActChgNumRowFooGrp + 149)
#define ActRemAllStdCrs (ActChgNumRowFooGrp + 153) #define ActRemAllStdCrs (ActChgNumRowFooGrp + 150)
#define ActReqRemOldUsr (ActChgNumRowFooGrp + 154) #define ActReqRemOldUsr (ActChgNumRowFooGrp + 151)
#define ActRemOldUsr (ActChgNumRowFooGrp + 155) #define ActRemOldUsr (ActChgNumRowFooGrp + 152)
#define ActLstDupUsr (ActChgNumRowFooGrp + 156) #define ActLstDupUsr (ActChgNumRowFooGrp + 153)
#define ActLstSimUsr (ActChgNumRowFooGrp + 157) #define ActLstSimUsr (ActChgNumRowFooGrp + 154)
#define ActRemDupUsr (ActChgNumRowFooGrp + 158) #define ActRemDupUsr (ActChgNumRowFooGrp + 155)
#define ActLstClk (ActChgNumRowFooGrp + 159) #define ActLstClk (ActChgNumRowFooGrp + 156)
/*****************************************************************************/ /*****************************************************************************/
/******************************** Social tab *********************************/ /******************************** Social tab *********************************/
@ -1547,6 +1544,8 @@ struct Act_Actions
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
Act_Action_t Act_GetActionFromActCod (long ActCod);
bool Act_CheckIfIHavePermissionToExecuteAction (Act_Action_t Action); bool Act_CheckIfIHavePermissionToExecuteAction (Act_Action_t Action);
const char *Act_GetTitleAction (Act_Action_t Action); const char *Act_GetTitleAction (Act_Action_t Action);
const char *Act_GetSubtitleAction (Act_Action_t Action); const char *Act_GetSubtitleAction (Act_Action_t Action);

View File

@ -2067,7 +2067,7 @@ static void Att_WriteRowStdToCallTheRoll (unsigned NumStd,struct UsrData *UsrDat
UsrDat->Accepted ? "DAT_SMALL_N" : UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL", "DAT_SMALL",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,NULL);
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>");
/***** Write student's name *****/ /***** Write student's name *****/
@ -3298,7 +3298,7 @@ static void Att_WriteRowStdSeveralAttEvents (unsigned NumStd,struct UsrData *Usr
UsrDat->Accepted ? "DAT_SMALL_N" : UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL", "DAT_SMALL",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,NULL);
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>");
/***** Write student's name *****/ /***** Write student's name *****/
@ -3444,7 +3444,7 @@ static void Att_ListAttEventsForAStd (unsigned NumStd,struct UsrData *UsrDat)
Gbl.RowEvenOdd, Gbl.RowEvenOdd,
UsrDat->Accepted ? "DAT_SMALL_N" : UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL"); "DAT_SMALL");
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,NULL);
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>");
/***** Write student's name *****/ /***** Write student's name *****/

View File

@ -1813,7 +1813,7 @@ void Ctr_ChangeCtrInsInConfig (void)
void Ctr_ContEditAfterChgCtrInConfig (void) void Ctr_ContEditAfterChgCtrInConfig (void)
{ {
/***** Write error/success message *****/ /***** Write error/success message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Show the form again *****/ /***** Show the form again *****/
Ctr_ShowConfiguration (); Ctr_ShowConfiguration ();
@ -2160,7 +2160,7 @@ void Ctr_ChangeCtrStatus (void)
void Ctr_ContEditAfterChgCtr (void) void Ctr_ContEditAfterChgCtr (void)
{ {
/***** Write success / warning message *****/ /***** Write success / warning message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
if (Gbl.AlertType == Lay_SUCCESS) if (Gbl.AlertType == Lay_SUCCESS)
/***** Put button to go to centre changed *****/ /***** Put button to go to centre changed *****/

View File

@ -234,13 +234,17 @@
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 16.208.7 (2017-05-08)" #define Log_PLATFORM_VERSION "SWAD 16.209 (2017-05-08)"
#define CSS_FILE "swad16.208.7.css" #define CSS_FILE "swad16.208.7.css"
#define JS_FILE "swad16.206.3.js" #define JS_FILE "swad16.206.3.js"
// Number of lines (includes comments but not blank lines) has been got with the following command: // Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1 // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
/* /*
Version 16.209: May 09, 2017 Confirmation of user's ID is made directly, without confirmation. (218836 lines)
1 change necessary in database:
UPDATE actions SET Obsolete='Y' WHERE ActCod IN ('1565','1566','1567');
Version 16.208.7: May 09, 2017 Changes in layout of student records. (218771 lines) Version 16.208.7: May 09, 2017 Changes in layout of student records. (218771 lines)
Version 16.208.6: May 09, 2017 Changes in alerts. Version 16.208.6: May 09, 2017 Changes in alerts.
Changes in layout of student records. (218744 lines) Changes in layout of student records. (218744 lines)

View File

@ -179,7 +179,6 @@ void Con_ShowLastClicks (void)
void Con_GetAndShowLastClicks (void) void Con_GetAndShowLastClicks (void)
{ {
extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS]; extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS];
extern Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD];
extern const char *Txt_Click; extern const char *Txt_Click;
extern const char *Txt_ELAPSED_TIME; extern const char *Txt_ELAPSED_TIME;
extern const char *Txt_Role; extern const char *Txt_Role;
@ -269,12 +268,12 @@ void Con_GetAndShowLastClicks (void)
ActCod = Str_ConvertStrCodToLongCod (row[1]); ActCod = Str_ConvertStrCodToLongCod (row[1]);
/* Use a special color for this row depending on the action */ /* Use a special color for this row depending on the action */
ClassRow = (Act_Actions[Act_FromActCodToAction[ActCod]].BrowserWindow == Act_DOWNLD_FILE) ? "DAT_SMALL_YELLOW LEFT_MIDDLE" : ClassRow = (Act_Actions[Act_GetActionFromActCod (ActCod)].BrowserWindow == Act_DOWNLD_FILE) ? "DAT_SMALL_YELLOW LEFT_MIDDLE" :
(ActCod == Act_Actions[ActLogIn].ActCod || (ActCod == Act_Actions[ActLogIn ].ActCod ||
ActCod == Act_Actions[ActLogInNew].ActCod) ? "DAT_SMALL_GREEN" : ActCod == Act_Actions[ActLogInNew].ActCod) ? "DAT_SMALL_GREEN" :
(ActCod == Act_Actions[ActLogOut].ActCod ) ? "DAT_SMALL_RED" : (ActCod == Act_Actions[ActLogOut ].ActCod) ? "DAT_SMALL_RED" :
(ActCod == Act_Actions[ActWebSvc].ActCod ) ? "DAT_SMALL_BLUE" : (ActCod == Act_Actions[ActWebSvc ].ActCod) ? "DAT_SMALL_BLUE" :
"DAT_SMALL_GREY"; "DAT_SMALL_GREY";
/* Compute elapsed time from last access */ /* Compute elapsed time from last access */
if (sscanf (row[2],"%ld",&TimeDiff) != 1) if (sscanf (row[2],"%ld",&TimeDiff) != 1)

View File

@ -2385,7 +2385,7 @@ void Crs_ChangeCrsDegInConfig (void)
void Crs_ContEditAfterChgCrsInConfig (void) void Crs_ContEditAfterChgCrsInConfig (void)
{ {
/***** Write error/success message *****/ /***** Write error/success message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Show the form again *****/ /***** Show the form again *****/
Crs_ShowIntroduction (); Crs_ShowIntroduction ();
@ -2772,7 +2772,7 @@ void Crs_ContEditAfterChgCrs (void)
bool PutButtonToRequestRegistration; bool PutButtonToRequestRegistration;
/***** Write warning / success message *****/ /***** Write warning / success message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
if (Gbl.AlertType == Lay_SUCCESS) if (Gbl.AlertType == Lay_SUCCESS)
{ {

View File

@ -2086,7 +2086,7 @@ void Deg_ChangeDegCtrInConfig (void)
void Deg_ContEditAfterChgDegInConfig (void) void Deg_ContEditAfterChgDegInConfig (void)
{ {
/***** Write success / warning message *****/ /***** Write success / warning message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Show the form again *****/ /***** Show the form again *****/
Deg_ShowConfiguration (); Deg_ShowConfiguration ();
@ -2252,7 +2252,7 @@ void Deg_ChangeDegStatus (void)
void Deg_ContEditAfterChgDeg (void) void Deg_ContEditAfterChgDeg (void)
{ {
/***** Write success / warning message *****/ /***** Write success / warning message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
if (Gbl.AlertType == Lay_SUCCESS) if (Gbl.AlertType == Lay_SUCCESS)
/***** Put button to go to degree changed *****/ /***** Put button to go to degree changed *****/

View File

@ -3183,7 +3183,8 @@ static void Enr_ShowFormToEditOtherUsr (void)
fprintf (Gbl.F.Out,"</div>"); fprintf (Gbl.F.Out,"</div>");
/***** User's record *****/ /***** User's record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_OTHER_EXISTING_USR_FORM,&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_OTHER_EXISTING_USR_FORM,
&Gbl.Usrs.Other.UsrDat,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -3633,13 +3634,13 @@ void Enr_CreateNewUsr1 (void)
void Enr_CreateNewUsr2 (void) void Enr_CreateNewUsr2 (void)
{ {
if (Gbl.AlertType == Lay_ERROR) // User's ID not valid if (Gbl.AlertType == Lay_ERROR) // User's ID not valid
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
else // User's ID valid else // User's ID valid
{ {
if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected
{ {
/***** Show optional alert *****/ /***** Show optional alert *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Change user's groups *****/ /***** Change user's groups *****/
if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups? if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups?
@ -3786,7 +3787,7 @@ void Enr_ModifyUsr2 (void)
extern const char *Txt_User_not_found_or_you_do_not_have_permission_; extern const char *Txt_User_not_found_or_you_do_not_have_permission_;
if (Gbl.AlertType == Lay_WARNING) if (Gbl.AlertType == Lay_WARNING)
Lay_ShowAlert (Gbl.AlertType,Txt_User_not_found_or_you_do_not_have_permission_); Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);
else // No error else // No error
switch (Gbl.Usrs.RegRemAction) switch (Gbl.Usrs.RegRemAction)
{ {
@ -3794,7 +3795,7 @@ void Enr_ModifyUsr2 (void)
if (Gbl.CurrentCrs.Crs.CrsCod > 0) if (Gbl.CurrentCrs.Crs.CrsCod > 0)
{ {
/***** Show optional alert *****/ /***** Show optional alert *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Change user's groups *****/ /***** Change user's groups *****/
if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups? if (Gbl.CurrentCrs.Grps.NumGrps) // This course has groups?

View File

@ -3407,7 +3407,7 @@ static void Brw_ShowDataOwnerAsgWrk (struct UsrData *UsrDat)
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod); Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
/***** Show user's ID *****/ /***** Show user's ID *****/
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,NULL);
/***** Show user's name *****/ /***** Show user's name *****/
fprintf (Gbl.F.Out,"<br />"); fprintf (Gbl.F.Out,"<br />");

View File

@ -996,6 +996,7 @@ static void Fol_PutIconToUnfollow (struct UsrData *UsrDat)
void Fol_FollowUsr1 (void) void Fol_FollowUsr1 (void)
{ {
extern const char *Txt_User_not_found_or_you_do_not_have_permission_;
char Query[256]; char Query[256];
bool CreateNotif; bool CreateNotif;
bool NotifyByEmail; bool NotifyByEmail;
@ -1033,7 +1034,10 @@ void Fol_FollowUsr1 (void)
Gbl.AlertType = Lay_SUCCESS; Gbl.AlertType = Lay_SUCCESS;
} }
else else
{
Gbl.AlertType = Lay_WARNING; Gbl.AlertType = Lay_WARNING;
sprintf (Gbl.Message,"%s",Txt_User_not_found_or_you_do_not_have_permission_);
}
} }
void Fol_FollowUsr2 (void) void Fol_FollowUsr2 (void)
@ -1042,11 +1046,14 @@ void Fol_FollowUsr2 (void)
if (Gbl.AlertType == Lay_SUCCESS) if (Gbl.AlertType == Lay_SUCCESS)
/***** Show user's profile again *****/ /***** Show user's profile again *****/
Gbl.AlertType = Prf_ShowUserProfile (&Gbl.Usrs.Other.UsrDat) ? Lay_SUCCESS : if (!Prf_ShowUserProfile (&Gbl.Usrs.Other.UsrDat))
Lay_WARNING; {
Gbl.AlertType = Lay_WARNING;
sprintf (Gbl.Message,"%s",Txt_User_not_found_or_you_do_not_have_permission_);
}
if (Gbl.AlertType == Lay_WARNING) if (Gbl.AlertType != Lay_SUCCESS)
Lay_ShowAlert (Gbl.AlertType,Txt_User_not_found_or_you_do_not_have_permission_); Lay_ShowPendingAlert ();
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1055,6 +1062,7 @@ void Fol_FollowUsr2 (void)
void Fol_UnfollowUsr1 (void) void Fol_UnfollowUsr1 (void)
{ {
extern const char *Txt_User_not_found_or_you_do_not_have_permission_;
char Query[256]; char Query[256];
/***** Get user to be unfollowed *****/ /***** Get user to be unfollowed *****/
@ -1074,13 +1082,14 @@ void Fol_UnfollowUsr1 (void)
Gbl.AlertType = Lay_SUCCESS; Gbl.AlertType = Lay_SUCCESS;
} }
else else
{
Gbl.AlertType = Lay_WARNING; Gbl.AlertType = Lay_WARNING;
sprintf (Gbl.Message,"%s",Txt_User_not_found_or_you_do_not_have_permission_);
}
} }
void Fol_UnfollowUsr2 (void) void Fol_UnfollowUsr2 (void)
{ {
extern const char *Txt_User_not_found_or_you_do_not_have_permission_;
/***** Get user to be unfollowed *****/ /***** Get user to be unfollowed *****/
if (Gbl.AlertType == Lay_SUCCESS) if (Gbl.AlertType == Lay_SUCCESS)
{ {
@ -1092,7 +1101,7 @@ void Fol_UnfollowUsr2 (void)
Fol_ListFollowingUsr (&Gbl.Usrs.Me.UsrDat); // List users I follow Fol_ListFollowingUsr (&Gbl.Usrs.Me.UsrDat); // List users I follow
} }
else else
Lay_ShowAlert (Gbl.AlertType,Txt_User_not_found_or_you_do_not_have_permission_); Lay_ShowPendingAlert ();
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -179,7 +179,8 @@ void Gbl_InitializeGlobals (void)
Gbl.Usrs.Other.UsrDat.UsrIDNickOrEmail[0] = '\0'; Gbl.Usrs.Other.UsrDat.UsrIDNickOrEmail[0] = '\0';
Usr_UsrDataConstructor (&Gbl.Usrs.Other.UsrDat); Usr_UsrDataConstructor (&Gbl.Usrs.Other.UsrDat);
Gbl.Action.Act = ActUnk; Gbl.Action.Act = ActUnk;
Gbl.Action.Original = ActUnk; // Used in some actions to know what action gave rise to the current action
Gbl.Action.UsesAJAX = false; Gbl.Action.UsesAJAX = false;
Gbl.Action.IsAJAXAutoRefresh = false; Gbl.Action.IsAJAXAutoRefresh = false;
Gbl.Action.Tab = TabUnk; Gbl.Action.Tab = TabUnk;

View File

@ -175,6 +175,7 @@ struct Globals
{ {
Tab_Tab_t Tab; Tab_Tab_t Tab;
Act_Action_t Act; Act_Action_t Act;
Act_Action_t Original; // Used in some actions to know what action gave rise to the current action
bool UsesAJAX; // Do not generate full HTML page, only the content of a div bool UsesAJAX; // Do not generate full HTML page, only the content of a div
bool IsAJAXAutoRefresh; // It's an automatic refresh drom time to time bool IsAJAXAutoRefresh; // It's an automatic refresh drom time to time
} Action; } Action;
@ -372,7 +373,6 @@ struct Globals
struct ListUsrs LstUsrs[Rol_NUM_ROLES]; struct ListUsrs LstUsrs[Rol_NUM_ROLES];
struct struct
{ {
// bool MultipleUsrs; // Listing multiple users?
char *All; char *All;
char *Std; char *Std;
char *Tch; char *Tch;

View File

@ -659,7 +659,7 @@ void Hld_RemoveHoliday1 (void)
void Hld_RemoveHoliday2 (void) void Hld_RemoveHoliday2 (void)
{ {
/***** Show success message *****/ /***** Show success message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Show the form again *****/ /***** Show the form again *****/
Hld_EditHolidays (); Hld_EditHolidays ();
@ -709,7 +709,7 @@ void Hld_ChangeHolidayPlace1 (void)
void Hld_ChangeHolidayPlace2 (void) void Hld_ChangeHolidayPlace2 (void)
{ {
/***** Show success message *****/ /***** Show success message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Show the form again *****/ /***** Show the form again *****/
Hld_EditHolidays (); Hld_EditHolidays ();
@ -753,7 +753,7 @@ void Hld_ChangeHolidayType1 (void)
void Hld_ChangeHolidayType2 (void) void Hld_ChangeHolidayType2 (void)
{ {
/***** Show success message *****/ /***** Show success message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Show the form again *****/ /***** Show the form again *****/
Hld_EditHolidays (); Hld_EditHolidays ();
@ -857,7 +857,7 @@ static void Hld_ChangeDate (Hld_StartOrEndDate_t StartOrEndDate)
void Hld_ChangeDate2 (void) void Hld_ChangeDate2 (void)
{ {
/***** Show success message *****/ /***** Show success message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Show the form again *****/ /***** Show the form again *****/
Hld_EditHolidays (); Hld_EditHolidays ();
@ -926,7 +926,7 @@ void Hld_RenameHoliday1 (void)
void Hld_RenameHoliday2 (void) void Hld_RenameHoliday2 (void)
{ {
/***** Write error/success message *****/ /***** Write error/success message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Show the form again *****/ /***** Show the form again *****/
Hld_EditHolidays (); Hld_EditHolidays ();
@ -1161,7 +1161,7 @@ void Hld_RecFormNewHoliday1 (void)
void Hld_RecFormNewHoliday2 (void) void Hld_RecFormNewHoliday2 (void)
{ {
/***** Write error/success message *****/ /***** Write error/success message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Show the form again *****/ /***** Show the form again *****/
Hld_EditHolidays (); Hld_EditHolidays ();

View File

@ -1922,7 +1922,7 @@ void Ins_ChangeInsCtyInConfig (void)
void Ins_ContEditAfterChgInsInConfig (void) void Ins_ContEditAfterChgInsInConfig (void)
{ {
/***** Write success / warning message *****/ /***** Write success / warning message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Show the form again *****/ /***** Show the form again *****/
Ins_ShowConfiguration (); Ins_ShowConfiguration ();
@ -2088,7 +2088,7 @@ void Ins_ChangeInsStatus (void)
void Ins_ContEditAfterChgIns (void) void Ins_ContEditAfterChgIns (void)
{ {
/***** Write success / warning message *****/ /***** Write success / warning message *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
if (Gbl.AlertType == Lay_SUCCESS) if (Gbl.AlertType == Lay_SUCCESS)
/***** Put button to go to institution changed *****/ /***** Put button to go to institution changed *****/

View File

@ -1660,6 +1660,18 @@ void Lay_ShowErrorAndExit (const char *Message)
exit (0); exit (0);
} }
/*****************************************************************************/
/*********************** Show a write-pending alert **************************/
/*****************************************************************************/
// Gbl.AlertType must be Lay_NONE or any type of alert
// If Gbl.AlertType != Lay_NONE ==> Gbl.Message must hold the message
void Lay_ShowPendingAlert (void)
{
if (Gbl.AlertType != Lay_NONE)
Lay_ShowAlert (Gbl.AlertType,Gbl.Message);
}
/*****************************************************************************/ /*****************************************************************************/
/******************** Show an alert message to the user **********************/ /******************** Show an alert message to the user **********************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -131,6 +131,7 @@ void Lay_StartTableWideMargin (unsigned CellPadding);
void Lay_EndTable (void); void Lay_EndTable (void);
void Lay_ShowErrorAndExit (const char *Message); void Lay_ShowErrorAndExit (const char *Message);
void Lay_ShowPendingAlert (void);
void Lay_ShowAlert (Lay_AlertType_t AlertType,const char *Message); void Lay_ShowAlert (Lay_AlertType_t AlertType,const char *Message);
void Lay_ShowAlertAndButton1 (Lay_AlertType_t AlertType,const char *Message); void Lay_ShowAlertAndButton1 (Lay_AlertType_t AlertType,const char *Message);
void Lay_ShowAlertAndButton2 (Act_Action_t NextAction,const char *Anchor, void Lay_ShowAlertAndButton2 (Act_Action_t NextAction,const char *Anchor,

View File

@ -1162,7 +1162,8 @@ void Mai_ShowFormOthEmail (void)
Lay_StartRoundFrame (NULL,Txt_Email,NULL,NULL); Lay_StartRoundFrame (NULL,Txt_Email,NULL,NULL);
/***** Show user's record *****/ /***** Show user's record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
&Gbl.Usrs.Other.UsrDat,NULL);
/***** Form with the user's email *****/ /***** Form with the user's email *****/
Lay_StartTableCenter (2); Lay_StartTableCenter (2);
@ -1359,7 +1360,8 @@ void Mai_RemoveOtherUsrEmail (void)
Mai_RemoveEmail (&Gbl.Usrs.Other.UsrDat); Mai_RemoveEmail (&Gbl.Usrs.Other.UsrDat);
/***** Show user's record *****/ /***** Show user's record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
&Gbl.Usrs.Other.UsrDat,NULL);
} }
else // User not found else // User not found
Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);
@ -1438,7 +1440,8 @@ void Mai_NewOtherUsrEmail (void)
(Gbl.Usrs.Other.UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod)); // It's me? (Gbl.Usrs.Other.UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod)); // It's me?
/***** Show user's record *****/ /***** Show user's record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
&Gbl.Usrs.Other.UsrDat,NULL);
} }
else // User not found else // User not found
Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);

View File

@ -402,7 +402,7 @@ static void Msg_ShowOneUniqueRecipient (void)
fprintf (Gbl.F.Out,"<div class=\"MSG_TO_ONE_RCP %s\">", fprintf (Gbl.F.Out,"<div class=\"MSG_TO_ONE_RCP %s\">",
Gbl.Usrs.Other.UsrDat.Accepted ? "DAT_SMALL_NOBR_N" : Gbl.Usrs.Other.UsrDat.Accepted ? "DAT_SMALL_NOBR_N" :
"DAT_SMALL_NOBR"); "DAT_SMALL_NOBR");
ID_WriteUsrIDs (&Gbl.Usrs.Other.UsrDat); ID_WriteUsrIDs (&Gbl.Usrs.Other.UsrDat,NULL);
fprintf (Gbl.F.Out,"</div>"); fprintf (Gbl.F.Out,"</div>");
/***** Write user's name *****/ /***** Write user's name *****/

View File

@ -823,7 +823,8 @@ void Pwd_ShowFormOthPwd (void)
Lay_StartRoundFrame (NULL,Txt_Password,NULL,NULL); Lay_StartRoundFrame (NULL,Txt_Password,NULL,NULL);
/***** Show user's record *****/ /***** Show user's record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,
&Gbl.Usrs.Other.UsrDat,NULL);
/***** Form to change password *****/ /***** Form to change password *****/
/* Start form */ /* Start form */

View File

@ -437,8 +437,7 @@ void Pho_ReqRemoveMyPhoto (void)
void Pho_RemoveMyPhoto1 (void) void Pho_RemoveMyPhoto1 (void)
{ {
/***** Remove photo *****/ /***** Remove photo *****/
Gbl.AlertType = Pho_RemovePhoto (&Gbl.Usrs.Me.UsrDat) ? Lay_SUCCESS : Pho_RemovePhoto (&Gbl.Usrs.Me.UsrDat);
Lay_WARNING;
/***** 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);
@ -446,10 +445,8 @@ void Pho_RemoveMyPhoto1 (void)
void Pho_RemoveMyPhoto2 (void) void Pho_RemoveMyPhoto2 (void)
{ {
extern const char *Txt_Photo_removed; /***** Write success / warning message *****/
Lay_ShowPendingAlert ();
if (Gbl.AlertType == Lay_SUCCESS)
Lay_ShowAlert (Gbl.AlertType,Txt_Photo_removed);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -511,7 +508,6 @@ void Pho_ReqRemoveUsrPhoto (void)
void Pho_RemoveUsrPhoto (void) void Pho_RemoveUsrPhoto (void)
{ {
extern const char *Txt_Photo_removed;
extern const char *Txt_User_not_found_or_you_do_not_have_permission_; extern const char *Txt_User_not_found_or_you_do_not_have_permission_;
/***** Get user's code from form *****/ /***** Get user's code from form *****/
@ -522,7 +518,7 @@ void Pho_RemoveUsrPhoto (void)
{ {
/***** Remove photo *****/ /***** Remove photo *****/
if (Pho_RemovePhoto (&Gbl.Usrs.Other.UsrDat)) if (Pho_RemovePhoto (&Gbl.Usrs.Other.UsrDat))
Lay_ShowAlert (Lay_SUCCESS,Txt_Photo_removed); Lay_ShowPendingAlert ();
} }
else else
Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);
@ -801,6 +797,7 @@ void Pho_UpdateUsrPhoto2 (void)
static void Pho_UpdatePhoto1 (struct UsrData *UsrDat) static void Pho_UpdatePhoto1 (struct UsrData *UsrDat)
{ {
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
char PathRelPhoto[PATH_MAX + 1]; char PathRelPhoto[PATH_MAX + 1];
@ -825,15 +822,18 @@ static void Pho_UpdatePhoto1 (struct UsrData *UsrDat)
Pho_RemoveUsrFromTableClicksWithoutPhoto (UsrDat->UsrCod); Pho_RemoveUsrFromTableClicksWithoutPhoto (UsrDat->UsrCod);
Gbl.AlertType = Lay_SUCCESS; Gbl.AlertType = Lay_SUCCESS;
sprintf (Gbl.Message,"%s",Txt_Photo_has_been_updated);
} }
else else
{
Gbl.AlertType = Lay_ERROR; Gbl.AlertType = Lay_ERROR;
sprintf (Gbl.Message,"%s","Error updating photo.");
}
} }
static void Pho_UpdatePhoto2 (void) static void Pho_UpdatePhoto2 (void)
{ {
extern const char *Txt_PHOTO_PROCESSING_CAPTIONS[3]; extern const char *Txt_PHOTO_PROCESSING_CAPTIONS[3];
extern const char *Txt_Photo_has_been_updated;
unsigned NumPhoto; unsigned NumPhoto;
/***** Show the three images resulting of the processing *****/ /***** Show the three images resulting of the processing *****/
@ -858,10 +858,7 @@ static void Pho_UpdatePhoto2 (void)
Lay_EndTable (); Lay_EndTable ();
/***** Show message *****/ /***** Show message *****/
if (Gbl.AlertType == Lay_ERROR) // The file with the selected photo does not exist! Lay_ShowPendingAlert ();
Lay_ShowErrorAndExit ("Selected photo does not exist.");
Lay_ShowAlert (Gbl.AlertType,Txt_Photo_has_been_updated);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1011,6 +1008,7 @@ bool Pho_CheckIfPrivPhotoExists (long UsrCod,char *PathPrivRelPhoto)
bool Pho_RemovePhoto (struct UsrData *UsrDat) bool Pho_RemovePhoto (struct UsrData *UsrDat)
{ {
extern const char *Txt_Photo_removed;
char PathPrivRelPhoto[PATH_MAX + 1]; char PathPrivRelPhoto[PATH_MAX + 1];
char PathPublPhoto[PATH_MAX + 1]; char PathPublPhoto[PATH_MAX + 1];
unsigned NumErrors = 0; unsigned NumErrors = 0;
@ -1025,10 +1023,7 @@ bool Pho_RemovePhoto (struct UsrData *UsrDat)
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_PHOTO,UsrDat->Photo); Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_PHOTO,UsrDat->Photo);
if (Fil_CheckIfPathExists (PathPublPhoto)) // Public link exists if (Fil_CheckIfPathExists (PathPublPhoto)) // Public link exists
if (unlink (PathPublPhoto)) // Remove public link if (unlink (PathPublPhoto)) // Remove public link
{
Lay_ShowAlert (Lay_ERROR,"Error removing public link to photo.");
NumErrors++; NumErrors++;
}
/***** Remove photo *****/ /***** Remove photo *****/
sprintf (PathPrivRelPhoto,"%s/%s/%02u/%ld.jpg", sprintf (PathPrivRelPhoto,"%s/%s/%02u/%ld.jpg",
@ -1037,10 +1032,7 @@ bool Pho_RemovePhoto (struct UsrData *UsrDat)
if (Fil_CheckIfPathExists (PathPrivRelPhoto)) // Photo exists if (Fil_CheckIfPathExists (PathPrivRelPhoto)) // Photo exists
{ {
if (unlink (PathPrivRelPhoto)) // Remove photo if (unlink (PathPrivRelPhoto)) // Remove photo
{
Lay_ShowAlert (Lay_ERROR,"Error removing photo.");
NumErrors++; NumErrors++;
}
} }
/***** Remove original photo *****/ /***** Remove original photo *****/
@ -1049,16 +1041,24 @@ bool Pho_RemovePhoto (struct UsrData *UsrDat)
(unsigned) (UsrDat->UsrCod % 100),UsrDat->UsrCod); (unsigned) (UsrDat->UsrCod % 100),UsrDat->UsrCod);
if (Fil_CheckIfPathExists (PathPrivRelPhoto)) // Original photo exists if (Fil_CheckIfPathExists (PathPrivRelPhoto)) // Original photo exists
if (unlink (PathPrivRelPhoto)) // Remove original photo if (unlink (PathPrivRelPhoto)) // Remove original photo
{
Lay_ShowAlert (Lay_ERROR,"Error removing the original photo.");
NumErrors++; NumErrors++;
}
/***** Clear photo name in user's data *****/ /***** Clear photo name in user's data *****/
UsrDat->Photo[0] = '\0'; UsrDat->Photo[0] = '\0';
} }
return (NumErrors == 0); if (NumErrors)
{
Gbl.AlertType = Lay_ERROR;
sprintf (Gbl.Message,"%s","Error removing photo.");
return false;
}
else
{
Gbl.AlertType = Lay_SUCCESS;
sprintf (Gbl.Message,"%s",Txt_Photo_removed);
return true;
}
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -290,7 +290,7 @@ bool Prf_ShowUserProfile (struct UsrData *UsrDat)
Gbl.CurrentCrs.Crs.CrsCod, Gbl.CurrentCrs.Crs.CrsCod,
true); true);
} }
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_PUBLIC,UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_PUBLIC,UsrDat,NULL);
/***** Show details of user's profile *****/ /***** Show details of user's profile *****/
Prf_ShowDetailsUserProfile (UsrDat); Prf_ShowDetailsUserProfile (UsrDat);

View File

@ -76,10 +76,14 @@ static void Rec_PutParamFielCod (void);
static void Rec_GetFieldByCod (long FieldCod,char Name[Rec_MAX_BYTES_NAME_FIELD + 1], static void Rec_GetFieldByCod (long FieldCod,char Name[Rec_MAX_BYTES_NAME_FIELD + 1],
unsigned *NumLines,Rec_VisibilityRecordFields_t *Visibility); unsigned *NumLines,Rec_VisibilityRecordFields_t *Visibility);
static void Rec_ListRecordsGsts (Rec_SharedRecordViewType_t TypeOfView);
static void Rec_ShowRecordOneStdCrs (void); static void Rec_ShowRecordOneStdCrs (void);
static void Rec_ListRecordsStds (Rec_SharedRecordViewType_t ShaTypeOfView, static void Rec_ListRecordsStds (Rec_SharedRecordViewType_t ShaTypeOfView,
Rec_CourseRecordViewType_t CrsTypeOfView); Rec_CourseRecordViewType_t CrsTypeOfView);
static void Rec_ShowRecordOneTchCrs (void); static void Rec_ShowRecordOneTchCrs (void);
static void Rec_ListRecordsTchs (Rec_SharedRecordViewType_t TypeOfView);
static void Rec_ShowLinkToPrintPreviewOfRecords (void); static void Rec_ShowLinkToPrintPreviewOfRecords (void);
static void Rec_GetParamRecordsPerPage (void); static void Rec_GetParamRecordsPerPage (void);
@ -105,7 +109,8 @@ static void Rec_ShowCountryInHead (struct UsrData *UsrDat,bool ShowData);
static void Rec_ShowWebsAndSocialNets (struct UsrData *UsrDat, static void Rec_ShowWebsAndSocialNets (struct UsrData *UsrDat,
Rec_SharedRecordViewType_t TypeOfView); Rec_SharedRecordViewType_t TypeOfView);
static void Rec_ShowEmail (struct UsrData *UsrDat,const char *ClassForm); static void Rec_ShowEmail (struct UsrData *UsrDat,const char *ClassForm);
static void Rec_ShowUsrIDs (struct UsrData *UsrDat,const char *ClassForm); static void Rec_ShowUsrIDs (struct UsrData *UsrDat,const char *Anchor,
const char *ClassForm);
static void Rec_ShowRole (struct UsrData *UsrDat, static void Rec_ShowRole (struct UsrData *UsrDat,
Rec_SharedRecordViewType_t TypeOfView, Rec_SharedRecordViewType_t TypeOfView,
const char *ClassForm); const char *ClassForm);
@ -977,20 +982,29 @@ void Rec_PutLinkToEditRecordFields (void)
/*********************** Draw records of several guests **********************/ /*********************** Draw records of several guests **********************/
/*****************************************************************************/ /*****************************************************************************/
void Rec_ListRecordsGsts (void) void Rec_ListRecordsGstsShow (void)
{
Gbl.Action.Original = ActSeeRecSevGst;
Rec_ListRecordsGsts (Rec_SHA_RECORD_LIST);
}
void Rec_ListRecordsGstsPrint (void)
{
Rec_ListRecordsGsts (Rec_SHA_RECORD_PRINT);
}
static void Rec_ListRecordsGsts (Rec_SharedRecordViewType_t TypeOfView)
{ {
extern const char *Txt_You_must_select_one_ore_more_users; extern const char *Txt_You_must_select_one_ore_more_users;
unsigned NumUsrs = 0; unsigned NumUsrs = 0;
const char *Ptr; const char *Ptr;
Rec_SharedRecordViewType_t TypeOfView = (Gbl.Action.Act == ActSeeRecSevGst) ? Rec_SHA_RECORD_LIST :
Rec_SHA_RECORD_PRINT;
struct UsrData UsrDat; struct UsrData UsrDat;
/***** Assign users listing type depending on current action *****/ /***** Assign users listing type depending on current action *****/
Gbl.Usrs.Listing.RecsUsrs = Rec_RECORD_USERS_GUESTS; Gbl.Usrs.Listing.RecsUsrs = Rec_RECORD_USERS_GUESTS;
/***** Get parameter with number of user records per page (only for printing) *****/ /***** Get parameter with number of user records per page (only for printing) *****/
if (Gbl.Action.Act == ActPrnRecSevGst) if (TypeOfView == Rec_SHA_RECORD_PRINT)
Rec_GetParamRecordsPerPage (); Rec_GetParamRecordsPerPage ();
/***** Get list of selected users *****/ /***** Get list of selected users *****/
@ -1004,7 +1018,7 @@ void Rec_ListRecordsGsts (void)
return; return;
} }
if (Gbl.Action.Act == ActSeeRecSevGst) if (TypeOfView == Rec_SHA_RECORD_LIST) // Listing several records
{ {
fprintf (Gbl.F.Out,"<div class=\"CONTEXT_MENU\">"); fprintf (Gbl.F.Out,"<div class=\"CONTEXT_MENU\">");
@ -1040,7 +1054,7 @@ void Rec_ListRecordsGsts (void)
fprintf (Gbl.F.Out,"\">"); fprintf (Gbl.F.Out,"\">");
/* Shared record */ /* Shared record */
Rec_ShowSharedUsrRecord (TypeOfView,&UsrDat); Rec_ShowSharedUsrRecord (TypeOfView,&UsrDat,NULL);
fprintf (Gbl.F.Out,"</div>"); fprintf (Gbl.F.Out,"</div>");
@ -1050,10 +1064,6 @@ void Rec_ListRecordsGsts (void)
/***** Free memory used for user's data *****/ /***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat); Usr_UsrDataDestructor (&UsrDat);
/***** Free list of fields of records *****/
if (Gbl.Usrs.Listing.RecsUsrs == Rec_RECORD_USERS_STUDENTS)
Rec_FreeListFields ();
/***** Free memory used by list of selected users' codes *****/ /***** Free memory used by list of selected users' codes *****/
Usr_FreeListsSelectedUsrsCods (); Usr_FreeListsSelectedUsrsCods ();
} }
@ -1102,10 +1112,10 @@ static void Rec_ShowRecordOneStdCrs (void)
fprintf (Gbl.F.Out,"</div>"); fprintf (Gbl.F.Out,"</div>");
/***** Show optional alert *****/ /***** Show optional alert *****/
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/***** Shared record *****/ /***** Shared record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat,NULL);
/***** Record of the student in the course *****/ /***** Record of the student in the course *****/
/* Get list of fields of records in current course */ /* Get list of fields of records in current course */
@ -1129,13 +1139,14 @@ static void Rec_ShowRecordOneStdCrs (void)
/******************** Draw records of several students ***********************/ /******************** Draw records of several students ***********************/
/*****************************************************************************/ /*****************************************************************************/
void Rec_ListRecordsStdsForEdit (void) void Rec_ListRecordsStdsShow (void)
{ {
Gbl.Action.Original = ActSeeRecSevStd;
Rec_ListRecordsStds (Rec_SHA_RECORD_LIST, Rec_ListRecordsStds (Rec_SHA_RECORD_LIST,
Rec_CRS_LIST_SEVERAL_RECORDS); Rec_CRS_LIST_SEVERAL_RECORDS);
} }
void Rec_ListRecordsStdsForPrint (void) void Rec_ListRecordsStdsPrint (void)
{ {
Rec_ListRecordsStds (Rec_SHA_RECORD_PRINT, Rec_ListRecordsStds (Rec_SHA_RECORD_PRINT,
Rec_CRS_PRINT_SEVERAL_RECORDS); Rec_CRS_PRINT_SEVERAL_RECORDS);
@ -1220,11 +1231,11 @@ static void Rec_ListRecordsStds (Rec_SharedRecordViewType_t ShaTypeOfView,
/* Show optional alert */ /* Show optional alert */
if (UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod) // Selected user if (UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod) // Selected user
Lay_ShowAlert (Gbl.AlertType,Gbl.Message); Lay_ShowPendingAlert ();
/* Shared record */ /* Shared record */
fprintf (Gbl.F.Out,"<section class=\"REC_SHA\">"); fprintf (Gbl.F.Out,"<section class=\"REC_SHA\">");
Rec_ShowSharedUsrRecord (ShaTypeOfView,&UsrDat); Rec_ShowSharedUsrRecord (ShaTypeOfView,&UsrDat,Anchor);
fprintf (Gbl.F.Out,"</section>"); fprintf (Gbl.F.Out,"</section>");
/* Record of the student in the course */ /* Record of the student in the course */
@ -1320,7 +1331,7 @@ static void Rec_ShowRecordOneTchCrs (void)
" style=\"margin-bottom:12px;\">"); " style=\"margin-bottom:12px;\">");
/* Shared record */ /* Shared record */
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Other.UsrDat,NULL);
/* Office hours */ /* Office hours */
if (ShowOfficeHours) if (ShowOfficeHours)
@ -1339,15 +1350,24 @@ static void Rec_ShowRecordOneTchCrs (void)
/******************** Draw records of several teachers ***********************/ /******************** Draw records of several teachers ***********************/
/*****************************************************************************/ /*****************************************************************************/
void Rec_ListRecordsTchs (void) void Rec_ListRecordsTchsShow (void)
{
Gbl.Action.Original = ActSeeRecSevTch;
Rec_ListRecordsTchs (Rec_SHA_RECORD_LIST);
}
void Rec_ListRecordsTchsPrint (void)
{
Rec_ListRecordsTchs (Rec_SHA_RECORD_PRINT);
}
static void Rec_ListRecordsTchs (Rec_SharedRecordViewType_t TypeOfView)
{ {
extern const char *Hlp_USERS_Teachers_timetable; extern const char *Hlp_USERS_Teachers_timetable;
extern const char *Txt_You_must_select_one_ore_more_teachers; extern const char *Txt_You_must_select_one_ore_more_teachers;
extern const char *Txt_TIMETABLE_TYPES[TT_NUM_TIMETABLE_TYPES]; extern const char *Txt_TIMETABLE_TYPES[TT_NUM_TIMETABLE_TYPES];
unsigned NumUsrs = 0; unsigned NumUsrs = 0;
const char *Ptr; const char *Ptr;
Rec_SharedRecordViewType_t TypeOfView = (Gbl.Action.Act == ActSeeRecSevTch) ? Rec_SHA_RECORD_LIST :
Rec_SHA_RECORD_PRINT;
struct UsrData UsrDat; struct UsrData UsrDat;
bool ShowOfficeHours; bool ShowOfficeHours;
char Width[10 + 2 + 1]; char Width[10 + 2 + 1];
@ -1425,7 +1445,7 @@ void Rec_ListRecordsTchs (void)
fprintf (Gbl.F.Out,"\">"); fprintf (Gbl.F.Out,"\">");
/* Shared record */ /* Shared record */
Rec_ShowSharedUsrRecord (TypeOfView,&UsrDat); Rec_ShowSharedUsrRecord (TypeOfView,&UsrDat,NULL);
/* Office hours */ /* Office hours */
if (ShowOfficeHours) if (ShowOfficeHours)
@ -1575,13 +1595,14 @@ void Rec_UpdateAndShowMyCrsRecord (void)
void Rec_UpdateAndShowOtherCrsRecord (void) void Rec_UpdateAndShowOtherCrsRecord (void)
{ {
extern const char *Txt_Student_record_card_in_this_course_has_been_updated; extern const char *Txt_Student_record_card_in_this_course_has_been_updated;
bool MultipleUsrs; long OriginalActCod;
/***** Initialize alert type and message *****/ /***** Initialize alert type and message *****/
Gbl.AlertType = Lay_NONE; // Do not show alert Gbl.AlertType = Lay_NONE; // Do not show alert
/***** Get parameter indicating if listing multiple users *****/ /***** Get where we came from *****/
MultipleUsrs = Par_GetParToBool ("MultiUsrs"); OriginalActCod = Par_GetParToLong ("OriginalActCod");
Gbl.Action.Original = Act_GetActionFromActCod (OriginalActCod);
/***** Get the user whose record we want to modify *****/ /***** Get the user whose record we want to modify *****/
Usr_GetParamOtherUsrCodEncryptedAndGetListIDs (); Usr_GetParamOtherUsrCodEncryptedAndGetListIDs ();
@ -1603,12 +1624,17 @@ void Rec_UpdateAndShowOtherCrsRecord (void)
Txt_Student_record_card_in_this_course_has_been_updated); Txt_Student_record_card_in_this_course_has_been_updated);
/***** Show one or multiple records *****/ /***** Show one or multiple records *****/
if (MultipleUsrs) switch (Gbl.Action.Original)
/* Show multiple records again (including the updated one) */ {
Rec_ListRecordsStdsForEdit (); case ActSeeRecSevStd:
else /* Show multiple records again (including the updated one) */
/* Show only the updated record of this student */ Rec_ListRecordsStdsShow ();
Rec_ShowRecordOneStdCrs (); break;
default:
/* Show only the updated record of one student */
Rec_ShowRecordOneStdCrs ();
break;
}
/***** Free memory used for some fields *****/ /***** Free memory used for some fields *****/
Rec_FreeMemFieldsRecordsCrs (); Rec_FreeMemFieldsRecordsCrs ();
@ -1622,6 +1648,7 @@ void Rec_UpdateAndShowOtherCrsRecord (void)
static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView, static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
struct UsrData *UsrDat,const char *Anchor) struct UsrData *UsrDat,const char *Anchor)
{ {
extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS];
extern const char *Hlp_USERS_Students_course_record_card; extern const char *Hlp_USERS_Students_course_record_card;
extern const char *The_ClassForm[The_NUM_THEMES]; extern const char *The_ClassForm[The_NUM_THEMES];
extern const char *Txt_You_dont_have_permission_to_perform_this_action; extern const char *Txt_You_dont_have_permission_to_perform_this_action;
@ -1690,12 +1717,15 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
case Rec_CRS_LIST_ONE_RECORD: case Rec_CRS_LIST_ONE_RECORD:
ICanEdit = true; ICanEdit = true;
Act_FormStartAnchor (ActRcvRecOthUsr,Anchor); Act_FormStartAnchor (ActRcvRecOthUsr,Anchor);
// Usr_PutHiddenParUsrCodAll (ActRcvRecOthUsr,Gbl.Usrs.Select.All); // TODO: Remove this line Par_PutHiddenParamLong ("OriginalActCod",
Act_Actions[ActSeeRecOneStd].ActCod); // Original action, used to know where we came from
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod); Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
break; break;
case Rec_CRS_LIST_SEVERAL_RECORDS: case Rec_CRS_LIST_SEVERAL_RECORDS:
ICanEdit = true; ICanEdit = true;
Act_FormStartAnchor (ActRcvRecOthUsr,Anchor); Act_FormStartAnchor (ActRcvRecOthUsr,Anchor);
Par_PutHiddenParamLong ("OriginalActCod",
Act_Actions[ActSeeRecSevStd].ActCod); // Original action, used to know where we came from
Usr_PutHiddenParUsrCodAll (ActRcvRecOthUsr,Gbl.Usrs.Select.All); Usr_PutHiddenParUsrCodAll (ActRcvRecOthUsr,Gbl.Usrs.Select.All);
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod); Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
break; break;
@ -1961,7 +1991,7 @@ static void Rec_ShowMyCrsRecordUpdated (void)
Lay_ShowAlert (Lay_SUCCESS,Txt_Your_record_card_in_this_course_has_been_updated); Lay_ShowAlert (Lay_SUCCESS,Txt_Your_record_card_in_this_course_has_been_updated);
/***** Shared record *****/ /***** Shared record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Me.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_RECORD_LIST,&Gbl.Usrs.Me.UsrDat,NULL);
/***** Show updated user's record *****/ /***** Show updated user's record *****/
Rec_ShowCrsRecord (Rec_CRS_MY_RECORD_AS_STUDENT_CHECK,&Gbl.Usrs.Me.UsrDat,NULL); Rec_ShowCrsRecord (Rec_CRS_MY_RECORD_AS_STUDENT_CHECK,&Gbl.Usrs.Me.UsrDat,NULL);
@ -2016,7 +2046,7 @@ void Rec_ShowFormSignUpWithMySharedRecord (void)
/***** Show the form *****/ /***** Show the form *****/
Act_FormStart (ActSignUp); Act_FormStart (ActSignUp);
Rec_ShowSharedUsrRecord (Rec_SHA_SIGN_UP_FORM,&Gbl.Usrs.Me.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_SIGN_UP_FORM,&Gbl.Usrs.Me.UsrDat,NULL);
Lay_PutConfirmButton (Txt_Sign_up); Lay_PutConfirmButton (Txt_Sign_up);
Act_FormEnd (); Act_FormEnd ();
} }
@ -2049,7 +2079,7 @@ void Rec_ShowFormMySharedRecord (void)
fprintf (Gbl.F.Out,"</div>"); fprintf (Gbl.F.Out,"</div>");
/***** My record *****/ /***** My record *****/
Rec_ShowSharedUsrRecord (Rec_SHA_MY_RECORD_FORM,&Gbl.Usrs.Me.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_MY_RECORD_FORM,&Gbl.Usrs.Me.UsrDat,NULL);
Rec_WriteLinkToDataProtectionClause (); Rec_WriteLinkToDataProtectionClause ();
} }
@ -2065,7 +2095,7 @@ void Rec_ShowFormOtherNewSharedRecord (struct UsrData *UsrDat,Rol_Role_t Default
Instead it is initialized with the preferred role. */ Instead it is initialized with the preferred role. */
UsrDat->RoleInCurrentCrsDB = (Gbl.CurrentCrs.Crs.CrsCod > 0) ? DefaultRole : // Course selected UsrDat->RoleInCurrentCrsDB = (Gbl.CurrentCrs.Crs.CrsCod > 0) ? DefaultRole : // Course selected
Rol__GUEST_; // No course selected Rol__GUEST_; // No course selected
Rec_ShowSharedUsrRecord (Rec_SHA_OTHER_NEW_USR_FORM,UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_OTHER_NEW_USR_FORM,UsrDat,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2080,7 +2110,7 @@ void Rec_ShowMySharedRecordUpd (void)
Lay_ShowAlert (Lay_SUCCESS,Txt_Your_personal_data_have_been_updated); Lay_ShowAlert (Lay_SUCCESS,Txt_Your_personal_data_have_been_updated);
/***** Show my record for checking *****/ /***** Show my record for checking *****/
Rec_ShowSharedUsrRecord (Rec_SHA_MY_RECORD_CHECK,&Gbl.Usrs.Me.UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_MY_RECORD_CHECK,&Gbl.Usrs.Me.UsrDat,NULL);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -2097,7 +2127,7 @@ void Rec_ShowSharedRecordUnmodifiable (struct UsrData *UsrDat)
/***** Show user's record *****/ /***** Show user's record *****/
fprintf (Gbl.F.Out,"<div class=\"CENTER_MIDDLE\">"); fprintf (Gbl.F.Out,"<div class=\"CENTER_MIDDLE\">");
Rec_ShowSharedUsrRecord (Rec_SHA_OTHER_USR_CHECK,UsrDat); Rec_ShowSharedUsrRecord (Rec_SHA_OTHER_USR_CHECK,UsrDat,NULL);
fprintf (Gbl.F.Out,"</div>"); fprintf (Gbl.F.Out,"</div>");
} }
@ -2107,7 +2137,7 @@ void Rec_ShowSharedRecordUnmodifiable (struct UsrData *UsrDat)
// Show form or only data depending on TypeOfView // Show form or only data depending on TypeOfView
void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView, void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
struct UsrData *UsrDat) struct UsrData *UsrDat,const char *Anchor)
{ {
extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS]; extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS];
extern const char *Hlp_USERS_SignUp; extern const char *Hlp_USERS_SignUp;
@ -2265,12 +2295,26 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
"<td colspan=\"3\">"); "<td colspan=\"3\">");
/***** Show email and user's ID *****/ /***** Show email and user's IDs *****/
if (ShowIDRows) if (ShowIDRows)
{ {
Lay_StartTableWide (2); Lay_StartTableWide (2);
/* Show email */
Rec_ShowEmail (UsrDat,ClassForm); Rec_ShowEmail (UsrDat,ClassForm);
Rec_ShowUsrIDs (UsrDat,ClassForm);
/* Show user's IDs */
if (TypeOfView == Rec_SHA_RECORD_LIST) // Listing several records
switch (Gbl.Action.Act)
{
case ActSeeRecSevGst:
case ActSeeRecSevStd:
case ActSeeRecSevTch:
Gbl.Action.Original = Gbl.Action.Act; // Used to know what action gave rise to other actions
break;
}
Rec_ShowUsrIDs (UsrDat,Anchor,ClassForm);
Lay_EndTable (); Lay_EndTable ();
} }
@ -2786,7 +2830,8 @@ static void Rec_ShowEmail (struct UsrData *UsrDat,const char *ClassForm)
/******************************* Show user's IDs *****************************/ /******************************* Show user's IDs *****************************/
/*****************************************************************************/ /*****************************************************************************/
static void Rec_ShowUsrIDs (struct UsrData *UsrDat,const char *ClassForm) static void Rec_ShowUsrIDs (struct UsrData *UsrDat,const char *Anchor,
const char *ClassForm)
{ {
extern const char *Txt_ID; extern const char *Txt_ID;
@ -2796,7 +2841,7 @@ static void Rec_ShowUsrIDs (struct UsrData *UsrDat,const char *ClassForm)
"</td>" "</td>"
"<td class=\"REC_C2_BOT REC_DAT_BOLD LEFT_TOP\">", "<td class=\"REC_C2_BOT REC_DAT_BOLD LEFT_TOP\">",
ClassForm,Txt_ID); ClassForm,Txt_ID);
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,Anchor);
fprintf (Gbl.F.Out,"</td>" fprintf (Gbl.F.Out,"</td>"
"</tr>"); "</tr>");
} }

View File

@ -138,12 +138,18 @@ void Rec_ChangeVisibilityField (void);
void Rec_FreeListFields (void); void Rec_FreeListFields (void);
void Rec_PutLinkToEditRecordFields (void); void Rec_PutLinkToEditRecordFields (void);
void Rec_ListRecordsGsts (void);
void Rec_ListRecordsGstsShow (void);
void Rec_ListRecordsGstsPrint (void);
void Rec_GetUsrAndShowRecordOneStdCrs (void); void Rec_GetUsrAndShowRecordOneStdCrs (void);
void Rec_ListRecordsStdsForEdit (void); void Rec_ListRecordsStdsShow (void);
void Rec_ListRecordsStdsForPrint (void); void Rec_ListRecordsStdsPrint (void);
void Rec_GetUsrAndShowRecordOneTchCrs (void); void Rec_GetUsrAndShowRecordOneTchCrs (void);
void Rec_ListRecordsTchs (void); void Rec_ListRecordsTchsShow (void);
void Rec_ListRecordsTchsPrint (void);
void Rec_UpdateAndShowMyCrsRecord (void); void Rec_UpdateAndShowMyCrsRecord (void);
void Rec_UpdateAndShowOtherCrsRecord (void); void Rec_UpdateAndShowOtherCrsRecord (void);
unsigned long Rec_GetFieldFromCrsRecord (long UsrCod,long FieldCod,MYSQL_RES **mysql_res); unsigned long Rec_GetFieldFromCrsRecord (long UsrCod,long FieldCod,MYSQL_RES **mysql_res);
@ -160,7 +166,7 @@ void Rec_ShowFormOtherNewSharedRecord (struct UsrData *UsrDat,Rol_Role_t Default
void Rec_ShowMySharedRecordUpd (void); void Rec_ShowMySharedRecordUpd (void);
void Rec_ShowSharedRecordUnmodifiable (struct UsrData *UsrDat); void Rec_ShowSharedRecordUnmodifiable (struct UsrData *UsrDat);
void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView, void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
struct UsrData *UsrDat); struct UsrData *UsrDat,const char *Anchor);
void Rec_UpdateMyRecord (void); void Rec_UpdateMyRecord (void);
Rol_Role_t Rec_GetRoleFromRecordForm (void); Rol_Role_t Rec_GetRoleFromRecordForm (void);

View File

@ -53,7 +53,8 @@ extern struct Globals Gbl;
static void Ses_RemoveSessionFromDB (void); static void Ses_RemoveSessionFromDB (void);
static bool Ses_CheckIfHiddenParIsAlreadyInDB (Act_Action_t Action,const char *ParamName); static bool Ses_CheckIfHiddenParIsAlreadyInDB (Act_Action_t NextAction,
const char *ParamName);
/*****************************************************************************/ /*****************************************************************************/
/************************** Get number of open sessions **********************/ /************************** Get number of open sessions **********************/
@ -344,8 +345,10 @@ bool Ses_GetSessionData (void)
/******************* Insert hidden parameter in the database *****************/ /******************* Insert hidden parameter in the database *****************/
/*****************************************************************************/ /*****************************************************************************/
void Ses_InsertHiddenParInDB (Act_Action_t Action,const char *ParamName,const char *ParamValue) void Ses_InsertHiddenParInDB (Act_Action_t NextAction,
const char *ParamName,const char *ParamValue)
{ {
extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS];
char *Query; char *Query;
size_t LengthParamName; size_t LengthParamName;
size_t LengthParamValue; size_t LengthParamValue;
@ -358,7 +361,7 @@ void Ses_InsertHiddenParInDB (Act_Action_t Action,const char *ParamName,const ch
/***** For a unique session-action-parameter, don't insert a parameter more than one time *****/ /***** For a unique session-action-parameter, don't insert a parameter more than one time *****/
if (ParamName) if (ParamName)
if ((LengthParamName = strlen (ParamName))) if ((LengthParamName = strlen (ParamName)))
if (!Ses_CheckIfHiddenParIsAlreadyInDB (Action,ParamName)) if (!Ses_CheckIfHiddenParIsAlreadyInDB (NextAction,ParamName))
{ {
/***** Allocate space for query *****/ /***** Allocate space for query *****/
if (ParamValue) if (ParamValue)
@ -376,8 +379,9 @@ void Ses_InsertHiddenParInDB (Act_Action_t Action,const char *ParamName,const ch
sprintf (Query,"INSERT INTO hidden_params" sprintf (Query,"INSERT INTO hidden_params"
" (SessionId,Action,ParamName,ParamValue)" " (SessionId,Action,ParamName,ParamValue)"
" VALUES" " VALUES"
" ('%s',%d,'%s','%s')", " ('%s',%ld,'%s','%s')",
Gbl.Session.Id,(int) Action, Gbl.Session.Id,
Act_Actions[NextAction].ActCod,
ParamName, ParamName,
LengthParamValue ? ParamValue : LengthParamValue ? ParamValue :
""); "");
@ -426,14 +430,16 @@ void Ses_RemoveHiddenParFromExpiredSessions (void)
/*****************************************************************************/ /*****************************************************************************/
// Return true if the parameter already existed in database // Return true if the parameter already existed in database
static bool Ses_CheckIfHiddenParIsAlreadyInDB (Act_Action_t Action,const char *ParamName) static bool Ses_CheckIfHiddenParIsAlreadyInDB (Act_Action_t NextAction,
const char *ParamName)
{ {
char Query[512]; extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS];
char Query[512 + Ses_BYTES_SESSION_ID];
/***** Get a hidden parameter from database *****/ /***** Get a hidden parameter from database *****/
sprintf (Query,"SELECT COUNT(*) FROM hidden_params" sprintf (Query,"SELECT COUNT(*) FROM hidden_params"
" WHERE SessionId='%s' AND Action=%d AND ParamName='%s'", " WHERE SessionId='%s' AND Action=%ld AND ParamName='%s'",
Gbl.Session.Id,(int) Action,ParamName); Gbl.Session.Id,Act_Actions[NextAction].ActCod,ParamName);
return (DB_QueryCOUNT (Query,"can not check if a hidden parameter is already in database") != 0); return (DB_QueryCOUNT (Query,"can not check if a hidden parameter is already in database") != 0);
} }
@ -442,9 +448,12 @@ static bool Ses_CheckIfHiddenParIsAlreadyInDB (Act_Action_t Action,const char *P
/*****************************************************************************/ /*****************************************************************************/
// Return true if the parameter is too big // Return true if the parameter is too big
unsigned Ses_GetHiddenParFromDB (Act_Action_t Action,const char *ParamName,char *ParamValue,size_t MaxBytes) unsigned Ses_GetHiddenParFromDB (Act_Action_t NextAction,
const char *ParamName,char *ParamValue,
size_t MaxBytes)
{ {
char Query[512]; extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS];
char Query[512 + Ses_BYTES_SESSION_ID];
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long NumRows; unsigned long NumRows;
@ -457,8 +466,8 @@ unsigned Ses_GetHiddenParFromDB (Act_Action_t Action,const char *ParamName,char
{ {
/***** Get a hidden parameter from database *****/ /***** Get a hidden parameter from database *****/
sprintf (Query,"SELECT ParamValue FROM hidden_params" sprintf (Query,"SELECT ParamValue FROM hidden_params"
" WHERE SessionId='%s' AND Action=%d AND ParamName='%s'", " WHERE SessionId='%s' AND Action=%ld AND ParamName='%s'",
Gbl.Session.Id,(int) Action,ParamName); Gbl.Session.Id,Act_Actions[NextAction].ActCod,ParamName);
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get a hidden parameter"); NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get a hidden parameter");
/***** Check if the parameter is found in database *****/ /***** Check if the parameter is found in database *****/

View File

@ -51,9 +51,12 @@ void Ses_UpdateSessionDataInDB (void);
void Ses_UpdateSessionLastRefreshInDB (void); void Ses_UpdateSessionLastRefreshInDB (void);
void Ses_RemoveExpiredSessions (void); void Ses_RemoveExpiredSessions (void);
bool Ses_GetSessionData (void); bool Ses_GetSessionData (void);
void Ses_InsertHiddenParInDB (Act_Action_t Action,const char *ParamName,const char *ParamValue); void Ses_InsertHiddenParInDB (Act_Action_t NextAction,
const char *ParamName,const char *ParamValue);
void Ses_RemoveHiddenParFromThisSession (void); void Ses_RemoveHiddenParFromThisSession (void);
void Ses_RemoveHiddenParFromExpiredSessions (void); void Ses_RemoveHiddenParFromExpiredSessions (void);
unsigned Ses_GetHiddenParFromDB (Act_Action_t Action,const char *ParamName,char *ParamValue,size_t MaxBytes); unsigned Ses_GetHiddenParFromDB (Act_Action_t NextAction,
const char *ParamName,char *ParamValue,
size_t MaxBytes);
#endif #endif

View File

@ -1751,7 +1751,7 @@ static void Sta_ShowDetailedAccessesList (unsigned long NumRows,MYSQL_RES *mysql
/* Write the user's ID if user is a student */ /* Write the user's ID if user is a student */
fprintf (Gbl.F.Out,"<td class=\"LOG CENTER_TOP COLOR%u\">", fprintf (Gbl.F.Out,"<td class=\"LOG CENTER_TOP COLOR%u\">",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
ID_WriteUsrIDs (&UsrDat); ID_WriteUsrIDs (&UsrDat,NULL);
fprintf (Gbl.F.Out,"&nbsp;</td>"); fprintf (Gbl.F.Out,"&nbsp;</td>");
/* Write the first name and the surnames */ /* Write the first name and the surnames */
@ -1912,7 +1912,7 @@ static void Sta_ShowNumHitsPerUsr (unsigned long NumRows,
/* Write the user's ID if user is a student in current course */ /* Write the user's ID if user is a student in current course */
fprintf (Gbl.F.Out,"<td class=\"LOG LEFT_TOP COLOR%u\">", fprintf (Gbl.F.Out,"<td class=\"LOG LEFT_TOP COLOR%u\">",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
ID_WriteUsrIDs (&UsrDat); ID_WriteUsrIDs (&UsrDat,NULL);
fprintf (Gbl.F.Out,"&nbsp;</td>"); fprintf (Gbl.F.Out,"&nbsp;</td>");
/* Write the name and the surnames */ /* Write the name and the surnames */

View File

@ -7551,7 +7551,7 @@ static void Tst_ShowDataUsr (struct UsrData *UsrDat,unsigned NumTestResults)
Act_LinkFormSubmit (UsrDat->FullName,"AUTHOR_TXT",NULL); Act_LinkFormSubmit (UsrDat->FullName,"AUTHOR_TXT",NULL);
/***** Show user's ID *****/ /***** Show user's ID *****/
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,NULL);
/***** Show user's name *****/ /***** Show user's name *****/
fprintf (Gbl.F.Out,"<br />%s",UsrDat->Surname1); fprintf (Gbl.F.Out,"<br />%s",UsrDat->Surname1);
@ -7691,7 +7691,7 @@ void Tst_ShowOneTestResult (void)
"</td>" "</td>"
"<td class=\"DAT LEFT_TOP\">", "<td class=\"DAT LEFT_TOP\">",
Txt_ROLES_SINGUL_Abc[Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB][Gbl.Usrs.Other.UsrDat.Sex]); Txt_ROLES_SINGUL_Abc[Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB][Gbl.Usrs.Other.UsrDat.Sex]);
ID_WriteUsrIDs (&Gbl.Usrs.Other.UsrDat); ID_WriteUsrIDs (&Gbl.Usrs.Other.UsrDat,NULL);
fprintf (Gbl.F.Out," %s", fprintf (Gbl.F.Out," %s",
Gbl.Usrs.Other.UsrDat.Surname1); Gbl.Usrs.Other.UsrDat.Surname1);
if (Gbl.Usrs.Other.UsrDat.Surname2[0]) if (Gbl.Usrs.Other.UsrDat.Surname2[0])

View File

@ -9591,27 +9591,6 @@ const char *Txt_Do_you_think_you_are_this_user =
"Voc&ecirc; acha que voc&ecirc; &eacute; deste usu&aacute;rio?"; "Voc&ecirc; acha que voc&ecirc; &eacute; deste usu&aacute;rio?";
#endif #endif
const char *Txt_Do_you_want_to_confirm_the_ID_X = // Warning: it is very important to include %s in the following sentences
#if L==1
"Voleu confirmar l'ID (DNI/c&egrave;dula) <strong>%s</strong>?";
#elif L==2
"Wollen Sie die ID <strong>%s</strong> zu best&auml;tigen?";
#elif L==3
"Do you want to confirm the ID (identity number/passport) <strong>%s</strong>?";
#elif L==4
"&iquest;Desea confirmar el ID (DNI/c&eacute;dula) <strong>%s</strong>?";
#elif L==5
"Voulez-vous confirmer l'ID <strong>%s</strong>?";
#elif L==6
"&iquest;Desea confirmar el ID (DNI/c&eacute;dula) <strong>%s</strong>?"; // Okoteve traducción
#elif L==7
"Vuoi confermare l'ID <strong>%s</strong>?";
#elif L==8
"Czy chcesz potwierdzi&cacute; I <strong>%s</strong>?";
#elif L==9
"Voc&ecirc; quer confirmar o ID <strong>%s</strong>?";
#endif
const char *Txt_Document = const char *Txt_Document =
#if L==1 #if L==1
"Document"; "Document";

View File

@ -3194,7 +3194,7 @@ void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat,
UsrDat->Accepted ? "DAT_SMALL_N" : UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL", "DAT_SMALL",
BgColor); BgColor);
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,NULL);
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>");
/***** Write rest of main user's data *****/ /***** Write rest of main user's data *****/
@ -3239,7 +3239,7 @@ static void Usr_WriteRowGstAllData (struct UsrData *UsrDat)
/****** Write user's ID ******/ /****** Write user's ID ******/
fprintf (Gbl.F.Out,"<td class=\"DAT_SMALL LEFT_MIDDLE COLOR%u\">", fprintf (Gbl.F.Out,"<td class=\"DAT_SMALL LEFT_MIDDLE COLOR%u\">",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,NULL);
fprintf (Gbl.F.Out,"&nbsp;</td>"); fprintf (Gbl.F.Out,"&nbsp;</td>");
/***** Write rest of guest's main data *****/ /***** Write rest of guest's main data *****/
@ -3343,7 +3343,7 @@ static void Usr_WriteRowStdAllData (struct UsrData *UsrDat,char *GroupNames)
UsrDat->Accepted ? "DAT_SMALL_N" : UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL", "DAT_SMALL",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,NULL);
fprintf (Gbl.F.Out,"&nbsp;</td>"); fprintf (Gbl.F.Out,"&nbsp;</td>");
/***** Write rest of main student's data *****/ /***** Write rest of main student's data *****/
@ -3462,7 +3462,7 @@ static void Usr_WriteRowTchAllData (struct UsrData *UsrDat)
UsrDat->Accepted ? "DAT_SMALL_N" : UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL", "DAT_SMALL",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,NULL);
fprintf (Gbl.F.Out,"&nbsp;</td>"); fprintf (Gbl.F.Out,"&nbsp;</td>");
/***** Write rest of main teacher's data *****/ /***** Write rest of main teacher's data *****/
@ -3541,7 +3541,7 @@ static void Usr_WriteRowAdmData (unsigned NumUsr,struct UsrData *UsrDat)
UsrDat->Accepted ? "DAT_SMALL_N" : UsrDat->Accepted ? "DAT_SMALL_N" :
"DAT_SMALL", "DAT_SMALL",
Gbl.RowEvenOdd); Gbl.RowEvenOdd);
ID_WriteUsrIDs (UsrDat); ID_WriteUsrIDs (UsrDat,NULL);
fprintf (Gbl.F.Out,"&nbsp;</td>"); fprintf (Gbl.F.Out,"&nbsp;</td>");
/***** Write rest of main administrator's data *****/ /***** Write rest of main administrator's data *****/