swad-core/swad_notification.c

2099 lines
80 KiB
C
Raw Normal View History

2016-11-16 23:19:52 +01:00
// swad_notification.c: notifications about events, sent by email
2014-12-01 23:55:08 +01:00
/*
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.
2017-01-13 01:51:23 +01:00
Copyright (C) 1999-2017 Antonio Ca<EFBFBD>as Vargas
2014-12-01 23:55:08 +01:00
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include <linux/stddef.h> // For NULL
#include <stdlib.h> // For system
#include <string.h>
#include <sys/wait.h> // For the macro WEXITSTATUS
#include <unistd.h> // For unlink
#include "swad_action.h"
#include "swad_config.h"
#include "swad_config.h"
#include "swad_database.h"
2014-12-12 18:50:36 +01:00
#include "swad_enrollment.h"
2014-12-01 23:55:08 +01:00
#include "swad_exam.h"
2015-03-24 00:01:40 +01:00
#include "swad_follow.h"
2014-12-01 23:55:08 +01:00
#include "swad_global.h"
#include "swad_mark.h"
#include "swad_notice.h"
#include "swad_notification.h"
#include "swad_parameter.h"
2016-01-04 01:02:07 +01:00
#include "swad_social.h"
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
const char *Ntf_WSNotifyEvents[Ntf_NUM_NOTIFY_EVENTS] =
{
2016-01-23 01:38:55 +01:00
"unknown", // Ntf_EVENT_UNKNOWN
2014-12-01 23:55:08 +01:00
/* Course tab */
2016-01-23 01:38:55 +01:00
"documentFile", // Ntf_EVENT_DOCUMENT_FILE
2016-04-22 09:47:25 +02:00
"teachersFile", // Ntf_EVENT_TEACHERS_FILE
2016-01-23 01:38:55 +01:00
"sharedFile", // Ntf_EVENT_SHARED_FILE
2014-12-01 23:55:08 +01:00
/* Assessment tab */
2016-01-23 01:38:55 +01:00
"assignment", // Ntf_EVENT_ASSIGNMENT
"examAnnouncement", // Ntf_EVENT_EXAM_ANNOUNCEMENT
"marksFile", // Ntf_EVENT_MARKS_FILE
2014-12-01 23:55:08 +01:00
2016-01-22 01:47:28 +01:00
/* Users tab */
2016-01-23 01:38:55 +01:00
"enrollmentStudent", // Ntf_EVENT_ENROLLMENT_STUDENT
"enrollmentTeacher", // Ntf_EVENT_ENROLLMENT_TEACHER
"enrollmentRequest", // Ntf_EVENT_ENROLLMENT_REQUEST
2016-01-22 01:47:28 +01:00
/* Social tab */
2016-01-23 19:11:07 +01:00
"timelineComment", // Ntf_EVENT_TIMELINE_COMMENT
"timelineFav", // Ntf_EVENT_TIMELINE_FAV
"timelineShare", // Ntf_EVENT_TIMELINE_SHARE
"timelineMention", // Ntf_EVENT_TIMELINE_MENTION
"follower", // Ntf_EVENT_FOLLOWER
2016-01-23 01:38:55 +01:00
"forumPostCourse", // Ntf_EVENT_FORUM_POST_COURSE
"forumReply", // Ntf_EVENT_FORUM_REPLY
2014-12-01 23:55:08 +01:00
/* Messages tab */
2016-01-23 01:38:55 +01:00
"notice", // Ntf_EVENT_NOTICE
"message", // Ntf_EVENT_MESSAGE
2014-12-01 23:55:08 +01:00
/* Statistics tab */
2016-01-23 01:38:55 +01:00
"survey", // Ntf_EVENT_SURVEY
2015-03-24 00:01:40 +01:00
/* Profile tab */
2014-12-01 23:55:08 +01:00
};
static const Act_Action_t Ntf_DefaultActions[Ntf_NUM_NOTIFY_EVENTS] =
{
ActUnk, // Ntf_EVENT_UNKNOWN
/* Course tab */
2015-12-29 13:18:25 +01:00
ActSeeAdmDocCrsGrp, // Ntf_EVENT_DOCUMENT_FILE
2016-04-22 09:47:25 +02:00
ActAdmTchCrsGrp, // Ntf_EVENT_TEACHERS_FILE
2015-12-29 13:18:25 +01:00
ActAdmShaCrsGrp, // Ntf_EVENT_SHARED_FILE
2014-12-01 23:55:08 +01:00
/* Assessment tab */
ActSeeAsg, // Ntf_EVENT_ASSIGNMENT
2016-06-01 19:34:44 +02:00
ActSeeAllExaAnn, // Ntf_EVENT_EXAM_ANNOUNCEMENT
2014-12-01 23:55:08 +01:00
ActSeeAdmMrk, // Ntf_EVENT_MARKS_FILE
/* Users tab */
2015-09-17 20:41:31 +02:00
ActReqAccEnrStd, // Ntf_EVENT_ENROLLMENT_STUDENT
ActReqAccEnrTch, // Ntf_EVENT_ENROLLMENT_TEACHER
2014-12-01 23:55:08 +01:00
ActSeeSignUpReq, // Ntf_EVENT_ENROLLMENT_REQUEST
2015-12-30 20:11:50 +01:00
/* Social tab */
2016-01-23 19:11:07 +01:00
ActSeeSocTmlGbl, // Ntf_EVENT_TIMELINE_COMMENT
ActSeeSocTmlGbl, // Ntf_EVENT_TIMELINE_FAV
ActSeeSocTmlGbl, // Ntf_EVENT_TIMELINE_SHARE
ActSeeSocTmlGbl, // Ntf_EVENT_TIMELINE_MENTION
ActSeeFlr, // Ntf_EVENT_FOLLOWER
2016-01-22 01:47:28 +01:00
ActSeeFor, // Ntf_EVENT_FORUM_POST_COURSE
ActSeeFor, // Ntf_EVENT_FORUM_REPLY
2015-12-30 20:11:50 +01:00
2014-12-01 23:55:08 +01:00
/* Messages tab */
2016-06-01 19:34:44 +02:00
ActSeeOneNot, // Ntf_EVENT_NOTICE
2014-12-01 23:55:08 +01:00
ActExpRcvMsg, // Ntf_EVENT_MESSAGE
/* Statistics tab */
ActSeeAllSvy, // Ntf_EVENT_SURVEY
2015-03-24 00:01:40 +01:00
/* Profile tab */
2014-12-01 23:55:08 +01:00
};
/*****************************************************************************/
/***************************** Private constants *****************************/
/*****************************************************************************/
// Notify me notification events
static const char *Ntf_ParamNotifMeAboutNotifyEvents[Ntf_NUM_NOTIFY_EVENTS] =
{
2016-01-22 01:47:28 +01:00
"NotifyNtfEventUnknown", // Ntf_EVENT_UNKNOWN
2014-12-01 23:55:08 +01:00
/* Course tab */
2016-01-22 01:47:28 +01:00
"NotifyNtfEventDocumentFile", // Ntf_EVENT_DOCUMENT_FILE
2016-04-22 09:47:25 +02:00
"NotifyNtfEventTeachersFile", // Ntf_EVENT_TEACHERS_FILE
2016-01-22 01:47:28 +01:00
"NotifyNtfEventSharedFile", // Ntf_EVENT_SHARED_FILE
2014-12-01 23:55:08 +01:00
/* Assessment tab */
2016-01-22 01:47:28 +01:00
"NotifyNtfEventAssignment", // Ntf_EVENT_ASSIGNMENT
"NotifyNtfEventExamAnnouncement", // Ntf_EVENT_EXAM_ANNOUNCEMENT
"NotifyNtfEventMarksFile", // Ntf_EVENT_MARKS_FILE
2014-12-01 23:55:08 +01:00
2016-01-22 01:47:28 +01:00
/* Users tab */
"NotifyNtfEventEnrollmentStudent", // Ntf_EVENT_ENROLLMENT_STUDENT
"NotifyNtfEventEnrollmentTeacher", // Ntf_EVENT_ENROLLMENT_TEACHER
"NotifyNtfEventEnrollmentRequest", // Ntf_EVENT_ENROLLMENT_REQUEST
/* Social tab */
2016-01-23 19:11:07 +01:00
"NotifyNtfEventTimelineComment", // Ntf_EVENT_TIMELINE_COMMENT
"NotifyNtfEventTimelineFav", // Ntf_EVENT_TIMELINE_FAV
"NotifyNtfEventTimelineShare", // Ntf_EVENT_TIMELINE_SHARE
"NotifyNtfEventTimelineMention", // Ntf_EVENT_TIMELINE_MENTION
"NotifyNtfEventFollower", // Ntf_EVENT_FOLLOWER
2016-01-22 01:47:28 +01:00
"NotifyNtfEventForumPostCourse", // Ntf_EVENT_FORUM_POST_COURSE
"NotifyNtfEventForumReply", // Ntf_EVENT_FORUM_REPLY
2014-12-01 23:55:08 +01:00
/* Messages tab */
2016-01-22 01:47:28 +01:00
"NotifyNtfEventNotice", // Ntf_EVENT_NOTICE
"NotifyNtfEventMessage", // Ntf_EVENT_MESSAGE
2014-12-01 23:55:08 +01:00
/* Statistics tab */
2016-01-22 01:47:28 +01:00
"NotifyNtfEventSurvey", // Ntf_EVENT_SURVEY
2015-03-24 00:01:40 +01:00
/* Profile tab */
2014-12-01 23:55:08 +01:00
};
// Email me about notification events
static const char *Ntf_ParamEmailMeAboutNotifyEvents[Ntf_NUM_NOTIFY_EVENTS] =
{
2016-01-22 01:47:28 +01:00
"EmailNtfEventUnknown", // Ntf_EVENT_UNKNOWN
2014-12-01 23:55:08 +01:00
/* Course tab */
2016-01-22 01:47:28 +01:00
"EmailNtfEventDocumentFile", // Ntf_EVENT_DOCUMENT_FILE
2016-04-22 09:47:25 +02:00
"EmailNtfEventTeachersFile", // Ntf_EVENT_TEACHERS_FILE
2016-01-22 01:47:28 +01:00
"EmailNtfEventSharedFile", // Ntf_EVENT_SHARED_FILE
2014-12-01 23:55:08 +01:00
/* Assessment tab */
2016-01-22 01:47:28 +01:00
"EmailNtfEventAssignment", // Ntf_EVENT_ASSIGNMENT
"EmailNtfEventExamAnnouncement", // Ntf_EVENT_EXAM_ANNOUNCEMENT
"EmailNtfEventMarksFile", // Ntf_EVENT_MARKS_FILE
2014-12-01 23:55:08 +01:00
2016-01-22 01:47:28 +01:00
/* Users tab */
"EmailNtfEventEnrollmentStudent", // Ntf_EVENT_ENROLLMENT_STUDENT
"EmailNtfEventEnrollmentTeacher", // Ntf_EVENT_ENROLLMENT_TEACHER
"EmailNtfEventEnrollmentRequest", // Ntf_EVENT_ENROLLMENT_REQUEST
/* Social tab */
2016-01-23 19:11:07 +01:00
"EmailNtfEventTimelineComment", // Ntf_EVENT_TIMELINE_COMMENT
"EmailNtfEventTimelineFav", // Ntf_EVENT_TIMELINE_FAV
"EmailNtfEventTimelineShare", // Ntf_EVENT_TIMELINE_SHARE
"EmailNtfEventTimelineMention", // Ntf_EVENT_TIMELINE_MENTION
"EmailNtfEventSocialFollower", // Ntf_EVENT_FOLLOWER
2016-01-22 01:47:28 +01:00
"EmailNtfEventForumPostCourse", // Ntf_EVENT_FORUM_POST_COURSE
"EmailNtfEventForumReply", // Ntf_EVENT_FORUM_REPLY
2014-12-01 23:55:08 +01:00
/* Messages tab */
2016-01-22 01:47:28 +01:00
"EmailNtfEventNotice", // Ntf_EVENT_NOTICE
"EmailNtfEventMessage", // Ntf_EVENT_MESSAGE
2014-12-01 23:55:08 +01:00
/* Statistics tab */
2016-01-22 01:47:28 +01:00
"EmailNtfEventSurvey", // Ntf_EVENT_SURVEY
2015-03-24 00:01:40 +01:00
/* Profile tab */
2014-12-01 23:55:08 +01:00
};
// Icons for notification events
static const char *Ntf_Icons[Ntf_NUM_NOTIFY_EVENTS] =
{
2015-12-26 21:46:56 +01:00
"faq16x16.gif", // Ntf_EVENT_UNKNOWN
2014-12-01 23:55:08 +01:00
/* Course tab */
2015-12-26 21:46:56 +01:00
"file64x64.gif", // Ntf_EVENT_DOCUMENT_FILE
2016-04-22 09:47:25 +02:00
"file64x64.gif", // Ntf_EVENT_TEACHERS_FILE
2015-12-26 21:46:56 +01:00
"file64x64.gif", // Ntf_EVENT_SHARED_FILE
2014-12-01 23:55:08 +01:00
/* Assessment tab */
2015-12-26 21:46:56 +01:00
"desk16x16.gif", // Ntf_EVENT_ASSIGNMENT
2016-02-04 01:13:49 +01:00
"announce64x64.gif", // Ntf_EVENT_EXAM_ANNOUNCEMENT
2015-12-26 21:46:56 +01:00
"grades16x16.gif", // Ntf_EVENT_MARKS_FILE
2014-12-01 23:55:08 +01:00
2016-01-22 01:47:28 +01:00
/* Users tab */
2015-12-26 21:46:56 +01:00
"adduser16x16.gif", // Ntf_EVENT_ENROLLMENT_STUDENT
"adduser16x16.gif", // Ntf_EVENT_ENROLLMENT_TEACHER
"enrollmentrequest16x16.gif", // Ntf_EVENT_ENROLLMENT_REQUEST
2014-12-01 23:55:08 +01:00
2016-01-22 01:47:28 +01:00
/* Social tab */
2016-01-23 19:11:07 +01:00
"soc64x64.png", // Ntf_EVENT_TIMELINE_COMMENT
"fav64x64.png", // Ntf_EVENT_TIMELINE_FAV
"share64x64.png", // Ntf_EVENT_TIMELINE_SHARE
"arroba64x64.gif", // Ntf_EVENT_TIMELINE_MENTION
"follow64x64.png", // Ntf_EVENT_FOLLOWER
2016-02-02 19:35:35 +01:00
"forum64x64.gif", // Ntf_EVENT_FORUM_POST_COURSE
"forum64x64.gif", // Ntf_EVENT_FORUM_REPLY
2016-01-22 01:47:28 +01:00
/* Messages tab */
2016-11-21 01:20:19 +01:00
"notice64x64.png", // Ntf_EVENT_NOTICE
2015-12-26 21:46:56 +01:00
"msg64x64.gif", // Ntf_EVENT_MESSAGE
2014-12-01 23:55:08 +01:00
/* Statistics tab */
2015-12-26 21:46:56 +01:00
"survey16x16.gif", // Ntf_EVENT_SURVEY
2015-03-24 00:01:40 +01:00
/* Profile tab */
2014-12-01 23:55:08 +01:00
};
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
2016-11-07 14:24:44 +01:00
static void Ntf_PutIconsNotif (void);
2014-12-01 23:55:08 +01:00
static void Ntf_WriteFormAllNotifications (bool AllNotifications);
static bool Ntf_GetAllNotificationsFromForm (void);
2016-01-25 14:40:57 +01:00
2016-01-03 01:13:57 +01:00
static bool Ntf_StartFormGoToAction (Ntf_NotifyEvent_t NotifyEvent,
2016-01-25 14:40:57 +01:00
long CrsCod,struct UsrData *UsrDat,long Cod);
static void Ntf_PutHiddenParamNotifyEvent (Ntf_NotifyEvent_t NotifyEvent);
2014-12-01 23:55:08 +01:00
static void Ntf_UpdateMyLastAccessToNotifications (void);
static void Ntf_SendPendingNotifByEMailToOneUsr (struct UsrData *ToUsrDat,unsigned *NumNotif,unsigned *NumMails);
static void Ntf_GetNumNotifSent (long DegCod,long CrsCod,
Ntf_NotifyEvent_t NotifyEvent,
unsigned *NumEvents,unsigned *NumMails);
static void Ntf_UpdateNumNotifSent (long DegCod,long CrsCod,
Ntf_NotifyEvent_t NotifyEvent,
unsigned NumEvents,unsigned NumMails);
2016-11-07 14:12:15 +01:00
2014-12-01 23:55:08 +01:00
static void Ntf_GetParamsNotifyEvents (void);
static unsigned Ntf_GetNumberOfAllMyUnseenNtfs (void);
static unsigned Ntf_GetNumberOfMyNewUnseenNtfs (void);
/*****************************************************************************/
/*************************** Show my notifications ***************************/
/*****************************************************************************/
void Ntf_ShowMyNotifications (void)
{
2016-11-22 01:01:43 +01:00
extern const char *Hlp_MESSAGES_Notifications;
2015-12-13 20:24:39 +01:00
extern const char *Txt_Change_preferences;
2016-11-22 10:19:10 +01:00
extern const char *Txt_Preferences;
2015-12-13 20:24:39 +01:00
extern const char *Txt_Mark_all_notifications_as_read;
2016-11-22 10:19:10 +01:00
extern const char *Txt_Mark_all_NOTIFICATIONS_as_read;
2014-12-01 23:55:08 +01:00
extern const char *Txt_Notifications;
extern const char *Txt_Date;
extern const char *Txt_Event;
extern const char *Txt_Location;
extern const char *Txt_MSG_From;
extern const char *Txt_Email;
extern const char *Txt_NOTIFY_EVENTS_SINGULAR[Ntf_NUM_NOTIFY_EVENTS];
extern const char *Txt_Forum;
extern const char *Txt_Course;
extern const char *Txt_Degree;
extern const char *Txt_Centre;
extern const char *Txt_Institution;
extern const char *Txt_NOTIFICATION_STATUS[Ntf_NUM_STATUS_TXT];
2016-11-26 17:40:48 +01:00
extern const char *Txt_You_have_no_notifications;
extern const char *Txt_You_have_no_unread_notifications;
2014-12-01 23:55:08 +01:00
char Query[512];
char SubQuery[128];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumNotif;
unsigned long NumNotifications;
bool AllNotifications;
Ntf_NotifyEvent_t NotifyEvent = (Ntf_NotifyEvent_t) 0; // Initialized to avoid warning
struct UsrData UsrDat;
2016-10-28 10:03:37 +02:00
struct Instit Ins;
2014-12-01 23:55:08 +01:00
struct Centre Ctr;
struct Degree Deg;
struct Course Crs;
long Cod;
char ForumName[512];
2015-10-24 20:12:03 +02:00
time_t DateTimeUTC; // Date-time of the event
2014-12-01 23:55:08 +01:00
Ntf_Status_t Status;
Ntf_StatusTxt_t StatusTxt;
2017-01-13 01:51:23 +01:00
char SummaryStr[Cns_MAX_BYTES_TEXT + 1];
2014-12-01 23:55:08 +01:00
char *ContentStr;
const char *ClassBackground;
const char *ClassAnchor;
const char *ClassAuthorBg;
bool PutLink;
/***** Get my notifications from database *****/
AllNotifications = Ntf_GetAllNotificationsFromForm ();
if (AllNotifications)
SubQuery[0] = '\0';
else
sprintf (SubQuery," AND (Status&%u)=0",
Ntf_STATUS_BIT_READ |
Ntf_STATUS_BIT_REMOVED);
sprintf (Query,"SELECT NotifyEvent,FromUsrCod,InsCod,CtrCod,DegCod,CrsCod,"
2015-10-24 20:12:03 +02:00
"Cod,UNIX_TIMESTAMP(TimeNotif),Status"
2014-12-01 23:55:08 +01:00
" FROM notif"
" WHERE ToUsrCod='%ld'%s"
" ORDER BY TimeNotif DESC",
Gbl.Usrs.Me.UsrDat.UsrCod,SubQuery);
NumNotifications = DB_QuerySELECT (Query,&mysql_res,"can not get your notifications");
2016-11-22 12:07:29 +01:00
/***** Contextual links *****/
2015-04-02 14:22:21 +02:00
fprintf (Gbl.F.Out,"<div class=\"CONTEXT_MENU\">");
2016-11-22 10:19:10 +01:00
2016-11-22 12:07:29 +01:00
/* Write form to show all notifications */
2016-11-22 10:19:10 +01:00
Ntf_WriteFormAllNotifications (AllNotifications);
2016-11-26 20:58:12 +01:00
if (NumNotifications) // TODO: Show message only when I don't have notificacions at all
2016-11-22 10:19:10 +01:00
/* Put form to change notification preferences */
2016-07-01 16:32:42 +02:00
Lay_PutContextualLink (ActMrkNtfSee,NULL,
"eye-on64x64.png",
Txt_Mark_all_notifications_as_read,
2016-11-22 10:19:10 +01:00
Txt_Mark_all_NOTIFICATIONS_as_read,
2016-07-01 16:32:42 +02:00
NULL);
2014-12-01 23:55:08 +01:00
2016-11-22 10:19:10 +01:00
/* Put form to change notification preferences */
Lay_PutContextualLink (ActEdiPrf,NULL,
"heart64x64.gif",
Txt_Change_preferences,Txt_Preferences,
NULL);
fprintf (Gbl.F.Out,"</div>");
2014-12-01 23:55:08 +01:00
2016-11-26 17:40:48 +01:00
/***** Start frame *****/
Lay_StartRoundFrame (NULL,Txt_Notifications,
Ntf_PutIconsNotif,Hlp_MESSAGES_Notifications);
2014-12-01 23:55:08 +01:00
/***** List my notifications *****/
if (NumNotifications) // Notifications found
{
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
2016-11-26 17:40:48 +01:00
/***** Start table *****/
fprintf (Gbl.F.Out,"<table class=\"FRAME_TBL CELLS_PAD_2\">"
"<tr>"
2015-09-06 20:02:14 +02:00
"<th colspan=\"2\" class=\"LEFT_MIDDLE\">"
2014-12-27 00:28:19 +01:00
"%s"
"</th>"
2015-09-06 20:02:14 +02:00
"<th colspan=\"2\" class=\"LEFT_MIDDLE\">"
2014-12-27 00:28:19 +01:00
"%s"
"</th>"
2015-09-06 20:02:14 +02:00
"<th class=\"LEFT_MIDDLE\">"
2014-12-27 00:28:19 +01:00
"%s"
"</th>"
2015-09-06 20:02:14 +02:00
"<th class=\"CENTER_MIDDLE\">"
2014-12-27 00:28:19 +01:00
"%s"
"</th>"
2015-09-06 20:02:14 +02:00
"<th class=\"LEFT_MIDDLE\">"
2014-12-27 00:28:19 +01:00
"%s"
"</th>"
2014-12-01 23:55:08 +01:00
"</tr>",
Txt_Event,
Txt_MSG_From,
Txt_Location,
Txt_Date,
Txt_Email); // Date and time, in YYYY-MM-DD HH:MM:SS format
/***** List notifications one by one *****/
for (NumNotif = 0;
NumNotif < NumNotifications;
NumNotif++)
{
/***** Get next notification *****/
row = mysql_fetch_row (mysql_res);
/* Get event type (row[0]) */
NotifyEvent = Ntf_GetNotifyEventFromDB ((const char *) row[0]);
/* Get (from) user code (row[1]) */
UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[1]);
Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat); // Get user's data from the database
/* Get institution code (row[2]) */
Ins.InsCod = Str_ConvertStrCodToLongCod (row[2]);
2015-12-09 19:51:17 +01:00
Ins_GetDataOfInstitutionByCod (&Ins,Ins_GET_BASIC_DATA);
2014-12-01 23:55:08 +01:00
/* Get centre code (row[3]) */
Ctr.CtrCod = Str_ConvertStrCodToLongCod (row[3]);
Ctr_GetDataOfCentreByCod (&Ctr);
/* Get degree code (row[4]) */
Deg.DegCod = Str_ConvertStrCodToLongCod (row[4]);
Deg_GetDataOfDegreeByCod (&Deg);
/* Get course code (row[5]) */
Crs.CrsCod = Str_ConvertStrCodToLongCod (row[5]);
Crs_GetDataOfCourseByCod (&Crs);
/* Get message/post/... code (row[6]) */
Cod = Str_ConvertStrCodToLongCod (row[6]);
/* Get forum type of the post */
if (NotifyEvent == Ntf_EVENT_FORUM_POST_COURSE ||
NotifyEvent == Ntf_EVENT_FORUM_REPLY)
{
Gbl.Forum.ForumType = For_GetForumTypeOfAPost (Cod);
For_SetForumName (Gbl.Forum.ForumType,
&Ins,
&Ctr,
&Deg,
&Crs,
ForumName,Gbl.Prefs.Language,false); // Set forum name in recipient's language
Gbl.Forum.Ins.InsCod = Ins.InsCod;
Gbl.Forum.Ctr.CtrCod = Ctr.CtrCod;
Gbl.Forum.Deg.DegCod = Deg.DegCod;
Gbl.Forum.Crs.CrsCod = Crs.CrsCod;
}
/* Get time of the event (row[7]) */
2015-10-24 20:12:03 +02:00
DateTimeUTC = Dat_GetUNIXTimeFromStr (row[7]);
2014-12-01 23:55:08 +01:00
/* Get status (row[8]) */
if (sscanf (row[8],"%u",&Status) != 1)
Lay_ShowErrorAndExit ("Wrong notification status.");
StatusTxt = Ntf_GetStatusTxtFromStatusBits (Status);
if (Status & Ntf_STATUS_BIT_REMOVED) // The source of the notification was removed
{
ClassBackground = "MSG_TIT_BG_REM";
ClassAnchor = "MSG_TIT_REM";
ClassAuthorBg = "MSG_AUT_BG_REM";
PutLink = false;
}
else if (Status & Ntf_STATUS_BIT_READ) // I have already seen the source of the notification
{
ClassBackground = "MSG_TIT_BG";
ClassAnchor = "MSG_TIT";
ClassAuthorBg = "MSG_AUT_BG";
PutLink = true;
}
else // I have not seen the source of the notification
{
ClassBackground = "MSG_TIT_BG_NEW";
ClassAnchor = "MSG_TIT_NEW";
ClassAuthorBg = "MSG_AUT_BG_NEW";
PutLink = true;
}
/***** Write row for this notification *****/
/* Write event icon */
fprintf (Gbl.F.Out,"<tr>"
2015-09-28 18:28:29 +02:00
"<td class=\"%s LEFT_TOP\" style=\"width:25px;\">",
2014-12-01 23:55:08 +01:00
ClassBackground);
2016-01-03 01:13:57 +01:00
if (PutLink)
2016-01-25 14:40:57 +01:00
PutLink = Ntf_StartFormGoToAction (NotifyEvent,Crs.CrsCod,&UsrDat,Cod);
2016-01-03 01:13:57 +01:00
2014-12-01 23:55:08 +01:00
if (PutLink)
{
2016-01-03 01:13:57 +01:00
fprintf (Gbl.F.Out,"<input type=\"image\" src=\"%s/%s\""
" alt=\"%s\" title=\"%s\""
2016-11-14 10:05:41 +01:00
" class=\"ICO20x20\" />",
2016-01-03 01:13:57 +01:00
Gbl.Prefs.IconsURL,
Ntf_Icons[NotifyEvent],
Txt_NOTIFY_EVENTS_SINGULAR[NotifyEvent],
Txt_NOTIFY_EVENTS_SINGULAR[NotifyEvent]);
Act_FormEnd ();
2014-12-01 23:55:08 +01:00
}
else
2015-12-26 21:46:56 +01:00
fprintf (Gbl.F.Out,"<img src=\"%s/%s\""
2015-07-22 13:32:56 +02:00
" alt=\"%s\" title=\"%s\""
2016-11-14 10:05:41 +01:00
" class=\"ICO20x20\" />",
2015-03-24 00:17:41 +01:00
Gbl.Prefs.IconsURL,
2014-12-01 23:55:08 +01:00
Ntf_Icons[NotifyEvent],
2015-07-22 13:32:56 +02:00
Txt_NOTIFY_EVENTS_SINGULAR[NotifyEvent],
2014-12-01 23:55:08 +01:00
Txt_NOTIFY_EVENTS_SINGULAR[NotifyEvent]);
fprintf (Gbl.F.Out,"</td>");
/* Write event type */
2015-08-24 11:25:20 +02:00
fprintf (Gbl.F.Out,"<td class=\"%s LEFT_TOP\">",
2014-12-01 23:55:08 +01:00
ClassBackground);
2016-01-03 01:13:57 +01:00
if (PutLink)
2016-01-25 14:40:57 +01:00
PutLink = Ntf_StartFormGoToAction (NotifyEvent,Crs.CrsCod,&UsrDat,Cod);
2016-01-03 01:13:57 +01:00
2014-12-01 23:55:08 +01:00
if (PutLink)
{
2016-07-01 17:13:41 +02:00
Act_LinkFormSubmit (Txt_NOTIFY_EVENTS_SINGULAR[NotifyEvent],ClassAnchor,NULL);
2015-03-13 00:16:02 +01:00
fprintf (Gbl.F.Out,"%s</a>",
2014-12-01 23:55:08 +01:00
Txt_NOTIFY_EVENTS_SINGULAR[NotifyEvent]);
2015-03-13 00:16:02 +01:00
Act_FormEnd ();
2014-12-01 23:55:08 +01:00
}
else
fprintf (Gbl.F.Out,"<span class=\"%s\">%s</span>",
ClassAnchor,Txt_NOTIFY_EVENTS_SINGULAR[NotifyEvent]);
fprintf (Gbl.F.Out,"</td>");
/* Write user (from) */
2015-09-24 18:02:21 +02:00
Msg_WriteMsgAuthor (&UsrDat,120,11,ClassAuthorBg,true,NULL);
2014-12-01 23:55:08 +01:00
/* Write location */
2015-08-24 11:25:20 +02:00
fprintf (Gbl.F.Out,"<td class=\"%s LEFT_TOP\">",
2014-12-23 22:47:09 +01:00
ClassBackground);
2014-12-01 23:55:08 +01:00
if (NotifyEvent == Ntf_EVENT_FORUM_POST_COURSE ||
NotifyEvent == Ntf_EVENT_FORUM_REPLY)
{
if (PutLink)
2016-01-25 14:40:57 +01:00
PutLink = Ntf_StartFormGoToAction (NotifyEvent,Crs.CrsCod,&UsrDat,Cod);
2016-01-03 01:13:57 +01:00
if (PutLink)
2016-07-01 17:13:41 +02:00
Act_LinkFormSubmit (Txt_NOTIFY_EVENTS_SINGULAR[NotifyEvent],ClassAnchor,NULL);
2014-12-01 23:55:08 +01:00
else
fprintf (Gbl.F.Out,"<span class=\"%s\">",ClassAnchor);
fprintf (Gbl.F.Out,"%s: %s",Txt_Forum,ForumName);
2015-03-13 00:16:02 +01:00
if (PutLink)
{
fprintf (Gbl.F.Out,"</a>");
Act_FormEnd ();
}
else
fprintf (Gbl.F.Out,"</span>");
2014-12-01 23:55:08 +01:00
}
2016-06-27 22:51:57 +02:00
else
2014-12-01 23:55:08 +01:00
{
if (PutLink)
2016-01-25 14:40:57 +01:00
PutLink = Ntf_StartFormGoToAction (NotifyEvent,Crs.CrsCod,&UsrDat,Cod);
2016-01-03 01:13:57 +01:00
if (PutLink)
2016-07-01 17:13:41 +02:00
Act_LinkFormSubmit (Txt_NOTIFY_EVENTS_SINGULAR[NotifyEvent],ClassAnchor,NULL);
2014-12-01 23:55:08 +01:00
else
fprintf (Gbl.F.Out,"<span class=\"%s\">",ClassAnchor);
2016-06-27 22:51:57 +02:00
if (Crs.CrsCod > 0)
2016-10-28 10:03:37 +02:00
fprintf (Gbl.F.Out,"%s: %s",Txt_Course,Crs.ShrtName);
2016-06-27 22:51:57 +02:00
else if (Deg.DegCod > 0)
2016-10-28 10:03:37 +02:00
fprintf (Gbl.F.Out,"%s: %s",Txt_Degree,Deg.ShrtName);
2016-06-27 22:51:57 +02:00
else if (Ctr.CtrCod > 0)
2016-10-28 10:03:37 +02:00
fprintf (Gbl.F.Out,"%s: %s",Txt_Centre,Ctr.ShrtName);
2016-06-27 22:51:57 +02:00
else if (Ins.InsCod > 0)
2016-10-28 10:03:37 +02:00
fprintf (Gbl.F.Out,"%s: %s",Txt_Institution,Ins.ShrtName);
2016-06-27 22:51:57 +02:00
else
fprintf (Gbl.F.Out,"-");
2015-03-13 00:16:02 +01:00
if (PutLink)
{
fprintf (Gbl.F.Out,"</a>");
Act_FormEnd ();
}
else
fprintf (Gbl.F.Out,"</span>");
2014-12-01 23:55:08 +01:00
}
fprintf (Gbl.F.Out,"</td>");
2015-12-28 19:22:56 +01:00
/* Write date and time */
2015-10-24 20:12:03 +02:00
Msg_WriteMsgDate (DateTimeUTC,ClassBackground);
2014-12-01 23:55:08 +01:00
/* Write status (sent by email / pending to be sent by email) */
2015-08-24 11:25:20 +02:00
fprintf (Gbl.F.Out,"<td class=\"%s LEFT_TOP\">"
2014-12-23 22:47:09 +01:00
"%s"
2016-12-27 11:33:13 +01:00
"</td>"
2014-12-01 23:55:08 +01:00
"</tr>",
ClassBackground,Txt_NOTIFICATION_STATUS[StatusTxt]);
/***** Write content of the event *****/
if (PutLink)
{
ContentStr = NULL;
Ntf_GetNotifSummaryAndContent (SummaryStr,&ContentStr,NotifyEvent,
2016-01-22 12:05:25 +01:00
Cod,Crs.CrsCod,Gbl.Usrs.Me.UsrDat.UsrCod,
Cfg_MAX_CHARS_NOTIF_SUMMARY_SWAD,false);
2014-12-01 23:55:08 +01:00
fprintf (Gbl.F.Out,"<tr>"
"<td colspan=\"2\"></td>"
2015-08-24 11:25:20 +02:00
"<td colspan=\"5\" class=\"DAT LEFT_TOP\""
2015-09-28 18:28:29 +02:00
" style=\"padding-bottom:12px;\">"
2014-12-01 23:55:08 +01:00
"%s"
"</td>"
"</tr>",
SummaryStr);
if (ContentStr != NULL)
{
free ((void *) ContentStr);
ContentStr = NULL;
}
}
}
2016-03-20 13:47:46 +01:00
/***** End table *****/
2016-11-26 17:40:48 +01:00
fprintf (Gbl.F.Out,"</table>");
2014-12-01 23:55:08 +01:00
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
}
else
2016-11-26 17:40:48 +01:00
Lay_ShowAlert (Lay_INFO,AllNotifications ? Txt_You_have_no_notifications :
Txt_You_have_no_unread_notifications);
/***** End frame *****/
Lay_EndRoundFrame ();
2014-12-01 23:55:08 +01:00
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** Reset to 0 the number of new notifications *****/
Ntf_UpdateMyLastAccessToNotifications ();
}
2016-11-07 14:24:44 +01:00
/*****************************************************************************/
/****************** Put contextual icons in notifications ********************/
/*****************************************************************************/
static void Ntf_PutIconsNotif (void)
{
/***** Put icon to show a figure *****/
Gbl.Stat.FigureType = Sta_NOTIFY_EVENTS;
Sta_PutIconToShowFigure ();
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/********** Write a form to select whether show all notifications ************/
/*****************************************************************************/
static void Ntf_WriteFormAllNotifications (bool AllNotifications)
{
extern const char *Txt_Show_all_notifications;
2016-11-22 10:19:10 +01:00
extern const char *Txt_Show_all_NOTIFICATIONS;
2014-12-01 23:55:08 +01:00
2016-11-22 12:07:29 +01:00
Lay_PutContextualCheckbox (ActSeeNtf,NULL,
"All",AllNotifications,
2016-11-22 10:44:58 +01:00
Txt_Show_all_notifications,
Txt_Show_all_NOTIFICATIONS);
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/************* Get whether to show all notifications from form ***************/
/*****************************************************************************/
static bool Ntf_GetAllNotificationsFromForm (void)
{
char YN[1+1];
Par_GetParToText ("All",YN,1);
return (Str_ConvertToUpperLetter (YN[0]) == 'Y');
}
/*****************************************************************************/
2015-12-29 13:18:25 +01:00
/*********** Put form to go to an action depending on the event **************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2016-01-14 10:31:09 +01:00
// Return the value of Gbl.Form.Inside (true if form is started)
2014-12-01 23:55:08 +01:00
2016-01-03 01:13:57 +01:00
static bool Ntf_StartFormGoToAction (Ntf_NotifyEvent_t NotifyEvent,
2016-01-25 14:40:57 +01:00
long CrsCod,struct UsrData *UsrDat,long Cod)
2014-12-01 23:55:08 +01:00
{
extern const Act_Action_t For_ActionsSeeFor[For_NUM_TYPES_FORUM];
struct FileMetadata FileMetadata;
2016-01-02 17:07:58 +01:00
long InsCod = -1L;
long CtrCod = -1L;
long DegCod = -1L;
2014-12-01 23:55:08 +01:00
long GrpCod = -1L;
Act_Action_t Action = ActUnk; // Initialized to avoid warning
/***** Parameters depending on the type of event *****/
switch (NotifyEvent)
{
case Ntf_EVENT_DOCUMENT_FILE:
2016-04-22 09:47:25 +02:00
case Ntf_EVENT_TEACHERS_FILE:
2014-12-01 23:55:08 +01:00
case Ntf_EVENT_SHARED_FILE:
case Ntf_EVENT_MARKS_FILE:
2016-01-03 15:36:46 +01:00
Action = ActUnk;
2016-01-03 01:13:57 +01:00
FileMetadata.FilCod = Cod;
if (FileMetadata.FilCod > 0)
2014-12-01 23:55:08 +01:00
Brw_GetFileMetadataByCod (&FileMetadata);
2016-01-03 15:36:46 +01:00
if (FileMetadata.FilCod > 0)
2016-01-03 01:13:57 +01:00
{
2016-01-03 15:36:46 +01:00
Brw_GetCrsGrpFromFileMetadata (FileMetadata.FileBrowser,FileMetadata.Cod,
&InsCod,&CtrCod,&DegCod,&CrsCod,&GrpCod);
switch (NotifyEvent)
{
case Ntf_EVENT_DOCUMENT_FILE:
Action = (GrpCod > 0 ? ActReqDatSeeDocGrp :
(CrsCod > 0 ? ActReqDatSeeDocCrs :
(DegCod > 0 ? ActReqDatSeeDocDeg :
(CtrCod > 0 ? ActReqDatSeeDocCtr :
ActReqDatSeeDocIns))));
break;
2016-04-22 09:47:25 +02:00
case Ntf_EVENT_TEACHERS_FILE:
Action = (GrpCod > 0 ? ActReqDatTchGrp :
ActReqDatTchCrs);
break;
2016-01-03 15:36:46 +01:00
case Ntf_EVENT_SHARED_FILE:
Action = (GrpCod > 0 ? ActReqDatShaGrp :
(CrsCod > 0 ? ActReqDatShaCrs :
(DegCod > 0 ? ActReqDatShaDeg :
(CtrCod > 0 ? ActReqDatShaCtr :
ActReqDatShaIns))));
break;
case Ntf_EVENT_MARKS_FILE:
Action = (GrpCod > 0 ? ActReqDatSeeMrkGrp :
ActReqDatSeeMrkCrs);
break;
default: // Not aplicable here
break;
}
2016-01-03 01:13:57 +01:00
Act_FormStart (Action);
if (GrpCod > 0)
Grp_PutParamGrpCod (GrpCod);
2016-01-03 15:36:46 +01:00
Brw_PutHiddenParamFilCod (FileMetadata.FilCod);
2016-01-03 01:13:57 +01:00
}
2014-12-01 23:55:08 +01:00
break;
2016-01-23 19:11:07 +01:00
case Ntf_EVENT_TIMELINE_COMMENT:
case Ntf_EVENT_TIMELINE_FAV:
case Ntf_EVENT_TIMELINE_SHARE:
case Ntf_EVENT_TIMELINE_MENTION:
2016-01-23 01:38:55 +01:00
// Cod is the code of the social publishing
2016-01-22 12:42:43 +01:00
Act_FormStart (ActSeeSocTmlGbl);
2016-01-25 14:40:57 +01:00
Soc_PutHiddenParamPubCod (Cod);
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
Ntf_PutHiddenParamNotifyEvent (NotifyEvent);
2016-01-22 12:42:43 +01:00
break;
2016-01-23 19:11:07 +01:00
case Ntf_EVENT_FOLLOWER:
2016-01-25 14:40:57 +01:00
if (UsrDat->EncryptedUsrCod[0]) // User's code found ==>
2016-01-20 21:18:38 +01:00
// go to user's public profile
{
Act_FormStart (ActSeePubPrf);
/* Put param to go to follower's profile */
2016-01-25 14:40:57 +01:00
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
2016-01-20 21:18:38 +01:00
}
else // No user's code found ==> go to see my followers
Act_FormStart (ActSeeFlr);
2015-12-29 13:18:25 +01:00
break;
2014-12-01 23:55:08 +01:00
case Ntf_EVENT_FORUM_POST_COURSE:
case Ntf_EVENT_FORUM_REPLY:
Act_FormStart (For_ActionsSeeFor[Gbl.Forum.ForumType]);
For_PutAllHiddenParamsForum ();
break;
2016-01-20 21:18:38 +01:00
case Ntf_EVENT_NOTICE:
2016-06-01 19:34:44 +02:00
Act_FormStart (ActSeeOneNot);
2016-01-20 21:18:38 +01:00
Not_PutHiddenParamNotCod (Cod);
break;
2014-12-01 23:55:08 +01:00
case Ntf_EVENT_MESSAGE:
2016-01-20 21:18:38 +01:00
Act_FormStart (ActExpRcvMsg);
2014-12-01 23:55:08 +01:00
Msg_PutHiddenParamMsgCod (Cod);
break;
default:
Act_FormStart (Ntf_DefaultActions[NotifyEvent]);
break;
}
2016-01-02 17:07:58 +01:00
/***** Parameter to go to another course/degree/centre/institution *****/
2016-01-14 10:31:09 +01:00
if (Gbl.Form.Inside)
2016-01-02 17:07:58 +01:00
{
2016-01-03 01:13:57 +01:00
if (CrsCod > 0) // Course specified
{
if (CrsCod != Gbl.CurrentCrs.Crs.CrsCod) // Not the current course
Crs_PutParamCrsCod (CrsCod); // Go to another course
}
else if (DegCod > 0) // Degree specified
{
if (DegCod != Gbl.CurrentDeg.Deg.DegCod) // Not the current degree
Deg_PutParamDegCod (DegCod); // Go to another degree
}
else if (CtrCod > 0) // Centre specified
{
if (CtrCod != Gbl.CurrentCtr.Ctr.CtrCod) // Not the current centre
Ctr_PutParamCtrCod (CtrCod); // Go to another centre
}
else if (InsCod > 0) // Institution specified
{
if (InsCod != Gbl.CurrentIns.Ins.InsCod) // Not the current institution
Ins_PutParamInsCod (InsCod); // Go to another institution
}
2016-01-02 17:07:58 +01:00
}
2016-01-03 01:13:57 +01:00
2016-01-14 10:31:09 +01:00
return Gbl.Form.Inside;
2014-12-01 23:55:08 +01:00
}
2016-01-25 14:40:57 +01:00
/*****************************************************************************/
/******************* Get parameter with notify event type ********************/
/*****************************************************************************/
static void Ntf_PutHiddenParamNotifyEvent (Ntf_NotifyEvent_t NotifyEvent)
{
Par_PutHiddenParamUnsigned ("NotifyEvent",(unsigned) NotifyEvent);
}
/*****************************************************************************/
/******************* Get parameter with notify event type ********************/
/*****************************************************************************/
Ntf_NotifyEvent_t Ntf_GetParamNotifyEvent (void)
{
char UnsignedStr[10+1];
unsigned UnsignedNum;
Par_GetParToText ("NotifyEvent",UnsignedStr,10);
if (UnsignedStr[0])
{
if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1)
if (UnsignedNum < Ntf_NUM_NOTIFY_EVENTS)
return (Ntf_NotifyEvent_t) UnsignedNum;
}
return Ntf_EVENT_UNKNOWN;
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/****************** Set StatusTxt depending on status bits *******************/
/*****************************************************************************/
// Ntf_STATUS_NO_EMAIL = 0, // --0 !(Status & Ntf_STATUS_BIT_EMAIL)
// Ntf_STATUS_EMAIL_PENDING = 1, // 001 (Status & Ntf_STATUS_BIT_EMAIL) && !(Status & Ntf_STATUS_BIT_SENT) && !(Status & Ntf_STATUS_BIT_READ)
// Ntf_STATUS_EMAIL_CANCELLED = 2, // 101 (Status & Ntf_STATUS_BIT_EMAIL) && !(Status & Ntf_STATUS_BIT_SENT) && (Status & Ntf_STATUS_BIT_READ)
// Ntf_STATUS_EMAIL_SENT = 3, // -11 (Status & Ntf_STATUS_BIT_EMAIL) && (Status & Ntf_STATUS_BIT_SENT)
Ntf_StatusTxt_t Ntf_GetStatusTxtFromStatusBits (Ntf_Status_t Status)
{
if (!(Status & Ntf_STATUS_BIT_EMAIL))
return Ntf_STATUS_NO_EMAIL;
if ( (Status & Ntf_STATUS_BIT_SENT))
return Ntf_STATUS_EMAIL_SENT;
if ( (Status & (Ntf_STATUS_BIT_READ | Ntf_STATUS_BIT_REMOVED)))
return Ntf_STATUS_EMAIL_CANCELLED;
return Ntf_STATUS_EMAIL_PENDING;
}
/*****************************************************************************/
2015-12-28 19:22:56 +01:00
/******************* Get notification summary and content ********************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2017-01-13 01:51:23 +01:00
void Ntf_GetNotifSummaryAndContent (char SummaryStr[Cns_MAX_BYTES_TEXT + 1],char **ContentStr,
2016-01-22 12:05:25 +01:00
Ntf_NotifyEvent_t NotifyEvent,
long Cod,long CrsCod,long UsrCod,
unsigned MaxChars,bool GetContent)
2014-12-01 23:55:08 +01:00
{
SummaryStr[0] = '\0';
switch (NotifyEvent)
{
case Ntf_EVENT_UNKNOWN:
break;
case Ntf_EVENT_DOCUMENT_FILE:
2016-04-22 09:47:25 +02:00
case Ntf_EVENT_TEACHERS_FILE:
2014-12-01 23:55:08 +01:00
case Ntf_EVENT_SHARED_FILE:
2016-04-22 09:47:25 +02:00
Brw_GetSummaryAndContentOfFile (SummaryStr,ContentStr,Cod,MaxChars,GetContent);
2014-12-01 23:55:08 +01:00
break;
case Ntf_EVENT_ASSIGNMENT:
Asg_GetNotifAssignment (SummaryStr,ContentStr,Cod,MaxChars,GetContent);
break;
case Ntf_EVENT_EXAM_ANNOUNCEMENT:
2015-12-29 02:09:50 +01:00
Exa_GetSummaryAndContentExamAnnouncement (SummaryStr,ContentStr,Cod,MaxChars,GetContent);
2014-12-01 23:55:08 +01:00
break;
case Ntf_EVENT_MARKS_FILE:
Mrk_GetNotifMyMarks (SummaryStr,ContentStr,Cod,UsrCod,MaxChars,GetContent);
break;
2015-09-17 20:41:31 +02:00
case Ntf_EVENT_ENROLLMENT_STUDENT:
case Ntf_EVENT_ENROLLMENT_TEACHER:
2014-12-12 18:50:36 +01:00
Enr_GetNotifEnrollment (SummaryStr,CrsCod,UsrCod,MaxChars);
2014-12-01 23:55:08 +01:00
break;
case Ntf_EVENT_ENROLLMENT_REQUEST:
2014-12-12 18:50:36 +01:00
Enr_GetNotifEnrollmentRequest (SummaryStr,ContentStr,Cod,MaxChars,GetContent);
2014-12-01 23:55:08 +01:00
break;
2016-01-23 19:11:07 +01:00
case Ntf_EVENT_TIMELINE_COMMENT:
case Ntf_EVENT_TIMELINE_FAV:
case Ntf_EVENT_TIMELINE_SHARE:
case Ntf_EVENT_TIMELINE_MENTION:
2016-01-23 01:38:55 +01:00
// Cod is the code of the social publishing
Soc_GetNotifSocialPublishing (SummaryStr,ContentStr,Cod,MaxChars,GetContent);
2016-01-22 01:47:28 +01:00
break;
2016-01-23 19:11:07 +01:00
case Ntf_EVENT_FOLLOWER:
2016-01-22 01:47:28 +01:00
Fol_GetNotifFollower (SummaryStr,ContentStr);
2014-12-01 23:55:08 +01:00
break;
case Ntf_EVENT_FORUM_POST_COURSE:
case Ntf_EVENT_FORUM_REPLY:
2015-12-28 19:22:56 +01:00
For_GetSummaryAndContentForumPst (SummaryStr,ContentStr,Cod,MaxChars,GetContent);
2014-12-01 23:55:08 +01:00
break;
2016-01-22 01:47:28 +01:00
case Ntf_EVENT_NOTICE:
Not_GetSummaryAndContentNotice (SummaryStr,ContentStr,Cod,MaxChars,GetContent);
break;
2014-12-01 23:55:08 +01:00
case Ntf_EVENT_MESSAGE:
Msg_GetNotifMessage (SummaryStr,ContentStr,Cod,MaxChars,GetContent);
if (Gbl.WebService.IsWebService)
/* Set the message as open by me, because I can read it in an extern application */
Msg_SetReceivedMsgAsOpen (Cod,UsrCod);
break;
case Ntf_EVENT_SURVEY:
Svy_GetNotifSurvey (SummaryStr,ContentStr,Cod,MaxChars,GetContent);
break;
}
}
/*****************************************************************************/
/********************** Set possible notification as seen ********************/
/*****************************************************************************/
2016-01-20 21:18:38 +01:00
void Ntf_MarkNotifAsSeen (Ntf_NotifyEvent_t NotifyEvent,long Cod,long CrsCod,long ToUsrCod)
2014-12-01 23:55:08 +01:00
{
2016-01-03 19:30:59 +01:00
char Query[256];
2014-12-01 23:55:08 +01:00
/***** Set notification as seen by me *****/
if (ToUsrCod > 0) // If the user code is specified
{
2016-01-20 21:18:38 +01:00
if (Cod > 0) // Set only one notification for the user as seen
2014-12-01 23:55:08 +01:00
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);
2016-01-20 21:18:38 +01:00
else if (CrsCod > 0) // Set all notifications of this type in the current course for the user as seen
2014-12-01 23:55:08 +01:00
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);
2016-01-20 21:18:38 +01:00
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);
2014-12-01 23:55:08 +01:00
DB_QueryUPDATE (Query,"can not set notification(s) as seen");
}
}
/*****************************************************************************/
/******************* Set possible notifications as removed *******************/
/*****************************************************************************/
2016-01-04 01:56:28 +01:00
void Ntf_MarkNotifAsRemoved (Ntf_NotifyEvent_t NotifyEvent,long Cod)
2014-12-01 23:55:08 +01:00
{
char Query[512];
/***** Set notification as removed *****/
sprintf (Query,"UPDATE notif SET Status=(Status | %u)"
" WHERE NotifyEvent='%u' AND Cod='%ld'",
(unsigned) Ntf_STATUS_BIT_REMOVED,
(unsigned) NotifyEvent,Cod);
DB_QueryUPDATE (Query,"can not set notification(s) as removed");
}
/*****************************************************************************/
/******************** Set possible notification as removed *******************/
/*****************************************************************************/
2016-01-04 01:56:28 +01:00
void Ntf_MarkNotifToOneUsrAsRemoved (Ntf_NotifyEvent_t NotifyEvent,long Cod,long ToUsrCod)
2014-12-01 23:55:08 +01:00
{
char Query[512];
/***** Set notification as removed *****/
if (Cod > 0) // Set only one notification as removed
sprintf (Query,"UPDATE notif SET Status=(Status | %u)"
" WHERE ToUsrCod='%ld' AND NotifyEvent='%u' AND Cod='%ld'",
(unsigned) Ntf_STATUS_BIT_REMOVED,
ToUsrCod,(unsigned) NotifyEvent,Cod);
else // Set all notifications of this type, in the current course for the user, as removed
sprintf (Query,"UPDATE notif SET Status=(Status | %u)"
" WHERE ToUsrCod='%ld' AND NotifyEvent='%u' AND CrsCod='%ld'",
(unsigned) Ntf_STATUS_BIT_REMOVED,
ToUsrCod,(unsigned) NotifyEvent,Gbl.CurrentCrs.Crs.CrsCod);
DB_QueryUPDATE (Query,"can not set notification(s) as removed");
}
/*****************************************************************************/
/*********** Set possible notifications from a course as removed *************/
/*****************************************************************************/
// This function should be called when a course is removed
// because notifications from this course will not be available after course removing.
// However, notifications about new messages should not be removed
// because the messages will remain available
2016-12-28 18:18:24 +01:00
void Ntf_MarkNotifInCrsAsRemoved (long ToUsrCod,long CrsCod)
2014-12-01 23:55:08 +01:00
{
2016-12-28 18:18:24 +01:00
char Query[256];
2014-12-01 23:55:08 +01:00
/***** Set all notifications from the course as removed,
except notifications about new messages *****/
if (ToUsrCod > 0) // If the user code is specified
sprintf (Query,"UPDATE notif SET Status=(Status | %u)"
2016-12-28 18:18:24 +01:00
" WHERE ToUsrCod='%ld'"
" AND CrsCod='%ld'"
" AND NotifyEvent<>'%u'", // messages will remain available
2014-12-01 23:55:08 +01:00
(unsigned) Ntf_STATUS_BIT_REMOVED,
2016-12-28 18:18:24 +01:00
ToUsrCod,
CrsCod,(unsigned) Ntf_EVENT_MESSAGE);
else // User code not specified ==> any user
2014-12-01 23:55:08 +01:00
sprintf (Query,"UPDATE notif SET Status=(Status | %u)"
2016-12-28 18:18:24 +01:00
" WHERE CrsCod='%ld'"
" AND NotifyEvent<>'%u'", // messages will remain available
2014-12-01 23:55:08 +01:00
(unsigned) Ntf_STATUS_BIT_REMOVED,
CrsCod,(unsigned) Ntf_EVENT_MESSAGE);
DB_QueryUPDATE (Query,"can not set notification(s) as removed");
}
/*****************************************************************************/
2016-01-04 01:56:28 +01:00
/*********** Mark possible notifications of one file as removed **************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2016-01-04 01:56:28 +01:00
void Ntf_MarkNotifOneFileAsRemoved (const char *Path)
2014-12-01 23:55:08 +01:00
{
2016-01-04 01:02:07 +01:00
extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER];
Brw_FileBrowser_t FileBrowser = Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type];
long FilCod;
2014-12-01 23:55:08 +01:00
Ntf_NotifyEvent_t NotifyEvent;
switch (FileBrowser)
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS:
case Brw_ADMI_DOCUM_GRP:
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS:
case Brw_ADMI_TEACH_GRP:
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS:
case Brw_ADMI_SHARE_GRP:
case Brw_ADMI_MARKS_CRS:
case Brw_ADMI_MARKS_GRP:
2016-01-04 01:02:07 +01:00
/***** Get file code *****/
FilCod = Brw_GetFilCodByPath (Path,false); // Any file, public or not
if (FilCod > 0)
{
/***** Set notification as removed *****/
switch (FileBrowser)
{
case Brw_ADMI_DOCUM_CRS:
case Brw_ADMI_DOCUM_GRP:
NotifyEvent = Ntf_EVENT_DOCUMENT_FILE;
break;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS:
case Brw_ADMI_TEACH_GRP:
NotifyEvent = Ntf_EVENT_TEACHERS_FILE;
break;
2016-01-04 01:02:07 +01:00
case Brw_ADMI_SHARE_CRS:
case Brw_ADMI_SHARE_GRP:
NotifyEvent = Ntf_EVENT_SHARED_FILE;
break;
case Brw_ADMI_MARKS_CRS:
case Brw_ADMI_MARKS_GRP:
NotifyEvent = Ntf_EVENT_MARKS_FILE;
break;
default:
2016-01-04 01:56:28 +01:00
return;
2016-01-04 01:02:07 +01:00
}
2016-01-04 01:56:28 +01:00
Ntf_MarkNotifAsRemoved (NotifyEvent,FilCod);
2016-01-04 01:02:07 +01:00
}
break;
2014-12-01 23:55:08 +01:00
default:
2016-01-04 01:02:07 +01:00
break;
2014-12-01 23:55:08 +01:00
}
2016-01-04 01:02:07 +01:00
}
/*****************************************************************************/
2016-01-04 01:56:28 +01:00
/*** Mark possible notifications involving children of a folder as removed ***/
2016-01-04 01:02:07 +01:00
/*****************************************************************************/
2016-01-04 01:56:28 +01:00
void Ntf_MarkNotifChildrenOfFolderAsRemoved (const char *Path)
2016-01-04 01:02:07 +01:00
{
extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER];
Brw_FileBrowser_t FileBrowser = Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type];
2016-01-04 01:56:28 +01:00
long Cod = Brw_GetCodForFiles ();
2014-12-01 23:55:08 +01:00
char Query[512];
Ntf_NotifyEvent_t NotifyEvent;
switch (FileBrowser)
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS:
case Brw_ADMI_DOCUM_GRP:
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS:
case Brw_ADMI_TEACH_GRP:
2015-01-26 12:39:48 +01:00
case Brw_ADMI_SHARE_CRS:
case Brw_ADMI_SHARE_GRP:
case Brw_ADMI_MARKS_CRS:
case Brw_ADMI_MARKS_GRP:
2016-01-04 01:56:28 +01:00
/***** Set notification as removed *****/
switch (FileBrowser)
{
case Brw_ADMI_DOCUM_CRS:
case Brw_ADMI_DOCUM_GRP:
NotifyEvent = Ntf_EVENT_DOCUMENT_FILE;
break;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS:
case Brw_ADMI_TEACH_GRP:
NotifyEvent = Ntf_EVENT_TEACHERS_FILE;
break;
2016-01-04 01:56:28 +01:00
case Brw_ADMI_SHARE_CRS:
case Brw_ADMI_SHARE_GRP:
NotifyEvent = Ntf_EVENT_SHARED_FILE;
break;
case Brw_ADMI_MARKS_CRS:
case Brw_ADMI_MARKS_GRP:
NotifyEvent = Ntf_EVENT_MARKS_FILE;
break;
default:
return;
}
sprintf (Query,"UPDATE notif SET Status=(Status | %u)"
" WHERE NotifyEvent='%u' AND Cod IN"
" (SELECT FilCod FROM files"
" WHERE FileBrowser='%u' AND Cod='%ld'"
" AND Path LIKE '%s/%%')",
(unsigned) Ntf_STATUS_BIT_REMOVED,
(unsigned) NotifyEvent,
(unsigned) FileBrowser,Cod,
Path);
DB_QueryUPDATE (Query,"can not set notification(s) as removed");
2014-12-01 23:55:08 +01:00
break;
default:
break;
}
}
/*****************************************************************************/
/******* Set all possible notifications of files in a group as removed *******/
/*****************************************************************************/
2016-01-04 01:56:28 +01:00
void Ntf_MarkNotifFilesInGroupAsRemoved (long GrpCod)
2014-12-01 23:55:08 +01:00
{
char Query[512];
/***** Set notifications as removed *****/
sprintf (Query,"UPDATE notif SET Status=(Status | %u)"
2016-04-22 09:47:25 +02:00
" WHERE NotifyEvent IN ('%u','%u','%u','%u') AND Cod IN"
2014-12-01 23:55:08 +01:00
" (SELECT FilCod FROM files"
2016-04-22 09:47:25 +02:00
" WHERE FileBrowser IN ('%u','%u','%u','%u') AND Cod='%ld')",
2014-12-01 23:55:08 +01:00
(unsigned) Ntf_STATUS_BIT_REMOVED,
(unsigned) Ntf_EVENT_DOCUMENT_FILE,
2016-04-22 09:47:25 +02:00
(unsigned) Ntf_EVENT_TEACHERS_FILE,
2014-12-01 23:55:08 +01:00
(unsigned) Ntf_EVENT_SHARED_FILE,
(unsigned) Ntf_EVENT_MARKS_FILE,
2015-01-26 12:39:48 +01:00
(unsigned) Brw_ADMI_DOCUM_GRP,
2016-04-22 09:47:25 +02:00
(unsigned) Brw_ADMI_TEACH_GRP,
2015-01-26 12:39:48 +01:00
(unsigned) Brw_ADMI_SHARE_GRP,
(unsigned) Brw_ADMI_MARKS_GRP,
2015-01-25 00:58:21 +01:00
GrpCod);
2014-12-01 23:55:08 +01:00
DB_QueryUPDATE (Query,"can not set notification(s) as removed");
}
/*****************************************************************************/
2016-01-22 12:42:43 +01:00
/********** Get a list with user's codes of all users to be notified *********/
/********** about an event, and notify them *********/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2016-11-16 23:19:52 +01:00
// Return the number of users notified by email
2014-12-01 23:55:08 +01:00
unsigned Ntf_StoreNotifyEventsToAllUsrs (Ntf_NotifyEvent_t NotifyEvent,long Cod)
{
2016-10-27 15:06:11 +02:00
extern const char *Sco_ScopeDB[Sco_NUM_SCOPES];
2014-12-01 23:55:08 +01:00
char Query[1024];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumRow;
unsigned long NumRows;
struct UsrData UsrDat;
unsigned NumUsrsToBeNotifiedByEMail = 0;
unsigned NotifyEventMask = (1 << NotifyEvent);
/***** Get users who want to be notified from database ******/
switch (NotifyEvent)
{
case Ntf_EVENT_UNKNOWN: // This function should not be called in this case
return 0;
case Ntf_EVENT_DOCUMENT_FILE:
2016-04-22 09:47:25 +02:00
case Ntf_EVENT_TEACHERS_FILE:
2014-12-01 23:55:08 +01:00
case Ntf_EVENT_SHARED_FILE:
case Ntf_EVENT_MARKS_FILE:
switch (Gbl.FileBrowser.Type)
{
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_CRS:
case Brw_ADMI_SHARE_CRS:
2016-04-22 09:47:25 +02:00
case Brw_ADMI_MARKS_CRS: // Notify all users in course except me
2014-12-01 23:55:08 +01:00
sprintf (Query,"SELECT UsrCod FROM crs_usr"
" WHERE CrsCod='%ld'"
" AND UsrCod<>'%ld'",
Gbl.CurrentCrs.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
break;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_CRS: // Notify all teachers in course except me
sprintf (Query,"SELECT UsrCod FROM crs_usr"
" WHERE CrsCod='%ld'"
" AND UsrCod<>'%ld'"
" AND Role='%u'", // Notify teachers only
Gbl.CurrentCrs.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod,
(unsigned) Rol_TEACHER);
break;
2015-01-26 12:39:48 +01:00
case Brw_ADMI_DOCUM_GRP:
case Brw_ADMI_SHARE_GRP:
2016-04-22 09:47:25 +02:00
case Brw_ADMI_MARKS_GRP: // Notify all users in group except me
2014-12-01 23:55:08 +01:00
sprintf (Query,"SELECT UsrCod FROM crs_grp_usr"
" WHERE crs_grp_usr.GrpCod='%ld'"
" AND crs_grp_usr.UsrCod<>'%ld'",
Gbl.CurrentCrs.Grps.GrpCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
break;
2016-04-22 09:47:25 +02:00
case Brw_ADMI_TEACH_GRP: // Notify all teachers in group except me
sprintf (Query,"SELECT crs_grp_usr.UsrCod"
" FROM crs_grp_usr,crs_grp,crs_usr"
" WHERE crs_grp_usr.GrpCod='%ld'"
" AND crs_grp_usr.UsrCod<>'%ld'"
" AND crs_grp_usr.GrpCod=crs_grp.GrpCod"
" AND crs_grp.CrsCod=crs_usr.CrsCod"
" AND crs_usr.Role='%u'", // Notify teachers only
Gbl.CurrentCrs.Grps.GrpCod,
Gbl.Usrs.Me.UsrDat.UsrCod,
(unsigned) Rol_TEACHER);
break;
2014-12-01 23:55:08 +01:00
default: // This function should not be called in other cases
return 0;
}
break;
case Ntf_EVENT_ASSIGNMENT:
// 1. If the assignment is available for the whole course ==> get all users enrolled in the course except me
// 2. If the assignment is available only for some groups ==> get all users who belong to any of the groups except me
// Cases 1 and 2 are mutually exclusive, so the union returns the case 1 or 2
sprintf (Query,"(SELECT crs_usr.UsrCod"
" FROM assignments,crs_usr"
" WHERE assignments.AsgCod='%ld'"
" AND assignments.AsgCod NOT IN"
" (SELECT AsgCod FROM asg_grp WHERE AsgCod='%ld')"
" AND assignments.CrsCod=crs_usr.CrsCod"
" AND crs_usr.UsrCod<>'%ld')"
" UNION "
"(SELECT DISTINCT crs_grp_usr.UsrCod"
" FROM asg_grp,crs_grp_usr"
" WHERE asg_grp.AsgCod='%ld'"
" AND asg_grp.GrpCod=crs_grp_usr.GrpCod"
" AND crs_grp_usr.UsrCod<>'%ld')",
Cod,Cod,Gbl.Usrs.Me.UsrDat.UsrCod,
Cod,Gbl.Usrs.Me.UsrDat.UsrCod);
break;
case Ntf_EVENT_EXAM_ANNOUNCEMENT:
case Ntf_EVENT_NOTICE:
sprintf (Query,"SELECT UsrCod FROM crs_usr"
" WHERE CrsCod='%ld' AND UsrCod<>'%ld'",
Gbl.CurrentCrs.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
break;
2015-09-17 20:41:31 +02:00
case Ntf_EVENT_ENROLLMENT_STUDENT: // This function should not be called in this case
case Ntf_EVENT_ENROLLMENT_TEACHER: // This function should not be called in this case
2014-12-01 23:55:08 +01:00
return 0;
case Ntf_EVENT_ENROLLMENT_REQUEST:
if (Gbl.CurrentCrs.Crs.NumTchs)
// If this course has teachers ==> send notification to teachers
sprintf (Query,"SELECT UsrCod FROM crs_usr"
2016-04-22 09:47:25 +02:00
" WHERE CrsCod='%ld'"
" AND UsrCod<>'%ld'"
2014-12-01 23:55:08 +01:00
" AND Role='%u'", // Notify teachers only
Gbl.CurrentCrs.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod,
2015-04-07 21:44:24 +02:00
(unsigned) Rol_TEACHER);
2014-12-01 23:55:08 +01:00
else // Course without teachers
// If this course has no teachers
// and I want to be a teacher (checked before calling this function
// to not send requests to be a student to admins)
// ==> send notification to administrators or superusers
2015-01-29 01:03:31 +01:00
sprintf (Query,"SELECT UsrCod FROM admin"
2016-10-27 22:16:03 +02:00
" WHERE (Scope='%s'"
" OR (Scope='%s' AND Cod='%ld')"
" OR (Scope='%s' AND Cod='%ld')"
" OR (Scope='%s' AND Cod='%ld'))"
2015-01-29 01:03:31 +01:00
" AND UsrCod<>'%ld'",
2016-10-27 22:16:03 +02:00
Sco_ScopeDB[Sco_SCOPE_SYS],
Sco_ScopeDB[Sco_SCOPE_INS],Gbl.CurrentIns.Ins.InsCod,
Sco_ScopeDB[Sco_SCOPE_CTR],Gbl.CurrentCtr.Ctr.CtrCod,
Sco_ScopeDB[Sco_SCOPE_DEG],Gbl.CurrentDeg.Deg.DegCod,
2014-12-01 23:55:08 +01:00
Gbl.Usrs.Me.UsrDat.UsrCod);
break;
2016-01-23 19:11:07 +01:00
case Ntf_EVENT_TIMELINE_COMMENT: // New comment to one of my social notes or comments
2016-01-23 01:38:55 +01:00
// Cod is the code of the social publishing
sprintf (Query,"SELECT DISTINCT(PublisherCod) FROM social_pubs"
" WHERE NotCod = (SELECT NotCod FROM social_pubs"
" WHERE PubCod='%ld')"
" AND PublisherCod<>'%ld'",
Cod,Gbl.Usrs.Me.UsrDat.UsrCod);
2016-01-22 01:47:28 +01:00
break;
2016-01-23 19:11:07 +01:00
case Ntf_EVENT_TIMELINE_FAV: // New favourite to one of my social notes or comments
case Ntf_EVENT_TIMELINE_SHARE: // New sharing of one of my social notes
case Ntf_EVENT_TIMELINE_MENTION:
case Ntf_EVENT_FOLLOWER:
2016-01-23 01:38:55 +01:00
// This function should not be called in these cases
2016-01-22 01:47:28 +01:00
return 0;
2014-12-01 23:55:08 +01:00
case Ntf_EVENT_FORUM_POST_COURSE:
// Check if forum is for users or for all users in the course
switch (For_GetForumTypeOfAPost (Cod))
{
case For_FORUM_COURSE_USRS:
sprintf (Query,"SELECT UsrCod FROM crs_usr"
" WHERE CrsCod='%ld' AND UsrCod<>'%ld'",
Gbl.CurrentCrs.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
break;
case For_FORUM_COURSE_TCHS:
sprintf (Query,"SELECT UsrCod FROM crs_usr"
" WHERE CrsCod='%ld' AND Role='%u' AND UsrCod<>'%ld'",
Gbl.CurrentCrs.Crs.CrsCod,
2015-04-07 21:44:24 +02:00
(unsigned) Rol_TEACHER,
2014-12-01 23:55:08 +01:00
Gbl.Usrs.Me.UsrDat.UsrCod);
break;
default:
return 0;
}
break;
case Ntf_EVENT_FORUM_REPLY:
sprintf (Query,"SELECT DISTINCT(UsrCod) FROM forum_post"
" WHERE ThrCod = (SELECT ThrCod FROM forum_post"
" WHERE PstCod='%ld')"
" AND UsrCod<>'%ld'",
Cod,Gbl.Usrs.Me.UsrDat.UsrCod);
break;
case Ntf_EVENT_MESSAGE: // This function should not be called in this case
return 0;
case Ntf_EVENT_SURVEY: // Only surveys for a course are notified, not surveys for a degree or global
// 1. If the survey is available for the whole course ==> get users enrolled in the course whose role is available in survey, except me
// 2. If the survey is available only for some groups ==> get users who belong to any of the groups and whose role is available in survey, except me
// Cases 1 and 2 are mutually exclusive, so the union returns the case 1 or 2
sprintf (Query,"(SELECT crs_usr.UsrCod"
" FROM surveys,crs_usr"
" WHERE surveys.SvyCod='%ld'"
" AND surveys.SvyCod NOT IN"
" (SELECT SvyCod FROM svy_grp WHERE SvyCod='%ld')"
2016-10-27 15:06:11 +02:00
" AND surveys.Scope='%s' AND surveys.Cod=crs_usr.CrsCod"
2014-12-01 23:55:08 +01:00
" AND crs_usr.UsrCod<>'%ld'"
" AND (surveys.Roles&(1<<crs_usr.Role))<>0)"
" UNION "
"(SELECT DISTINCT crs_grp_usr.UsrCod"
" FROM svy_grp,crs_grp_usr,surveys,crs_usr"
" WHERE svy_grp.SvyCod='%ld'"
" AND svy_grp.GrpCod=crs_grp_usr.GrpCod"
" AND crs_grp_usr.UsrCod=crs_usr.UsrCod"
" AND crs_grp_usr.UsrCod<>'%ld'"
" AND svy_grp.SvyCod=surveys.SvyCod"
2016-10-27 15:06:11 +02:00
" AND surveys.Scope='%s' AND surveys.Cod=crs_usr.CrsCod"
2014-12-01 23:55:08 +01:00
" AND (surveys.Roles&(1<<crs_usr.Role))<>0)",
2016-10-27 15:06:11 +02:00
Cod,
Cod,
Sco_ScopeDB[Sco_SCOPE_CRS],
Gbl.Usrs.Me.UsrDat.UsrCod,
Cod,
Gbl.Usrs.Me.UsrDat.UsrCod,
Sco_ScopeDB[Sco_SCOPE_CRS]);
2014-12-01 23:55:08 +01:00
break;
}
if ((NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get users to be notified"))) // Users found
{
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
/***** Notify the users one by one *****/
for (NumRow = 0;
NumRow < NumRows;
NumRow++)
{
/* Get next user */
row = mysql_fetch_row (mysql_res);
/* Get user code */
UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]);
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat)) // Get user's data from the database
if ((UsrDat.Prefs.NotifNtfEvents & NotifyEventMask)) // Create notification
{
if ((UsrDat.Prefs.EmailNtfEvents & NotifyEventMask)) // Send notification by email
{
Ntf_StoreNotifyEventToOneUser (NotifyEvent,&UsrDat,Cod,
(Ntf_Status_t) Ntf_STATUS_BIT_EMAIL);
NumUsrsToBeNotifiedByEMail++;
}
else // Don't send notification by email
Ntf_StoreNotifyEventToOneUser (NotifyEvent,&UsrDat,Cod,(Ntf_Status_t) 0);
}
}
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return NumUsrsToBeNotifiedByEMail;
}
/*****************************************************************************/
/************** Store a notify event to one user into database ***************/
/*****************************************************************************/
void Ntf_StoreNotifyEventToOneUser (Ntf_NotifyEvent_t NotifyEvent,
struct UsrData *UsrDat,
long Cod,Ntf_Status_t Status)
{
char Query[512];
long InsCod;
long CtrCod;
long DegCod;
long CrsCod;
// long GrpCod;
if (NotifyEvent == Ntf_EVENT_FORUM_POST_COURSE ||
NotifyEvent == Ntf_EVENT_FORUM_REPLY)
{
InsCod = Gbl.Forum.Ins.InsCod;
CtrCod = Gbl.Forum.Ctr.CtrCod;
DegCod = Gbl.Forum.Deg.DegCod;
CrsCod = Gbl.Forum.Crs.CrsCod;
// GrpCod = -1L; // There are no forums for a group
}
else
{
InsCod = Gbl.CurrentIns.Ins.InsCod;
CtrCod = Gbl.CurrentCtr.Ctr.CtrCod;
DegCod = Gbl.CurrentDeg.Deg.DegCod;
CrsCod = Gbl.CurrentCrs.Crs.CrsCod;
// GrpCod = Gbl.CurrentCrs.Grps.GrpCod;
}
/***** Store notify event *****/
sprintf (Query,"INSERT INTO notif (NotifyEvent,ToUsrCod,FromUsrCod,"
"InsCod,CtrCod,DegCod,CrsCod,"
"Cod,TimeNotif,Status)"
" VALUES ('%u','%ld','%ld',"
"'%ld','%ld','%ld','%ld',"
"'%ld',NOW(),'%u')",
(unsigned) NotifyEvent,UsrDat->UsrCod,Gbl.Usrs.Me.UsrDat.UsrCod,
InsCod,CtrCod,DegCod,CrsCod,
Cod,(unsigned) Status);
DB_QueryINSERT (Query,"can not create new notification event");
}
/*****************************************************************************/
/********* Reset my number of new received notifications to 0 ****************/
/*****************************************************************************/
static void Ntf_UpdateMyLastAccessToNotifications (void)
{
char Query[512];
/***** Reset to 0 my number of new received messages *****/
sprintf (Query,"UPDATE usr_last SET LastAccNotif=NOW()"
" WHERE UsrCod='%ld'",
Gbl.Usrs.Me.UsrDat.UsrCod);
DB_QueryUPDATE (Query,"can not update last access to notifications");
}
/*****************************************************************************/
2016-11-16 23:19:52 +01:00
/***************** Send all pending notifications by email *******************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
void Ntf_SendPendingNotifByEMailToAllUsrs (void)
{
char Query[512];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumRow,NumRows;
struct UsrData UsrDat;
unsigned NumNotif;
unsigned NumTotalNotif = 0;
unsigned NumMails;
unsigned NumTotalMails = 0;
/***** Get users who must be notified from database ******/
// (Status & Ntf_STATUS_BIT_EMAIL) && !(Status & Ntf_STATUS_BIT_SENT) && !(Status & (Ntf_STATUS_BIT_READ | Ntf_STATUS_BIT_REMOVED))
sprintf (Query,"SELECT DISTINCT ToUsrCod FROM notif"
2015-11-11 03:00:22 +01:00
" WHERE TimeNotif<FROM_UNIXTIME(UNIX_TIMESTAMP()-'%lu')"
2014-12-01 23:55:08 +01:00
" AND (Status & %u)<>0 AND (Status & %u)=0 AND (Status & %u)=0",
Cfg_TIME_TO_SEND_PENDING_NOTIF,
(unsigned) Ntf_STATUS_BIT_EMAIL,
(unsigned) Ntf_STATUS_BIT_SENT,
(unsigned) (Ntf_STATUS_BIT_READ | Ntf_STATUS_BIT_REMOVED));
if ((NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get users who must be notified"))) // Events found
{
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
/***** Notify the users one by one *****/
for (NumRow = 0;
NumRow < NumRows;
NumRow++)
{
/* Get next user */
row = mysql_fetch_row (mysql_res);
/* Get user code */
UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]);
/* Get user's data */
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat)) // Get user's data from the database
{
/* Send one email to this user */
Ntf_SendPendingNotifByEMailToOneUsr (&UsrDat,&NumNotif,&NumMails);
NumTotalNotif += NumNotif;
NumTotalMails += NumMails;
}
}
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
/***** Delete old notifications ******/
sprintf (Query,"DELETE LOW_PRIORITY FROM notif"
2015-11-11 03:00:22 +01:00
" WHERE TimeNotif<FROM_UNIXTIME(UNIX_TIMESTAMP()-'%lu')",
2014-12-01 23:55:08 +01:00
Cfg_TIME_TO_DELETE_OLD_NOTIF);
DB_QueryDELETE (Query,"can not remove old notifications");
}
/*****************************************************************************/
2016-11-16 23:19:52 +01:00
/************ Send pending notifications of one user by email ****************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
static void Ntf_SendPendingNotifByEMailToOneUsr (struct UsrData *ToUsrDat,unsigned *NumNotif,unsigned *NumMails)
{
2015-12-07 23:13:08 +01:00
extern const char *Txt_NOTIFY_EVENTS_There_is_a_new_event_NO_HTML[1+Txt_NUM_LANGUAGES];
extern const char *Txt_NOTIFY_EVENTS_There_are_X_new_events_NO_HTML[1+Txt_NUM_LANGUAGES];
extern const char *Txt_NOTIFY_EVENTS_SINGULAR_NO_HTML[Ntf_NUM_NOTIFY_EVENTS][1+Txt_NUM_LANGUAGES];
extern const char *Txt_Course_NO_HTML[1+Txt_NUM_LANGUAGES];
extern const char *Txt_Forum_NO_HTML[1+Txt_NUM_LANGUAGES];
extern const char *Txt_MSG_From_NO_HTML[1+Txt_NUM_LANGUAGES];
extern const char *Txt_Go_to_NO_HTML[1+Txt_NUM_LANGUAGES];
extern const char *Txt_TAB_Messages_NO_HTML[1+Txt_NUM_LANGUAGES];
extern const char *Txt_Notifications_NO_HTML[1+Txt_NUM_LANGUAGES];
extern const char *Txt_If_you_no_longer_wish_to_receive_email_notifications_NO_HTML[1+Txt_NUM_LANGUAGES];
2014-12-01 23:55:08 +01:00
char Query[512];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
2015-12-07 23:13:08 +01:00
unsigned long NumRow;
unsigned long NumRows;
Txt_Language_t ToUsrLanguage;
2014-12-01 23:55:08 +01:00
struct UsrData FromUsrDat;
Ntf_NotifyEvent_t NotifyEvent = (Ntf_NotifyEvent_t) 0; // Initialized to avoid warning
2016-10-28 10:03:37 +02:00
struct Instit Ins;
2014-12-01 23:55:08 +01:00
struct Centre Ctr;
struct Degree Deg;
struct Course Crs;
long Cod;
For_ForumType_t ForumType = (For_ForumType_t) 0; // Initialized to avoid warning
char ForumName[512];
2016-11-16 23:19:52 +01:00
char Command[2048]; // Command to execute for sending an email
2014-12-01 23:55:08 +01:00
int ReturnCode;
/***** Return 0 notifications and 0 mails when error *****/
*NumNotif = *NumMails = 0;
2016-10-12 14:02:56 +02:00
if (Mai_CheckIfUsrCanReceiveEmailNotif (ToUsrDat))
2014-12-01 23:55:08 +01:00
{
/***** Get pending notifications of this user from database ******/
2015-10-27 00:36:23 +01:00
sprintf (Query,"SELECT NotifyEvent,FromUsrCod,InsCod,CtrCod,DegCod,CrsCod,Cod"
2014-12-01 23:55:08 +01:00
" FROM notif WHERE ToUsrCod='%ld'"
" AND (Status & %u)<>0 AND (Status & %u)=0 AND (Status & %u)=0"
" ORDER BY TimeNotif,NotifyEvent",
ToUsrDat->UsrCod,
(unsigned) Ntf_STATUS_BIT_EMAIL,(unsigned) Ntf_STATUS_BIT_SENT,(unsigned) (Ntf_STATUS_BIT_READ | Ntf_STATUS_BIT_REMOVED));
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get pending notifications of a user");
if (NumRows) // Events found
{
2015-12-07 23:13:08 +01:00
/***** If user has no language, set it to current language *****/
ToUsrLanguage = ToUsrDat->Prefs.Language;
if (ToUsrLanguage == Txt_LANGUAGE_UNKNOWN)
ToUsrLanguage = Gbl.Prefs.Language;
2014-12-01 23:55:08 +01:00
/***** Create temporary file for mail content *****/
Mai_CreateFileNameMail ();
/***** Welcome note *****/
Mai_WriteWelcomeNoteEMail (ToUsrDat);
if (NumRows == 1)
2015-12-07 23:13:08 +01:00
fprintf (Gbl.Msg.FileMail,Txt_NOTIFY_EVENTS_There_is_a_new_event_NO_HTML[ToUsrLanguage],
2014-12-01 23:55:08 +01:00
Cfg_PLATFORM_SHORT_NAME);
else
2015-12-07 23:13:08 +01:00
fprintf (Gbl.Msg.FileMail,Txt_NOTIFY_EVENTS_There_are_X_new_events_NO_HTML[ToUsrLanguage],
2014-12-01 23:55:08 +01:00
(unsigned) NumRows,Cfg_PLATFORM_SHORT_NAME);
fprintf (Gbl.Msg.FileMail,": \n");
/***** Initialize structure with origin user's data *****/
Usr_UsrDataConstructor (&FromUsrDat);
/***** Inform about the events one by one *****/
for (NumRow = 0;
NumRow < NumRows;
NumRow++)
{
/* Get next event */
row = mysql_fetch_row (mysql_res);
/* Get event type (row[0]) */
NotifyEvent = Ntf_GetNotifyEventFromDB ((const char *) row[0]);
/* Get origin user code (row[1]) */
FromUsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[1]);
Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&FromUsrDat); // Get origin user's data from the database
/* Get institution code (row[2]) */
Ins.InsCod = Str_ConvertStrCodToLongCod (row[2]);
2015-12-09 19:51:17 +01:00
Ins_GetDataOfInstitutionByCod (&Ins,Ins_GET_BASIC_DATA);
2014-12-01 23:55:08 +01:00
/* Get centre code (row[3]) */
Ctr.CtrCod = Str_ConvertStrCodToLongCod (row[3]);
Ctr_GetDataOfCentreByCod (&Ctr);
/* Get degree code (row[4]) */
Deg.DegCod = Str_ConvertStrCodToLongCod (row[4]);
Deg_GetDataOfDegreeByCod (&Deg);
/* Get course code (row[5]) */
Crs.CrsCod = Str_ConvertStrCodToLongCod (row[5]);
Crs_GetDataOfCourseByCod (&Crs);
/* Get message/post/... code (row[6]) */
Cod = Str_ConvertStrCodToLongCod (row[6]);
/* Get forum type */
if (NotifyEvent == Ntf_EVENT_FORUM_POST_COURSE ||
2016-10-12 14:02:56 +02:00
NotifyEvent == Ntf_EVENT_FORUM_REPLY)
2014-12-01 23:55:08 +01:00
ForumType = For_GetForumTypeOfAPost (Cod);
/* Information about the type of this event */
2015-12-07 23:13:08 +01:00
fprintf (Gbl.Msg.FileMail,Txt_NOTIFY_EVENTS_SINGULAR_NO_HTML[NotifyEvent][ToUsrLanguage],
2014-12-01 23:55:08 +01:00
Cfg_PLATFORM_SHORT_NAME);
fprintf (Gbl.Msg.FileMail,"\n");
/* Course/forum: */
switch (NotifyEvent)
{
case Ntf_EVENT_UNKNOWN:
2016-01-23 19:11:07 +01:00
case Ntf_EVENT_TIMELINE_COMMENT:
case Ntf_EVENT_TIMELINE_FAV:
case Ntf_EVENT_TIMELINE_SHARE:
case Ntf_EVENT_TIMELINE_MENTION:
case Ntf_EVENT_FOLLOWER:
2014-12-01 23:55:08 +01:00
break;
case Ntf_EVENT_DOCUMENT_FILE:
2016-04-22 09:47:25 +02:00
case Ntf_EVENT_TEACHERS_FILE:
2014-12-01 23:55:08 +01:00
case Ntf_EVENT_SHARED_FILE:
case Ntf_EVENT_ASSIGNMENT:
case Ntf_EVENT_EXAM_ANNOUNCEMENT:
case Ntf_EVENT_MARKS_FILE:
2015-09-17 20:41:31 +02:00
case Ntf_EVENT_ENROLLMENT_STUDENT:
case Ntf_EVENT_ENROLLMENT_TEACHER:
2014-12-01 23:55:08 +01:00
case Ntf_EVENT_ENROLLMENT_REQUEST:
case Ntf_EVENT_NOTICE:
case Ntf_EVENT_MESSAGE:
case Ntf_EVENT_SURVEY:
if (Crs.CrsCod > 0)
fprintf (Gbl.Msg.FileMail,"%s: %s\n",
2015-12-07 23:13:08 +01:00
Txt_Course_NO_HTML[ToUsrLanguage],
2014-12-01 23:55:08 +01:00
Crs.FullName);
break;
case Ntf_EVENT_FORUM_POST_COURSE:
case Ntf_EVENT_FORUM_REPLY:
For_SetForumName (ForumType,
&Ins,
&Ctr,
&Deg,
&Crs,
2015-12-07 23:13:08 +01:00
ForumName,ToUsrLanguage,false); // Set forum name in recipient's language
2014-12-01 23:55:08 +01:00
fprintf (Gbl.Msg.FileMail,"%s: %s\n",
2015-12-07 23:13:08 +01:00
Txt_Forum_NO_HTML[ToUsrLanguage],
2014-12-01 23:55:08 +01:00
ForumName);
break;
}
/* From: */
fprintf (Gbl.Msg.FileMail,"%s: %s\n",
2015-12-07 23:13:08 +01:00
Txt_MSG_From_NO_HTML[ToUsrLanguage],
2014-12-01 23:55:08 +01:00
FromUsrDat.FullName);
}
/***** Free memory used for origin user's data *****/
Usr_UsrDataDestructor (&FromUsrDat);
/* Go to: */
fprintf (Gbl.Msg.FileMail,"%s: %s/ > %s > %s\n",
2015-12-07 23:13:08 +01:00
Txt_Go_to_NO_HTML[ToUsrLanguage],
2016-07-08 12:43:48 +02:00
Cfg_URL_SWAD_CGI,
2015-12-07 23:13:08 +01:00
Txt_TAB_Messages_NO_HTML[ToUsrLanguage],
Txt_Notifications_NO_HTML[ToUsrLanguage]);
2014-12-01 23:55:08 +01:00
/* Disclaimer */
fprintf (Gbl.Msg.FileMail,"\n%s\n",
2015-12-07 23:13:08 +01:00
Txt_If_you_no_longer_wish_to_receive_email_notifications_NO_HTML[ToUsrLanguage]);
2014-12-01 23:55:08 +01:00
/* Footer note */
2015-12-07 23:13:08 +01:00
Mai_WriteFootNoteEMail (ToUsrLanguage);
2014-12-01 23:55:08 +01:00
fclose (Gbl.Msg.FileMail);
2016-11-16 23:19:52 +01:00
/***** Call the command to send an email *****/
2014-12-01 23:55:08 +01:00
sprintf (Command,"%s \"%s\" \"%s\" \"%s\" \"%s\" \"%s\" \"[%s] %s\" \"%s\"",
2016-11-16 23:19:52 +01:00
Cfg_COMMAND_SEND_AUTOMATIC_EMAIL,
2014-12-01 23:55:08 +01:00
Cfg_AUTOMATIC_EMAIL_SMTP_SERVER,
Cfg_AUTOMATIC_EMAIL_SMTP_PORT,
Cfg_AUTOMATIC_EMAIL_FROM,
2016-10-12 14:02:56 +02:00
Gbl.Config.SMTPPassword,
2014-12-01 23:55:08 +01:00
ToUsrDat->Email,
2015-12-07 23:13:08 +01:00
Cfg_PLATFORM_SHORT_NAME,
Txt_Notifications_NO_HTML[ToUsrLanguage],
2014-12-01 23:55:08 +01:00
Gbl.Msg.FileNameMail);
ReturnCode = system (Command);
if (ReturnCode == -1)
2016-11-16 23:19:52 +01:00
Lay_ShowErrorAndExit ("Error when running script to send email.");
2014-12-01 23:55:08 +01:00
/***** Remove temporary file *****/
unlink (Gbl.Msg.FileNameMail);
/***** Update number of notifications, number of mails and statistics *****/
ReturnCode = WEXITSTATUS(ReturnCode);
if (ReturnCode == 0) // Message sent successfully
{
*NumNotif = (unsigned) NumRows;
*NumMails = 1;
/* Update statistics about notifications */
Ntf_UpdateNumNotifSent (Deg.DegCod,Crs.CrsCod,NotifyEvent,*NumNotif,*NumMails);
}
/***** Mark all the pending notifications of this user as 'sent' *****/
sprintf (Query,"UPDATE notif SET Status=(Status | %u)"
2016-10-12 14:02:56 +02:00
" WHERE ToUsrCod='%ld'"
2014-12-01 23:55:08 +01:00
" AND (Status & %u)<>0 AND (Status & %u)=0 AND (Status & %u)=0",
(unsigned) Ntf_STATUS_BIT_SENT,ToUsrDat->UsrCod,
(unsigned) Ntf_STATUS_BIT_EMAIL,
(unsigned) Ntf_STATUS_BIT_SENT,
(unsigned) (Ntf_STATUS_BIT_READ | Ntf_STATUS_BIT_REMOVED));
DB_QueryUPDATE (Query,"can not set pending notifications of a user as sent");
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
}
}
/*****************************************************************************/
/****** Get notify event type from string number coming from database ********/
/*****************************************************************************/
Ntf_NotifyEvent_t Ntf_GetNotifyEventFromDB (const char *Str)
{
unsigned UnsignedNum;
if (sscanf (Str,"%u",&UnsignedNum) == 1)
if (UnsignedNum < Ntf_NUM_NOTIFY_EVENTS)
return (Ntf_NotifyEvent_t) UnsignedNum;
return Ntf_EVENT_UNKNOWN;
}
/*****************************************************************************/
2016-11-16 23:19:52 +01:00
/******** Show an alert with the number of users notified by email ***********/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
void Ntf_ShowAlertNumUsrsToBeNotifiedByEMail (unsigned NumUsrsToBeNotifiedByEMail)
{
2016-11-16 23:19:52 +01:00
extern const char *Txt_No_of_users_who_will_be_notified_by_email;
2014-12-01 23:55:08 +01:00
sprintf (Gbl.Message,"%s: %u",
2016-11-16 23:19:52 +01:00
Txt_No_of_users_who_will_be_notified_by_email,NumUsrsToBeNotifiedByEMail);
2014-12-01 23:55:08 +01:00
Lay_ShowAlert (Lay_INFO,Gbl.Message);
}
/*****************************************************************************/
2016-11-16 23:19:52 +01:00
/************* Get number of events notified and emails sent *****************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
static void Ntf_GetNumNotifSent (long DegCod,long CrsCod,
Ntf_NotifyEvent_t NotifyEvent,
unsigned *NumEvents,unsigned *NumMails)
{
char Query[512];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumRows;
2016-11-16 23:19:52 +01:00
/***** Get number of notifications sent by email from database *****/
2014-12-01 23:55:08 +01:00
sprintf (Query,"SELECT NumEvents,NumMails FROM sta_notif"
" WHERE DegCod='%ld' AND CrsCod='%ld' AND NotifyEvent='%u'",
DegCod,CrsCod,(unsigned) NotifyEvent);
2016-11-16 23:19:52 +01:00
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get number of notifications sent by email");
2014-12-01 23:55:08 +01:00
/***** Get number of rows *****/
if (NumRows)
{
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%u",NumEvents) != 1)
2016-11-16 23:19:52 +01:00
Lay_ShowErrorAndExit ("Error when getting number of notifications sent by email.");
2014-12-01 23:55:08 +01:00
if (sscanf (row[1],"%u",NumMails) != 1)
2016-11-16 23:19:52 +01:00
Lay_ShowErrorAndExit ("Error when getting number of notifications sent by email.");
2014-12-01 23:55:08 +01:00
}
else
*NumEvents = *NumMails = 0;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
}
/*****************************************************************************/
2016-11-16 23:19:52 +01:00
/******************** Update number of notify emails sent ********************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
static void Ntf_UpdateNumNotifSent (long DegCod,long CrsCod,
Ntf_NotifyEvent_t NotifyEvent,
unsigned NumEvents,unsigned NumMails)
{
char Query[512];
unsigned CurrentNumEvents;
unsigned CurrentNumMails;
/***** Get number of events notified and number of mails sent *****/
Ntf_GetNumNotifSent (DegCod,CrsCod,NotifyEvent,&CurrentNumEvents,&CurrentNumMails);
/***** Update number of users notified *****/
sprintf (Query,"REPLACE INTO sta_notif (DegCod,CrsCod,NotifyEvent,NumEvents,NumMails)"
" VALUES ('%ld','%ld','%u','%u','%u')",
DegCod,CrsCod,(unsigned) NotifyEvent,
CurrentNumEvents + NumEvents,
CurrentNumMails + NumMails);
DB_QueryREPLACE (Query,"can not update the number of sent notifications");
}
/*****************************************************************************/
/******************** Mark all my notifications as seen **********************/
/*****************************************************************************/
void Ntf_MarkAllNotifAsSeen (void)
{
char Query[256];
/***** Set all my notifications as seen *****/
sprintf (Query,"UPDATE notif SET Status=(Status | %u)"
" WHERE ToUsrCod='%ld'",
(unsigned) Ntf_STATUS_BIT_READ,
Gbl.Usrs.Me.UsrDat.UsrCod);
DB_QueryUPDATE (Query,"can not set notification(s) as seen");
/***** Show my notifications again *****/
Ntf_ShowMyNotifications ();
}
/*****************************************************************************/
2016-11-16 23:19:52 +01:00
/*** Activate the sending of email to notify me that I have new messages *****/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
void Ntf_PutFormChangeNotifSentByEMail (void)
{
2016-11-13 01:21:35 +01:00
extern const char *Hlp_PROFILE_Preferences_notifications;
2015-07-28 00:16:09 +02:00
extern const char *The_ClassForm[The_NUM_THEMES];
2015-01-01 19:39:46 +01:00
extern const char *Txt_Save_changes;
2014-12-01 23:55:08 +01:00
extern const char *Txt_Notifications;
extern const char *Txt_Create_BR_notification;
2016-11-16 23:19:52 +01:00
extern const char *Txt_Notify_me_BR_by_email;
2014-12-01 23:55:08 +01:00
extern const char *Txt_NOTIFY_EVENTS_PLURAL[Ntf_NUM_NOTIFY_EVENTS];
Ntf_NotifyEvent_t NotifyEvent;
2016-11-07 14:12:15 +01:00
/***** Start frame *****/
2016-11-13 01:21:35 +01:00
Lay_StartRoundFrame (NULL,Txt_Notifications,
Ntf_PutIconsNotif,
Hlp_PROFILE_Preferences_notifications);
2016-11-07 14:12:15 +01:00
2014-12-01 23:55:08 +01:00
/***** Start form *****/
Act_FormStart (ActChgNtfPrf);
2015-04-11 23:46:21 +02:00
2016-11-16 23:19:52 +01:00
/***** Warning if I can not receive email notifications *****/
2016-10-12 14:02:56 +02:00
if (!Mai_CheckIfUsrCanReceiveEmailNotif (&Gbl.Usrs.Me.UsrDat))
Mai_WriteWarningEmailNotifications ();
/***** List of notifications *****/
fprintf (Gbl.F.Out,"<table class=\"CELLS_PAD_2\" style=\"margin:0 auto;\">"
"<tr>"
2014-12-01 23:55:08 +01:00
"<th></th>"
2015-09-06 20:02:14 +02:00
"<th class=\"CENTER_MIDDLE\">"
2014-12-27 00:28:19 +01:00
"%s"
"</th>"
2015-09-06 20:02:14 +02:00
"<th class=\"CENTER_MIDDLE\">"
2014-12-27 00:28:19 +01:00
"%s"
"</th>"
2014-12-01 23:55:08 +01:00
"</tr>",
Txt_Create_BR_notification,
2016-11-16 23:19:52 +01:00
Txt_Notify_me_BR_by_email);
2014-12-01 23:55:08 +01:00
2016-12-24 14:33:27 +01:00
/***** Checkbox to activate internal notifications and email notifications
about events *****/
2014-12-01 23:55:08 +01:00
for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
NotifyEvent++) // O is reserved for Ntf_EVENT_UNKNOWN
{
fprintf (Gbl.F.Out,"<tr>"
2015-07-28 00:16:09 +02:00
"<td class=\"%s RIGHT_MIDDLE\">"
2014-12-23 22:47:09 +01:00
"%s:"
"</td>"
2015-08-24 11:25:20 +02:00
"<td class=\"CENTER_MIDDLE\">"
2014-12-01 23:55:08 +01:00
"<input type=\"checkbox\" name=\"%s\" value=\"Y\"",
2015-07-28 00:16:09 +02:00
The_ClassForm[Gbl.Prefs.Theme],
2014-12-01 23:55:08 +01:00
Txt_NOTIFY_EVENTS_PLURAL[NotifyEvent],
Ntf_ParamNotifMeAboutNotifyEvents[NotifyEvent]);
if ((Gbl.Usrs.Me.UsrDat.Prefs.NotifNtfEvents & (1 << NotifyEvent)))
fprintf (Gbl.F.Out," checked=\"checked\"");
2014-12-23 22:47:09 +01:00
fprintf (Gbl.F.Out," />"
"</td>"
2015-08-24 11:25:20 +02:00
"<td class=\"CENTER_MIDDLE\">"
2014-12-01 23:55:08 +01:00
"<input type=\"checkbox\" name=\"%s\" value=\"Y\"",
Ntf_ParamEmailMeAboutNotifyEvents[NotifyEvent]);
if ((Gbl.Usrs.Me.UsrDat.Prefs.EmailNtfEvents & (1 << NotifyEvent)))
fprintf (Gbl.F.Out," checked=\"checked\"");
2014-12-23 22:47:09 +01:00
fprintf (Gbl.F.Out," />"
"</td>"
2014-12-01 23:55:08 +01:00
"</tr>");
}
2016-10-12 14:02:56 +02:00
fprintf (Gbl.F.Out,"</table>");
2016-11-07 14:12:15 +01:00
/***** Button to save changes *****/
Lay_PutConfirmButton (Txt_Save_changes);
2015-04-11 23:46:21 +02:00
2014-12-01 23:55:08 +01:00
/***** End form *****/
2015-03-13 00:16:02 +01:00
Act_FormEnd ();
2016-11-07 14:12:15 +01:00
/***** End frame *****/
Lay_EndRoundFrame ();
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2016-11-16 23:19:52 +01:00
/** Get parameter with the sending of email to notify me that I have msgs. ***/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
static void Ntf_GetParamsNotifyEvents (void)
{
Ntf_NotifyEvent_t NotifyEvent;
char YN[1+1];
bool CreateNotifForThisEvent;
Gbl.Usrs.Me.UsrDat.Prefs.NotifNtfEvents = 0;
Gbl.Usrs.Me.UsrDat.Prefs.EmailNtfEvents = 0;
for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
{
Par_GetParToText (Ntf_ParamNotifMeAboutNotifyEvents[NotifyEvent],YN,1);
if ((CreateNotifForThisEvent = (Str_ConvertToUpperLetter (YN[0]) == 'Y')))
Gbl.Usrs.Me.UsrDat.Prefs.NotifNtfEvents |= (1 << NotifyEvent);
if (CreateNotifForThisEvent)
{
Par_GetParToText (Ntf_ParamEmailMeAboutNotifyEvents[NotifyEvent],YN,1);
if (Str_ConvertToUpperLetter (YN[0]) == 'Y')
Gbl.Usrs.Me.UsrDat.Prefs.EmailNtfEvents |= (1 << NotifyEvent);
}
}
}
/*****************************************************************************/
2016-11-16 23:19:52 +01:00
/***** Change my preference about sending me notify emails about events ******/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
void Ntf_ChangeNotifyEvents (void)
{
extern const char *Txt_Your_preferences_about_notifications_have_changed;
char Query[512];
/***** Get param with whether notify me about events *****/
Ntf_GetParamsNotifyEvents ();
/***** Store preferences about notify events *****/
sprintf (Query,"UPDATE usr_data"
" SET NotifNtfEvents='%u',EmailNtfEvents='%u'"
" WHERE UsrCod='%ld'",
Gbl.Usrs.Me.UsrDat.Prefs.NotifNtfEvents,
Gbl.Usrs.Me.UsrDat.Prefs.EmailNtfEvents,
Gbl.Usrs.Me.UsrDat.UsrCod);
DB_QueryUPDATE (Query,"can not update user's preferences");
/***** Show message *****/
Lay_ShowAlert (Lay_SUCCESS,Txt_Your_preferences_about_notifications_have_changed);
}
/*****************************************************************************/
/************************ Write number of notifications **********************/
/*****************************************************************************/
void Ntf_WriteNumberOfNewNtfs (void)
{
extern const char *The_ClassNotif[The_NUM_THEMES];
extern const char *Txt_See_notifications;
extern const char *Txt_notification;
extern const char *Txt_notifications;
2015-07-22 13:32:56 +02:00
extern const char *Txt_Notifications;
2014-12-01 23:55:08 +01:00
extern const char *Txt_NOTIF_new_SINGULAR;
extern const char *Txt_NOTIF_new_PLURAL;
unsigned NumUnseenNtfs;
unsigned NumNewNtfs = 0;
/***** Get my number of unseen notifications *****/
2015-11-27 14:54:46 +01:00
if ((NumUnseenNtfs = Ntf_GetNumberOfAllMyUnseenNtfs ()))
2014-12-01 23:55:08 +01:00
NumNewNtfs = Ntf_GetNumberOfMyNewUnseenNtfs ();
2015-04-11 17:33:14 +02:00
/***** Start form *****/
2014-12-01 23:55:08 +01:00
Act_FormStartId (ActSeeNewNtf,"form_ntf");
Act_LinkFormSubmitId (Txt_See_notifications,
2016-07-01 17:13:41 +02:00
The_ClassNotif[Gbl.Prefs.Theme],"form_ntf",NULL);
2014-12-01 23:55:08 +01:00
/***** Number of unseen notifications *****/
2015-11-27 14:54:46 +01:00
fprintf (Gbl.F.Out,"<span id=\"notif_all\">%u&nbsp;%s<br /></span>",
NumUnseenNtfs,
NumUnseenNtfs == 1 ? Txt_notification :
Txt_notifications);
2014-12-01 23:55:08 +01:00
2015-11-27 14:54:46 +01:00
/***** Icon and number of new notifications *****/
2014-12-01 23:55:08 +01:00
if (NumNewNtfs)
2015-11-27 14:54:46 +01:00
fprintf (Gbl.F.Out,"<img src=\"%s/bell16x16.png\""
" alt=\"%s\" title=\"%s\""
2016-11-14 10:05:41 +01:00
" class=\"ICO20x20\" />"
2015-11-27 14:54:46 +01:00
"&nbsp;%u<span id=\"notif_new\">&nbsp;%s</span>",
Gbl.Prefs.PathTheme,
Txt_Notifications,
Txt_Notifications,
NumNewNtfs,
NumNewNtfs == 1 ? Txt_NOTIF_new_SINGULAR :
Txt_NOTIF_new_PLURAL);
2014-12-01 23:55:08 +01:00
2015-04-11 17:33:14 +02:00
/***** End form *****/
2015-03-13 00:16:02 +01:00
fprintf (Gbl.F.Out,"</a>");
Act_FormEnd ();
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/************* Get the number of (all) my unseen notifications ***************/
/*****************************************************************************/
static unsigned Ntf_GetNumberOfAllMyUnseenNtfs (void)
{
char Query[512];
/***** Get number of places with a name from database *****/
sprintf (Query,"SELECT COUNT(*) FROM notif"
" WHERE ToUsrCod='%ld' AND (Status & %u)=0",
Gbl.Usrs.Me.UsrDat.UsrCod,(unsigned) (Ntf_STATUS_BIT_READ | Ntf_STATUS_BIT_REMOVED));
return DB_QueryCOUNT (Query,"can not get number of unseen notifications");
}
/*****************************************************************************/
/************** Get the number of my new unseen notifications ****************/
/*****************************************************************************/
static unsigned Ntf_GetNumberOfMyNewUnseenNtfs (void)
{
char Query[256];
/***** Get number of places with a name from database *****/
sprintf (Query,"SELECT COUNT(*) FROM notif"
" WHERE ToUsrCod='%ld' AND (Status & %u)=0"
2015-11-11 03:00:22 +01:00
" AND TimeNotif>FROM_UNIXTIME('%ld')",
2014-12-01 23:55:08 +01:00
Gbl.Usrs.Me.UsrDat.UsrCod,
(unsigned) (Ntf_STATUS_BIT_READ | Ntf_STATUS_BIT_REMOVED),
Gbl.Usrs.Me.UsrLast.LastAccNotif);
return DB_QueryCOUNT (Query,"can not get number of unseen notifications");
}
/*****************************************************************************/
/**************** Remove all notifications made to a user ********************/
/*****************************************************************************/
void Ntf_RemoveUsrNtfs (long ToUsrCod)
{
char Query[256];
/***** Delete notifications of a user ******/
sprintf (Query,"DELETE LOW_PRIORITY FROM notif"
" WHERE ToUsrCod='%ld'",
ToUsrCod);
DB_QueryDELETE (Query,"can not remove notifications of a user");
}