diff --git a/swad_assignment.c b/swad_assignment.c index 9205dab7..0624a5b0 100644 --- a/swad_assignment.c +++ b/swad_assignment.c @@ -348,7 +348,7 @@ static void Asg_ShowOneAssignment (long AsgCod) /***** Mark possible notification as seen *****/ Ntf_MarkNotifAsSeen (Ntf_EVENT_ASSIGNMENT, - AsgCod, + AsgCod,Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); } diff --git a/swad_changelog.h b/swad_changelog.h index 31b45c9f..2bb78aeb 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -116,20 +116,20 @@ // TODO: Enable chat for guests? // TODO: Go to forum post (or at least to forum thread) from social timeline and notifications? // TODO: Width of column for data in notifications is too short -// TODO: Increment one second after each refresh in social timeline? -// TODO: Notifications of new followers should go to follower's profile /*****************************************************************************/ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.121.9 (2016-01-20)" +#define Log_PLATFORM_VERSION "SWAD 15.122 (2016-01-20)" #define CSS_FILE "swad15.121.7.css" #define JS_FILE "swad15.121.7.js" // 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 15.122: Jan 20, 2016 Notifications of new followers go to follower's profile. + Changes in notifications. (194008 lines) Version 15.121.9: Jan 20, 2016 Code optimization in social comments. (193952 lines) Version 15.121.8: Jan 20, 2016 Fixed bugs removing favs to social comments. (193960 lines) Version 15.121.7: Jan 20, 2016 Changes in layout of social timeline. (193955 lines) diff --git a/swad_enrollment.c b/swad_enrollment.c index ae2a3122..691ab47e 100644 --- a/swad_enrollment.c +++ b/swad_enrollment.c @@ -367,7 +367,7 @@ void Enr_ReqAcceptRegisterInCrs (void) /***** Mark possible notification as seen *****/ Ntf_MarkNotifAsSeen (Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB == Rol_STUDENT ? Ntf_EVENT_ENROLLMENT_STUDENT : Ntf_EVENT_ENROLLMENT_TEACHER, - -1L, + -1L,Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); } @@ -2823,7 +2823,7 @@ void Enr_ShowEnrollmentRequests (void) /***** Mark possible notification as seen *****/ Ntf_MarkNotifAsSeen (Ntf_EVENT_ENROLLMENT_REQUEST, - ReqCod, + ReqCod,Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); } else // User does not exists or user already belongs to course ==> remove pair from crs_usr_requests table diff --git a/swad_exam.c b/swad_exam.c index 28b92ac8..b4f3de86 100644 --- a/swad_exam.c +++ b/swad_exam.c @@ -405,7 +405,7 @@ void Exa_ListExamAnnouncementsSee (void) /***** Mark possible notifications as seen *****/ Ntf_MarkNotifAsSeen (Ntf_EVENT_EXAM_ANNOUNCEMENT, - -1L, + -1L,Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); } diff --git a/swad_file_browser.c b/swad_file_browser.c index 82ae31b1..50c29525 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -9210,13 +9210,13 @@ void Brw_ShowFileMetadata (void) case Brw_ADMI_DOCUM_CRS: case Brw_ADMI_DOCUM_GRP: Ntf_MarkNotifAsSeen (Ntf_EVENT_DOCUMENT_FILE, - FileMetadata.FilCod, + FileMetadata.FilCod,Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); break; case Brw_ADMI_SHARE_CRS: case Brw_ADMI_SHARE_GRP: Ntf_MarkNotifAsSeen (Ntf_EVENT_SHARED_FILE, - FileMetadata.FilCod, + FileMetadata.FilCod,Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); break; case Brw_SHOW_MARKS_CRS: @@ -9224,7 +9224,7 @@ void Brw_ShowFileMetadata (void) case Brw_ADMI_MARKS_CRS: case Brw_ADMI_MARKS_GRP: Ntf_MarkNotifAsSeen (Ntf_EVENT_MARKS_FILE, - FileMetadata.FilCod, + FileMetadata.FilCod,Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); break; default: @@ -9349,13 +9349,13 @@ void Brw_DownloadFile (void) case Brw_ADMI_DOCUM_CRS: case Brw_ADMI_DOCUM_GRP: Ntf_MarkNotifAsSeen (Ntf_EVENT_DOCUMENT_FILE, - FileMetadata.FilCod, + FileMetadata.FilCod,Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); break; case Brw_ADMI_SHARE_CRS: case Brw_ADMI_SHARE_GRP: Ntf_MarkNotifAsSeen (Ntf_EVENT_SHARED_FILE, - FileMetadata.FilCod, + FileMetadata.FilCod,Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); break; case Brw_SHOW_MARKS_CRS: @@ -9363,7 +9363,7 @@ void Brw_DownloadFile (void) case Brw_ADMI_MARKS_CRS: case Brw_ADMI_MARKS_GRP: Ntf_MarkNotifAsSeen (Ntf_EVENT_MARKS_FILE, - FileMetadata.FilCod, + FileMetadata.FilCod,Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); break; default: diff --git a/swad_follow.c b/swad_follow.c index ca677989..a837b34b 100644 --- a/swad_follow.c +++ b/swad_follow.c @@ -415,8 +415,9 @@ void Fol_ListFollowers (void) /***** If it's me, mark possible notification as seen *****/ if (Gbl.Usrs.Other.UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) - Ntf_MarkNotifAsSeen (Ntf_EVENT_FOLLOWER,-1L, - Gbl.Usrs.Me.UsrDat.UsrCod); + Ntf_MarkNotifAsSeen (Ntf_EVENT_FOLLOWER, + -1L,-1L, + Gbl.Usrs.Me.UsrDat.UsrCod); } else Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); @@ -545,7 +546,7 @@ void Fol_FollowUsr (void) /***** Create notification for this followed. If this followed wants to receive notifications by e-mail, activate the sending of a notification *****/ if (CreateNotif) - Ntf_StoreNotifyEventToOneUser (Ntf_EVENT_FOLLOWER,&Gbl.Usrs.Other.UsrDat,-1L, + Ntf_StoreNotifyEventToOneUser (Ntf_EVENT_FOLLOWER,&Gbl.Usrs.Other.UsrDat,Gbl.Usrs.Me.UsrDat.UsrCod, (Ntf_Status_t) (NotifyByEmail ? Ntf_STATUS_BIT_EMAIL : 0)); } diff --git a/swad_forum.c b/swad_forum.c index b952807b..9c6d0976 100644 --- a/swad_forum.c +++ b/swad_forum.c @@ -1030,16 +1030,16 @@ static void For_ShowThreadPosts (long ThrCod,char *LastSubject) case For_FORUM_COURSE_TCHS: case For_FORUM_COURSE_USRS: Ntf_MarkNotifAsSeen (Ntf_EVENT_FORUM_POST_COURSE, - PstCod, - Gbl.Usrs.Me.UsrDat.UsrCod); + PstCod,Gbl.CurrentCrs.Crs.CrsCod, + Gbl.Usrs.Me.UsrDat.UsrCod); break; default: break; } if (Thr.NumMyPosts) Ntf_MarkNotifAsSeen (Ntf_EVENT_FORUM_REPLY, - PstCod, - Gbl.Usrs.Me.UsrDat.UsrCod); + PstCod,-1L, + Gbl.Usrs.Me.UsrDat.UsrCod); } Lay_EndRoundFrameTable (); diff --git a/swad_message.c b/swad_message.c index 5d01c807..eafa7a96 100644 --- a/swad_message.c +++ b/swad_message.c @@ -1167,7 +1167,7 @@ void Msg_ExpRecMsg (void) /***** Mark possible notification as seen *****/ Ntf_MarkNotifAsSeen (Ntf_EVENT_MESSAGE, - Gbl.Msg.ExpandedMsgCod, + Gbl.Msg.ExpandedMsgCod,-1L, Gbl.Usrs.Me.UsrDat.UsrCod); /***** Show again the messages *****/ diff --git a/swad_notice.c b/swad_notice.c index db66169c..7c9a270e 100644 --- a/swad_notice.c +++ b/swad_notice.c @@ -476,8 +476,8 @@ void Not_ShowNotices (Not_Listing_t TypeNoticesListing,bool ICanEditNotices) /***** Mark possible notification as seen *****/ Ntf_MarkNotifAsSeen (Ntf_EVENT_NOTICE, - -1L, - Gbl.Usrs.Me.UsrDat.UsrCod); + -1L,Gbl.CurrentCrs.Crs.CrsCod, + Gbl.Usrs.Me.UsrDat.UsrCod); } } diff --git a/swad_notification.c b/swad_notification.c index cc051517..c6733924 100644 --- a/swad_notification.c +++ b/swad_notification.c @@ -644,6 +644,7 @@ static bool Ntf_StartFormGoToAction (Ntf_NotifyEvent_t NotifyEvent, { extern const Act_Action_t For_ActionsSeeFor[For_NUM_TYPES_FORUM]; struct FileMetadata FileMetadata; + struct UsrData UsrDat; long InsCod = -1L; long CtrCod = -1L; long DegCod = -1L; @@ -693,17 +694,30 @@ static bool Ntf_StartFormGoToAction (Ntf_NotifyEvent_t NotifyEvent, Brw_PutHiddenParamFilCod (FileMetadata.FilCod); } break; - case Ntf_EVENT_NOTICE: - Act_FormStart (Ntf_DefaultActions[NotifyEvent]); - Not_PutHiddenParamNotCod (Cod); + case Ntf_EVENT_FOLLOWER: + UsrDat.UsrCod = Cod; // Cod is the follower's code + Usr_GetEncryptedUsrCodFromUsrCod (&UsrDat); + if (UsrDat.EncryptedUsrCod[0]) // User's code found ==> + // go to user's public profile + { + Act_FormStart (ActSeePubPrf); + /* Put param to go to follower's profile */ + Usr_PutParamUsrCodEncrypted (UsrDat.EncryptedUsrCod); + } + else // No user's code found ==> go to see my followers + Act_FormStart (ActSeeFlr); break; case Ntf_EVENT_FORUM_POST_COURSE: case Ntf_EVENT_FORUM_REPLY: Act_FormStart (For_ActionsSeeFor[Gbl.Forum.ForumType]); For_PutAllHiddenParamsForum (); break; + case Ntf_EVENT_NOTICE: + Act_FormStart (ActShoNot); + Not_PutHiddenParamNotCod (Cod); + break; case Ntf_EVENT_MESSAGE: - Act_FormStart (Ntf_DefaultActions[NotifyEvent]); + Act_FormStart (ActExpRcvMsg); Msg_PutHiddenParamMsgCod (Cod); break; default: @@ -817,23 +831,28 @@ void Ntf_GetNotifSummaryAndContent (char *SummaryStr,char **ContentStr,Ntf_Notif /********************** Set possible notification as seen ********************/ /*****************************************************************************/ -void Ntf_MarkNotifAsSeen (Ntf_NotifyEvent_t NotifyEvent,long Cod,long ToUsrCod) +void Ntf_MarkNotifAsSeen (Ntf_NotifyEvent_t NotifyEvent,long Cod,long CrsCod,long ToUsrCod) { char Query[256]; /***** Set notification as seen by me *****/ if (ToUsrCod > 0) // If the user code is specified { - if (Cod > 0) // Set only one notification as seen + if (Cod > 0) // Set only one notification for the user as seen sprintf (Query,"UPDATE notif SET Status=(Status | %u)" " WHERE ToUsrCod='%ld' AND NotifyEvent='%u' AND Cod='%ld'", (unsigned) Ntf_STATUS_BIT_READ, ToUsrCod,(unsigned) NotifyEvent,Cod); - else // Set all notifications of this type, in the current course for the user, as seen + else if (CrsCod > 0) // Set all notifications of this type in the current course for the user as seen sprintf (Query,"UPDATE notif SET Status=(Status | %u)" " WHERE ToUsrCod='%ld' AND NotifyEvent='%u' AND CrsCod='%ld'", (unsigned) Ntf_STATUS_BIT_READ, ToUsrCod,(unsigned) NotifyEvent,Gbl.CurrentCrs.Crs.CrsCod); + else // Set all notifications of this type for the user as seen + sprintf (Query,"UPDATE notif SET Status=(Status | %u)" + " WHERE ToUsrCod='%ld' AND NotifyEvent='%u'", + (unsigned) Ntf_STATUS_BIT_READ, + ToUsrCod,(unsigned) NotifyEvent); DB_QueryUPDATE (Query,"can not set notification(s) as seen"); } } diff --git a/swad_notification.h b/swad_notification.h index 71724dbb..96800bd0 100644 --- a/swad_notification.h +++ b/swad_notification.h @@ -103,7 +103,7 @@ void Ntf_ShowMyNotifications (void); Ntf_StatusTxt_t Ntf_GetStatusTxtFromStatusBits (Ntf_Status_t Status); void Ntf_GetNotifSummaryAndContent (char *SummaryStr,char **ContentStr,Ntf_NotifyEvent_t NotifyEvent, long Cod,long CrsCod,long UsrCod,unsigned MaxChars,bool GetContent); -void Ntf_MarkNotifAsSeen (Ntf_NotifyEvent_t NotifyEvent,long Cod,long ToUsrCod); +void Ntf_MarkNotifAsSeen (Ntf_NotifyEvent_t NotifyEvent,long Cod,long CrsCod,long ToUsrCod); void Ntf_MarkNotifAsRemoved (Ntf_NotifyEvent_t NotifyEvent,long Cod); void Ntf_MarkNotifToOneUsrAsRemoved (Ntf_NotifyEvent_t NotifyEvent,long Cod,long ToUsrCod); void Ntf_MarkNotifInCrsAsRemoved (long CrsCod,long ToUsrCod); diff --git a/swad_profile.c b/swad_profile.c index 42d4d3de..f22fd81c 100644 --- a/swad_profile.c +++ b/swad_profile.c @@ -33,6 +33,7 @@ #include "swad_global.h" #include "swad_network.h" #include "swad_nickname.h" +#include "swad_notification.h" #include "swad_parameter.h" #include "swad_privacy.h" #include "swad_profile.h" @@ -205,6 +206,12 @@ void Prf_GetUsrDatAndShowUserProfile (void) /* End section */ fprintf (Gbl.F.Out,""); } + + /***** If it's not me, mark possible notification as seen *****/ + if (Gbl.Usrs.Other.UsrDat.UsrCod != Gbl.Usrs.Me.UsrDat.UsrCod) + Ntf_MarkNotifAsSeen (Ntf_EVENT_FOLLOWER, + Gbl.Usrs.Other.UsrDat.UsrCod,-1L, + Gbl.Usrs.Me.UsrDat.UsrCod); } /*****************************************************************************/ diff --git a/swad_survey.c b/swad_survey.c index 5f67a386..ca1e1759 100644 --- a/swad_survey.c +++ b/swad_survey.c @@ -538,7 +538,7 @@ static void Svy_ShowOneSurvey (long SvyCod,struct SurveyQuestion *SvyQst,bool Sh /***** Mark possible notification as seen *****/ if (Svy.CrsCod > 0) // Only course surveys are notified Ntf_MarkNotifAsSeen (Ntf_EVENT_SURVEY, - SvyCod, + SvyCod,Svy.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod); /***** End frame *****/ diff --git a/swad_user.c b/swad_user.c index 809b8081..0e4a8fe4 100644 --- a/swad_user.c +++ b/swad_user.c @@ -346,7 +346,7 @@ void Usr_FreeListUsrCods (struct ListUsrCods *ListUsrCods) } /*****************************************************************************/ -/** Get user code from user's record in database using encrypted user code ***/ +/******** Get user's code from database using encrypted user's code **********/ /*****************************************************************************/ // Input: UsrDat->EncryptedUsrCod must hold user's encrypted code @@ -368,7 +368,7 @@ void Usr_GetUsrCodFromEncryptedUsrCod (struct UsrData *UsrDat) if (NumRows != 1) Lay_ShowErrorAndExit ("Error when getting user's code."); - /***** Get user code *****/ + /***** Get user's code *****/ row = mysql_fetch_row (mysql_res); UsrDat->UsrCod = Str_ConvertStrCodToLongCod (row[0]); @@ -379,6 +379,41 @@ void Usr_GetUsrCodFromEncryptedUsrCod (struct UsrData *UsrDat) UsrDat->UsrCod = -1L; } +/*****************************************************************************/ +/********* Get encrypted user's code from database using user's code *********/ +/*****************************************************************************/ +// Input: UsrDat->UsrCod must hold user's code + +void Usr_GetEncryptedUsrCodFromUsrCod (struct UsrData *UsrDat) + { + char Query[512]; + MYSQL_RES *mysql_res; + MYSQL_ROW row; + unsigned long NumRows; + + if (UsrDat->UsrCod > 0) + { + /***** Get encrypted user's code from database *****/ + sprintf (Query,"SELECT EncryptedUsrCod FROM usr_data" + " WHERE UsrCod='%ld'", + UsrDat->UsrCod); + NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get encrypted user's code"); + + if (NumRows != 1) + Lay_ShowErrorAndExit ("Error when getting encrypted user's code."); + + /***** Get encrypted user's code *****/ + row = mysql_fetch_row (mysql_res); + strncpy (UsrDat->EncryptedUsrCod,row[0],sizeof (UsrDat->EncryptedUsrCod)-1); + UsrDat->EncryptedUsrCod[sizeof (UsrDat->EncryptedUsrCod)-1] = '\0'; + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + } + else + UsrDat->EncryptedUsrCod[0] = '\0'; + } + /*****************************************************************************/ /************ Get user's data from database giving a user's code *************/ /*****************************************************************************/ @@ -417,7 +452,7 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat) /***** Read user's data *****/ row = mysql_fetch_row (mysql_res); - /* Get encrypted user code */ + /* Get encrypted user's code */ strncpy (UsrDat->EncryptedUsrCod,row[0],sizeof (UsrDat->EncryptedUsrCod)-1); UsrDat->EncryptedUsrCod[sizeof (UsrDat->EncryptedUsrCod)-1] = '\0'; diff --git a/swad_user.h b/swad_user.h index 225f0d5e..ca9760b7 100644 --- a/swad_user.h +++ b/swad_user.h @@ -203,6 +203,7 @@ void Usr_GetAllUsrDataFromUsrCod (struct UsrData *UsrDat); void Usr_AllocateListUsrCods (struct ListUsrCods *ListUsrCods); void Usr_FreeListUsrCods (struct ListUsrCods *ListUsrCods); void Usr_GetUsrCodFromEncryptedUsrCod (struct UsrData *UsrDat); +void Usr_GetEncryptedUsrCodFromUsrCod (struct UsrData *UsrDat); void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat); void Usr_BuildFullName (struct UsrData *UsrDat);