Version19.67

This commit is contained in:
Antonio Cañas Vargas 2019-11-14 02:29:18 +01:00
parent 21f7aec522
commit 8298f13fb6
9 changed files with 148 additions and 118 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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,

View File

@ -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 ();
}
/*****************************************************************************/

View File

@ -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

View File

@ -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);

View File

@ -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,

View File

@ -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");
}

View File

@ -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