diff --git a/css/swad_desktop.css b/css/swad_desktop.css
index b1c1b643..200bba60 100644
--- a/css/swad_desktop.css
+++ b/css/swad_desktop.css
@@ -300,7 +300,7 @@ hr.YELLOW_SEPARA {height:0; border-top:0; border-bottom:#BD4815 dotted 1px;}
}
.TIT_TBL_10
{
- margin:0 10px 10px 10px;
+ margin:10px;
color:#808080;
font-size:16pt;
font-weight:bold;
diff --git a/css/swad_mobile.css b/css/swad_mobile.css
index 5ccaa737..046e7251 100644
--- a/css/swad_mobile.css
+++ b/css/swad_mobile.css
@@ -264,7 +264,7 @@ p {margin:0;}
}
.TIT_TBL_10
{
- margin:0 10px 10px 10px;
+ margin:10px;
color:#808080;
font-size:20pt;
font-weight:bold;
diff --git a/sql/cambios.sql b/sql/cambios.sql
index 69e6c150..941df0b0 100644
--- a/sql/cambios.sql
+++ b/sql/cambios.sql
@@ -10518,5 +10518,29 @@ CREATE TABLE IF NOT EXISTS usr_figures (UsrCod INT NOT NULL,FirstClickTime DATET
SELECT * FROM usr_figures WHERE NumClicks>='0' AND FirstClickTime>'0';
-SELECT COUNT(*)+1 FROM (SELECT NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1) AS NumClicksPerDay FROM usr_figures WHERE NumClicks>='0' AND UNIX_TIMESTAMP(FirstClickTime)>'0') AS TableNumClicksPerDay WHERE NumClicksPerDay>(SELECT NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1) FROM usr_figures WHERE UsrCod='1' AND NumClicks>='0' AND UNIX_TIMESTAMP(FirstClickTime)>'0');
+SELECT COUNT(*)+1 FROM (SELECT NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1) AS NumClicksPerDay FROM (SELECT UsrCod,COUNT(*) AS N FROM msg_snt_deleted GROUP BY UsrCod) UNION (SELECT UsrCod,'0' FROM usr_figures WHERE UsrCod NOT IN (SELECT UsrCod FROM msg_snt_deleted))usr_figures WHERE NumClicks>='0' AND UNIX_TIMESTAMP(FirstClickTime)>'0') AS TableNumClicksPerDay WHERE NumClicksPerDay>(SELECT NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1) FROM usr_figures WHERE UsrCod='1' AND NumClicks>='0' AND UNIX_TIMESTAMP(FirstClickTime)>'0');
+
+----- 2015-03-15, swad14.92.2
+
+INSERT INTO usr_figures (UsrCod,FirstClickTime,NumClicks,NumFileViews,NumForPst,NumMsgSnt) SELECT UsrCod,0,-1,-1,-1,-1 FROM usr_data WHERE UsrCod>0 AND UsrCod NOT IN (SELECT UsrCod FROM usr_figures);
+
+
+Hecho:
+UPDATE usr_figures,((SELECT UsrCod,COUNT(*) AS N FROM forum_post WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX GROUP BY UsrCod) UNION (SELECT UsrCod,'0' AS N FROM usr_figures WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX AND UsrCod NOT IN (SELECT UsrCod FROM forum_post))) AS FP SET usr_figures.NumForPst=FP.N WHERE usr_figures.UsrCod>=@USRCODMIN AND usr_figures.UsrCod<=@USRCODMAX AND usr_figures.NumForPst<0 AND usr_figures.UsrCod=FP.UsrCod;
+UPDATE usr_figures,((SELECT UsrCod,COUNT(*) AS N FROM log WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX GROUP BY UsrCod) UNION (SELECT UsrCod,'0' AS N FROM usr_figures WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX AND UsrCod NOT IN (SELECT UsrCod FROM log))) AS NC SET usr_figures.NumClicks=NC.N WHERE usr_figures.UsrCod>=@USRCODMIN AND usr_figures.UsrCod<=@USRCODMAX AND usr_figures.NumClicks<0 AND usr_figures.UsrCod=NC.UsrCod;
+UPDATE usr_figures,((SELECT UsrCod,COUNT(*) AS N FROM msg_snt WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX GROUP BY UsrCod) UNION (SELECT UsrCod,'0' AS N FROM usr_figures WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX AND UsrCod NOT IN (SELECT UsrCod FROM msg_snt))) AS MS,((SELECT UsrCod,COUNT(*) AS N FROM msg_snt_deleted WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX GROUP BY UsrCod) UNION (SELECT UsrCod,'0' AS N FROM usr_figures WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX AND UsrCod NOT IN (SELECT UsrCod FROM msg_snt_deleted))) AS MSD SET usr_figures.NumMsgSnt=MS.N+MSD.N WHERE usr_figures.UsrCod>=@USRCODMIN AND usr_figures.UsrCod<=@USRCODMAX AND usr_figures.NumMsgSnt<0 AND usr_figures.UsrCod=MS.UsrCod AND usr_figures.UsrCod=MSD.UsrCod;
+
+Haciendo:
+SET @USRCODMIN=0;
+SET @USRCODMAX=1000;
+UPDATE usr_figures,((SELECT UsrCod,MIN(ClickTime) AS FCT FROM log WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX GROUP BY UsrCod) UNION (SELECT UsrCod,0 AS FCT FROM usr_figures WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX AND UsrCod NOT IN (SELECT UsrCod FROM log))) AS CT SET usr_figures.FirstClickTime=CT.FCT WHERE usr_figures.UsrCod>=@USRCODMIN AND usr_figures.UsrCod<=@USRCODMAX AND usr_figures.FirstClickTime=0 AND usr_figures.UsrCod=CT.UsrCod;
+
+
+SET @USRCODMIN=0;
+SET @USRCODMAX=1000;
+UPDATE usr_figures,((SELECT UsrCod,SUM(NumViews) AS N FROM file_view WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX GROUP BY UsrCod) UNION (SELECT UsrCod,'0' AS N FROM usr_figures WHERE UsrCod>=@USRCODMIN AND UsrCod<=@USRCODMAX AND UsrCod NOT IN (SELECT UsrCod FROM file_view))) AS FV SET usr_figures.NumFileViews=FV.N WHERE usr_figures.UsrCod>=@USRCODMIN AND usr_figures.UsrCod<=@USRCODMAX AND usr_figures.NumFileViews<0 AND usr_figures.UsrCod=FV.UsrCod;
+
+
+
+
diff --git a/swad_changelog.h b/swad_changelog.h
index 2039cdfc..56669d26 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -103,12 +103,13 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
-#define Log_PLATFORM_VERSION "SWAD 14.92.2 (2015/03/15)"
+#define Log_PLATFORM_VERSION "SWAD 14.93 (2015/03/16)"
// Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1
/*
- Version 14.92.2: Mar 14, 2015 Fixed minor bug in photo edition. (182208 lines)
+ Version 14.93: Mar 16, 2015 Users' ranking. (182527 lines)
+ Version 14.92.2: Mar 15, 2015 Fixed minor bug in photo edition. (182208 lines)
Version 14.92.1: Mar 14, 2015 Changes on request of a nickname to view user's profile. (182205 lines)
Version 14.92: Mar 14, 2015 New module swad_profile for public user's profile. (182202 lines)
1 change necessary in Makefile:
diff --git a/swad_connected.c b/swad_connected.c
index 0dfa4626..a953e363 100644
--- a/swad_connected.c
+++ b/swad_connected.c
@@ -1268,7 +1268,7 @@ static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t R
}
/***** Free structure that stores the query result *****/
- mysql_free_result (mysql_res);
+ DB_FreeMySQLResult (&mysql_res);
}
/*****************************************************************************/
diff --git a/swad_file_browser.c b/swad_file_browser.c
index 35f03aa5..d86a6e6b 100644
--- a/swad_file_browser.c
+++ b/swad_file_browser.c
@@ -10004,10 +10004,6 @@ unsigned long Brw_GetNumFileViewsUsr (long UsrCod)
MYSQL_ROW row;
unsigned long FileViews;
- /***** Get number of posts from a user from database *****/
- sprintf (Query,"SELECT SUM(FileViews) FROM file_views WHERE UsrCod='%ld'",
- UsrCod);
-
/***** Get number of filw views *****/
sprintf (Query,"SELECT SUM(NumViews) FROM file_view WHERE UsrCod='%ld'",
UsrCod);
diff --git a/swad_profile.c b/swad_profile.c
index fcaed4c1..ba7f6810 100644
--- a/swad_profile.c
+++ b/swad_profile.c
@@ -1117,3 +1117,265 @@ void Prf_IncrementNumMsgSntUsr (long UsrCod)
UsrCod);
DB_QueryINSERT (Query,"can not increment user's messages sent");
}
+
+/*****************************************************************************/
+/******** Get and show ranking of users attending to number of clicks ********/
+/*****************************************************************************/
+
+void Prf_GetAndShowRankingClicks (void)
+ {
+ char Query[512];
+ MYSQL_RES *mysql_res;
+ MYSQL_ROW row;
+ unsigned NumUsrs;
+ unsigned NumUsr;
+ struct UsrData UsrDat;
+ unsigned long NumClicks;
+
+ /***** Get ranking from database *****/
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ sprintf (Query,"SELECT UsrCod,NumClicks"
+ " FROM usr_figures"
+ " WHERE NumClicks>='0'"
+ " ORDER BY NumClicks DESC LIMIT 10");
+ break;
+ case Sco_SCOPE_CTY:
+ sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,usr_figures.NumClicks"
+ " FROM institutions,centres,degrees,courses,crs_usr,usr_figures"
+ " 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_figures.UsrCod"
+ " AND usr_figures.NumClicks>='0'"
+ " ORDER BY usr_figures.NumClicks DESC LIMIT 10",
+ Gbl.CurrentCty.Cty.CtyCod);
+ break;
+ case Sco_SCOPE_INS:
+ sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,usr_figures.NumClicks"
+ " FROM centres,degrees,courses,crs_usr,usr_figures"
+ " 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_figures.UsrCod"
+ " AND usr_figures.NumClicks>='0'"
+ " ORDER BY usr_figures.NumClicks DESC LIMIT 10",
+ Gbl.CurrentIns.Ins.InsCod);
+ break;
+ case Sco_SCOPE_CTR:
+ sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,usr_figures.NumClicks"
+ " FROM degrees,courses,crs_usr,usr_figures"
+ " WHERE degrees.CtrCod='%ld'"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_figures.UsrCod"
+ " AND usr_figures.NumClicks>='0'"
+ " ORDER BY usr_figures.NumClicks DESC LIMIT 10",
+ Gbl.CurrentCtr.Ctr.CtrCod);
+ break;
+ case Sco_SCOPE_DEG:
+ sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,usr_figures.NumClicks"
+ " FROM courses,crs_usr,usr_figures"
+ " WHERE courses.DegCod='%ld'"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_figures.UsrCod"
+ " AND usr_figures.NumClicks>='0'"
+ " ORDER BY usr_figures.NumClicks DESC LIMIT 10",
+ Gbl.CurrentDeg.Deg.DegCod);
+ break;
+ case Sco_SCOPE_CRS:
+ sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,usr_figures.NumClicks"
+ " FROM crs_usr,usr_figures"
+ " WHERE crs_usr.CrsCod='%ld'"
+ " AND crs_usr.UsrCod=usr_figures.UsrCod"
+ " AND usr_figures.NumClicks>='0'"
+ " ORDER BY usr_figures.NumClicks DESC LIMIT 10",
+ Gbl.CurrentCrs.Crs.CrsCod);
+ break;
+ default:
+ Lay_ShowErrorAndExit ("Wrong scope.");
+ break;
+ }
+ NumUsrs = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get ranking");
+ if (NumUsrs)
+ {
+ /***** Initialize structure with user's data *****/
+ Usr_UsrDataConstructor (&UsrDat);
+
+ fprintf (Gbl.F.Out,"
");
+
+ for (NumUsr = 1;
+ NumUsr <= NumUsrs;
+ NumUsr++)
+ {
+ /***** Get user and number of clicks *****/
+ row = mysql_fetch_row (mysql_res);
+
+ /* Get user's code (row[0]) */
+ UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]);
+ Usr_GetAllUsrDataFromUsrCod (&UsrDat);
+
+ /* Get number of clicks (row[1]) */
+ if (sscanf (row[1],"%ld",&NumClicks) != 1)
+ NumClicks = -1L;
+
+ /***** Show row *****/
+ if (UsrDat.Nickname[0])
+ fprintf (Gbl.F.Out,""
+ "#%u | "
+ "@%s | "
+ "%ld | "
+ "
",
+ NumUsr,
+ UsrDat.Nickname,
+ NumClicks);
+ }
+
+ fprintf (Gbl.F.Out,"
");
+
+ /***** Free memory used for user's data *****/
+ Usr_UsrDataDestructor (&UsrDat);
+ }
+
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+ }
+
+/*****************************************************************************/
+/**** Get and show ranking of users attending to number of clicks per day ****/
+/*****************************************************************************/
+
+void Prf_GetAndShowRankingClicksPerDay (void)
+ {
+ char Query[512];
+ MYSQL_RES *mysql_res;
+ MYSQL_ROW row;
+ unsigned NumUsrs;
+ unsigned NumUsr;
+ struct UsrData UsrDat;
+ float NumClicksPerDay;
+
+ /***** Get ranking from database *****/
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ sprintf (Query,"SELECT UsrCod,"
+ "NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1) AS NumClicksPerDay"
+ " FROM usr_figures"
+ " WHERE FirstClickTime>0"
+ " ORDER BY NumClicksPerDay DESC LIMIT 10");
+ break;
+ case Sco_SCOPE_CTY:
+ sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,"
+ "usr_figures.NumClicks/(DATEDIFF(NOW(),usr_figures.FirstClickTime)+1) AS NumClicksPerDay"
+ " FROM institutions,centres,degrees,courses,crs_usr,usr_figures"
+ " 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_figures.UsrCod"
+ " AND usr_figures.FirstClickTime>0"
+ " ORDER BY NumClicksPerDay DESC LIMIT 10",
+ Gbl.CurrentCty.Cty.CtyCod);
+ break;
+ case Sco_SCOPE_INS:
+ sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,"
+ "usr_figures.NumClicks/(DATEDIFF(NOW(),usr_figures.FirstClickTime)+1) AS NumClicksPerDay"
+ " FROM centres,degrees,courses,crs_usr,usr_figures"
+ " 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_figures.UsrCod"
+ " AND usr_figures.FirstClickTime>0"
+ " ORDER BY NumClicksPerDay DESC LIMIT 10",
+ Gbl.CurrentIns.Ins.InsCod);
+ break;
+ case Sco_SCOPE_CTR:
+ sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,"
+ "usr_figures.NumClicks/(DATEDIFF(NOW(),usr_figures.FirstClickTime)+1) AS NumClicksPerDay"
+ " FROM degrees,courses,crs_usr,usr_figures"
+ " WHERE degrees.CtrCod='%ld'"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_figures.UsrCod"
+ " AND usr_figures.FirstClickTime>0'"
+ " ORDER BY NumClicksPerDay DESC LIMIT 10",
+ Gbl.CurrentCtr.Ctr.CtrCod);
+ break;
+ case Sco_SCOPE_DEG:
+ sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,"
+ "usr_figures.NumClicks/(DATEDIFF(NOW(),usr_figures.FirstClickTime)+1) AS NumClicksPerDay"
+ " FROM courses,crs_usr,usr_figures"
+ " WHERE courses.DegCod='%ld'"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_figures.UsrCod"
+ " AND usr_figures.FirstClickTime>0"
+ " ORDER BY NumClicksPerDay DESC LIMIT 10",
+ Gbl.CurrentDeg.Deg.DegCod);
+ break;
+ case Sco_SCOPE_CRS:
+ sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,"
+ "usr_figures.NumClicks/(DATEDIFF(NOW(),usr_figures.FirstClickTime)+1) AS NumClicksPerDay"
+ " FROM crs_usr,usr_figures"
+ " WHERE crs_usr.CrsCod='%ld'"
+ " AND crs_usr.UsrCod=usr_figures.UsrCod"
+ " AND usr_figures.FirstClickTime>0"
+ " ORDER BY NumClicksPerDay DESC LIMIT 10",
+ Gbl.CurrentCrs.Crs.CrsCod);
+ break;
+ default:
+ Lay_ShowErrorAndExit ("Wrong scope.");
+ break;
+ }
+ NumUsrs = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get ranking");
+ if (NumUsrs)
+ {
+ /***** Initialize structure with user's data *****/
+ Usr_UsrDataConstructor (&UsrDat);
+
+ fprintf (Gbl.F.Out,"");
+
+ for (NumUsr = 1;
+ NumUsr <= NumUsrs;
+ NumUsr++)
+ {
+ /***** Get user and number of clicks *****/
+ row = mysql_fetch_row (mysql_res);
+
+ /* Get user's code (row[0]) */
+ UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]);
+ Usr_GetAllUsrDataFromUsrCod (&UsrDat);
+
+ /* Get number of clicks per day (row[1]) */
+ NumClicksPerDay = Str_GetFloatNumFromStr (row[1]);
+
+ /***** Show row *****/
+ if (UsrDat.Nickname[0])
+ {
+ fprintf (Gbl.F.Out,""
+ "#%u | "
+ "@%s | "
+ "",
+ NumUsr,
+ UsrDat.Nickname);
+ Str_WriteFloatNum (NumClicksPerDay);
+ fprintf (Gbl.F.Out," | "
+ "
");
+ }
+ }
+
+ fprintf (Gbl.F.Out,"
");
+
+ /***** Free memory used for user's data *****/
+ Usr_UsrDataDestructor (&UsrDat);
+ }
+
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+ }
diff --git a/swad_profile.h b/swad_profile.h
index 63045f56..5dd2cfae 100644
--- a/swad_profile.h
+++ b/swad_profile.h
@@ -54,4 +54,7 @@ void Prf_IncrementNumFileViewsUsr (long UsrCod);
void Prf_IncrementNumForPstUsr (long UsrCod);
void Prf_IncrementNumMsgSntUsr (long UsrCod);
+void Prf_GetAndShowRankingClicks (void);
+void Prf_GetAndShowRankingClicksPerDay (void);
+
#endif
diff --git a/swad_statistic.c b/swad_statistic.c
index 15bb8295..7b82f55d 100644
--- a/swad_statistic.c
+++ b/swad_statistic.c
@@ -132,6 +132,7 @@ static void Sta_GetAndShowNumDegsInSWAD (void);
static void Sta_GetAndShowNumCrssInSWAD (void);
static void Sta_GetAndShowUsersStats (void);
+static void Sta_GetAndShowUsersRanking (void);
static void Sta_GetAndShowFileBrowsersStats (void);
static void Sta_WriteStatsExpTreesTableHead (void);
@@ -3676,6 +3677,10 @@ void Sta_ShowUseOfPlatform (void)
/***** Number of users *****/
Sta_GetAndShowUsersStats ();
break;
+ case Sta_USRS_RANKING:
+ /***** Users ranking *****/
+ Sta_GetAndShowUsersRanking ();
+ break;
case Sta_DEGREES_AND_COURSES:
/***** Number of degrees and courses *****/
Sta_GetAndShowDegCrsStats ();
@@ -3792,6 +3797,45 @@ static void Sta_GetAndShowUsersStats (void)
Lay_EndRoundFrameTable10 ();
}
+/*****************************************************************************/
+/****************************** Show users' ranking **************************/
+/*****************************************************************************/
+
+static void Sta_GetAndShowUsersRanking (void)
+ {
+ extern const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_TYPES_USE_STATS];
+ extern const char *Txt_Clicks;
+ extern const char *Txt_Clicks_per_day;
+
+ Lay_StartRoundFrameTable10 (NULL,2,Txt_STAT_USE_STAT_TYPES[Sta_USRS_RANKING]);
+
+ /***** Header *****/
+ fprintf (Gbl.F.Out,""
+ ""
+ "%s"
+ " | "
+ ""
+ "%s"
+ " | "
+ "
",
+ Txt_Clicks,
+ Txt_Clicks_per_day);
+
+ /***** Rankings *****/
+ fprintf (Gbl.F.Out,""
+ "");
+ Prf_GetAndShowRankingClicks ();
+ fprintf (Gbl.F.Out," | "
+ "");
+ Prf_GetAndShowRankingClicksPerDay ();
+ fprintf (Gbl.F.Out," | "
+ "
");
+
+ Lay_EndRoundFrameTable10 ();
+ }
+
/*****************************************************************************/
/*************** Get and show stats about degrees and courses ****************/
/*****************************************************************************/
diff --git a/swad_statistic.h b/swad_statistic.h
index c8590b72..291a5d95 100644
--- a/swad_statistic.h
+++ b/swad_statistic.h
@@ -86,10 +86,11 @@ typedef enum
Sta_ACC_GBL_PER_COURSE = 20,
} Sta_ClicksStatType_t;
-#define Sta_NUM_TYPES_USE_STATS 19
+#define Sta_NUM_TYPES_USE_STATS 20
typedef enum
{
Sta_USERS, // Number of users
+ Sta_USRS_RANKING, // Users' ranking
Sta_DEGREES_AND_COURSES, // Number of degrees and courses
Sta_SOCIAL_NETWORKS, // Number of users in social networks
Sta_FOLDERS_AND_FILES, // Number of folders and files
@@ -101,7 +102,7 @@ typedef enum
Sta_MSGS_BETWEEN_USERS, // Number of users' (sent and received) messages
Sta_FORUMS, // Number of forums, threads and posts
Sta_SURVEYS, // Number of surveys
- Sta_PRIVACY, // Number of users per privacity
+ Sta_PRIVACY, // Number of users per privacity
Sta_LANGUAGES, // Number of users per language
Sta_LAYOUTS, // Number of users per layout
Sta_THEMES, // Number of users per theme
diff --git a/swad_text.c b/swad_text.c
index 28448d38..e7c427fe 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -4563,6 +4563,27 @@ const char *Txt_clicks =
"cliques";
#endif
+const char *Txt_Clicks_per_day =
+#if L==0
+ "Clics per dia";
+#elif L==1
+ "Klicks pro Tag";
+#elif L==2
+ "Clicks per day";
+#elif L==3
+ "Clics por día";
+#elif L==4
+ "Clics par jour";
+#elif L==5
+ "Clics por día"; // Okoteve traducción
+#elif L==6
+ "Clic al giorno";
+#elif L==7
+ "Kliknięć dziennie";
+#elif L==8
+ "Cliques por dia";
+#endif
+
const char *Txt_Clicks_without_degree_selected =
#if L==0
"Clics sense seleccionar titulació";
@@ -35932,6 +35953,26 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_TYPES_USE_STATS] =
"Utilizadores"
#endif
,
+#if L==0
+ "Rànquing"
+#elif L==1
+ "Rang"
+#elif L==2
+ "Ranking"
+#elif L==3
+ "Ranking"
+#elif L==4
+ "Classement"
+#elif L==5
+ "Ranking" // Okoteve traducción
+#elif L==6
+ "Posto"
+#elif L==7
+ "Ranking"
+#elif L==8
+ "Posição"
+#endif
+ ,
#if L==0
"Titulaciones y asignaturas" // Necessita traducció
#elif L==1
diff --git a/swad_user.c b/swad_user.c
index f6cbb2fb..b8f5b39a 100644
--- a/swad_user.c
+++ b/swad_user.c
@@ -3393,11 +3393,11 @@ long Usr_GetRamdomStdFromCrs (long CrsCod)
/***** Get user code *****/
row = mysql_fetch_row (mysql_res);
UsrCod = Str_ConvertStrCodToLongCod (row[0]);
-
- /***** Free structure that stores the query result *****/
- DB_FreeMySQLResult (&mysql_res);
}
+ /***** Free structure that stores the query result *****/
+ DB_FreeMySQLResult (&mysql_res);
+
return UsrCod;
}