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 00000000..e9e1faf4 Binary files /dev/null and b/swad_profile.o differ diff --git a/swad_record.c b/swad_record.c index 6635c768..daba8acb 100644 --- a/swad_record.c +++ b/swad_record.c @@ -2030,8 +2030,6 @@ void Rec_ShowSharedUsrRecord (Rec_RecordViewType_t TypeOfView, extern const char *Txt_First_name; extern const char *Txt_Country; extern const char *Txt_Another_country; - extern const char *Txt_Shortcut; - extern const char *Txt_STR_LANG_ID[Txt_NUM_LANGUAGES]; extern const char *Txt_Place_of_origin; extern const char *Txt_Date_of_birth; extern const char *Txt_Institution; @@ -2045,7 +2043,7 @@ void Rec_ShowSharedUsrRecord (Rec_RecordViewType_t TypeOfView, unsigned RecordWidth = Rec_WIDTH_SHARE_RECORD_BIG; char StrRecordWidth[10+1]; unsigned FrameWidth = 10; - unsigned Col1Width = 140; + unsigned Col1Width = 130; unsigned Col2Width; unsigned Col3Width = 160; unsigned Cols1and2Width; @@ -2379,7 +2377,7 @@ void Rec_ShowSharedUsrRecord (Rec_RecordViewType_t TypeOfView, /***** User's nickname *****/ fprintf (Gbl.F.Out,"" - "" + "" "%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