diff --git a/sql/cambios.sql b/sql/cambios.sql index 348cd9a53..086fa50ca 100644 --- a/sql/cambios.sql +++ b/sql/cambios.sql @@ -11610,3 +11610,24 @@ SELECT DISTINCT UsrCod FROM (SELECT DISTINCT UsrCod FROM usr_IDs WHERE UsrID IN SELECT * FROM file_view,files WHERE files.FileBrowser='9' AND files.Cod='-1' AND files.FilCod=file_view.FilCod; + + + + + + + + + + + + + + + +SELECT COUNT(*) FROM msg_content WHERE MsgCod NOT IN (SELECT MsgCod FROM msg_snt) AND MsgCod NOT IN (SELECT DISTINCT MsgCod FROM msg_rcv); + + +SELECT COUNT(*) FROM msg_content LEFT JOIN msg_snt ON (msg_content.MsgCod=msg_snt.MsgCod) WHERE msg_content.MsgCod IS NULL; + + diff --git a/swad_account.c b/swad_account.c index 730b30438..6259b1e96 100644 --- a/swad_account.c +++ b/swad_account.c @@ -68,6 +68,7 @@ extern struct Globals Gbl; /***************************** Private prototypes ****************************/ /*****************************************************************************/ +static void Acc_ShowFormCheckIfIHaveAccount (void); static void Acc_ShowFormRequestNewAccountWithParams (const char *NewNicknameWithoutArroba, const char *NewEmail); static bool Acc_GetParamsNewAccount (char *NewNicknameWithoutArroba, @@ -116,10 +117,84 @@ void Acc_ShowFormAccount (void) Pre_PutLinkToChangeLanguage (); fprintf (Gbl.F.Out,""); + /**** Show form to check if I have an account *****/ + Acc_ShowFormCheckIfIHaveAccount (); + + /**** Show form to create a new account *****/ Acc_ShowFormRequestNewAccountWithParams ("",""); } } +/*****************************************************************************/ +/***************** Show form to check if I have an account *******************/ +/*****************************************************************************/ + +static void Acc_ShowFormCheckIfIHaveAccount (void) + { + extern const char *The_ClassForm[The_NUM_THEMES]; + extern const char *Txt_ID; + + /***** Start frame *****/ + Lay_StartRoundFrame (NULL,"Compruebe si ya existe una cuenta para usted",NULL); // TODO: Need translation!!! + + /***** Info message *****/ + Lay_ShowAlert (Lay_INFO,"Es posible que un profesor o administrador" + " ya haya creado una cuenta para usted" + " asociada a su ID (DNI/cédula)." + " Escriba su ID (DNI/cédula)" + " para comprobarlo."); // TODO: Need translation!!!! + + /***** Form to request user's ID for possible account already created *****/ + Act_FormStart (ActChkUsrAcc); + fprintf (Gbl.F.Out,"" + "", + The_ClassForm[Gbl.Prefs.Theme],Txt_ID, + ID_MAX_LENGTH_USR_ID); + Lay_PutConfirmButton ("Comprobar"); // TODO: Need translation!!!! + Act_FormEnd (); + + /***** End frame *****/ + Lay_EndRoundFrame (); + } + +/*****************************************************************************/ +/* Check if already exists a new account without password associated to a ID */ +/*****************************************************************************/ + +void Acc_CheckIfEmptyAccountExists (void) + { + struct ListUsrCods ListUsrCods; // List with users' codes for a given user's ID + unsigned NumUsr; + + Lay_ShowAlert (Lay_INFO,"Usuarios encontrados:"); // TODO: Change this check!!!!!!!! + + /***** Allocate space for the list of IDs *****/ + ID_ReallocateListIDs (&Gbl.Usrs.Other.UsrDat,1); + + /***** Get new user's ID from form *****/ + Par_GetParToText ("ID",Gbl.Usrs.Other.UsrDat.IDs.List[0].ID,ID_MAX_LENGTH_USR_ID); + // Users' IDs are always stored internally in capitals and without leading zeros + Str_RemoveLeadingZeros (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID); + Str_ConvertToUpperText (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID); + + /***** Check if there are users with this user's ID *****/ + if (ID_CheckIfUsrIDIsValid (Gbl.Usrs.Other.UsrDat.IDs.List[0].ID)) + if (ID_GetListUsrCodsFromUsrID (&Gbl.Usrs.Other.UsrDat,NULL,&ListUsrCods,false)) // User(s) found + { + for (NumUsr = 0; + NumUsr < ListUsrCods.NumUsrs; + NumUsr++) + fprintf (Gbl.F.Out,"UsrCod = %ld
", // TODO: Change this check!!!!!!!! + ListUsrCods.Lst[NumUsr]); // User found + + /* Free memory used for list of users' codes found for this ID */ + Usr_FreeListUsrCods (&ListUsrCods); + } + } + /*****************************************************************************/ /************ Show form to create a new account using parameters *************/ /*****************************************************************************/ diff --git a/swad_account.h b/swad_account.h index 6287372cf..40affae87 100644 --- a/swad_account.h +++ b/swad_account.h @@ -52,6 +52,9 @@ typedef enum void Acc_PutLinkToCreateAccount (void); void Acc_ShowFormAccount (void); + +void Acc_CheckIfEmptyAccountExists (void); + void Acc_ShowFormGoToRequestNewAccount (void); void Acc_ShowFormChangeMyAccount (void); bool Acc_CreateNewAccountAndLogIn (void); diff --git a/swad_action.c b/swad_action.c index ac2b21127..acfc208e2 100644 --- a/swad_action.c +++ b/swad_action.c @@ -1333,6 +1333,7 @@ Profile: 1141. ActAnnSee Mark announcement as seen 1142. ActChgMyRol Change type of logged user + NEW. ActChkUsrAcc Check if already exists a new account without password associated to a ID 1143. ActCreUsrAcc Create new user account 1144. ActRemID_Me Remove one of my user's IDs 1145. ActNewIDMe Create a new user's ID for me @@ -2764,6 +2765,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActAnnSee */{1234,-1,TabPrf,ActFrmRolSes ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ann_MarkAnnouncementAsSeen ,NULL}, /* ActChgMyRol */{ 589,-1,TabPrf,ActFrmRolSes ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Rol_ChangeMyRole ,Usr_ShowFormsLogoutAndRole ,NULL}, + /* ActChkUsrAcc */{1584,-1,TabPrf,ActFrmUsrAcc ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Acc_CheckIfEmptyAccountExists ,NULL}, /* ActCreUsrAcc */{1163,-1,TabPrf,ActFrmUsrAcc ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Acc_AfterCreationNewAccount ,NULL}, /* ActRemID_Me */{1147,-1,TabPrf,ActFrmUsrAcc ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,ID_RemoveMyUsrID ,NULL}, @@ -4436,6 +4438,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq ActSeeMyAgd, // #1581 ActSeeMyUsgRep, // #1582 ActPrnMyUsgRep, // #1583 + ActChkUsrAcc, // #1584 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index 55cacda6c..c66ce12b6 100644 --- a/swad_action.h +++ b/swad_action.h @@ -72,9 +72,9 @@ typedef enum typedef int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action -#define Act_NUM_ACTIONS (1+9+51+15+90+70+67+246+186+156+172+36+30+85) +#define Act_NUM_ACTIONS (1+9+51+15+90+70+67+246+186+156+172+36+30+86) -#define Act_MAX_ACTION_COD 1583 +#define Act_MAX_ACTION_COD 1584 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20 @@ -1388,83 +1388,84 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica #define ActAutUsrChgLan (ActPrnMyUsgRep+16) #define ActAnnSee (ActPrnMyUsgRep+17) #define ActChgMyRol (ActPrnMyUsgRep+18) -#define ActCreUsrAcc (ActPrnMyUsgRep+19) -#define ActRemID_Me (ActPrnMyUsgRep+20) -#define ActNewIDMe (ActPrnMyUsgRep+21) -#define ActRemOldNic (ActPrnMyUsgRep+22) -#define ActChgNic (ActPrnMyUsgRep+23) -#define ActRemMaiMe (ActPrnMyUsgRep+24) -#define ActNewMaiMe (ActPrnMyUsgRep+25) -#define ActCnfMai (ActPrnMyUsgRep+26) -#define ActFrmChgMyPwd (ActPrnMyUsgRep+27) -#define ActChgPwd (ActPrnMyUsgRep+28) -#define ActReqRemMyAcc (ActPrnMyUsgRep+29) -#define ActRemMyAcc (ActPrnMyUsgRep+30) +#define ActChkUsrAcc (ActPrnMyUsgRep+19) +#define ActCreUsrAcc (ActPrnMyUsgRep+20) +#define ActRemID_Me (ActPrnMyUsgRep+21) +#define ActNewIDMe (ActPrnMyUsgRep+22) +#define ActRemOldNic (ActPrnMyUsgRep+23) +#define ActChgNic (ActPrnMyUsgRep+24) +#define ActRemMaiMe (ActPrnMyUsgRep+25) +#define ActNewMaiMe (ActPrnMyUsgRep+26) +#define ActCnfMai (ActPrnMyUsgRep+27) +#define ActFrmChgMyPwd (ActPrnMyUsgRep+28) +#define ActChgPwd (ActPrnMyUsgRep+29) +#define ActReqRemMyAcc (ActPrnMyUsgRep+30) +#define ActRemMyAcc (ActPrnMyUsgRep+31) -#define ActChgMyData (ActPrnMyUsgRep+31) +#define ActChgMyData (ActPrnMyUsgRep+32) -#define ActReqMyPho (ActPrnMyUsgRep+32) -#define ActDetMyPho (ActPrnMyUsgRep+33) -#define ActUpdMyPho (ActPrnMyUsgRep+34) -#define ActReqRemMyPho (ActPrnMyUsgRep+35) -#define ActRemMyPho (ActPrnMyUsgRep+36) +#define ActReqMyPho (ActPrnMyUsgRep+33) +#define ActDetMyPho (ActPrnMyUsgRep+34) +#define ActUpdMyPho (ActPrnMyUsgRep+35) +#define ActReqRemMyPho (ActPrnMyUsgRep+36) +#define ActRemMyPho (ActPrnMyUsgRep+37) -#define ActEdiPri (ActPrnMyUsgRep+37) -#define ActChgPriPho (ActPrnMyUsgRep+38) -#define ActChgPriPrf (ActPrnMyUsgRep+39) +#define ActEdiPri (ActPrnMyUsgRep+38) +#define ActChgPriPho (ActPrnMyUsgRep+39) +#define ActChgPriPrf (ActPrnMyUsgRep+40) -#define ActReqEdiMyIns (ActPrnMyUsgRep+40) -#define ActChgCtyMyIns (ActPrnMyUsgRep+41) -#define ActChgMyIns (ActPrnMyUsgRep+42) -#define ActChgMyCtr (ActPrnMyUsgRep+43) -#define ActChgMyDpt (ActPrnMyUsgRep+44) -#define ActChgMyOff (ActPrnMyUsgRep+45) -#define ActChgMyOffPho (ActPrnMyUsgRep+46) +#define ActReqEdiMyIns (ActPrnMyUsgRep+41) +#define ActChgCtyMyIns (ActPrnMyUsgRep+42) +#define ActChgMyIns (ActPrnMyUsgRep+43) +#define ActChgMyCtr (ActPrnMyUsgRep+44) +#define ActChgMyDpt (ActPrnMyUsgRep+45) +#define ActChgMyOff (ActPrnMyUsgRep+46) +#define ActChgMyOffPho (ActPrnMyUsgRep+47) -#define ActReqEdiMyNet (ActPrnMyUsgRep+47) -#define ActChgMyNet (ActPrnMyUsgRep+48) +#define ActReqEdiMyNet (ActPrnMyUsgRep+48) +#define ActChgMyNet (ActPrnMyUsgRep+49) -#define ActChgThe (ActPrnMyUsgRep+49) -#define ActReqChgLan (ActPrnMyUsgRep+50) -#define ActChgLan (ActPrnMyUsgRep+51) -#define ActChg1stDay (ActPrnMyUsgRep+52) -#define ActChgCol (ActPrnMyUsgRep+53) -#define ActHidLftCol (ActPrnMyUsgRep+54) -#define ActHidRgtCol (ActPrnMyUsgRep+55) -#define ActShoLftCol (ActPrnMyUsgRep+56) -#define ActShoRgtCol (ActPrnMyUsgRep+57) -#define ActChgIco (ActPrnMyUsgRep+58) -#define ActChgMnu (ActPrnMyUsgRep+59) -#define ActChgNtfPrf (ActPrnMyUsgRep+60) +#define ActChgThe (ActPrnMyUsgRep+50) +#define ActReqChgLan (ActPrnMyUsgRep+51) +#define ActChgLan (ActPrnMyUsgRep+52) +#define ActChg1stDay (ActPrnMyUsgRep+53) +#define ActChgCol (ActPrnMyUsgRep+54) +#define ActHidLftCol (ActPrnMyUsgRep+55) +#define ActHidRgtCol (ActPrnMyUsgRep+56) +#define ActShoLftCol (ActPrnMyUsgRep+57) +#define ActShoRgtCol (ActPrnMyUsgRep+58) +#define ActChgIco (ActPrnMyUsgRep+59) +#define ActChgMnu (ActPrnMyUsgRep+60) +#define ActChgNtfPrf (ActPrnMyUsgRep+61) -#define ActPrnUsrQR (ActPrnMyUsgRep+61) +#define ActPrnUsrQR (ActPrnMyUsgRep+62) -#define ActPrnMyTT (ActPrnMyUsgRep+62) -#define ActEdiTut (ActPrnMyUsgRep+63) -#define ActChgTut (ActPrnMyUsgRep+64) -#define ActChgMyTT1stDay (ActPrnMyUsgRep+65) +#define ActPrnMyTT (ActPrnMyUsgRep+63) +#define ActEdiTut (ActPrnMyUsgRep+64) +#define ActChgTut (ActPrnMyUsgRep+65) +#define ActChgMyTT1stDay (ActPrnMyUsgRep+66) -#define ActReqRemFilBrf (ActPrnMyUsgRep+66) -#define ActRemFilBrf (ActPrnMyUsgRep+67) -#define ActRemFolBrf (ActPrnMyUsgRep+68) -#define ActCopBrf (ActPrnMyUsgRep+69) -#define ActPasBrf (ActPrnMyUsgRep+70) -#define ActRemTreBrf (ActPrnMyUsgRep+71) -#define ActFrmCreBrf (ActPrnMyUsgRep+72) -#define ActCreFolBrf (ActPrnMyUsgRep+73) -#define ActCreLnkBrf (ActPrnMyUsgRep+74) -#define ActRenFolBrf (ActPrnMyUsgRep+75) -#define ActRcvFilBrfDZ (ActPrnMyUsgRep+76) -#define ActRcvFilBrfCla (ActPrnMyUsgRep+77) -#define ActExpBrf (ActPrnMyUsgRep+78) -#define ActConBrf (ActPrnMyUsgRep+79) -#define ActZIPBrf (ActPrnMyUsgRep+80) -#define ActReqDatBrf (ActPrnMyUsgRep+81) -#define ActChgDatBrf (ActPrnMyUsgRep+82) -#define ActDowBrf (ActPrnMyUsgRep+83) +#define ActReqRemFilBrf (ActPrnMyUsgRep+67) +#define ActRemFilBrf (ActPrnMyUsgRep+68) +#define ActRemFolBrf (ActPrnMyUsgRep+69) +#define ActCopBrf (ActPrnMyUsgRep+70) +#define ActPasBrf (ActPrnMyUsgRep+71) +#define ActRemTreBrf (ActPrnMyUsgRep+72) +#define ActFrmCreBrf (ActPrnMyUsgRep+73) +#define ActCreFolBrf (ActPrnMyUsgRep+74) +#define ActCreLnkBrf (ActPrnMyUsgRep+75) +#define ActRenFolBrf (ActPrnMyUsgRep+76) +#define ActRcvFilBrfDZ (ActPrnMyUsgRep+77) +#define ActRcvFilBrfCla (ActPrnMyUsgRep+78) +#define ActExpBrf (ActPrnMyUsgRep+79) +#define ActConBrf (ActPrnMyUsgRep+80) +#define ActZIPBrf (ActPrnMyUsgRep+81) +#define ActReqDatBrf (ActPrnMyUsgRep+82) +#define ActChgDatBrf (ActPrnMyUsgRep+83) +#define ActDowBrf (ActPrnMyUsgRep+84) -#define ActReqRemOldBrf (ActPrnMyUsgRep+84) -#define ActRemOldBrf (ActPrnMyUsgRep+85) +#define ActReqRemOldBrf (ActPrnMyUsgRep+85) +#define ActRemOldBrf (ActPrnMyUsgRep+86) /*****************************************************************************/ /******************************** Public types *******************************/ diff --git a/swad_changelog.h b/swad_changelog.h index 88ec4bfa4..cc3983aa3 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -139,13 +139,20 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 16.1.1 (2016-09-22)" +#define Log_PLATFORM_VERSION "SWAD 16.2 (2016-09-22)" #define CSS_FILE "swad15.229.css" #define JS_FILE "swad15.238.1.js" // 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 /* + Version 16.2: Sep 22, 2016 New option to check if an account already exists. Not finished. (204901 lines) + 4 changes necessary in database: +INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1581','es','N','Mostrar mi agenda'); +INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1582','es','N','Ver mi informe de uso'); +INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1583','es','N','Imprimir mi informe de uso'); +INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1584','es','N','Comprobar si existe cuenta'); + Version 16.1.1: Sep 22, 2016 Index optimization in tables of users' courses. (204829 lines) Version 16.1: Sep 22, 2016 Temporary table with other user's courses. (204828 lines) Version 16.0: Sep 22, 2016 Temporary table with my courses.