From 5a1cae4060143f6e13a88224d843681220b541de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Tue, 10 Mar 2015 21:51:34 +0100 Subject: [PATCH] Version 14.83 --- sql/swad.sql | 3 +- swad_action.c | 8 +- swad_action.h | 342 ++++++++++++++++++++++++----------------------- swad_changelog.h | 7 +- swad_text.c | 21 +++ swad_user.c | 215 +++++++++++++++++++++++------ swad_user.h | 4 +- 7 files changed, 382 insertions(+), 218 deletions(-) diff --git a/sql/swad.sql b/sql/swad.sql index a232f8e2d..e8eee5ca4 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -1206,13 +1206,14 @@ CREATE TABLE IF NOT EXISTS usr_webs ( Web ENUM( 'www', '500px', - 'delicious','deviantart', + 'delicious','deviantart','diaspora', 'edmodo', 'facebook','flickr','foursquare', 'github','googleplus','googlescholar', 'instagram', 'linkedin', 'paperli','pinterest', + 'quitter', 'researchgate', 'scoopit','slideshare','storify', 'tumblr','twitter', diff --git a/swad_action.c b/swad_action.c index dd4fbfb27..a9210f8aa 100644 --- a/swad_action.c +++ b/swad_action.c @@ -945,6 +945,8 @@ Users: 792. ActRemOldUsr Eliminate completely old users 793. ActSeePubPrf Show a public user's profile + ---. ActCal1stClkTim Calculate first click time from log and store into user's figures + ---. ActCalNumClk Calculate number of clicks from log and store into user's figures Messages: 794. ActSeeNtf Show my recent notifications 795. ActSeeAnn Show global announcements @@ -2324,7 +2326,9 @@ 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,10,TabUsr,ActReqPubPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Usr_ShowUserProfile ,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}, // TabMsg ****************************************************************** // Actions in menu: @@ -4059,6 +4063,8 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq ActSeePubPrf, // #1402 ActEdiPri, // #1403 ActChgPriPrf, // #1404 + ActCal1stClkTim, // #1405 + ActCalNumClk, // #1406 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index 5d61030d2..c304a22c6 100644 --- a/swad_action.h +++ b/swad_action.h @@ -69,9 +69,9 @@ typedef enum typedef int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action -#define Act_NUM_ACTIONS (7+52+15+90+73+68+204+184+100+168+28+77) +#define Act_NUM_ACTIONS (7+52+15+90+73+68+204+184+102+168+28+77) -#define Act_MAX_ACTION_COD 1404 +#define Act_MAX_ACTION_COD 1406 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20 @@ -980,180 +980,182 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica #define ActRemOldUsr (ActChgNumRowFooGrp+ 99) #define ActSeePubPrf (ActChgNumRowFooGrp+100) +#define ActCal1stClkTim (ActChgNumRowFooGrp+101) +#define ActCalNumClk (ActChgNumRowFooGrp+102) /*****************************************************************************/ /******************************* Messages tab ********************************/ /*****************************************************************************/ // Actions in menu -#define ActSeeNtf (ActSeePubPrf+ 1) -#define ActSeeAnn (ActSeePubPrf+ 2) -#define ActSeeNot (ActSeePubPrf+ 3) -#define ActSeeFor (ActSeePubPrf+ 4) -#define ActSeeChtRms (ActSeePubPrf+ 5) -#define ActReqMsgUsr (ActSeePubPrf+ 6) -#define ActSeeRcvMsg (ActSeePubPrf+ 7) -#define ActSeeSntMsg (ActSeePubPrf+ 8) -#define ActMaiStd (ActSeePubPrf+ 9) +#define ActSeeNtf (ActCalNumClk+ 1) +#define ActSeeAnn (ActCalNumClk+ 2) +#define ActSeeNot (ActCalNumClk+ 3) +#define ActSeeFor (ActCalNumClk+ 4) +#define ActSeeChtRms (ActCalNumClk+ 5) +#define ActReqMsgUsr (ActCalNumClk+ 6) +#define ActSeeRcvMsg (ActCalNumClk+ 7) +#define ActSeeSntMsg (ActCalNumClk+ 8) +#define ActMaiStd (ActCalNumClk+ 9) // Secondary actions -#define ActWriAnn (ActSeePubPrf+ 10) -#define ActRcvAnn (ActSeePubPrf+ 11) -#define ActRemAnn (ActSeePubPrf+ 12) -#define ActShoNot (ActSeePubPrf+ 13) -#define ActWriNot (ActSeePubPrf+ 14) -#define ActRcvNot (ActSeePubPrf+ 15) -#define ActHidNot (ActSeePubPrf+ 16) -#define ActRevNot (ActSeePubPrf+ 17) -#define ActRemNot (ActSeePubPrf+ 18) -#define ActSeeNewNtf (ActSeePubPrf+ 19) -#define ActMrkNtfSee (ActSeePubPrf+ 20) -#define ActSeeForCrsUsr (ActSeePubPrf+ 21) -#define ActSeeForCrsTch (ActSeePubPrf+ 22) -#define ActSeeForDegUsr (ActSeePubPrf+ 23) -#define ActSeeForDegTch (ActSeePubPrf+ 24) -#define ActSeeForCtrUsr (ActSeePubPrf+ 25) -#define ActSeeForCtrTch (ActSeePubPrf+ 26) -#define ActSeeForInsUsr (ActSeePubPrf+ 27) -#define ActSeeForInsTch (ActSeePubPrf+ 28) -#define ActSeeForGenUsr (ActSeePubPrf+ 29) -#define ActSeeForGenTch (ActSeePubPrf+ 30) -#define ActSeeForSWAUsr (ActSeePubPrf+ 31) -#define ActSeeForSWATch (ActSeePubPrf+ 32) -#define ActSeePstForCrsUsr (ActSeePubPrf+ 33) -#define ActSeePstForCrsTch (ActSeePubPrf+ 34) -#define ActSeePstForDegUsr (ActSeePubPrf+ 35) -#define ActSeePstForDegTch (ActSeePubPrf+ 36) -#define ActSeePstForCtrUsr (ActSeePubPrf+ 37) -#define ActSeePstForCtrTch (ActSeePubPrf+ 38) -#define ActSeePstForInsUsr (ActSeePubPrf+ 39) -#define ActSeePstForInsTch (ActSeePubPrf+ 40) -#define ActSeePstForGenUsr (ActSeePubPrf+ 41) -#define ActSeePstForGenTch (ActSeePubPrf+ 42) -#define ActSeePstForSWAUsr (ActSeePubPrf+ 43) -#define ActSeePstForSWATch (ActSeePubPrf+ 44) -#define ActRcvThrForCrsUsr (ActSeePubPrf+ 45) -#define ActRcvThrForCrsTch (ActSeePubPrf+ 46) -#define ActRcvThrForDegUsr (ActSeePubPrf+ 47) -#define ActRcvThrForDegTch (ActSeePubPrf+ 48) -#define ActRcvThrForCtrUsr (ActSeePubPrf+ 49) -#define ActRcvThrForCtrTch (ActSeePubPrf+ 50) -#define ActRcvThrForInsUsr (ActSeePubPrf+ 51) -#define ActRcvThrForInsTch (ActSeePubPrf+ 52) -#define ActRcvThrForGenUsr (ActSeePubPrf+ 53) -#define ActRcvThrForGenTch (ActSeePubPrf+ 54) -#define ActRcvThrForSWAUsr (ActSeePubPrf+ 55) -#define ActRcvThrForSWATch (ActSeePubPrf+ 56) -#define ActRcvRepForCrsUsr (ActSeePubPrf+ 57) -#define ActRcvRepForCrsTch (ActSeePubPrf+ 58) -#define ActRcvRepForDegUsr (ActSeePubPrf+ 59) -#define ActRcvRepForDegTch (ActSeePubPrf+ 60) -#define ActRcvRepForCtrUsr (ActSeePubPrf+ 61) -#define ActRcvRepForCtrTch (ActSeePubPrf+ 62) -#define ActRcvRepForInsUsr (ActSeePubPrf+ 63) -#define ActRcvRepForInsTch (ActSeePubPrf+ 64) -#define ActRcvRepForGenUsr (ActSeePubPrf+ 65) -#define ActRcvRepForGenTch (ActSeePubPrf+ 66) -#define ActRcvRepForSWAUsr (ActSeePubPrf+ 67) -#define ActRcvRepForSWATch (ActSeePubPrf+ 68) -#define ActReqDelThrCrsUsr (ActSeePubPrf+ 69) -#define ActReqDelThrCrsTch (ActSeePubPrf+ 70) -#define ActReqDelThrDegUsr (ActSeePubPrf+ 71) -#define ActReqDelThrDegTch (ActSeePubPrf+ 72) -#define ActReqDelThrCtrUsr (ActSeePubPrf+ 73) -#define ActReqDelThrCtrTch (ActSeePubPrf+ 74) -#define ActReqDelThrInsUsr (ActSeePubPrf+ 75) -#define ActReqDelThrInsTch (ActSeePubPrf+ 76) -#define ActReqDelThrGenUsr (ActSeePubPrf+ 77) -#define ActReqDelThrGenTch (ActSeePubPrf+ 78) -#define ActReqDelThrSWAUsr (ActSeePubPrf+ 79) -#define ActReqDelThrSWATch (ActSeePubPrf+ 80) -#define ActDelThrForCrsUsr (ActSeePubPrf+ 81) -#define ActDelThrForCrsTch (ActSeePubPrf+ 82) -#define ActDelThrForDegUsr (ActSeePubPrf+ 83) -#define ActDelThrForDegTch (ActSeePubPrf+ 84) -#define ActDelThrForCtrUsr (ActSeePubPrf+ 85) -#define ActDelThrForCtrTch (ActSeePubPrf+ 86) -#define ActDelThrForInsUsr (ActSeePubPrf+ 87) -#define ActDelThrForInsTch (ActSeePubPrf+ 88) -#define ActDelThrForGenUsr (ActSeePubPrf+ 89) -#define ActDelThrForGenTch (ActSeePubPrf+ 90) -#define ActDelThrForSWAUsr (ActSeePubPrf+ 91) -#define ActDelThrForSWATch (ActSeePubPrf+ 92) -#define ActCutThrForCrsUsr (ActSeePubPrf+ 93) -#define ActCutThrForCrsTch (ActSeePubPrf+ 94) -#define ActCutThrForDegUsr (ActSeePubPrf+ 95) -#define ActCutThrForDegTch (ActSeePubPrf+ 96) -#define ActCutThrForCtrUsr (ActSeePubPrf+ 97) -#define ActCutThrForCtrTch (ActSeePubPrf+ 98) -#define ActCutThrForInsUsr (ActSeePubPrf+ 99) -#define ActCutThrForInsTch (ActSeePubPrf+100) -#define ActCutThrForGenUsr (ActSeePubPrf+101) -#define ActCutThrForGenTch (ActSeePubPrf+102) -#define ActCutThrForSWAUsr (ActSeePubPrf+103) -#define ActCutThrForSWATch (ActSeePubPrf+104) -#define ActPasThrForCrsUsr (ActSeePubPrf+105) -#define ActPasThrForCrsTch (ActSeePubPrf+106) -#define ActPasThrForDegUsr (ActSeePubPrf+107) -#define ActPasThrForDegTch (ActSeePubPrf+108) -#define ActPasThrForCtrUsr (ActSeePubPrf+109) -#define ActPasThrForCtrTch (ActSeePubPrf+110) -#define ActPasThrForInsUsr (ActSeePubPrf+111) -#define ActPasThrForInsTch (ActSeePubPrf+112) -#define ActPasThrForGenUsr (ActSeePubPrf+113) -#define ActPasThrForGenTch (ActSeePubPrf+114) -#define ActPasThrForSWAUsr (ActSeePubPrf+115) -#define ActPasThrForSWATch (ActSeePubPrf+116) -#define ActDelPstForCrsUsr (ActSeePubPrf+117) -#define ActDelPstForCrsTch (ActSeePubPrf+118) -#define ActDelPstForDegUsr (ActSeePubPrf+119) -#define ActDelPstForDegTch (ActSeePubPrf+120) -#define ActDelPstForCtrUsr (ActSeePubPrf+121) -#define ActDelPstForCtrTch (ActSeePubPrf+122) -#define ActDelPstForInsUsr (ActSeePubPrf+123) -#define ActDelPstForInsTch (ActSeePubPrf+124) -#define ActDelPstForGenUsr (ActSeePubPrf+125) -#define ActDelPstForGenTch (ActSeePubPrf+126) -#define ActDelPstForSWAUsr (ActSeePubPrf+127) -#define ActDelPstForSWATch (ActSeePubPrf+128) -#define ActEnbPstForCrsUsr (ActSeePubPrf+129) -#define ActEnbPstForCrsTch (ActSeePubPrf+130) -#define ActEnbPstForDegUsr (ActSeePubPrf+131) -#define ActEnbPstForDegTch (ActSeePubPrf+132) -#define ActEnbPstForCtrUsr (ActSeePubPrf+133) -#define ActEnbPstForCtrTch (ActSeePubPrf+134) -#define ActEnbPstForInsUsr (ActSeePubPrf+135) -#define ActEnbPstForInsTch (ActSeePubPrf+136) -#define ActEnbPstForGenUsr (ActSeePubPrf+137) -#define ActEnbPstForGenTch (ActSeePubPrf+138) -#define ActEnbPstForSWAUsr (ActSeePubPrf+139) -#define ActEnbPstForSWATch (ActSeePubPrf+140) -#define ActDisPstForCrsUsr (ActSeePubPrf+141) -#define ActDisPstForCrsTch (ActSeePubPrf+142) -#define ActDisPstForDegUsr (ActSeePubPrf+143) -#define ActDisPstForDegTch (ActSeePubPrf+144) -#define ActDisPstForCtrUsr (ActSeePubPrf+145) -#define ActDisPstForCtrTch (ActSeePubPrf+146) -#define ActDisPstForInsUsr (ActSeePubPrf+147) -#define ActDisPstForInsTch (ActSeePubPrf+148) -#define ActDisPstForGenUsr (ActSeePubPrf+149) -#define ActDisPstForGenTch (ActSeePubPrf+150) -#define ActDisPstForSWAUsr (ActSeePubPrf+151) -#define ActDisPstForSWATch (ActSeePubPrf+152) -#define ActRcvMsgUsr (ActSeePubPrf+153) -#define ActReqDelAllSntMsg (ActSeePubPrf+154) -#define ActReqDelAllRcvMsg (ActSeePubPrf+155) -#define ActDelAllSntMsg (ActSeePubPrf+156) -#define ActDelAllRcvMsg (ActSeePubPrf+157) -#define ActDelSntMsg (ActSeePubPrf+158) -#define ActDelRcvMsg (ActSeePubPrf+159) -#define ActExpSntMsg (ActSeePubPrf+160) -#define ActExpRcvMsg (ActSeePubPrf+161) -#define ActConSntMsg (ActSeePubPrf+162) -#define ActConRcvMsg (ActSeePubPrf+163) -#define ActLstBanUsr (ActSeePubPrf+164) -#define ActBanUsrMsg (ActSeePubPrf+165) -#define ActUnbUsrMsg (ActSeePubPrf+166) -#define ActUnbUsrLst (ActSeePubPrf+167) -#define ActCht (ActSeePubPrf+168) +#define ActWriAnn (ActCalNumClk+ 10) +#define ActRcvAnn (ActCalNumClk+ 11) +#define ActRemAnn (ActCalNumClk+ 12) +#define ActShoNot (ActCalNumClk+ 13) +#define ActWriNot (ActCalNumClk+ 14) +#define ActRcvNot (ActCalNumClk+ 15) +#define ActHidNot (ActCalNumClk+ 16) +#define ActRevNot (ActCalNumClk+ 17) +#define ActRemNot (ActCalNumClk+ 18) +#define ActSeeNewNtf (ActCalNumClk+ 19) +#define ActMrkNtfSee (ActCalNumClk+ 20) +#define ActSeeForCrsUsr (ActCalNumClk+ 21) +#define ActSeeForCrsTch (ActCalNumClk+ 22) +#define ActSeeForDegUsr (ActCalNumClk+ 23) +#define ActSeeForDegTch (ActCalNumClk+ 24) +#define ActSeeForCtrUsr (ActCalNumClk+ 25) +#define ActSeeForCtrTch (ActCalNumClk+ 26) +#define ActSeeForInsUsr (ActCalNumClk+ 27) +#define ActSeeForInsTch (ActCalNumClk+ 28) +#define ActSeeForGenUsr (ActCalNumClk+ 29) +#define ActSeeForGenTch (ActCalNumClk+ 30) +#define ActSeeForSWAUsr (ActCalNumClk+ 31) +#define ActSeeForSWATch (ActCalNumClk+ 32) +#define ActSeePstForCrsUsr (ActCalNumClk+ 33) +#define ActSeePstForCrsTch (ActCalNumClk+ 34) +#define ActSeePstForDegUsr (ActCalNumClk+ 35) +#define ActSeePstForDegTch (ActCalNumClk+ 36) +#define ActSeePstForCtrUsr (ActCalNumClk+ 37) +#define ActSeePstForCtrTch (ActCalNumClk+ 38) +#define ActSeePstForInsUsr (ActCalNumClk+ 39) +#define ActSeePstForInsTch (ActCalNumClk+ 40) +#define ActSeePstForGenUsr (ActCalNumClk+ 41) +#define ActSeePstForGenTch (ActCalNumClk+ 42) +#define ActSeePstForSWAUsr (ActCalNumClk+ 43) +#define ActSeePstForSWATch (ActCalNumClk+ 44) +#define ActRcvThrForCrsUsr (ActCalNumClk+ 45) +#define ActRcvThrForCrsTch (ActCalNumClk+ 46) +#define ActRcvThrForDegUsr (ActCalNumClk+ 47) +#define ActRcvThrForDegTch (ActCalNumClk+ 48) +#define ActRcvThrForCtrUsr (ActCalNumClk+ 49) +#define ActRcvThrForCtrTch (ActCalNumClk+ 50) +#define ActRcvThrForInsUsr (ActCalNumClk+ 51) +#define ActRcvThrForInsTch (ActCalNumClk+ 52) +#define ActRcvThrForGenUsr (ActCalNumClk+ 53) +#define ActRcvThrForGenTch (ActCalNumClk+ 54) +#define ActRcvThrForSWAUsr (ActCalNumClk+ 55) +#define ActRcvThrForSWATch (ActCalNumClk+ 56) +#define ActRcvRepForCrsUsr (ActCalNumClk+ 57) +#define ActRcvRepForCrsTch (ActCalNumClk+ 58) +#define ActRcvRepForDegUsr (ActCalNumClk+ 59) +#define ActRcvRepForDegTch (ActCalNumClk+ 60) +#define ActRcvRepForCtrUsr (ActCalNumClk+ 61) +#define ActRcvRepForCtrTch (ActCalNumClk+ 62) +#define ActRcvRepForInsUsr (ActCalNumClk+ 63) +#define ActRcvRepForInsTch (ActCalNumClk+ 64) +#define ActRcvRepForGenUsr (ActCalNumClk+ 65) +#define ActRcvRepForGenTch (ActCalNumClk+ 66) +#define ActRcvRepForSWAUsr (ActCalNumClk+ 67) +#define ActRcvRepForSWATch (ActCalNumClk+ 68) +#define ActReqDelThrCrsUsr (ActCalNumClk+ 69) +#define ActReqDelThrCrsTch (ActCalNumClk+ 70) +#define ActReqDelThrDegUsr (ActCalNumClk+ 71) +#define ActReqDelThrDegTch (ActCalNumClk+ 72) +#define ActReqDelThrCtrUsr (ActCalNumClk+ 73) +#define ActReqDelThrCtrTch (ActCalNumClk+ 74) +#define ActReqDelThrInsUsr (ActCalNumClk+ 75) +#define ActReqDelThrInsTch (ActCalNumClk+ 76) +#define ActReqDelThrGenUsr (ActCalNumClk+ 77) +#define ActReqDelThrGenTch (ActCalNumClk+ 78) +#define ActReqDelThrSWAUsr (ActCalNumClk+ 79) +#define ActReqDelThrSWATch (ActCalNumClk+ 80) +#define ActDelThrForCrsUsr (ActCalNumClk+ 81) +#define ActDelThrForCrsTch (ActCalNumClk+ 82) +#define ActDelThrForDegUsr (ActCalNumClk+ 83) +#define ActDelThrForDegTch (ActCalNumClk+ 84) +#define ActDelThrForCtrUsr (ActCalNumClk+ 85) +#define ActDelThrForCtrTch (ActCalNumClk+ 86) +#define ActDelThrForInsUsr (ActCalNumClk+ 87) +#define ActDelThrForInsTch (ActCalNumClk+ 88) +#define ActDelThrForGenUsr (ActCalNumClk+ 89) +#define ActDelThrForGenTch (ActCalNumClk+ 90) +#define ActDelThrForSWAUsr (ActCalNumClk+ 91) +#define ActDelThrForSWATch (ActCalNumClk+ 92) +#define ActCutThrForCrsUsr (ActCalNumClk+ 93) +#define ActCutThrForCrsTch (ActCalNumClk+ 94) +#define ActCutThrForDegUsr (ActCalNumClk+ 95) +#define ActCutThrForDegTch (ActCalNumClk+ 96) +#define ActCutThrForCtrUsr (ActCalNumClk+ 97) +#define ActCutThrForCtrTch (ActCalNumClk+ 98) +#define ActCutThrForInsUsr (ActCalNumClk+ 99) +#define ActCutThrForInsTch (ActCalNumClk+100) +#define ActCutThrForGenUsr (ActCalNumClk+101) +#define ActCutThrForGenTch (ActCalNumClk+102) +#define ActCutThrForSWAUsr (ActCalNumClk+103) +#define ActCutThrForSWATch (ActCalNumClk+104) +#define ActPasThrForCrsUsr (ActCalNumClk+105) +#define ActPasThrForCrsTch (ActCalNumClk+106) +#define ActPasThrForDegUsr (ActCalNumClk+107) +#define ActPasThrForDegTch (ActCalNumClk+108) +#define ActPasThrForCtrUsr (ActCalNumClk+109) +#define ActPasThrForCtrTch (ActCalNumClk+110) +#define ActPasThrForInsUsr (ActCalNumClk+111) +#define ActPasThrForInsTch (ActCalNumClk+112) +#define ActPasThrForGenUsr (ActCalNumClk+113) +#define ActPasThrForGenTch (ActCalNumClk+114) +#define ActPasThrForSWAUsr (ActCalNumClk+115) +#define ActPasThrForSWATch (ActCalNumClk+116) +#define ActDelPstForCrsUsr (ActCalNumClk+117) +#define ActDelPstForCrsTch (ActCalNumClk+118) +#define ActDelPstForDegUsr (ActCalNumClk+119) +#define ActDelPstForDegTch (ActCalNumClk+120) +#define ActDelPstForCtrUsr (ActCalNumClk+121) +#define ActDelPstForCtrTch (ActCalNumClk+122) +#define ActDelPstForInsUsr (ActCalNumClk+123) +#define ActDelPstForInsTch (ActCalNumClk+124) +#define ActDelPstForGenUsr (ActCalNumClk+125) +#define ActDelPstForGenTch (ActCalNumClk+126) +#define ActDelPstForSWAUsr (ActCalNumClk+127) +#define ActDelPstForSWATch (ActCalNumClk+128) +#define ActEnbPstForCrsUsr (ActCalNumClk+129) +#define ActEnbPstForCrsTch (ActCalNumClk+130) +#define ActEnbPstForDegUsr (ActCalNumClk+131) +#define ActEnbPstForDegTch (ActCalNumClk+132) +#define ActEnbPstForCtrUsr (ActCalNumClk+133) +#define ActEnbPstForCtrTch (ActCalNumClk+134) +#define ActEnbPstForInsUsr (ActCalNumClk+135) +#define ActEnbPstForInsTch (ActCalNumClk+136) +#define ActEnbPstForGenUsr (ActCalNumClk+137) +#define ActEnbPstForGenTch (ActCalNumClk+138) +#define ActEnbPstForSWAUsr (ActCalNumClk+139) +#define ActEnbPstForSWATch (ActCalNumClk+140) +#define ActDisPstForCrsUsr (ActCalNumClk+141) +#define ActDisPstForCrsTch (ActCalNumClk+142) +#define ActDisPstForDegUsr (ActCalNumClk+143) +#define ActDisPstForDegTch (ActCalNumClk+144) +#define ActDisPstForCtrUsr (ActCalNumClk+145) +#define ActDisPstForCtrTch (ActCalNumClk+146) +#define ActDisPstForInsUsr (ActCalNumClk+147) +#define ActDisPstForInsTch (ActCalNumClk+148) +#define ActDisPstForGenUsr (ActCalNumClk+149) +#define ActDisPstForGenTch (ActCalNumClk+150) +#define ActDisPstForSWAUsr (ActCalNumClk+151) +#define ActDisPstForSWATch (ActCalNumClk+152) +#define ActRcvMsgUsr (ActCalNumClk+153) +#define ActReqDelAllSntMsg (ActCalNumClk+154) +#define ActReqDelAllRcvMsg (ActCalNumClk+155) +#define ActDelAllSntMsg (ActCalNumClk+156) +#define ActDelAllRcvMsg (ActCalNumClk+157) +#define ActDelSntMsg (ActCalNumClk+158) +#define ActDelRcvMsg (ActCalNumClk+159) +#define ActExpSntMsg (ActCalNumClk+160) +#define ActExpRcvMsg (ActCalNumClk+161) +#define ActConSntMsg (ActCalNumClk+162) +#define ActConRcvMsg (ActCalNumClk+163) +#define ActLstBanUsr (ActCalNumClk+164) +#define ActBanUsrMsg (ActCalNumClk+165) +#define ActUnbUsrMsg (ActCalNumClk+166) +#define ActUnbUsrLst (ActCalNumClk+167) +#define ActCht (ActCalNumClk+168) /*****************************************************************************/ /****************************** Statistics tab *******************************/ diff --git a/swad_changelog.h b/swad_changelog.h index 236ed61cb..de9f40fe4 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -103,12 +103,13 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 14.82.1 (2015/03/10)" +#define Log_PLATFORM_VERSION "SWAD 14.83 (2015/03/10)" // 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 | tail -1 +// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1 /* - Version 14.82.1: Mar 10, 2015 Added new social networks. (179908 lines) + Version 14.83: Mar 10, 2015 New action to compute first click when not available in public profile. (181285 lines) + Version 14.82.1: Mar 10, 2015 Added new social networks. (181143 lines) 1 change necessary in database: ALTER TABLE usr_webs CHANGE Web Web ENUM('www','500px','delicious','deviantart','diaspora','edmodo','facebook','flickr','foursquare','github','googleplus','googlescholar','instagram','linkedin','paperli','pinterest','quitter','researchgate','scoopit','slideshare','storify','tumblr','twitter','wikipedia','youtube') NOT NULL; diff --git a/swad_text.c b/swad_text.c index 31f5ede8b..e5c9bd9ae 100644 --- a/swad_text.c +++ b/swad_text.c @@ -3623,6 +3623,27 @@ const char *Txt_Before_going_to_any_other_option_you_must_fill_your_record_card_ " incluindo o seu sexo."; #endif +const char *Txt_Calculate = +#if L==0 + "Calcular"; +#elif L==1 + "Berechnen"; +#elif L==2 + "Calculate"; +#elif L==3 + "Calcular"; +#elif L==4 + "Calculer"; +#elif L==5 + "Calcular"; // Okoteve traducción +#elif L==6 + "Calcolare"; +#elif L==7 + "Obliczać"; +#elif L==8 + "Calcular"; +#endif + const char *Txt_Calculate_average_photo_of_a_degree = #if L==0 "Calcular fotografia mitjana d'una titulació"; diff --git a/swad_user.c b/swad_user.c index ed7e9789c..4ed31c721 100644 --- a/swad_user.c +++ b/swad_user.c @@ -93,8 +93,8 @@ const char *Usr_UsrDatMainFieldNames[Usr_NUM_MAIN_FIELDS_DATA_USR]; struct UsrFigures { - struct DateTime FirstClickTime; - unsigned long NumClicks; + struct DateTime FirstClickTime; // 0 ==> unknown first click time of user never logged + long NumClicks; // -1L ==> unknown number of clicks }; /*****************************************************************************/ @@ -180,7 +180,11 @@ 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_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures); +static void Usr_FetchFirstClickFromLogAndStoreAsUsrFigure (long UsrCod); +static void Usr_FetchNumClicksFromLogAndStoreAsUsrFigure (long UsrCod); +static bool Usr_CheckIfUsrFiguresExists (long UsrCod); /*****************************************************************************/ /**** Show alert about number of clicks remaining before sending my photo ****/ @@ -7445,7 +7449,7 @@ void Usr_RequestUserProfile (void) Act_FormStart (ActSeePubPrf); fprintf (Gbl.F.Out,"
" "%s: " - "" "
", The_ClassFormul[Gbl.Prefs.Theme], @@ -7463,17 +7467,15 @@ void Usr_RequestUserProfile (void) } /*****************************************************************************/ -/*************************** Show a user's profile ***************************/ +/**************** Get user's code and show a user's profile ******************/ /*****************************************************************************/ -void Usr_ShowUserProfile (void) +void Usr_GetUsrCodAndShowUserProfile (void) { - extern const char *Txt_User_not_found_or_you_do_not_have_permission_; char Nickname[Nck_MAX_BYTES_NICKNAME_WITH_ARROBA + 1]; long OtherUsrCod; - bool Error = false; - /***** Get user *****/ + /***** Get user from nickname *****/ if (Gbl.Usrs.Other.UsrDat.UsrCod < 0) { Par_GetParToText ("usr",Nickname,Nck_MAX_BYTES_NICKNAME_WITH_ARROBA); @@ -7486,6 +7488,19 @@ void Usr_ShowUserProfile (void) 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 { @@ -7565,6 +7580,7 @@ void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat) // extern const char *Txt_Shortcut; // extern const char *Txt_STR_LANG_ID[Txt_NUM_LANGUAGES]; extern const char *Txt_First_access; + extern const char *Txt_Calculate; extern const char *Txt_Clicks; extern const char *Txt_Courses_as_a_ROLE; extern const char *Txt_ROLES_SINGULAR_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; @@ -7621,10 +7637,16 @@ void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat) fprintf (Gbl.F.Out," "); Dat_WriteHourMinute (&(UsrFigures.FirstClickTime.YYYYMMDDHHMMSS[8])); } - else - fprintf (Gbl.F.Out,"-"); - fprintf (Gbl.F.Out,"" - "" + 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_LinkFormSubmit (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme]); + Lay_PutSendIcon ("recycle",Txt_Calculate,Txt_Calculate); + fprintf (Gbl.F.Out,""); + } + fprintf (Gbl.F.Out,"" ""); /* Number of clicks */ @@ -7634,14 +7656,22 @@ void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat) "%s:" "" "" - "%lu" - "" - "" - "", + " style=\"text-align:left; vertical-align:middle;\">", The_ClassFormul[Gbl.Prefs.Theme], - Txt_Clicks, - UsrFigures.NumClicks); + Txt_Clicks); + if (UsrFigures.NumClicks >= 0) + fprintf (Gbl.F.Out,"%ld",UsrFigures.NumClicks); + else // Number of clicks is unknown + { + /***** Button to fetch and store number of clicks *****/ + Act_FormStart (ActCalNumClk); + Usr_PutParamOtherUsrCodEncrypted (UsrDat->EncryptedUsrCod); + Act_LinkFormSubmit (Txt_Calculate,The_ClassFormul[Gbl.Prefs.Theme]); + Lay_PutSendIcon ("recycle",Txt_Calculate,Txt_Calculate); + fprintf (Gbl.F.Out,""); + } + fprintf (Gbl.F.Out,"" + ""); /***** Number of courses in which the user is teacher or student *****/ if ((NumCrssUsrIsTeacher = Usr_GetNumCrssOfUsrWithARole (UsrDat->UsrCod,Rol_ROLE_TEACHER))) @@ -7767,17 +7797,54 @@ static void Usr_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures) /* Get number of clicks */ if (sscanf (row[1],"%ld",&UsrFigures->NumClicks) != 1) - UsrFigures->NumClicks = 0; + UsrFigures->NumClicks = -1L; + } + else + { + /***** Return special user's figures indicating "not present" *****/ + if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(UsrFigures->FirstClickTime),"00000000000000"))) + Lay_ShowErrorAndExit ("Error when reading first click time."); + + UsrFigures->NumClicks = -1L; } /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); + } - if (!NumRows) +/*****************************************************************************/ +/********* 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_FetchFirstClickFromLogAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); + + /***** Show user's profile again *****/ + Usr_ShowUserProfile (); + } + +/*****************************************************************************/ +/** Fetch first click of a user from log table and store in user's figures ***/ +/*****************************************************************************/ + +static void Usr_FetchFirstClickFromLogAndStoreAsUsrFigure (long UsrCod) + { + char Query[256]; + MYSQL_RES *mysql_res; + MYSQL_ROW row; + struct DateTime FirstClickTime; + bool UsrIsInLog = false; + + if (Usr_ChkIfUsrCodExists (UsrCod)) { - /***** Get first click from database *****/ + /***** Get first click from log table *****/ sprintf (Query,"SELECT DATE_FORMAT(ClickTime,'%%Y%%m%%d%%H%%i%%S') FROM log" - " WHERE UsrCod='%ld' ORDER BY ClickTime LIMIT 1", + " WHERE UsrCod='%ld' ORDER BY ClickTime LIMIT 1", UsrCod); if (DB_QuerySELECT (Query,&mysql_res,"can not get user's first click")) { @@ -7785,34 +7852,98 @@ static void Usr_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures) 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."); - } - else - if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(UsrFigures->FirstClickTime),"00000000000000"))) + if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&FirstClickTime,row[0]))) Lay_ShowErrorAndExit ("Error when reading first click time."); - /***** Free structure that stores the query result *****/ + UsrIsInLog = true; + } + /* Free structure that stores the query result */ DB_FreeMySQLResult (&mysql_res); - /***** Get first click from database *****/ - sprintf (Query,"SELECT COUNT(*) FROM log WHERE UsrCod='%ld'", - UsrCod); - UsrFigures->NumClicks = DB_QueryCOUNT (Query,"can not get user's first click"); - - /***** Insert new user's figures *****/ - if (UsrFigures->FirstClickTime.Date.Year) // If first click time found + /***** Update first click time in user's figures *****/ + if (UsrIsInLog) // If first click time found { - sprintf (Query,"INSERT INTO usr_figures (UsrCod,FirstClickTime,NumClicks)" - " VALUES ('%ld','%s','%ld')", - UsrCod, - UsrFigures->FirstClickTime.YYYYMMDDHHMMSS, - UsrFigures->NumClicks); - DB_QueryINSERT (Query,"can not insert user's figures"); + if (Usr_CheckIfUsrFiguresExists (UsrCod)) + { + sprintf (Query,"UPDATE usr_figures SET FirstClickTime='%s'" + " WHERE UsrCod='%ld'", + FirstClickTime.YYYYMMDDHHMMSS,UsrCod); + DB_QueryUPDATE (Query,"can not update user's figures"); + } + else // User entry does not exist + { + sprintf (Query,"INSERT INTO usr_figures (UsrCod,FirstClickTime,NumClicks)" + " VALUES ('%ld','%s','-1')", + UsrCod,FirstClickTime.YYYYMMDDHHMMSS); + DB_QueryINSERT (Query,"can not create user's figures"); + } } } } +/*****************************************************************************/ +/********* Calculate number of clicks and show user's profile again **********/ +/*****************************************************************************/ + +void Usr_CalculateNumClicks (void) + { + /***** Get user's code *****/ + Usr_GetParamOtherUsrCodEncrypted (); + + /***** Get number of clicks from log and store as user's figure *****/ + Usr_FetchNumClicksFromLogAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod); + + /***** Show user's profile again *****/ + Usr_ShowUserProfile (); + } + +/*****************************************************************************/ +/** Fetch first click of a user from log table and store in user's figures ***/ +/*****************************************************************************/ + +static void Usr_FetchNumClicksFromLogAndStoreAsUsrFigure (long UsrCod) + { + char Query[256]; + unsigned long NumClicks; + + if (Usr_ChkIfUsrCodExists (UsrCod)) + { + /***** Get number of clicks from database *****/ + sprintf (Query,"SELECT COUNT(*) FROM log WHERE UsrCod='%ld'", + UsrCod); + 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'", + NumClicks,UsrCod); + DB_QueryUPDATE (Query,"can not update user's figures"); + } + else // User entry does not exist + { + sprintf (Query,"INSERT INTO usr_figures (UsrCod,FirstClickTime,NumClicks)" + " VALUES ('%ld','00000000000000','%ld')", + UsrCod,NumClicks); + DB_QueryINSERT (Query,"can not create 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); + } + /*****************************************************************************/ /********************** Select values on user's figures **********************/ /*****************************************************************************/ diff --git a/swad_user.h b/swad_user.h index 2c86155d2..6a064e7db 100644 --- a/swad_user.h +++ b/swad_user.h @@ -325,9 +325,11 @@ void Usr_ShowWarningNoUsersFound (Rol_Role_t Role); void Usr_GetAndShowNumUsrsInPlatform (Rol_Role_t Role); void Usr_RequestUserProfile (void); -void Usr_ShowUserProfile (void); +void Usr_GetUsrCodAndShowUserProfile (void); void Usr_ChangeProfileVisibility (void); void Usr_ShowDetailsUserProfile (const struct UsrData *UsrDat); +void Usr_CalculateFirstClickTime (void); +void Usr_CalculateNumClicks (void); void Usr_IncrementNumClicksUsr (void); #endif