From b5c01ab3342d43825490365fbbdd0a1b93d5b1a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Sat, 16 Apr 2016 15:05:18 +0200 Subject: [PATCH] Version 15.199 --- sql/cambios.sql | 5 ++++ swad_changelog.h | 5 ++-- swad_course.c | 47 +++++++++++++++--------------- swad_degree.c | 74 +++++++++++++++++++++++++++--------------------- swad_degree.h | 11 +++++-- swad_global.c | 5 ---- swad_global.h | 6 +--- swad_photo.c | 60 ++++++++++++++++++++++++--------------- 8 files changed, 119 insertions(+), 94 deletions(-) diff --git a/sql/cambios.sql b/sql/cambios.sql index b433b9adc..aa1ade1b3 100644 --- a/sql/cambios.sql +++ b/sql/cambios.sql @@ -11516,3 +11516,8 @@ OPTIMIZE TABLE msg_snt_deleted; SELECT COUNT(*) FROM social_notes WHERE NoteType='10'; + + +----- SWAD 15.199 (2016/04/16) ----- + +SELECT degrees.DegCod,degrees.CtrCod,degrees.DegTypCod,degrees.Status,degrees.RequesterUsrCod,degrees.ShortName,degrees.FullName,degrees.WWW FROM degrees,courses,crs_usr WHERE degrees.DegCod=courses.CrsCod AND courses.CrsCod=crs_usr.CrsCod AND crs_usr.Role='3' ORDER BY degrees.ShortName; diff --git a/swad_changelog.h b/swad_changelog.h index 022930512..eee7b2f8e 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -125,7 +125,6 @@ // TODO: Important!!!! E-mail should not be visible for not logged users // TODO: Do not show e-mails of administrators and teachers in lists openly // TODO: Fix bug in marks reported by Francisco Ocaņa -// TODO: In Statistics > Degrees, show only degrees with students // TODO: Change PhotoAttribution in table centres from TEXT to VARCHAR(255) (check maximum length first) // TODO: In social refreshing via AJAX, an error occurs when session expirates // TODO: Messages in msg_content_deleted older than a certain time should be deleted to ensure the protection of personal data @@ -136,13 +135,15 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.198 (2016-04-15)" +#define Log_PLATFORM_VERSION "SWAD 15.199 (2016-04-16)" #define CSS_FILE "swad15.198.css" #define JS_FILE "swad15.197.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 15.199: Apr 16, 2016 In Statistics > Degrees, show only degrees with students. + Code optimization in number of courses in a degree. (199665 lines) Version 15.198: Apr 15, 2016 Changes in layout related to image URL. (199646 lines) Version 15.197: Apr 15, 2016 Input field to enter image URL. (199518 lines) Version 15.196: Apr 15, 2016 Changes related to image URL. (199467 lines) diff --git a/swad_course.c b/swad_course.c index e16a6be38..4dc16de44 100644 --- a/swad_course.c +++ b/swad_course.c @@ -465,11 +465,16 @@ static void Crs_WriteListMyCoursesToSelectOne (void) MYSQL_RES *mysql_resDeg; MYSQL_RES *mysql_resCrs; MYSQL_ROW row; - unsigned NumCty,NumCtys; - unsigned NumIns,NumInss; - unsigned NumCtr,NumCtrs; - unsigned NumDeg,NumDegs; - unsigned NumCrs,NumCrss; + unsigned NumCty; + unsigned NumCtys; + unsigned NumIns; + unsigned NumInss; + unsigned NumCtr; + unsigned NumCtrs; + unsigned NumDeg; + unsigned NumDegs; + unsigned NumCrs; + unsigned NumCrss; char ActTxt[Act_MAX_LENGTH_ACTION_TXT+1]; char PathRelRSSFile[PATH_MAX+1]; char ClassNormal[64]; @@ -943,7 +948,7 @@ void Crs_ReqEditCourses (void) } /*****************************************************************************/ -/**************** Create a list with courses in this degree ******************/ +/*************** Create a list with courses in current degree ****************/ /*****************************************************************************/ static void Crs_GetListCoursesInDegree (Crs_WhatCourses_t WhatCourses) @@ -951,7 +956,7 @@ static void Crs_GetListCoursesInDegree (Crs_WhatCourses_t WhatCourses) char Query[512]; MYSQL_RES *mysql_res; MYSQL_ROW row; - unsigned long NumRows; + unsigned NumCrss; unsigned NumCrs; struct Course *Crs; @@ -974,20 +979,17 @@ static void Crs_GetListCoursesInDegree (Crs_WhatCourses_t WhatCourses) default: break; } - NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get the courses of a degree"); + NumCrss = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get the courses of a degree"); - if (NumRows) // Courses found... + if (NumCrss) // Courses found... { - // NumRows should be equal to Deg->NumCrss - Gbl.CurrentDeg.Deg.NumCrss = (unsigned) NumRows; - /***** Create list with courses in degree *****/ - if ((Gbl.CurrentDeg.Deg.LstCrss = (struct Course *) calloc (NumRows,sizeof (struct Course))) == NULL) + if ((Gbl.CurrentDeg.Deg.LstCrss = (struct Course *) calloc ((size_t) NumCrss,sizeof (struct Course))) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store the courses of a degree."); /***** Get the courses in degree *****/ for (NumCrs = 0; - NumCrs < Gbl.CurrentDeg.Deg.NumCrss; + NumCrs < NumCrss; NumCrs++) { Crs = &(Gbl.CurrentDeg.Deg.LstCrss[NumCrs]); @@ -997,8 +999,8 @@ static void Crs_GetListCoursesInDegree (Crs_WhatCourses_t WhatCourses) Crs_GetDataOfCourseFromRow (Crs,row); } } - else - Gbl.CurrentDeg.Deg.NumCrss = 0; + + Gbl.CurrentDeg.NumCrss = NumCrss; /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); @@ -1015,7 +1017,6 @@ void Crs_FreeListCoursesInDegree (struct Degree *Deg) /***** Free memory used by the list of courses in degree *****/ free ((void *) Deg->LstCrss); Deg->LstCrss = NULL; - Deg->NumCrss = 0; } } @@ -1129,7 +1130,7 @@ static void Crs_ListCourses (void) Lay_StartRoundFrame (NULL,Gbl.Title,ICanEdit ? Crs_PutIconToEditCourses : NULL); - if (Gbl.CurrentDeg.Deg.NumCrss) // There are courses in the current degree + if (Gbl.CurrentDeg.NumCrss) // There are courses in the current degree { /***** Start table *****/ fprintf (Gbl.F.Out,""); @@ -1153,8 +1154,8 @@ static void Crs_ListCourses (void) if (ICanEdit) { Act_FormStart (ActEdiCrs); - Lay_PutConfirmButton (Gbl.CurrentDeg.Deg.NumCrss ? Txt_Create_another_course : - Txt_Create_course); + Lay_PutConfirmButton (Gbl.CurrentDeg.NumCrss ? Txt_Create_another_course : + Txt_Create_course); Act_FormEnd (); } @@ -1195,7 +1196,7 @@ static bool Crs_ListCoursesOfAYearForSeeing (unsigned Year) /***** Write all the courses of this year *****/ for (NumCrs = 0; - NumCrs < Gbl.CurrentDeg.Deg.NumCrss; + NumCrs < Gbl.CurrentDeg.NumCrss; NumCrs++) { Crs = &(Gbl.CurrentDeg.Deg.LstCrss[NumCrs]); @@ -1292,7 +1293,7 @@ static void Crs_EditCourses (void) Crs_PutFormToCreateCourse (); /***** Forms to edit current courses *****/ - if (Gbl.CurrentDeg.Deg.NumCrss) + if (Gbl.CurrentDeg.NumCrss) Crs_ListCoursesForEdition (); } @@ -1328,7 +1329,7 @@ static void Crs_ListCoursesForEdition (void) Year <= Deg_MAX_YEARS_PER_DEGREE; Year++) for (NumCrs = 0; - NumCrs < Gbl.CurrentDeg.Deg.NumCrss; + NumCrs < Gbl.CurrentDeg.NumCrss; NumCrs++) { Crs = &(Gbl.CurrentDeg.Deg.LstCrss[NumCrs]); diff --git a/swad_degree.c b/swad_degree.c index 17da73fad..9663a732e 100644 --- a/swad_degree.c +++ b/swad_degree.c @@ -433,7 +433,7 @@ static void Deg_Configuration (bool PrintView) "" "", The_ClassForm[Gbl.Prefs.Theme], - Txt_Courses,Gbl.CurrentDeg.Deg.NumCrss); + Txt_Courses,Gbl.CurrentDeg.NumCrss); /***** Number of teachers *****/ fprintf (Gbl.F.Out,"" @@ -890,7 +890,7 @@ void Deg_InitCurrentCourse (void) /***** If numerical degree code is available, get degree data *****/ if (Gbl.CurrentDeg.Deg.DegCod > 0) { - if (Deg_GetDataOfDegreeByCod (&Gbl.CurrentDeg.Deg)) // Degree found + if (Deg_GetDataOfDegreeByCod (&Gbl.CurrentDeg.Deg)) // Degree found { Gbl.CurrentCtr.Ctr.CtrCod = Gbl.CurrentDeg.Deg.CtrCod; Gbl.CurrentDegTyp.DegTyp.DegTypCod = Gbl.CurrentDeg.Deg.DegTypCod; @@ -1050,6 +1050,7 @@ static void Deg_ListDegreesForEdition (void) struct UsrData UsrDat; bool ICanEdit; Deg_StatusTxt_t StatusTxt; + unsigned NumCrss; /***** Initialize structure with user's data *****/ Usr_UsrDataConstructor (&UsrDat); @@ -1067,12 +1068,14 @@ static void Deg_ListDegreesForEdition (void) { Deg = &(Gbl.CurrentCtr.LstDegs[NumDeg]); + NumCrss = Crs_GetNumCrssInDeg (Deg->DegCod); + ICanEdit = Deg_CheckIfICanEdit (Deg); /* Put icon to remove degree */ fprintf (Gbl.F.Out,"" "", - Deg->NumCrss); + NumCrss); /* Degree status */ StatusTxt = Deg_GetStatusTxtFromStatusBits (Deg->Status); @@ -1651,6 +1654,10 @@ static void Deg_ListOneDegreeForSeeing (struct Degree *Deg,unsigned NumDeg) const char *TxtClassStrong; const char *BgColor; Crs_StatusTxt_t StatusTxt; + unsigned NumCrss; + + /***** Get number of courses in this degree *****/ + NumCrss = Crs_GetNumCrssInDeg (Deg->DegCod); /***** Get data of type of degree of this degree *****/ DegTyp.DegTypCod = Deg->DegTypCod; @@ -1679,12 +1686,12 @@ static void Deg_ListOneDegreeForSeeing (struct Degree *Deg,unsigned NumDeg) "", BgColor, Gbl.Prefs.IconsURL, - Deg->NumCrss ? "ok_green" : - "tr", - Deg->NumCrss ? Txt_DEGREE_With_courses : - Txt_DEGREE_Without_courses, - Deg->NumCrss ? Txt_DEGREE_With_courses : - Txt_DEGREE_Without_courses); + NumCrss ? "ok_green" : + "tr", + NumCrss ? Txt_DEGREE_With_courses : + Txt_DEGREE_Without_courses, + NumCrss ? Txt_DEGREE_With_courses : + Txt_DEGREE_Without_courses); /***** Number of degree in this list *****/ fprintf (Gbl.F.Out,"", - TxtClassNormal,BgColor,Deg->NumCrss); + TxtClassNormal,BgColor,NumCrss); /***** Degree status *****/ StatusTxt = Deg_GetStatusTxtFromStatusBits (Deg->Status); @@ -1781,10 +1788,10 @@ void Deg_EditDegrees (void) } /*****************************************************************************/ -/********************* Create a list with all the degrees ********************/ +/********** Create a list with all the degrees that have students ************/ /*****************************************************************************/ -void Deg_GetListAllDegs (void) +void Deg_GetListAllDegsWithStds (struct ListDegrees *Degs) { char Query[1024]; MYSQL_RES *mysql_res; @@ -1792,29 +1799,35 @@ void Deg_GetListAllDegs (void) unsigned NumDeg; /***** Get degrees admin by me from database *****/ - sprintf (Query,"SELECT DegCod,CtrCod,DegTypCod,Status,RequesterUsrCod," - "ShortName,FullName,WWW" - " FROM degrees ORDER BY FullName"); - Gbl.Degs.AllDegs.Num = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get degrees admin by you"); + sprintf (Query,"SELECT DISTINCTROW degrees.DegCod,degrees.CtrCod," + "degrees.DegTypCod,degrees.Status,degrees.RequesterUsrCod," + "degrees.ShortName,degrees.FullName,degrees.WWW" + " FROM degrees,courses,crs_usr" + " WHERE degrees.DegCod=courses.CrsCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role='%u'" + " ORDER BY degrees.ShortName", + (unsigned) Rol_STUDENT); + Degs->Num = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get degrees admin by you"); - if (Gbl.Degs.AllDegs.Num) // Degrees found... + if (Degs->Num) // Degrees found... { /***** Create list with degrees *****/ - if ((Gbl.Degs.AllDegs.Lst = (struct Degree *) calloc (Gbl.Degs.AllDegs.Num,sizeof (struct Degree))) == NULL) + if ((Degs->Lst = (struct Degree *) calloc (Degs->Num,sizeof (struct Degree))) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store degrees admin by you."); /***** Get the degrees *****/ for (NumDeg = 0; - NumDeg < Gbl.Degs.AllDegs.Num; + NumDeg < Degs->Num; NumDeg++) { /* Get next degree */ row = mysql_fetch_row (mysql_res); - Deg_GetDataOfDegreeFromRow (&(Gbl.Degs.AllDegs.Lst[NumDeg]),row); + Deg_GetDataOfDegreeFromRow (&(Degs->Lst[NumDeg]),row); } } else - Gbl.Degs.AllDegs.Lst = NULL; + Degs->Lst = NULL; /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); @@ -1824,13 +1837,13 @@ void Deg_GetListAllDegs (void) /*********************** Free list of all the degrees ************************/ /*****************************************************************************/ -void Deg_FreeListAllDegs (void) +void Deg_FreeListDegs (struct ListDegrees *Degs) { - if (Gbl.Degs.AllDegs.Lst) + if (Degs->Lst) { - free ((void *) Gbl.Degs.AllDegs.Lst); - Gbl.Degs.AllDegs.Lst = NULL; - Gbl.Degs.AllDegs.Num = 0; + free ((void *) Degs->Lst); + Degs->Lst = NULL; + Degs->Num = 0; } } @@ -2063,7 +2076,7 @@ void Deg_RemoveDegree (void) Deg_GetDataOfDegreeByCod (&Deg); /***** Check if this degree has courses *****/ - if (Deg.NumCrss) // Degree has courses ==> don't remove + if (Crs_GetNumCrssInDeg (Deg.DegCod)) // Degree has courses ==> don't remove Lay_ShowAlert (Lay_WARNING,Txt_To_remove_a_degree_you_must_first_remove_all_courses_in_the_degree); else // Degree has no courses ==> remove it { @@ -2134,7 +2147,6 @@ bool Deg_GetDataOfDegreeByCod (struct Degree *Deg) Deg->ShortName[0] = '\0'; Deg->FullName[0] = '\0'; Deg->WWW[0] = '\0'; - Deg->NumCrss = 0; Deg->LstCrss = NULL; return false; } @@ -2164,7 +2176,6 @@ bool Deg_GetDataOfDegreeByCod (struct Degree *Deg) Deg->ShortName[0] = '\0'; Deg->FullName[0] = '\0'; Deg->WWW[0] = '\0'; - Deg->NumCrss = 0; Deg->LstCrss = NULL; return false; } @@ -2208,9 +2219,6 @@ static void Deg_GetDataOfDegreeFromRow (struct Degree *Deg,MYSQL_ROW row) /***** Get WWW (row[7]) *****/ strcpy (Deg->WWW,row[7]); - - /***** Get number of courses *****/ - Deg->NumCrss = Crs_GetNumCrssInDeg (Deg->DegCod); } /*****************************************************************************/ diff --git a/swad_degree.h b/swad_degree.h index 17d76e892..4d5e4db5c 100644 --- a/swad_degree.h +++ b/swad_degree.h @@ -76,10 +76,15 @@ struct Degree char ShortName[Deg_MAX_LENGTH_DEGREE_SHORT_NAME+1]; // Short name of degree char FullName[Deg_MAX_LENGTH_DEGREE_FULL_NAME+1]; // Full name of degree char WWW[Cns_MAX_LENGTH_WWW+1]; - unsigned NumCrss; // Number of courses in the degree struct Course *LstCrss; // List of courses in this degree }; +struct ListDegrees + { + unsigned Num; // Number of degrees + struct Degree *Lst; // List of degrees + }; + /*****************************************************************************/ /***************************** Public prototypes *****************************/ /*****************************************************************************/ @@ -104,8 +109,8 @@ unsigned Deg_ConvStrToYear (const char *StrYear); void Deg_EditDegrees (void); -void Deg_GetListAllDegs (void); -void Deg_FreeListAllDegs (void); +void Deg_GetListAllDegsWithStds (struct ListDegrees *Degs); +void Deg_FreeListDegs (struct ListDegrees *Degs); void Deg_GetListDegsAdminByMe (void); void Deg_FreeListMyAdminDegs (void); diff --git a/swad_global.c b/swad_global.c index 5bad6f168..1a510f53e 100644 --- a/swad_global.c +++ b/swad_global.c @@ -297,9 +297,6 @@ void Gbl_InitializeGlobals (void) Gbl.Degs.DegTypes.Num = 0; Gbl.Degs.DegTypes.Lst = NULL; - Gbl.Degs.AllDegs.Num = 0; - Gbl.Degs.AllDegs.Lst = NULL; - Gbl.Degs.EditingDegTyp.DegTypCod = -1L; Gbl.Degs.EditingDegTyp.DegTypName[0] = '\0'; @@ -307,7 +304,6 @@ void Gbl_InitializeGlobals (void) Gbl.Degs.EditingDeg.ShortName[0] = '\0'; Gbl.Degs.EditingDeg.FullName[0] = '\0'; Gbl.Degs.EditingDeg.WWW[0] = '\0'; - Gbl.Degs.EditingDeg.NumCrss = 0; Gbl.Degs.EditingDeg.LstCrss = NULL; Gbl.Degs.EditingCrs.CrsCod = -1L; @@ -455,7 +451,6 @@ void Gbl_Cleanup (void) Grp_FreeListCodSelectedGrps (); Crs_FreeListCoursesInDegree (&Gbl.Degs.EditingDeg); Deg_FreeListMyAdminDegs (); - Deg_FreeListAllDegs (); DT_FreeListDegreeTypes (); Ins_FreeListInstitutions (); Ctr_FreeListCentres (); diff --git a/swad_global.h b/swad_global.h index 87a5e4969..78ab7db49 100644 --- a/swad_global.h +++ b/swad_global.h @@ -261,11 +261,6 @@ struct Globals unsigned Num; // Number of degree types struct DegreeType *Lst; // List of degree types } DegTypes; - struct - { - unsigned Num; // Number of degrees - struct Degree *Lst; // List of degrees - } AllDegs; struct DegreeType EditingDegTyp; struct Degree EditingDeg; struct Course EditingCrs; @@ -432,6 +427,7 @@ struct Globals struct { struct Degree Deg; + unsigned NumCrss; } CurrentDeg; struct { diff --git a/swad_photo.c b/swad_photo.c index a58e5d9fe..05576cc2f 100644 --- a/swad_photo.c +++ b/swad_photo.c @@ -1232,11 +1232,18 @@ static long Pho_GetDegWithAvgPhotoLeastRecentlyUpdated (void) /***** Delete all the degrees in sta_degrees table not present in degrees table *****/ Pho_RemoveObsoleteStatDegrees (); - /***** 1. If any degree is not in table, choose it as least recently updated *****/ - /* Get degrees from database */ - sprintf (Query,"SELECT DegCod FROM degrees" - " WHERE DegCod NOT IN (SELECT DISTINCT DegCod FROM sta_degrees)" - " LIMIT 1"); + /***** 1. If a degree is not in table of computed degrees, + choose it as least recently updated *****/ + /* Get one degree with students not yet computed */ + sprintf (Query,"SELECT DISTINCT degrees.DegCod" + " FROM degrees,courses,crs_usr" + " WHERE degrees.DegCod=courses.CrsCod" + " AND courses.CrsCod=crs_usr.CrsCod" + " AND crs_usr.Role='%u'" + " AND degrees.DegCod NOT IN" + " (SELECT DISTINCT DegCod FROM sta_degrees)" + " LIMIT 1", + (unsigned) Rol_STUDENT); NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get degrees"); /* If number of rows is 1, then get the degree code */ @@ -1254,19 +1261,25 @@ static long Pho_GetDegWithAvgPhotoLeastRecentlyUpdated (void) /* Free structure that stores the query result */ DB_FreeMySQLResult (&mysql_res); - /***** 2. If all the degrees are in table, choose the least recently updated *****/ + /***** 2. If all the degrees are in table, + choose the least recently updated that has students *****/ /* Get degrees from database */ - sprintf (Query,"SELECT DegCod FROM sta_degrees" - " WHERE TimeAvgPhoto 0) { /***** Get list of all the degrees *****/ - Deg_GetListAllDegs (); + Deg_GetListAllDegsWithStds (&Degs); /***** Get data of the degree from database *****/ Deg_GetDataOfDegreeByCod (&Deg); @@ -1814,26 +1828,26 @@ static void Pho_PutLinkToCalculateDegreeStats (void) Act_LinkFormSubmitAnimated (Txt_Calculate_average_photo_of_a_degree,The_ClassFormBold[Gbl.Prefs.Theme]); Lay_PutCalculateIconWithText (Txt_Calculate_average_photo_of_a_degree,Txt_Calculate_average_photo_of_THE_DEGREE_X); - /***** Put selector with all the degrees *****/ + /***** Put selector with all the degrees with students *****/ fprintf (Gbl.F.Out,"
"); - if (Deg->NumCrss || // Degree has courses ==> deletion forbidden + if (NumCrss || // Degree has courses ==> deletion forbidden !ICanEdit) Lay_PutIconRemovalNotAllowed (); else @@ -1216,7 +1219,7 @@ static void Deg_ListDegreesForEdition (void) fprintf (Gbl.F.Out,"" "%u" "" @@ -1709,7 +1716,7 @@ static void Deg_ListOneDegreeForSeeing (struct Degree *Deg,unsigned NumDeg) fprintf (Gbl.F.Out,"" "%u" "