diff --git a/swad_attendance.c b/swad_attendance.c index f1f71eb7..8aada605 100644 --- a/swad_attendance.c +++ b/swad_attendance.c @@ -2440,14 +2440,14 @@ static unsigned Att_GetNumUsrsFromAListWhoAreInAttEvent (long AttCod, long LstSelectedUsrCods[], unsigned NumUsrsInList) { - char *SubQueryAllUsrs; + char *SubQueryUsrs; unsigned NumUsrsInAttEvent; if (NumUsrsInList) { /***** Create subquery string *****/ Usr_CreateSubqueryUsrCods (LstSelectedUsrCods,NumUsrsInList, - &SubQueryAllUsrs); + &SubQueryUsrs); /***** Get number of users in attendance event from database ****/ NumUsrsInAttEvent = @@ -2456,10 +2456,10 @@ static unsigned Att_GetNumUsrsFromAListWhoAreInAttEvent (long AttCod, "SELECT COUNT(*) FROM att_usr" " WHERE AttCod=%ld" " AND UsrCod IN (%s) AND Present='Y'", - AttCod,SubQueryAllUsrs); + AttCod,SubQueryUsrs); /***** Free memory for subquery string *****/ - Usr_FreeSubqueryUsrCods (SubQueryAllUsrs); + Usr_FreeSubqueryUsrCods (SubQueryUsrs); } else NumUsrsInAttEvent = 0; diff --git a/swad_changelog.h b/swad_changelog.h index 060676a9..cdd4e8a8 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -487,16 +487,15 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - * En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 19.66.5 (2019-11-13)" +#define Log_PLATFORM_VERSION "SWAD 19.67 (2019-11-13)" #define CSS_FILE "swad19.47.css" #define JS_FILE "swad19.65.js" /* // TODO: Hacer un nuevo rol en los TFG: tutor externo (profesor de áreas no vinculadas con el centro, profesionales de empresas, etc.) // TODO: Impedir la creación y edición de proyectos si no son editables. -// TODO: Importante: filtrar proyectos por usuarios (igual que en trabajos o en asistencia) // TODO: Code refactoring in HTML h1, title, meta, video, p, iframe, input hidden, area - Version 19.66.6: Nov 13, 2019 Filter projects by selected users. (? lines) + Version 19.67: Nov 13, 2019 Filter projects by selected users. (246729 lines) Version 19.66.5: Nov 13, 2019 Code refactoring in list of users in attendance event. (246704 lines) Version 19.66.4: Nov 13, 2019 Code refactoring in list of users in attendance event. (246729 lines) Version 19.66.3: Nov 13, 2019 Filter projects by selected users. Not finished. (246656 lines) diff --git a/swad_match_result.c b/swad_match_result.c index 42c8b978..ee8d555f 100644 --- a/swad_match_result.c +++ b/swad_match_result.c @@ -274,7 +274,7 @@ void McR_ShowUsrsMchResults (void) Dat_GetIniEndDatesFromForm (); /***** Check the number of users whose matches results will be shown *****/ - if (Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods ()) // If some users are selected... + if (Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods ()) // If some users are selected... { /***** Begin box and table *****/ Box_StartBoxTable (NULL,Txt_Results,NULL, diff --git a/swad_project.c b/swad_project.c index 1345604b..5aa7a847 100644 --- a/swad_project.c +++ b/swad_project.c @@ -124,6 +124,7 @@ struct Prj_Faults /***************************** Private prototypes ****************************/ /*****************************************************************************/ +static void Prj_GetSelectedUsrsAndShowPrjs (void); static void Prj_ReqListUsrsToSelect (void); static void Prj_ShowProjectsInCurrentPage (void); @@ -251,15 +252,25 @@ void Prj_SeeProjects (void) if (Gbl.Prjs.Filter.ReqUsrs) // Request the selection of users /* List users to select some of them */ Prj_ReqListUsrsToSelect (); - if (Gbl.Prjs.Filter.SelUsrs) // Some users should have been selected + else /* Show projects of selected users */ - Prj_ShowProjectsInCurrentPage (); + Prj_GetSelectedUsrsAndShowPrjs (); break; default: break; } } +/*****************************************************************************/ +/****** Get and check list of selected users, and show users' projects *******/ +/*****************************************************************************/ + +static void Prj_GetSelectedUsrsAndShowPrjs (void) + { + Usr_GetSelectedUsrsAndGoToAct (Prj_ShowProjectsInCurrentPage,// when user(s) selected + Prj_ReqListUsrsToSelect); // when no user selected + } + /*****************************************************************************/ /**************************** List users to select ***************************/ /*****************************************************************************/ @@ -686,6 +697,10 @@ void Prj_PutParams (struct Prj_Filter *Filter, /***** Put another user's code *****/ if (Gbl.Usrs.Other.UsrDat.UsrCod > 0) Usr_PutParamOtherUsrCodEncrypted (); + + /***** Put selected users' codes *****/ + if (Filter->Who == Usr_WHO_SELECTED) + Usr_PutHiddenParSelectedUsrsCods (); } /*****************************************************************************/ @@ -801,15 +816,9 @@ static void Prj_GetParamWho (void) /***** Request users? / Some users should have been selected? *****/ if (Gbl.Prjs.Filter.Who == Usr_WHO_SELECTED) - { Gbl.Prjs.Filter.ReqUsrs = Usr_GetHiddenParamRequestUsrs (); - Gbl.Prjs.Filter.SelUsrs = Usr_GetHiddenParamSelectedUsrs (); - } else - { Gbl.Prjs.Filter.ReqUsrs = false; - Gbl.Prjs.Filter.SelUsrs = false; - } } /*****************************************************************************/ @@ -2645,10 +2654,11 @@ static void Prj_GetListProjects (void) "projects.ModifTime DESC," "projects.Title", }; - MYSQL_RES *mysql_res; + MYSQL_RES *mysql_res = NULL; // Initialized to avoid freeing when not assigned MYSQL_ROW row; unsigned NumUsrsInList; long *LstSelectedUsrCods; + char *SubQueryUsrs; unsigned long NumRows = 0; // Initialized to avoid warning unsigned NumPrjsFromDB; unsigned NumPrjsAfterFilter = 0; @@ -2656,14 +2666,6 @@ static void Prj_GetListProjects (void) struct Prj_Faults Faults; long PrjCod; - /***** Get list of selected users' codes if not already got *****/ - Usr_GetListsSelectedUsrsCods (); - NumUsrsInList = Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (); - - /***** Get list of users selected to show their projects *****/ - if (NumUsrsInList) - Usr_GetListSelectedUsrCods (NumUsrsInList,&LstSelectedUsrCods); - /***** Get list of projects from database *****/ if (Gbl.Prjs.LstIsRead) Prj_FreeListProjects (); @@ -2737,6 +2739,7 @@ static void Prj_GetListProjects (void) switch (Gbl.Prjs.Filter.Who) { case Usr_WHO_ME: + /* Get list of projects */ switch (Gbl.Prjs.SelectedOrder) { case Prj_ORDER_START_TIME: @@ -2749,6 +2752,7 @@ static void Prj_GetListProjects (void) "%s%s%s" " AND projects.PrjCod=prj_usr.PrjCod" " AND prj_usr.UsrCod=%ld" + " GROUP BY projects.PrjCod" // To not repeat projects (DISTINCT can not be used) " ORDER BY %s", Gbl.Hierarchy.Crs.CrsCod, PreNonSubQuery,HidVisSubQuery,DptCodSubQuery, @@ -2764,6 +2768,7 @@ static void Prj_GetListProjects (void) "%s%s%s" " AND projects.PrjCod=prj_usr.PrjCod" " AND prj_usr.UsrCod=%ld" + " GROUP BY projects.PrjCod" // To not repeat projects (DISTINCT can not be used) " ORDER BY %s", Gbl.Hierarchy.Crs.CrsCod, PreNonSubQuery,HidVisSubQuery,DptCodSubQuery, @@ -2773,42 +2778,71 @@ static void Prj_GetListProjects (void) } break; case Usr_WHO_SELECTED: - switch (Gbl.Prjs.SelectedOrder) + /* Get list of selected users' codes if not already got */ + // Usr_GetListsSelectedUsrsCods (); + NumUsrsInList = Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (); + + if (NumUsrsInList) { - case Prj_ORDER_START_TIME: - case Prj_ORDER_END_TIME: - case Prj_ORDER_TITLE: - NumRows = DB_QuerySELECT (&mysql_res,"can not get projects", - "SELECT projects.PrjCod" - " FROM projects,prj_usr" - " WHERE projects.CrsCod=%ld" - "%s%s%s" - " AND projects.PrjCod=prj_usr.PrjCod" - " AND prj_usr.UsrCod=%ld" - " ORDER BY %s", - Gbl.Hierarchy.Crs.CrsCod, - PreNonSubQuery,HidVisSubQuery,DptCodSubQuery, - Gbl.Usrs.Me.UsrDat.UsrCod, - OrderBySubQuery[Gbl.Prjs.SelectedOrder]); - break; - case Prj_ORDER_DEPARTMENT: - NumRows = DB_QuerySELECT (&mysql_res,"can not get projects", - "SELECT projects.PrjCod" - " FROM prj_usr,projects LEFT JOIN departments" - " ON projects.DptCod=departments.DptCod" - " WHERE projects.CrsCod=%ld" - "%s%s%s" - " AND projects.PrjCod=prj_usr.PrjCod" - " AND prj_usr.UsrCod=%ld" - " ORDER BY %s", - Gbl.Hierarchy.Crs.CrsCod, - PreNonSubQuery,HidVisSubQuery,DptCodSubQuery, - Gbl.Usrs.Me.UsrDat.UsrCod, - OrderBySubQuery[Gbl.Prjs.SelectedOrder]); - break; + /* Get list of users selected to show their projects */ + Usr_GetListSelectedUsrCods (NumUsrsInList,&LstSelectedUsrCods); + + /* Create subquery string */ + Usr_CreateSubqueryUsrCods (LstSelectedUsrCods,NumUsrsInList, + &SubQueryUsrs); + + /* Get list of projects */ + switch (Gbl.Prjs.SelectedOrder) + { + case Prj_ORDER_START_TIME: + case Prj_ORDER_END_TIME: + case Prj_ORDER_TITLE: + NumRows = DB_QuerySELECT (&mysql_res,"can not get projects", + "SELECT projects.PrjCod" + " FROM projects,prj_usr" + " WHERE projects.CrsCod=%ld" + "%s%s%s" + " AND projects.PrjCod=prj_usr.PrjCod" + " AND prj_usr.UsrCod IN (%s)" + " GROUP BY projects.PrjCod" // To not repeat projects (DISTINCT can not be used) + " ORDER BY %s", + Gbl.Hierarchy.Crs.CrsCod, + PreNonSubQuery,HidVisSubQuery,DptCodSubQuery, + SubQueryUsrs, + OrderBySubQuery[Gbl.Prjs.SelectedOrder]); + break; + case Prj_ORDER_DEPARTMENT: + NumRows = DB_QuerySELECT (&mysql_res,"can not get projects", + "SELECT projects.PrjCod" + " FROM prj_usr,projects LEFT JOIN departments" + " ON projects.DptCod=departments.DptCod" + " WHERE projects.CrsCod=%ld" + "%s%s%s" + " AND projects.PrjCod=prj_usr.PrjCod" + " AND prj_usr.UsrCod IN (%s)" + " GROUP BY projects.PrjCod" // To not repeat projects (DISTINCT can not be used) + " ORDER BY %s", + Gbl.Hierarchy.Crs.CrsCod, + PreNonSubQuery,HidVisSubQuery,DptCodSubQuery, + SubQueryUsrs, + OrderBySubQuery[Gbl.Prjs.SelectedOrder]); + break; + } + + /* Free memory for subquery string */ + Usr_FreeSubqueryUsrCods (SubQueryUsrs); + + /* Free list of user codes */ + Usr_FreeListSelectedUsrCods (LstSelectedUsrCods); } + else + NumRows = 0; + + /* Free memory used by list of selected users' codes */ + // Usr_FreeListsSelectedEncryptedUsrsCods (); break; case Usr_WHO_ALL: + /* Get list of projects */ switch (Gbl.Prjs.SelectedOrder) { case Prj_ORDER_START_TIME: @@ -2891,13 +2925,6 @@ static void Prj_GetListProjects (void) Gbl.Prjs.Num = NumPrjsAfterFilter; Gbl.Prjs.LstIsRead = true; - - /***** Free list of user codes *****/ - if (NumUsrsInList) - Usr_FreeListSelectedUsrCods (LstSelectedUsrCods); - - /***** Free memory used by list of selected users' codes *****/ - Usr_FreeListsSelectedEncryptedUsrsCods (); } /*****************************************************************************/ diff --git a/swad_project.h b/swad_project.h index a67d47d2..92be9aaa 100644 --- a/swad_project.h +++ b/swad_project.h @@ -91,7 +91,6 @@ struct Prj_Filter { Usr_Who_t Who; // Show my / selected users' / all projects bool ReqUsrs; // Request selection of users to view their projects? - bool SelUsrs; // Are there selected users to view their projects? unsigned Assign; // Show assigned / non assigned projects unsigned Hidden; // Show hidden / visible projects unsigned Faulti; // Show faulty / faultless projects diff --git a/swad_statistic.c b/swad_statistic.c index 7e580df6..c102854a 100644 --- a/swad_statistic.c +++ b/swad_statistic.c @@ -916,7 +916,7 @@ static void Sta_ShowHits (Sta_GlobalOrCourseAccesses_t GlobalOrCourse) HTM_SECTION_Begin (Sta_STAT_RESULTS_SECTION_ID); /***** Check selection *****/ - if (!Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods ()) // Error: there are no users selected + if (!Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods ()) // Error: there are no users selected { /* Write warning message, clean and abort */ Ale_ShowAlert (Ale_WARNING,Txt_You_must_select_one_ore_more_users); diff --git a/swad_test.c b/swad_test.c index 96f1dcb8..c8795cf0 100644 --- a/swad_test.c +++ b/swad_test.c @@ -7646,7 +7646,7 @@ void Tst_ShowUsrsTstResults (void) Dat_GetIniEndDatesFromForm (); /***** Check the number of users whose tests results will be shown *****/ - if (Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods ()) // If some users are selected... + if (Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods ()) // If some users are selected... { /***** Begin box and table *****/ Box_StartBoxTable (NULL,Txt_Results,NULL, diff --git a/swad_user.c b/swad_user.c index 4d0f7ec9..f02f0250 100644 --- a/swad_user.c +++ b/swad_user.c @@ -5971,7 +5971,30 @@ bool Usr_FindEncryptedUsrCodsInListOfSelectedEncryptedUsrCods (const char *Encry } /*****************************************************************************/ -/************ Count number of valid users' IDs in encrypted list *************/ +/******* Check if there are valid users in list of encrypted user codes ******/ +/*****************************************************************************/ + +bool Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods (void) + { + const char *Ptr; + struct UsrData UsrDat; + + /***** Loop over the list Gbl.Usrs.Selected.List[Rol_UNK] + to check if there are valid users *****/ + Ptr = Gbl.Usrs.Selected.List[Rol_UNK]; + while (*Ptr) + { + Par_GetNextStrUntilSeparParamMult (&Ptr,UsrDat.EncryptedUsrCod, + Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64); + Usr_GetUsrCodFromEncryptedUsrCod (&UsrDat); + if (UsrDat.UsrCod > 0) + return true; + } + return false; + } + +/*****************************************************************************/ +/******** Count number of valid users in list of encrypted user codes ********/ /*****************************************************************************/ unsigned Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (void) @@ -5980,7 +6003,8 @@ unsigned Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (void) unsigned NumUsrs = 0; struct UsrData UsrDat; - /***** Loop over the list Gbl.Usrs.Selected.List[Rol_UNK] to count the number of users *****/ + /***** Loop over the list Gbl.Usrs.Selected.List[Rol_UNK] + to count the number of users *****/ Ptr = Gbl.Usrs.Selected.List[Rol_UNK]; while (*Ptr) { @@ -6081,42 +6105,39 @@ void Usr_FreeListSelectedUsrCods (long *LstSelectedUsrCods) void Usr_CreateSubqueryUsrCods (long LstSelectedUsrCods[], unsigned NumUsrsInList, - char **SubQueryAllUsrs) + char **SubQueryUsrs) { char SubQueryOneUsr[1 + Cns_MAX_DECIMAL_DIGITS_LONG + 1]; unsigned NumUsr; size_t MaxLength; - if (NumUsrsInList) - { - /***** Allocate space for subquery *****/ - MaxLength = NumUsrsInList * (1 + Cns_MAX_DECIMAL_DIGITS_LONG); - if ((*SubQueryAllUsrs = (char *) malloc (MaxLength + 1)) == NULL) - Lay_NotEnoughMemoryExit (); - (*SubQueryAllUsrs)[0] = '\0'; + /***** Allocate space for subquery *****/ + MaxLength = NumUsrsInList * (1 + Cns_MAX_DECIMAL_DIGITS_LONG); + if ((*SubQueryUsrs = (char *) malloc (MaxLength + 1)) == NULL) + Lay_NotEnoughMemoryExit (); + (*SubQueryUsrs)[0] = '\0'; - /***** Count number of students registered in an event in database *****/ - for (NumUsr = 0; - NumUsr < NumUsrsInList; - NumUsr++) - if (NumUsr) - { - snprintf (SubQueryOneUsr,sizeof (SubQueryOneUsr), - ",%ld", - LstSelectedUsrCods[NumUsr]); - Str_Concat (*SubQueryAllUsrs,SubQueryOneUsr, - MaxLength); - } - else - snprintf (*SubQueryAllUsrs,sizeof (SubQueryOneUsr), - "%ld", - LstSelectedUsrCods[NumUsr]); - } + /***** Build subquery *****/ + for (NumUsr = 0; + NumUsr < NumUsrsInList; + NumUsr++) + if (NumUsr) + { + snprintf (SubQueryOneUsr,sizeof (SubQueryOneUsr), + ",%ld", + LstSelectedUsrCods[NumUsr]); + Str_Concat (*SubQueryUsrs,SubQueryOneUsr, + MaxLength); + } + else + snprintf (*SubQueryUsrs,sizeof (SubQueryOneUsr), + "%ld", + LstSelectedUsrCods[NumUsr]); } -void Usr_FreeSubqueryUsrCods (char *SubQueryAllUsrs) +void Usr_FreeSubqueryUsrCods (char *SubQueryUsrs) { - free (SubQueryAllUsrs); + free (SubQueryUsrs); } /*****************************************************************************/ @@ -6283,7 +6304,6 @@ void Usr_PutFormToSelectUsrsToGoToAct (Act_Action_t NextAction,void (*FuncParams /* Hidden parameters */ Grp_PutParamsCodGrps (); - Usr_PutHiddenParamSelectedUsrs (); if (NextAction == ActAdmAsgWrkCrs) { Gbl.FileBrowser.FullTree = true; // By default, show all files @@ -6337,7 +6357,7 @@ void Usr_GetSelectedUsrsAndGoToAct (void (*FuncWhenUsrsSelected) (), Usr_GetListsSelectedUsrsCods (); /***** Check number of users *****/ - if (Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods ()) // If some users are selected... + if (Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods ()) // If some users are selected... FuncWhenUsrsSelected (); else // If no users are selected... { @@ -8453,8 +8473,8 @@ void Usr_DoActionOnSeveralUsrs1 (void) /* Get list of selected users */ Usr_GetListsSelectedUsrsCods (); - /* Check the number of users */ - if (!Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods ())// If no users selected... + /* Check if there are selected users */ + if (!Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods ())// If no users selected... { // ...write warning notice Ale_CreateAlert (Ale_WARNING,NULL, Txt_You_must_select_one_ore_more_users); @@ -9889,17 +9909,3 @@ bool Usr_GetHiddenParamRequestUsrs (void) { return Par_GetParToBool ("RequestUsrs"); } - -/*****************************************************************************/ -/**** Hidden param to indicate that some users should have been selected *****/ -/*****************************************************************************/ - -void Usr_PutHiddenParamSelectedUsrs (void) - { - Par_PutHiddenParamChar ("SelectedUsrs",'Y'); - } - -bool Usr_GetHiddenParamSelectedUsrs (void) - { - return Par_GetParToBool ("SelectedUsrs"); - } diff --git a/swad_user.h b/swad_user.h index 1ded3fd9..f196263f 100644 --- a/swad_user.h +++ b/swad_user.h @@ -434,6 +434,7 @@ void Usr_GetListsSelectedUsrsCods (void); bool Usr_GetListMsgRecipientsWrittenExplicitelyBySender (bool WriteErrorMsgs); bool Usr_FindEncryptedUsrCodsInListOfSelectedEncryptedUsrCods (const char *EncryptedUsrCodToFind); +bool Usr_CheckIfThereAreUsrsInListOfSelectedEncryptedUsrCods (void); unsigned Usr_CountNumUsrsInListOfSelectedEncryptedUsrCods (void); void Usr_FreeListsSelectedEncryptedUsrsCods (void); @@ -442,8 +443,8 @@ void Usr_FreeListSelectedUsrCods (long *LstSelectedUsrCods); void Usr_CreateSubqueryUsrCods (long LstSelectedUsrCods[], unsigned NumUsrsInList, - char **SubQueryAllUsrs); -void Usr_FreeSubqueryUsrCods (char *SubQueryAllUsrs); + char **SubQueryUsrs); +void Usr_FreeSubqueryUsrCods (char *SubQueryUsrs); void Usr_FreeListOtherRecipients (void); @@ -513,7 +514,5 @@ void Usr_PutHiddenParamWho (Usr_Who_t Who); Usr_Who_t Usr_GetHiddenParamWho (void); void Usr_PutHiddenParamRequestUsrs (void); bool Usr_GetHiddenParamRequestUsrs (void); -void Usr_PutHiddenParamSelectedUsrs (void); -bool Usr_GetHiddenParamSelectedUsrs (void); #endif