mirror of https://github.com/acanas/swad-core.git
Version19.209.5
This commit is contained in:
parent
cf8c716568
commit
a62b8fc90e
|
@ -34,6 +34,7 @@
|
||||||
#include "swad_centre_config.h"
|
#include "swad_centre_config.h"
|
||||||
#include "swad_database.h"
|
#include "swad_database.h"
|
||||||
#include "swad_figure.h"
|
#include "swad_figure.h"
|
||||||
|
#include "swad_figure_cache.h"
|
||||||
#include "swad_form.h"
|
#include "swad_form.h"
|
||||||
#include "swad_forum.h"
|
#include "swad_forum.h"
|
||||||
#include "swad_global.h"
|
#include "swad_global.h"
|
||||||
|
@ -360,6 +361,7 @@ static void Ctr_ListOneCentreForSeeing (struct Centre *Ctr,unsigned NumCtr)
|
||||||
const char *TxtClassNormal;
|
const char *TxtClassNormal;
|
||||||
const char *TxtClassStrong;
|
const char *TxtClassStrong;
|
||||||
const char *BgColor;
|
const char *BgColor;
|
||||||
|
unsigned NumUsrsInCrss;
|
||||||
Ctr_StatusTxt_t StatusTxt;
|
Ctr_StatusTxt_t StatusTxt;
|
||||||
|
|
||||||
/***** Get data of place of this centre *****/
|
/***** Get data of place of this centre *****/
|
||||||
|
@ -414,10 +416,18 @@ static void Ctr_ListOneCentreForSeeing (struct Centre *Ctr,unsigned NumCtr)
|
||||||
|
|
||||||
/***** Number of users in courses of this centre *****/
|
/***** Number of users in courses of this centre *****/
|
||||||
HTM_TD_Begin ("class=\"%s RM %s\"",TxtClassNormal,BgColor);
|
HTM_TD_Begin ("class=\"%s RM %s\"",TxtClassNormal,BgColor);
|
||||||
HTM_Unsigned (Usr_GetNumUsrsInCrss (Hie_CTR,Ctr->CtrCod,
|
if (!FigCch_GetFigureFromCache (FigCch_NUM_USRS_IN_CRSS,Hie_CTR,Ctr->CtrCod,
|
||||||
1 << Rol_STD |
|
FigCch_Type_UNSIGNED,&NumUsrsInCrss))
|
||||||
1 << Rol_NET |
|
{
|
||||||
1 << Rol_TCH)); // Any user
|
// Not updated recently in cache ==> compute and update it in cache
|
||||||
|
NumUsrsInCrss = Usr_GetNumUsrsInCrss (Hie_CTR,Ctr->CtrCod,
|
||||||
|
1 << Rol_STD |
|
||||||
|
1 << Rol_NET |
|
||||||
|
1 << Rol_TCH); // Any user
|
||||||
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_IN_CRSS,Hie_CTR,Ctr->CtrCod,
|
||||||
|
FigCch_Type_UNSIGNED,&NumUsrsInCrss);
|
||||||
|
}
|
||||||
|
HTM_Unsigned (NumUsrsInCrss);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/***** Centre status *****/
|
/***** Centre status *****/
|
||||||
|
@ -939,6 +949,7 @@ static void Ctr_ListCentresForEdition (const struct Plc_Places *Places)
|
||||||
char WWW[Cns_MAX_BYTES_WWW + 1];
|
char WWW[Cns_MAX_BYTES_WWW + 1];
|
||||||
struct UsrData UsrDat;
|
struct UsrData UsrDat;
|
||||||
bool ICanEdit;
|
bool ICanEdit;
|
||||||
|
unsigned NumDegs;
|
||||||
unsigned NumUsrsInCrssOfCtr;
|
unsigned NumUsrsInCrssOfCtr;
|
||||||
Ctr_StatusTxt_t StatusTxt;
|
Ctr_StatusTxt_t StatusTxt;
|
||||||
unsigned StatusUnsigned;
|
unsigned StatusUnsigned;
|
||||||
|
@ -958,6 +969,7 @@ static void Ctr_ListCentresForEdition (const struct Plc_Places *Places)
|
||||||
Ctr = &Gbl.Hierarchy.Ctrs.Lst[NumCtr];
|
Ctr = &Gbl.Hierarchy.Ctrs.Lst[NumCtr];
|
||||||
|
|
||||||
ICanEdit = Ctr_CheckIfICanEditACentre (Ctr);
|
ICanEdit = Ctr_CheckIfICanEditACentre (Ctr);
|
||||||
|
NumDegs = Deg_GetNumDegsInCtr (Ctr->CtrCod);
|
||||||
NumUsrsInCrssOfCtr = Usr_GetNumUsrsInCrss (Hie_CTR,Ctr->CtrCod,
|
NumUsrsInCrssOfCtr = Usr_GetNumUsrsInCrss (Hie_CTR,Ctr->CtrCod,
|
||||||
1 << Rol_STD |
|
1 << Rol_STD |
|
||||||
1 << Rol_NET |
|
1 << Rol_NET |
|
||||||
|
@ -967,10 +979,9 @@ static void Ctr_ListCentresForEdition (const struct Plc_Places *Places)
|
||||||
HTM_TR_Begin (NULL);
|
HTM_TR_Begin (NULL);
|
||||||
HTM_TD_Begin ("class=\"BM\"");
|
HTM_TD_Begin ("class=\"BM\"");
|
||||||
if (!ICanEdit || // I cannot edit
|
if (!ICanEdit || // I cannot edit
|
||||||
|
NumDegs || // Centre has degrees
|
||||||
NumUsrsInCrssOfCtr) // Centre has users
|
NumUsrsInCrssOfCtr) // Centre has users
|
||||||
Ico_PutIconRemovalNotAllowed ();
|
Ico_PutIconRemovalNotAllowed ();
|
||||||
else if (Deg_GetNumDegsInCtr (Ctr->CtrCod)) // Centre has degrees
|
|
||||||
Ico_PutIconRemovalNotAllowed ();
|
|
||||||
else if (Usr_GetNumUsrsWhoClaimToBelongToCtr (Ctr)) // Centre has users who claim to belong to it
|
else if (Usr_GetNumUsrsWhoClaimToBelongToCtr (Ctr)) // Centre has users who claim to belong to it
|
||||||
Ico_PutIconRemovalNotAllowed ();
|
Ico_PutIconRemovalNotAllowed ();
|
||||||
else // I can remove centre
|
else // I can remove centre
|
||||||
|
@ -1080,7 +1091,7 @@ static void Ctr_ListCentresForEdition (const struct Plc_Places *Places)
|
||||||
|
|
||||||
/* Number of degrees */
|
/* Number of degrees */
|
||||||
HTM_TD_Begin ("class=\"DAT RM\"");
|
HTM_TD_Begin ("class=\"DAT RM\"");
|
||||||
HTM_Unsigned (Deg_GetNumDegsInCtr (Ctr->CtrCod));
|
HTM_Unsigned (NumDegs);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/* Number of users in courses of this centre */
|
/* Number of users in courses of this centre */
|
||||||
|
|
|
@ -544,10 +544,11 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
|
||||||
En OpenSWAD:
|
En OpenSWAD:
|
||||||
ps2pdf source.ps destination.pdf
|
ps2pdf source.ps destination.pdf
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 19.209.4 (2020-05-02)"
|
#define Log_PLATFORM_VERSION "SWAD 19.209.5 (2020-05-02)"
|
||||||
#define CSS_FILE "swad19.193.1.css"
|
#define CSS_FILE "swad19.193.1.css"
|
||||||
#define JS_FILE "swad19.193.1.js"
|
#define JS_FILE "swad19.193.1.js"
|
||||||
/*
|
/*
|
||||||
|
Version 19.209.5: May 02, 2020 More figures cached. (300756 lines)
|
||||||
Version 19.209.4: May 02, 2020 More figures cached.
|
Version 19.209.4: May 02, 2020 More figures cached.
|
||||||
Code refactoring in hierarchy configuration. (300637 lines)
|
Code refactoring in hierarchy configuration. (300637 lines)
|
||||||
Version 19.209.3: May 01, 2020 More figures cached. (300750 lines)
|
Version 19.209.3: May 01, 2020 More figures cached. (300750 lines)
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "swad_country_config.h"
|
#include "swad_country_config.h"
|
||||||
#include "swad_database.h"
|
#include "swad_database.h"
|
||||||
#include "swad_figure.h"
|
#include "swad_figure.h"
|
||||||
|
#include "swad_figure_cache.h"
|
||||||
#include "swad_form.h"
|
#include "swad_form.h"
|
||||||
#include "swad_global.h"
|
#include "swad_global.h"
|
||||||
#include "swad_HTML.h"
|
#include "swad_HTML.h"
|
||||||
|
@ -227,6 +228,7 @@ void Cty_ListCountries2 (void)
|
||||||
extern const char *Txt_Other_countries;
|
extern const char *Txt_Other_countries;
|
||||||
extern const char *Txt_Country_unspecified;
|
extern const char *Txt_Country_unspecified;
|
||||||
unsigned NumCty;
|
unsigned NumCty;
|
||||||
|
unsigned NumUsrsInCrss;
|
||||||
|
|
||||||
/***** Write menu to select country *****/
|
/***** Write menu to select country *****/
|
||||||
Hie_WriteMenuHierarchy ();
|
Hie_WriteMenuHierarchy ();
|
||||||
|
@ -282,10 +284,20 @@ void Cty_ListCountries2 (void)
|
||||||
HTM_Unsigned (Crs_GetNumCrssInCty (0));
|
HTM_Unsigned (Crs_GetNumCrssInCty (0));
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/* Number of users in courses of other countries */
|
||||||
HTM_TD_Begin ("class=\"DAT RM\"");
|
HTM_TD_Begin ("class=\"DAT RM\"");
|
||||||
HTM_Unsigned (Usr_GetNumUsrsInCrss (Hie_CTY,0,
|
if (!FigCch_GetFigureFromCache (FigCch_NUM_USRS_IN_CRSS,Hie_CTY,0,
|
||||||
1 << Rol_NET | // Non-editing teachers
|
FigCch_Type_UNSIGNED,&NumUsrsInCrss))
|
||||||
1 << Rol_TCH)); // Teachers
|
{
|
||||||
|
// Not updated recently in cache ==> compute and update it in cache
|
||||||
|
NumUsrsInCrss = Usr_GetNumUsrsInCrss (Hie_CTY,0,
|
||||||
|
1 << Rol_STD |
|
||||||
|
1 << Rol_NET |
|
||||||
|
1 << Rol_TCH); // Any user
|
||||||
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_IN_CRSS,Hie_CTY,0,
|
||||||
|
FigCch_Type_UNSIGNED,&NumUsrsInCrss);
|
||||||
|
}
|
||||||
|
HTM_Unsigned (NumUsrsInCrss);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
HTM_TR_End ();
|
HTM_TR_End ();
|
||||||
|
@ -403,6 +415,8 @@ static void Cty_PutHeadCountriesForSeeing (bool OrderSelectable)
|
||||||
static void Cty_ListOneCountryForSeeing (struct Country *Cty,unsigned NumCty)
|
static void Cty_ListOneCountryForSeeing (struct Country *Cty,unsigned NumCty)
|
||||||
{
|
{
|
||||||
const char *BgColor;
|
const char *BgColor;
|
||||||
|
unsigned NumUsrsCty;
|
||||||
|
unsigned NumUsrsInCrss;
|
||||||
|
|
||||||
BgColor = (Cty->CtyCod == Gbl.Hierarchy.Cty.CtyCod) ? "LIGHT_BLUE" :
|
BgColor = (Cty->CtyCod == Gbl.Hierarchy.Cty.CtyCod) ? "LIGHT_BLUE" :
|
||||||
Gbl.ColorRows[Gbl.RowEvenOdd];
|
Gbl.ColorRows[Gbl.RowEvenOdd];
|
||||||
|
@ -424,7 +438,15 @@ static void Cty_ListOneCountryForSeeing (struct Country *Cty,unsigned NumCty)
|
||||||
|
|
||||||
/***** Number of users who claim to belong to this country *****/
|
/***** Number of users who claim to belong to this country *****/
|
||||||
HTM_TD_Begin ("class=\"DAT RM %s\"",BgColor);
|
HTM_TD_Begin ("class=\"DAT RM %s\"",BgColor);
|
||||||
HTM_Unsigned (Usr_GetNumUsrsWhoClaimToBelongToCty (Cty));
|
if (!FigCch_GetFigureFromCache (FigCch_NUM_USRS_CTY,Hie_CTY,Cty->CtyCod,
|
||||||
|
FigCch_Type_UNSIGNED,&NumUsrsCty))
|
||||||
|
{
|
||||||
|
// Not updated recently in cache ==> compute and update it in cache
|
||||||
|
NumUsrsCty = Usr_GetNumUsrsWhoClaimToBelongToCty (Cty);
|
||||||
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_CTY,Hie_CTY,Cty->CtyCod,
|
||||||
|
FigCch_Type_UNSIGNED,&NumUsrsCty);
|
||||||
|
}
|
||||||
|
HTM_Unsigned (NumUsrsCty);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/***** Other stats *****/
|
/***** Other stats *****/
|
||||||
|
@ -444,11 +466,20 @@ static void Cty_ListOneCountryForSeeing (struct Country *Cty,unsigned NumCty)
|
||||||
HTM_Unsigned (Crs_GetNumCrssInCty (Cty->CtyCod));
|
HTM_Unsigned (Crs_GetNumCrssInCty (Cty->CtyCod));
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/* Number of users in courses */
|
||||||
HTM_TD_Begin ("class=\"DAT RM %s\"",BgColor);
|
HTM_TD_Begin ("class=\"DAT RM %s\"",BgColor);
|
||||||
HTM_Unsigned (Usr_GetNumUsrsInCrss (Hie_CTY,Cty->CtyCod,
|
if (!FigCch_GetFigureFromCache (FigCch_NUM_USRS_IN_CRSS,Hie_CTY,Cty->CtyCod,
|
||||||
1 << Rol_STD |
|
FigCch_Type_UNSIGNED,&NumUsrsInCrss))
|
||||||
1 << Rol_NET |
|
{
|
||||||
1 << Rol_TCH)); // Any user
|
// Not updated recently in cache ==> compute and update it in cache
|
||||||
|
NumUsrsInCrss = Usr_GetNumUsrsInCrss (Hie_CTY,Cty->CtyCod,
|
||||||
|
1 << Rol_STD |
|
||||||
|
1 << Rol_NET |
|
||||||
|
1 << Rol_TCH); // Any user
|
||||||
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_IN_CRSS,Hie_CTY,Cty->CtyCod,
|
||||||
|
FigCch_Type_UNSIGNED,&NumUsrsInCrss);
|
||||||
|
}
|
||||||
|
HTM_Unsigned (NumUsrsInCrss);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
HTM_TR_End ();
|
HTM_TR_End ();
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <string.h> // For string functions
|
#include <string.h> // For string functions
|
||||||
|
|
||||||
#include "swad_database.h"
|
#include "swad_database.h"
|
||||||
|
#include "swad_figure_cache.h"
|
||||||
#include "swad_form.h"
|
#include "swad_form.h"
|
||||||
#include "swad_global.h"
|
#include "swad_global.h"
|
||||||
#include "swad_help.h"
|
#include "swad_help.h"
|
||||||
|
@ -474,6 +475,7 @@ static void CtyCfg_QR (void)
|
||||||
static void CtyCfg_NumUsrs (void)
|
static void CtyCfg_NumUsrs (void)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Users_of_the_country;
|
extern const char *Txt_Users_of_the_country;
|
||||||
|
unsigned NumUsrsCty;
|
||||||
|
|
||||||
/***** Number of users *****/
|
/***** Number of users *****/
|
||||||
HTM_TR_Begin (NULL);
|
HTM_TR_Begin (NULL);
|
||||||
|
@ -483,7 +485,15 @@ static void CtyCfg_NumUsrs (void)
|
||||||
|
|
||||||
/* Data */
|
/* Data */
|
||||||
HTM_TD_Begin ("class=\"DAT LB\"");
|
HTM_TD_Begin ("class=\"DAT LB\"");
|
||||||
HTM_Unsigned (Usr_GetNumUsrsWhoClaimToBelongToCty (&Gbl.Hierarchy.Cty));
|
if (!FigCch_GetFigureFromCache (FigCch_NUM_USRS_CTY,Hie_CTY,Gbl.Hierarchy.Cty.CtyCod,
|
||||||
|
FigCch_Type_UNSIGNED,&NumUsrsCty))
|
||||||
|
{
|
||||||
|
// Not updated recently in cache ==> compute and update it in cache
|
||||||
|
NumUsrsCty = Usr_GetNumUsrsWhoClaimToBelongToCty (&Gbl.Hierarchy.Cty);
|
||||||
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_CTY,Hie_CTY,Gbl.Hierarchy.Cty.CtyCod,
|
||||||
|
FigCch_Type_UNSIGNED,&NumUsrsCty);
|
||||||
|
}
|
||||||
|
HTM_Unsigned (NumUsrsCty);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
HTM_TR_End ();
|
HTM_TR_End ();
|
||||||
|
|
|
@ -965,13 +965,13 @@ static bool Crs_ListCoursesOfAYearForSeeing (unsigned Year)
|
||||||
Frm_EndForm ();
|
Frm_EndForm ();
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/* Current number of teachers in this course */
|
/* Number of teachers in this course */
|
||||||
HTM_TD_Begin ("class=\"%s RM %s\"",TxtClassNormal,BgColor);
|
HTM_TD_Begin ("class=\"%s RM %s\"",TxtClassNormal,BgColor);
|
||||||
HTM_Unsigned (NumUsrs[Rol_TCH] +
|
HTM_Unsigned (NumUsrs[Rol_TCH] +
|
||||||
NumUsrs[Rol_NET]);
|
NumUsrs[Rol_NET]);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/* Current number of students in this course */
|
/* Number of students in this course */
|
||||||
HTM_TD_Begin ("class=\"%s RM %s\"",TxtClassNormal,BgColor);
|
HTM_TD_Begin ("class=\"%s RM %s\"",TxtClassNormal,BgColor);
|
||||||
HTM_Unsigned (NumUsrs[Rol_STD]);
|
HTM_Unsigned (NumUsrs[Rol_STD]);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "swad_degree.h"
|
#include "swad_degree.h"
|
||||||
#include "swad_degree_config.h"
|
#include "swad_degree_config.h"
|
||||||
#include "swad_figure.h"
|
#include "swad_figure.h"
|
||||||
|
#include "swad_figure_cache.h"
|
||||||
#include "swad_form.h"
|
#include "swad_form.h"
|
||||||
#include "swad_forum.h"
|
#include "swad_forum.h"
|
||||||
#include "swad_global.h"
|
#include "swad_global.h"
|
||||||
|
@ -342,9 +343,10 @@ static void Deg_ListDegreesForEdition (void)
|
||||||
char WWW[Cns_MAX_BYTES_WWW + 1];
|
char WWW[Cns_MAX_BYTES_WWW + 1];
|
||||||
struct UsrData UsrDat;
|
struct UsrData UsrDat;
|
||||||
bool ICanEdit;
|
bool ICanEdit;
|
||||||
|
unsigned NumCrss;
|
||||||
|
unsigned NumUsrsInCrssOfDeg;
|
||||||
Deg_StatusTxt_t StatusTxt;
|
Deg_StatusTxt_t StatusTxt;
|
||||||
unsigned StatusUnsigned;
|
unsigned StatusUnsigned;
|
||||||
unsigned NumCrss;
|
|
||||||
|
|
||||||
/***** Initialize structure with user's data *****/
|
/***** Initialize structure with user's data *****/
|
||||||
Usr_UsrDataConstructor (&UsrDat);
|
Usr_UsrDataConstructor (&UsrDat);
|
||||||
|
@ -360,15 +362,20 @@ static void Deg_ListDegreesForEdition (void)
|
||||||
{
|
{
|
||||||
Deg = &(Gbl.Hierarchy.Degs.Lst[NumDeg]);
|
Deg = &(Gbl.Hierarchy.Degs.Lst[NumDeg]);
|
||||||
|
|
||||||
NumCrss = Crs_GetNumCrssInDeg (Deg->DegCod);
|
|
||||||
ICanEdit = Deg_CheckIfICanEditADegree (Deg);
|
ICanEdit = Deg_CheckIfICanEditADegree (Deg);
|
||||||
|
NumCrss = Crs_GetNumCrssInDeg (Deg->DegCod);
|
||||||
|
NumUsrsInCrssOfDeg = Usr_GetNumUsrsInCrss (Hie_DEG,Deg->DegCod,
|
||||||
|
1 << Rol_STD |
|
||||||
|
1 << Rol_NET |
|
||||||
|
1 << Rol_TCH); // Any user
|
||||||
|
|
||||||
HTM_TR_Begin (NULL);
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
/* Put icon to remove degree */
|
/* Put icon to remove degree */
|
||||||
HTM_TD_Begin ("class=\"BM\"");
|
HTM_TD_Begin ("class=\"BM\"");
|
||||||
if (NumCrss || // Degree has courses ==> deletion forbidden
|
if (!ICanEdit ||
|
||||||
!ICanEdit)
|
NumCrss || // Degree has courses ==> deletion forbidden
|
||||||
|
NumUsrsInCrssOfDeg)
|
||||||
Ico_PutIconRemovalNotAllowed ();
|
Ico_PutIconRemovalNotAllowed ();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -471,11 +478,16 @@ static void Deg_ListDegreesForEdition (void)
|
||||||
}
|
}
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/* Current number of courses in this degree */
|
/* Number of courses in this degree */
|
||||||
HTM_TD_Begin ("class=\"DAT RM\"");
|
HTM_TD_Begin ("class=\"DAT RM\"");
|
||||||
HTM_Unsigned (NumCrss);
|
HTM_Unsigned (NumCrss);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/* Number of users in courses of this degree */
|
||||||
|
HTM_TD_Begin ("class=\"DAT RM\"");
|
||||||
|
HTM_Unsigned (NumUsrsInCrssOfDeg);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
/* Degree requester */
|
/* Degree requester */
|
||||||
UsrDat.UsrCod = Deg->RequesterUsrCod;
|
UsrDat.UsrCod = Deg->RequesterUsrCod;
|
||||||
Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat,Usr_DONT_GET_PREFS);
|
Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat,Usr_DONT_GET_PREFS);
|
||||||
|
@ -646,7 +658,12 @@ static void Deg_PutFormToCreateDegree (void)
|
||||||
"class=\"INPUT_WWW_NARROW\" required=\"required\"");
|
"class=\"INPUT_WWW_NARROW\" required=\"required\"");
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/***** Current number of courses in this degree *****/
|
/***** Number of courses in this degree *****/
|
||||||
|
HTM_TD_Begin ("class=\"DAT RM\"");
|
||||||
|
HTM_Unsigned (0);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Number of users in courses of this degree *****/
|
||||||
HTM_TD_Begin ("class=\"DAT RM\"");
|
HTM_TD_Begin ("class=\"DAT RM\"");
|
||||||
HTM_Unsigned (0);
|
HTM_Unsigned (0);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
@ -678,6 +695,7 @@ static void Deg_PutHeadDegreesForSeeing (void)
|
||||||
extern const char *Txt_Degree;
|
extern const char *Txt_Degree;
|
||||||
extern const char *Txt_Type;
|
extern const char *Txt_Type;
|
||||||
extern const char *Txt_Courses_ABBREVIATION;
|
extern const char *Txt_Courses_ABBREVIATION;
|
||||||
|
extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
|
||||||
|
|
||||||
HTM_TR_Begin (NULL);
|
HTM_TR_Begin (NULL);
|
||||||
|
|
||||||
|
@ -686,6 +704,11 @@ static void Deg_PutHeadDegreesForSeeing (void)
|
||||||
HTM_TH (1,1,"LM",Txt_Degree);
|
HTM_TH (1,1,"LM",Txt_Degree);
|
||||||
HTM_TH (1,1,"LM",Txt_Type);
|
HTM_TH (1,1,"LM",Txt_Type);
|
||||||
HTM_TH (1,1,"RM",Txt_Courses_ABBREVIATION);
|
HTM_TH (1,1,"RM",Txt_Courses_ABBREVIATION);
|
||||||
|
HTM_TH_Begin (1,1,"RM");
|
||||||
|
HTM_TxtF ("%s+",Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH]);
|
||||||
|
HTM_BR ();
|
||||||
|
HTM_Txt (Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD]);
|
||||||
|
HTM_TH_End ();
|
||||||
HTM_TH_Empty (1);
|
HTM_TH_Empty (1);
|
||||||
|
|
||||||
HTM_TR_End ();
|
HTM_TR_End ();
|
||||||
|
@ -703,6 +726,7 @@ static void Deg_PutHeadDegreesForEdition (void)
|
||||||
extern const char *Txt_Type;
|
extern const char *Txt_Type;
|
||||||
extern const char *Txt_WWW;
|
extern const char *Txt_WWW;
|
||||||
extern const char *Txt_Courses_ABBREVIATION;
|
extern const char *Txt_Courses_ABBREVIATION;
|
||||||
|
extern const char *Txt_ROLES_PLURAL_BRIEF_Abc[Rol_NUM_ROLES];
|
||||||
extern const char *Txt_Requester;
|
extern const char *Txt_Requester;
|
||||||
|
|
||||||
HTM_TR_Begin (NULL);
|
HTM_TR_Begin (NULL);
|
||||||
|
@ -715,6 +739,11 @@ static void Deg_PutHeadDegreesForEdition (void)
|
||||||
HTM_TH (1,1,"LM",Txt_Type);
|
HTM_TH (1,1,"LM",Txt_Type);
|
||||||
HTM_TH (1,1,"LM",Txt_WWW);
|
HTM_TH (1,1,"LM",Txt_WWW);
|
||||||
HTM_TH (1,1,"RM",Txt_Courses_ABBREVIATION);
|
HTM_TH (1,1,"RM",Txt_Courses_ABBREVIATION);
|
||||||
|
HTM_TH_Begin (1,1,"RM");
|
||||||
|
HTM_TxtF ("%s+",Txt_ROLES_PLURAL_BRIEF_Abc[Rol_TCH]);
|
||||||
|
HTM_BR ();
|
||||||
|
HTM_Txt (Txt_ROLES_PLURAL_BRIEF_Abc[Rol_STD]);
|
||||||
|
HTM_TH_End ();
|
||||||
HTM_TH (1,1,"LM",Txt_Requester);
|
HTM_TH (1,1,"LM",Txt_Requester);
|
||||||
HTM_TH_Empty (1);
|
HTM_TH_Empty (1);
|
||||||
|
|
||||||
|
@ -860,6 +889,7 @@ static void Deg_ListOneDegreeForSeeing (struct Degree *Deg,unsigned NumDeg)
|
||||||
const char *TxtClassStrong;
|
const char *TxtClassStrong;
|
||||||
const char *BgColor;
|
const char *BgColor;
|
||||||
unsigned NumCrss = Crs_GetNumCrssInDeg (Deg->DegCod);
|
unsigned NumCrss = Crs_GetNumCrssInDeg (Deg->DegCod);
|
||||||
|
unsigned NumUsrsInCrss;
|
||||||
Deg_StatusTxt_t StatusTxt;
|
Deg_StatusTxt_t StatusTxt;
|
||||||
|
|
||||||
/***** Get data of type of degree of this degree *****/
|
/***** Get data of type of degree of this degree *****/
|
||||||
|
@ -912,6 +942,22 @@ static void Deg_ListOneDegreeForSeeing (struct Degree *Deg,unsigned NumDeg)
|
||||||
HTM_Unsigned (NumCrss);
|
HTM_Unsigned (NumCrss);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
|
/***** Number of users in courses of this degree *****/
|
||||||
|
HTM_TD_Begin ("class=\"%s RM %s\"",TxtClassNormal,BgColor);
|
||||||
|
if (!FigCch_GetFigureFromCache (FigCch_NUM_USRS_IN_CRSS,Hie_DEG,Deg->DegCod,
|
||||||
|
FigCch_Type_UNSIGNED,&NumUsrsInCrss))
|
||||||
|
{
|
||||||
|
// Not updated recently in cache ==> compute and update it in cache
|
||||||
|
NumUsrsInCrss = Usr_GetNumUsrsInCrss (Hie_DEG,Deg->DegCod,
|
||||||
|
1 << Rol_STD |
|
||||||
|
1 << Rol_NET |
|
||||||
|
1 << Rol_TCH); // Any user
|
||||||
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_IN_CRSS,Hie_DEG,Deg->DegCod,
|
||||||
|
FigCch_Type_UNSIGNED,&NumUsrsInCrss);
|
||||||
|
}
|
||||||
|
HTM_Unsigned (NumUsrsInCrss);
|
||||||
|
HTM_TD_End ();
|
||||||
|
|
||||||
/***** Degree status *****/
|
/***** Degree status *****/
|
||||||
StatusTxt = Deg_GetStatusTxtFromStatusBits (Deg->Status);
|
StatusTxt = Deg_GetStatusTxtFromStatusBits (Deg->Status);
|
||||||
HTM_TD_Begin ("class=\"%s LM %s\"",TxtClassNormal,BgColor);
|
HTM_TD_Begin ("class=\"%s LM %s\"",TxtClassNormal,BgColor);
|
||||||
|
|
|
@ -41,8 +41,6 @@
|
||||||
/***************************** Private constants *****************************/
|
/***************************** Private constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define FigCch_TIME_CACHE ((time_t)(1UL * 60UL * 60UL)) // Past these seconds, update cached value
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************* Private types *******************************/
|
/******************************* Private types *******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -102,6 +100,17 @@ bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure,
|
||||||
Hie_Level_t Scope,long Cod,
|
Hie_Level_t Scope,long Cod,
|
||||||
FigCch_Type_t Type,void *ValuePtr)
|
FigCch_Type_t Type,void *ValuePtr)
|
||||||
{
|
{
|
||||||
|
/* The higher the level, the longer a value remains cached */
|
||||||
|
time_t TimeCached[Hie_NUM_LEVELS] = // Time in seconds
|
||||||
|
{
|
||||||
|
[Hie_UNK] = (time_t) ( 0), // Unknown
|
||||||
|
[Hie_SYS] = (time_t) ( 1UL * 60UL * 60UL), // System
|
||||||
|
[Hie_CTY] = (time_t) ( 30UL * 60UL), // Country
|
||||||
|
[Hie_INS] = (time_t) ( 15UL * 60UL), // Institution
|
||||||
|
[Hie_CTR] = (time_t) ( 5UL * 60UL), // Centre
|
||||||
|
[Hie_DEG] = (time_t) ( 60UL), // Degree
|
||||||
|
[Hie_CRS] = (time_t) ( 10UL), // Course
|
||||||
|
};
|
||||||
static const char *Field[FigCch_NUM_TYPES] =
|
static const char *Field[FigCch_NUM_TYPES] =
|
||||||
{
|
{
|
||||||
[FigCch_Type_UNSIGNED] = "ValueInt",
|
[FigCch_Type_UNSIGNED] = "ValueInt",
|
||||||
|
@ -123,8 +132,9 @@ bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure,
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Trivial check *****/
|
/***** Trivial check *****/
|
||||||
if (Figure == FigCch_UNKNOWN)
|
if (Figure == FigCch_UNKNOWN || // Unknown figure
|
||||||
return Found;
|
Scope == Hie_UNK) // Unknown scope
|
||||||
|
return false;
|
||||||
|
|
||||||
/***** Get figure's value if cached and recent *****/
|
/***** Get figure's value if cached and recent *****/
|
||||||
if (DB_QuerySELECT (&mysql_res,"can not get cached figure value",
|
if (DB_QuerySELECT (&mysql_res,"can not get cached figure value",
|
||||||
|
@ -134,7 +144,7 @@ bool FigCch_GetFigureFromCache (FigCch_FigureCached_t Figure,
|
||||||
" AND LastUpdate>FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)",
|
" AND LastUpdate>FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)",
|
||||||
Field[Type],
|
Field[Type],
|
||||||
(unsigned) Figure,Sco_GetDBStrFromScope (Scope),Cod,
|
(unsigned) Figure,Sco_GetDBStrFromScope (Scope),Cod,
|
||||||
FigCch_TIME_CACHE))
|
TimeCached[Scope]))
|
||||||
{
|
{
|
||||||
/* Get row */
|
/* Get row */
|
||||||
row = mysql_fetch_row (mysql_res);
|
row = mysql_fetch_row (mysql_res);
|
||||||
|
|
|
@ -62,6 +62,8 @@ typedef enum
|
||||||
FigCch_NUM_STDS_PER_CRS = 17, // Number of students per course
|
FigCch_NUM_STDS_PER_CRS = 17, // Number of students per course
|
||||||
FigCch_NUM_NETS_PER_CRS = 18, // Number of non-editing teachers per course
|
FigCch_NUM_NETS_PER_CRS = 18, // Number of non-editing teachers per course
|
||||||
FigCch_NUM_TCHS_PER_CRS = 19, // Number of teachers per course
|
FigCch_NUM_TCHS_PER_CRS = 19, // Number of teachers per course
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
FigCch_NUM_USRS_CTY = 20, // Number of users who claim to belong to country
|
||||||
} FigCch_FigureCached_t;
|
} FigCch_FigureCached_t;
|
||||||
|
|
||||||
#define FigCch_NUM_TYPES 2
|
#define FigCch_NUM_TYPES 2
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "swad_database.h"
|
#include "swad_database.h"
|
||||||
#include "swad_department.h"
|
#include "swad_department.h"
|
||||||
#include "swad_figure.h"
|
#include "swad_figure.h"
|
||||||
|
#include "swad_figure_cache.h"
|
||||||
#include "swad_form.h"
|
#include "swad_form.h"
|
||||||
#include "swad_forum.h"
|
#include "swad_forum.h"
|
||||||
#include "swad_global.h"
|
#include "swad_global.h"
|
||||||
|
@ -385,6 +386,7 @@ static void Ins_ListOneInstitutionForSeeing (struct Instit *Ins,unsigned NumIns)
|
||||||
const char *TxtClassNormal;
|
const char *TxtClassNormal;
|
||||||
const char *TxtClassStrong;
|
const char *TxtClassStrong;
|
||||||
const char *BgColor;
|
const char *BgColor;
|
||||||
|
unsigned NumUsrsInCrss;
|
||||||
Ins_StatusTxt_t StatusTxt;
|
Ins_StatusTxt_t StatusTxt;
|
||||||
|
|
||||||
if (Ins->Status & Ins_STATUS_BIT_PENDING)
|
if (Ins->Status & Ins_STATUS_BIT_PENDING)
|
||||||
|
@ -441,10 +443,18 @@ static void Ins_ListOneInstitutionForSeeing (struct Instit *Ins,unsigned NumIns)
|
||||||
|
|
||||||
/* Number of users in courses of this institution */
|
/* Number of users in courses of this institution */
|
||||||
HTM_TD_Begin ("class=\"%s RM %s\"",TxtClassNormal,BgColor);
|
HTM_TD_Begin ("class=\"%s RM %s\"",TxtClassNormal,BgColor);
|
||||||
HTM_Unsigned (Usr_GetNumUsrsInCrss (Hie_INS,Ins->InsCod,
|
if (!FigCch_GetFigureFromCache (FigCch_NUM_USRS_IN_CRSS,Hie_INS,Ins->InsCod,
|
||||||
1 << Rol_STD |
|
FigCch_Type_UNSIGNED,&NumUsrsInCrss))
|
||||||
1 << Rol_NET |
|
{
|
||||||
1 << Rol_TCH)); // Any user
|
// Not updated recently in cache ==> compute and update it in cache
|
||||||
|
NumUsrsInCrss = Usr_GetNumUsrsInCrss (Hie_INS,Ins->InsCod,
|
||||||
|
1 << Rol_STD |
|
||||||
|
1 << Rol_NET |
|
||||||
|
1 << Rol_TCH); // Any user
|
||||||
|
FigCch_UpdateFigureIntoCache (FigCch_NUM_USRS_IN_CRSS,Hie_INS,Ins->InsCod,
|
||||||
|
FigCch_Type_UNSIGNED,&NumUsrsInCrss);
|
||||||
|
}
|
||||||
|
HTM_Unsigned (NumUsrsInCrss);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/***** Institution status *****/
|
/***** Institution status *****/
|
||||||
|
|
Loading…
Reference in New Issue