mirror of https://github.com/acanas/swad-core.git
Version 21.31: Oct 13, 2021 New module swad_report_database for database queries related to user reports.
This commit is contained in:
parent
e0768dc58c
commit
92edadf56e
4
Makefile
4
Makefile
|
@ -75,8 +75,8 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_admin.o \
|
||||||
swad_privacy.o swad_profile.o swad_profile_database.o swad_program.o \
|
swad_privacy.o swad_profile.o swad_profile_database.o swad_program.o \
|
||||||
swad_program_database.o swad_project.o swad_project_database.o \
|
swad_program_database.o swad_project.o swad_project_database.o \
|
||||||
swad_QR.o \
|
swad_QR.o \
|
||||||
swad_record.o swad_record_database.o swad_report.o swad_role.o \
|
swad_record.o swad_record_database.o swad_report.o \
|
||||||
swad_room.o swad_RSS.o \
|
swad_report_database.o swad_role.o swad_room.o swad_RSS.o \
|
||||||
swad_scope.o swad_search.o swad_session.o swad_setting.o \
|
swad_scope.o swad_search.o swad_session.o swad_setting.o \
|
||||||
swad_statistic.o swad_string.o swad_survey.o swad_syllabus.o \
|
swad_statistic.o swad_string.o swad_survey.o swad_syllabus.o \
|
||||||
swad_system_config.o \
|
swad_system_config.o \
|
||||||
|
|
|
@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
|
||||||
|
|
||||||
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
|
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 21.30.1 (2021-10-13)"
|
#define Log_PLATFORM_VERSION "SWAD 21.31 (2021-10-13)"
|
||||||
#define CSS_FILE "swad20.45.css"
|
#define CSS_FILE "swad20.45.css"
|
||||||
#define JS_FILE "swad20.69.1.js"
|
#define JS_FILE "swad20.69.1.js"
|
||||||
/*
|
/*
|
||||||
TODO: Rename CENTRE to CENTER in help wiki.
|
TODO: Rename CENTRE to CENTER in help wiki.
|
||||||
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
|
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
|
||||||
|
|
||||||
|
Version 21.31: Oct 13, 2021 New module swad_report_database for database queries related to user reports. (319475 lines)
|
||||||
Version 21.30.1: Oct 13, 2021 Queries moved to module swad_record_database. (319411 lines)
|
Version 21.30.1: Oct 13, 2021 Queries moved to module swad_record_database. (319411 lines)
|
||||||
Version 21.30: Oct 12, 2021 New module swad_record_database for database queries related to records. (319400 lines)
|
Version 21.30: Oct 12, 2021 New module swad_record_database for database queries related to records. (319400 lines)
|
||||||
Version 21.29: Oct 11, 2021 New module swad_project_database for database queries related to projects. (319208 lines)
|
Version 21.29: Oct 11, 2021 New module swad_project_database for database queries related to projects. (319208 lines)
|
||||||
|
|
|
@ -91,20 +91,20 @@ extern struct Globals Gbl;
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prf_ShowTimeSinceFirstClick (const struct UsrData *UsrDat,
|
static void Prf_ShowTimeSinceFirstClick (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures);
|
const struct Prf_UsrFigures *UsrFigures);
|
||||||
static void Prf_ShowNumCrssWithRole (const struct UsrData *UsrDat,
|
static void Prf_ShowNumCrssWithRole (const struct UsrData *UsrDat,
|
||||||
Rol_Role_t Role);
|
Rol_Role_t Role);
|
||||||
static void Prf_ShowNumFilesCurrentlyPublished (const struct UsrData *UsrDat);
|
static void Prf_ShowNumFilesCurrentlyPublished (const struct UsrData *UsrDat);
|
||||||
static void Prf_ShowNumClicks (const struct UsrData *UsrDat,
|
static void Prf_ShowNumClicks (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures);
|
const struct Prf_UsrFigures *UsrFigures);
|
||||||
static void Prf_ShowNumFileViews (const struct UsrData *UsrDat,
|
static void Prf_ShowNumFileViews (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures);
|
const struct Prf_UsrFigures *UsrFigures);
|
||||||
static void Prf_ShowNumTimelinePubs (const struct UsrData *UsrDat,
|
static void Prf_ShowNumTimelinePubs (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures);
|
const struct Prf_UsrFigures *UsrFigures);
|
||||||
static void Prf_ShowNumForumPosts (const struct UsrData *UsrDat,
|
static void Prf_ShowNumForumPosts (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures);
|
const struct Prf_UsrFigures *UsrFigures);
|
||||||
static void Prf_ShowNumMessagesSent (const struct UsrData *UsrDat,
|
static void Prf_ShowNumMessagesSent (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures);
|
const struct Prf_UsrFigures *UsrFigures);
|
||||||
static void Prf_BeginListItem (const char *Title,const char *Icon);
|
static void Prf_BeginListItem (const char *Title,const char *Icon);
|
||||||
static void Prf_EndListItem (void);
|
static void Prf_EndListItem (void);
|
||||||
static void Prf_PutLinkCalculateFigures (const char *EncryptedUsrCod);
|
static void Prf_PutLinkCalculateFigures (const char *EncryptedUsrCod);
|
||||||
|
@ -118,7 +118,7 @@ static void Prf_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod);
|
||||||
static void Prf_GetNumForumPostsAndStoreAsUsrFigure (long UsrCod);
|
static void Prf_GetNumForumPostsAndStoreAsUsrFigure (long UsrCod);
|
||||||
static void Prf_GetNumMessagesSentAndStoreAsUsrFigure (long UsrCod);
|
static void Prf_GetNumMessagesSentAndStoreAsUsrFigure (long UsrCod);
|
||||||
|
|
||||||
static void Prf_ResetUsrFigures (struct UsrFigures *UsrFigures);
|
static void Prf_ResetUsrFigures (struct Prf_UsrFigures *UsrFigures);
|
||||||
|
|
||||||
static void Prf_GetAndShowRankingFigure (const char *FieldName);
|
static void Prf_GetAndShowRankingFigure (const char *FieldName);
|
||||||
static void Prf_ShowUsrInRanking (struct UsrData *UsrDat,unsigned Rank,bool ItsMe);
|
static void Prf_ShowUsrInRanking (struct UsrData *UsrDat,unsigned Rank,bool ItsMe);
|
||||||
|
@ -388,7 +388,7 @@ void Prf_ChangeExtendedProfileVis (void)
|
||||||
void Prf_ShowDetailsUserProfile (const struct UsrData *UsrDat)
|
void Prf_ShowDetailsUserProfile (const struct UsrData *UsrDat)
|
||||||
{
|
{
|
||||||
bool UsrIsBannedFromRanking;
|
bool UsrIsBannedFromRanking;
|
||||||
struct UsrFigures UsrFigures;
|
struct Prf_UsrFigures UsrFigures;
|
||||||
Rol_Role_t Role;
|
Rol_Role_t Role;
|
||||||
|
|
||||||
/***** Get figures *****/
|
/***** Get figures *****/
|
||||||
|
@ -451,7 +451,7 @@ void Prf_ShowDetailsUserProfile (const struct UsrData *UsrDat)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prf_ShowTimeSinceFirstClick (const struct UsrData *UsrDat,
|
static void Prf_ShowTimeSinceFirstClick (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures)
|
const struct Prf_UsrFigures *UsrFigures)
|
||||||
{
|
{
|
||||||
extern const char *Txt_TIME_Since;
|
extern const char *Txt_TIME_Since;
|
||||||
extern const char *Txt_year;
|
extern const char *Txt_year;
|
||||||
|
@ -580,7 +580,7 @@ static void Prf_ShowNumFilesCurrentlyPublished (const struct UsrData *UsrDat)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prf_ShowNumClicks (const struct UsrData *UsrDat,
|
static void Prf_ShowNumClicks (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures)
|
const struct Prf_UsrFigures *UsrFigures)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Clicks;
|
extern const char *Txt_Clicks;
|
||||||
extern const char *Txt_clicks;
|
extern const char *Txt_clicks;
|
||||||
|
@ -618,7 +618,7 @@ static void Prf_ShowNumClicks (const struct UsrData *UsrDat,
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prf_ShowNumFileViews (const struct UsrData *UsrDat,
|
static void Prf_ShowNumFileViews (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures)
|
const struct Prf_UsrFigures *UsrFigures)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Downloads;
|
extern const char *Txt_Downloads;
|
||||||
extern const char *Txt_download;
|
extern const char *Txt_download;
|
||||||
|
@ -655,7 +655,7 @@ static void Prf_ShowNumFileViews (const struct UsrData *UsrDat,
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prf_ShowNumTimelinePubs (const struct UsrData *UsrDat,
|
static void Prf_ShowNumTimelinePubs (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures)
|
const struct Prf_UsrFigures *UsrFigures)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Timeline;
|
extern const char *Txt_Timeline;
|
||||||
extern const char *Txt_TIMELINE_post;
|
extern const char *Txt_TIMELINE_post;
|
||||||
|
@ -692,7 +692,7 @@ static void Prf_ShowNumTimelinePubs (const struct UsrData *UsrDat,
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prf_ShowNumForumPosts (const struct UsrData *UsrDat,
|
static void Prf_ShowNumForumPosts (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures)
|
const struct Prf_UsrFigures *UsrFigures)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Forums;
|
extern const char *Txt_Forums;
|
||||||
extern const char *Txt_FORUM_post;
|
extern const char *Txt_FORUM_post;
|
||||||
|
@ -729,7 +729,7 @@ static void Prf_ShowNumForumPosts (const struct UsrData *UsrDat,
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prf_ShowNumMessagesSent (const struct UsrData *UsrDat,
|
static void Prf_ShowNumMessagesSent (const struct UsrData *UsrDat,
|
||||||
const struct UsrFigures *UsrFigures)
|
const struct Prf_UsrFigures *UsrFigures)
|
||||||
{
|
{
|
||||||
extern const char *Txt_Messages;
|
extern const char *Txt_Messages;
|
||||||
extern const char *Txt_message;
|
extern const char *Txt_message;
|
||||||
|
@ -801,7 +801,7 @@ static void Prf_PutLinkCalculateFigures (const char *EncryptedUsrCod)
|
||||||
/********************** Select values on user's figures **********************/
|
/********************** Select values on user's figures **********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Prf_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures)
|
void Prf_GetUsrFigures (long UsrCod,struct Prf_UsrFigures *UsrFigures)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
|
@ -882,7 +882,7 @@ static void Prf_ShowRanking (unsigned Rank,unsigned NumUsrs)
|
||||||
|
|
||||||
void Prf_CalculateFigures (void)
|
void Prf_CalculateFigures (void)
|
||||||
{
|
{
|
||||||
struct UsrFigures UsrFigures;
|
struct Prf_UsrFigures UsrFigures;
|
||||||
|
|
||||||
/***** Get user's code *****/
|
/***** Get user's code *****/
|
||||||
Usr_GetParamOtherUsrCodEncryptedAndGetListIDs ();
|
Usr_GetParamOtherUsrCodEncryptedAndGetListIDs ();
|
||||||
|
@ -900,7 +900,7 @@ void Prf_CalculateFigures (void)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
// Return true if any figure has been calculated and stored
|
// Return true if any figure has been calculated and stored
|
||||||
|
|
||||||
bool Prf_GetAndStoreAllUsrFigures (long UsrCod,struct UsrFigures *UsrFigures)
|
bool Prf_GetAndStoreAllUsrFigures (long UsrCod,struct Prf_UsrFigures *UsrFigures)
|
||||||
{
|
{
|
||||||
bool UsrFiguresModified = false;
|
bool UsrFiguresModified = false;
|
||||||
|
|
||||||
|
@ -952,7 +952,7 @@ static void Prf_GetFirstClickFromLogAndStoreAsUsrFigure (long UsrCod)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_res;
|
MYSQL_RES *mysql_res;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
struct UsrFigures UsrFigures;
|
struct Prf_UsrFigures UsrFigures;
|
||||||
|
|
||||||
if (Usr_ChkIfUsrCodExists (UsrCod))
|
if (Usr_ChkIfUsrCodExists (UsrCod))
|
||||||
{
|
{
|
||||||
|
@ -986,7 +986,7 @@ static void Prf_GetFirstClickFromLogAndStoreAsUsrFigure (long UsrCod)
|
||||||
|
|
||||||
static void Prf_GetNumClicksAndStoreAsUsrFigure (long UsrCod)
|
static void Prf_GetNumClicksAndStoreAsUsrFigure (long UsrCod)
|
||||||
{
|
{
|
||||||
struct UsrFigures UsrFigures;
|
struct Prf_UsrFigures UsrFigures;
|
||||||
|
|
||||||
if (Usr_ChkIfUsrCodExists (UsrCod))
|
if (Usr_ChkIfUsrCodExists (UsrCod))
|
||||||
{
|
{
|
||||||
|
@ -1010,7 +1010,7 @@ static void Prf_GetNumClicksAndStoreAsUsrFigure (long UsrCod)
|
||||||
|
|
||||||
static void Prf_GetNumTimelinePubsAndStoreAsUsrFigure (long UsrCod)
|
static void Prf_GetNumTimelinePubsAndStoreAsUsrFigure (long UsrCod)
|
||||||
{
|
{
|
||||||
struct UsrFigures UsrFigures;
|
struct Prf_UsrFigures UsrFigures;
|
||||||
|
|
||||||
if (Usr_ChkIfUsrCodExists (UsrCod))
|
if (Usr_ChkIfUsrCodExists (UsrCod))
|
||||||
{
|
{
|
||||||
|
@ -1034,7 +1034,7 @@ static void Prf_GetNumTimelinePubsAndStoreAsUsrFigure (long UsrCod)
|
||||||
|
|
||||||
static void Prf_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod)
|
static void Prf_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod)
|
||||||
{
|
{
|
||||||
struct UsrFigures UsrFigures;
|
struct Prf_UsrFigures UsrFigures;
|
||||||
|
|
||||||
if (Usr_ChkIfUsrCodExists (UsrCod))
|
if (Usr_ChkIfUsrCodExists (UsrCod))
|
||||||
{
|
{
|
||||||
|
@ -1058,7 +1058,7 @@ static void Prf_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod)
|
||||||
|
|
||||||
static void Prf_GetNumForumPostsAndStoreAsUsrFigure (long UsrCod)
|
static void Prf_GetNumForumPostsAndStoreAsUsrFigure (long UsrCod)
|
||||||
{
|
{
|
||||||
struct UsrFigures UsrFigures;
|
struct Prf_UsrFigures UsrFigures;
|
||||||
|
|
||||||
if (Usr_ChkIfUsrCodExists (UsrCod))
|
if (Usr_ChkIfUsrCodExists (UsrCod))
|
||||||
{
|
{
|
||||||
|
@ -1082,7 +1082,7 @@ static void Prf_GetNumForumPostsAndStoreAsUsrFigure (long UsrCod)
|
||||||
|
|
||||||
static void Prf_GetNumMessagesSentAndStoreAsUsrFigure (long UsrCod)
|
static void Prf_GetNumMessagesSentAndStoreAsUsrFigure (long UsrCod)
|
||||||
{
|
{
|
||||||
struct UsrFigures UsrFigures;
|
struct Prf_UsrFigures UsrFigures;
|
||||||
|
|
||||||
if (Usr_ChkIfUsrCodExists (UsrCod))
|
if (Usr_ChkIfUsrCodExists (UsrCod))
|
||||||
{
|
{
|
||||||
|
@ -1106,7 +1106,7 @@ static void Prf_GetNumMessagesSentAndStoreAsUsrFigure (long UsrCod)
|
||||||
|
|
||||||
void Prf_CreateNewUsrFigures (long UsrCod,bool CreatingMyOwnAccount)
|
void Prf_CreateNewUsrFigures (long UsrCod,bool CreatingMyOwnAccount)
|
||||||
{
|
{
|
||||||
struct UsrFigures UsrFigures;
|
struct Prf_UsrFigures UsrFigures;
|
||||||
|
|
||||||
/***** Reset user's figures *****/
|
/***** Reset user's figures *****/
|
||||||
Prf_ResetUsrFigures (&UsrFigures);
|
Prf_ResetUsrFigures (&UsrFigures);
|
||||||
|
@ -1124,7 +1124,7 @@ void Prf_CreateNewUsrFigures (long UsrCod,bool CreatingMyOwnAccount)
|
||||||
/********************** Reset values of user's figures ***********************/
|
/********************** Reset values of user's figures ***********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void Prf_ResetUsrFigures (struct UsrFigures *UsrFigures)
|
static void Prf_ResetUsrFigures (struct Prf_UsrFigures *UsrFigures)
|
||||||
{
|
{
|
||||||
UsrFigures->FirstClickTimeUTC = (time_t) 0; // unknown first click time or user never logged
|
UsrFigures->FirstClickTimeUTC = (time_t) 0; // unknown first click time or user never logged
|
||||||
UsrFigures->NumDays = -1; // not applicable
|
UsrFigures->NumDays = -1; // not applicable
|
||||||
|
|
|
@ -27,6 +27,10 @@
|
||||||
/********************************** Headers **********************************/
|
/********************************** Headers **********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include <time.h> // For time
|
||||||
|
|
||||||
|
#include "swad_user.h"
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -35,7 +39,7 @@
|
||||||
/******************************** Public types *******************************/
|
/******************************** Public types *******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
struct UsrFigures
|
struct Prf_UsrFigures
|
||||||
{
|
{
|
||||||
time_t FirstClickTimeUTC; // 0 ==> unknown first click time of user never logged
|
time_t FirstClickTimeUTC; // 0 ==> unknown first click time of user never logged
|
||||||
int NumDays; // -1 ==> not applicable
|
int NumDays; // -1 ==> not applicable
|
||||||
|
@ -64,9 +68,9 @@ void Prf_ChangeBasicProfileVis (void);
|
||||||
void Prf_ChangeExtendedProfileVis (void);
|
void Prf_ChangeExtendedProfileVis (void);
|
||||||
|
|
||||||
void Prf_ShowDetailsUserProfile (const struct UsrData *UsrDat);
|
void Prf_ShowDetailsUserProfile (const struct UsrData *UsrDat);
|
||||||
void Prf_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures);
|
void Prf_GetUsrFigures (long UsrCod,struct Prf_UsrFigures *UsrFigures);
|
||||||
void Prf_CalculateFigures (void);
|
void Prf_CalculateFigures (void);
|
||||||
bool Prf_GetAndStoreAllUsrFigures (long UsrCod,struct UsrFigures *UsrFigures);
|
bool Prf_GetAndStoreAllUsrFigures (long UsrCod,struct Prf_UsrFigures *UsrFigures);
|
||||||
|
|
||||||
void Prf_CreateNewUsrFigures (long UsrCod,bool CreatingMyOwnAccount);
|
void Prf_CreateNewUsrFigures (long UsrCod,bool CreatingMyOwnAccount);
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ extern struct Globals Gbl;
|
||||||
/**************************** Create user's figures **************************/
|
/**************************** Create user's figures **************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Prf_DB_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures,
|
void Prf_DB_CreateUsrFigures (long UsrCod,const struct Prf_UsrFigures *UsrFigures,
|
||||||
bool CreatingMyOwnAccount)
|
bool CreatingMyOwnAccount)
|
||||||
{
|
{
|
||||||
char SubQueryFirstClickTime[64];
|
char SubQueryFirstClickTime[64];
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
/****************************** Public prototypes ****************************/
|
/****************************** Public prototypes ****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Prf_DB_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures,
|
void Prf_DB_CreateUsrFigures (long UsrCod,const struct Prf_UsrFigures *UsrFigures,
|
||||||
bool CreatingMyOwnAccount);
|
bool CreatingMyOwnAccount);
|
||||||
void Prf_DB_UpdateFirstClickTimeUsr (long UsrCod,time_t FirstClickTimeUTC);
|
void Prf_DB_UpdateFirstClickTimeUsr (long UsrCod,time_t FirstClickTimeUTC);
|
||||||
void Prf_DB_UpdateNumClicksUsr (long UsrCod,int NumClicks);
|
void Prf_DB_UpdateNumClicksUsr (long UsrCod,int NumClicks);
|
||||||
|
|
|
@ -25,49 +25,13 @@
|
||||||
/********************************* Headers ***********************************/
|
/********************************* Headers ***********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
// #define _GNU_SOURCE // For asprintf
|
|
||||||
// #include <linux/limits.h> // For PATH_MAX
|
|
||||||
// #include <stddef.h> // For NULL
|
|
||||||
// #include <stdio.h> // For asprintf
|
|
||||||
// #include <stdlib.h> // For calloc
|
|
||||||
// #include <string.h>
|
|
||||||
|
|
||||||
// #include "swad_account.h"
|
|
||||||
// #include "swad_account_database.h"
|
|
||||||
// #include "swad_action.h"
|
|
||||||
// #include "swad_box.h"
|
|
||||||
// #include "swad_config.h"
|
|
||||||
#include "swad_database.h"
|
#include "swad_database.h"
|
||||||
// #include "swad_department.h"
|
|
||||||
// #include "swad_enrolment_database.h"
|
|
||||||
// #include "swad_error.h"
|
|
||||||
// #include "swad_follow_database.h"
|
|
||||||
// #include "swad_form.h"
|
|
||||||
// #include "swad_global.h"
|
|
||||||
// #include "swad_hierarchy_level.h"
|
|
||||||
// #include "swad_HTML.h"
|
|
||||||
// #include "swad_ID.h"
|
|
||||||
// #include "swad_logo.h"
|
|
||||||
// #include "swad_message.h"
|
|
||||||
// #include "swad_message_database.h"
|
|
||||||
// #include "swad_network.h"
|
|
||||||
// #include "swad_parameter.h"
|
|
||||||
// #include "swad_photo.h"
|
|
||||||
// #include "swad_privacy.h"
|
|
||||||
// #include "swad_QR.h"
|
|
||||||
// #include "swad_record.h"
|
|
||||||
#include "swad_record_database.h"
|
#include "swad_record_database.h"
|
||||||
// #include "swad_role.h"
|
|
||||||
// #include "swad_setting.h"
|
|
||||||
// #include "swad_timetable.h"
|
|
||||||
// #include "swad_user.h"
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************** External global variables from others modules ****************/
|
/************** External global variables from others modules ****************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
// extern struct Globals Gbl;
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************************** Private constants *****************************/
|
/***************************** Private constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -27,10 +27,7 @@
|
||||||
/********************************* Headers ***********************************/
|
/********************************* Headers ***********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
// #include <mysql/mysql.h> // To access MySQL databases
|
|
||||||
|
|
||||||
#include "swad_record.h"
|
#include "swad_record.h"
|
||||||
// #include "swad_user.h"
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************************** Public constants ******************************/
|
/***************************** Public constants ******************************/
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include "swad_HTML.h"
|
#include "swad_HTML.h"
|
||||||
#include "swad_ID.h"
|
#include "swad_ID.h"
|
||||||
#include "swad_profile.h"
|
#include "swad_profile.h"
|
||||||
|
#include "swad_report_database.h"
|
||||||
#include "swad_tab.h"
|
#include "swad_tab.h"
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -67,32 +68,6 @@
|
||||||
/****************************** Private types ********************************/
|
/****************************** Private types ********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
struct Rep_CurrentTimeUTC
|
|
||||||
{
|
|
||||||
char StrDate[3 * (Cns_MAX_DECIMAL_DIGITS_INT + 1)]; // Example: 2016-10-02
|
|
||||||
char StrTime[3 * (Cns_MAX_DECIMAL_DIGITS_INT + 1)]; // Example: 19:03:49
|
|
||||||
unsigned Date; // Example: 20161002
|
|
||||||
unsigned Time; // Example: 190349
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Rep_Hits
|
|
||||||
{
|
|
||||||
unsigned long Num;
|
|
||||||
unsigned long Max;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Rep_Report
|
|
||||||
{
|
|
||||||
struct UsrFigures UsrFigures;
|
|
||||||
struct tm tm_FirstClickTime;
|
|
||||||
struct tm tm_CurrentTime;
|
|
||||||
struct Rep_CurrentTimeUTC CurrentTimeUTC;
|
|
||||||
struct Rep_Hits Hits;
|
|
||||||
unsigned long MaxHitsPerYear;
|
|
||||||
char FilenameReport[NAME_MAX + 1];
|
|
||||||
char Permalink[Cns_MAX_BYTES_WWW + 1];
|
|
||||||
};
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************** External global variables from others modules ****************/
|
/************** External global variables from others modules ****************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -114,7 +89,6 @@ static void Rep_TitleReport (struct Rep_CurrentTimeUTC *CurrentTimeUTC);
|
||||||
static void Rep_GetCurrentDateTimeUTC (struct Rep_Report *Report);
|
static void Rep_GetCurrentDateTimeUTC (struct Rep_Report *Report);
|
||||||
|
|
||||||
static void Rep_CreateNewReportFile (struct Rep_Report *Report);
|
static void Rep_CreateNewReportFile (struct Rep_Report *Report);
|
||||||
static void Rep_DB_CreateNewReport (const struct Rep_Report *Report);
|
|
||||||
static void Rep_WriteHeader (const struct Rep_Report *Report);
|
static void Rep_WriteHeader (const struct Rep_Report *Report);
|
||||||
static void Rep_WriteSectionPlatform (void);
|
static void Rep_WriteSectionPlatform (void);
|
||||||
static void Rep_WriteSectionUsrInfo (void);
|
static void Rep_WriteSectionUsrInfo (void);
|
||||||
|
@ -145,7 +119,6 @@ static void Rep_DrawBarNumHits (unsigned long HitsNum,unsigned long HitsMax,
|
||||||
static void Rep_WriteDouble (double Num);
|
static void Rep_WriteDouble (double Num);
|
||||||
|
|
||||||
static void Rep_RemoveUsrReportsFiles (long UsrCod);
|
static void Rep_RemoveUsrReportsFiles (long UsrCod);
|
||||||
static void Rep_DB_RemoveUsrReports (long UsrCod);
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******* Request my usage report (report on my use of the platform) **********/
|
/******* Request my usage report (report on my use of the platform) **********/
|
||||||
|
@ -207,7 +180,8 @@ static void Rep_CreateMyUsageReport (struct Rep_Report *Report)
|
||||||
Rep_CreateNewReportFile (Report);
|
Rep_CreateNewReportFile (Report);
|
||||||
|
|
||||||
/***** Store report entry into database *****/
|
/***** Store report entry into database *****/
|
||||||
Rep_DB_CreateNewReport (Report);
|
Rep_DB_CreateNewReport (Gbl.Usrs.Me.UsrDat.UsrCod,Report,
|
||||||
|
Gbl.UniqueNameEncrypted);
|
||||||
|
|
||||||
/***** Begin file *****/
|
/***** Begin file *****/
|
||||||
Lay_BeginHTMLFile (Gbl.F.Rep,Report->FilenameReport);
|
Lay_BeginHTMLFile (Gbl.F.Rep,Report->FilenameReport);
|
||||||
|
@ -416,34 +390,6 @@ static void Rep_CreateNewReportFile (struct Rep_Report *Report)
|
||||||
Str_Copy (Report->Permalink,Permalink,sizeof (Report->Permalink) - 1);
|
Str_Copy (Report->Permalink,Permalink,sizeof (Report->Permalink) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/************** Insert a new user's usage report into database ***************/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Rep_DB_CreateNewReport (const struct Rep_Report *Report)
|
|
||||||
{
|
|
||||||
/***** Insert a new user's usage report into database *****/
|
|
||||||
DB_QueryINSERT ("can not create new user's usage report",
|
|
||||||
"INSERT INTO usr_reports"
|
|
||||||
" (UsrCod,ReportTimeUTC,"
|
|
||||||
"UniqueDirL,UniqueDirR,Filename,Permalink)"
|
|
||||||
" VALUES"
|
|
||||||
" (%ld,'%04d-%02d-%02d %02d:%02d:%02d',"
|
|
||||||
"'%c%c','%s','%s','%s')",
|
|
||||||
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
||||||
1900 + Report->tm_CurrentTime.tm_year, // year
|
|
||||||
1 + Report->tm_CurrentTime.tm_mon, // month
|
|
||||||
Report->tm_CurrentTime.tm_mday, // day of the month
|
|
||||||
Report->tm_CurrentTime.tm_hour, // hours
|
|
||||||
Report->tm_CurrentTime.tm_min, // minutes
|
|
||||||
Report->tm_CurrentTime.tm_sec, // seconds
|
|
||||||
Gbl.UniqueNameEncrypted[0], // 2 leftmost chars from a unique 43 chars base64url codified from a unique SHA-256 string
|
|
||||||
Gbl.UniqueNameEncrypted[1],
|
|
||||||
&Gbl.UniqueNameEncrypted[2], // 41 rightmost chars from a unique 43 chars base64url codified from a unique SHA-256 string
|
|
||||||
Report->FilenameReport,
|
|
||||||
Report->Permalink);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************** Write header of user's usage report ********************/
|
/******************** Write header of user's usage report ********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1457,15 +1403,3 @@ static void Rep_RemoveUsrReportsFiles (long UsrCod)
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
DB_FreeMySQLResult (&mysql_res);
|
DB_FreeMySQLResult (&mysql_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
/********** Remove all user's usage reports of a user from database **********/
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
static void Rep_DB_RemoveUsrReports (long UsrCod)
|
|
||||||
{
|
|
||||||
DB_QueryDELETE ("can not remove user's usage reports",
|
|
||||||
"DELETE FROM usr_reports"
|
|
||||||
" WHERE UsrCod=%ld",
|
|
||||||
UsrCod);
|
|
||||||
}
|
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
/********************************** Headers **********************************/
|
/********************************** Headers **********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include "swad_constant.h"
|
||||||
|
#include "swad_profile.h"
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -35,6 +38,32 @@
|
||||||
/******************************** Public types *******************************/
|
/******************************** Public types *******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
struct Rep_CurrentTimeUTC
|
||||||
|
{
|
||||||
|
char StrDate[3 * (Cns_MAX_DECIMAL_DIGITS_INT + 1)]; // Example: 2016-10-02
|
||||||
|
char StrTime[3 * (Cns_MAX_DECIMAL_DIGITS_INT + 1)]; // Example: 19:03:49
|
||||||
|
unsigned Date; // Example: 20161002
|
||||||
|
unsigned Time; // Example: 190349
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Rep_Hits
|
||||||
|
{
|
||||||
|
unsigned long Num;
|
||||||
|
unsigned long Max;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Rep_Report
|
||||||
|
{
|
||||||
|
struct Prf_UsrFigures UsrFigures;
|
||||||
|
struct tm tm_FirstClickTime;
|
||||||
|
struct tm tm_CurrentTime;
|
||||||
|
struct Rep_CurrentTimeUTC CurrentTimeUTC;
|
||||||
|
struct Rep_Hits Hits;
|
||||||
|
unsigned long MaxHitsPerYear;
|
||||||
|
char FilenameReport[NAME_MAX + 1];
|
||||||
|
char Permalink[Cns_MAX_BYTES_WWW + 1];
|
||||||
|
};
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****************************** Public prototypes ****************************/
|
/****************************** Public prototypes ****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
// swad_report_database.c: report on my use of the platform, operations with database
|
||||||
|
|
||||||
|
/*
|
||||||
|
SWAD (Shared Workspace At a Distance),
|
||||||
|
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-2021 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 3 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*********************************** Headers *********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
// #include <stdlib.h> // For free
|
||||||
|
// #include <sys/stat.h> // For mkdir
|
||||||
|
// #include <sys/types.h> // For mkdir
|
||||||
|
|
||||||
|
// #include "swad_box.h"
|
||||||
|
// #include "swad_browser_database.h"
|
||||||
|
#include "swad_database.h"
|
||||||
|
// #include "swad_error.h"
|
||||||
|
// #include "swad_form.h"
|
||||||
|
// #include "swad_global.h"
|
||||||
|
// #include "swad_hierarchy_level.h"
|
||||||
|
// #include "swad_HTML.h"
|
||||||
|
// #include "swad_ID.h"
|
||||||
|
// #include "swad_profile.h"
|
||||||
|
#include "swad_report.h"
|
||||||
|
#include "swad_report_database.h"
|
||||||
|
// #include "swad_tab.h"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************************** Public constants *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************************** Private constants *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************************** Private types ********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************** External global variables from others modules ****************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
// extern struct Globals Gbl;
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************* Private global variables **************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/***************************** Private prototypes ****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************** Insert a new user's usage report into database ***************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Rep_DB_CreateNewReport (long UsrCod,const struct Rep_Report *Report,
|
||||||
|
const char UniqueNameEncrypted[Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1])
|
||||||
|
{
|
||||||
|
/***** Insert a new user's usage report into database *****/
|
||||||
|
DB_QueryINSERT ("can not create new user's usage report",
|
||||||
|
"INSERT INTO usr_reports"
|
||||||
|
" (UsrCod,ReportTimeUTC,"
|
||||||
|
"UniqueDirL,UniqueDirR,Filename,Permalink)"
|
||||||
|
" VALUES"
|
||||||
|
" (%ld,'%04d-%02d-%02d %02d:%02d:%02d',"
|
||||||
|
"'%c%c','%s','%s','%s')",
|
||||||
|
UsrCod,
|
||||||
|
1900 + Report->tm_CurrentTime.tm_year, // year
|
||||||
|
1 + Report->tm_CurrentTime.tm_mon, // month
|
||||||
|
Report->tm_CurrentTime.tm_mday, // day of the month
|
||||||
|
Report->tm_CurrentTime.tm_hour, // hours
|
||||||
|
Report->tm_CurrentTime.tm_min, // minutes
|
||||||
|
Report->tm_CurrentTime.tm_sec, // seconds
|
||||||
|
UniqueNameEncrypted[0], // 2 leftmost chars from a unique 43 chars base64url codified from a unique SHA-256 string
|
||||||
|
UniqueNameEncrypted[1],
|
||||||
|
&UniqueNameEncrypted[2], // 41 rightmost chars from a unique 43 chars base64url codified from a unique SHA-256 string
|
||||||
|
Report->FilenameReport,
|
||||||
|
Report->Permalink);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********** Remove all user's usage reports of a user from database **********/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Rep_DB_RemoveUsrReports (long UsrCod)
|
||||||
|
{
|
||||||
|
DB_QueryDELETE ("can not remove user's usage reports",
|
||||||
|
"DELETE FROM usr_reports"
|
||||||
|
" WHERE UsrCod=%ld",
|
||||||
|
UsrCod);
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
// swad_report_database.h: report on my use of the platform, operations with database
|
||||||
|
|
||||||
|
#ifndef _SWAD_REP_DB
|
||||||
|
#define _SWAD_REP_DB
|
||||||
|
/*
|
||||||
|
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-2021 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************************** Headers **********************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include "swad_cryptography.h"
|
||||||
|
#include "swad_report.h"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************************** Public constants *****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/******************************** Public types *******************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/****************************** Public prototypes ****************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void Rep_DB_CreateNewReport (long UsrCod,const struct Rep_Report *Report,
|
||||||
|
const char UniqueNameEncrypted[Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 + 1]);
|
||||||
|
|
||||||
|
void Rep_DB_RemoveUsrReports (long UsrCod);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue