From 7953f585a152fdec98284df1b6255d45f4b17973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Sat, 14 Mar 2015 17:39:04 +0100 Subject: [PATCH] Version 14.92 --- Makefile | 3 +- css/swad_mobile.css | 6 +- swad_account.c | 3 +- swad_action.c | 45 +- swad_changelog.h | 10 +- swad_country.c | 4 +- swad_file_browser.c | 3 +- swad_forum.c | 6 +- swad_icon.c | 2 +- swad_layout.c | 10 +- swad_menu.c | 2 +- swad_message.c | 3 +- swad_network.c | 54 ++- swad_network.h | 2 +- swad_parameter.c | 4 +- swad_preference.c | 72 +-- swad_preference.h | 36 +- swad_profile.c | 1111 +++++++++++++++++++++++++++++++++++++++++++ swad_profile.h | 57 +++ swad_profile.o | Bin 0 -> 28096 bytes swad_record.c | 69 +-- swad_statistic.c | 3 +- swad_text.c | 23 +- swad_theme.c | 2 +- swad_user.c | 1039 +--------------------------------------- swad_user.h | 16 +- 26 files changed, 1353 insertions(+), 1232 deletions(-) create mode 100644 swad_profile.c create mode 100644 swad_profile.h create mode 100644 swad_profile.o diff --git a/Makefile b/Makefile index c38beb6e..889fb96f 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,8 @@ OBJS = swad_account.o swad_action.o swad_announcement.o swad_assignment.o swad_a swad_layout.o swad_link.o swad_logo.o \ swad_mail.o swad_main.o swad_mark.o swad_menu.o swad_message.o \ swad_network.o swad_nickname.o swad_notice.o swad_notification.o \ - swad_pagination.o swad_parameter.o swad_password.o swad_photo.o swad_place.o swad_plugin.o swad_preference.o swad_privacy.o \ + swad_pagination.o swad_parameter.o swad_password.o swad_photo.o \ + swad_place.o swad_plugin.o swad_preference.o swad_profile.o swad_privacy.o \ swad_QR.o \ swad_record.o swad_role.o swad_RSS.o \ swad_scope.o swad_search.o swad_session.o swad_setup.o swad_statistic.o swad_string.o swad_survey.o swad_syllabus.o \ diff --git a/css/swad_mobile.css b/css/swad_mobile.css index 4b2c63bd..5ccaa737 100644 --- a/css/swad_mobile.css +++ b/css/swad_mobile.css @@ -235,7 +235,7 @@ p {margin:0;} .FRAME10 { margin:4px 0; - padding:10px 0; + padding:0; background-color:white; border-radius:8px; box-shadow:1px 1px 1px #CCC; @@ -246,7 +246,7 @@ p {margin:0;} .FRAME10_SHADOW { margin:4px 0 14px 0; - padding:10px 0; + padding:0; background-color:rgba(255,255,255,0.95); border-width:1px; border-style:solid; @@ -259,7 +259,7 @@ p {margin:0;} } .TABLE10 { - padding:0 10px; + padding:10px; width:100%; } .TIT_TBL_10 diff --git a/swad_account.c b/swad_account.c index 6898dcc4..8196c47f 100644 --- a/swad_account.c +++ b/swad_account.c @@ -35,6 +35,7 @@ #include "swad_ID.h" #include "swad_notification.h" #include "swad_parameter.h" +#include "swad_profile.h" /*****************************************************************************/ /****************************** Public constants *****************************/ @@ -741,7 +742,7 @@ void Acc_CompletelyEliminateAccount (struct UsrData *UsrDat, DB_QueryDELETE (Query,"can not remove sessions of a user"); /***** Remove user's figures *****/ - Usr_RemoveUsrFigures (UsrDat->UsrCod); + Prf_RemoveUsrFigures (UsrDat->UsrCod); /***** Remove the user from the list of users without photo *****/ Pho_RemoveUsrFromTableClicksWithoutPhoto (UsrDat->UsrCod); diff --git a/swad_action.c b/swad_action.c index 5016b80f..86dda8ee 100644 --- a/swad_action.c +++ b/swad_action.c @@ -56,6 +56,7 @@ #include "swad_password.h" #include "swad_photo.h" #include "swad_preference.h" +#include "swad_profile.h" #include "swad_QR.h" #include "swad_search.h" #include "swad_setup.h" @@ -2217,7 +2218,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActSeeSignUpReq */{1057, 7,TabUsr,ActSeeSignUpReq ,0x1F0,0x1F0,0x1F0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ShowEnrollmentRequests ,"enrollmentrequest" }, /* ActReqMdfSevUsr */{ 797, 8,TabUsr,ActReqMdfSevUsr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_ReqAdminUsrs ,"configs" }, /* ActLstCon */{ 995, 9,TabUsr,ActLstCon ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Con_ShowConnectedUsrs ,"userplugged" }, - /* ActReqPubPrf */{1401,10,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_RequestUserProfile ,"prf" }, + /* ActReqPubPrf */{1401,10,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_RequestUserProfile ,"prf" }, // Actions not in menu: /* ActChgGrp */{ 118,-1,TabUsr,ActReqSelGrp ,0x118,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Grp_ChangeMyGrpsAndShowChanges ,NULL}, @@ -2329,12 +2330,12 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActReqRemOldUsr */{ 590,-1,TabUsr,ActReqMdfSevUsr ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_AskRemoveOldUsrs ,NULL}, /* ActRemOldUsr */{ 773,-1,TabUsr,ActReqMdfSevUsr ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Enr_RemoveOldUsrs ,NULL}, - /* ActSeePubPrf */{1402,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_GetUsrCodAndShowUserProfile,NULL}, - /* ActCal1stClkTim */{1405,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_CalculateFirstClickTime ,NULL}, - /* ActCalNumClk */{1406,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_CalculateNumClicks ,NULL}, - /* ActCalNumFilVie */{1409,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_CalculateNumFileViews ,NULL}, - /* ActCalNumForPst */{1408,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_CalculateNumForPst ,NULL}, - /* ActCalNumMsgSnt */{1407,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_CalculateNumMsgSnt ,NULL}, + /* ActSeePubPrf */{1402,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_GetUsrCodAndShowUserProfile,NULL}, + /* ActCal1stClkTim */{1405,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_CalculateFirstClickTime ,NULL}, + /* ActCalNumClk */{1406,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_CalculateNumClicks ,NULL}, + /* ActCalNumFilVie */{1409,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_CalculateNumFileViews ,NULL}, + /* ActCalNumForPst */{1408,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_CalculateNumForPst ,NULL}, + /* ActCalNumMsgSnt */{1407,-1,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_CalculateNumMsgSnt ,NULL}, // TabMsg ****************************************************************** // Actions in menu: @@ -2568,7 +2569,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActSeeMyTimTbl */{ 408, 2,TabPrf,ActSeeMyTimTbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,TT_ShowClassTimeTable ,"clock" }, /* ActFrmUsrAcc */{ 36, 3,TabPrf,ActFrmUsrAcc ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Acc_ShowFormAccount ,"arroba" }, /* ActReqEdiRecCom */{ 285, 4,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Rec_ShowFormMyCommRecord ,"card" }, - /* ActEdiPrf */{ 673, 5,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_EditPrefs ,"heart" }, + /* ActEdiPrf */{ 673, 5,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pre_EditPrefs ,"heart" }, /* ActAdmBrf */{ 23, 6,TabPrf,ActAdmBrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Brw_ShowFileBrowserOrWorks ,"pendrive" }, /* ActMFUAct */{ 993, 7,TabPrf,ActMFUAct ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Act_ShowMyMFUActions ,"star" }, @@ -2607,7 +2608,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActEdiPri */{1403,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pri_EditMyPrivacy ,NULL}, /* ActChgPriPho */{ 774,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_ChangePhotoVisibility ,NULL}, - /* ActChgPriPrf */{1404,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ChangeProfileVisibility ,NULL}, + /* ActChgPriPrf */{1404,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_ChangeProfileVisibility ,NULL}, /* ActReqEdiMyIns */{1165,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Rec_ShowFormMyInsCtrDpt ,NULL}, /* ActChgCtyMyIns */{1166,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Rec_ChgCountryOfMyInstitution ,NULL}, @@ -2620,20 +2621,20 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActReqEdiMyNet */{1172,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Net_ShowFormMyWebsAndSocialNets,NULL}, /* ActChgMyNet */{1173,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Net_UpdateMyWebsAndSocialNets ,NULL}, - /* ActChgLay */{ 672,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Lay_ChangeLayout ,Prf_EditPrefs ,NULL}, - /* ActChgThe */{ 841,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,The_ChangeTheme ,Prf_EditPrefs ,NULL}, - /* ActReqChgLan */{ 992,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Prf_AskChangeLanguage ,NULL}, - /* ActChgLan */{ 654,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Prf_ChangeLanguage ,Prf_EditPrefs ,NULL}, - /* ActChgCol */{ 674,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Prf_ChangeSideCols ,Prf_EditPrefs ,NULL}, - /* ActHidLftCol */{ 668,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Prf_HideLeftCol ,Prf_EditPrefs ,NULL}, - /* ActHidRgtCol */{ 669,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Prf_HideRightCol ,Prf_EditPrefs ,NULL}, - /* ActShoLftCol */{ 670,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Prf_ShowLeftCol ,Prf_EditPrefs ,NULL}, - /* ActShoRgtCol */{ 671,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Prf_ShowRightCol ,Prf_EditPrefs ,NULL}, - /* ActChgIco */{1092,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Ico_ChangeIconSet ,Prf_EditPrefs ,NULL}, - /* ActChgMnu */{1243,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Mnu_ChangeMenu ,Prf_EditPrefs ,NULL}, - /* ActChgNtfPrf */{ 775,-1,TabPrf,ActEdiPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Ntf_ChangeNotifyEvents ,Prf_EditPrefs ,NULL}, + /* ActChgLay */{ 672,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Lay_ChangeLayout ,Pre_EditPrefs ,NULL}, + /* ActChgThe */{ 841,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,The_ChangeTheme ,Pre_EditPrefs ,NULL}, + /* ActReqChgLan */{ 992,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pre_AskChangeLanguage ,NULL}, + /* ActChgLan */{ 654,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_ChangeLanguage ,Pre_EditPrefs ,NULL}, + /* ActChgCol */{ 674,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_ChangeSideCols ,Pre_EditPrefs ,NULL}, + /* ActHidLftCol */{ 668,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_HideLeftCol ,Pre_EditPrefs ,NULL}, + /* ActHidRgtCol */{ 669,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_HideRightCol ,Pre_EditPrefs ,NULL}, + /* ActShoLftCol */{ 670,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_ShowLeftCol ,Pre_EditPrefs ,NULL}, + /* ActShoRgtCol */{ 671,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_ShowRightCol ,Pre_EditPrefs ,NULL}, + /* ActChgIco */{1092,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Ico_ChangeIconSet ,Pre_EditPrefs ,NULL}, + /* ActChgMnu */{1243,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Mnu_ChangeMenu ,Pre_EditPrefs ,NULL}, + /* ActChgNtfPrf */{ 775,-1,TabPrf,ActEdiPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Ntf_ChangeNotifyEvents ,Pre_EditPrefs ,NULL}, - /* ActPrnUsrQR */{1022,-1,TabPrf,ActFrmUsrAcc ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,QR_PrintQRCode ,NULL}, + /* ActPrnUsrQR */{1022,-1,TabPrf,ActFrmUsrAcc ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,QR_PrintQRCode ,NULL}, /* ActPrnMyTimTbl */{ 409,-1,TabPrf,ActSeeMyTimTbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,TT_ShowClassTimeTable ,NULL}, /* ActEdiTut */{ 65,-1,TabPrf,ActSeeMyTimTbl ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,TT_ShowMyTutTimeTable ,NULL}, diff --git a/swad_changelog.h b/swad_changelog.h index f25b8442..d6cdba88 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -103,11 +103,19 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 14.91.1 (2015/03/14)" +#define Log_PLATFORM_VERSION "SWAD 14.92 (2015/03/14)" // 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: Mar 14, 2015 New module swad_profile for public user's profile. (182202 lines) + 1 change necessary in Makefile: +Add swad_profile.o to list of object files + + Version 14.91.3: Mar 14, 2015 By default, the logged user's nickname is shown in form to view user's profile + Action to view QR code is now public. (182108 lines) + Version 14.91.2: Mar 14, 2015 URL of public profile is embedded under user's photo in record card. + Changes in layout of record card. (182124 lines) Version 14.91.1: Mar 14, 2015 Current figures separated from historic figures in layout of public user profile. Show only number of files, not folder or links. (182112 lines) Version 14.91: Mar 14, 2015 Statistics for number of file views added to user figures. (182091 lines) diff --git a/swad_country.c b/swad_country.c index 05867bc8..4a33dc53 100644 --- a/swad_country.c +++ b/swad_country.c @@ -1489,7 +1489,7 @@ void Cty_RenameCountry (void) Lay_ShowErrorAndExit ("Code of country is missing."); /* Get the lenguage */ - Language = Prf_GetParamLanguage (); + Language = Pre_GetParamLanguage (); /* Get the new name for the country */ Par_GetParToText ("Name",NewCtyName,Cty_MAX_LENGTH_COUNTRY_NAME); @@ -1607,7 +1607,7 @@ void Cty_ChangeCtyWWW (void) Lay_ShowErrorAndExit ("Code of country is missing."); /* Get the lenguage */ - Language = Prf_GetParamLanguage (); + Language = Pre_GetParamLanguage (); /* Get the new WWW for the country */ Par_GetParToText ("WWW",NewWWW,Cty_MAX_LENGTH_COUNTRY_NAME); diff --git a/swad_file_browser.c b/swad_file_browser.c index 98704f96..35f03aa5 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -46,6 +46,7 @@ #include "swad_notification.h" #include "swad_parameter.h" #include "swad_photo.h" +#include "swad_profile.h" #include "swad_string.h" #include "swad_zip.h" @@ -9973,7 +9974,7 @@ void Brw_GetAndUpdateFileViews (struct FileMetadata *FileMetadata) /***** Increment number of file views in my user's figures *****/ if (Gbl.Usrs.Me.Logged) - Usr_IncrementNumFileViewsUsr (Gbl.Usrs.Me.UsrDat.UsrCod); + Prf_IncrementNumFileViewsUsr (Gbl.Usrs.Me.UsrDat.UsrCod); } else FileMetadata->NumMyViews = diff --git a/swad_forum.c b/swad_forum.c index aee92693..b00477c3 100644 --- a/swad_forum.c +++ b/swad_forum.c @@ -40,6 +40,7 @@ #include "swad_logo.h" #include "swad_notification.h" #include "swad_parameter.h" +#include "swad_profile.h" /*****************************************************************************/ /************** External global variables from others modules ****************/ @@ -757,7 +758,8 @@ unsigned For_GetNumPstsInThr (long ThrCod) char Query[512]; /***** Get number of posts in a thread from database *****/ - sprintf (Query,"SELECT COUNT(*) FROM forum_post WHERE ThrCod='%ld'", + sprintf (Query,"SELECT COUNT(*) FROM forum_post" + " WHERE ThrCod='%ld'", ThrCod); return (unsigned) DB_QueryCOUNT (Query,"can not get the number of posts in a thread of a forum"); } @@ -3820,7 +3822,7 @@ void For_RecForumPst (void) } /***** Increment number of forum posts in my user's figures *****/ - Usr_IncrementNumForPstUsr (Gbl.Usrs.Me.UsrDat.UsrCod); + Prf_IncrementNumForPstUsr (Gbl.Usrs.Me.UsrDat.UsrCod); /***** Write message of success *****/ Lay_ShowAlert (Lay_SUCCESS,Txt_Post_sent); diff --git a/swad_icon.c b/swad_icon.c index 69889415..ca931d7e 100644 --- a/swad_icon.c +++ b/swad_icon.c @@ -120,7 +120,7 @@ void Ico_ChangeIconSet (void) } /***** Set preferences from current IP *****/ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); } /*****************************************************************************/ diff --git a/swad_layout.c b/swad_layout.c index 951f9002..b60d3494 100644 --- a/swad_layout.c +++ b/swad_layout.c @@ -296,7 +296,7 @@ void Lay_WriteStartOfPage (void) /* Left bar used to expand-contract central zone */ fprintf (Gbl.F.Out,""); - Prf_PutLeftIconToHideShowCols (); + Pre_PutLeftIconToHideShowCols (); fprintf (Gbl.F.Out,""); if (Gbl.Prefs.Menu == Mnu_MENU_VERTICAL) @@ -382,7 +382,7 @@ static void Lay_WriteEndOfPage (void) /* Right bar used to expand-contract central zone */ fprintf (Gbl.F.Out,""); - Prf_PutRigthIconToHideShowCols (); + Pre_PutRigthIconToHideShowCols (); fprintf (Gbl.F.Out,""); } @@ -657,7 +657,7 @@ static void Lay_WritePageTopHeading (void) if (Gbl.Usrs.Me.Logged) Usr_WriteLoggedUsrHead (); else - Prf_PutSelectorToSelectLanguage (); + Pre_PutSelectorToSelectLanguage (); fprintf (Gbl.F.Out,"" "" "" @@ -1191,7 +1191,7 @@ void Lay_RefreshNotifsAndConnected (void) else if (!(Gbl.PID % 1013)) // Do this only one of 1013 times (1013 is prime) Brw_RemoveExpiredExpandedFolders (); // Remove old expanded folders (from all users) else if (!(Gbl.PID % 1019)) // Do this only one of 1019 times (1019 is prime) - Prf_RemoveOldPrefsFromIP (); // Remove old preferences from IP + Pre_RemoveOldPrefsFromIP (); // Remove old preferences from IP else if (!(Gbl.PID % 1021)) // Do this only one of 1021 times (1021 is prime) Sta_RemoveOldEntriesRecentLog (); // Remove old entries in recent log table, it's a slow query @@ -1466,7 +1466,7 @@ void Lay_ChangeLayout (void) } /***** Set preferences from current IP *****/ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); } /*****************************************************************************/ diff --git a/swad_menu.c b/swad_menu.c index 10a93800..5e8a5ee4 100644 --- a/swad_menu.c +++ b/swad_menu.c @@ -352,7 +352,7 @@ void Mnu_ChangeMenu (void) } /***** Set preferences from current IP *****/ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); } /*****************************************************************************/ diff --git a/swad_message.c b/swad_message.c index 7e882854..f8a5a702 100644 --- a/swad_message.c +++ b/swad_message.c @@ -42,6 +42,7 @@ #include "swad_notification.h" #include "swad_parameter.h" #include "swad_photo.h" +#include "swad_profile.h" #include "swad_user.h" /*****************************************************************************/ @@ -1185,7 +1186,7 @@ static long Msg_InsertNewMsg (const char *Subject,const char *Content) DB_QueryINSERT (Query,"can not create message"); /***** Increment number of messages sent by me *****/ - Usr_IncrementNumMsgSntUsr (Gbl.Usrs.Me.UsrDat.UsrCod); + Prf_IncrementNumMsgSntUsr (Gbl.Usrs.Me.UsrDat.UsrCod); return MsgCod; } diff --git a/swad_network.c b/swad_network.c index 46dce87a..70c5fce6 100644 --- a/swad_network.c +++ b/swad_network.c @@ -30,6 +30,7 @@ #include "swad_database.h" #include "swad_global.h" #include "swad_parameter.h" +#include "swad_profile.h" #include "swad_theme.h" /*****************************************************************************/ @@ -134,13 +135,15 @@ const char *Net_TitleWebsAndSocialNetworks[Net_NUM_WEBS_AND_SOCIAL_NETWORKS] = /***************************** Private prototypes ****************************/ /*****************************************************************************/ +static void Net_ShowAWebOrSocialNet (const char *URL, + const char *Icon,const char *Title); static void Net_GetMyWebsAndSocialNetsFromForm (void); /*****************************************************************************/ /************************** Show webs / social networks **********************/ /*****************************************************************************/ -void Net_ShowWebsAndSocialNets (long UsrCod) +void Net_ShowWebsAndSocialNets (const struct UsrData *UsrDat) { char Query[256]; MYSQL_RES *mysql_res; @@ -148,8 +151,14 @@ void Net_ShowWebsAndSocialNets (long UsrCod) Net_WebsAndSocialNetworks_t NumURL; char URL[Cns_MAX_BYTES_URL+1]; + /***** Start container *****/ fprintf (Gbl.F.Out,"
"); + /***** Show link to public profile *****/ + Net_ShowAWebOrSocialNet (Prf_GetURLPublicProfile (URL,UsrDat->Nickname), + "swad",Cfg_PLATFORM_PAGE_TITLE); + + /***** Show the rest of webs / social networks *****/ for (NumURL = (Net_WebsAndSocialNetworks_t) 0; NumURL < Net_NUM_WEBS_AND_SOCIAL_NETWORKS; NumURL++) @@ -157,38 +166,49 @@ void Net_ShowWebsAndSocialNets (long UsrCod) /***** Get user's web / social network from database *****/ sprintf (Query,"SELECT URL FROM usr_webs" " WHERE UsrCod='%ld' AND Web='%s'", - UsrCod, - Net_WebsAndSocialNetworksDB[NumURL]); + UsrDat->UsrCod,Net_WebsAndSocialNetworksDB[NumURL]); - /***** Check number of rows in result *****/ + /***** Check if exists the web / social network for this user *****/ if (DB_QuerySELECT (Query,&mysql_res,"can not get user's web / social network")) { - /***** Get URL *****/ + /* Get URL */ row = mysql_fetch_row (mysql_res); strncpy (URL,row[0],Cns_MAX_BYTES_URL); URL[Cns_MAX_BYTES_URL] = '\0'; - /***** Write link and icon *****/ - fprintf (Gbl.F.Out,"
" - "" - "\"%s\"" - "" - "
", - URL, - Net_TitleWebsAndSocialNetworks[NumURL], - Gbl.Prefs.IconsURL,Net_WebsAndSocialNetworksDB[NumURL], - Net_TitleWebsAndSocialNetworks[NumURL]); + /* Show the web / social network */ + Net_ShowAWebOrSocialNet (URL, + Net_WebsAndSocialNetworksDB[NumURL], + Net_TitleWebsAndSocialNetworks[NumURL]); } /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); } + /***** End container *****/ fprintf (Gbl.F.Out,"
"); } +/*****************************************************************************/ +/************************** Show a web / social network **********************/ +/*****************************************************************************/ + +static void Net_ShowAWebOrSocialNet (const char *URL, + const char *Icon,const char *Title) + { + /***** Write link and icon *****/ + fprintf (Gbl.F.Out,"
" + "" + "\"%s\"" + "" + "
", + URL,Title, + Gbl.Prefs.IconsURL,Icon,Title); + } + /*****************************************************************************/ /********************* Show form to edit my social networks ******************/ /*****************************************************************************/ diff --git a/swad_network.h b/swad_network.h index b62b025d..a2a72779 100644 --- a/swad_network.h +++ b/swad_network.h @@ -39,7 +39,7 @@ /***************************** Public prototypes *****************************/ /*****************************************************************************/ -void Net_ShowWebsAndSocialNets (long UsrCod); +void Net_ShowWebsAndSocialNets (const struct UsrData *UsrDat); void Net_ShowFormMyWebsAndSocialNets (void); void Net_UpdateMyWebsAndSocialNets (void); void Net_ShowWebAndSocialNetworksStats (void); diff --git a/swad_parameter.c b/swad_parameter.c index 92dbcb7b..96ff341b 100644 --- a/swad_parameter.c +++ b/swad_parameter.c @@ -235,7 +235,7 @@ void Par_GetMainParameters (void) } /***** Try to get preferences changed from current IP *****/ - Prf_GetPrefsFromIP (); + Pre_GetPrefsFromIP (); if (Gbl.Prefs.Layout == Lay_LAYOUT_UNKNOWN) Gbl.Prefs.Layout = Lay_LAYOUT_DEFAULT; @@ -252,7 +252,7 @@ void Par_GetMainParameters (void) Gbl.Prefs.Layout = LayoutFromForm; /* Update preferences from current IP */ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); } /***** Set path of theme *****/ diff --git a/swad_preference.c b/swad_preference.c index 25c6b726..4f60e4da 100644 --- a/swad_preference.c +++ b/swad_preference.c @@ -54,14 +54,14 @@ extern struct Globals Gbl; /****************************** Private prototypes ***************************/ /*****************************************************************************/ -static void Prf_PutIconsToSelectSideCols (void); -static void Prf_UpdateSideColsOnUsrDataTable (void); +static void Pre_PutIconsToSelectSideCols (void); +static void Pre_UpdateSideColsOnUsrDataTable (void); /*****************************************************************************/ /***************************** Edit preferences ******************************/ /*****************************************************************************/ -void Prf_EditPrefs (void) +void Pre_EditPrefs (void) { extern const char *Txt_Language; extern const char *Txt_You_can_only_receive_email_notifications_if_; @@ -71,7 +71,7 @@ void Prf_EditPrefs (void) Lay_StartRoundFrameTable10 (NULL,2,Txt_Language); fprintf (Gbl.F.Out,"" ""); - Prf_PutSelectorToSelectLanguage (); + Pre_PutSelectorToSelectLanguage (); fprintf (Gbl.F.Out,"" ""); Lay_EndRoundFrameTable10 (); @@ -94,7 +94,7 @@ void Prf_EditPrefs (void) Mnu_PutIconsToSelectMenu (); // 4. Menu fprintf (Gbl.F.Out,"" ""); - Prf_PutIconsToSelectSideCols (); // 5. Side columns + Pre_PutIconsToSelectSideCols (); // 5. Side columns fprintf (Gbl.F.Out,""); } fprintf (Gbl.F.Out,"" @@ -115,7 +115,7 @@ void Prf_EditPrefs (void) /******************* Get preferences changed from current IP *****************/ /*****************************************************************************/ -void Prf_GetPrefsFromIP (void) +void Pre_GetPrefsFromIP (void) { char Query[1024]; unsigned long NumRows; @@ -171,7 +171,7 @@ void Prf_GetPrefsFromIP (void) /************************ Set preferences from current IP ********************/ /*****************************************************************************/ -void Prf_SetPrefsFromIP (void) +void Pre_SetPrefsFromIP (void) { extern const char *The_ThemeId[The_NUM_THEMES]; extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS]; @@ -207,7 +207,7 @@ void Prf_SetPrefsFromIP (void) /*********************** Remove old preferences from IP **********************/ /*****************************************************************************/ -void Prf_RemoveOldPrefsFromIP (void) +void Pre_RemoveOldPrefsFromIP (void) { char Query[256]; @@ -223,7 +223,7 @@ void Prf_RemoveOldPrefsFromIP (void) /*****************************************************************************/ // Width == 0 means don't force width of selector -void Prf_PutSelectorToSelectLanguage (void) +void Pre_PutSelectorToSelectLanguage (void) { extern const char *Txt_STR_LANG_NAME[Txt_NUM_LANGUAGES]; Txt_Language_t Lan; @@ -254,7 +254,7 @@ void Prf_PutSelectorToSelectLanguage (void) /********* Ask user if he/she really wants to change the language ************/ /*****************************************************************************/ -void Prf_AskChangeLanguage (void) +void Pre_AskChangeLanguage (void) { extern const char *Txt_Do_you_want_to_change_your_language_to_LANGUAGE[Txt_NUM_LANGUAGES]; extern const char *Txt_Do_you_want_to_change_the_language_to_LANGUAGE[Txt_NUM_LANGUAGES]; @@ -262,7 +262,7 @@ void Prf_AskChangeLanguage (void) Txt_Language_t CurrentLanguage = Gbl.Prefs.Language; /***** Get param language *****/ - Gbl.Prefs.Language = Prf_GetParamLanguage (); // Change temporarily language to set form action + Gbl.Prefs.Language = Pre_GetParamLanguage (); // Change temporarily language to set form action /***** Request confirmation *****/ if (Gbl.Usrs.Me.Logged) @@ -283,7 +283,7 @@ void Prf_AskChangeLanguage (void) /******************************* Change language *****************************/ /*****************************************************************************/ -void Prf_ChangeLanguage (void) +void Pre_ChangeLanguage (void) { extern const char *Txt_STR_LANG_ID[Txt_NUM_LANGUAGES]; extern const char *Txt_Your_language_has_changed_to_LANGUAGE; @@ -293,7 +293,7 @@ void Prf_ChangeLanguage (void) bool MyLanguageHasChanged = false; /***** Get param language *****/ - Gbl.Prefs.Language = Prf_GetParamLanguage (); + Gbl.Prefs.Language = Pre_GetParamLanguage (); /***** Store language in database *****/ if (Gbl.Usrs.Me.Logged && Gbl.Prefs.Language != Gbl.Usrs.Me.UsrDat.Prefs.Language) @@ -305,7 +305,7 @@ void Prf_ChangeLanguage (void) } /***** Set preferences from current IP *****/ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); /***** Confirmation *****/ if (MyLanguageHasChanged) @@ -318,7 +318,7 @@ void Prf_ChangeLanguage (void) /*************************** Get parameter language **************************/ /*****************************************************************************/ -Txt_Language_t Prf_GetParamLanguage (void) +Txt_Language_t Pre_GetParamLanguage (void) { extern const unsigned Txt_Current_CGI_SWAD_Language; char UnsignedStr[10+1]; @@ -336,7 +336,7 @@ Txt_Language_t Prf_GetParamLanguage (void) /************ Put icons to select the layout of the side columns *************/ /*****************************************************************************/ -static void Prf_PutIconsToSelectSideCols (void) +static void Pre_PutIconsToSelectSideCols (void) { extern const char *Txt_Columns; extern const char *Txt_LAYOUT_SIDE_COLUMNS[4]; @@ -371,7 +371,7 @@ static void Prf_PutIconsToSelectSideCols (void) /**************** Put left icon to hide/show side columns ********************/ /*****************************************************************************/ -void Prf_PutLeftIconToHideShowCols (void) +void Pre_PutLeftIconToHideShowCols (void) { extern const char *Txt_Hide_left_column; extern const char *Txt_Show_left_column; @@ -403,7 +403,7 @@ void Prf_PutLeftIconToHideShowCols (void) /**************** Put right icon to hide/show side columns *******************/ /*****************************************************************************/ -void Prf_PutRigthIconToHideShowCols (void) +void Pre_PutRigthIconToHideShowCols (void) { extern const char *Txt_Hide_right_column; extern const char *Txt_Show_right_column; @@ -435,80 +435,80 @@ void Prf_PutRigthIconToHideShowCols (void) /*********************** Change layout of side columns ***********************/ /*****************************************************************************/ -void Prf_ChangeSideCols (void) +void Pre_ChangeSideCols (void) { /***** Get param side-columns *****/ - Gbl.Prefs.SideCols = Prf_GetParamSideCols (); + Gbl.Prefs.SideCols = Pre_GetParamSideCols (); /***** Store side colums in database *****/ if (Gbl.Usrs.Me.Logged) - Prf_UpdateSideColsOnUsrDataTable (); + Pre_UpdateSideColsOnUsrDataTable (); /***** Set preferences from current IP *****/ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); } /*****************************************************************************/ /*************************** Hide left side column ***************************/ /*****************************************************************************/ -void Prf_HideLeftCol (void) +void Pre_HideLeftCol (void) { Gbl.Prefs.SideCols &= ~Lay_SHOW_LEFT_COLUMN; // And with 1...101 to hide left column if (Gbl.Usrs.Me.Logged) - Prf_UpdateSideColsOnUsrDataTable (); + Pre_UpdateSideColsOnUsrDataTable (); /***** Set preferences from current IP *****/ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); } /*****************************************************************************/ /*************************** Hide right side column **************************/ /*****************************************************************************/ -void Prf_HideRightCol (void) +void Pre_HideRightCol (void) { Gbl.Prefs.SideCols &= ~Lay_SHOW_RIGHT_COLUMN; // And with 1...110 to hide right column if (Gbl.Usrs.Me.Logged) - Prf_UpdateSideColsOnUsrDataTable (); + Pre_UpdateSideColsOnUsrDataTable (); /***** Set preferences from current IP *****/ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); } /*****************************************************************************/ /**************************** Show left side column **************************/ /*****************************************************************************/ -void Prf_ShowLeftCol (void) +void Pre_ShowLeftCol (void) { Gbl.Prefs.SideCols |= Lay_SHOW_LEFT_COLUMN; // Or with 10 to show left column if (Gbl.Usrs.Me.Logged) - Prf_UpdateSideColsOnUsrDataTable (); + Pre_UpdateSideColsOnUsrDataTable (); /***** Set preferences from current IP *****/ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); } /*****************************************************************************/ /**************************** Show right side column *************************/ /*****************************************************************************/ -void Prf_ShowRightCol (void) +void Pre_ShowRightCol (void) { Gbl.Prefs.SideCols |= Lay_SHOW_RIGHT_COLUMN; // Or with 01 to show right column if (Gbl.Usrs.Me.Logged) - Prf_UpdateSideColsOnUsrDataTable (); + Pre_UpdateSideColsOnUsrDataTable (); /***** Set preferences from current IP *****/ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); } /*****************************************************************************/ /************** Update layout of side colums on user data table **************/ /*****************************************************************************/ -static void Prf_UpdateSideColsOnUsrDataTable (void) +static void Pre_UpdateSideColsOnUsrDataTable (void) { char Query[512]; @@ -521,7 +521,7 @@ static void Prf_UpdateSideColsOnUsrDataTable (void) /************** Get parameter used to show/hide side columns *****************/ /*****************************************************************************/ -unsigned Prf_GetParamSideCols (void) +unsigned Pre_GetParamSideCols (void) { char UnsignedStr[10+1]; unsigned UnsignedNum; // 11 ==> by default, show both side columns diff --git a/swad_preference.h b/swad_preference.h index c0bbfbef..8fc5fc14 100644 --- a/swad_preference.h +++ b/swad_preference.h @@ -1,7 +1,7 @@ // swad_preference.h: user's preferences -#ifndef _SWAD_PRF -#define _SWAD_PRF +#ifndef _SWAD_PRE +#define _SWAD_PRE /* SWAD (Shared Workspace At a Distance in Spanish), is a web platform developed at the University of Granada (Spain), @@ -39,24 +39,24 @@ /***************************** Public prototypes *****************************/ /*****************************************************************************/ -void Prf_EditPrefs (void); +void Pre_EditPrefs (void); -void Prf_GetPrefsFromIP (void); -void Prf_SetPrefsFromIP (void); -void Prf_RemoveOldPrefsFromIP (void); +void Pre_GetPrefsFromIP (void); +void Pre_SetPrefsFromIP (void); +void Pre_RemoveOldPrefsFromIP (void); -void Prf_PutSelectorToSelectLanguage (void); -void Prf_AskChangeLanguage (void); -void Prf_ChangeLanguage (void); -Txt_Language_t Prf_GetParamLanguage (void); +void Pre_PutSelectorToSelectLanguage (void); +void Pre_AskChangeLanguage (void); +void Pre_ChangeLanguage (void); +Txt_Language_t Pre_GetParamLanguage (void); -void Prf_PutLeftIconToHideShowCols (void); -void Prf_PutRigthIconToHideShowCols (void); -void Prf_ChangeSideCols (void); -void Prf_HideLeftCol (void); -void Prf_HideRightCol (void); -void Prf_ShowLeftCol (void); -void Prf_ShowRightCol (void); -unsigned Prf_GetParamSideCols (void); +void Pre_PutLeftIconToHideShowCols (void); +void Pre_PutRigthIconToHideShowCols (void); +void Pre_ChangeSideCols (void); +void Pre_HideLeftCol (void); +void Pre_HideRightCol (void); +void Pre_ShowLeftCol (void); +void Pre_ShowRightCol (void); +unsigned Pre_GetParamSideCols (void); #endif diff --git a/swad_profile.c b/swad_profile.c new file mode 100644 index 00000000..bf317c9c --- /dev/null +++ b/swad_profile.c @@ -0,0 +1,1111 @@ +// swad_profile.c: user's public profile + +/* + 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-2015 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 . +*/ +/*****************************************************************************/ +/*********************************** Headers *********************************/ +/*****************************************************************************/ + +#include // For NULL + +#include "swad_config.h" +#include "swad_database.h" +#include "swad_global.h" +#include "swad_nickname.h" +#include "swad_parameter.h" +#include "swad_privacy.h" +#include "swad_role.h" +#include "swad_text.h" +#include "swad_theme.h" +#include "swad_user.h" + +/*****************************************************************************/ +/****************************** Public constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Private constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/****************************** Internal types *******************************/ +/*****************************************************************************/ + +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 NumFileViews; // -1L ==> unknown number of file views + long NumForPst; // -1L ==> unknown number of forum posts + long NumMsgSnt; // -1L ==> unknown number of messages sent + }; + +/*****************************************************************************/ +/************** External global variables from others modules ****************/ +/*****************************************************************************/ + +extern struct Globals Gbl; + +/*****************************************************************************/ +/************************* Internal global variables *************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Private prototypes ****************************/ +/*****************************************************************************/ + +static void Prf_ShowUserProfile (void); +static void Prf_ShowDetailsUserProfile (const struct UsrData *UsrDat); +static void Prf_ShowHistoricUserProfile (const struct UsrData *UsrDat); +static void Prf_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures); +static unsigned long Prf_GetRankingNumClicks (long UsrCod); +static unsigned long Prf_GetNumUsrsWithNumClicks (void); +static unsigned long Prf_GetRankingNumClicksPerDay (long UsrCod); +static unsigned long Prf_GetNumUsrsWithNumClicksPerDay (void); +static void Prf_GetFirstClickFromLogAndStoreAsUsrFigure (long UsrCod); +static void Prf_GetNumClicksAndStoreAsUsrFigure (long UsrCod); +static void Prf_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod); +static void Prf_GetNumForPstAndStoreAsUsrFigure (long UsrCod); +static void Prf_GetNumMsgSntAndStoreAsUsrFigure (long UsrCod); +static void Prf_ResetUsrFigures (struct UsrFigures *UsrFigures); +static void Prf_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures); +static bool Prf_CheckIfUsrFiguresExists (long UsrCod); + +/*****************************************************************************/ +/************************** Get public profile URL ***************************/ +/*****************************************************************************/ + +char *Prf_GetURLPublicProfile (char *URL,const char *NicknameWithoutArroba) + { + extern const char *Txt_STR_LANG_ID[Txt_NUM_LANGUAGES]; + + /***** Build URL using nickname *****/ + sprintf (URL,"%s/%s?usr=@%s", + Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language], + NicknameWithoutArroba); + + return URL; + } + +/*****************************************************************************/ +/************************** Request a user's profile *************************/ +/*****************************************************************************/ + +void Prf_RequestUserProfile (void) + { + extern const char *Txt_View_public_profile; + extern const char *The_ClassFormul[The_NUM_THEMES]; + extern const char *Txt_Nickname; + extern const char *Txt_Continue; + + /***** Start frame *****/ + Lay_StartRoundFrameTable10 (NULL,2,Txt_View_public_profile); + fprintf (Gbl.F.Out,"" + ""); + + /***** Form to request user's @nickname *****/ + Act_FormStart (ActSeePubPrf); + fprintf (Gbl.F.Out,"
" + "%s: " + "" + "
", + The_ClassFormul[Gbl.Prefs.Theme], + Txt_Nickname, + Nck_MAX_BYTES_NICKNAME_WITH_ARROBA, + Gbl.Usrs.Me.UsrDat.Nickname); // If no user logged ==> nickname is empty + + /***** Send button*****/ + Lay_PutSendButton (Txt_Continue); + Act_FormEnd (); + + /***** End frame *****/ + fprintf (Gbl.F.Out,"" + ""); + Lay_EndRoundFrameTable10 (); + } + +/*****************************************************************************/ +/**************** Get user's code and show a user's profile ******************/ +/*****************************************************************************/ + +void Prf_GetUsrCodAndShowUserProfile (void) + { + char Nickname[Nck_MAX_BYTES_NICKNAME_WITH_ARROBA + 1]; + long OtherUsrCod; + + /***** Get user from nickname *****/ + if (Gbl.Usrs.Other.UsrDat.UsrCod < 0) + { + Par_GetParToText ("usr",Nickname,Nck_MAX_BYTES_NICKNAME_WITH_ARROBA); + if ((OtherUsrCod = Nck_GetUsrCodFromNickname (Nickname)) > 0) + { + Gbl.Usrs.Other.UsrDat.UsrCod = OtherUsrCod; + Gbl.CurrentAct = ActSeePubPrf; + } + else + Usr_GetParamOtherUsrCodEncrypted (); + } + + /***** Show user's profile *****/ + Prf_ShowUserProfile (); + } + +/*****************************************************************************/ +/*************************** Show a user's profile ***************************/ +/*****************************************************************************/ + +static void Prf_ShowUserProfile (void) + { + extern const char *Txt_User_not_found_or_you_do_not_have_permission_; + bool Error = false; + + /***** Check if user exists and get his data *****/ + if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat)) // Existing user + { + /***** Check if I can see the public profile *****/ + if (Pri_ShowIsAllowed (Gbl.Usrs.Other.UsrDat.ProfileVisibility,Gbl.Usrs.Other.UsrDat.UsrCod)) + { + if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected + { + /* Get user's role in current course */ + Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB = Rol_GetRoleInCrs (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Usrs.Other.UsrDat.UsrCod); + + /* Get if user has accepted enrollment in current course */ + Gbl.Usrs.Other.UsrDat.Accepted = Usr_GetIfUserHasAcceptedEnrollmentInCurrentCrs (Gbl.Usrs.Other.UsrDat.UsrCod); + } + + fprintf (Gbl.F.Out,"
" + "" + "" + "" + "" + "" + "
"); + + /***** Common record *****/ + Rec_ShowSharedUsrRecord (Rec_RECORD_PUBLIC,&Gbl.Usrs.Other.UsrDat); + + /***** Show details of user's profile *****/ + Prf_ShowDetailsUserProfile (&Gbl.Usrs.Other.UsrDat); + + fprintf (Gbl.F.Out,""); + + /***** Show historic user's profile *****/ + Prf_ShowHistoricUserProfile (&Gbl.Usrs.Other.UsrDat); + + fprintf (Gbl.F.Out,"
" + "
"); + } + else + Error = true; + } + else + Error = true; + + if (Error) + { + /***** Show error message *****/ + Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); + + /***** Request nickname again *****/ + Prf_RequestUserProfile (); + } + } + +/*****************************************************************************/ +/******************** Change my public profile visibility ********************/ +/*****************************************************************************/ + +void Prf_ChangeProfileVisibility (void) + { + extern const char *Pri_VisibilityDB[Pri_NUM_OPTIONS_PRIVACY]; + extern const char *Txt_The_visibility_of_your_public_profile_has_changed; + char Query[128]; + + /***** Get param with public/private photo *****/ + Gbl.Usrs.Me.UsrDat.ProfileVisibility = Pri_GetParamVisibility (); + + /***** Store public/private photo in database *****/ + sprintf (Query,"UPDATE usr_data SET ProfileVisibility='%s'" + " WHERE UsrCod='%ld'", + Pri_VisibilityDB[Gbl.Usrs.Me.UsrDat.ProfileVisibility], + Gbl.Usrs.Me.UsrDat.UsrCod); + DB_QueryUPDATE (Query,"can not update your preference about public profile visibility"); + + /***** Show alert *****/ + Lay_ShowAlert (Lay_SUCCESS,Txt_The_visibility_of_your_public_profile_has_changed); + + /***** Show form again *****/ + Pri_EditMyPrivacy (); + } + +/*****************************************************************************/ +/********************** Show details of user's profile ***********************/ +/*****************************************************************************/ + +static void Prf_ShowDetailsUserProfile (const struct UsrData *UsrDat) + { + extern const char *The_ClassFormul[The_NUM_THEMES]; + // extern const char *Txt_Figures; + extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; + extern const char *Txt_ROLES_SINGUL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; + extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; + extern const char *Txt_course; + extern const char *Txt_courses; + extern const char *Txt_Files; + extern const char *Txt_file; + extern const char *Txt_files; + extern const char *Txt_public_FILES; + unsigned NumCrssUsrIsTeacher; + unsigned NumCrssUsrIsStudent; + unsigned NumStds; + unsigned NumTchs; + unsigned NumFiles; + unsigned NumPublicFiles; + + /***** Start table *****/ + fprintf (Gbl.F.Out,"" + ""); + + /***** Number of courses in which the user is teacher or student *****/ + if ((NumCrssUsrIsTeacher = Usr_GetNumCrssOfUsrWithARole (UsrDat->UsrCod,Rol_ROLE_TEACHER))) + { + NumTchs = Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_ROLE_TEACHER,Rol_ROLE_TEACHER); + NumStds = Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_ROLE_TEACHER,Rol_ROLE_STUDENT); + fprintf (Gbl.F.Out,"" + "", + The_ClassFormul[Gbl.Prefs.Theme], + Txt_ROLES_SINGUL_Abc[Rol_ROLE_TEACHER][UsrDat->Sex], + NumCrssUsrIsTeacher, + (NumCrssUsrIsTeacher == 1) ? Txt_course : + Txt_courses, + NumTchs, + (NumTchs == 1) ? Txt_ROLES_SINGUL_abc[Rol_ROLE_TEACHER][Usr_SEX_UNKNOWN] : + Txt_ROLES_PLURAL_abc[Rol_ROLE_TEACHER][Usr_SEX_UNKNOWN], + NumStds, + (NumStds == 1) ? Txt_ROLES_SINGUL_abc[Rol_ROLE_STUDENT][Usr_SEX_UNKNOWN] : + Txt_ROLES_PLURAL_abc[Rol_ROLE_STUDENT][Usr_SEX_UNKNOWN]); + } + if ((NumCrssUsrIsStudent = Usr_GetNumCrssOfUsrWithARole (UsrDat->UsrCod,Rol_ROLE_STUDENT))) + { + NumTchs = Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_ROLE_STUDENT,Rol_ROLE_TEACHER); + NumStds = Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_ROLE_STUDENT,Rol_ROLE_STUDENT); + fprintf (Gbl.F.Out,"" + "", + The_ClassFormul[Gbl.Prefs.Theme], + Txt_ROLES_SINGUL_Abc[Rol_ROLE_STUDENT][UsrDat->Sex], + NumCrssUsrIsStudent, + (NumCrssUsrIsStudent == 1) ? Txt_course : + Txt_courses, + NumTchs, + (NumTchs == 1) ? Txt_ROLES_SINGUL_abc[Rol_ROLE_TEACHER][Usr_SEX_UNKNOWN] : + Txt_ROLES_PLURAL_abc[Rol_ROLE_TEACHER][Usr_SEX_UNKNOWN], + NumStds, + (NumStds == 1) ? Txt_ROLES_SINGUL_abc[Rol_ROLE_STUDENT][Usr_SEX_UNKNOWN] : + Txt_ROLES_PLURAL_abc[Rol_ROLE_STUDENT][Usr_SEX_UNKNOWN]); + } + + /***** Number of files currently published *****/ + if ((NumFiles = Brw_GetNumFilesUsr (UsrDat->UsrCod))) + NumPublicFiles = Brw_GetNumPublicFilesUsr (UsrDat->UsrCod); + else + NumPublicFiles = 0; + fprintf (Gbl.F.Out,"" + "", + The_ClassFormul[Gbl.Prefs.Theme], + Txt_Files, + NumFiles, + (NumFiles == 1) ? Txt_file : + Txt_files, + NumPublicFiles,Txt_public_FILES); + + /***** End of table *****/ + fprintf (Gbl.F.Out,"" + "
" + "%s" + "" + "%u %s
" + "%u %s
" + "%u %s" + "" + "
" + "%s" + "" + "%u %s
" + "%u %s
" + "%u %s" + "" + "
" + "%s" + "" + "%u %s
" + "%u %s" + "" + "
"); + } + +/*****************************************************************************/ +/********************** Show details of user's profile ***********************/ +/*****************************************************************************/ + +static void Prf_ShowHistoricUserProfile (const struct UsrData *UsrDat) + { + extern const char *The_ClassFormul[The_NUM_THEMES]; + extern const char *Txt_From_TIME; + extern const char *Txt_day; + extern const char *Txt_days; + extern const char *Txt_Calculate; + extern const char *Txt_Clicks; + extern const char *Txt_of_PART_OF_A_TOTAL; + extern const char *Txt_clicks; + extern const char *Txt_Downloads; + extern const char *Txt_download; + extern const char *Txt_downloads; + extern const char *Txt_Forums; + extern const char *Txt_post; + extern const char *Txt_posts; + extern const char *Txt_Messages; + extern const char *Txt_message; + extern const char *Txt_messages; + struct UsrFigures UsrFigures; + + /***** Start table *****/ + fprintf (Gbl.F.Out,""); + + /***** Get figures *****/ + Prf_GetUsrFigures (UsrDat->UsrCod,&UsrFigures); + + /* First click time */ + fprintf (Gbl.F.Out,"" + "" + "" + ""); + + /* Number of clicks */ + fprintf (Gbl.F.Out,"" + "" + "" + ""); + + /***** Number of file views *****/ + fprintf (Gbl.F.Out,"" + "" + "" + ""); + + /***** Number of posts in forums *****/ + fprintf (Gbl.F.Out,"" + "" + "" + ""); + + /***** Number of messages sent *****/ + fprintf (Gbl.F.Out,"" + "" + "" + ""); + + /***** End of table *****/ + fprintf (Gbl.F.Out,"
" + "%s" + "", + The_ClassFormul[Gbl.Prefs.Theme], + Txt_From_TIME); + if (UsrFigures.FirstClickTime.Date.Year) + { + Dat_WriteDate (UsrFigures.FirstClickTime.Date.YYYYMMDD); + 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 + { + /***** Button to fetch and store first click time *****/ + Act_FormStart (ActCal1stClkTim); + Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); + Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme], + "calculate1","calculating1"); + Lay_PutCalculateIcon (Txt_Calculate,Txt_Calculate, + "calculate1","calculating1"); + Act_FormEnd (); + } + fprintf (Gbl.F.Out,"
" + "%s" + "", + The_ClassFormul[Gbl.Prefs.Theme], + Txt_Clicks); + if (UsrFigures.NumClicks >= 0) + { + fprintf (Gbl.F.Out,"%ld %s" + "
" + "#%ld" + " %s %ld" + "
", + UsrFigures.NumClicks,Txt_clicks, + Prf_GetRankingNumClicks (UsrDat->UsrCod), + Txt_of_PART_OF_A_TOTAL, + Prf_GetNumUsrsWithNumClicks ()); + if (UsrFigures.NumDays >= 0) + { + Str_WriteFloatNum ((float) UsrFigures.NumClicks / + (float) (UsrFigures.NumDays + 1)); + fprintf (Gbl.F.Out," / %s" + "
" + "#%ld" + " %s %ld" + "
", + Txt_day, + Prf_GetRankingNumClicksPerDay (UsrDat->UsrCod), + Txt_of_PART_OF_A_TOTAL, + Prf_GetNumUsrsWithNumClicksPerDay ()); + } + } + else // Number of clicks is unknown + { + /***** Button to fetch and store number of clicks *****/ + Act_FormStart (ActCalNumClk); + Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); + Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme], + "calculate2","calculating2"); + Lay_PutCalculateIcon (Txt_Calculate,Txt_Calculate, + "calculate2","calculating2"); + Act_FormEnd (); + } + fprintf (Gbl.F.Out,"
" + "%s" + "", + The_ClassFormul[Gbl.Prefs.Theme], + Txt_Downloads); + if (UsrFigures.NumFileViews >= 0) + { + fprintf (Gbl.F.Out,"%ld %s", + UsrFigures.NumFileViews, + (UsrFigures.NumFileViews == 1) ? Txt_download : + Txt_downloads); + if (UsrFigures.NumDays >= 0) + { + fprintf (Gbl.F.Out,"
"); + Str_WriteFloatNum ((float) UsrFigures.NumFileViews / + (float) (UsrFigures.NumDays + 1)); + fprintf (Gbl.F.Out," / %s",Txt_day); + } + } + else // Number of file views is unknown + { + /***** Button to fetch and store number of file views *****/ + Act_FormStart (ActCalNumFilVie); + Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); + Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme], + "calculate3","calculating3"); + Lay_PutCalculateIcon (Txt_Calculate,Txt_Calculate, + "calculate3","calculating3"); + Act_FormEnd (); + } + fprintf (Gbl.F.Out,"
" + "%s" + "", + The_ClassFormul[Gbl.Prefs.Theme], + Txt_Forums); + if (UsrFigures.NumForPst >= 0) + { + fprintf (Gbl.F.Out,"%ld %s", + UsrFigures.NumForPst, + (UsrFigures.NumForPst == 1) ? Txt_post : + Txt_posts); + 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 *****/ + Act_FormStart (ActCalNumForPst); + Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); + Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme], + "calculate4","calculating4"); + Lay_PutCalculateIcon (Txt_Calculate,Txt_Calculate, + "calculate4","calculating4"); + Act_FormEnd (); + } + fprintf (Gbl.F.Out,"
" + "%s" + "", + The_ClassFormul[Gbl.Prefs.Theme], + Txt_Messages); + if (UsrFigures.NumMsgSnt >= 0) + { + fprintf (Gbl.F.Out,"%ld %s", + UsrFigures.NumMsgSnt, + (UsrFigures.NumMsgSnt == 1) ? Txt_message : + Txt_messages); + 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 *****/ + Act_FormStart (ActCalNumMsgSnt); + Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); + Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme], + "calculate5","calculating5"); + Lay_PutCalculateIcon (Txt_Calculate,Txt_Calculate, + "calculate5","calculating5"); + Act_FormEnd (); + } + fprintf (Gbl.F.Out,"
"); + } + +/*****************************************************************************/ +/********************** Select values on user's figures **********************/ +/*****************************************************************************/ + +static void Prf_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures) + { + char Query[512]; + MYSQL_RES *mysql_res; + MYSQL_ROW row; + unsigned NumRows; + + /***** Get user's figures from database *****/ + sprintf (Query,"SELECT DATE_FORMAT(FirstClickTime,'%%Y%%m%%d%%H%%i%%S')," + "DATEDIFF(NOW(),FirstClickTime)," + "NumClicks,NumFileViews,NumForPst,NumMsgSnt" + " FROM usr_figures WHERE UsrCod='%ld'", + UsrCod); + if ((NumRows = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get user's figures"))) + { + /***** Get user's figures *****/ + row = mysql_fetch_row (mysql_res); + + /* Get first click (row[0] holds the start date in YYYYMMDDHHMMSS format) */ + if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(UsrFigures->FirstClickTime),row[0]))) + Lay_ShowErrorAndExit ("Error when reading first click time."); + + /* 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 file views (row[3]) */ + if (sscanf (row[3],"%ld",&UsrFigures->NumFileViews) != 1) + UsrFigures->NumFileViews = -1L; + + /* Get number of forum posts (row[4]) */ + if (sscanf (row[4],"%ld",&UsrFigures->NumForPst) != 1) + UsrFigures->NumForPst = -1L; + + /* Get number of messages sent (row[5]) */ + if (sscanf (row[5],"%ld",&UsrFigures->NumMsgSnt) != 1) + UsrFigures->NumMsgSnt = -1L; + } + else + /***** Return special user's figures indicating "not present" *****/ + Prf_ResetUsrFigures (UsrFigures); + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + } + +/*****************************************************************************/ +/********** Get ranking of a user according to the number of clicks **********/ +/*****************************************************************************/ + +static unsigned long Prf_GetRankingNumClicks (long UsrCod) + { + char Query[128]; + + /***** Select number of rows with number of clicks + greater than the clicks of this user *****/ + sprintf (Query,"SELECT COUNT(*)+1 FROM usr_figures" + " WHERE UsrCod<>'%ld'" // Really not necessary here + " AND NumClicks>" + "(SELECT NumClicks FROM usr_figures WHERE UsrCod='%ld')", + UsrCod,UsrCod); + return DB_QueryCOUNT (Query,"can not get ranking using number of clicks"); + } + +/*****************************************************************************/ +/******************* Get number of users with number of clicks ***************/ +/*****************************************************************************/ + +static unsigned long Prf_GetNumUsrsWithNumClicks (void) + { + char Query[128]; + + /***** Select number of rows with values already calculated *****/ + sprintf (Query,"SELECT COUNT(*) FROM usr_figures WHERE NumClicks>='0'"); + return DB_QueryCOUNT (Query,"can not get number of users with number of clicks"); + } + +/*****************************************************************************/ +/****** Get ranking of a user according to the number of clicks per day ******/ +/*****************************************************************************/ + +static unsigned long Prf_GetRankingNumClicksPerDay (long UsrCod) + { + char Query[512]; + + /***** Select number of rows with number of clicks per day + greater than the clicks per day of this user *****/ + sprintf (Query,"SELECT COUNT(*)+1 FROM" + " (SELECT NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1)" + " AS NumClicksPerDay" + " FROM usr_figures" + " WHERE UsrCod<>'%ld'" // Necessary because the following comparison is not exact in floating point + " AND NumClicks>='0' AND UNIX_TIMESTAMP(FirstClickTime)>'0')" + " AS TableNumClicksPerDay" + " WHERE NumClicksPerDay>" + "(SELECT NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1)" + " FROM usr_figures" + " WHERE UsrCod='%ld'" + " AND NumClicks>='0' AND UNIX_TIMESTAMP(FirstClickTime)>'0')", + UsrCod,UsrCod); + return DB_QueryCOUNT (Query,"can not get ranking using number of clicks per day"); + } + +/*****************************************************************************/ +/************** Get number of users with number of clicks per day ************/ +/*****************************************************************************/ + +static unsigned long Prf_GetNumUsrsWithNumClicksPerDay (void) + { + char Query[128]; + + /***** Select number of rows with values already calculated *****/ + sprintf (Query,"SELECT COUNT(*) FROM usr_figures" + " WHERE NumClicks>='0' AND UNIX_TIMESTAMP(FirstClickTime)>'0'"); + return DB_QueryCOUNT (Query,"can not get number of users with number of clicks per day"); + } + +/*****************************************************************************/ +/********* Calculate first click time and show user's profile again **********/ +/*****************************************************************************/ + +void Prf_CalculateFirstClickTime (void) + { + /***** Get user's code *****/ + Usr_GetParamOtherUsrCodEncrypted (); + + /***** Get first click time from log and store as user's figure *****/ + Prf_GetFirstClickFromLogAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); + + /***** Show user's profile again *****/ + Prf_ShowUserProfile (); + } + +/*****************************************************************************/ +/*** Get first click of a user from log table and store in user's figures ****/ +/*****************************************************************************/ + +static void Prf_GetFirstClickFromLogAndStoreAsUsrFigure (long UsrCod) + { + char Query[256]; + MYSQL_RES *mysql_res; + MYSQL_ROW row; + struct UsrFigures UsrFigures; + + if (Usr_ChkIfUsrCodExists (UsrCod)) + { + /***** Reset user's figures *****/ + Prf_ResetUsrFigures (&UsrFigures); + + /***** Get first click from log table *****/ + sprintf (Query,"SELECT DATE_FORMAT(" + "(SELECT MIN(ClickTime) FROM log WHERE UsrCod='%ld')" + ",'%%Y%%m%%d%%H%%i%%S')", + UsrCod); + if (DB_QuerySELECT (Query,&mysql_res,"can not get user's first click")) + { + /* Get first click */ + row = mysql_fetch_row (mysql_res); + + /* Get first click (row[0] holds the start date in YYYYMMDDHHMMSS format) */ + if (row[0]) // It is NULL when user never logged + if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(UsrFigures.FirstClickTime),row[0]))) + Lay_ShowErrorAndExit ("Error when reading first click time."); + } + /* Free structure that stores the query result */ + DB_FreeMySQLResult (&mysql_res); + + /***** Update first click time in user's figures *****/ + if (Prf_CheckIfUsrFiguresExists (UsrCod)) + { + sprintf (Query,"UPDATE usr_figures SET FirstClickTime='%s'" + " WHERE UsrCod='%ld'", + UsrFigures.FirstClickTime.YYYYMMDDHHMMSS,UsrCod); + DB_QueryUPDATE (Query,"can not update user's figures"); + } + else // User entry does not exist + Prf_CreateUsrFigures (UsrCod,&UsrFigures); + } + } + +/*****************************************************************************/ +/********* Calculate number of clicks and show user's profile again **********/ +/*****************************************************************************/ + +void Prf_CalculateNumClicks (void) + { + /***** Get user's code *****/ + Usr_GetParamOtherUsrCodEncrypted (); + + /***** Get number of clicks and store as user's figure *****/ + Prf_GetNumClicksAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); + + /***** Show user's profile again *****/ + Prf_ShowUserProfile (); + } + +/*****************************************************************************/ +/* Get number of clicks of a user from log table and store in user's figures */ +/*****************************************************************************/ + +static void Prf_GetNumClicksAndStoreAsUsrFigure (long UsrCod) + { + char Query[256]; + struct UsrFigures UsrFigures; + + if (Usr_ChkIfUsrCodExists (UsrCod)) + { + /***** Reset user's figures *****/ + Prf_ResetUsrFigures (&UsrFigures); + + /***** Get number of clicks from database *****/ + sprintf (Query,"SELECT COUNT(*) FROM log WHERE UsrCod='%ld'", + UsrCod); + UsrFigures.NumClicks = (long) DB_QueryCOUNT (Query,"can not get number of clicks"); + + /***** Update number of clicks in user's figures *****/ + if (Prf_CheckIfUsrFiguresExists (UsrCod)) + { + sprintf (Query,"UPDATE usr_figures SET NumClicks='%ld'" + " WHERE UsrCod='%ld'", + UsrFigures.NumClicks,UsrCod); + DB_QueryUPDATE (Query,"can not update user's figures"); + } + else // User entry does not exist + Prf_CreateUsrFigures (UsrCod,&UsrFigures); + } + } + +/*****************************************************************************/ +/******* Calculate number of file views and show user's profile again *******/ +/*****************************************************************************/ + +void Prf_CalculateNumFileViews (void) + { + /***** Get user's code *****/ + Usr_GetParamOtherUsrCodEncrypted (); + + /***** Get number of file views and store as user's figure *****/ + Prf_GetNumFileViewsAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); + + /***** Show user's profile again *****/ + Prf_ShowUserProfile (); + } + +/*****************************************************************************/ +/**** Get number of file views sent by a user and store in user's figures ****/ +/*****************************************************************************/ + +static void Prf_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod) + { + char Query[256]; + struct UsrFigures UsrFigures; + + if (Usr_ChkIfUsrCodExists (UsrCod)) + { + /***** Reset user's figures *****/ + Prf_ResetUsrFigures (&UsrFigures); + + /***** Get number of file views from database *****/ + UsrFigures.NumFileViews = Brw_GetNumFileViewsUsr (UsrCod); + + /***** Update number of file views in user's figures *****/ + if (Prf_CheckIfUsrFiguresExists (UsrCod)) + { + sprintf (Query,"UPDATE usr_figures SET NumFileViews='%ld'" + " WHERE UsrCod='%ld'", + UsrFigures.NumFileViews,UsrCod); + DB_QueryUPDATE (Query,"can not update user's figures"); + } + else // User entry does not exist + Prf_CreateUsrFigures (UsrCod,&UsrFigures); + } + } + +/*****************************************************************************/ +/******* Calculate number of forum posts and show user's profile again *******/ +/*****************************************************************************/ + +void Prf_CalculateNumForPst (void) + { + /***** Get user's code *****/ + Usr_GetParamOtherUsrCodEncrypted (); + + /***** Get number of forum posts and store as user's figure *****/ + Prf_GetNumForPstAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); + + /***** Show user's profile again *****/ + Prf_ShowUserProfile (); + } + +/*****************************************************************************/ +/**** Get number of forum posts sent by a user and store in user's figures ***/ +/*****************************************************************************/ + +static void Prf_GetNumForPstAndStoreAsUsrFigure (long UsrCod) + { + char Query[256]; + struct UsrFigures UsrFigures; + + if (Usr_ChkIfUsrCodExists (UsrCod)) + { + /***** Reset user's figures *****/ + Prf_ResetUsrFigures (&UsrFigures); + + /***** Get number of forum posts from database *****/ + UsrFigures.NumForPst = For_GetNumPostsUsr (UsrCod); + + /***** Update number of forum posts in user's figures *****/ + if (Prf_CheckIfUsrFiguresExists (UsrCod)) + { + sprintf (Query,"UPDATE usr_figures SET NumForPst='%ld'" + " WHERE UsrCod='%ld'", + UsrFigures.NumForPst,UsrCod); + DB_QueryUPDATE (Query,"can not update user's figures"); + } + else // User entry does not exist + Prf_CreateUsrFigures (UsrCod,&UsrFigures); + } + } + +/*****************************************************************************/ +/****** Calculate number of messages sent and show user's profile again ******/ +/*****************************************************************************/ + +void Prf_CalculateNumMsgSnt (void) + { + /***** Get user's code *****/ + Usr_GetParamOtherUsrCodEncrypted (); + + /***** Get number of messages sent and store as user's figure *****/ + Prf_GetNumMsgSntAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); + + /***** Show user's profile again *****/ + Prf_ShowUserProfile (); + } + +/*****************************************************************************/ +/***** Get number of messages sent by a user and store in user's figures *****/ +/*****************************************************************************/ + +static void Prf_GetNumMsgSntAndStoreAsUsrFigure (long UsrCod) + { + char Query[256]; + struct UsrFigures UsrFigures; + + if (Usr_ChkIfUsrCodExists (UsrCod)) + { + /***** Reset user's figures *****/ + Prf_ResetUsrFigures (&UsrFigures); + + /***** Get number of messages sent from database *****/ + UsrFigures.NumMsgSnt = Msg_GetNumMsgsSentByUsr (UsrCod); + + /***** Update number of messages sent in user's figures *****/ + if (Prf_CheckIfUsrFiguresExists (UsrCod)) + { + sprintf (Query,"UPDATE usr_figures SET NumMsgSnt='%ld'" + " WHERE UsrCod='%ld'", + UsrFigures.NumMsgSnt,UsrCod); + DB_QueryUPDATE (Query,"can not update user's figures"); + } + else // User entry does not exist + Prf_CreateUsrFigures (UsrCod,&UsrFigures); + } + } + +/*****************************************************************************/ +/********************** Reset values of user's figures ***********************/ +/*****************************************************************************/ + +static void Prf_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->NumFileViews = -1L; // unknown number of file views + UsrFigures->NumForPst = -1L; // unknown number of forum posts + UsrFigures->NumMsgSnt = -1L; // unknown number of messages sent + } + +/*****************************************************************************/ +/***** Get number of messages sent by a user and store in user's figures *****/ +/*****************************************************************************/ + +static void Prf_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures) + { + char Query[256]; + + /***** Create user's figures *****/ + sprintf (Query,"INSERT INTO usr_figures (UsrCod,FirstClickTime,NumClicks,NumFileViews,NumForPst,NumMsgSnt)" + " VALUES ('%ld','%s','%ld','%ld','%ld','%ld')", + UsrCod, + UsrFigures->FirstClickTime.YYYYMMDDHHMMSS, // 0 ==> unknown first click time or user never logged + UsrFigures->NumClicks, // -1L ==> unknown number of clicks + UsrFigures->NumFileViews, // -1L ==> unknown number of file views + UsrFigures->NumForPst, // -1L ==> unknown number of forum posts + UsrFigures->NumMsgSnt); // -1L ==> unknown number of messages sent + DB_QueryINSERT (Query,"can not create user's figures"); + } + +/*****************************************************************************/ +/**************************** Remove user's figures **************************/ +/*****************************************************************************/ + +void Prf_RemoveUsrFigures (long UsrCod) + { + char Query[128]; + + /***** Remove user's figures *****/ + sprintf (Query,"DELETE FROM usr_figures WHERE UsrCod='%ld'", + UsrCod); + DB_QueryDELETE (Query,"can not delete user's figures"); + } + +/*****************************************************************************/ +/*** Check if it exists an entry for this user in table of user's figures ****/ +/*****************************************************************************/ + +static bool Prf_CheckIfUsrFiguresExists (long UsrCod) + { + char Query[128]; + + sprintf (Query,"SELECT COUNT(*) FROM usr_figures WHERE UsrCod='%ld'", + UsrCod); + return (DB_QueryCOUNT (Query,"can not get user's first click") != 0); + } + +/*****************************************************************************/ +/*************** Increment number of clicks made by a user *******************/ +/*****************************************************************************/ + +void Prf_IncrementNumClicksUsr (long UsrCod) + { + char Query[256]; + + /***** Increment number of clicks *****/ + // If NumClicks < 0 ==> not yet calculated, so do nothing + sprintf (Query,"UPDATE IGNORE usr_figures SET NumClicks=NumClicks+1" + " WHERE UsrCod='%ld' AND NumClicks>=0", + UsrCod); + DB_QueryINSERT (Query,"can not increment user's clicks"); + } + +/*****************************************************************************/ +/************** Increment number of file views sent by a user ****************/ +/*****************************************************************************/ + +void Prf_IncrementNumFileViewsUsr (long UsrCod) + { + char Query[256]; + + /***** Increment number of file views *****/ + // If NumFileViews < 0 ==> not yet calculated, so do nothing + sprintf (Query,"UPDATE IGNORE usr_figures SET NumFileViews=NumFileViews+1" + " WHERE UsrCod='%ld' AND NumFileViews>=0", + UsrCod); + DB_QueryINSERT (Query,"can not increment user's file views"); + } + +/*****************************************************************************/ +/************* Increment number of forum posts sent by a user ****************/ +/*****************************************************************************/ + +void Prf_IncrementNumForPstUsr (long UsrCod) + { + char Query[256]; + + /***** Increment number of forum posts *****/ + // If NumForPst < 0 ==> not yet calculated, so do nothing + sprintf (Query,"UPDATE IGNORE usr_figures SET NumForPst=NumForPst+1" + " WHERE UsrCod='%ld' AND NumForPst>=0", + UsrCod); + DB_QueryINSERT (Query,"can not increment user's forum posts"); + } + +/*****************************************************************************/ +/*************** Increment number of messages sent by a user *****************/ +/*****************************************************************************/ + +void Prf_IncrementNumMsgSntUsr (long UsrCod) + { + char Query[256]; + + /***** Increment number of messages sent *****/ + // If NumMsgSnt < 0 ==> not yet calculated, so do nothing + sprintf (Query,"UPDATE IGNORE usr_figures SET NumMsgSnt=NumMsgSnt+1" + " WHERE UsrCod='%ld' AND NumMsgSnt>=0", + UsrCod); + DB_QueryINSERT (Query,"can not increment user's messages sent"); + } diff --git a/swad_profile.h b/swad_profile.h new file mode 100644 index 00000000..63045f56 --- /dev/null +++ b/swad_profile.h @@ -0,0 +1,57 @@ +// swad_profile.h: user's public profile + +#ifndef _SWAD_PRF +#define _SWAD_PRF +/* + 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-2015 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 **********************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/****************************** Public constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/******************************** Public types *******************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/****************************** Public prototypes ****************************/ +/*****************************************************************************/ + +char *Prf_GetURLPublicProfile (char *URL,const char *NicknameWithoutArroba); +void Prf_RequestUserProfile (void); +void Prf_GetUsrCodAndShowUserProfile (void); +void Prf_ChangeProfileVisibility (void); +void Prf_CalculateFirstClickTime (void); +void Prf_CalculateNumClicks (void); +void Prf_CalculateNumFileViews (void); +void Prf_CalculateNumForPst (void); +void Prf_CalculateNumMsgSnt (void); +void Prf_RemoveUsrFigures (long UsrCod); +void Prf_IncrementNumClicksUsr (long UsrCod); +void Prf_IncrementNumFileViewsUsr (long UsrCod); +void Prf_IncrementNumForPstUsr (long UsrCod); +void Prf_IncrementNumMsgSntUsr (long UsrCod); + +#endif diff --git a/swad_profile.o b/swad_profile.o new file mode 100644 index 0000000000000000000000000000000000000000..e9e1faf4ce96dce2e386c063168155082d3938d9 GIT binary patch literal 28096 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" - "" + "" "%s:" "" "", Col3Width); - Net_ShowWebsAndSocialNets (UsrDat->UsrCod); + Net_ShowWebsAndSocialNets (UsrDat); fprintf (Gbl.F.Out,"" ""); @@ -2421,7 +2419,7 @@ void Rec_ShowSharedUsrRecord (Rec_RecordViewType_t TypeOfView, { /***** User's e-mail *****/ fprintf (Gbl.F.Out,"" - "" + "" "%s:" "" "" - "" + "" "%s:" "" "" "", + " style=\"width:%upx; text-align:right;\">", ClassForm,Col1Width); if (TypeOfView == Rec_FORM_MY_COMMON_RECORD) fprintf (Gbl.F.Out,"%s*",Txt_Sex); @@ -2586,7 +2584,8 @@ void Rec_ShowSharedUsrRecord (Rec_RecordViewType_t TypeOfView, } else // RoleForm == false fprintf (Gbl.F.Out,"" - "" + "" "%s:" "" "" - "" + "" "%s", ClassForm,Col1Width,Txt_Surname_1); if (TypeOfView == Rec_FORM_MY_COMMON_RECORD) @@ -2624,7 +2623,7 @@ void Rec_ShowSharedUsrRecord (Rec_RecordViewType_t TypeOfView, /* Surname 2 */ fprintf (Gbl.F.Out,"" - "" + "" "%s:" "" "" - "" + "" "%s", ClassForm,Col1Width,Txt_First_name); if (TypeOfView == Rec_FORM_MY_COMMON_RECORD) @@ -2666,7 +2665,7 @@ void Rec_ShowSharedUsrRecord (Rec_RecordViewType_t TypeOfView, /* Country */ fprintf (Gbl.F.Out,"" "" + " style=\"width:%upx; text-align:right;\">" "%s", ClassForm,Col1Width,Txt_Country); if (TypeOfView == Rec_FORM_MY_COMMON_RECORD) @@ -2714,32 +2713,12 @@ void Rec_ShowSharedUsrRecord (Rec_RecordViewType_t TypeOfView, fprintf (Gbl.F.Out,"" ""); - /***** Shortcut to the user's profile *****/ - if (TypeOfView == Rec_RECORD_PUBLIC) - fprintf (Gbl.F.Out,"" - "" - "%s:" - "" - "" - "" - "%s/%s?usr=@%s" - "" - "" - "", - ClassForm,Col1Width,Txt_Shortcut, - ClassData,Cols2and3Width, - Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],UsrDat->Nickname, - ClassData, - Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],UsrDat->Nickname); - if (ShowAddressRows) { /* Origin place */ fprintf (Gbl.F.Out,"" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" "" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" "" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" "" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" "" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" "" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" "" "" + " text-align:right; vertical-align:top;\">" "%s:" "" "" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" "" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" "" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" "" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" "" "" + " style=\"width:%upx; text-align:right;\">" "%s:" "" " 0) - Usr_IncrementNumClicksUsr (Gbl.Usrs.Me.UsrDat.UsrCod); + Prf_IncrementNumClicksUsr (Gbl.Usrs.Me.UsrDat.UsrCod); } /*****************************************************************************/ diff --git a/swad_text.c b/swad_text.c index 357bcfff..28448d38 100644 --- a/swad_text.c +++ b/swad_text.c @@ -10934,28 +10934,7 @@ const char *Txt_Field_BR_name = #elif L==8 "Nome
do campo"; #endif -/* -const char *Txt_Figures = -#if L==0 - "Xifres"; -#elif L==1 - "Zahlen"; -#elif L==2 - "Figures"; -#elif L==3 - "Cifras"; -#elif L==4 - "Chiffres"; -#elif L==5 - "Cifras"; // Okoteve traducción -#elif L==6 - "Cifre"; -#elif L==7 - "Cyfry"; -#elif L==8 - "Números"; -#endif -*/ + const char *Txt_File = #if L==0 "Fitxer"; diff --git a/swad_theme.c b/swad_theme.c index 652943e9..cad0fc76 100644 --- a/swad_theme.c +++ b/swad_theme.c @@ -282,7 +282,7 @@ void The_ChangeTheme (void) } /***** Set preferences from current IP *****/ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); } /*****************************************************************************/ diff --git a/swad_user.c b/swad_user.c index f93faf2f..f6cbb2fb 100644 --- a/swad_user.c +++ b/swad_user.c @@ -91,16 +91,6 @@ const char *Usr_UsrDatMainFieldNames[Usr_NUM_MAIN_FIELDS_DATA_USR]; /****************************** Internal types *******************************/ /*****************************************************************************/ -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 NumFileViews; // -1L ==> unknown number of file views - long NumForPst; // -1L ==> unknown number of forum posts - long NumMsgSnt; // -1L ==> unknown number of messages sent - }; - /*****************************************************************************/ /************** External global variables from others modules ****************/ /*****************************************************************************/ @@ -120,9 +110,6 @@ static void Usr_GetMyLastData (void); static void Usr_GetUsrCommentsFromString (char *Str,struct UsrData *UsrDat); static Usr_Sex_t Usr_GetSexFromStr (const char *Str); -static unsigned Usr_GetNumCrssOfUsrWithARole (long UsrCod,Rol_Role_t Role); -static unsigned Usr_GetNumUsrsInCrssOfAUsr (long UsrCod,Rol_Role_t UsrRole,Rol_Role_t OthersRole); - static bool Usr_CheckIfMyBirthdayHasNotBeenCongratulated (void); static void Usr_InsertMyBirthday (void); @@ -184,23 +171,6 @@ static unsigned Usr_GetNumUsrsBelongingToAnyCrs (Rol_Role_t Role); static float Usr_GetNumCrssPerUsr (Rol_Role_t Role); static float Usr_GetNumUsrsPerCrs (Rol_Role_t Role); -static void Usr_ShowUserProfile (void); -static void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat); -static void Usr_ShowHistoricUserProfile (const struct UsrData *UsrDat); -static void Usr_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures); -static unsigned long Usr_GetRankingNumClicks (long UsrCod); -static unsigned long Usr_GetNumUsrsWithNumClicks (void); -static unsigned long Usr_GetRankingNumClicksPerDay (long UsrCod); -static unsigned long Usr_GetNumUsrsWithNumClicksPerDay (void); -static void Usr_GetFirstClickFromLogAndStoreAsUsrFigure (long UsrCod); -static void Usr_GetNumClicksAndStoreAsUsrFigure (long UsrCod); -static void Usr_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod); -static void Usr_GetNumForPstAndStoreAsUsrFigure (long UsrCod); -static void Usr_GetNumMsgSntAndStoreAsUsrFigure (long UsrCod); -static void Usr_ResetUsrFigures (struct UsrFigures *UsrFigures); -static void Usr_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures); -static bool Usr_CheckIfUsrFiguresExists (long UsrCod); - /*****************************************************************************/ /**** Show alert about number of clicks remaining before sending my photo ****/ /*****************************************************************************/ @@ -759,7 +729,7 @@ bool Usr_CheckIfUsrIsSuperuser (long UsrCod) /********* Get number of courses in with a user have a given role ************/ /*****************************************************************************/ -static unsigned Usr_GetNumCrssOfUsrWithARole (long UsrCod,Rol_Role_t Role) +unsigned Usr_GetNumCrssOfUsrWithARole (long UsrCod,Rol_Role_t Role) { char Query[128]; @@ -774,7 +744,7 @@ static unsigned Usr_GetNumCrssOfUsrWithARole (long UsrCod,Rol_Role_t Role) /******* Get number of users with different role in courses of a user ********/ /*****************************************************************************/ -static unsigned Usr_GetNumUsrsInCrssOfAUsr (long UsrCod,Rol_Role_t UsrRole,Rol_Role_t OthersRole) +unsigned Usr_GetNumUsrsInCrssOfAUsr (long UsrCod,Rol_Role_t UsrRole,Rol_Role_t OthersRole) { char Query[256]; @@ -1786,7 +1756,7 @@ void Usr_ChkUsrAndGetUsrData (void) Ses_CreateSession (); /* Set preferences from current IP */ - Prf_SetPrefsFromIP (); + Pre_SetPrefsFromIP (); /* Send message via email to confirm the new email address */ Mai_SendMailMsgToConfirmEmail (); @@ -1824,7 +1794,7 @@ void Usr_ChkUsrAndGetUsrData (void) Act_AdjustCurrentAction (); Ses_CreateSession (); - Prf_SetPrefsFromIP (); // Set preferences from current IP + Pre_SetPrefsFromIP (); // Set preferences from current IP } else PutFormLogin = true; @@ -1839,7 +1809,7 @@ void Usr_ChkUsrAndGetUsrData (void) Act_AdjustCurrentAction (); Ses_CreateSession (); - Prf_SetPrefsFromIP (); // Set preferences from current IP + Pre_SetPrefsFromIP (); // Set preferences from current IP Imp_InsertImpSessionInDB (); } @@ -7435,1002 +7405,3 @@ static float Usr_GetNumUsrsPerCrs (Rol_Role_t Role) return NumUsrsPerCrs; } - -/*****************************************************************************/ -/************************** Request a user's profile *************************/ -/*****************************************************************************/ - -void Usr_RequestUserProfile (void) - { - extern const char *Txt_View_public_profile; - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_Nickname; - extern const char *Txt_Continue; - - /***** Start frame *****/ - Lay_StartRoundFrameTable10 (NULL,2,Txt_View_public_profile); - fprintf (Gbl.F.Out,"" - ""); - - /***** Form to request user's @nickname *****/ - Act_FormStart (ActSeePubPrf); - fprintf (Gbl.F.Out,"
" - "%s: " - "" - "
", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_Nickname, - Nck_MAX_BYTES_NICKNAME_WITH_ARROBA); - - /***** Send button*****/ - Lay_PutSendButton (Txt_Continue); - Act_FormEnd (); - - /***** End frame *****/ - fprintf (Gbl.F.Out,"" - ""); - Lay_EndRoundFrameTable10 (); - } - -/*****************************************************************************/ -/**************** Get user's code and show a user's profile ******************/ -/*****************************************************************************/ - -void Usr_GetUsrCodAndShowUserProfile (void) - { - char Nickname[Nck_MAX_BYTES_NICKNAME_WITH_ARROBA + 1]; - long OtherUsrCod; - - /***** Get user from nickname *****/ - if (Gbl.Usrs.Other.UsrDat.UsrCod < 0) - { - Par_GetParToText ("usr",Nickname,Nck_MAX_BYTES_NICKNAME_WITH_ARROBA); - if ((OtherUsrCod = Nck_GetUsrCodFromNickname (Nickname)) > 0) - { - Gbl.Usrs.Other.UsrDat.UsrCod = OtherUsrCod; - Gbl.CurrentAct = ActSeePubPrf; - } - else - Usr_GetParamOtherUsrCodEncrypted (); - } - - /***** Show user's profile *****/ - Usr_ShowUserProfile (); - } - -/*****************************************************************************/ -/*************************** Show a user's profile ***************************/ -/*****************************************************************************/ - -static void Usr_ShowUserProfile (void) - { - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; - bool Error = false; - - /***** Check if user exists and get his data *****/ - if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat)) // Existing user - { - /***** Check if I can see the public profile *****/ - if (Pri_ShowIsAllowed (Gbl.Usrs.Other.UsrDat.ProfileVisibility,Gbl.Usrs.Other.UsrDat.UsrCod)) - { - if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected - { - /* Get user's role in current course */ - Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB = Rol_GetRoleInCrs (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Usrs.Other.UsrDat.UsrCod); - - /* Get if user has accepted enrollment in current course */ - Gbl.Usrs.Other.UsrDat.Accepted = Usr_GetIfUserHasAcceptedEnrollmentInCurrentCrs (Gbl.Usrs.Other.UsrDat.UsrCod); - } - - fprintf (Gbl.F.Out,"
" - "" - "" - "" - "" - "" - "
"); - - /***** Common record *****/ - Rec_ShowSharedUsrRecord (Rec_RECORD_PUBLIC,&Gbl.Usrs.Other.UsrDat); - - /***** Show details of user's profile *****/ - Usr_ShowDetailsUserProfile (&Gbl.Usrs.Other.UsrDat); - - fprintf (Gbl.F.Out,""); - - /***** Show historic user's profile *****/ - Usr_ShowHistoricUserProfile (&Gbl.Usrs.Other.UsrDat); - - fprintf (Gbl.F.Out,"
" - "
"); - } - else - Error = true; - } - else - Error = true; - - if (Error) - { - /***** Show error message *****/ - Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); - - /***** Request nickname again *****/ - Usr_RequestUserProfile (); - } - } - -/*****************************************************************************/ -/******************** Change my public profile visibility ********************/ -/*****************************************************************************/ - -void Usr_ChangeProfileVisibility (void) - { - extern const char *Pri_VisibilityDB[Pri_NUM_OPTIONS_PRIVACY]; - extern const char *Txt_The_visibility_of_your_public_profile_has_changed; - char Query[128]; - - /***** Get param with public/private photo *****/ - Gbl.Usrs.Me.UsrDat.ProfileVisibility = Pri_GetParamVisibility (); - - /***** Store public/private photo in database *****/ - sprintf (Query,"UPDATE usr_data SET ProfileVisibility='%s'" - " WHERE UsrCod='%ld'", - Pri_VisibilityDB[Gbl.Usrs.Me.UsrDat.ProfileVisibility], - Gbl.Usrs.Me.UsrDat.UsrCod); - DB_QueryUPDATE (Query,"can not update your preference about public profile visibility"); - - /***** Show alert *****/ - Lay_ShowAlert (Lay_SUCCESS,Txt_The_visibility_of_your_public_profile_has_changed); - - /***** Show form again *****/ - Pri_EditMyPrivacy (); - } - -/*****************************************************************************/ -/********************** Show details of user's profile ***********************/ -/*****************************************************************************/ - -static void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - // extern const char *Txt_Figures; - extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - extern const char *Txt_ROLES_SINGUL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - extern const char *Txt_course; - extern const char *Txt_courses; - extern const char *Txt_Files; - extern const char *Txt_files; - extern const char *Txt_public_FILES; - unsigned NumCrssUsrIsTeacher; - unsigned NumCrssUsrIsStudent; - unsigned NumStds; - unsigned NumTchs; - unsigned NumFiles; - unsigned NumPublicFiles; - - /***** Start table *****/ - fprintf (Gbl.F.Out,"" - ""); - - /***** Number of courses in which the user is teacher or student *****/ - if ((NumCrssUsrIsTeacher = Usr_GetNumCrssOfUsrWithARole (UsrDat->UsrCod,Rol_ROLE_TEACHER))) - { - NumTchs = Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_ROLE_TEACHER,Rol_ROLE_TEACHER); - NumStds = Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_ROLE_TEACHER,Rol_ROLE_STUDENT); - fprintf (Gbl.F.Out,"" - "", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_ROLES_SINGUL_Abc[Rol_ROLE_TEACHER][UsrDat->Sex], - NumCrssUsrIsTeacher, - (NumCrssUsrIsTeacher == 1) ? Txt_course : - Txt_courses, - NumTchs, - (NumTchs == 1) ? Txt_ROLES_SINGUL_abc[Rol_ROLE_TEACHER][Usr_SEX_UNKNOWN] : - Txt_ROLES_PLURAL_abc[Rol_ROLE_TEACHER][Usr_SEX_UNKNOWN], - NumStds, - (NumStds == 1) ? Txt_ROLES_SINGUL_abc[Rol_ROLE_STUDENT][Usr_SEX_UNKNOWN] : - Txt_ROLES_PLURAL_abc[Rol_ROLE_STUDENT][Usr_SEX_UNKNOWN]); - } - if ((NumCrssUsrIsStudent = Usr_GetNumCrssOfUsrWithARole (UsrDat->UsrCod,Rol_ROLE_STUDENT))) - { - NumTchs = Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_ROLE_STUDENT,Rol_ROLE_TEACHER); - NumStds = Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_ROLE_STUDENT,Rol_ROLE_STUDENT); - fprintf (Gbl.F.Out,"" - "", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_ROLES_SINGUL_Abc[Rol_ROLE_STUDENT][UsrDat->Sex], - NumCrssUsrIsStudent, - (NumCrssUsrIsStudent == 1) ? Txt_course : - Txt_courses, - NumTchs, - (NumTchs == 1) ? Txt_ROLES_SINGUL_abc[Rol_ROLE_TEACHER][Usr_SEX_UNKNOWN] : - Txt_ROLES_PLURAL_abc[Rol_ROLE_TEACHER][Usr_SEX_UNKNOWN], - NumStds, - (NumStds == 1) ? Txt_ROLES_SINGUL_abc[Rol_ROLE_STUDENT][Usr_SEX_UNKNOWN] : - Txt_ROLES_PLURAL_abc[Rol_ROLE_STUDENT][Usr_SEX_UNKNOWN]); - } - - /***** Number of files currently published *****/ - if ((NumFiles = Brw_GetNumFilesUsr (UsrDat->UsrCod))) - NumPublicFiles = Brw_GetNumPublicFilesUsr (UsrDat->UsrCod); - else - NumPublicFiles = 0; - fprintf (Gbl.F.Out,"" - "", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_Files, - NumFiles,Txt_files, - NumPublicFiles,Txt_public_FILES); - - /***** End of table *****/ - fprintf (Gbl.F.Out,"" - "
" - "%s" - "" - "%u %s
" - "%u %s
" - "%u %s" - "" - "
" - "%s" - "" - "%u %s
" - "%u %s
" - "%u %s" - "" - "
" - "%s" - "" - "%u %s
" - "%u %s" - "" - "
"); - } - -/*****************************************************************************/ -/********************** Show details of user's profile ***********************/ -/*****************************************************************************/ - -static void Usr_ShowHistoricUserProfile (const struct UsrData *UsrDat) - { - extern const char *The_ClassFormul[The_NUM_THEMES]; - extern const char *Txt_From_TIME; - extern const char *Txt_day; - extern const char *Txt_days; - extern const char *Txt_Calculate; - extern const char *Txt_Clicks; - extern const char *Txt_of_PART_OF_A_TOTAL; - extern const char *Txt_clicks; - extern const char *Txt_Downloads; - extern const char *Txt_download; - extern const char *Txt_downloads; - extern const char *Txt_Forums; - extern const char *Txt_post; - extern const char *Txt_posts; - extern const char *Txt_Messages; - extern const char *Txt_message; - extern const char *Txt_messages; - struct UsrFigures UsrFigures; - - /***** Start table *****/ - fprintf (Gbl.F.Out,""); - - /***** Get figures *****/ - Usr_GetUsrFigures (UsrDat->UsrCod,&UsrFigures); - - /* First click time */ - fprintf (Gbl.F.Out,"" - "" - "" - ""); - - /* Number of clicks */ - fprintf (Gbl.F.Out,"" - "" - "" - ""); - - /***** Number of file views *****/ - fprintf (Gbl.F.Out,"" - "" - "" - ""); - - /***** Number of posts in forums *****/ - fprintf (Gbl.F.Out,"" - "" - "" - ""); - - /***** Number of messages sent *****/ - fprintf (Gbl.F.Out,"" - "" - "" - ""); - - /***** End of table *****/ - fprintf (Gbl.F.Out,"
" - "%s" - "", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_From_TIME); - if (UsrFigures.FirstClickTime.Date.Year) - { - Dat_WriteDate (UsrFigures.FirstClickTime.Date.YYYYMMDD); - 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 - { - /***** Button to fetch and store first click time *****/ - Act_FormStart (ActCal1stClkTim); - Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); - Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme], - "calculate1","calculating1"); - Lay_PutCalculateIcon (Txt_Calculate,Txt_Calculate, - "calculate1","calculating1"); - Act_FormEnd (); - } - fprintf (Gbl.F.Out,"
" - "%s" - "", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_Clicks); - if (UsrFigures.NumClicks >= 0) - { - fprintf (Gbl.F.Out,"%ld %s" - "
" - "#%ld" - " %s %ld" - "
", - UsrFigures.NumClicks,Txt_clicks, - Usr_GetRankingNumClicks (UsrDat->UsrCod), - Txt_of_PART_OF_A_TOTAL, - Usr_GetNumUsrsWithNumClicks ()); - if (UsrFigures.NumDays >= 0) - { - Str_WriteFloatNum ((float) UsrFigures.NumClicks / - (float) (UsrFigures.NumDays + 1)); - fprintf (Gbl.F.Out," / %s" - "
" - "#%ld" - " %s %ld" - "
", - Txt_day, - Usr_GetRankingNumClicksPerDay (UsrDat->UsrCod), - Txt_of_PART_OF_A_TOTAL, - Usr_GetNumUsrsWithNumClicksPerDay ()); - } - } - else // Number of clicks is unknown - { - /***** Button to fetch and store number of clicks *****/ - Act_FormStart (ActCalNumClk); - Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); - Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme], - "calculate2","calculating2"); - Lay_PutCalculateIcon (Txt_Calculate,Txt_Calculate, - "calculate2","calculating2"); - Act_FormEnd (); - } - fprintf (Gbl.F.Out,"
" - "%s" - "", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_Downloads); - if (UsrFigures.NumFileViews >= 0) - { - fprintf (Gbl.F.Out,"%ld %s", - UsrFigures.NumFileViews, - (UsrFigures.NumFileViews == 1) ? Txt_download : - Txt_downloads); - if (UsrFigures.NumDays >= 0) - { - fprintf (Gbl.F.Out,"
"); - Str_WriteFloatNum ((float) UsrFigures.NumFileViews / - (float) (UsrFigures.NumDays + 1)); - fprintf (Gbl.F.Out," / %s",Txt_day); - } - } - else // Number of file views is unknown - { - /***** Button to fetch and store number of file views *****/ - Act_FormStart (ActCalNumFilVie); - Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); - Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme], - "calculate3","calculating3"); - Lay_PutCalculateIcon (Txt_Calculate,Txt_Calculate, - "calculate3","calculating3"); - Act_FormEnd (); - } - fprintf (Gbl.F.Out,"
" - "%s" - "", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_Forums); - if (UsrFigures.NumForPst >= 0) - { - fprintf (Gbl.F.Out,"%ld %s", - UsrFigures.NumForPst, - (UsrFigures.NumForPst == 1) ? Txt_post : - Txt_posts); - 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 *****/ - Act_FormStart (ActCalNumForPst); - Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); - Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme], - "calculate4","calculating4"); - Lay_PutCalculateIcon (Txt_Calculate,Txt_Calculate, - "calculate4","calculating4"); - Act_FormEnd (); - } - fprintf (Gbl.F.Out,"
" - "%s" - "", - The_ClassFormul[Gbl.Prefs.Theme], - Txt_Messages); - if (UsrFigures.NumMsgSnt >= 0) - { - fprintf (Gbl.F.Out,"%ld %s", - UsrFigures.NumMsgSnt, - (UsrFigures.NumMsgSnt == 1) ? Txt_message : - Txt_messages); - 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 *****/ - Act_FormStart (ActCalNumMsgSnt); - Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); - Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme], - "calculate5","calculating5"); - Lay_PutCalculateIcon (Txt_Calculate,Txt_Calculate, - "calculate5","calculating5"); - Act_FormEnd (); - } - fprintf (Gbl.F.Out,"
"); - } - -/*****************************************************************************/ -/********************** Select values on user's figures **********************/ -/*****************************************************************************/ - -static void Usr_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures) - { - char Query[512]; - MYSQL_RES *mysql_res; - MYSQL_ROW row; - unsigned NumRows; - - /***** Get user's figures from database *****/ - sprintf (Query,"SELECT DATE_FORMAT(FirstClickTime,'%%Y%%m%%d%%H%%i%%S')," - "DATEDIFF(NOW(),FirstClickTime)," - "NumClicks,NumFileViews,NumForPst,NumMsgSnt" - " FROM usr_figures WHERE UsrCod='%ld'", - UsrCod); - if ((NumRows = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get user's figures"))) - { - /***** Get user's figures *****/ - row = mysql_fetch_row (mysql_res); - - /* Get first click (row[0] holds the start date in YYYYMMDDHHMMSS format) */ - if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(UsrFigures->FirstClickTime),row[0]))) - Lay_ShowErrorAndExit ("Error when reading first click time."); - - /* 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 file views (row[3]) */ - if (sscanf (row[3],"%ld",&UsrFigures->NumFileViews) != 1) - UsrFigures->NumFileViews = -1L; - - /* Get number of forum posts (row[4]) */ - if (sscanf (row[4],"%ld",&UsrFigures->NumForPst) != 1) - UsrFigures->NumForPst = -1L; - - /* Get number of messages sent (row[5]) */ - if (sscanf (row[5],"%ld",&UsrFigures->NumMsgSnt) != 1) - UsrFigures->NumMsgSnt = -1L; - } - else - /***** Return special user's figures indicating "not present" *****/ - Usr_ResetUsrFigures (UsrFigures); - - /***** Free structure that stores the query result *****/ - DB_FreeMySQLResult (&mysql_res); - } - -/*****************************************************************************/ -/********** Get ranking of a user according to the number of clicks **********/ -/*****************************************************************************/ - -static unsigned long Usr_GetRankingNumClicks (long UsrCod) - { - char Query[128]; - - /***** Select number of rows with number of clicks - greater than the clicks of this user *****/ - sprintf (Query,"SELECT COUNT(*)+1 FROM usr_figures" - " WHERE UsrCod<>'%ld'" // Really not necessary here - " AND NumClicks>" - "(SELECT NumClicks FROM usr_figures WHERE UsrCod='%ld')", - UsrCod,UsrCod); - return DB_QueryCOUNT (Query,"can not get ranking using number of clicks"); - } - -/*****************************************************************************/ -/******************* Get number of users with number of clicks ***************/ -/*****************************************************************************/ - -static unsigned long Usr_GetNumUsrsWithNumClicks (void) - { - char Query[128]; - - /***** Select number of rows with values already calculated *****/ - sprintf (Query,"SELECT COUNT(*) FROM usr_figures WHERE NumClicks>='0'"); - return DB_QueryCOUNT (Query,"can not get number of users with number of clicks"); - } - -/*****************************************************************************/ -/****** Get ranking of a user according to the number of clicks per day ******/ -/*****************************************************************************/ - -static unsigned long Usr_GetRankingNumClicksPerDay (long UsrCod) - { - char Query[512]; - - /***** Select number of rows with number of clicks per day - greater than the clicks per day of this user *****/ - sprintf (Query,"SELECT COUNT(*)+1 FROM" - " (SELECT NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1)" - " AS NumClicksPerDay" - " FROM usr_figures" - " WHERE UsrCod<>'%ld'" // Necessary because the following comparison is not exact in floating point - " AND NumClicks>='0' AND UNIX_TIMESTAMP(FirstClickTime)>'0')" - " AS TableNumClicksPerDay" - " WHERE NumClicksPerDay>" - "(SELECT NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1)" - " FROM usr_figures" - " WHERE UsrCod='%ld'" - " AND NumClicks>='0' AND UNIX_TIMESTAMP(FirstClickTime)>'0')", - UsrCod,UsrCod); - return DB_QueryCOUNT (Query,"can not get ranking using number of clicks per day"); - } - -/*****************************************************************************/ -/************** Get number of users with number of clicks per day ************/ -/*****************************************************************************/ - -static unsigned long Usr_GetNumUsrsWithNumClicksPerDay (void) - { - char Query[128]; - - /***** Select number of rows with values already calculated *****/ - sprintf (Query,"SELECT COUNT(*) FROM usr_figures" - " WHERE NumClicks>='0' AND UNIX_TIMESTAMP(FirstClickTime)>'0'"); - return DB_QueryCOUNT (Query,"can not get number of users with number of clicks per day"); - } - -/*****************************************************************************/ -/********* Calculate first click time and show user's profile again **********/ -/*****************************************************************************/ - -void Usr_CalculateFirstClickTime (void) - { - /***** Get user's code *****/ - Usr_GetParamOtherUsrCodEncrypted (); - - /***** Get first click time from log and store as user's figure *****/ - Usr_GetFirstClickFromLogAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); - - /***** Show user's profile again *****/ - Usr_ShowUserProfile (); - } - -/*****************************************************************************/ -/*** Get first click of a user from log table and store in user's figures ****/ -/*****************************************************************************/ - -static void Usr_GetFirstClickFromLogAndStoreAsUsrFigure (long UsrCod) - { - char Query[256]; - MYSQL_RES *mysql_res; - MYSQL_ROW row; - struct UsrFigures UsrFigures; - - if (Usr_ChkIfUsrCodExists (UsrCod)) - { - /***** Reset user's figures *****/ - Usr_ResetUsrFigures (&UsrFigures); - - /***** Get first click from log table *****/ - sprintf (Query,"SELECT DATE_FORMAT(" - "(SELECT MIN(ClickTime) FROM log WHERE UsrCod='%ld')" - ",'%%Y%%m%%d%%H%%i%%S')", - UsrCod); - if (DB_QuerySELECT (Query,&mysql_res,"can not get user's first click")) - { - /* Get first click */ - row = mysql_fetch_row (mysql_res); - - /* Get first click (row[0] holds the start date in YYYYMMDDHHMMSS format) */ - if (row[0]) // It is NULL when user never logged - if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(UsrFigures.FirstClickTime),row[0]))) - Lay_ShowErrorAndExit ("Error when reading first click time."); - } - /* Free structure that stores the query result */ - DB_FreeMySQLResult (&mysql_res); - - /***** Update first click time in user's figures *****/ - if (Usr_CheckIfUsrFiguresExists (UsrCod)) - { - sprintf (Query,"UPDATE usr_figures SET FirstClickTime='%s'" - " WHERE UsrCod='%ld'", - UsrFigures.FirstClickTime.YYYYMMDDHHMMSS,UsrCod); - DB_QueryUPDATE (Query,"can not update user's figures"); - } - else // User entry does not exist - Usr_CreateUsrFigures (UsrCod,&UsrFigures); - } - } - -/*****************************************************************************/ -/********* Calculate number of clicks and show user's profile again **********/ -/*****************************************************************************/ - -void Usr_CalculateNumClicks (void) - { - /***** Get user's code *****/ - Usr_GetParamOtherUsrCodEncrypted (); - - /***** Get number of clicks and store as user's figure *****/ - Usr_GetNumClicksAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); - - /***** Show user's profile again *****/ - Usr_ShowUserProfile (); - } - -/*****************************************************************************/ -/* Get number of clicks of a user from log table and store in user's figures */ -/*****************************************************************************/ - -static void Usr_GetNumClicksAndStoreAsUsrFigure (long UsrCod) - { - char Query[256]; - struct UsrFigures UsrFigures; - - if (Usr_ChkIfUsrCodExists (UsrCod)) - { - /***** Reset user's figures *****/ - Usr_ResetUsrFigures (&UsrFigures); - - /***** Get number of clicks from database *****/ - sprintf (Query,"SELECT COUNT(*) FROM log WHERE UsrCod='%ld'", - UsrCod); - UsrFigures.NumClicks = (long) DB_QueryCOUNT (Query,"can not get number of clicks"); - - /***** Update number of clicks in user's figures *****/ - if (Usr_CheckIfUsrFiguresExists (UsrCod)) - { - sprintf (Query,"UPDATE usr_figures SET NumClicks='%ld'" - " WHERE UsrCod='%ld'", - UsrFigures.NumClicks,UsrCod); - DB_QueryUPDATE (Query,"can not update user's figures"); - } - else // User entry does not exist - Usr_CreateUsrFigures (UsrCod,&UsrFigures); - } - } - -/*****************************************************************************/ -/******* Calculate number of file views and show user's profile again *******/ -/*****************************************************************************/ - -void Usr_CalculateNumFileViews (void) - { - /***** Get user's code *****/ - Usr_GetParamOtherUsrCodEncrypted (); - - /***** Get number of file views and store as user's figure *****/ - Usr_GetNumFileViewsAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); - - /***** Show user's profile again *****/ - Usr_ShowUserProfile (); - } - -/*****************************************************************************/ -/**** Get number of file views sent by a user and store in user's figures ****/ -/*****************************************************************************/ - -static void Usr_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod) - { - char Query[256]; - struct UsrFigures UsrFigures; - - if (Usr_ChkIfUsrCodExists (UsrCod)) - { - /***** Reset user's figures *****/ - Usr_ResetUsrFigures (&UsrFigures); - - /***** Get number of file views from database *****/ - UsrFigures.NumFileViews = Brw_GetNumFileViewsUsr (UsrCod); - - /***** Update number of file views in user's figures *****/ - if (Usr_CheckIfUsrFiguresExists (UsrCod)) - { - sprintf (Query,"UPDATE usr_figures SET NumFileViews='%ld'" - " WHERE UsrCod='%ld'", - UsrFigures.NumFileViews,UsrCod); - DB_QueryUPDATE (Query,"can not update user's figures"); - } - else // User entry does not exist - Usr_CreateUsrFigures (UsrCod,&UsrFigures); - } - } - -/*****************************************************************************/ -/******* Calculate number of forum posts and show user's profile again *******/ -/*****************************************************************************/ - -void Usr_CalculateNumForPst (void) - { - /***** Get user's code *****/ - Usr_GetParamOtherUsrCodEncrypted (); - - /***** Get number of forum posts and store as user's figure *****/ - Usr_GetNumForPstAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); - - /***** Show user's profile again *****/ - Usr_ShowUserProfile (); - } - -/*****************************************************************************/ -/**** Get number of forum posts sent by a user and store in user's figures ***/ -/*****************************************************************************/ - -static void Usr_GetNumForPstAndStoreAsUsrFigure (long UsrCod) - { - char Query[256]; - struct UsrFigures UsrFigures; - - if (Usr_ChkIfUsrCodExists (UsrCod)) - { - /***** Reset user's figures *****/ - Usr_ResetUsrFigures (&UsrFigures); - - /***** Get number of forum posts from database *****/ - UsrFigures.NumForPst = For_GetNumPostsUsr (UsrCod); - - /***** Update number of forum posts in user's figures *****/ - if (Usr_CheckIfUsrFiguresExists (UsrCod)) - { - sprintf (Query,"UPDATE usr_figures SET NumForPst='%ld'" - " WHERE UsrCod='%ld'", - UsrFigures.NumForPst,UsrCod); - DB_QueryUPDATE (Query,"can not update user's figures"); - } - else // User entry does not exist - Usr_CreateUsrFigures (UsrCod,&UsrFigures); - } - } - -/*****************************************************************************/ -/****** Calculate number of messages sent and show user's profile again ******/ -/*****************************************************************************/ - -void Usr_CalculateNumMsgSnt (void) - { - /***** Get user's code *****/ - Usr_GetParamOtherUsrCodEncrypted (); - - /***** Get number of messages sent and store as user's figure *****/ - Usr_GetNumMsgSntAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); - - /***** Show user's profile again *****/ - Usr_ShowUserProfile (); - } - -/*****************************************************************************/ -/***** Get number of messages sent by a user and store in user's figures *****/ -/*****************************************************************************/ - -static void Usr_GetNumMsgSntAndStoreAsUsrFigure (long UsrCod) - { - char Query[256]; - struct UsrFigures UsrFigures; - - if (Usr_ChkIfUsrCodExists (UsrCod)) - { - /***** Reset user's figures *****/ - Usr_ResetUsrFigures (&UsrFigures); - - /***** Get number of messages sent from database *****/ - UsrFigures.NumMsgSnt = Msg_GetNumMsgsSentByUsr (UsrCod); - - /***** Update number of messages sent in user's figures *****/ - if (Usr_CheckIfUsrFiguresExists (UsrCod)) - { - sprintf (Query,"UPDATE usr_figures SET NumMsgSnt='%ld'" - " WHERE UsrCod='%ld'", - UsrFigures.NumMsgSnt,UsrCod); - DB_QueryUPDATE (Query,"can not update user's figures"); - } - else // User entry does not exist - Usr_CreateUsrFigures (UsrCod,&UsrFigures); - } - } - -/*****************************************************************************/ -/********************** Reset values of user's figures ***********************/ -/*****************************************************************************/ - -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->NumFileViews = -1L; // unknown number of file views - UsrFigures->NumForPst = -1L; // unknown number of forum posts - UsrFigures->NumMsgSnt = -1L; // unknown number of messages sent - } - -/*****************************************************************************/ -/***** Get number of messages sent by a user and store in user's figures *****/ -/*****************************************************************************/ - -static void Usr_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures) - { - char Query[256]; - - /***** Create user's figures *****/ - sprintf (Query,"INSERT INTO usr_figures (UsrCod,FirstClickTime,NumClicks,NumFileViews,NumForPst,NumMsgSnt)" - " VALUES ('%ld','%s','%ld','%ld','%ld','%ld')", - UsrCod, - UsrFigures->FirstClickTime.YYYYMMDDHHMMSS, // 0 ==> unknown first click time or user never logged - UsrFigures->NumClicks, // -1L ==> unknown number of clicks - UsrFigures->NumFileViews, // -1L ==> unknown number of file views - UsrFigures->NumForPst, // -1L ==> unknown number of forum posts - UsrFigures->NumMsgSnt); // -1L ==> unknown number of messages sent - DB_QueryINSERT (Query,"can not create user's figures"); - } - -/*****************************************************************************/ -/**************************** Remove user's figures **************************/ -/*****************************************************************************/ - -void Usr_RemoveUsrFigures (long UsrCod) - { - char Query[128]; - - /***** Remove user's figures *****/ - sprintf (Query,"DELETE FROM usr_figures WHERE UsrCod='%ld'", - UsrCod); - DB_QueryDELETE (Query,"can not delete user's figures"); - } - -/*****************************************************************************/ -/*** Check if it exists an entry for this user in table of user's figures ****/ -/*****************************************************************************/ - -static bool Usr_CheckIfUsrFiguresExists (long UsrCod) - { - char Query[128]; - - sprintf (Query,"SELECT COUNT(*) FROM usr_figures WHERE UsrCod='%ld'", - UsrCod); - return (DB_QueryCOUNT (Query,"can not get user's first click") != 0); - } - -/*****************************************************************************/ -/*************** Increment number of clicks made by a user *******************/ -/*****************************************************************************/ - -void Usr_IncrementNumClicksUsr (long UsrCod) - { - char Query[256]; - - /***** Increment number of clicks *****/ - // If NumClicks < 0 ==> not yet calculated, so do nothing - sprintf (Query,"UPDATE IGNORE usr_figures SET NumClicks=NumClicks+1" - " WHERE UsrCod='%ld' AND NumClicks>=0", - UsrCod); - DB_QueryINSERT (Query,"can not increment user's clicks"); - } - -/*****************************************************************************/ -/************** Increment number of file views sent by a user ****************/ -/*****************************************************************************/ - -void Usr_IncrementNumFileViewsUsr (long UsrCod) - { - char Query[256]; - - /***** Increment number of file views *****/ - // If NumFileViews < 0 ==> not yet calculated, so do nothing - sprintf (Query,"UPDATE IGNORE usr_figures SET NumFileViews=NumFileViews+1" - " WHERE UsrCod='%ld' AND NumFileViews>=0", - UsrCod); - DB_QueryINSERT (Query,"can not increment user's file views"); - } - -/*****************************************************************************/ -/************* Increment number of forum posts sent by a user ****************/ -/*****************************************************************************/ - -void Usr_IncrementNumForPstUsr (long UsrCod) - { - char Query[256]; - - /***** Increment number of forum posts *****/ - // If NumForPst < 0 ==> not yet calculated, so do nothing - sprintf (Query,"UPDATE IGNORE usr_figures SET NumForPst=NumForPst+1" - " WHERE UsrCod='%ld' AND NumForPst>=0", - UsrCod); - DB_QueryINSERT (Query,"can not increment user's forum posts"); - } - -/*****************************************************************************/ -/*************** Increment number of messages sent by a user *****************/ -/*****************************************************************************/ - -void Usr_IncrementNumMsgSntUsr (long UsrCod) - { - char Query[256]; - - /***** Increment number of messages sent *****/ - // If NumMsgSnt < 0 ==> not yet calculated, so do nothing - sprintf (Query,"UPDATE IGNORE usr_figures SET NumMsgSnt=NumMsgSnt+1" - " WHERE UsrCod='%ld' AND NumMsgSnt>=0", - UsrCod); - DB_QueryINSERT (Query,"can not increment user's messages sent"); - } diff --git a/swad_user.h b/swad_user.h index b13a80e0..5b655b3c 100644 --- a/swad_user.h +++ b/swad_user.h @@ -210,6 +210,8 @@ void Usr_RestrictLengthAndWriteName (struct UsrData *UsrDat,unsigned MaxChars); bool Usr_CheckIfUsrIsAdm (long UsrCod,Sco_Scope_t Scope,long Cod); bool Usr_CheckIfUsrIsSuperuser (long UsrCod); +unsigned Usr_GetNumCrssOfUsrWithARole (long UsrCod,Rol_Role_t Role); +unsigned Usr_GetNumUsrsInCrssOfAUsr (long UsrCod,Rol_Role_t UsrRole,Rol_Role_t OthersRole); bool Usr_CheckIfUsrSharesAnyOfMyCrs (long UsrCod); bool Usr_CheckIfUsrSharesAnyOfMyCrsWithDifferentRole (long UsrCod); void Usr_GetMyInstitutions (void); @@ -324,18 +326,4 @@ void Usr_ShowWarningNoUsersFound (Rol_Role_t Role); void Usr_GetAndShowNumUsrsInPlatform (Rol_Role_t Role); -void Usr_RequestUserProfile (void); -void Usr_GetUsrCodAndShowUserProfile (void); -void Usr_ChangeProfileVisibility (void); -void Usr_CalculateFirstClickTime (void); -void Usr_CalculateNumClicks (void); -void Usr_CalculateNumFileViews (void); -void Usr_CalculateNumForPst (void); -void Usr_CalculateNumMsgSnt (void); -void Usr_RemoveUsrFigures (long UsrCod); -void Usr_IncrementNumClicksUsr (long UsrCod); -void Usr_IncrementNumFileViewsUsr (long UsrCod); -void Usr_IncrementNumForPstUsr (long UsrCod); -void Usr_IncrementNumMsgSntUsr (long UsrCod); - #endif