",ClassTxt);
+ if (Num >= 0)
+ fprintf (Gbl.F.Out,"%d",Num);
+ else // < 0 ==> do not show number
+ fprintf (Gbl.F.Out,"-");
+ fprintf (Gbl.F.Out,"
");
+ }
+
+/*****************************************************************************/
+/****************** Get and show stats about institutions ********************/
+/*****************************************************************************/
+
+static void Fig_GetAndShowInstitutionsStats (void)
+ {
+ extern const char *Hlp_ANALYTICS_Figures_institutions;
+ extern const char *Txt_Institutions;
+
+ /***** Start box *****/
+ Box_StartBox (NULL,Txt_Institutions,NULL,
+ Hlp_ANALYTICS_Figures_institutions,Box_NOT_CLOSABLE);
+
+ /***** Form to select type of list used to display degree photos *****/
+ Usr_GetAndUpdatePrefsAboutUsrList ();
+ Usr_ShowFormsToSelectUsrListType (ActSeeUseGbl);
+
+ /***** Institutions ordered by number of centres *****/
+ Fig_GetAndShowInssOrderedByNumCtrs ();
+
+ /***** Institutions ordered by number of degrees *****/
+ Fig_GetAndShowInssOrderedByNumDegs ();
+
+ /***** Institutions ordered by number of courses *****/
+ Fig_GetAndShowInssOrderedByNumCrss ();
+
+ /***** Institutions ordered by number of users in courses *****/
+ Fig_GetAndShowInssOrderedByNumUsrsInCrss ();
+
+ /***** Institutions ordered by number of users who claim to belong to them *****/
+ Fig_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem ();
+
+ /***** End box *****/
+ Box_EndBox ();
+ }
+
+/*****************************************************************************/
+/**** Get and show stats about institutions ordered by number of centres *****/
+/*****************************************************************************/
+
+static void Fig_GetAndShowInssOrderedByNumCtrs (void)
+ {
+ extern const char *Txt_Institutions_by_number_of_centres;
+ extern const char *Txt_Centres;
+ MYSQL_RES *mysql_res;
+ unsigned NumInss = 0;
+
+ /***** Start box and table *****/
+ Box_StartBoxTable ("100%",Txt_Institutions_by_number_of_centres,NULL,
+ NULL,Box_NOT_CLOSABLE,2);
+
+ /***** Get institutions ordered by number of centres *****/
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT InsCod,COUNT(*) AS N"
+ " FROM centres"
+ " GROUP BY InsCod"
+ " ORDER BY N DESC");
+ break;
+ case Sco_SCOPE_CTY:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT centres.InsCod,COUNT(*) AS N"
+ " FROM institutions,centres"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=centres.InsCod"
+ " GROUP BY centres.InsCod"
+ " ORDER BY N DESC",
+ Gbl.CurrentCty.Cty.CtyCod);
+ break;
+ case Sco_SCOPE_INS:
+ case Sco_SCOPE_CTR:
+ case Sco_SCOPE_DEG:
+ case Sco_SCOPE_CRS:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT InsCod,COUNT(*) AS N"
+ " FROM centres"
+ " WHERE InsCod=%ld"
+ " GROUP BY InsCod"
+ " ORDER BY N DESC",
+ Gbl.CurrentIns.Ins.InsCod);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ break;
+ }
+
+ /***** Show institutions *****/
+ Fig_ShowInss (&mysql_res,NumInss,Txt_Centres);
+
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+
+ /***** End table and box *****/
+ Box_EndBoxTable ();
+ }
+
+/*****************************************************************************/
+/**** Get and show stats about institutions ordered by number of degrees *****/
+/*****************************************************************************/
+
+static void Fig_GetAndShowInssOrderedByNumDegs (void)
+ {
+ extern const char *Txt_Institutions_by_number_of_degrees;
+ extern const char *Txt_Degrees;
+ MYSQL_RES *mysql_res;
+ unsigned NumInss = 0;
+
+ /***** Start box and table *****/
+ Box_StartBoxTable ("100%",Txt_Institutions_by_number_of_degrees,NULL,
+ NULL,Box_NOT_CLOSABLE,2);
+
+ /***** Get institutions ordered by number of degrees *****/
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT centres.InsCod,COUNT(*) AS N"
+ " FROM centres,degrees"
+ " WHERE centres.CtrCod=degrees.CtrCod"
+ " GROUP BY InsCod"
+ " ORDER BY N DESC");
+ break;
+ case Sco_SCOPE_CTY:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT centres.InsCod,COUNT(*) AS N"
+ " FROM institutions,centres,degrees"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " GROUP BY centres.InsCod"
+ " ORDER BY N DESC",
+ Gbl.CurrentCty.Cty.CtyCod);
+ break;
+ case Sco_SCOPE_INS:
+ case Sco_SCOPE_CTR:
+ case Sco_SCOPE_DEG:
+ case Sco_SCOPE_CRS:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT centres.InsCod,COUNT(*) AS N"
+ " FROM centres,degrees"
+ " WHERE centres.InsCod=%ld"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " GROUP BY centres.InsCod"
+ " ORDER BY N DESC",
+ Gbl.CurrentIns.Ins.InsCod);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ break;
+ }
+
+ /***** Show institutions *****/
+ Fig_ShowInss (&mysql_res,NumInss,Txt_Degrees);
+
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+
+ /***** End table and box *****/
+ Box_EndBoxTable ();
+ }
+
+/*****************************************************************************/
+/**** Get and show stats about institutions ordered by number of courses *****/
+/*****************************************************************************/
+
+static void Fig_GetAndShowInssOrderedByNumCrss (void)
+ {
+ extern const char *Txt_Institutions_by_number_of_courses;
+ extern const char *Txt_Courses;
+ MYSQL_RES *mysql_res;
+ unsigned NumInss = 0;
+
+ /***** Start box and table *****/
+ Box_StartBoxTable ("100%",Txt_Institutions_by_number_of_courses,NULL,
+ NULL,Box_NOT_CLOSABLE,2);
+
+ /***** Get institutions ordered by number of courses *****/
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT centres.InsCod,COUNT(*) AS N"
+ " FROM centres,degrees,courses"
+ " WHERE centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " GROUP BY InsCod"
+ " ORDER BY N DESC");
+ break;
+ case Sco_SCOPE_CTY:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT centres.InsCod,COUNT(*) AS N"
+ " FROM institutions,centres,degrees,courses"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " GROUP BY centres.InsCod"
+ " ORDER BY N DESC",
+ Gbl.CurrentCty.Cty.CtyCod);
+ break;
+ case Sco_SCOPE_INS:
+ case Sco_SCOPE_CTR:
+ case Sco_SCOPE_DEG:
+ case Sco_SCOPE_CRS:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT centres.InsCod,COUNT(*) AS N"
+ " FROM centres,degrees,courses"
+ " WHERE centres.InsCod=%ld"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " GROUP BY centres.InsCod"
+ " ORDER BY N DESC",
+ Gbl.CurrentIns.Ins.InsCod);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ break;
+ }
+
+ /***** Show institutions *****/
+ Fig_ShowInss (&mysql_res,NumInss,Txt_Courses);
+
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+
+ /***** End table and box *****/
+ Box_EndBoxTable ();
+ }
+
+/*****************************************************************************/
+/***** Get and show stats about institutions ordered by users in courses *****/
+/*****************************************************************************/
+
+static void Fig_GetAndShowInssOrderedByNumUsrsInCrss (void)
+ {
+ extern const char *Txt_Institutions_by_number_of_users_in_courses;
+ extern const char *Txt_Users;
+ MYSQL_RES *mysql_res;
+ unsigned NumInss = 0;
+
+ /***** Start box and table *****/
+ Box_StartBoxTable ("100%",Txt_Institutions_by_number_of_users_in_courses,NULL,
+ NULL,Box_NOT_CLOSABLE,2);
+
+ /***** Get institutions ordered by number of users in courses *****/
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT centres.InsCod,COUNT(DISTINCT crs_usr.UsrCod) AS N"
+ " FROM centres,degrees,courses,crs_usr"
+ " WHERE centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " GROUP BY InsCod"
+ " ORDER BY N DESC");
+ break;
+ case Sco_SCOPE_CTY:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT centres.InsCod,COUNT(DISTINCT crs_usr.UsrCod) AS N"
+ " FROM institutions,centres,degrees,courses,crs_usr"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " GROUP BY centres.InsCod"
+ " ORDER BY N DESC",
+ Gbl.CurrentCty.Cty.CtyCod);
+ break;
+ case Sco_SCOPE_INS:
+ case Sco_SCOPE_CTR:
+ case Sco_SCOPE_DEG:
+ case Sco_SCOPE_CRS:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT centres.InsCod,COUNT(DISTINCT crs_usr.UsrCod) AS N"
+ " FROM centres,degrees,courses,crs_usr"
+ " WHERE centres.InsCod=%ld"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " GROUP BY centres.InsCod"
+ " ORDER BY N DESC",
+ Gbl.CurrentIns.Ins.InsCod);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ break;
+ }
+
+ /***** Show institutions *****/
+ Fig_ShowInss (&mysql_res,NumInss,Txt_Users);
+
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+
+ /***** End table and box *****/
+ Box_EndBoxTable ();
+ }
+
+/*****************************************************************************/
+/************* Get and show stats about institutions ordered by **************/
+/************* number of users who claim to belong to them **************/
+/*****************************************************************************/
+
+static void Fig_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem (void)
+ {
+ extern const char *Txt_Institutions_by_number_of_users_who_claim_to_belong_to_them;
+ extern const char *Txt_Users;
+ MYSQL_RES *mysql_res;
+ unsigned NumInss;
+
+ /***** Start box and table *****/
+ Box_StartBoxTable ("100%",Txt_Institutions_by_number_of_users_who_claim_to_belong_to_them,
+ NULL,
+ NULL,Box_NOT_CLOSABLE,2);
+
+ /***** Get institutions ordered by number of users who claim to belong to them *****/
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT InsCod,COUNT(*) AS N"
+ " FROM usr_data"
+ " WHERE InsCod>0"
+ " GROUP BY InsCod"
+ " ORDER BY N DESC");
+ break;
+ case Sco_SCOPE_CTY:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT usr_data.InsCod,COUNT(*) AS N"
+ " FROM institutions,usr_data"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=usr_data.InsCod"
+ " GROUP BY usr_data.InsCod"
+ " ORDER BY N DESC",
+ Gbl.CurrentCty.Cty.CtyCod);
+ break;
+ case Sco_SCOPE_INS:
+ case Sco_SCOPE_CTR:
+ case Sco_SCOPE_DEG:
+ case Sco_SCOPE_CRS:
+ NumInss =
+ (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
+ "SELECT InsCod,COUNT(*) AS N"
+ " FROM usr_data"
+ " WHERE InsCod=%ld"
+ " GROUP BY InsCod"
+ " ORDER BY N DESC",
+ Gbl.CurrentIns.Ins.InsCod);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ NumInss = 0; // Not reached. Initialized to avoid warning.
+ break;
+ }
+
+ /***** Show institutions *****/
+ Fig_ShowInss (&mysql_res,NumInss,Txt_Users);
+
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+
+ /***** End table and box *****/
+ Box_EndBoxTable ();
+ }
+
+/*****************************************************************************/
+/****************** Get and show stats about institutions ********************/
+/*****************************************************************************/
+
+static void Fig_ShowInss (MYSQL_RES **mysql_res,unsigned NumInss,
+ const char *TxtFigure)
+ {
+ extern const char *The_ClassForm[The_NUM_THEMES];
+ extern const char *Txt_Institution;
+ unsigned NumIns;
+ unsigned NumOrder;
+ unsigned NumberLastRow;
+ unsigned NumberThisRow;
+ struct Instit Ins;
+ bool TRIsOpen = false;
+
+ /***** Query database *****/
+ if (NumInss)
+ {
+ /* Draw the classphoto/list */
+ switch (Gbl.Usrs.Me.ListType)
+ {
+ case Usr_LIST_AS_CLASS_PHOTO:
+ /***** Draw institutions as a class photo *****/
+ for (NumIns = 0;
+ NumIns < NumInss;)
+ {
+ if ((NumIns % Gbl.Usrs.ClassPhoto.Cols) == 0)
+ {
+ fprintf (Gbl.F.Out,"
");
+ TRIsOpen = true;
+ }
+
+ /***** Get institution data and statistic *****/
+ NumberThisRow = Fig_GetInsAndStat (&Ins,*mysql_res);
+
+ /***** Write link to institution *****/
+ fprintf (Gbl.F.Out,"
",
+ Txt_Type,
+ Txt_No_of_social_posts,
+ Txt_No_of_users,
+ Txt_PERCENT_of_users,
+ Txt_No_of_posts_BR_per_user);
+
+ /***** Get total number of users *****/
+ NumUsrsTotal = (Gbl.Scope.Current == Sco_SCOPE_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () :
+ Usr_GetTotalNumberOfUsersInCourses (Gbl.Scope.Current,
+ 1 << Rol_STD |
+ 1 << Rol_NET |
+ 1 << Rol_TCH);
+
+ /***** Get total number of following/followers from database *****/
+ for (NoteType = (Soc_NoteType_t) 0;
+ NoteType < Soc_NUM_NOTE_TYPES;
+ NoteType++)
+ {
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(*),"
+ "COUNT(DISTINCT UsrCod)"
+ " FROM social_notes WHERE NoteType=%u",
+ NoteType);
+ break;
+ case Sco_SCOPE_CTY:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(DISTINCT social_notes.NotCod),"
+ "COUNT(DISTINCT social_notes.UsrCod)"
+ " FROM institutions,centres,degrees,courses,crs_usr,social_notes"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=social_notes.UsrCod"
+ " AND social_notes.NoteType=%u",
+ Gbl.CurrentCty.Cty.CtyCod,
+ (unsigned) NoteType);
+ break;
+ case Sco_SCOPE_INS:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(DISTINCT social_notes.NotCod),"
+ "COUNT(DISTINCT social_notes.UsrCod)"
+ " FROM centres,degrees,courses,crs_usr,social_notes"
+ " WHERE centres.InsCod=%ld"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=social_notes.UsrCod"
+ " AND social_notes.NoteType=%u",
+ Gbl.CurrentIns.Ins.InsCod,
+ (unsigned) NoteType);
+ break;
+ case Sco_SCOPE_CTR:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(DISTINCT social_notes.NotCod),"
+ "COUNT(DISTINCT social_notes.UsrCod)"
+ " FROM degrees,courses,crs_usr,social_notes"
+ " WHERE degrees.CtrCod=%ld"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=social_notes.UsrCod"
+ " AND social_notes.NoteType=%u",
+ Gbl.CurrentCtr.Ctr.CtrCod,
+ (unsigned) NoteType);
+ break;
+ case Sco_SCOPE_DEG:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(DISTINCT social_notes.NotCod),"
+ "COUNT(DISTINCT social_notes.UsrCod)"
+ " FROM courses,crs_usr,social_notes"
+ " WHERE courses.DegCod=%ld"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=social_notes.UsrCod"
+ " AND social_notes.NoteType=%u",
+ Gbl.CurrentDeg.Deg.DegCod,
+ (unsigned) NoteType);
+ break;
+ case Sco_SCOPE_CRS:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(DISTINCT social_notes.NotCod),"
+ "COUNT(DISTINCT social_notes.UsrCod)"
+ " FROM crs_usr,social_notes"
+ " WHERE crs_usr.CrsCod=%ld"
+ " AND crs_usr.UsrCod=social_notes.UsrCod"
+ " AND social_notes.NoteType=%u",
+ Gbl.CurrentCrs.Crs.CrsCod,
+ (unsigned) NoteType);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ NumRows = 0; // Initialized to avoid warning
+ break;
+ }
+ NumSocialNotes = 0;
+ NumUsrs = 0;
+
+ if (NumRows)
+ {
+ /***** Get number of social notes and number of users *****/
+ row = mysql_fetch_row (mysql_res);
+
+ /* Get number of social notes */
+ if (row[0])
+ if (sscanf (row[0],"%lu",&NumSocialNotes) != 1)
+ NumSocialNotes = 0;
+
+ /* Get number of users */
+ if (row[1])
+ if (sscanf (row[1],"%u",&NumUsrs) != 1)
+ NumUsrs = 0;
+ }
+
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+
+ /***** Write number of social notes and number of users *****/
+ fprintf (Gbl.F.Out,"
"
+ "
"
+ "%s"
+ "
"
+ "
"
+ "%lu"
+ "
"
+ "
"
+ "%u"
+ "
"
+ "
"
+ "%5.2f%%"
+ "
"
+ "
"
+ "%.2f"
+ "
"
+ "
",
+ Txt_SOCIAL_NOTE[NoteType],
+ NumSocialNotes,
+ NumUsrs,
+ NumUsrsTotal ? (float) NumUsrs * 100.0 / (float) NumUsrsTotal :
+ 0.0,
+ NumUsrs ? (float) NumSocialNotes / (float) NumUsrs :
+ 0.0);
+ }
+
+ /***** Get and write totals *****/
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(*),"
+ "COUNT(DISTINCT UsrCod)"
+ " FROM social_notes");
+ break;
+ case Sco_SCOPE_CTY:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(DISTINCT social_notes.NotCod),"
+ "COUNT(DISTINCT social_notes.UsrCod)"
+ " FROM institutions,centres,degrees,courses,crs_usr,social_notes"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=social_notes.UsrCod",
+ Gbl.CurrentCty.Cty.CtyCod);
+ break;
+ case Sco_SCOPE_INS:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(DISTINCT social_notes.NotCod),"
+ "COUNT(DISTINCT social_notes.UsrCod)"
+ " FROM centres,degrees,courses,crs_usr,social_notes"
+ " WHERE centres.InsCod=%ld"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=social_notes.UsrCod",
+ Gbl.CurrentIns.Ins.InsCod);
+ break;
+ case Sco_SCOPE_CTR:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(DISTINCT social_notes.NotCod),"
+ "COUNT(DISTINCT social_notes.UsrCod)"
+ " FROM degrees,courses,crs_usr,social_notes"
+ " WHERE degrees.CtrCod=%ld"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=social_notes.UsrCod",
+ Gbl.CurrentCtr.Ctr.CtrCod);
+ break;
+ case Sco_SCOPE_DEG:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(DISTINCT social_notes.NotCod),"
+ "COUNT(DISTINCT social_notes.UsrCod)"
+ " FROM courses,crs_usr,social_notes"
+ " WHERE courses.DegCod=%ld"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=social_notes.UsrCod",
+ Gbl.CurrentDeg.Deg.DegCod);
+ break;
+ case Sco_SCOPE_CRS:
+ NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
+ "SELECT COUNT(DISTINCT social_notes.NotCod),"
+ "COUNT(DISTINCT social_notes.UsrCod)"
+ " FROM crs_usr,social_notes"
+ " WHERE crs_usr.CrsCod=%ld"
+ " AND crs_usr.UsrCod=social_notes.UsrCod",
+ Gbl.CurrentCrs.Crs.CrsCod);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ NumRows = 0; // Initialized to avoid warning
+ break;
+ }
+ NumSocialNotes = 0;
+ NumUsrs = 0;
+
+ if (NumRows)
+ {
+ /* Get number of social notes and number of users */
+ row = mysql_fetch_row (mysql_res);
+
+ /* Get number of social notes */
+ if (row[0])
+ if (sscanf (row[0],"%lu",&NumSocialNotes) != 1)
+ NumSocialNotes = 0;
+
+ /* Get number of users */
+ if (row[1])
+ if (sscanf (row[1],"%u",&NumUsrs) != 1)
+ NumUsrs = 0;
+ }
+
+ /* Free structure that stores the query result */
+ DB_FreeMySQLResult (&mysql_res);
+
+ /* Write totals */
+ fprintf (Gbl.F.Out,"
",
+ Txt_Users,
+ Txt_No_of_users,
+ Txt_PERCENT_of_users);
+
+ /***** Get total number of users *****/
+ NumUsrsTotal = (Gbl.Scope.Current == Sco_SCOPE_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () :
+ Usr_GetTotalNumberOfUsersInCourses (Gbl.Scope.Current,
+ 1 << Rol_STD |
+ 1 << Rol_NET |
+ 1 << Rol_TCH);
+
+ /***** Get total number of following/followers from database *****/
+ for (Fol = 0;
+ Fol < 2;
+ Fol++)
+ {
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the total number"
+ " of following/followers",
+ "SELECT COUNT(DISTINCT %s) FROM usr_follow",
+ FieldDB[Fol]);
+ break;
+ case Sco_SCOPE_CTY:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the total number"
+ " of following/followers",
+ "SELECT COUNT(DISTINCT usr_follow.%s)"
+ " FROM institutions,centres,degrees,courses,crs_usr,usr_follow"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_follow.%s",
+ FieldDB[Fol],
+ Gbl.CurrentCty.Cty.CtyCod,
+ FieldDB[Fol]);
+ break;
+ case Sco_SCOPE_INS:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the total number"
+ " of following/followers",
+ "SELECT COUNT(DISTINCT usr_follow.%s)"
+ " FROM centres,degrees,courses,crs_usr,usr_follow"
+ " WHERE centres.InsCod=%ld"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_follow.%s",
+ FieldDB[Fol],
+ Gbl.CurrentIns.Ins.InsCod,
+ FieldDB[Fol]);
+ break;
+ case Sco_SCOPE_CTR:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the total number"
+ " of following/followers",
+ "SELECT COUNT(DISTINCT usr_follow.%s)"
+ " FROM degrees,courses,crs_usr,usr_follow"
+ " WHERE degrees.CtrCod=%ld"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_follow.%s",
+ FieldDB[Fol],
+ Gbl.CurrentCtr.Ctr.CtrCod,
+ FieldDB[Fol]);
+ break;
+ case Sco_SCOPE_DEG:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the total number"
+ " of following/followers",
+ "SELECT COUNT(DISTINCT usr_follow.%s)"
+ " FROM courses,crs_usr,usr_follow"
+ " WHERE courses.DegCod=%ld"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_follow.%s",
+ FieldDB[Fol],
+ Gbl.CurrentDeg.Deg.DegCod,
+ FieldDB[Fol]);
+ break;
+ case Sco_SCOPE_CRS:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the total number"
+ " of following/followers",
+ "SELECT COUNT(DISTINCT usr_follow.%s)"
+ " FROM crs_usr,usr_follow"
+ " WHERE crs_usr.CrsCod=%ld"
+ " AND crs_usr.UsrCod=usr_follow.%s",
+ FieldDB[Fol],
+ Gbl.CurrentCrs.Crs.CrsCod,
+ FieldDB[Fol]);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ NumUsrs = 0; // Not reached. Initialized to av oid warning
+ break;
+ }
+
+ /***** Write number of followed / followers *****/
+ fprintf (Gbl.F.Out,"
"
+ "
"
+ "%s"
+ "
"
+ "
"
+ "%u"
+ "
"
+ "
"
+ "%5.2f%%"
+ "
"
+ "
",
+ Fol == 0 ? Txt_Followed :
+ Txt_Followers,
+ NumUsrs,
+ NumUsrsTotal ? (float) NumUsrs * 100.0 /
+ (float) NumUsrsTotal :
+ 0.0);
+ }
+
+ /***** Write number of followed/followers per follower/followed *****/
+ for (Fol = 0;
+ Fol < 2;
+ Fol++)
+ {
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ DB_QuerySELECT (&mysql_res,"can not get number of questions"
+ " per survey",
+ "SELECT AVG(N) FROM "
+ "(SELECT COUNT(%s) AS N"
+ " FROM usr_follow"
+ " GROUP BY %s) AS F",
+ FieldDB[Fol],
+ FieldDB[1 - Fol]);
+ break;
+ case Sco_SCOPE_CTY:
+ DB_QuerySELECT (&mysql_res,"can not get number of questions"
+ " per survey",
+ "SELECT AVG(N) FROM "
+ "(SELECT COUNT(DISTINCT usr_follow.%s) AS N"
+ " FROM institutions,centres,degrees,courses,crs_usr,usr_follow"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_follow.%s"
+ " GROUP BY %s) AS F",
+ FieldDB[Fol],
+ Gbl.CurrentCty.Cty.CtyCod,
+ FieldDB[Fol],
+ FieldDB[1 - Fol]);
+ break;
+ case Sco_SCOPE_INS:
+ DB_QuerySELECT (&mysql_res,"can not get number of questions"
+ " per survey",
+ "SELECT AVG(N) FROM "
+ "(SELECT COUNT(DISTINCT usr_follow.%s) AS N"
+ " FROM centres,degrees,courses,crs_usr,usr_follow"
+ " WHERE centres.InsCod=%ld"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_follow.%s"
+ " GROUP BY %s) AS F",
+ FieldDB[Fol],
+ Gbl.CurrentIns.Ins.InsCod,
+ FieldDB[Fol],
+ FieldDB[1 - Fol]);
+ break;
+ case Sco_SCOPE_CTR:
+ DB_QuerySELECT (&mysql_res,"can not get number of questions"
+ " per survey",
+ "SELECT AVG(N) FROM "
+ "(SELECT COUNT(DISTINCT usr_follow.%s) AS N"
+ " FROM degrees,courses,crs_usr,usr_follow"
+ " WHERE degrees.CtrCod=%ld"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_follow.%s"
+ " GROUP BY %s) AS F",
+ FieldDB[Fol],
+ Gbl.CurrentCtr.Ctr.CtrCod,
+ FieldDB[Fol],
+ FieldDB[1 - Fol]);
+ break;
+ case Sco_SCOPE_DEG:
+ DB_QuerySELECT (&mysql_res,"can not get number of questions"
+ " per survey",
+ "SELECT AVG(N) FROM "
+ "(SELECT COUNT(DISTINCT usr_follow.%s) AS N"
+ " FROM courses,crs_usr,usr_follow"
+ " WHERE courses.DegCod=%ld"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_follow.%s"
+ " GROUP BY %s) AS F",
+ FieldDB[Fol],
+ Gbl.CurrentDeg.Deg.DegCod,
+ FieldDB[Fol],
+ FieldDB[1 - Fol]);
+ break;
+ case Sco_SCOPE_CRS:
+ DB_QuerySELECT (&mysql_res,"can not get number of questions"
+ " per survey",
+ "SELECT AVG(N) FROM "
+ "(SELECT COUNT(DISTINCT usr_follow.%s) AS N"
+ " FROM crs_usr,usr_follow"
+ " WHERE crs_usr.CrsCod=%ld"
+ " AND crs_usr.UsrCod=usr_follow.%s"
+ " GROUP BY %s) AS F",
+ FieldDB[Fol],
+ Gbl.CurrentCrs.Crs.CrsCod,
+ FieldDB[Fol],
+ FieldDB[1 - Fol]);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ break;
+ }
+
+ /***** Get average *****/
+ row = mysql_fetch_row (mysql_res);
+ Average = Str_GetFloatNumFromStr (row[0]);
+
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+
+ /***** Write number of followed per follower *****/
+ fprintf (Gbl.F.Out,"
",
+ Txt_Event,
+ Txt_No_of_users,
+ Txt_PERCENT_of_users,
+ Txt_Number_of_BR_events,
+ Txt_Number_of_BR_emails);
+
+ /***** Get total number of users *****/
+ NumUsrsTotal = (Gbl.Scope.Current == Sco_SCOPE_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () :
+ Usr_GetTotalNumberOfUsersInCourses (Gbl.Scope.Current,
+ 1 << Rol_STD |
+ 1 << Rol_NET |
+ 1 << Rol_TCH);
+
+ /***** Get total number of users who want to be
+ notified by email on some event, from database *****/
+ NumUsrsTotalWhoWantToBeNotifiedByEMailAboutSomeEvent =
+ Fig_GetNumUsrsWhoChoseAnOption ("usr_data.EmailNtfEvents<>0");
+
+ /***** For each notify event... *****/
+ for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
+ NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
+ NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
+ {
+ /* Get the number of users who want to be notified by email on this event, from database */
+ if (asprintf (&SubQuery,"((usr_data.EmailNtfEvents & %u)<>0)",
+ (1 << NotifyEvent)) < 0)
+ Lay_NotEnoughMemoryExit ();
+ NumUsrs[NotifyEvent] = Fig_GetNumUsrsWhoChoseAnOption (SubQuery);
+ free ((void *) SubQuery);
+
+ /* Get number of notifications by email from database */
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ DB_QuerySELECT (&mysql_res,"can not get the number"
+ " of notifications by email",
+ "SELECT SUM(NumEvents),SUM(NumMails)"
+ " FROM sta_notif"
+ " WHERE NotifyEvent=%u",
+ (unsigned) NotifyEvent);
+ break;
+ case Sco_SCOPE_CTY:
+ DB_QuerySELECT (&mysql_res,"can not get the number"
+ " of notifications by email",
+ "SELECT SUM(sta_notif.NumEvents),SUM(sta_notif.NumMails)"
+ " FROM institutions,centres,degrees,sta_notif"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=sta_notif.DegCod"
+ " AND sta_notif.NotifyEvent=%u",
+ Gbl.CurrentCty.Cty.CtyCod,(unsigned) NotifyEvent);
+ break;
+ case Sco_SCOPE_INS:
+ DB_QuerySELECT (&mysql_res,"can not get the number"
+ " of notifications by email",
+ "SELECT SUM(sta_notif.NumEvents),SUM(sta_notif.NumMails)"
+ " FROM centres,degrees,sta_notif"
+ " WHERE centres.InsCod=%ld"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=sta_notif.DegCod"
+ " AND sta_notif.NotifyEvent=%u",
+ Gbl.CurrentIns.Ins.InsCod,(unsigned) NotifyEvent);
+ break;
+ case Sco_SCOPE_CTR:
+ DB_QuerySELECT (&mysql_res,"can not get the number"
+ " of notifications by email",
+ "SELECT SUM(sta_notif.NumEvents),SUM(sta_notif.NumMails)"
+ " FROM degrees,sta_notif"
+ " WHERE degrees.CtrCod=%ld"
+ " AND degrees.DegCod=sta_notif.DegCod"
+ " AND sta_notif.NotifyEvent=%u",
+ Gbl.CurrentCtr.Ctr.CtrCod,(unsigned) NotifyEvent);
+ break;
+ case Sco_SCOPE_DEG:
+ DB_QuerySELECT (&mysql_res,"can not get the number"
+ " of notifications by email",
+ "SELECT SUM(NumEvents),SUM(NumMails)"
+ " FROM sta_notif"
+ " WHERE DegCod=%ld"
+ " AND NotifyEvent=%u",
+ Gbl.CurrentDeg.Deg.DegCod,(unsigned) NotifyEvent);
+ break;
+ case Sco_SCOPE_CRS:
+ DB_QuerySELECT (&mysql_res,"can not get the number"
+ " of notifications by email",
+ "SELECT SUM(NumEvents),SUM(NumMails)"
+ " FROM sta_notif"
+ " WHERE CrsCod=%ld"
+ " AND NotifyEvent=%u",
+ Gbl.CurrentCrs.Crs.CrsCod,(unsigned) NotifyEvent);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ break;
+ }
+
+ row = mysql_fetch_row (mysql_res);
+
+ /* Get number of events notified */
+ if (row[0])
+ {
+ if (sscanf (row[0],"%u",&NumEvents[NotifyEvent]) != 1)
+ Lay_ShowErrorAndExit ("Error when getting the number of notifications by email.");
+ }
+ else
+ NumEvents[NotifyEvent] = 0;
+
+ /* Get number of mails sent */
+ if (row[1])
+ {
+ if (sscanf (row[1],"%u",&NumMails[NotifyEvent]) != 1)
+ Lay_ShowErrorAndExit ("Error when getting the number of emails to notify events3.");
+ }
+ else
+ NumMails[NotifyEvent] = 0;
+
+ /* Free structure that stores the query result */
+ DB_FreeMySQLResult (&mysql_res);
+
+ /* Update total number of events and mails */
+ NumEventsTotal += NumEvents[NotifyEvent];
+ NumMailsTotal += NumMails [NotifyEvent];
+ }
+
+ /***** Write number of users who want to be notified by email on each event *****/
+ for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
+ NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
+ NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
+ fprintf (Gbl.F.Out,"
"
+ "
"
+ "%s"
+ "
"
+ "
"
+ "%u"
+ "
"
+ "
"
+ "%5.2f%%"
+ "
"
+ "
"
+ "%u"
+ "
"
+ "
"
+ "%u"
+ "
"
+ "
",
+ Txt_NOTIFY_EVENTS_PLURAL[NotifyEvent],
+ NumUsrs[NotifyEvent],
+ NumUsrsTotal ? (float) NumUsrs[NotifyEvent] * 100.0 /
+ (float) NumUsrsTotal :
+ 0.0,
+ NumEvents[NotifyEvent],
+ NumMails[NotifyEvent]);
+
+ /***** Write total number of users who want to be notified by email on some event *****/
+ fprintf (Gbl.F.Out,"
",
+ Txt_Language,
+ Txt_No_of_users,
+ Txt_PERCENT_of_users);
+
+ /***** For each language... *****/
+ for (Lan = (Lan_Language_t) 1;
+ Lan <= Lan_NUM_LANGUAGES;
+ Lan++)
+ {
+ /* Get the number of users who have chosen this language from database */
+ if (asprintf (&SubQuery,"usr_data.Language='%s'",
+ Lan_STR_LANG_ID[Lan]) < 0)
+ Lay_NotEnoughMemoryExit ();
+ NumUsrs[Lan] = Fig_GetNumUsrsWhoChoseAnOption (SubQuery);
+ free ((void *) SubQuery);
+
+ /* Update total number of users */
+ NumUsrsTotal += NumUsrs[Lan];
+ }
+
+ /***** Write number of users who have chosen each language *****/
+ for (Lan = (Lan_Language_t) 1;
+ Lan <= Lan_NUM_LANGUAGES;
+ Lan++)
+ fprintf (Gbl.F.Out,"
"
+ "
"
+ "%s"
+ "
"
+ "
"
+ "%u"
+ "
"
+ "
"
+ "%5.2f%%"
+ "
"
+ "
",
+ Txt_STR_LANG_NAME[Lan],NumUsrs[Lan],
+ NumUsrsTotal ? (float) NumUsrs[Lan] * 100.0 /
+ (float) NumUsrsTotal :
+ 0);
+
+ /***** End table and box *****/
+ Box_EndBoxTable ();
+ }
+
+/*****************************************************************************/
+/***** Get and show number of users who have chosen a first day of week ******/
+/*****************************************************************************/
+
+static void Fig_GetAndShowNumUsrsPerFirstDayOfWeek (void)
+ {
+ extern const bool Cal_DayIsValidAsFirstDayOfWeek[7];
+ extern const char *Hlp_ANALYTICS_Figures_calendar;
+ extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
+ extern const char *Txt_Calendar;
+ extern const char *Txt_First_day_of_the_week;
+ extern const char *Txt_DAYS_SMALL[7];
+ extern const char *Txt_No_of_users;
+ extern const char *Txt_PERCENT_of_users;
+ unsigned FirstDayOfWeek;
+ char *SubQuery;
+ unsigned NumUsrs[7]; // 7: seven days in a week
+ unsigned NumUsrsTotal = 0;
+
+ /***** Start box and table *****/
+ Box_StartBoxTable (NULL,Txt_FIGURE_TYPES[Fig_FIRST_DAY_OF_WEEK],NULL,
+ Hlp_ANALYTICS_Figures_calendar,Box_NOT_CLOSABLE,2);
+
+ /***** Heading row *****/
+ fprintf (Gbl.F.Out,"
"
+ "
"
+ "%s"
+ "
"
+ "
"
+ "%s"
+ "
"
+ "
"
+ "%s"
+ "
"
+ "
",
+ Txt_Calendar,
+ Txt_No_of_users,
+ Txt_PERCENT_of_users);
+
+ /***** For each day... *****/
+ for (FirstDayOfWeek = 0; // Monday
+ FirstDayOfWeek <= 6; // Sunday
+ FirstDayOfWeek++)
+ if (Cal_DayIsValidAsFirstDayOfWeek[FirstDayOfWeek])
+ {
+ /* Get number of users who have chosen this first day of week from database */
+ if (asprintf (&SubQuery,"usr_data.FirstDayOfWeek=%u",
+ (unsigned) FirstDayOfWeek) < 0)
+ Lay_NotEnoughMemoryExit ();
+ NumUsrs[FirstDayOfWeek] = Fig_GetNumUsrsWhoChoseAnOption (SubQuery);
+ free ((void *) SubQuery);
+
+ /* Update total number of users */
+ NumUsrsTotal += NumUsrs[FirstDayOfWeek];
+ }
+
+ /***** Write number of users who have chosen each first day of week *****/
+ for (FirstDayOfWeek = 0; // Monday
+ FirstDayOfWeek <= 6; // Sunday
+ FirstDayOfWeek++)
+ if (Cal_DayIsValidAsFirstDayOfWeek[FirstDayOfWeek])
+ fprintf (Gbl.F.Out,"
"
+ "
"
+ ""
+ "
"
+ "
"
+ "%u"
+ "
"
+ "
"
+ "%5.2f%%"
+ "
"
+ "
",
+ Gbl.Prefs.URLIcons,FirstDayOfWeek,
+ Txt_DAYS_SMALL[FirstDayOfWeek],
+ Txt_First_day_of_the_week,Txt_DAYS_SMALL[FirstDayOfWeek],
+ NumUsrs[FirstDayOfWeek],
+ NumUsrsTotal ? (float) NumUsrs[FirstDayOfWeek] * 100.0 /
+ (float) NumUsrsTotal :
+ 0);
+
+ /***** End table and box *****/
+ Box_EndBoxTable ();
+ }
+
+/*****************************************************************************/
+/******** Get and show number of users who have chosen a date format *********/
+/*****************************************************************************/
+
+static void Fig_GetAndShowNumUsrsPerDateFormat (void)
+ {
+ extern const char *Hlp_ANALYTICS_Figures_dates;
+ extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
+ extern const char *Txt_Format;
+ extern const char *Txt_No_of_users;
+ extern const char *Txt_PERCENT_of_users;
+ unsigned Format;
+ char *SubQuery;
+ unsigned NumUsrs[Dat_NUM_OPTIONS_FORMAT];
+ unsigned NumUsrsTotal = 0;
+
+ /***** Start box and table *****/
+ Box_StartBoxTable (NULL,Txt_FIGURE_TYPES[Fig_DATE_FORMAT],NULL,
+ Hlp_ANALYTICS_Figures_dates,Box_NOT_CLOSABLE,2);
+
+ /***** Heading row *****/
+ fprintf (Gbl.F.Out,"
"
+ "
"
+ "%s"
+ "
"
+ "
"
+ "%s"
+ "
"
+ "
"
+ "%s"
+ "
"
+ "
",
+ Txt_Format,
+ Txt_No_of_users,
+ Txt_PERCENT_of_users);
+
+ /***** For each format... *****/
+ for (Format = (Dat_Format_t) 0;
+ Format <= (Dat_Format_t) (Dat_NUM_OPTIONS_FORMAT - 1);
+ Format++)
+ {
+ /* Get number of users who have chosen this date format from database */
+ if (asprintf (&SubQuery,"usr_data.DateFormat=%u",
+ (unsigned) Format) < 0)
+ Lay_NotEnoughMemoryExit ();
+ NumUsrs[Format] = Fig_GetNumUsrsWhoChoseAnOption (SubQuery);
+ free ((void *) SubQuery);
+
+ /* Update total number of users */
+ NumUsrsTotal += NumUsrs[Format];
+ }
+
+ /***** Write number of users who have chosen each date format *****/
+ for (Format = (Dat_Format_t) 0;
+ Format <= (Dat_Format_t) (Dat_NUM_OPTIONS_FORMAT - 1);
+ Format++)
+ {
+ fprintf (Gbl.F.Out,"
",
+ Txt_Icons,
+ Txt_No_of_users,
+ Txt_PERCENT_of_users);
+
+ /***** For each icon set... *****/
+ for (IconSet = (Ico_IconSet_t) 0;
+ IconSet < Ico_NUM_ICON_SETS;
+ IconSet++)
+ {
+ /* Get the number of users who have chosen this icon set from database */
+ if (asprintf (&SubQuery,"usr_data.IconSet='%s'",
+ Ico_IconSetId[IconSet]) < 0)
+ Lay_NotEnoughMemoryExit ();
+ NumUsrs[IconSet] = Fig_GetNumUsrsWhoChoseAnOption (SubQuery);
+ free ((void *) SubQuery);
+
+ /* Update total number of users */
+ NumUsrsTotal += NumUsrs[IconSet];
+ }
+
+ /***** Write number of users who have chosen each icon set *****/
+ for (IconSet = (Ico_IconSet_t) 0;
+ IconSet < Ico_NUM_ICON_SETS;
+ IconSet++)
+ fprintf (Gbl.F.Out,"
",
+ Txt_Menu,
+ Txt_No_of_users,
+ Txt_PERCENT_of_users);
+
+ /***** For each menu... *****/
+ for (Menu = (Mnu_Menu_t) 0;
+ Menu < Mnu_NUM_MENUS;
+ Menu++)
+ {
+ /* Get number of users who have chosen this menu from database */
+ if (asprintf (&SubQuery,"usr_data.Menu=%u",
+ (unsigned) Menu) < 0)
+ Lay_NotEnoughMemoryExit ();
+ NumUsrs[Menu] = Fig_GetNumUsrsWhoChoseAnOption (SubQuery);
+ free ((void *) SubQuery);
+
+ /* Update total number of users */
+ NumUsrsTotal += NumUsrs[Menu];
+ }
+
+ /***** Write number of users who have chosen each menu *****/
+ for (Menu = (Mnu_Menu_t) 0;
+ Menu < Mnu_NUM_MENUS;
+ Menu++)
+ fprintf (Gbl.F.Out,"
",
+ Txt_Columns,
+ Txt_No_of_users,
+ Txt_PERCENT_of_users);
+
+ /***** For each language... *****/
+ for (SideCols = 0;
+ SideCols <= Lay_SHOW_BOTH_COLUMNS;
+ SideCols++)
+ {
+ /* Get the number of users who have chosen this layout of columns from database */
+ if (asprintf (&SubQuery,"usr_data.SideCols=%u",
+ SideCols) < 0)
+ Lay_NotEnoughMemoryExit ();
+ NumUsrs[SideCols] = Fig_GetNumUsrsWhoChoseAnOption (SubQuery);
+ free ((void *) SubQuery);
+
+ /* Update total number of users */
+ NumUsrsTotal += NumUsrs[SideCols];
+ }
+
+ /***** Write number of users who have chosen this layout of columns *****/
+ for (SideCols = 0;
+ SideCols <= Lay_SHOW_BOTH_COLUMNS;
+ SideCols++)
+ fprintf (Gbl.F.Out,"
"
+ "
"
+ ""
+ "
"
+ "
"
+ "%u"
+ "
"
+ "
"
+ "%5.2f%%"
+ "
"
+ "
",
+ Gbl.Prefs.URLIcons,SideCols >> 1,SideCols & 1,
+ Txt_LAYOUT_SIDE_COLUMNS[SideCols],
+ Txt_LAYOUT_SIDE_COLUMNS[SideCols],
+ NumUsrs[SideCols],
+ NumUsrsTotal ? (float) NumUsrs[SideCols] * 100.0 /
+ (float) NumUsrsTotal :
+ 0);
+
+ /***** End table and box *****/
+ Box_EndBoxTable ();
+ }
+
+/*****************************************************************************/
+/************** Get number of users who have chosen an option ****************/
+/*****************************************************************************/
+
+unsigned Fig_GetNumUsrsWhoChoseAnOption (const char *SubQuery)
+ {
+ unsigned NumUsrs;
+
+ /***** Get the number of users who have chosen this privacy option from database *****/
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the number of users"
+ " who have chosen an option",
+ "SELECT COUNT(*)"
+ " FROM usr_data WHERE %s",
+ SubQuery);
+ break;
+ case Sco_SCOPE_CTY:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the number of users"
+ " who have chosen an option",
+ "SELECT COUNT(DISTINCT usr_data.UsrCod)"
+ " FROM institutions,centres,degrees,courses,crs_usr,usr_data"
+ " WHERE institutions.CtyCod=%ld"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_data.UsrCod"
+ " AND %s",
+ Gbl.CurrentCty.Cty.CtyCod,SubQuery);
+ break;
+ case Sco_SCOPE_INS:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the number of users"
+ " who have chosen an option",
+ "SELECT COUNT(DISTINCT usr_data.UsrCod)"
+ " FROM centres,degrees,courses,crs_usr,usr_data"
+ " WHERE centres.InsCod=%ld"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_data.UsrCod"
+ " AND %s",
+ Gbl.CurrentIns.Ins.InsCod,SubQuery);
+ break;
+ case Sco_SCOPE_CTR:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the number of users"
+ " who have chosen an option",
+ "SELECT COUNT(DISTINCT usr_data.UsrCod)"
+ " FROM degrees,courses,crs_usr,usr_data"
+ " WHERE degrees.CtrCod=%ld"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_data.UsrCod"
+ " AND %s",
+ Gbl.CurrentCtr.Ctr.CtrCod,SubQuery);
+ break;
+ case Sco_SCOPE_DEG:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the number of users"
+ " who have chosen an option",
+ "SELECT COUNT(DISTINCT usr_data.UsrCod)"
+ " FROM courses,crs_usr,usr_data"
+ " WHERE courses.DegCod=%ld"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_data.UsrCod"
+ " AND %s",
+ Gbl.CurrentDeg.Deg.DegCod,SubQuery);
+ break;
+ case Sco_SCOPE_CRS:
+ NumUsrs =
+ (unsigned) DB_QueryCOUNT ("can not get the number of users"
+ " who have chosen an option",
+ "SELECT COUNT(DISTINCT usr_data.UsrCod)"
+ " FROM crs_usr,usr_data"
+ " WHERE crs_usr.CrsCod=%ld"
+ " AND crs_usr.UsrCod=usr_data.UsrCod"
+ " AND %s",
+ Gbl.CurrentCrs.Crs.CrsCod,SubQuery);
+ break;
+ default:
+ Lay_WrongScopeExit ();
+ NumUsrs = 0; // Not reached. Initialized to avoid warning.
+ break;
+ }
+
+ return NumUsrs;
+ }
diff --git a/swad_figure.h b/swad_figure.h
new file mode 100644
index 00000000..7f487f0c
--- /dev/null
+++ b/swad_figure.h
@@ -0,0 +1,80 @@
+// swad_figure.h: figures (global stats)
+
+#ifndef _SWAD_FIG
+#define _SWAD_FIG
+/*
+ SWAD (Shared Workspace At a Distance in Spanish),
+ is a web platform developed at the University of Granada (Spain),
+ and used to support university teaching.
+
+ This file is part of SWAD core.
+ Copyright (C) 1999-2019 Antonio Cañas Vargas
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+/*****************************************************************************/
+/********************************* Headers ***********************************/
+/*****************************************************************************/
+
+// #include "swad_user.h"
+
+/*****************************************************************************/
+/************************** Public types and constants ***********************/
+/*****************************************************************************/
+
+#define Fig_NUM_FIGURES 27
+typedef enum
+ {
+ Fig_USERS, // Number of users
+ Fig_USERS_RANKING, // Users' ranking
+ Fig_HIERARCHY, // Number of countries, institutions, centres, degrees and courses
+ Fig_INSTITS, // Number of users in each institution
+ Fig_DEGREE_TYPES, // Number of degrees in each type of degree
+ Fig_FOLDERS_AND_FILES, // Number of folders and files
+ Fig_OER, // Number of OERs (Open Educational Resources)
+ Fig_ASSIGNMENTS, // Number of assignments
+ Fig_PROJECTS, // Number of projects
+ Fig_TESTS, // Number of test questions
+ Fig_GAMES, // Number of games
+ Fig_SURVEYS, // Number of surveys
+ Fig_SOCIAL_ACTIVITY, // Number of social notes
+ Fig_FOLLOW, // Number of following and followers
+ Fig_FORUMS, // Number of forums, threads and posts
+ Fig_NOTIFY_EVENTS, // Number of users per notify event
+ Fig_NOTICES, // Number of notices
+ Fig_MESSAGES, // Number of users' (sent and received) messages
+ 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
+ Fig_DATE_FORMAT, // Number of users per date format
+ Fig_ICON_SETS, // Number of users per icon set
+ Fig_MENUS, // Number of users per menu
+ Fig_THEMES, // Number of users per theme
+ Fig_SIDE_COLUMNS, // Number of users per layout of columns
+ Fig_PRIVACY, // Number of users per privacity
+ } Fig_FigureType_t;
+#define Fig_FIGURE_TYPE_DEF Fig_USERS
+
+#define Fig_NUM_STAT_CRS_FILE_ZONES 12
+
+/*****************************************************************************/
+/***************************** Public prototypes *****************************/
+/*****************************************************************************/
+
+void Fig_ReqShowFigures (void);
+void Fig_PutIconToShowFigure (void);
+void Fig_PutHiddenParamFigures (void);
+void Fig_ShowFigures (void);
+
+#endif
diff --git a/swad_file_browser.c b/swad_file_browser.c
index d19e0dd0..2ba8c503 100644
--- a/swad_file_browser.c
+++ b/swad_file_browser.c
@@ -3791,8 +3791,8 @@ static void Brw_PutIconsFileBrowser (void)
static void Brw_PutIconShowFigure (void)
{
- Gbl.Stat.FigureType = Sta_FOLDERS_AND_FILES;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_FOLDERS_AND_FILES;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_follow.c b/swad_follow.c
index fc126670..66f5a8fc 100644
--- a/swad_follow.c
+++ b/swad_follow.c
@@ -415,8 +415,8 @@ static void Fol_PutIconsWhoToFollow (void)
Fol_PutIconToUpdateWhoToFollow ();
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_FOLLOW;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_FOLLOW;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_forum.c b/swad_forum.c
index f59e30ab..8f7c1ba4 100644
--- a/swad_forum.c
+++ b/swad_forum.c
@@ -1741,8 +1741,8 @@ static void For_ShowForumList (void)
static void For_PutIconsForums (void)
{
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_FORUMS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_FORUMS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_game.c b/swad_game.c
index c918fb7f..d02fa427 100644
--- a/swad_game.c
+++ b/swad_game.c
@@ -331,8 +331,8 @@ static void Gam_PutIconsListGames (void)
Gam_PutIconToCreateNewGame ();
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_GAMES;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_GAMES;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_global.c b/swad_global.c
index 0fc2036b..d45bb7ba 100644
--- a/swad_global.c
+++ b/swad_global.c
@@ -410,7 +410,7 @@ void Gbl_InitializeGlobals (void)
Gbl.Stat.Role = Sta_ROLE_DEFAULT;
Gbl.Stat.NumAction = Sta_NUM_ACTION_DEFAULT;
Gbl.Stat.RowsPerPage = Sta_DEF_ROWS_PER_PAGE;
- Gbl.Stat.FigureType = Sta_FIGURE_TYPE_DEF;
+ Gbl.Figures.FigureType = Fig_FIGURE_TYPE_DEF;
Gbl.Scope.Current = Sco_SCOPE_CRS;
diff --git a/swad_global.h b/swad_global.h
index f0e60f9b..21b95383 100644
--- a/swad_global.h
+++ b/swad_global.h
@@ -48,6 +48,7 @@
#include "swad_degree_type.h"
#include "swad_enrolment.h"
#include "swad_exam.h"
+#include "swad_figure.h"
#include "swad_file.h"
#include "swad_file_browser.h"
#include "swad_forum.h"
@@ -752,10 +753,13 @@ struct Globals
long SvyQstCodToEdit; // Used as parameter in contextual links
unsigned CurrentPage;
} Svys;
+ struct
+ {
+ Fig_FigureType_t FigureType;
+ } Figures;
struct
{
Sta_ClicksGroupedBy_t ClicksGroupedBy;
- Sta_FigureType_t FigureType;
Sta_Role_t Role;
Sta_CountType_t CountType;
Act_Action_t NumAction;
diff --git a/swad_icon.c b/swad_icon.c
index b10dda18..909df45c 100644
--- a/swad_icon.c
+++ b/swad_icon.c
@@ -148,8 +148,8 @@ void Ico_PutIconsToSelectIconSet (void)
static void Ico_PutIconsIconSet (void)
{
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_ICON_SETS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_ICON_SETS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_institution.c b/swad_institution.c
index 6d3dddc4..3e46b57b 100644
--- a/swad_institution.c
+++ b/swad_institution.c
@@ -742,8 +742,8 @@ static void Ins_PutIconsListingInstitutions (void)
Ins_PutIconToEditInstitutions ();
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_INSTITS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_INSTITS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
@@ -970,8 +970,8 @@ static void Ins_PutIconsEditingInstitutions (void)
Ins_PutIconToViewInstitutions ();
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_INSTITS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_INSTITS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_language.c b/swad_language.c
index caedabce..7e92af43 100644
--- a/swad_language.c
+++ b/swad_language.c
@@ -104,8 +104,8 @@ void Lan_PutBoxToSelectLanguage (void)
static void Lan_PutIconsLanguage (void)
{
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_LANGUAGES;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_LANGUAGES;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_menu.c b/swad_menu.c
index 5718dab4..0b4907ef 100644
--- a/swad_menu.c
+++ b/swad_menu.c
@@ -441,8 +441,8 @@ void Mnu_PutIconsToSelectMenu (void)
static void Mnu_PutIconsMenu (void)
{
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_MENUS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_MENUS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_message.c b/swad_message.c
index 14d7d206..0724f8a8 100644
--- a/swad_message.c
+++ b/swad_message.c
@@ -2497,8 +2497,8 @@ static void Msg_PutIconsListMsgs (void)
Msg_PutHiddenParamsMsgsFilters);
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_MESSAGES;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_MESSAGES;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_network.c b/swad_network.c
index 71b9cc69..3aec710b 100644
--- a/swad_network.c
+++ b/swad_network.c
@@ -364,8 +364,8 @@ void Net_ShowFormMyWebsAndSocialNets (void)
static void Net_PutIconsWebsSocialNetworks (void)
{
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_SOCIAL_NETWORKS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_SOCIAL_NETWORKS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
@@ -424,7 +424,7 @@ static void Net_GetMyWebsAndSocialNetsFromForm (void)
void Net_ShowWebAndSocialNetworksStats (void)
{
extern const char *Hlp_ANALYTICS_Figures_webs_social_networks;
- extern const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES];
+ extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
extern const char *Txt_Web_social_network;
extern const char *Txt_No_of_users;
extern const char *Txt_PERCENT_of_users;
@@ -537,7 +537,7 @@ void Net_ShowWebAndSocialNetworksStats (void)
}
/***** Start box and table *****/
- Box_StartBoxTable (NULL,Txt_STAT_USE_STAT_TYPES[Sta_SOCIAL_NETWORKS],NULL,
+ Box_StartBoxTable (NULL,Txt_FIGURE_TYPES[Fig_SOCIAL_NETWORKS],NULL,
Hlp_ANALYTICS_Figures_webs_social_networks,Box_NOT_CLOSABLE,2);
/***** Write heading *****/
diff --git a/swad_notice.c b/swad_notice.c
index 95197123..41dd9742 100644
--- a/swad_notice.c
+++ b/swad_notice.c
@@ -509,8 +509,8 @@ static void Not_PutIconsListNotices (void)
Not_PutIconToAddNewNotice ();
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_NOTICES;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_NOTICES;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_notification.c b/swad_notification.c
index 0d5a8928..94730ae6 100644
--- a/swad_notification.c
+++ b/swad_notification.c
@@ -647,8 +647,8 @@ void Ntf_ShowMyNotifications (void)
static void Ntf_PutIconsNotif (void)
{
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_NOTIFY_EVENTS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_NOTIFY_EVENTS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_preference.c b/swad_preference.c
index fdb75392..cf7d502e 100644
--- a/swad_preference.c
+++ b/swad_preference.c
@@ -264,8 +264,8 @@ static void Pre_PutIconsToSelectSideCols (void)
static void Pre_PutIconsSideColumns (void)
{
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_SIDE_COLUMNS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_SIDE_COLUMNS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_privacy.c b/swad_privacy.c
index fe92d3e5..476bab64 100644
--- a/swad_privacy.c
+++ b/swad_privacy.c
@@ -135,8 +135,8 @@ void Pri_EditMyPrivacy (void)
static void Pri_PutIconsPrivacy (void)
{
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_PRIVACY;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_PRIVACY;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_profile.c b/swad_profile.c
index 014df5dc..29e191e8 100644
--- a/swad_profile.c
+++ b/swad_profile.c
@@ -759,7 +759,7 @@ static void Prf_ShowRanking (unsigned long Rank,unsigned long NumUsrs)
/***** Rank in form to go to ranking *****/
Frm_StartForm (ActSeeUseGbl);
Sco_PutParamScope ("ScopeSta",Sco_SCOPE_SYS);
- Par_PutHiddenParamUnsigned ("FigureType",(unsigned) Sta_USERS_RANKING);
+ Par_PutHiddenParamUnsigned ("FigureType",(unsigned) Fig_USERS_RANKING);
Frm_LinkFormSubmit (Gbl.Title,The_ClassForm[Gbl.Prefs.Theme],NULL);
fprintf (Gbl.F.Out,"#%lu",Rank);
Frm_EndForm ();
diff --git a/swad_project.c b/swad_project.c
index 25c328b3..58689e0e 100644
--- a/swad_project.c
+++ b/swad_project.c
@@ -793,8 +793,8 @@ static void Prj_PutIconsListProjects (void)
Prj_PutIconToShowAllData ();
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_PROJECTS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_PROJECTS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_social.c b/swad_social.c
index c5c3d32d..6563245a 100644
--- a/swad_social.c
+++ b/swad_social.c
@@ -1011,8 +1011,8 @@ static void Soc_ShowTimeline (char *Query,
static void Soc_PutIconsTimeline (void)
{
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_SOCIAL_ACTIVITY;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_SOCIAL_ACTIVITY;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_statistic.c b/swad_statistic.c
index 88cb65cd..5a9ba69f 100644
--- a/swad_statistic.c
+++ b/swad_statistic.c
@@ -25,41 +25,18 @@
/********************************* Headers ***********************************/
/*****************************************************************************/
-#define _GNU_SOURCE // For asprintf
-#include // For PATH_MAX
-#include // For NULL
#include // For log10, floor, ceil, modf, sqrt...
-#include // For asprintf
-#include // For system, getenv, etc.
#include // For string functions
-#include // For the macro WEXITSTATUS
-#include // For unlink
-#include "swad_action.h"
#include "swad_box.h"
-#include "swad_config.h"
-#include "swad_course.h"
#include "swad_database.h"
-#include "swad_file_browser.h"
-#include "swad_follow.h"
#include "swad_form.h"
-#include "swad_forum.h"
-#include "swad_game.h"
#include "swad_global.h"
#include "swad_ID.h"
-#include "swad_logo.h"
-#include "swad_network.h"
-#include "swad_notice.h"
-#include "swad_notification.h"
-#include "swad_parameter.h"
#include "swad_profile.h"
-#include "swad_project.h"
#include "swad_role.h"
-#include "swad_social.h"
#include "swad_statistic.h"
-#include "swad_tab.h"
#include "swad_table.h"
-#include "swad_web_service.h"
/*****************************************************************************/
/************** External global variables from others modules ****************/
@@ -111,25 +88,6 @@ const unsigned Sta_CellPadding[Sta_NUM_CLICKS_GROUPED_BY] =
/******************************* Private types *******************************/
/*****************************************************************************/
-struct Sta_SizeOfFileZones
- {
- int NumCrss; // -1 stands for not aplicable
- int NumGrps; // -1 stands for not aplicable
- int NumUsrs; // -1 stands for not aplicable
- unsigned MaxLevels;
- unsigned long NumFolders;
- unsigned long NumFiles;
- unsigned long long int Size; // Total size in bytes
- };
-
-struct Sta_StatsForum
- {
- unsigned NumForums;
- unsigned NumThreads;
- unsigned NumPosts;
- unsigned NumUsrsToBeNotifiedByEMail;
- };
-
typedef enum
{
Sta_SHOW_GLOBAL_ACCESSES,
@@ -151,6 +109,7 @@ static void Sta_WriteLogComments (long LogCod);
static void Sta_ShowNumHitsPerUsr (unsigned long NumRows,MYSQL_RES *mysql_res);
static void Sta_ShowNumHitsPerDay (unsigned long NumRows,MYSQL_RES *mysql_res);
static void Sta_ShowDistrAccessesPerDayAndHour (unsigned long NumRows,MYSQL_RES *mysql_res);
+static void Sta_PutHiddenParamScopeSta (void);
static Sta_ColorType_t Sta_GetStatColorType (void);
static void Sta_DrawBarColors (Sta_ColorType_t ColorType,float HitsMax);
static void Sta_DrawAccessesPerHourForADay (Sta_ColorType_t ColorType,float HitsNum[24],float HitsMax);
@@ -195,89 +154,6 @@ static void Sta_DrawBarNumHits (char Color,
float HitsNum,float HitsMax,float HitsTotal,
unsigned MaxBarWidth);
-static void Sta_PutParamsToShowFigure (void);
-static void Sta_PutHiddenParamFigureType (void);
-static void Sta_PutHiddenParamScopeSta (void);
-
-static void Sta_GetAndShowHierarchyStats (void);
-static void Sta_WriteHeadHierarchy (void);
-static void Sta_GetAndShowHierarchyWithInss (void);
-static void Sta_GetAndShowHierarchyWithCtrs (void);
-static void Sta_GetAndShowHierarchyWithDegs (void);
-static void Sta_GetAndShowHierarchyWithCrss (void);
-static void Sta_GetAndShowHierarchyWithUsrs (Rol_Role_t Role);
-static void Sta_GetAndShowHierarchyTotal (void);
-static void Sta_ShowHierarchyRow (const char *Text1,const char *Text2,
- const char *ClassTxt,
- int NumCtys, // < 0 ==> do not show number
- int NumInss, // < 0 ==> do not show number
- int NumCtrs, // < 0 ==> do not show number
- int NumDegs, // < 0 ==> do not show number
- int NumCrss); // < 0 ==> do not show number
-static void Sta_ShowHierarchyCell (const char *ClassTxt,int Num);
-
-static void Sta_GetAndShowInstitutionsStats (void);
-static void Sta_GetAndShowInssOrderedByNumCtrs (void);
-static void Sta_GetAndShowInssOrderedByNumDegs (void);
-static void Sta_GetAndShowInssOrderedByNumCrss (void);
-static void Sta_GetAndShowInssOrderedByNumUsrsInCrss (void);
-static void Sta_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem (void);
-static void Sta_ShowInss (MYSQL_RES **mysql_res,unsigned NumInss,
- const char *TxtFigure);
-static unsigned Sta_GetInsAndStat (struct Instit *Ins,MYSQL_RES *mysql_res);
-
-static void Sta_GetAndShowDegreeTypesStats (void);
-
-static void Sta_GetAndShowUsersStats (void);
-static void Sta_GetAndShowNumUsrsInCrss (Rol_Role_t Role);
-static void Sta_GetAndShowNumUsrsNotBelongingToAnyCrs (void);
-
-static void Sta_GetAndShowUsersRanking (void);
-
-static void Sta_GetAndShowFileBrowsersStats (void);
-static void Sta_WriteStatsExpTreesTableHead (void);
-static void Sta_WriteRowStatsFileBrowsers (Brw_FileBrowser_t FileZone,const char *NameOfFileZones);
-static void Sta_GetSizeOfFileZoneFromDB (Sco_Scope_t Scope,
- Brw_FileBrowser_t FileBrowser,
- struct Sta_SizeOfFileZones *SizeOfFileZones);
-
-static void Sta_GetAndShowOERsStats (void);
-static void Sta_GetNumberOfOERsFromDB (Sco_Scope_t Scope,Brw_License_t License,unsigned long NumFiles[2]);
-
-static void Sta_GetAndShowAssignmentsStats (void);
-static void Sta_GetAndShowProjectsStats (void);
-static void Sta_GetAndShowTestsStats (void);
-static void Sta_GetAndShowGamesStats (void);
-
-static void Sta_GetAndShowSocialActivityStats (void);
-static void Sta_GetAndShowFollowStats (void);
-
-static void Sta_GetAndShowForumStats (void);
-static void Sta_ShowStatOfAForumType (For_ForumType_t ForumType,
- long CtyCod,long InsCod,long CtrCod,long DegCod,long CrsCod,
- struct Sta_StatsForum *StatsForum);
-static void Sta_WriteForumTitleAndStats (For_ForumType_t ForumType,
- long CtyCod,long InsCod,long CtrCod,long DegCod,long CrsCod,
- const char *Icon,struct Sta_StatsForum *StatsForum,
- const char *ForumName1,const char *ForumName2);
-static void Sta_WriteForumTotalStats (struct Sta_StatsForum *StatsForum);
-
-static void Sta_GetAndShowNumUsrsPerNotifyEvent (void);
-static void Sta_GetAndShowNoticesStats (void);
-static void Sta_GetAndShowMsgsStats (void);
-
-static void Sta_GetAndShowSurveysStats (void);
-static void Sta_GetAndShowNumUsrsPerPrivacy (void);
-static void Sta_GetAndShowNumUsrsPerPrivacyForAnObject (const char *TxtObject,const char *FieldName);
-static void Sta_GetAndShowNumUsrsPerLanguage (void);
-static void Sta_GetAndShowNumUsrsPerFirstDayOfWeek (void);
-static void Sta_GetAndShowNumUsrsPerDateFormat (void);
-static void Sta_GetAndShowNumUsrsPerIconSet (void);
-static void Sta_GetAndShowNumUsrsPerMenu (void);
-static void Sta_GetAndShowNumUsrsPerTheme (void);
-static void Sta_GetAndShowNumUsrsPerSideColumns (void);
-unsigned Sta_GetNumUsrsWhoChoseAnOption (const char *SubQuery);
-
/*****************************************************************************/
/*************** Read CGI environment variable REMOTE_ADDR *******************/
/*****************************************************************************/
@@ -445,7 +321,7 @@ void Sta_AskShowCrsHits (void)
Sta_PutLinkToGlobalHits ();
/* Link to show last clicks in real time */
- Con_PutLinkToLastClicks ();
+ Sta_PutLinkToLastClicks ();
fprintf (Gbl.F.Out,"");
@@ -644,7 +520,7 @@ void Sta_AskShowGblHits (void)
Sta_PutLinkToCourseHits ();
/* Link to show last clicks in real time */
- Con_PutLinkToLastClicks ();
+ Sta_PutLinkToLastClicks ();
fprintf (Gbl.F.Out,"");
@@ -2459,6 +2335,15 @@ static void Sta_ShowDistrAccessesPerDayAndHour (unsigned long NumRows,MYSQL_RES
}
}
+/*****************************************************************************/
+/********* Put hidden parameter for the type of figure (statistic) ***********/
+/*****************************************************************************/
+
+static void Sta_PutHiddenParamScopeSta (void)
+ {
+ Sco_PutParamScope ("ScopeSta",Gbl.Scope.Current);
+ }
+
/*****************************************************************************/
/********************** Get type of color for statistics *********************/
/*****************************************************************************/
@@ -4058,5285 +3943,6 @@ static void Sta_DrawBarNumHits (char Color,
"");
}
-/*****************************************************************************/
-/************************** Show use of the platform *************************/
-/*****************************************************************************/
-
-void Sta_ReqShowFigures (void)
- {
- extern const char *Hlp_ANALYTICS_Figures;
- extern const char *The_ClassForm[The_NUM_THEMES];
- extern const char *Txt_Figures;
- extern const char *Txt_Scope;
- extern const char *Txt_Statistic;
- extern const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES];
- extern const char *Txt_Show_statistic;
- Sta_FigureType_t FigureType;
-
- /***** Form to show statistic *****/
- Frm_StartForm (ActSeeUseGbl);
-
- /***** Start box *****/
- Box_StartBox (NULL,Txt_Figures,NULL,
- Hlp_ANALYTICS_Figures,Box_NOT_CLOSABLE);
-
- /***** Compute stats for anywhere, degree or course? *****/
- fprintf (Gbl.F.Out," ");
-
- /***** Type of statistic *****/
- fprintf (Gbl.F.Out,"");
-
- /***** Send button and end box *****/
- Box_EndBoxWithButton (Btn_CONFIRM_BUTTON,Txt_Show_statistic);
-
- /***** End form *****/
- Frm_EndForm ();
- }
-
-/*****************************************************************************/
-/************************* Put icon to show a figure *************************/
-/*****************************************************************************/
-// Gbl.Stat.FigureType must be set to the desired figure before calling this function
-
-void Sta_PutIconToShowFigure (void)
- {
- extern const char *Txt_Show_statistic;
-
- Lay_PutContextualLinkOnlyIcon (ActSeeUseGbl,NULL,Sta_PutParamsToShowFigure,
- "chart-pie.svg",
- Txt_Show_statistic);
- }
-
-/*****************************************************************************/
-/************* Put hidden parameters for figures (statistics) ****************/
-/*****************************************************************************/
-// Gbl.Stat.FigureType must be set to the desired figure before calling this function
-
-static void Sta_PutParamsToShowFigure (void)
- {
- /***** Set default scope (used only if Gbl.Scope.Current is unknown) *****/
- Gbl.Scope.Default = Sco_SCOPE_CRS;
- Sco_AdjustScope ();
-
- Sta_PutHiddenParamFigures ();
- }
-
-/*****************************************************************************/
-/************* Put hidden parameters for figures (statistics) ****************/
-/*****************************************************************************/
-
-void Sta_PutHiddenParamFigures (void)
- {
- Sta_PutHiddenParamScopeSta ();
- Sta_PutHiddenParamFigureType ();
- }
-
-/*****************************************************************************/
-/********* Put hidden parameter for the type of figure (statistic) ***********/
-/*****************************************************************************/
-
-static void Sta_PutHiddenParamFigureType (void)
- {
- Par_PutHiddenParamUnsigned ("FigureType",(unsigned) Gbl.Stat.FigureType);
- }
-
-/*****************************************************************************/
-/********* Put hidden parameter for the type of figure (statistic) ***********/
-/*****************************************************************************/
-
-static void Sta_PutHiddenParamScopeSta (void)
- {
- Sco_PutParamScope ("ScopeSta",Gbl.Scope.Current);
- }
-
-/*****************************************************************************/
-/************************** Show use of the platform *************************/
-/*****************************************************************************/
-
-void Sta_ShowFigures (void)
- {
- static void (*Sta_Function[Sta_NUM_FIGURES])(void) = // Array of pointers to functions
- {
- Sta_GetAndShowUsersStats, // Sta_USERS
- Sta_GetAndShowUsersRanking, // Sta_USERS_RANKING
- Sta_GetAndShowHierarchyStats, // Sta_HIERARCHY
- Sta_GetAndShowInstitutionsStats, // Sta_INSTITS
- Sta_GetAndShowDegreeTypesStats, // Sta_DEGREE_TYPES
- Sta_GetAndShowFileBrowsersStats, // Sta_FOLDERS_AND_FILES
- Sta_GetAndShowOERsStats, // Sta_OER
- Sta_GetAndShowAssignmentsStats, // Sta_ASSIGNMENTS
- Sta_GetAndShowProjectsStats, // Sta_PROJECTS
- Sta_GetAndShowTestsStats, // Sta_TESTS
- Sta_GetAndShowGamesStats, // Sta_GAMES
- Sta_GetAndShowSurveysStats, // Sta_SURVEYS
- Sta_GetAndShowSocialActivityStats, // Sta_SOCIAL_ACTIVITY
- Sta_GetAndShowFollowStats, // Sta_FOLLOW
- Sta_GetAndShowForumStats, // Sta_FORUMS
- Sta_GetAndShowNumUsrsPerNotifyEvent, // Sta_NOTIFY_EVENTS
- Sta_GetAndShowNoticesStats, // Sta_NOTICES
- Sta_GetAndShowMsgsStats, // Sta_MESSAGES
- Net_ShowWebAndSocialNetworksStats, // Sta_SOCIAL_NETWORKS
- Sta_GetAndShowNumUsrsPerLanguage, // Sta_LANGUAGES
- Sta_GetAndShowNumUsrsPerFirstDayOfWeek, // Sta_FIRST_DAY_OF_WEEK
- Sta_GetAndShowNumUsrsPerDateFormat, // Sta_DATE_FORMAT
- Sta_GetAndShowNumUsrsPerIconSet, // Sta_ICON_SETS
- Sta_GetAndShowNumUsrsPerMenu, // Sta_MENUS
- Sta_GetAndShowNumUsrsPerTheme, // Sta_THEMES
- Sta_GetAndShowNumUsrsPerSideColumns, // Sta_SIDE_COLUMNS
- Sta_GetAndShowNumUsrsPerPrivacy, // Sta_PRIVACY
- };
-
- /***** Get the type of figure ******/
- Gbl.Stat.FigureType = (Sta_FigureType_t)
- Par_GetParToUnsignedLong ("FigureType",
- 0,
- Sta_NUM_FIGURES - 1,
- (unsigned long) Sta_FIGURE_TYPE_DEF);
-
- /***** Show again the form to see use of the platform *****/
- Sta_ReqShowFigures ();
-
- /***** Show the stat of use selected by user *****/
- Sta_Function[Gbl.Stat.FigureType] ();
- }
-
-/*****************************************************************************/
-/********************** Show stats about number of users *********************/
-/*****************************************************************************/
-
-static void Sta_GetAndShowUsersStats (void)
- {
- extern const char *Hlp_ANALYTICS_Figures_users;
- extern const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES];
- extern const char *Txt_Users;
- extern const char *Txt_No_of_users;
- extern const char *Txt_Average_number_of_courses_to_which_a_user_belongs;
- extern const char *Txt_Average_number_of_users_belonging_to_a_course;
-
- /***** Start box and table *****/
- Box_StartBoxTable (NULL,Txt_STAT_USE_STAT_TYPES[Sta_USERS],NULL,
- Hlp_ANALYTICS_Figures_users,Box_NOT_CLOSABLE,2);
-
- /***** Write heading *****/
- fprintf (Gbl.F.Out,"
"
- "
"
- "%s"
- "
"
- "
"
- "%s"
- "
"
- "
"
- "%s"
- "
"
- "
"
- "%s"
- "
"
- "
",
- Txt_Users,
- Txt_No_of_users,
- Txt_Average_number_of_courses_to_which_a_user_belongs,
- Txt_Average_number_of_users_belonging_to_a_course);
-
- Sta_GetAndShowNumUsrsInCrss (Rol_STD); // Students
- Sta_GetAndShowNumUsrsInCrss (Rol_NET); // Non-editing teachers
- Sta_GetAndShowNumUsrsInCrss (Rol_TCH); // Teachers
- Sta_GetAndShowNumUsrsInCrss (Rol_UNK); // Any user in courses
- fprintf (Gbl.F.Out,"
"
- "
"
- "
");
- Sta_GetAndShowNumUsrsNotBelongingToAnyCrs (); // Users not beloging to any course
-
- /***** End table and box *****/
- Box_EndBoxTable ();
- }
-
-/*****************************************************************************/
-/**************** Get and show number of users in courses ********************/
-/*****************************************************************************/
-// Rol_UNK means any role in courses
-
-static void Sta_GetAndShowNumUsrsInCrss (Rol_Role_t Role)
- {
- extern const char *Txt_Total;
- extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
- unsigned NumUsrs;
- float NumCrssPerUsr;
- float NumUsrsPerCrs;
- char *Class = (Role == Rol_UNK) ? "DAT_N_LINE_TOP RIGHT_BOTTOM" :
- "DAT RIGHT_BOTTOM";
- unsigned Roles = (Role == Rol_UNK) ? ((1 << Rol_STD) |
- (1 << Rol_NET) |
- (1 << Rol_TCH)) :
- (1 << Role);
-
- /***** Get the number of users belonging to any course *****/
- NumUsrs = Usr_GetTotalNumberOfUsersInCourses (Gbl.Scope.Current,
- Roles);
-
- /***** Get average number of courses per user *****/
- NumCrssPerUsr = Usr_GetNumCrssPerUsr (Role);
-
- /***** Query the number of users per course *****/
- NumUsrsPerCrs = Usr_GetNumUsrsPerCrs (Role);
-
- /***** Write the total number of users *****/
- fprintf (Gbl.F.Out,"
"
- "
"
- "%s"
- "
"
- "
"
- "%u"
- "
"
- "
"
- "%.2f"
- "
"
- "
"
- "%.2f"
- "
"
- "
",
- Class,(Role == Rol_UNK) ? Txt_Total :
- Txt_ROLES_PLURAL_Abc[Role][Usr_SEX_UNKNOWN],
- Class,NumUsrs,
- Class,NumCrssPerUsr,
- Class,NumUsrsPerCrs);
- }
-
-/*****************************************************************************/
-/**************** Get and show number of users in courses ********************/
-/*****************************************************************************/
-
-static void Sta_GetAndShowNumUsrsNotBelongingToAnyCrs (void)
- {
- extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
- char *Class = "DAT RIGHT_BOTTOM";
-
- /***** Write the total number of users not belonging to any course *****/
- fprintf (Gbl.F.Out,"
",ClassTxt);
- if (Num >= 0)
- fprintf (Gbl.F.Out,"%d",Num);
- else // < 0 ==> do not show number
- fprintf (Gbl.F.Out,"-");
- fprintf (Gbl.F.Out,"
");
- }
-
-/*****************************************************************************/
-/****************** Get and show stats about institutions ********************/
-/*****************************************************************************/
-
-static void Sta_GetAndShowInstitutionsStats (void)
- {
- extern const char *Hlp_ANALYTICS_Figures_institutions;
- extern const char *Txt_Institutions;
-
- /***** Start box *****/
- Box_StartBox (NULL,Txt_Institutions,NULL,
- Hlp_ANALYTICS_Figures_institutions,Box_NOT_CLOSABLE);
-
- /***** Form to select type of list used to display degree photos *****/
- Usr_GetAndUpdatePrefsAboutUsrList ();
- Usr_ShowFormsToSelectUsrListType (ActSeeUseGbl);
-
- /***** Institutions ordered by number of centres *****/
- Sta_GetAndShowInssOrderedByNumCtrs ();
-
- /***** Institutions ordered by number of degrees *****/
- Sta_GetAndShowInssOrderedByNumDegs ();
-
- /***** Institutions ordered by number of courses *****/
- Sta_GetAndShowInssOrderedByNumCrss ();
-
- /***** Institutions ordered by number of users in courses *****/
- Sta_GetAndShowInssOrderedByNumUsrsInCrss ();
-
- /***** Institutions ordered by number of users who claim to belong to them *****/
- Sta_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem ();
-
- /***** End box *****/
- Box_EndBox ();
- }
-
-/*****************************************************************************/
-/**** Get and show stats about institutions ordered by number of centres *****/
-/*****************************************************************************/
-
-static void Sta_GetAndShowInssOrderedByNumCtrs (void)
- {
- extern const char *Txt_Institutions_by_number_of_centres;
- extern const char *Txt_Centres;
- MYSQL_RES *mysql_res;
- unsigned NumInss = 0;
-
- /***** Start box and table *****/
- Box_StartBoxTable ("100%",Txt_Institutions_by_number_of_centres,NULL,
- NULL,Box_NOT_CLOSABLE,2);
-
- /***** Get institutions ordered by number of centres *****/
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT InsCod,COUNT(*) AS N"
- " FROM centres"
- " GROUP BY InsCod"
- " ORDER BY N DESC");
- break;
- case Sco_SCOPE_CTY:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT centres.InsCod,COUNT(*) AS N"
- " FROM institutions,centres"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=centres.InsCod"
- " GROUP BY centres.InsCod"
- " ORDER BY N DESC",
- Gbl.CurrentCty.Cty.CtyCod);
- break;
- case Sco_SCOPE_INS:
- case Sco_SCOPE_CTR:
- case Sco_SCOPE_DEG:
- case Sco_SCOPE_CRS:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT InsCod,COUNT(*) AS N"
- " FROM centres"
- " WHERE InsCod=%ld"
- " GROUP BY InsCod"
- " ORDER BY N DESC",
- Gbl.CurrentIns.Ins.InsCod);
- break;
- default:
- Lay_WrongScopeExit ();
- break;
- }
-
- /***** Show institutions *****/
- Sta_ShowInss (&mysql_res,NumInss,Txt_Centres);
-
- /***** Free structure that stores the query result *****/
- DB_FreeMySQLResult (&mysql_res);
-
- /***** End table and box *****/
- Box_EndBoxTable ();
- }
-
-/*****************************************************************************/
-/**** Get and show stats about institutions ordered by number of degrees *****/
-/*****************************************************************************/
-
-static void Sta_GetAndShowInssOrderedByNumDegs (void)
- {
- extern const char *Txt_Institutions_by_number_of_degrees;
- extern const char *Txt_Degrees;
- MYSQL_RES *mysql_res;
- unsigned NumInss = 0;
-
- /***** Start box and table *****/
- Box_StartBoxTable ("100%",Txt_Institutions_by_number_of_degrees,NULL,
- NULL,Box_NOT_CLOSABLE,2);
-
- /***** Get institutions ordered by number of degrees *****/
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT centres.InsCod,COUNT(*) AS N"
- " FROM centres,degrees"
- " WHERE centres.CtrCod=degrees.CtrCod"
- " GROUP BY InsCod"
- " ORDER BY N DESC");
- break;
- case Sco_SCOPE_CTY:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT centres.InsCod,COUNT(*) AS N"
- " FROM institutions,centres,degrees"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " GROUP BY centres.InsCod"
- " ORDER BY N DESC",
- Gbl.CurrentCty.Cty.CtyCod);
- break;
- case Sco_SCOPE_INS:
- case Sco_SCOPE_CTR:
- case Sco_SCOPE_DEG:
- case Sco_SCOPE_CRS:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT centres.InsCod,COUNT(*) AS N"
- " FROM centres,degrees"
- " WHERE centres.InsCod=%ld"
- " AND centres.CtrCod=degrees.CtrCod"
- " GROUP BY centres.InsCod"
- " ORDER BY N DESC",
- Gbl.CurrentIns.Ins.InsCod);
- break;
- default:
- Lay_WrongScopeExit ();
- break;
- }
-
- /***** Show institutions *****/
- Sta_ShowInss (&mysql_res,NumInss,Txt_Degrees);
-
- /***** Free structure that stores the query result *****/
- DB_FreeMySQLResult (&mysql_res);
-
- /***** End table and box *****/
- Box_EndBoxTable ();
- }
-
-/*****************************************************************************/
-/**** Get and show stats about institutions ordered by number of courses *****/
-/*****************************************************************************/
-
-static void Sta_GetAndShowInssOrderedByNumCrss (void)
- {
- extern const char *Txt_Institutions_by_number_of_courses;
- extern const char *Txt_Courses;
- MYSQL_RES *mysql_res;
- unsigned NumInss = 0;
-
- /***** Start box and table *****/
- Box_StartBoxTable ("100%",Txt_Institutions_by_number_of_courses,NULL,
- NULL,Box_NOT_CLOSABLE,2);
-
- /***** Get institutions ordered by number of courses *****/
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT centres.InsCod,COUNT(*) AS N"
- " FROM centres,degrees,courses"
- " WHERE centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " GROUP BY InsCod"
- " ORDER BY N DESC");
- break;
- case Sco_SCOPE_CTY:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT centres.InsCod,COUNT(*) AS N"
- " FROM institutions,centres,degrees,courses"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " GROUP BY centres.InsCod"
- " ORDER BY N DESC",
- Gbl.CurrentCty.Cty.CtyCod);
- break;
- case Sco_SCOPE_INS:
- case Sco_SCOPE_CTR:
- case Sco_SCOPE_DEG:
- case Sco_SCOPE_CRS:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT centres.InsCod,COUNT(*) AS N"
- " FROM centres,degrees,courses"
- " WHERE centres.InsCod=%ld"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " GROUP BY centres.InsCod"
- " ORDER BY N DESC",
- Gbl.CurrentIns.Ins.InsCod);
- break;
- default:
- Lay_WrongScopeExit ();
- break;
- }
-
- /***** Show institutions *****/
- Sta_ShowInss (&mysql_res,NumInss,Txt_Courses);
-
- /***** Free structure that stores the query result *****/
- DB_FreeMySQLResult (&mysql_res);
-
- /***** End table and box *****/
- Box_EndBoxTable ();
- }
-
-/*****************************************************************************/
-/***** Get and show stats about institutions ordered by users in courses *****/
-/*****************************************************************************/
-
-static void Sta_GetAndShowInssOrderedByNumUsrsInCrss (void)
- {
- extern const char *Txt_Institutions_by_number_of_users_in_courses;
- extern const char *Txt_Users;
- MYSQL_RES *mysql_res;
- unsigned NumInss = 0;
-
- /***** Start box and table *****/
- Box_StartBoxTable ("100%",Txt_Institutions_by_number_of_users_in_courses,NULL,
- NULL,Box_NOT_CLOSABLE,2);
-
- /***** Get institutions ordered by number of users in courses *****/
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT centres.InsCod,COUNT(DISTINCT crs_usr.UsrCod) AS N"
- " FROM centres,degrees,courses,crs_usr"
- " WHERE centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " GROUP BY InsCod"
- " ORDER BY N DESC");
- break;
- case Sco_SCOPE_CTY:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT centres.InsCod,COUNT(DISTINCT crs_usr.UsrCod) AS N"
- " FROM institutions,centres,degrees,courses,crs_usr"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " GROUP BY centres.InsCod"
- " ORDER BY N DESC",
- Gbl.CurrentCty.Cty.CtyCod);
- break;
- case Sco_SCOPE_INS:
- case Sco_SCOPE_CTR:
- case Sco_SCOPE_DEG:
- case Sco_SCOPE_CRS:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT centres.InsCod,COUNT(DISTINCT crs_usr.UsrCod) AS N"
- " FROM centres,degrees,courses,crs_usr"
- " WHERE centres.InsCod=%ld"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " GROUP BY centres.InsCod"
- " ORDER BY N DESC",
- Gbl.CurrentIns.Ins.InsCod);
- break;
- default:
- Lay_WrongScopeExit ();
- break;
- }
-
- /***** Show institutions *****/
- Sta_ShowInss (&mysql_res,NumInss,Txt_Users);
-
- /***** Free structure that stores the query result *****/
- DB_FreeMySQLResult (&mysql_res);
-
- /***** End table and box *****/
- Box_EndBoxTable ();
- }
-
-/*****************************************************************************/
-/************* Get and show stats about institutions ordered by **************/
-/************* number of users who claim to belong to them **************/
-/*****************************************************************************/
-
-static void Sta_GetAndShowInssOrderedByNumUsrsWhoClaimToBelongToThem (void)
- {
- extern const char *Txt_Institutions_by_number_of_users_who_claim_to_belong_to_them;
- extern const char *Txt_Users;
- MYSQL_RES *mysql_res;
- unsigned NumInss;
-
- /***** Start box and table *****/
- Box_StartBoxTable ("100%",Txt_Institutions_by_number_of_users_who_claim_to_belong_to_them,
- NULL,
- NULL,Box_NOT_CLOSABLE,2);
-
- /***** Get institutions ordered by number of users who claim to belong to them *****/
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT InsCod,COUNT(*) AS N"
- " FROM usr_data"
- " WHERE InsCod>0"
- " GROUP BY InsCod"
- " ORDER BY N DESC");
- break;
- case Sco_SCOPE_CTY:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT usr_data.InsCod,COUNT(*) AS N"
- " FROM institutions,usr_data"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=usr_data.InsCod"
- " GROUP BY usr_data.InsCod"
- " ORDER BY N DESC",
- Gbl.CurrentCty.Cty.CtyCod);
- break;
- case Sco_SCOPE_INS:
- case Sco_SCOPE_CTR:
- case Sco_SCOPE_DEG:
- case Sco_SCOPE_CRS:
- NumInss =
- (unsigned) DB_QuerySELECT (&mysql_res,"can not get institutions",
- "SELECT InsCod,COUNT(*) AS N"
- " FROM usr_data"
- " WHERE InsCod=%ld"
- " GROUP BY InsCod"
- " ORDER BY N DESC",
- Gbl.CurrentIns.Ins.InsCod);
- break;
- default:
- Lay_WrongScopeExit ();
- NumInss = 0; // Not reached. Initialized to avoid warning.
- break;
- }
-
- /***** Show institutions *****/
- Sta_ShowInss (&mysql_res,NumInss,Txt_Users);
-
- /***** Free structure that stores the query result *****/
- DB_FreeMySQLResult (&mysql_res);
-
- /***** End table and box *****/
- Box_EndBoxTable ();
- }
-
-/*****************************************************************************/
-/****************** Get and show stats about institutions ********************/
-/*****************************************************************************/
-
-static void Sta_ShowInss (MYSQL_RES **mysql_res,unsigned NumInss,
- const char *TxtFigure)
- {
- extern const char *The_ClassForm[The_NUM_THEMES];
- extern const char *Txt_Institution;
- unsigned NumIns;
- unsigned NumOrder;
- unsigned NumberLastRow;
- unsigned NumberThisRow;
- struct Instit Ins;
- bool TRIsOpen = false;
-
- /***** Query database *****/
- if (NumInss)
- {
- /* Draw the classphoto/list */
- switch (Gbl.Usrs.Me.ListType)
- {
- case Usr_LIST_AS_CLASS_PHOTO:
- /***** Draw institutions as a class photo *****/
- for (NumIns = 0;
- NumIns < NumInss;)
- {
- if ((NumIns % Gbl.Usrs.ClassPhoto.Cols) == 0)
- {
- fprintf (Gbl.F.Out,"
");
- TRIsOpen = true;
- }
-
- /***** Get institution data and statistic *****/
- NumberThisRow = Sta_GetInsAndStat (&Ins,*mysql_res);
-
- /***** Write link to institution *****/
- fprintf (Gbl.F.Out,"
",
- Txt_Type,
- Txt_No_of_social_posts,
- Txt_No_of_users,
- Txt_PERCENT_of_users,
- Txt_No_of_posts_BR_per_user);
-
- /***** Get total number of users *****/
- NumUsrsTotal = (Gbl.Scope.Current == Sco_SCOPE_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () :
- Usr_GetTotalNumberOfUsersInCourses (Gbl.Scope.Current,
- 1 << Rol_STD |
- 1 << Rol_NET |
- 1 << Rol_TCH);
-
- /***** Get total number of following/followers from database *****/
- for (NoteType = (Soc_NoteType_t) 0;
- NoteType < Soc_NUM_NOTE_TYPES;
- NoteType++)
- {
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(*),"
- "COUNT(DISTINCT UsrCod)"
- " FROM social_notes WHERE NoteType=%u",
- NoteType);
- break;
- case Sco_SCOPE_CTY:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(DISTINCT social_notes.NotCod),"
- "COUNT(DISTINCT social_notes.UsrCod)"
- " FROM institutions,centres,degrees,courses,crs_usr,social_notes"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=social_notes.UsrCod"
- " AND social_notes.NoteType=%u",
- Gbl.CurrentCty.Cty.CtyCod,
- (unsigned) NoteType);
- break;
- case Sco_SCOPE_INS:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(DISTINCT social_notes.NotCod),"
- "COUNT(DISTINCT social_notes.UsrCod)"
- " FROM centres,degrees,courses,crs_usr,social_notes"
- " WHERE centres.InsCod=%ld"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=social_notes.UsrCod"
- " AND social_notes.NoteType=%u",
- Gbl.CurrentIns.Ins.InsCod,
- (unsigned) NoteType);
- break;
- case Sco_SCOPE_CTR:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(DISTINCT social_notes.NotCod),"
- "COUNT(DISTINCT social_notes.UsrCod)"
- " FROM degrees,courses,crs_usr,social_notes"
- " WHERE degrees.CtrCod=%ld"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=social_notes.UsrCod"
- " AND social_notes.NoteType=%u",
- Gbl.CurrentCtr.Ctr.CtrCod,
- (unsigned) NoteType);
- break;
- case Sco_SCOPE_DEG:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(DISTINCT social_notes.NotCod),"
- "COUNT(DISTINCT social_notes.UsrCod)"
- " FROM courses,crs_usr,social_notes"
- " WHERE courses.DegCod=%ld"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=social_notes.UsrCod"
- " AND social_notes.NoteType=%u",
- Gbl.CurrentDeg.Deg.DegCod,
- (unsigned) NoteType);
- break;
- case Sco_SCOPE_CRS:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(DISTINCT social_notes.NotCod),"
- "COUNT(DISTINCT social_notes.UsrCod)"
- " FROM crs_usr,social_notes"
- " WHERE crs_usr.CrsCod=%ld"
- " AND crs_usr.UsrCod=social_notes.UsrCod"
- " AND social_notes.NoteType=%u",
- Gbl.CurrentCrs.Crs.CrsCod,
- (unsigned) NoteType);
- break;
- default:
- Lay_WrongScopeExit ();
- NumRows = 0; // Initialized to avoid warning
- break;
- }
- NumSocialNotes = 0;
- NumUsrs = 0;
-
- if (NumRows)
- {
- /***** Get number of social notes and number of users *****/
- row = mysql_fetch_row (mysql_res);
-
- /* Get number of social notes */
- if (row[0])
- if (sscanf (row[0],"%lu",&NumSocialNotes) != 1)
- NumSocialNotes = 0;
-
- /* Get number of users */
- if (row[1])
- if (sscanf (row[1],"%u",&NumUsrs) != 1)
- NumUsrs = 0;
- }
-
- /***** Free structure that stores the query result *****/
- DB_FreeMySQLResult (&mysql_res);
-
- /***** Write number of social notes and number of users *****/
- fprintf (Gbl.F.Out,"
"
- "
"
- "%s"
- "
"
- "
"
- "%lu"
- "
"
- "
"
- "%u"
- "
"
- "
"
- "%5.2f%%"
- "
"
- "
"
- "%.2f"
- "
"
- "
",
- Txt_SOCIAL_NOTE[NoteType],
- NumSocialNotes,
- NumUsrs,
- NumUsrsTotal ? (float) NumUsrs * 100.0 / (float) NumUsrsTotal :
- 0.0,
- NumUsrs ? (float) NumSocialNotes / (float) NumUsrs :
- 0.0);
- }
-
- /***** Get and write totals *****/
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(*),"
- "COUNT(DISTINCT UsrCod)"
- " FROM social_notes");
- break;
- case Sco_SCOPE_CTY:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(DISTINCT social_notes.NotCod),"
- "COUNT(DISTINCT social_notes.UsrCod)"
- " FROM institutions,centres,degrees,courses,crs_usr,social_notes"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=social_notes.UsrCod",
- Gbl.CurrentCty.Cty.CtyCod);
- break;
- case Sco_SCOPE_INS:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(DISTINCT social_notes.NotCod),"
- "COUNT(DISTINCT social_notes.UsrCod)"
- " FROM centres,degrees,courses,crs_usr,social_notes"
- " WHERE centres.InsCod=%ld"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=social_notes.UsrCod",
- Gbl.CurrentIns.Ins.InsCod);
- break;
- case Sco_SCOPE_CTR:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(DISTINCT social_notes.NotCod),"
- "COUNT(DISTINCT social_notes.UsrCod)"
- " FROM degrees,courses,crs_usr,social_notes"
- " WHERE degrees.CtrCod=%ld"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=social_notes.UsrCod",
- Gbl.CurrentCtr.Ctr.CtrCod);
- break;
- case Sco_SCOPE_DEG:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(DISTINCT social_notes.NotCod),"
- "COUNT(DISTINCT social_notes.UsrCod)"
- " FROM courses,crs_usr,social_notes"
- " WHERE courses.DegCod=%ld"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=social_notes.UsrCod",
- Gbl.CurrentDeg.Deg.DegCod);
- break;
- case Sco_SCOPE_CRS:
- NumRows = DB_QuerySELECT (&mysql_res,"can not get number of social notes",
- "SELECT COUNT(DISTINCT social_notes.NotCod),"
- "COUNT(DISTINCT social_notes.UsrCod)"
- " FROM crs_usr,social_notes"
- " WHERE crs_usr.CrsCod=%ld"
- " AND crs_usr.UsrCod=social_notes.UsrCod",
- Gbl.CurrentCrs.Crs.CrsCod);
- break;
- default:
- Lay_WrongScopeExit ();
- NumRows = 0; // Initialized to avoid warning
- break;
- }
- NumSocialNotes = 0;
- NumUsrs = 0;
-
- if (NumRows)
- {
- /* Get number of social notes and number of users */
- row = mysql_fetch_row (mysql_res);
-
- /* Get number of social notes */
- if (row[0])
- if (sscanf (row[0],"%lu",&NumSocialNotes) != 1)
- NumSocialNotes = 0;
-
- /* Get number of users */
- if (row[1])
- if (sscanf (row[1],"%u",&NumUsrs) != 1)
- NumUsrs = 0;
- }
-
- /* Free structure that stores the query result */
- DB_FreeMySQLResult (&mysql_res);
-
- /* Write totals */
- fprintf (Gbl.F.Out,"
",
- Txt_Users,
- Txt_No_of_users,
- Txt_PERCENT_of_users);
-
- /***** Get total number of users *****/
- NumUsrsTotal = (Gbl.Scope.Current == Sco_SCOPE_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () :
- Usr_GetTotalNumberOfUsersInCourses (Gbl.Scope.Current,
- 1 << Rol_STD |
- 1 << Rol_NET |
- 1 << Rol_TCH);
-
- /***** Get total number of following/followers from database *****/
- for (Fol = 0;
- Fol < 2;
- Fol++)
- {
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the total number"
- " of following/followers",
- "SELECT COUNT(DISTINCT %s) FROM usr_follow",
- FieldDB[Fol]);
- break;
- case Sco_SCOPE_CTY:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the total number"
- " of following/followers",
- "SELECT COUNT(DISTINCT usr_follow.%s)"
- " FROM institutions,centres,degrees,courses,crs_usr,usr_follow"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_follow.%s",
- FieldDB[Fol],
- Gbl.CurrentCty.Cty.CtyCod,
- FieldDB[Fol]);
- break;
- case Sco_SCOPE_INS:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the total number"
- " of following/followers",
- "SELECT COUNT(DISTINCT usr_follow.%s)"
- " FROM centres,degrees,courses,crs_usr,usr_follow"
- " WHERE centres.InsCod=%ld"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_follow.%s",
- FieldDB[Fol],
- Gbl.CurrentIns.Ins.InsCod,
- FieldDB[Fol]);
- break;
- case Sco_SCOPE_CTR:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the total number"
- " of following/followers",
- "SELECT COUNT(DISTINCT usr_follow.%s)"
- " FROM degrees,courses,crs_usr,usr_follow"
- " WHERE degrees.CtrCod=%ld"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_follow.%s",
- FieldDB[Fol],
- Gbl.CurrentCtr.Ctr.CtrCod,
- FieldDB[Fol]);
- break;
- case Sco_SCOPE_DEG:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the total number"
- " of following/followers",
- "SELECT COUNT(DISTINCT usr_follow.%s)"
- " FROM courses,crs_usr,usr_follow"
- " WHERE courses.DegCod=%ld"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_follow.%s",
- FieldDB[Fol],
- Gbl.CurrentDeg.Deg.DegCod,
- FieldDB[Fol]);
- break;
- case Sco_SCOPE_CRS:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the total number"
- " of following/followers",
- "SELECT COUNT(DISTINCT usr_follow.%s)"
- " FROM crs_usr,usr_follow"
- " WHERE crs_usr.CrsCod=%ld"
- " AND crs_usr.UsrCod=usr_follow.%s",
- FieldDB[Fol],
- Gbl.CurrentCrs.Crs.CrsCod,
- FieldDB[Fol]);
- break;
- default:
- Lay_WrongScopeExit ();
- NumUsrs = 0; // Not reached. Initialized to av oid warning
- break;
- }
-
- /***** Write number of followed / followers *****/
- fprintf (Gbl.F.Out,"
"
- "
"
- "%s"
- "
"
- "
"
- "%u"
- "
"
- "
"
- "%5.2f%%"
- "
"
- "
",
- Fol == 0 ? Txt_Followed :
- Txt_Followers,
- NumUsrs,
- NumUsrsTotal ? (float) NumUsrs * 100.0 /
- (float) NumUsrsTotal :
- 0.0);
- }
-
- /***** Write number of followed/followers per follower/followed *****/
- for (Fol = 0;
- Fol < 2;
- Fol++)
- {
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- DB_QuerySELECT (&mysql_res,"can not get number of questions"
- " per survey",
- "SELECT AVG(N) FROM "
- "(SELECT COUNT(%s) AS N"
- " FROM usr_follow"
- " GROUP BY %s) AS F",
- FieldDB[Fol],
- FieldDB[1 - Fol]);
- break;
- case Sco_SCOPE_CTY:
- DB_QuerySELECT (&mysql_res,"can not get number of questions"
- " per survey",
- "SELECT AVG(N) FROM "
- "(SELECT COUNT(DISTINCT usr_follow.%s) AS N"
- " FROM institutions,centres,degrees,courses,crs_usr,usr_follow"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_follow.%s"
- " GROUP BY %s) AS F",
- FieldDB[Fol],
- Gbl.CurrentCty.Cty.CtyCod,
- FieldDB[Fol],
- FieldDB[1 - Fol]);
- break;
- case Sco_SCOPE_INS:
- DB_QuerySELECT (&mysql_res,"can not get number of questions"
- " per survey",
- "SELECT AVG(N) FROM "
- "(SELECT COUNT(DISTINCT usr_follow.%s) AS N"
- " FROM centres,degrees,courses,crs_usr,usr_follow"
- " WHERE centres.InsCod=%ld"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_follow.%s"
- " GROUP BY %s) AS F",
- FieldDB[Fol],
- Gbl.CurrentIns.Ins.InsCod,
- FieldDB[Fol],
- FieldDB[1 - Fol]);
- break;
- case Sco_SCOPE_CTR:
- DB_QuerySELECT (&mysql_res,"can not get number of questions"
- " per survey",
- "SELECT AVG(N) FROM "
- "(SELECT COUNT(DISTINCT usr_follow.%s) AS N"
- " FROM degrees,courses,crs_usr,usr_follow"
- " WHERE degrees.CtrCod=%ld"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_follow.%s"
- " GROUP BY %s) AS F",
- FieldDB[Fol],
- Gbl.CurrentCtr.Ctr.CtrCod,
- FieldDB[Fol],
- FieldDB[1 - Fol]);
- break;
- case Sco_SCOPE_DEG:
- DB_QuerySELECT (&mysql_res,"can not get number of questions"
- " per survey",
- "SELECT AVG(N) FROM "
- "(SELECT COUNT(DISTINCT usr_follow.%s) AS N"
- " FROM courses,crs_usr,usr_follow"
- " WHERE courses.DegCod=%ld"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_follow.%s"
- " GROUP BY %s) AS F",
- FieldDB[Fol],
- Gbl.CurrentDeg.Deg.DegCod,
- FieldDB[Fol],
- FieldDB[1 - Fol]);
- break;
- case Sco_SCOPE_CRS:
- DB_QuerySELECT (&mysql_res,"can not get number of questions"
- " per survey",
- "SELECT AVG(N) FROM "
- "(SELECT COUNT(DISTINCT usr_follow.%s) AS N"
- " FROM crs_usr,usr_follow"
- " WHERE crs_usr.CrsCod=%ld"
- " AND crs_usr.UsrCod=usr_follow.%s"
- " GROUP BY %s) AS F",
- FieldDB[Fol],
- Gbl.CurrentCrs.Crs.CrsCod,
- FieldDB[Fol],
- FieldDB[1 - Fol]);
- break;
- default:
- Lay_WrongScopeExit ();
- break;
- }
-
- /***** Get average *****/
- row = mysql_fetch_row (mysql_res);
- Average = Str_GetFloatNumFromStr (row[0]);
-
- /***** Free structure that stores the query result *****/
- DB_FreeMySQLResult (&mysql_res);
-
- /***** Write number of followed per follower *****/
- fprintf (Gbl.F.Out,"
",
- Txt_Event,
- Txt_No_of_users,
- Txt_PERCENT_of_users,
- Txt_Number_of_BR_events,
- Txt_Number_of_BR_emails);
-
- /***** Get total number of users *****/
- NumUsrsTotal = (Gbl.Scope.Current == Sco_SCOPE_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () :
- Usr_GetTotalNumberOfUsersInCourses (Gbl.Scope.Current,
- 1 << Rol_STD |
- 1 << Rol_NET |
- 1 << Rol_TCH);
-
- /***** Get total number of users who want to be
- notified by email on some event, from database *****/
- NumUsrsTotalWhoWantToBeNotifiedByEMailAboutSomeEvent =
- Sta_GetNumUsrsWhoChoseAnOption ("usr_data.EmailNtfEvents<>0");
-
- /***** For each notify event... *****/
- for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
- NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
- NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
- {
- /* Get the number of users who want to be notified by email on this event, from database */
- if (asprintf (&SubQuery,"((usr_data.EmailNtfEvents & %u)<>0)",
- (1 << NotifyEvent)) < 0)
- Lay_NotEnoughMemoryExit ();
- NumUsrs[NotifyEvent] = Sta_GetNumUsrsWhoChoseAnOption (SubQuery);
- free ((void *) SubQuery);
-
- /* Get number of notifications by email from database */
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- DB_QuerySELECT (&mysql_res,"can not get the number"
- " of notifications by email",
- "SELECT SUM(NumEvents),SUM(NumMails)"
- " FROM sta_notif"
- " WHERE NotifyEvent=%u",
- (unsigned) NotifyEvent);
- break;
- case Sco_SCOPE_CTY:
- DB_QuerySELECT (&mysql_res,"can not get the number"
- " of notifications by email",
- "SELECT SUM(sta_notif.NumEvents),SUM(sta_notif.NumMails)"
- " FROM institutions,centres,degrees,sta_notif"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=sta_notif.DegCod"
- " AND sta_notif.NotifyEvent=%u",
- Gbl.CurrentCty.Cty.CtyCod,(unsigned) NotifyEvent);
- break;
- case Sco_SCOPE_INS:
- DB_QuerySELECT (&mysql_res,"can not get the number"
- " of notifications by email",
- "SELECT SUM(sta_notif.NumEvents),SUM(sta_notif.NumMails)"
- " FROM centres,degrees,sta_notif"
- " WHERE centres.InsCod=%ld"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=sta_notif.DegCod"
- " AND sta_notif.NotifyEvent=%u",
- Gbl.CurrentIns.Ins.InsCod,(unsigned) NotifyEvent);
- break;
- case Sco_SCOPE_CTR:
- DB_QuerySELECT (&mysql_res,"can not get the number"
- " of notifications by email",
- "SELECT SUM(sta_notif.NumEvents),SUM(sta_notif.NumMails)"
- " FROM degrees,sta_notif"
- " WHERE degrees.CtrCod=%ld"
- " AND degrees.DegCod=sta_notif.DegCod"
- " AND sta_notif.NotifyEvent=%u",
- Gbl.CurrentCtr.Ctr.CtrCod,(unsigned) NotifyEvent);
- break;
- case Sco_SCOPE_DEG:
- DB_QuerySELECT (&mysql_res,"can not get the number"
- " of notifications by email",
- "SELECT SUM(NumEvents),SUM(NumMails)"
- " FROM sta_notif"
- " WHERE DegCod=%ld"
- " AND NotifyEvent=%u",
- Gbl.CurrentDeg.Deg.DegCod,(unsigned) NotifyEvent);
- break;
- case Sco_SCOPE_CRS:
- DB_QuerySELECT (&mysql_res,"can not get the number"
- " of notifications by email",
- "SELECT SUM(NumEvents),SUM(NumMails)"
- " FROM sta_notif"
- " WHERE CrsCod=%ld"
- " AND NotifyEvent=%u",
- Gbl.CurrentCrs.Crs.CrsCod,(unsigned) NotifyEvent);
- break;
- default:
- Lay_WrongScopeExit ();
- break;
- }
-
- row = mysql_fetch_row (mysql_res);
-
- /* Get number of events notified */
- if (row[0])
- {
- if (sscanf (row[0],"%u",&NumEvents[NotifyEvent]) != 1)
- Lay_ShowErrorAndExit ("Error when getting the number of notifications by email.");
- }
- else
- NumEvents[NotifyEvent] = 0;
-
- /* Get number of mails sent */
- if (row[1])
- {
- if (sscanf (row[1],"%u",&NumMails[NotifyEvent]) != 1)
- Lay_ShowErrorAndExit ("Error when getting the number of emails to notify events3.");
- }
- else
- NumMails[NotifyEvent] = 0;
-
- /* Free structure that stores the query result */
- DB_FreeMySQLResult (&mysql_res);
-
- /* Update total number of events and mails */
- NumEventsTotal += NumEvents[NotifyEvent];
- NumMailsTotal += NumMails [NotifyEvent];
- }
-
- /***** Write number of users who want to be notified by email on each event *****/
- for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
- NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
- NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
- fprintf (Gbl.F.Out,"
"
- "
"
- "%s"
- "
"
- "
"
- "%u"
- "
"
- "
"
- "%5.2f%%"
- "
"
- "
"
- "%u"
- "
"
- "
"
- "%u"
- "
"
- "
",
- Txt_NOTIFY_EVENTS_PLURAL[NotifyEvent],
- NumUsrs[NotifyEvent],
- NumUsrsTotal ? (float) NumUsrs[NotifyEvent] * 100.0 /
- (float) NumUsrsTotal :
- 0.0,
- NumEvents[NotifyEvent],
- NumMails[NotifyEvent]);
-
- /***** Write total number of users who want to be notified by email on some event *****/
- fprintf (Gbl.F.Out,"
",
- Txt_Language,
- Txt_No_of_users,
- Txt_PERCENT_of_users);
-
- /***** For each language... *****/
- for (Lan = (Lan_Language_t) 1;
- Lan <= Lan_NUM_LANGUAGES;
- Lan++)
- {
- /* Get the number of users who have chosen this language from database */
- if (asprintf (&SubQuery,"usr_data.Language='%s'",
- Lan_STR_LANG_ID[Lan]) < 0)
- Lay_NotEnoughMemoryExit ();
- NumUsrs[Lan] = Sta_GetNumUsrsWhoChoseAnOption (SubQuery);
- free ((void *) SubQuery);
-
- /* Update total number of users */
- NumUsrsTotal += NumUsrs[Lan];
- }
-
- /***** Write number of users who have chosen each language *****/
- for (Lan = (Lan_Language_t) 1;
- Lan <= Lan_NUM_LANGUAGES;
- Lan++)
- fprintf (Gbl.F.Out,"
"
- "
"
- "%s"
- "
"
- "
"
- "%u"
- "
"
- "
"
- "%5.2f%%"
- "
"
- "
",
- Txt_STR_LANG_NAME[Lan],NumUsrs[Lan],
- NumUsrsTotal ? (float) NumUsrs[Lan] * 100.0 /
- (float) NumUsrsTotal :
- 0);
-
- /***** End table and box *****/
- Box_EndBoxTable ();
- }
-
-/*****************************************************************************/
-/***** Get and show number of users who have chosen a first day of week ******/
-/*****************************************************************************/
-
-static void Sta_GetAndShowNumUsrsPerFirstDayOfWeek (void)
- {
- extern const bool Cal_DayIsValidAsFirstDayOfWeek[7];
- extern const char *Hlp_ANALYTICS_Figures_calendar;
- extern const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES];
- extern const char *Txt_Calendar;
- extern const char *Txt_First_day_of_the_week;
- extern const char *Txt_DAYS_SMALL[7];
- extern const char *Txt_No_of_users;
- extern const char *Txt_PERCENT_of_users;
- unsigned FirstDayOfWeek;
- char *SubQuery;
- unsigned NumUsrs[7]; // 7: seven days in a week
- unsigned NumUsrsTotal = 0;
-
- /***** Start box and table *****/
- Box_StartBoxTable (NULL,Txt_STAT_USE_STAT_TYPES[Sta_FIRST_DAY_OF_WEEK],NULL,
- Hlp_ANALYTICS_Figures_calendar,Box_NOT_CLOSABLE,2);
-
- /***** Heading row *****/
- fprintf (Gbl.F.Out,"
"
- "
"
- "%s"
- "
"
- "
"
- "%s"
- "
"
- "
"
- "%s"
- "
"
- "
",
- Txt_Calendar,
- Txt_No_of_users,
- Txt_PERCENT_of_users);
-
- /***** For each day... *****/
- for (FirstDayOfWeek = 0; // Monday
- FirstDayOfWeek <= 6; // Sunday
- FirstDayOfWeek++)
- if (Cal_DayIsValidAsFirstDayOfWeek[FirstDayOfWeek])
- {
- /* Get number of users who have chosen this first day of week from database */
- if (asprintf (&SubQuery,"usr_data.FirstDayOfWeek=%u",
- (unsigned) FirstDayOfWeek) < 0)
- Lay_NotEnoughMemoryExit ();
- NumUsrs[FirstDayOfWeek] = Sta_GetNumUsrsWhoChoseAnOption (SubQuery);
- free ((void *) SubQuery);
-
- /* Update total number of users */
- NumUsrsTotal += NumUsrs[FirstDayOfWeek];
- }
-
- /***** Write number of users who have chosen each first day of week *****/
- for (FirstDayOfWeek = 0; // Monday
- FirstDayOfWeek <= 6; // Sunday
- FirstDayOfWeek++)
- if (Cal_DayIsValidAsFirstDayOfWeek[FirstDayOfWeek])
- fprintf (Gbl.F.Out,"
"
- "
"
- ""
- "
"
- "
"
- "%u"
- "
"
- "
"
- "%5.2f%%"
- "
"
- "
",
- Gbl.Prefs.URLIcons,FirstDayOfWeek,
- Txt_DAYS_SMALL[FirstDayOfWeek],
- Txt_First_day_of_the_week,Txt_DAYS_SMALL[FirstDayOfWeek],
- NumUsrs[FirstDayOfWeek],
- NumUsrsTotal ? (float) NumUsrs[FirstDayOfWeek] * 100.0 /
- (float) NumUsrsTotal :
- 0);
-
- /***** End table and box *****/
- Box_EndBoxTable ();
- }
-
-/*****************************************************************************/
-/******** Get and show number of users who have chosen a date format *********/
-/*****************************************************************************/
-
-static void Sta_GetAndShowNumUsrsPerDateFormat (void)
- {
- extern const char *Hlp_ANALYTICS_Figures_dates;
- extern const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES];
- extern const char *Txt_Format;
- extern const char *Txt_No_of_users;
- extern const char *Txt_PERCENT_of_users;
- unsigned Format;
- char *SubQuery;
- unsigned NumUsrs[Dat_NUM_OPTIONS_FORMAT];
- unsigned NumUsrsTotal = 0;
-
- /***** Start box and table *****/
- Box_StartBoxTable (NULL,Txt_STAT_USE_STAT_TYPES[Sta_DATE_FORMAT],NULL,
- Hlp_ANALYTICS_Figures_dates,Box_NOT_CLOSABLE,2);
-
- /***** Heading row *****/
- fprintf (Gbl.F.Out,"
"
- "
"
- "%s"
- "
"
- "
"
- "%s"
- "
"
- "
"
- "%s"
- "
"
- "
",
- Txt_Format,
- Txt_No_of_users,
- Txt_PERCENT_of_users);
-
- /***** For each format... *****/
- for (Format = (Dat_Format_t) 0;
- Format <= (Dat_Format_t) (Dat_NUM_OPTIONS_FORMAT - 1);
- Format++)
- {
- /* Get number of users who have chosen this date format from database */
- if (asprintf (&SubQuery,"usr_data.DateFormat=%u",
- (unsigned) Format) < 0)
- Lay_NotEnoughMemoryExit ();
- NumUsrs[Format] = Sta_GetNumUsrsWhoChoseAnOption (SubQuery);
- free ((void *) SubQuery);
-
- /* Update total number of users */
- NumUsrsTotal += NumUsrs[Format];
- }
-
- /***** Write number of users who have chosen each date format *****/
- for (Format = (Dat_Format_t) 0;
- Format <= (Dat_Format_t) (Dat_NUM_OPTIONS_FORMAT - 1);
- Format++)
- {
- fprintf (Gbl.F.Out,"
",
- Txt_Icons,
- Txt_No_of_users,
- Txt_PERCENT_of_users);
-
- /***** For each icon set... *****/
- for (IconSet = (Ico_IconSet_t) 0;
- IconSet < Ico_NUM_ICON_SETS;
- IconSet++)
- {
- /* Get the number of users who have chosen this icon set from database */
- if (asprintf (&SubQuery,"usr_data.IconSet='%s'",
- Ico_IconSetId[IconSet]) < 0)
- Lay_NotEnoughMemoryExit ();
- NumUsrs[IconSet] = Sta_GetNumUsrsWhoChoseAnOption (SubQuery);
- free ((void *) SubQuery);
-
- /* Update total number of users */
- NumUsrsTotal += NumUsrs[IconSet];
- }
-
- /***** Write number of users who have chosen each icon set *****/
- for (IconSet = (Ico_IconSet_t) 0;
- IconSet < Ico_NUM_ICON_SETS;
- IconSet++)
- fprintf (Gbl.F.Out,"
",
- Txt_Menu,
- Txt_No_of_users,
- Txt_PERCENT_of_users);
-
- /***** For each menu... *****/
- for (Menu = (Mnu_Menu_t) 0;
- Menu < Mnu_NUM_MENUS;
- Menu++)
- {
- /* Get number of users who have chosen this menu from database */
- if (asprintf (&SubQuery,"usr_data.Menu=%u",
- (unsigned) Menu) < 0)
- Lay_NotEnoughMemoryExit ();
- NumUsrs[Menu] = Sta_GetNumUsrsWhoChoseAnOption (SubQuery);
- free ((void *) SubQuery);
-
- /* Update total number of users */
- NumUsrsTotal += NumUsrs[Menu];
- }
-
- /***** Write number of users who have chosen each menu *****/
- for (Menu = (Mnu_Menu_t) 0;
- Menu < Mnu_NUM_MENUS;
- Menu++)
- fprintf (Gbl.F.Out,"
",
- Txt_Columns,
- Txt_No_of_users,
- Txt_PERCENT_of_users);
-
- /***** For each language... *****/
- for (SideCols = 0;
- SideCols <= Lay_SHOW_BOTH_COLUMNS;
- SideCols++)
- {
- /* Get the number of users who have chosen this layout of columns from database */
- if (asprintf (&SubQuery,"usr_data.SideCols=%u",
- SideCols) < 0)
- Lay_NotEnoughMemoryExit ();
- NumUsrs[SideCols] = Sta_GetNumUsrsWhoChoseAnOption (SubQuery);
- free ((void *) SubQuery);
-
- /* Update total number of users */
- NumUsrsTotal += NumUsrs[SideCols];
- }
-
- /***** Write number of users who have chosen this layout of columns *****/
- for (SideCols = 0;
- SideCols <= Lay_SHOW_BOTH_COLUMNS;
- SideCols++)
- fprintf (Gbl.F.Out,"
"
- "
"
- ""
- "
"
- "
"
- "%u"
- "
"
- "
"
- "%5.2f%%"
- "
"
- "
",
- Gbl.Prefs.URLIcons,SideCols >> 1,SideCols & 1,
- Txt_LAYOUT_SIDE_COLUMNS[SideCols],
- Txt_LAYOUT_SIDE_COLUMNS[SideCols],
- NumUsrs[SideCols],
- NumUsrsTotal ? (float) NumUsrs[SideCols] * 100.0 /
- (float) NumUsrsTotal :
- 0);
-
- /***** End table and box *****/
- Box_EndBoxTable ();
- }
-
-/*****************************************************************************/
-/************** Get number of users who have chosen an option ****************/
-/*****************************************************************************/
-
-unsigned Sta_GetNumUsrsWhoChoseAnOption (const char *SubQuery)
- {
- unsigned NumUsrs;
-
- /***** Get the number of users who have chosen this privacy option from database *****/
- switch (Gbl.Scope.Current)
- {
- case Sco_SCOPE_SYS:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the number of users"
- " who have chosen an option",
- "SELECT COUNT(*)"
- " FROM usr_data WHERE %s",
- SubQuery);
- break;
- case Sco_SCOPE_CTY:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the number of users"
- " who have chosen an option",
- "SELECT COUNT(DISTINCT usr_data.UsrCod)"
- " FROM institutions,centres,degrees,courses,crs_usr,usr_data"
- " WHERE institutions.CtyCod=%ld"
- " AND institutions.InsCod=centres.InsCod"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_data.UsrCod"
- " AND %s",
- Gbl.CurrentCty.Cty.CtyCod,SubQuery);
- break;
- case Sco_SCOPE_INS:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the number of users"
- " who have chosen an option",
- "SELECT COUNT(DISTINCT usr_data.UsrCod)"
- " FROM centres,degrees,courses,crs_usr,usr_data"
- " WHERE centres.InsCod=%ld"
- " AND centres.CtrCod=degrees.CtrCod"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_data.UsrCod"
- " AND %s",
- Gbl.CurrentIns.Ins.InsCod,SubQuery);
- break;
- case Sco_SCOPE_CTR:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the number of users"
- " who have chosen an option",
- "SELECT COUNT(DISTINCT usr_data.UsrCod)"
- " FROM degrees,courses,crs_usr,usr_data"
- " WHERE degrees.CtrCod=%ld"
- " AND degrees.DegCod=courses.DegCod"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_data.UsrCod"
- " AND %s",
- Gbl.CurrentCtr.Ctr.CtrCod,SubQuery);
- break;
- case Sco_SCOPE_DEG:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the number of users"
- " who have chosen an option",
- "SELECT COUNT(DISTINCT usr_data.UsrCod)"
- " FROM courses,crs_usr,usr_data"
- " WHERE courses.DegCod=%ld"
- " AND courses.CrsCod=crs_usr.CrsCod"
- " AND crs_usr.UsrCod=usr_data.UsrCod"
- " AND %s",
- Gbl.CurrentDeg.Deg.DegCod,SubQuery);
- break;
- case Sco_SCOPE_CRS:
- NumUsrs =
- (unsigned) DB_QueryCOUNT ("can not get the number of users"
- " who have chosen an option",
- "SELECT COUNT(DISTINCT usr_data.UsrCod)"
- " FROM crs_usr,usr_data"
- " WHERE crs_usr.CrsCod=%ld"
- " AND crs_usr.UsrCod=usr_data.UsrCod"
- " AND %s",
- Gbl.CurrentCrs.Crs.CrsCod,SubQuery);
- break;
- default:
- Lay_WrongScopeExit ();
- NumUsrs = 0; // Not reached. Initialized to avoid warning.
- break;
- }
-
- return NumUsrs;
- }
-
/*****************************************************************************/
/**************** Compute the time used to generate the page *****************/
/*****************************************************************************/
@@ -9427,7 +4033,7 @@ void Sta_WriteTime (char Str[Dat_MAX_BYTES_TIME],long TimeInMicroseconds)
/*************** Put a link to show last clicks in real time *****************/
/*****************************************************************************/
-void Con_PutLinkToLastClicks (void)
+void Sta_PutLinkToLastClicks (void)
{
extern const char *Txt_Last_clicks;
@@ -9639,4 +4245,3 @@ void Sta_GetAndShowLastClicks (void)
/***** Free structure that stores the query result *****/
mysql_free_result (mysql_res);
}
-
diff --git a/swad_statistic.h b/swad_statistic.h
index 9fec5310..5c0312e0 100644
--- a/swad_statistic.h
+++ b/swad_statistic.h
@@ -106,39 +106,6 @@ typedef enum
} Sta_ClicksGroupedBy_t;
#define Sta_CLICKS_GROUPED_BY_DEFAULT Sta_CLICKS_CRS_PER_USR
-#define Sta_NUM_FIGURES 27
-typedef enum
- {
- Sta_USERS, // Number of users
- Sta_USERS_RANKING, // Users' ranking
- Sta_HIERARCHY, // Number of countries, institutions, centres, degrees and courses
- Sta_INSTITS, // Number of users in each institution
- Sta_DEGREE_TYPES, // Number of degrees in each type of degree
- Sta_FOLDERS_AND_FILES, // Number of folders and files
- Sta_OER, // Number of OERs (Open Educational Resources)
- Sta_ASSIGNMENTS, // Number of assignments
- Sta_PROJECTS, // Number of projects
- Sta_TESTS, // Number of test questions
- Sta_GAMES, // Number of games
- Sta_SURVEYS, // Number of surveys
- Sta_SOCIAL_ACTIVITY, // Number of social notes
- Sta_FOLLOW, // Number of following and followers
- Sta_FORUMS, // Number of forums, threads and posts
- Sta_NOTIFY_EVENTS, // Number of users per notify event
- Sta_NOTICES, // Number of notices
- Sta_MESSAGES, // Number of users' (sent and received) messages
- Sta_SOCIAL_NETWORKS, // Number of users in social networks
- Sta_LANGUAGES, // Number of users per language
- Sta_FIRST_DAY_OF_WEEK, // Number of users per first day of week
- Sta_DATE_FORMAT, // Number of users per date format
- Sta_ICON_SETS, // Number of users per icon set
- Sta_MENUS, // Number of users per menu
- Sta_THEMES, // Number of users per theme
- Sta_SIDE_COLUMNS, // Number of users per layout of columns
- Sta_PRIVACY, // Number of users per privacity
- } Sta_FigureType_t;
-#define Sta_FIGURE_TYPE_DEF Sta_USERS
-
#define Sta_MIN_ROWS_PER_PAGE 10
#define Sta_MAX_ROWS_PER_PAGE (Sta_MIN_ROWS_PER_PAGE * 10000)
#define Sta_DEF_ROWS_PER_PAGE (Sta_MIN_ROWS_PER_PAGE * 5)
@@ -152,8 +119,6 @@ typedef enum
} Sta_ColorType_t;
#define Sta_COLOR_TYPE_DEF Sta_COLOR
-#define Sta_NUM_STAT_CRS_FILE_ZONES 11
-
struct Sta_Hits
{
float Num;
@@ -179,17 +144,12 @@ void Sta_ComputeMaxAndTotalHits (struct Sta_Hits *Hits,
MYSQL_RES *mysql_res,unsigned Field,
unsigned Divisor);
-void Sta_ReqShowFigures (void);
-void Sta_PutIconToShowFigure (void);
-void Sta_PutHiddenParamFigures (void);
-void Sta_ShowFigures (void);
-
void Sta_ComputeTimeToGeneratePage (void);
void Sta_ComputeTimeToSendPage (void);
void Sta_WriteTimeToGenerateAndSendPage (void);
void Sta_WriteTime (char Str[Dat_MAX_BYTES_TIME],long TimeInMicroseconds);
-void Con_PutLinkToLastClicks (void);
+void Sta_PutLinkToLastClicks (void);
void Sta_ShowLastClicks (void);
void Sta_GetAndShowLastClicks (void);
diff --git a/swad_survey.c b/swad_survey.c
index ff62a669..3166cf4b 100644
--- a/swad_survey.c
+++ b/swad_survey.c
@@ -333,8 +333,8 @@ static void Svy_PutIconsListSurveys (void)
Svy_PutIconToCreateNewSvy ();
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_SURVEYS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_SURVEYS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_test.c b/swad_test.c
index 8d169f53..a36dc46d 100644
--- a/swad_test.c
+++ b/swad_test.c
@@ -1448,8 +1448,8 @@ static void Tst_PutIconsTests (void)
}
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_TESTS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_TESTS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_text.c b/swad_text.c
index a5f57dfc..3fc2b06f 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -67,6 +67,7 @@
#include "swad_degree.h"
#include "swad_degree_type.h"
#include "swad_department.h"
+#include "swad_figure.h"
#include "swad_file_browser.h"
#include "swad_forum.h"
#include "swad_holiday.h"
@@ -6605,27 +6606,6 @@ const char *Txt_Creating_database_tables_if_they_do_not_exist =
"Criando tabelas da base de dados, se elas não existirem…";
#endif
-const char *Txt_crs = // Abbreviation of "course" (three characters + dot)
-#if L==1 // ca
- "asg."; // Necessita traduccio
-#elif L==2 // de
- "Ver.";
-#elif L==3 // en
- "crs.";
-#elif L==4 // es
- "asg.";
-#elif L==5 // fr
- "mat.";
-#elif L==6 // gn
- "mbo'esyry";
-#elif L==7 // it
- "crs.";
-#elif L==8 // pl
- "Oczywiscie.";
-#elif L==9 // pt
- "crs.";
-#endif
-
const char *Txt_Current_email =
#if L==1 // ca
"Correu actual";
@@ -40346,7 +40326,7 @@ const char *Txt_STAT_COLOR_TYPES[Sta_NUM_COLOR_TYPES] =
#endif
};
-const char *Txt_STAT_COURSE_FILE_ZONES[Sta_NUM_STAT_CRS_FILE_ZONES] = // Use instead of space
+const char *Txt_STAT_COURSE_FILE_ZONES[Fig_NUM_STAT_CRS_FILE_ZONES] = // Use instead of space
{
#if L==1 // ca // Brw_ADMI_DOC_CRS
"Documents (ass.)"
@@ -40566,6 +40546,26 @@ const char *Txt_STAT_COURSE_FILE_ZONES[Sta_NUM_STAT_CRS_FILE_ZONES] = // Use &nb
"Całkowity"
#elif L==9 // pt
"Total"
+#endif
+ ,
+#if L==1 // ca // Brw_ADMI_BRF_USR
+ "Maletins"
+#elif L==2 // de
+ "Aktentasche"
+#elif L==3 // en
+ "Briefcases"
+#elif L==4 // es
+ "Maletines"
+#elif L==5 // fr
+ "Porte-documents"
+#elif L==6 // gn
+ "Maletines" // Okoteve traducción
+#elif L==7 // it
+ "Penna USB"
+#elif L==8 // pl
+ "Briefcases" // Potrzebujesz tlumaczenie
+#elif L==9 // pt
+ "Pasta"
#endif
};
@@ -40941,9 +40941,9 @@ const char *Txt_STAT_TYPE_COUNT_SMALL[Sta_NUM_COUNT_TYPES] =
#endif
};
-const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
+const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES] =
{
-#if L==1 // ca // Sta_USERS
+#if L==1 // ca // Fig_USERS
"Usuaris"
#elif L==2 // de
"Benutzer"
@@ -40963,7 +40963,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Utilizadores"
#endif
,
-#if L==1 // ca // Sta_USERS_RANKING
+#if L==1 // ca // Fig_USERS_RANKING
"Rànquing"
#elif L==2 // de
"Rang"
@@ -40983,7 +40983,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Posição"
#endif
,
-#if L==1 // ca // Sta_HIERARCHY
+#if L==1 // ca // Fig_HIERARCHY
"Jerarquia"
#elif L==2 // de
"Hierarchie"
@@ -41003,7 +41003,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Hierarquia"
#endif
,
-#if L==1 // ca // Sta_INSTITS
+#if L==1 // ca // Fig_INSTITS
"Institucions"
#elif L==2 // de
"Hochschulen"
@@ -41023,7 +41023,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Instituções"
#endif
,
-#if L==1 // ca // Sta_DEGREE_TYPES
+#if L==1 // ca // Fig_DEGREE_TYPES
"Tipus de titulació"
#elif L==2 // de
"Abschlussart"
@@ -41043,7 +41043,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Tipos de grau"
#endif
,
-#if L==1 // ca // Sta_FOLDERS_AND_FILES
+#if L==1 // ca // Fig_FOLDERS_AND_FILES
"Carpetes i fitxers"
#elif L==2 // de
"Verzeichnisse und Dateien"
@@ -41063,7 +41063,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Diretórios e arquivos"
#endif
,
-#if L==1 // ca // Sta_OER
+#if L==1 // ca // Fig_OER
"Recursos Educatius Oberts (OER)"
#elif L==2 // de
"Open Educational Resources (OER)"
@@ -41083,7 +41083,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Recursos Educacionais Abertos (OER)"
#endif
,
-#if L==1 // ca // Sta_ASSIGNMENTS
+#if L==1 // ca // Fig_ASSIGNMENTS
"Activitats"
#elif L==2 // de
"Aufgaben"
@@ -41103,7 +41103,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Atividades"
#endif
,
-#if L==1 // ca // Sta_PROJECTS
+#if L==1 // ca // Fig_PROJECTS
"Projectes"
#elif L==2 // de
"Projekte"
@@ -41123,7 +41123,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Projetos"
#endif
,
-#if L==1 // ca // Sta_TESTS
+#if L==1 // ca // Fig_TESTS
"Tests"
#elif L==2 // de
"Tests"
@@ -41143,7 +41143,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Testes"
#endif
,
-#if L==1 // ca // Sta_GAMES
+#if L==1 // ca // Fig_GAMES
"Jocs"
#elif L==2 // de
"Spiele"
@@ -41163,7 +41163,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Jogos"
#endif
,
-#if L==1 // ca // Sta_SURVEYS
+#if L==1 // ca // Fig_SURVEYS
"Enquestes"
#elif L==2 // de
"Umfragen"
@@ -41183,7 +41183,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Inquéritos"
#endif
,
-#if L==1 // ca // Sta_SOCIAL_ACTIVITY
+#if L==1 // ca // Fig_SOCIAL_ACTIVITY
"Timeline"
#elif L==2 // de
"Timeline"
@@ -41203,7 +41203,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Timeline"
#endif
,
-#if L==1 // ca // Sta_FOLLOW
+#if L==1 // ca // Fig_FOLLOW
"Seguits / Seguidors"
#elif L==2 // de
"Gefolgt / Anhänger"
@@ -41223,7 +41223,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Seguidos / Seguidores"
#endif
,
-#if L==1 // ca // Sta_FORUMS
+#if L==1 // ca // Fig_FORUMS
"Fòrums"
#elif L==2 // de
"Foren"
@@ -41243,7 +41243,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Fóruns"
#endif
,
-#if L==1 // ca // Sta_NOTIFY_EVENTS
+#if L==1 // ca // Fig_NOTIFY_EVENTS
"Notificacions enviades per correu"
#elif L==2 // de
"Anmeldungen per E-Mail gesendet"
@@ -41263,7 +41263,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Notificações enviadas por email"
#endif
,
-#if L==1 // ca // Sta_NOTICES
+#if L==1 // ca // Fig_NOTICES
"Avisos"
#elif L==2 // de
"Ankündigungen"
@@ -41283,7 +41283,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Avisos"
#endif
,
-#if L==1 // ca // Sta_MESSAGES
+#if L==1 // ca // Fig_MESSAGES
"Missatges"
#elif L==2 // de
"Nachrichten"
@@ -41303,7 +41303,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Mensagens"
#endif
,
-#if L==1 // ca // Sta_SOCIAL_NETWORKS
+#if L==1 // ca // Fig_SOCIAL_NETWORKS
"Webs / xarxes socials"
#elif L==2 // de
"Webs / Social Networks"
@@ -41323,7 +41323,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Webs / redes sociais"
#endif
,
-#if L==1 // ca // Sta_LANGUAGES
+#if L==1 // ca // Fig_LANGUAGES
"Idioma"
#elif L==2 // de
"Sprache"
@@ -41343,7 +41343,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Lingua"
#endif
,
-#if L==1 // ca // Sta_FIRST_DAY_OF_WEEK
+#if L==1 // ca // Fig_FIRST_DAY_OF_WEEK
"Calendari"
#elif L==2 // de
"Kalender"
@@ -41363,7 +41363,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Calendário"
#endif
,
-#if L==1 // ca // Sta_DATE_FORMAT
+#if L==1 // ca // Fig_DATE_FORMAT
"Dates"
#elif L==2 // de
"Datum"
@@ -41383,7 +41383,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Datas"
#endif
,
-#if L==1 // ca // Sta_ICON_SETS
+#if L==1 // ca // Fig_ICON_SETS
"Icones"
#elif L==2 // de
"Symbole"
@@ -41403,7 +41403,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Ícones"
#endif
,
-#if L==1 // ca // Sta_MENUS
+#if L==1 // ca // Fig_MENUS
"Menú"
#elif L==2 // de
"Menü"
@@ -41423,7 +41423,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Menu"
#endif
,
-#if L==1 // ca // Sta_THEMES
+#if L==1 // ca // Fig_THEMES
"Tema (colors)"
#elif L==2 // de
"Skin"
@@ -41443,7 +41443,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Skin"
#endif
,
-#if L==1 // ca // Sta_SIDE_COLUMNS
+#if L==1 // ca // Fig_SIDE_COLUMNS
"Columnes"
#elif L==2 // de
"Spalten"
@@ -41463,7 +41463,7 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Colunas"
#endif
,
-#if L==1 // ca // Sta_PRIVACY
+#if L==1 // ca // Fig_PRIVACY
"Privacitat"
#elif L==2 // de
"Geheimhaltung"
@@ -52143,27 +52143,6 @@ const char *Txt_users_with_no_group =
"utilizadores com nenhum grupo";
#endif
-const char *Txt_usr = // Abbreviation of user (three characters + dot)
-#if L==1 // ca
- "usr."; // Necessita traduccio
-#elif L==2 // de
- "Ben.";
-#elif L==3 // en
- "usr.";
-#elif L==4 // es
- "usr.";
-#elif L==5 // fr
- "uti.";
-#elif L==6 // gn
- "usr."; // Okoteve traducción
-#elif L==7 // it
- "ute.";
-#elif L==8 // pl
- "usr."; // Potrzebujesz tlumaczenie
-#elif L==9 // pt
- "uti.";
-#endif
-
const char *Txt_USR_LIST_TYPES[Usr_NUM_USR_LIST_TYPES] =
{
"" // Usr_LIST_UNKNOWN
diff --git a/swad_theme.c b/swad_theme.c
index 330a1766..ff19447d 100644
--- a/swad_theme.c
+++ b/swad_theme.c
@@ -258,8 +258,8 @@ void The_PutIconsToSelectTheme (void)
static void The_PutIconsTheme (void)
{
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_THEMES;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_THEMES;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
diff --git a/swad_user.c b/swad_user.c
index 8d3ecdd7..eb7e8a9e 100644
--- a/swad_user.c
+++ b/swad_user.c
@@ -6008,7 +6008,7 @@ void Usr_PutExtraParamsUsrList (Act_Action_t NextAction)
case ActSeeUseGbl:
/* Used in selector of "Class photo"/"List"
in STATS > Figures > Institutions */
- Sta_PutHiddenParamFigures ();
+ Fig_PutHiddenParamFigures ();
break;
case ActSeePhoDeg:
Pho_PutHiddenParamTypeOfAvg ();
@@ -8024,8 +8024,8 @@ static void Usr_PutIconsListGsts (void)
}
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_USERS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_USERS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
@@ -8050,8 +8050,8 @@ static void Usr_PutIconsListStds (void)
}
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_USERS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_USERS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/
@@ -8076,8 +8076,8 @@ static void Usr_PutIconsListTchs (void)
}
/***** Put icon to show a figure *****/
- Gbl.Stat.FigureType = Sta_USERS;
- Sta_PutIconToShowFigure ();
+ Gbl.Figures.FigureType = Fig_USERS;
+ Fig_PutIconToShowFigure ();
}
/*****************************************************************************/