diff --git a/swad_agenda.c b/swad_agenda.c index fba0da9c5..959b52d66 100644 --- a/swad_agenda.c +++ b/swad_agenda.c @@ -1870,7 +1870,7 @@ unsigned Agd_GetNumEventsFromUsr (long UsrCod) unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope) { - /***** Get number of courses with events from database *****/ + /***** Get number of users with events from database *****/ switch (Scope) { case Hie_Lvl_SYS: @@ -1893,7 +1893,6 @@ unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope) " AND ins_instits.InsCod=ctr_centers.InsCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_users.UsrCod=agd_agendas.UsrCod", Gbl.Hierarchy.Cty.CtyCod); @@ -1909,7 +1908,6 @@ unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope) " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_users.UsrCod=agd_agendas.UsrCod", Gbl.Hierarchy.Ins.InsCod); @@ -1923,7 +1921,6 @@ unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope) "agd_agendas" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_users.UsrCod=agd_agendas.UsrCod", Gbl.Hierarchy.Ctr.CtrCod); @@ -1935,7 +1932,6 @@ unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope) "crs_users," "agd_agendas" " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_users.UsrCod=agd_agendas.UsrCod", Gbl.Hierarchy.Deg.DegCod); @@ -1974,57 +1970,61 @@ unsigned Agd_GetNumEvents (Hie_Lvl_Level_t Scope) return (unsigned) DB_QueryCOUNT ("can not get number of events", "SELECT COUNT(*)" - " FROM ins_instits," - "ctr_centers," - "deg_degrees," - "crs_courses," - "crs_users," + " FROM (SELECT DISTINCT crs_users.UsrCod" + " FROM ins_instits," + "ctr_centers," + "deg_degrees," + "crs_courses," + "crs_users" + " WHERE ins_instits.CtyCod=%ld" + " AND ins_instits.InsCod=ctr_centers.InsCod" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=crs_users.CrsCod) AS users," "agd_agendas" - " WHERE ins_instits.CtyCod=%ld" - " AND ins_instits.InsCod=ctr_centers.InsCod" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", + " WHERE users.UsrCod=agd_agendas.UsrCod", Gbl.Hierarchy.Cty.CtyCod); case Hie_Lvl_INS: return (unsigned) DB_QueryCOUNT ("can not get number of events", "SELECT COUNT(*)" - " FROM ctr_centers," - "deg_degrees," - "crs_courses," - "crs_users," + " FROM (SELECT DISTINCT crs_users.UsrCod" + " FROM ctr_centers," + "deg_degrees," + "crs_courses," + "crs_users" + " WHERE ctr_centers.InsCod=%ld" + " AND ctr_centers.CtrCod=deg_degrees.CtrCod" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=crs_users.CrsCod) AS users," "agd_agendas" - " WHERE ctr_centers.InsCod=%ld" - " AND ctr_centers.CtrCod=deg_degrees.CtrCod" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", + " WHERE users.UsrCod=agd_agendas.UsrCod", Gbl.Hierarchy.Ins.InsCod); case Hie_Lvl_CTR: return (unsigned) DB_QueryCOUNT ("can not get number of events", "SELECT COUNT(*)" - " FROM deg_degrees," - "crs_courses," - "crs_users," + " FROM (SELECT DISTINCT crs_users.UsrCod" + " FROM deg_degrees," + "crs_courses," + "crs_users" + " WHERE deg_degrees.CtrCod=%ld" + " AND deg_degrees.DegCod=crs_courses.DegCod" + " AND crs_courses.CrsCod=crs_users.CrsCod) AS users," "agd_agendas" - " WHERE deg_degrees.CtrCod=%ld" - " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", + " WHERE users.UsrCod=agd_agendas.UsrCod", Gbl.Hierarchy.Ctr.CtrCod); case Hie_Lvl_DEG: return (unsigned) DB_QueryCOUNT ("can not get number of events", "SELECT COUNT(*)" - " FROM crs_courses," - "crs_users," + " FROM (SELECT DISTINCT crs_users.UsrCod" + " FROM crs_courses," + "crs_users" + " WHERE crs_courses.DegCod=%ld" + " AND crs_courses.CrsCod=crs_users.CrsCod) AS users," "agd_agendas" - " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.CrsCod=crs_users.CrsCod" - " AND crs_users.UsrCod=agd_agendas.UsrCod", + " WHERE users.UsrCod=agd_agendas.UsrCod", Gbl.Hierarchy.Deg.DegCod); case Hie_Lvl_CRS: return (unsigned) diff --git a/swad_assignment.c b/swad_assignment.c index 6081be353..3b90d669b 100644 --- a/swad_assignment.c +++ b/swad_assignment.c @@ -1896,7 +1896,6 @@ unsigned Asg_GetNumCoursesWithAssignments (Hie_Lvl_Level_t Scope) " AND ins_instits.InsCod=ctr_centers.InsCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=asg_assignments.CrsCod", Gbl.Hierarchy.Cty.CtyCod); case Hie_Lvl_INS: @@ -1910,7 +1909,6 @@ unsigned Asg_GetNumCoursesWithAssignments (Hie_Lvl_Level_t Scope) " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=asg_assignments.CrsCod", Gbl.Hierarchy.Ins.InsCod); case Hie_Lvl_CTR: @@ -1922,7 +1920,6 @@ unsigned Asg_GetNumCoursesWithAssignments (Hie_Lvl_Level_t Scope) "asg_assignments" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=asg_assignments.CrsCod", Gbl.Hierarchy.Ctr.CtrCod); case Hie_Lvl_DEG: @@ -1932,7 +1929,6 @@ unsigned Asg_GetNumCoursesWithAssignments (Hie_Lvl_Level_t Scope) " FROM crs_courses," "asg_assignments" " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=asg_assignments.CrsCod", Gbl.Hierarchy.Deg.DegCod); case Hie_Lvl_CRS: diff --git a/swad_attendance.c b/swad_attendance.c index d529cc657..fbd15968f 100644 --- a/swad_attendance.c +++ b/swad_attendance.c @@ -1743,7 +1743,6 @@ unsigned Att_GetNumCoursesWithAttEvents (Hie_Lvl_Level_t Scope) " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=att_events.CrsCod", Gbl.Hierarchy.Ins.InsCod); break; @@ -1755,7 +1754,6 @@ unsigned Att_GetNumCoursesWithAttEvents (Hie_Lvl_Level_t Scope) "att_events" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=att_events.CrsCod", Gbl.Hierarchy.Ctr.CtrCod); break; @@ -1765,7 +1763,6 @@ unsigned Att_GetNumCoursesWithAttEvents (Hie_Lvl_Level_t Scope) " FROM crs_courses," "att_events" " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=att_events.CrsCod", Gbl.Hierarchy.Deg.DegCod); break; diff --git a/swad_changelog.h b/swad_changelog.h index a508a9a46..c2c1c3a93 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -600,13 +600,14 @@ TODO: Salvador Romero Cort TODO: FIX BUG, URGENT! En las fechas como parámetro Dat_WriteParamsIniEndDates(), por ejemplo al cambiar el color de la gráfica de accesos por día y hora, no se respeta la zona horaria. */ -#define Log_PLATFORM_VERSION "SWAD 20.53.1 (2021-03-30)" +#define Log_PLATFORM_VERSION "SWAD 20.54 (2021-03-30)" #define CSS_FILE "swad20.45.css" #define JS_FILE "swad20.6.2.js" /* TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams + Version 20.54: Mar 30, 2021 Statistics about agendas. (309539 lines) Version 20.53.1: Mar 30, 2021 Optimizations in database selects. (309459 lines) Version 20.53: Mar 29, 2021 Code refactoring in database selects. (309473 lines) Version 20.52: Mar 28, 2021 Code refactoring in database selects. (309103 lines) diff --git a/swad_figure.c b/swad_figure.c index 0e4d6ed31..350be5ab8 100644 --- a/swad_figure.c +++ b/swad_figure.c @@ -31,6 +31,7 @@ #include // For string functions #include "swad_action.h" +#include "swad_agenda.h" #include "swad_box.h" #include "swad_database.h" #include "swad_figure.h" @@ -183,6 +184,8 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void); static void Fig_GetAndShowNoticesStats (void); static void Fig_GetAndShowMsgsStats (void); +static void Fig_GetAndShowAgendasStats (void); + static void Fig_GetAndShowSurveysStats (void); static void Fig_GetAndShowNumUsrsPerPrivacy (void); static void Fig_GetAndShowNumUsrsPerPrivacyForAnObject (const char *TxtObject, @@ -347,6 +350,7 @@ void Fig_ShowFigures (void) [Fig_NOTIFY_EVENTS ] = Fig_GetAndShowNumUsrsPerNotifyEvent, [Fig_NOTICES ] = Fig_GetAndShowNoticesStats, [Fig_MESSAGES ] = Fig_GetAndShowMsgsStats, + [Fig_AGENDAS ] = Fig_GetAndShowAgendasStats, [Fig_SOCIAL_NETWORKS ] = Net_ShowWebAndSocialNetworksStats, [Fig_LANGUAGES ] = Fig_GetAndShowNumUsrsPerLanguage, [Fig_FIRST_DAY_OF_WEEK] = Fig_GetAndShowNumUsrsPerFirstDayOfWeek, @@ -431,7 +435,7 @@ static void Fig_GetAndShowNumUsrsInCrss (Rol_Role_t Role) (Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod : (Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod : (Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod : - -1L))))); + -1L))))); char *Class = (Role == Rol_UNK) ? "DAT_N LINE_TOP RB" : "DAT RB"; unsigned Roles = (Role == Rol_UNK) ? ((1 << Rol_STD) | @@ -3567,18 +3571,7 @@ static void Fig_GetAndShowTimelineActivityStats (void) HTM_TR_End (); /***** Get total number of users *****/ - NumUsrsTotal = - (Gbl.Scope.Current == Hie_Lvl_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () : - Usr_GetCachedNumUsrsInCrss (Gbl.Scope.Current, - (Gbl.Scope.Current == Hie_Lvl_CTY ? Gbl.Hierarchy.Cty.CtyCod : - (Gbl.Scope.Current == Hie_Lvl_INS ? Gbl.Hierarchy.Ins.InsCod : - (Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod : - (Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod : - (Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod : - -1L))))), - 1 << Rol_STD | - 1 << Rol_NET | - 1 << Rol_TCH); + NumUsrsTotal = Usr_GetTotalNumberOfUsers (); /***** Get total number of following/followers from database *****/ for (NoteType = (Tml_Not_NoteType_t) 0; @@ -3921,18 +3914,7 @@ static void Fig_GetAndShowFollowStats (void) HTM_TR_End (); /***** Get total number of users *****/ - NumUsrsTotal = - (Gbl.Scope.Current == Hie_Lvl_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () : - Usr_GetCachedNumUsrsInCrss (Gbl.Scope.Current, - (Gbl.Scope.Current == Hie_Lvl_CTY ? Gbl.Hierarchy.Cty.CtyCod : - (Gbl.Scope.Current == Hie_Lvl_INS ? Gbl.Hierarchy.Ins.InsCod : - (Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod : - (Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod : - (Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod : - -1L))))), - 1 << Rol_STD | - 1 << Rol_NET | - 1 << Rol_TCH); + NumUsrsTotal = Usr_GetTotalNumberOfUsers (); /***** Get total number of following/followers from database *****/ for (Fol = 0; @@ -4553,8 +4535,8 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void) extern const char *Txt_NOTIFY_EVENTS_PLURAL[Ntf_NUM_NOTIFY_EVENTS]; extern const char *Txt_Number_of_users; extern const char *Txt_PERCENT_of_users; - extern const char *Txt_Number_of_BR_events; - extern const char *Txt_Number_of_BR_emails; + extern const char *Txt_Number_of_events; + extern const char *Txt_Number_of_emails; extern const char *Txt_Total; Ntf_NotifyEvent_t NotifyEvent; char *SubQuery; @@ -4579,24 +4561,13 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void) HTM_TH (1,1,"LM",Txt_Event); HTM_TH (1,1,"RM",Txt_Number_of_users); HTM_TH (1,1,"RM",Txt_PERCENT_of_users); - HTM_TH (1,1,"RM",Txt_Number_of_BR_events); - HTM_TH (1,1,"RM",Txt_Number_of_BR_emails); + HTM_TH (1,1,"RM",Txt_Number_of_events); + HTM_TH (1,1,"RM",Txt_Number_of_emails); HTM_TR_End (); /***** Get total number of users *****/ - NumUsrsTotal = - (Gbl.Scope.Current == Hie_Lvl_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () : - Usr_GetCachedNumUsrsInCrss (Gbl.Scope.Current, - (Gbl.Scope.Current == Hie_Lvl_CTY ? Gbl.Hierarchy.Cty.CtyCod : - (Gbl.Scope.Current == Hie_Lvl_INS ? Gbl.Hierarchy.Ins.InsCod : - (Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod : - (Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod : - (Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod : - -1L))))), - 1 << Rol_STD | - 1 << Rol_NET | - 1 << Rol_TCH); + NumUsrsTotal = Usr_GetTotalNumberOfUsers (); /***** Get total number of users who want to be notified by email on some event, from database *****/ @@ -4964,6 +4935,76 @@ static void Fig_GetAndShowMsgsStats (void) Box_BoxTableEnd (); } + +/*****************************************************************************/ +/********* Get and show number of users who have chosen a language ***********/ +/*****************************************************************************/ + +static void Fig_GetAndShowAgendasStats (void) + { + extern const char *Hlp_ANALYTICS_Figures_agendas; + extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES]; + extern const char *Txt_Number_of_events; + extern const char *Txt_Number_of_users; + extern const char *Txt_PERCENT_of_users; + extern const char *Txt_Number_of_events_per_user; + unsigned NumEvents; + unsigned NumUsrs; + unsigned NumUsrsTotal; + + /***** Begin box and table *****/ + Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_AGENDAS], + NULL,NULL, + Hlp_ANALYTICS_Figures_agendas,Box_NOT_CLOSABLE,2); + + /***** Heading row *****/ + HTM_TR_Begin (NULL); + + HTM_TH (1,1,"RM",Txt_Number_of_events); + HTM_TH (1,1,"RM",Txt_Number_of_users); + HTM_TH (1,1,"RM",Txt_PERCENT_of_users); + HTM_TH (1,1,"RM",Txt_Number_of_events_per_user); + + HTM_TR_End (); + + /***** Number of agenda events *****/ + NumEvents = Agd_GetNumEvents (Gbl.Scope.Current); + + /***** Number of users with agenda events *****/ + NumUsrs = Agd_GetNumUsrsWithEvents (Gbl.Scope.Current); + + /***** Get total number of users in current scope *****/ + NumUsrsTotal = Usr_GetTotalNumberOfUsers (); + + /***** Write number of users who have chosen each language *****/ + HTM_TR_Begin (NULL); + + HTM_TD_Begin ("class=\"DAT RM\""); + HTM_Unsigned (NumEvents); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"DAT RM\""); + HTM_Unsigned (NumUsrs); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"DAT RM\""); + HTM_Percentage (NumUsrsTotal ? (double) NumUsrs * 100.0 / + (double) NumUsrsTotal : + 0); + HTM_TD_End (); + + HTM_TD_Begin ("class=\"DAT RM\""); + HTM_Double2Decimals (NumUsrs ? (double) NumEvents / + (double) NumUsrs : + 0); + HTM_TD_End (); + + HTM_TR_End (); + + /***** End table and box *****/ + Box_BoxTableEnd (); + } + /*****************************************************************************/ /***************************** Show stats of surveys *************************/ /*****************************************************************************/ diff --git a/swad_figure.h b/swad_figure.h index 265b5bb55..6b33ce580 100644 --- a/swad_figure.h +++ b/swad_figure.h @@ -33,7 +33,7 @@ /************************** Public types and constants ***********************/ /*****************************************************************************/ -#define Fig_NUM_FIGURES 30 +#define Fig_NUM_FIGURES 31 typedef enum { Fig_USERS, // Number of users @@ -56,6 +56,7 @@ typedef enum Fig_NOTIFY_EVENTS, // Number of users per notify event Fig_NOTICES, // Number of notices Fig_MESSAGES, // Number of users' (sent and received) messages + Fig_AGENDAS, // Number of agendas Fig_SOCIAL_NETWORKS, // Number of users in social networks Fig_LANGUAGES, // Number of users per language Fig_FIRST_DAY_OF_WEEK, // Number of users per first day of week diff --git a/swad_help_URL.c b/swad_help_URL.c index f674fbb83..301f34b01 100644 --- a/swad_help_URL.c +++ b/swad_help_URL.c @@ -3288,6 +3288,27 @@ const char *Hlp_ANALYTICS_Figures_messages = "ANALYTICS.Figures.en#messages"; #endif +const char *Hlp_ANALYTICS_Figures_agendas = +#if L==1 + "ANALYTICS.Figures.es#agendas"; +#elif L==2 + "ANALYTICS.Figures.en#agendas"; +#elif L==3 + "ANALYTICS.Figures.en#agendas"; +#elif L==4 + "ANALYTICS.Figures.es#agendas"; +#elif L==5 + "ANALYTICS.Figures.en#agendas"; +#elif L==6 + "ANALYTICS.Figures.es#agendas"; +#elif L==7 + "ANALYTICS.Figures.en#agendas"; +#elif L==8 + "ANALYTICS.Figures.en#agendas"; +#elif L==9 + "ANALYTICS.Figures.en#agendas"; +#endif + const char *Hlp_ANALYTICS_Figures_webs_social_networks = #if L==1 "ANALYTICS.Figures.es#webs--redes-sociales"; diff --git a/swad_network.c b/swad_network.c index f2ee16317..ab3620046 100644 --- a/swad_network.c +++ b/swad_network.c @@ -442,18 +442,7 @@ void Net_ShowWebAndSocialNetworksStats (void) unsigned NumUsrs; /***** Get total number of users in current scope *****/ - NumUsrsTotal = - (Gbl.Scope.Current == Hie_Lvl_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () : - Usr_GetCachedNumUsrsInCrss (Gbl.Scope.Current, - (Gbl.Scope.Current == Hie_Lvl_CTY ? Gbl.Hierarchy.Cty.CtyCod : - (Gbl.Scope.Current == Hie_Lvl_INS ? Gbl.Hierarchy.Ins.InsCod : - (Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod : - (Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod : - (Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod : - -1L))))), - 1 << Rol_STD | - 1 << Rol_NET | - 1 << Rol_TCH); // Any user + NumUsrsTotal = Usr_GetTotalNumberOfUsers (); /***** Get number of users with a web / social network *****/ switch (Gbl.Scope.Current) diff --git a/swad_program.c b/swad_program.c index d9806f30a..2a95d2468 100644 --- a/swad_program.c +++ b/swad_program.c @@ -2205,7 +2205,6 @@ unsigned Prg_GetNumCoursesWithItems (Hie_Lvl_Level_t Scope) " AND ins_instits.InsCod=ctr_centers.InsCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=prg_items.CrsCod", Gbl.Hierarchy.Cty.CtyCod); case Hie_Lvl_INS: @@ -2219,7 +2218,6 @@ unsigned Prg_GetNumCoursesWithItems (Hie_Lvl_Level_t Scope) " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=prg_items.CrsCod", Gbl.Hierarchy.Ins.InsCod); case Hie_Lvl_CTR: @@ -2231,7 +2229,6 @@ unsigned Prg_GetNumCoursesWithItems (Hie_Lvl_Level_t Scope) "prg_items" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=prg_items.CrsCod", Gbl.Hierarchy.Ctr.CtrCod); case Hie_Lvl_DEG: @@ -2241,7 +2238,6 @@ unsigned Prg_GetNumCoursesWithItems (Hie_Lvl_Level_t Scope) " FROM crs_courses," "prg_items" " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=prg_items.CrsCod", Gbl.Hierarchy.Deg.DegCod); case Hie_Lvl_CRS: diff --git a/swad_project.c b/swad_project.c index b60bba0ce..0322d514e 100644 --- a/swad_project.c +++ b/swad_project.c @@ -4630,7 +4630,6 @@ unsigned Prj_GetNumCoursesWithProjects (Hie_Lvl_Level_t Scope) " AND ins_instits.InsCod=ctr_centers.InsCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=prj_projects.CrsCod", Gbl.Hierarchy.Cty.CtyCod); case Hie_Lvl_INS: @@ -4644,7 +4643,6 @@ unsigned Prj_GetNumCoursesWithProjects (Hie_Lvl_Level_t Scope) " WHERE ctr_centers.InsCod=%ld" " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=prj_projects.CrsCod", Gbl.Hierarchy.Ins.InsCod); case Hie_Lvl_CTR: @@ -4656,7 +4654,6 @@ unsigned Prj_GetNumCoursesWithProjects (Hie_Lvl_Level_t Scope) "prj_projects" " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=prj_projects.CrsCod", Gbl.Hierarchy.Ctr.CtrCod); case Hie_Lvl_DEG: @@ -4666,7 +4663,6 @@ unsigned Prj_GetNumCoursesWithProjects (Hie_Lvl_Level_t Scope) " FROM crs_courses," "prj_projects" " WHERE crs_courses.DegCod=%ld" - " AND crs_courses.Status=0" " AND crs_courses.CrsCod=prj_projects.CrsCod", Gbl.Hierarchy.Deg.DegCod); break; diff --git a/swad_text.c b/swad_text.c index d948ac411..d7b0f2962 100644 --- a/swad_text.c +++ b/swad_text.c @@ -21319,7 +21319,7 @@ const char *Txt_MENU_TITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] = #if L==1 // ca "Agenda" #elif L==2 // de - "Organizer" + "Agenda" #elif L==3 // en "Agenda" #elif L==4 // es @@ -23246,7 +23246,7 @@ const char *Txt_MENU_SUBTITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] = #if L==1 // ca "Agenda" #elif L==2 // de - "Organizer" + "Agenda" #elif L==3 // en "Agenda (personal organizer)" #elif L==4 // es @@ -29245,46 +29245,67 @@ const char *Txt_Number_of_BR_courses_with_BR_surveys = "N.º de
disciplinas
com inquéritos"; #endif -const char *Txt_Number_of_BR_events = +const char *Txt_Number_of_events = #if L==1 // ca - "N.º d'
esdeveniments."; + "N.º d'esdeveniments"; #elif L==2 // de - "Anzahl der
Ereignisse"; + "Anzahl der Ereignisse"; #elif L==3 // en - "Number of
events"; + "Number of events"; #elif L==4 // es - "N.º de
eventos"; + "N.º de eventos"; #elif L==5 // fr - "Nombre
d'événements"; + "Nombre d'événements"; #elif L==6 // gn - "N.º de
eventos"; // Okoteve traducción + "N.º de eventos"; // Okoteve traducción #elif L==7 // it - "Numero di
eventi"; + "Numero di eventi"; #elif L==8 // pl - "Liczba of
zdarzenia"; + "Liczba of zdarzenia"; #elif L==9 // pt - "Número de
eventos"; + "Número de eventos"; #endif -const char *Txt_Number_of_BR_emails = +const char *Txt_Number_of_events_per_user = #if L==1 // ca - "N.º de
correos"; // Necessita traduccio + "N.º d'esdeveniments per usuari"; #elif L==2 // de - "Anzahl der
E-Mails"; + "Anzahl der Ereignisse pro Benutzer"; #elif L==3 // en - "Number of
emails"; + "Number of events per user"; #elif L==4 // es - "N.º de
correos"; + "N.º de eventos por usuario"; #elif L==5 // fr - "Nombre
d'emails"; + "Nombre d'événements par utilisateur"; #elif L==6 // gn - "N.º de
correos"; // Okoteve traducción + "N.º de eventos por usuario"; // Okoteve traducción #elif L==7 // it - "Numero di
email"; + "Numero di eventi per utente"; #elif L==8 // pl - "Liczba
email"; + "Liczba zdarzeń na użytkownika"; #elif L==9 // pt - "Número de
emails"; + "Número de eventos por utilizador"; +#endif + +const char *Txt_Number_of_emails = +#if L==1 // ca + "N.º de correos"; // Necessita traduccio +#elif L==2 // de + "Anzahl der E-Mails"; +#elif L==3 // en + "Number of emails"; +#elif L==4 // es + "N.º de correos"; +#elif L==5 // fr + "Nombre d'emails"; +#elif L==6 // gn + "N.º de correos"; // Okoteve traducción +#elif L==7 // it + "Numero di email"; +#elif L==8 // pl + "Liczba email"; +#elif L==9 // pt + "Número de emails"; #endif const char *Txt_Number_of_BR_exams = @@ -32770,7 +32791,7 @@ const char *Txt_Public_agenda_USER = // Warning: it is very important to include #if L==1 // ca "Agenda pública de %s"; #elif L==2 // de - "Öffentliche Organizer von %s"; + "Öffentliche Agenda von %s"; #elif L==3 // en "%s's public agenda"; #elif L==4 // es @@ -44378,6 +44399,27 @@ const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES] = "Wiadomości" #elif L==9 // pt "Mensagens" +#endif + , + [Fig_AGENDAS] = +#if L==1 // ca + "Agendes" +#elif L==2 // de + "Agenden" +#elif L==3 // en + "Agendas" +#elif L==4 // es + "Agendas" +#elif L==5 // fr + "Agendas" +#elif L==6 // gn + "Aporyrã" +#elif L==7 // it + "Agende" +#elif L==8 // pl + "Pamiętnik" +#elif L==9 // pt + "Agendas" #endif , [Fig_SOCIAL_NETWORKS] = diff --git a/swad_user.c b/swad_user.c index 31cbf33a5..288bab3a8 100644 --- a/swad_user.c +++ b/swad_user.c @@ -9395,13 +9395,34 @@ void Usr_ShowWarningNoUsersFound (Rol_Role_t Role) /****************** Get total number of users in platform ********************/ /*****************************************************************************/ -unsigned Usr_GetTotalNumberOfUsersInPlatform (void) +unsigned Usr_GetTotalNumberOfUsers (void) { - /***** Get number of users from database *****/ - return - (unsigned) DB_QueryCOUNT ("can not get number of users", - "SELECT COUNT(UsrCod)" - " FROM usr_data"); + long Cod; + unsigned Roles; + + /***** Get number of users with events from database *****/ + switch (Gbl.Scope.Current) + { + case Hie_Lvl_SYS: + return (unsigned) DB_GetNumRowsTable ("usr_data"); // All users in platform + case Hie_Lvl_CTY: + case Hie_Lvl_INS: + case Hie_Lvl_CTR: + case Hie_Lvl_DEG: + case Hie_Lvl_CRS: + Cod = (Gbl.Scope.Current == Hie_Lvl_CTY ? Gbl.Hierarchy.Cty.CtyCod : + (Gbl.Scope.Current == Hie_Lvl_INS ? Gbl.Hierarchy.Ins.InsCod : + (Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod : + (Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod : + Gbl.Hierarchy.Crs.CrsCod)))); + Roles = (1 << Rol_STD) | + (1 << Rol_NET) | + (1 << Rol_TCH); + return Usr_GetCachedNumUsrsInCrss (Gbl.Scope.Current,Cod,Roles); // All users in courses + default: + Lay_WrongScopeExit (); + return 0; // Not reached + } } /*****************************************************************************/ diff --git a/swad_user.h b/swad_user.h index f26f371c4..3852a3854 100644 --- a/swad_user.h +++ b/swad_user.h @@ -516,7 +516,7 @@ bool Usr_ChkIfUsrCodExists (long UsrCod); void Usr_ShowWarningNoUsersFound (Rol_Role_t Role); -unsigned Usr_GetTotalNumberOfUsersInPlatform (void); +unsigned Usr_GetTotalNumberOfUsers (void); unsigned Usr_GetNumUsrsInCrss (Hie_Lvl_Level_t Scope,long Cod,unsigned Roles); unsigned Usr_GetCachedNumUsrsInCrss (Hie_Lvl_Level_t Scope,long Cod,unsigned Roles);