mirror of https://github.com/acanas/swad-core.git
Version 14.86
This commit is contained in:
parent
b1aa6514ca
commit
d3da2d9825
|
@ -103,11 +103,12 @@
|
|||
/****************************** Public constants *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
#define Log_PLATFORM_VERSION "SWAD 14.85.2 (2015/03/11)"
|
||||
#define Log_PLATFORM_VERSION "SWAD 14.86 (2015/03/11)"
|
||||
|
||||
// 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.86: Mar 11, 2015 Show user's figures per days. (181525 lines)
|
||||
Version 14.85.2: Mar 11, 2015 Refactoring in user's figures. (181478 lines)
|
||||
Version 14.85.1: Mar 11, 2015 Remove user's figures when removing user's account. (181472 lines)
|
||||
Version 14.85: Mar 11, 2015 Number of messages sent is stored in user's figures. (181457 lines)
|
||||
|
|
|
@ -121,7 +121,6 @@ static void Sta_ShowNumAccessesPerCourse (unsigned long NumRows,MYSQL_RES *mysql
|
|||
static void Sta_WriteDegree (long DegCod);
|
||||
static void Sta_DrawBarNumClicks (char Color,float NumPagesGenerated,float MaxPagesGenerated,float TotalPagesGenerated,unsigned MaxBarWidth);
|
||||
static void Sta_WriteSelectedRangeOfDates (unsigned NumDays);
|
||||
static void Sta_WriteFloatNum (float Number);
|
||||
|
||||
static void Sta_GetAndShowDegCrsStats (void);
|
||||
static void Sta_WriteHeadDegsCrssInSWAD (void);
|
||||
|
@ -1856,7 +1855,7 @@ static void Sta_ShowNumAccessesPerUsr (unsigned long NumRows,MYSQL_RES *mysql_re
|
|||
UsrDat.RoleInCurrentCrsDB == Rol_ROLE_STUDENT ? 'c' :
|
||||
'v',
|
||||
BarWidth);
|
||||
Sta_WriteFloatNum (NumPagesGenerated);
|
||||
Str_WriteFloatNum (NumPagesGenerated);
|
||||
fprintf (Gbl.F.Out," </td>"
|
||||
"</tr>");
|
||||
}
|
||||
|
@ -2339,14 +2338,14 @@ static void Sta_DrawBarColors (Sta_ColorType_t ColorType,float MaxPagesGenerated
|
|||
" text-align:center; vertical-align:bottom;\">",
|
||||
GRAPH_DISTRIBUTION_PER_HOUR_TOTAL_WIDTH/5,
|
||||
GRAPH_DISTRIBUTION_PER_HOUR_TOTAL_WIDTH/5);
|
||||
Sta_WriteFloatNum ((float) Interval * MaxPagesGenerated / 5.0);
|
||||
Str_WriteFloatNum ((float) Interval * MaxPagesGenerated / 5.0);
|
||||
fprintf (Gbl.F.Out,"</td>");
|
||||
}
|
||||
fprintf (Gbl.F.Out,"<td colspan=\"%u\" class=\"LOG\" style=\"width:%upx;"
|
||||
" text-align:right; vertical-align:bottom;\">",
|
||||
(GRAPH_DISTRIBUTION_PER_HOUR_TOTAL_WIDTH/5)/2,
|
||||
(GRAPH_DISTRIBUTION_PER_HOUR_TOTAL_WIDTH/5)/2);
|
||||
Sta_WriteFloatNum (MaxPagesGenerated);
|
||||
Str_WriteFloatNum (MaxPagesGenerated);
|
||||
fprintf (Gbl.F.Out,"</td>"
|
||||
"</tr>"
|
||||
"<tr>");
|
||||
|
@ -2381,7 +2380,7 @@ static void Sta_DrawAccessesPerHourForADay (Sta_ColorType_t ColorType,float NumP
|
|||
{
|
||||
Sta_SetColor (ColorType,NumPagesGenerated[Hour],MaxPagesGenerated,&R,&G,&B);
|
||||
fprintf (Gbl.F.Out,"<td class=\"LOG\" title=\"");
|
||||
Sta_WriteFloatNum (NumPagesGenerated[Hour]);
|
||||
Str_WriteFloatNum (NumPagesGenerated[Hour]);
|
||||
fprintf (Gbl.F.Out,"\" style=\"width:%upx; text-align:left;"
|
||||
" background-color:#%02X%02X%02X;\">"
|
||||
"</td>",
|
||||
|
@ -2767,7 +2766,7 @@ static void Sta_WriteAccessHour (unsigned Hour,float NumPagesGenerated,float Max
|
|||
fprintf (Gbl.F.Out,"%u%%<br />",
|
||||
(unsigned) (((NumPagesGenerated * 100.0) /
|
||||
TotalPagesGenerated) + 0.5));
|
||||
Sta_WriteFloatNum (NumPagesGenerated);
|
||||
Str_WriteFloatNum (NumPagesGenerated);
|
||||
fprintf (Gbl.F.Out,"<br />");
|
||||
AltoBarra = (unsigned) (((NumPagesGenerated * 400.0) / MaxPagesGenerated) + 0.5);
|
||||
if (AltoBarra == 0)
|
||||
|
@ -3531,7 +3530,7 @@ static void Sta_DrawBarNumClicks (char Color,float NumPagesGenerated,float MaxPa
|
|||
Gbl.Prefs.IconsURL,Color,BarWidth);
|
||||
|
||||
/* Write the number of clicks */
|
||||
Sta_WriteFloatNum (NumPagesGenerated);
|
||||
Str_WriteFloatNum (NumPagesGenerated);
|
||||
fprintf (Gbl.F.Out," (%u",
|
||||
(unsigned) (((NumPagesGenerated * 100.0) /
|
||||
TotalPagesGenerated) + 0.5));
|
||||
|
@ -3588,39 +3587,6 @@ static void Sta_WriteSelectedRangeOfDates (unsigned NumDays)
|
|||
fprintf (Gbl.F.Out,"</p>");
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******** Write a number in floating point with the correct accuracy *********/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void Sta_WriteFloatNum (float Number)
|
||||
{
|
||||
double IntegerPart,FractionaryPart;
|
||||
char *Format;
|
||||
|
||||
FractionaryPart = modf ((double) Number,&IntegerPart);
|
||||
|
||||
if (FractionaryPart == 0.0)
|
||||
fprintf (Gbl.F.Out,"%.0f",IntegerPart);
|
||||
else
|
||||
{
|
||||
if (IntegerPart != 0.0 || FractionaryPart >= 0.1)
|
||||
Format = "%.2f";
|
||||
else if (FractionaryPart >= 0.01)
|
||||
Format = "%.3f";
|
||||
else if (FractionaryPart >= 0.001)
|
||||
Format = "%.4f";
|
||||
else if (FractionaryPart >= 0.0001)
|
||||
Format = "%.5f";
|
||||
else if (FractionaryPart >= 0.00001)
|
||||
Format = "%.6f";
|
||||
else if (FractionaryPart >= 0.000001)
|
||||
Format = "%.7f";
|
||||
else
|
||||
Format = "%e";
|
||||
fprintf (Gbl.F.Out,Format,Number);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************** Show use of the platform *************************/
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/stddef.h> // For NULL
|
||||
#include <ctype.h> // For isprint, isspace, etc.
|
||||
#include <locale.h> // For setlocale
|
||||
#include <math.h> // For log10, floor, ceil, modf, sqrt...
|
||||
#include <stdlib.h> // For malloc and free
|
||||
#include <string.h> // For string functions
|
||||
|
||||
|
@ -598,6 +599,40 @@ char Str_ConvertToLowerLetter (char Ch)
|
|||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/******** Write a number in floating point with the correct accuracy *********/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Str_WriteFloatNum (float Number)
|
||||
{
|
||||
double IntegerPart;
|
||||
double FractionaryPart;
|
||||
char *Format;
|
||||
|
||||
FractionaryPart = modf ((double) Number,&IntegerPart);
|
||||
|
||||
if (FractionaryPart == 0.0)
|
||||
fprintf (Gbl.F.Out,"%.0f",IntegerPart);
|
||||
else
|
||||
{
|
||||
if (IntegerPart != 0.0 || FractionaryPart >= 0.1)
|
||||
Format = "%.2f";
|
||||
else if (FractionaryPart >= 0.01)
|
||||
Format = "%.3f";
|
||||
else if (FractionaryPart >= 0.001)
|
||||
Format = "%.4f";
|
||||
else if (FractionaryPart >= 0.0001)
|
||||
Format = "%.5f";
|
||||
else if (FractionaryPart >= 0.00001)
|
||||
Format = "%.6f";
|
||||
else if (FractionaryPart >= 0.000001)
|
||||
Format = "%.7f";
|
||||
else
|
||||
Format = "%e";
|
||||
fprintf (Gbl.F.Out,Format,Number);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/********** Convert a string that holds a number in floating comma ***********/
|
||||
/********** to another in floating point changing commas to points ***********/
|
||||
|
|
|
@ -74,8 +74,11 @@ char *Str_ConvertToUpperText (char *Str);
|
|||
char *Str_ConvertToLowerText (char *Str);
|
||||
char Str_ConvertToUpperLetter (char Ch);
|
||||
char Str_ConvertToLowerLetter (char Ch);
|
||||
|
||||
void Str_WriteFloatNum (float Number);
|
||||
void Str_ConvertStrFloatCommaToStrFloatPoint (char *Str);
|
||||
float Str_GetFloatNumFromStr (const char *Str);
|
||||
|
||||
void Str_AddStrToQuery (char *Query,const char *Str,size_t SizeOfQuery);
|
||||
void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
|
||||
char *Str,size_t MaxLengthStr,bool RemoveLeadingAndTrailingSpaces);
|
||||
|
|
27
swad_text.c
27
swad_text.c
|
@ -6892,9 +6892,30 @@ const char *Txt_Day =
|
|||
"Dia";
|
||||
#endif
|
||||
|
||||
const char *Txt_day =
|
||||
#if L==0
|
||||
"dia";
|
||||
#elif L==1
|
||||
"Tag";
|
||||
#elif L==2
|
||||
"day";
|
||||
#elif L==3
|
||||
"día";
|
||||
#elif L==4
|
||||
"jour";
|
||||
#elif L==5
|
||||
"ára";
|
||||
#elif L==6
|
||||
"giorno";
|
||||
#elif L==7
|
||||
"dzień";
|
||||
#elif L==8
|
||||
"dia";
|
||||
#endif
|
||||
|
||||
const char *Txt_days =
|
||||
#if L==0
|
||||
"días"; // Necessita traduccio
|
||||
"dies";
|
||||
#elif L==1
|
||||
"Tage";
|
||||
#elif L==2
|
||||
|
@ -6904,11 +6925,11 @@ const char *Txt_days =
|
|||
#elif L==4
|
||||
"jours";
|
||||
#elif L==5
|
||||
"días"; // Okoteve traducción
|
||||
"ára";
|
||||
#elif L==6
|
||||
"giorni";
|
||||
#elif L==7
|
||||
"dni";
|
||||
"dni;";
|
||||
#elif L==8
|
||||
"dias";
|
||||
#endif
|
||||
|
|
82
swad_user.c
82
swad_user.c
|
@ -94,6 +94,7 @@ const char *Usr_UsrDatMainFieldNames[Usr_NUM_MAIN_FIELDS_DATA_USR];
|
|||
struct UsrFigures
|
||||
{
|
||||
struct DateTime FirstClickTime; // 0 ==> unknown first click time of user never logged
|
||||
int NumDays; // -1 ==> not applicable
|
||||
long NumClicks; // -1L ==> unknown number of clicks
|
||||
long NumForPst; // -1L ==> unknown number of forum posts
|
||||
long NumMsgSnt; // -1L ==> unknown number of messages sent
|
||||
|
@ -7583,9 +7584,9 @@ void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat)
|
|||
{
|
||||
extern const char *The_ClassFormul[The_NUM_THEMES];
|
||||
extern const char *Txt_Figures;
|
||||
// extern const char *Txt_Shortcut;
|
||||
// extern const char *Txt_STR_LANG_ID[Txt_NUM_LANGUAGES];
|
||||
extern const char *Txt_First_access;
|
||||
extern const char *Txt_day;
|
||||
extern const char *Txt_days;
|
||||
extern const char *Txt_Calculate;
|
||||
extern const char *Txt_Clicks;
|
||||
extern const char *Txt_Courses_as_a_ROLE;
|
||||
|
@ -7604,26 +7605,6 @@ void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat)
|
|||
/***** Start table *****/
|
||||
Lay_StartRoundFrameTable10 (NULL,2,Txt_Figures);
|
||||
|
||||
/***** Shortcut to the user's profile *****/
|
||||
/*
|
||||
fprintf (Gbl.F.Out,"<tr>"
|
||||
"<td class=\"%s\""
|
||||
" style=\"text-align:right; vertical-align:middle;\">"
|
||||
"%s:"
|
||||
"</td>"
|
||||
"<td class=\"DAT\""
|
||||
" style=\"text-align:left; vertical-align:middle;\">"
|
||||
"<a href=\"%s/%s?usr=@%s\" class=\"DAT\" target=\"_blank\">"
|
||||
"%s/%s?usr=@%s"
|
||||
"</a>"
|
||||
"</td>"
|
||||
"</tr>",
|
||||
The_ClassFormul[Gbl.Prefs.Theme],
|
||||
Txt_Shortcut,
|
||||
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],UsrDat->Nickname,
|
||||
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],UsrDat->Nickname);
|
||||
*/
|
||||
|
||||
/***** First click time and number of clicks *****/
|
||||
Usr_GetUsrFigures (UsrDat->UsrCod,&UsrFigures);
|
||||
|
||||
|
@ -7640,8 +7621,13 @@ void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat)
|
|||
if (UsrFigures.FirstClickTime.Date.Year)
|
||||
{
|
||||
Dat_WriteDate (UsrFigures.FirstClickTime.Date.YYYYMMDD);
|
||||
fprintf (Gbl.F.Out," ");
|
||||
fprintf (Gbl.F.Out," ");
|
||||
Dat_WriteHourMinute (&(UsrFigures.FirstClickTime.YYYYMMDDHHMMSS[8]));
|
||||
if (UsrFigures.NumDays >= 0)
|
||||
fprintf (Gbl.F.Out," (%d %s)",
|
||||
UsrFigures.NumDays,
|
||||
(UsrFigures.NumDays == 1) ? Txt_day :
|
||||
Txt_days);
|
||||
}
|
||||
else // First click time is unknown or user never logged
|
||||
{
|
||||
|
@ -7666,7 +7652,16 @@ void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat)
|
|||
The_ClassFormul[Gbl.Prefs.Theme],
|
||||
Txt_Clicks);
|
||||
if (UsrFigures.NumClicks >= 0)
|
||||
{
|
||||
fprintf (Gbl.F.Out,"%ld",UsrFigures.NumClicks);
|
||||
if (UsrFigures.NumDays >= 0)
|
||||
{
|
||||
fprintf (Gbl.F.Out," (");
|
||||
Str_WriteFloatNum ((float) UsrFigures.NumClicks /
|
||||
(float) (UsrFigures.NumDays + 1));
|
||||
fprintf (Gbl.F.Out,"/%s)",Txt_day);
|
||||
}
|
||||
}
|
||||
else // Number of clicks is unknown
|
||||
{
|
||||
/***** Button to fetch and store number of clicks *****/
|
||||
|
@ -7752,7 +7747,16 @@ void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat)
|
|||
The_ClassFormul[Gbl.Prefs.Theme],
|
||||
Txt_Forum_posts);
|
||||
if (UsrFigures.NumForPst >= 0)
|
||||
{
|
||||
fprintf (Gbl.F.Out,"%ld",UsrFigures.NumForPst);
|
||||
if (UsrFigures.NumDays >= 0)
|
||||
{
|
||||
fprintf (Gbl.F.Out," (");
|
||||
Str_WriteFloatNum ((float) UsrFigures.NumForPst /
|
||||
(float) (UsrFigures.NumDays + 1));
|
||||
fprintf (Gbl.F.Out,"/%s)",Txt_day);
|
||||
}
|
||||
}
|
||||
else // Number of forum posts is unknown
|
||||
{
|
||||
/***** Button to fetch and store number of forum posts *****/
|
||||
|
@ -7776,7 +7780,16 @@ void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat)
|
|||
The_ClassFormul[Gbl.Prefs.Theme],
|
||||
Txt_Messages_sent);
|
||||
if (UsrFigures.NumMsgSnt >= 0)
|
||||
{
|
||||
fprintf (Gbl.F.Out,"%ld",UsrFigures.NumMsgSnt);
|
||||
if (UsrFigures.NumDays >= 0)
|
||||
{
|
||||
fprintf (Gbl.F.Out," (");
|
||||
Str_WriteFloatNum ((float) UsrFigures.NumMsgSnt /
|
||||
(float) (UsrFigures.NumDays + 1));
|
||||
fprintf (Gbl.F.Out,"/%s)",Txt_day);
|
||||
}
|
||||
}
|
||||
else // Number of clicks is unknown
|
||||
{
|
||||
/***** Button to fetch and store number of messages sent *****/
|
||||
|
@ -7806,6 +7819,7 @@ static void Usr_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures)
|
|||
|
||||
/***** Get user's code from database *****/
|
||||
sprintf (Query,"SELECT DATE_FORMAT(FirstClickTime,'%%Y%%m%%d%%H%%i%%S'),"
|
||||
"DATEDIFF(NOW(),FirstClickTime),"
|
||||
"NumClicks,NumForPst,NumMsgSnt"
|
||||
" FROM usr_figures WHERE UsrCod='%ld'",
|
||||
UsrCod);
|
||||
|
@ -7818,16 +7832,25 @@ static void Usr_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures)
|
|||
if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(UsrFigures->FirstClickTime),row[0])))
|
||||
Lay_ShowErrorAndExit ("Error when reading first click time.");
|
||||
|
||||
/* Get number of clicks (row[1]) */
|
||||
if (sscanf (row[1],"%ld",&UsrFigures->NumClicks) != 1)
|
||||
/* Get number of days since first click (row[1]) */
|
||||
if (UsrFigures->FirstClickTime.Date.Year)
|
||||
{
|
||||
if (sscanf (row[1],"%d",&UsrFigures->NumDays) != 1)
|
||||
UsrFigures->NumDays = -1;
|
||||
}
|
||||
else
|
||||
UsrFigures->NumDays = -1;
|
||||
|
||||
/* Get number of clicks (row[2]) */
|
||||
if (sscanf (row[2],"%ld",&UsrFigures->NumClicks) != 1)
|
||||
UsrFigures->NumClicks = -1L;
|
||||
|
||||
/* Get number of forum posts (row[2]) */
|
||||
if (sscanf (row[2],"%ld",&UsrFigures->NumForPst) != 1)
|
||||
/* Get number of forum posts (row[3]) */
|
||||
if (sscanf (row[3],"%ld",&UsrFigures->NumForPst) != 1)
|
||||
UsrFigures->NumForPst = -1L;
|
||||
|
||||
/* Get number of messages sent (row[3]) */
|
||||
if (sscanf (row[3],"%ld",&UsrFigures->NumMsgSnt) != 1)
|
||||
/* Get number of messages sent (row[4]) */
|
||||
if (sscanf (row[4],"%ld",&UsrFigures->NumMsgSnt) != 1)
|
||||
UsrFigures->NumMsgSnt = -1L;
|
||||
}
|
||||
else
|
||||
|
@ -8046,6 +8069,7 @@ static void Usr_GetNumMsgSntAndStoreAsUsrFigure (long UsrCod)
|
|||
static void Usr_ResetUsrFigures (struct UsrFigures *UsrFigures)
|
||||
{
|
||||
Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(UsrFigures->FirstClickTime),"00000000000000"); // unknown first click time or user never logged
|
||||
UsrFigures->NumDays = -1; // not applicable
|
||||
UsrFigures->NumClicks = -1L; // unknown number of clicks
|
||||
UsrFigures->NumForPst = -1L; // unknown number of forum posts
|
||||
UsrFigures->NumMsgSnt = -1L; // unknown number of messages sent
|
||||
|
|
Loading…
Reference in New Issue