swad-core/swad_announcement.c

630 lines
23 KiB
C
Raw Normal View History

2014-12-01 23:55:08 +01:00
// swad_announcement.c: Global announcement
/*
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 3 License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/*********************************** Headers *********************************/
/*****************************************************************************/
2015-11-01 20:21:59 +01:00
#include "swad_announcement.h"
2017-06-10 21:38:10 +02:00
#include "swad_box.h"
2014-12-01 23:55:08 +01:00
#include "swad_database.h"
#include "swad_global.h"
#include "swad_parameter.h"
2016-12-13 13:32:19 +01:00
#include "swad_role.h"
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Internal constants ****************************/
/*****************************************************************************/
/*****************************************************************************/
/****************************** Internal types *******************************/
/*****************************************************************************/
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/************************* Internal global variables *************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Internal prototypes ***************************/
/*****************************************************************************/
2016-03-21 17:03:12 +01:00
static void Ann_PutIconToAddNewAnnouncement (void);
static void Ann_PutButtonToAddNewAnnouncement (void);
2015-11-01 20:21:59 +01:00
static void Ann_DrawAnAnnouncement (long AnnCod,Ann_Status_t Status,
const char *Subject,const char *Content,
2015-11-02 18:55:24 +01:00
unsigned Roles,
bool ShowAllAnnouncements,
2016-03-21 17:03:12 +01:00
bool ICanEdit);
2016-12-11 20:16:15 +01:00
static void Ann_PutParams (void);
2014-12-01 23:55:08 +01:00
static long Ann_GetParamAnnCod (void);
2016-12-26 18:26:40 +01:00
static void Ann_PutSubjectMessage (const char *Field,const char *Label,
unsigned Rows);
2014-12-01 23:55:08 +01:00
static void Ann_CreateAnnouncement (unsigned Roles,const char *Subject,const char *Content);
/*****************************************************************************/
/************************** Show global announcements ************************/
/*****************************************************************************/
void Ann_ShowAllAnnouncements (void)
{
2016-11-26 23:42:12 +01:00
extern const char *Hlp_MESSAGES_Announcements;
2015-11-01 21:19:33 +01:00
extern const char *Txt_Announcements;
2015-11-01 18:54:10 +01:00
extern const char *Txt_No_announcements;
2014-12-01 23:55:08 +01:00
char Query[256];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumAnnouncements;
unsigned NumAnn;
long AnnCod;
unsigned Roles;
2017-01-17 03:10:43 +01:00
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
char Content[Cns_MAX_BYTES_TEXT + 1];
2015-11-01 20:21:59 +01:00
unsigned UnsignedNum;
Ann_Status_t Status;
2017-06-04 18:18:54 +02:00
bool ICanEdit = (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
2015-11-01 18:54:10 +01:00
/***** Get announcements from database *****/
2016-03-21 17:03:12 +01:00
if (ICanEdit)
2015-11-01 21:19:33 +01:00
/* Select all announcements */
sprintf (Query,"SELECT AnnCod,Status,Roles,Subject,Content"
" FROM announcements"
" ORDER BY AnnCod DESC");
else if (Gbl.Usrs.Me.Logged)
2016-12-13 13:32:19 +01:00
{
2016-03-24 18:57:25 +01:00
/* Select only announcements I can see */
2016-12-13 13:32:19 +01:00
Rol_GetRolesInAllCrssIfNotYetGot (&Gbl.Usrs.Me.UsrDat);
2015-11-01 21:19:33 +01:00
sprintf (Query,"SELECT AnnCod,Status,Roles,Subject,Content"
" FROM announcements"
2016-03-24 18:57:25 +01:00
" WHERE (Roles&%u)<>0 "
2015-11-01 21:19:33 +01:00
" ORDER BY AnnCod DESC",
2017-06-08 15:32:33 +02:00
(unsigned) Gbl.Usrs.Me.UsrDat.Roles.InCrss); // All my roles in different courses
2016-12-13 13:32:19 +01:00
}
2015-11-01 21:19:33 +01:00
else // No user logged
/* Select only active announcements for unknown users */
sprintf (Query,"SELECT AnnCod,Status,Roles,Subject,Content"
" FROM announcements"
2017-03-24 01:09:27 +01:00
" WHERE Status=%u AND (Roles&%u)<>0 "
2015-11-01 21:19:33 +01:00
" ORDER BY AnnCod DESC",
(unsigned) Ann_ACTIVE_ANNOUNCEMENT,
2017-05-18 19:13:41 +02:00
(unsigned) (1 << Rol_UNK));
2014-12-01 23:55:08 +01:00
NumAnnouncements = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get announcements");
2016-03-21 17:03:12 +01:00
/***** Start frame *****/
2017-06-10 21:38:10 +02:00
Box_StartBox ("550px",Txt_Announcements,
2016-03-21 17:03:12 +01:00
ICanEdit ? Ann_PutIconToAddNewAnnouncement :
2016-11-12 22:00:50 +01:00
NULL,
2017-06-10 20:56:50 +02:00
Hlp_MESSAGES_Announcements,
false); // Not closable
2016-03-21 17:03:12 +01:00
if (!NumAnnouncements)
2017-05-11 23:45:46 +02:00
Ale_ShowAlert (Ale_INFO,Txt_No_announcements);
2015-11-01 18:54:10 +01:00
2014-12-01 23:55:08 +01:00
/***** Show the announcements *****/
for (NumAnn = 0;
NumAnn < NumAnnouncements;
NumAnn++)
{
row = mysql_fetch_row (mysql_res);
/* Get announcement code (row[0]) */
if (sscanf (row[0],"%ld",&AnnCod) != 1)
Lay_ShowErrorAndExit ("Wrong code of announcement.");
2015-11-01 20:21:59 +01:00
/* Get status of the announcement (row[1]) */
Status = Ann_OBSOLETE_ANNOUNCEMENT;
if (sscanf (row[1],"%u",&UnsignedNum) == 1)
if (UnsignedNum < Ann_NUM_STATUS)
Status = (Ann_Status_t) UnsignedNum;
/* Get roles (row[2]) */
if (sscanf (row[2],"%u",&Roles) != 1)
2014-12-01 23:55:08 +01:00
Lay_ShowErrorAndExit ("Error when reading roles of announcement.");
2015-11-01 20:21:59 +01:00
/* Get the content (row[3]) */
2017-01-17 03:10:43 +01:00
Str_Copy (Subject,row[3],
Cns_MAX_BYTES_SUBJECT);
2014-12-01 23:55:08 +01:00
2015-11-01 20:21:59 +01:00
/* Get the content (row[4]) and insert links */
2017-01-17 03:10:43 +01:00
Str_Copy (Content,row[4],
Cns_MAX_BYTES_TEXT);
2016-01-25 00:19:21 +01:00
Str_InsertLinks (Content,Cns_MAX_BYTES_TEXT,50);
2014-12-01 23:55:08 +01:00
/* Show the announcement */
2015-11-01 20:21:59 +01:00
Ann_DrawAnAnnouncement (AnnCod,Status,Subject,Content,
2016-03-21 17:03:12 +01:00
Roles,true,ICanEdit);
2014-12-01 23:55:08 +01:00
}
2015-11-01 18:54:10 +01:00
2016-03-21 17:03:12 +01:00
/***** Button to add new announcement *****/
if (ICanEdit)
Ann_PutButtonToAddNewAnnouncement ();
2015-11-01 18:54:10 +01:00
/***** End frame *****/
2017-06-10 21:38:10 +02:00
Box_EndBox ();
2015-11-01 18:54:10 +01:00
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
2014-12-01 23:55:08 +01:00
}
2016-03-21 17:03:12 +01:00
/*****************************************************************************/
/******************** Put icon to add a new announcement *********************/
/*****************************************************************************/
static void Ann_PutIconToAddNewAnnouncement (void)
{
extern const char *Txt_New_announcement;
2017-04-17 19:03:21 +02:00
Lay_PutContextualLink (ActWriAnn,NULL,NULL,
2016-07-01 16:32:42 +02:00
"plus64x64.png",
Txt_New_announcement,NULL,
NULL);
2016-03-21 17:03:12 +01:00
}
/*****************************************************************************/
/******************* Put button to add a new announcement ********************/
/*****************************************************************************/
static void Ann_PutButtonToAddNewAnnouncement (void)
{
extern const char *Txt_New_announcement;
Act_FormStart (ActWriAnn);
2017-06-11 19:02:40 +02:00
Btn_PutConfirmButton (Txt_New_announcement);
2016-03-21 17:03:12 +01:00
Act_FormEnd ();
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/************************** Show global announcements ************************/
/*****************************************************************************/
void Ann_ShowMyAnnouncementsNotMarkedAsSeen (void)
{
char Query[256];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumAnnouncements;
unsigned NumAnn;
long AnnCod;
2017-01-17 03:10:43 +01:00
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
char Content[Cns_MAX_BYTES_TEXT + 1];
2014-12-01 23:55:08 +01:00
/***** Select announcements not seen *****/
2016-12-13 13:32:19 +01:00
Rol_GetRolesInAllCrssIfNotYetGot (&Gbl.Usrs.Me.UsrDat);
2014-12-01 23:55:08 +01:00
sprintf (Query,"SELECT AnnCod,Subject,Content FROM announcements"
2017-03-24 01:09:27 +01:00
" WHERE Status=%u AND (Roles&%u)<>0 "
2015-11-01 20:21:59 +01:00
" AND AnnCod NOT IN"
2017-03-24 01:09:27 +01:00
" (SELECT AnnCod FROM ann_seen WHERE UsrCod=%ld)"
2014-12-01 23:55:08 +01:00
" ORDER BY AnnCod DESC", // Newest first
2015-11-01 20:21:59 +01:00
(unsigned) Ann_ACTIVE_ANNOUNCEMENT,
2017-06-08 15:32:33 +02:00
(unsigned) Gbl.Usrs.Me.UsrDat.Roles.InCrss, // All my roles in different courses
2014-12-01 23:55:08 +01:00
Gbl.Usrs.Me.UsrDat.UsrCod);
NumAnnouncements = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get announcements");
/***** Show the announcements *****/
if (NumAnnouncements)
{
2015-09-03 00:59:03 +02:00
fprintf (Gbl.F.Out,"<div class=\"CENTER_MIDDLE\">");
2014-12-01 23:55:08 +01:00
for (NumAnn = 0;
NumAnn < NumAnnouncements;
NumAnn++)
{
row = mysql_fetch_row (mysql_res);
/* Get announcement code (row[0]) */
if (sscanf (row[0],"%ld",&AnnCod) != 1)
Lay_ShowErrorAndExit ("Wrong code of announcement.");
/* Get the content (row[1]) */
2017-01-17 03:10:43 +01:00
Str_Copy (Subject,row[1],
Cns_MAX_BYTES_SUBJECT);
2014-12-01 23:55:08 +01:00
/* Get the content (row[2]) and insert links */
2017-01-17 03:10:43 +01:00
Str_Copy (Content,row[2],
Cns_MAX_BYTES_TEXT);
2016-01-25 00:19:21 +01:00
Str_InsertLinks (Content,Cns_MAX_BYTES_TEXT,50);
2014-12-01 23:55:08 +01:00
/* Show the announcement */
2015-11-01 20:21:59 +01:00
Ann_DrawAnAnnouncement (AnnCod,Ann_ACTIVE_ANNOUNCEMENT,Subject,Content,
0,false,false);
2014-12-01 23:55:08 +01:00
}
fprintf (Gbl.F.Out,"</div>");
}
}
/*****************************************************************************/
/****************** Draw an announcement as a yellow note ********************/
/*****************************************************************************/
2015-11-01 20:21:59 +01:00
static void Ann_DrawAnAnnouncement (long AnnCod,Ann_Status_t Status,
const char *Subject,const char *Content,
2015-11-02 18:55:24 +01:00
unsigned Roles,
bool ShowAllAnnouncements,
2016-03-21 17:03:12 +01:00
bool ICanEdit)
2014-12-01 23:55:08 +01:00
{
extern const char *Txt_Users;
extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
2015-11-01 20:21:59 +01:00
extern const char *Txt_NOTICE_Active_Mark_as_obsolete;
extern const char *Txt_NOTICE_Obsolete_Mark_as_active;
2014-12-01 23:55:08 +01:00
extern const char *Txt_Do_not_show_again;
2015-11-01 20:21:59 +01:00
static const char *ContainerClass[Ann_NUM_STATUS] =
{
"NOTICE_CONTAINER_ACTIVE", // Ann_ACTIVE_ANNOUNCEMENT
"NOTICE_CONTAINER_OBSOLETE", // Ann_OBSOLETE_ANNOUNCEMENT
};
static const char *SubjectClass[Ann_NUM_STATUS] =
{
"NOTICE_SUBJECT_ACTIVE", // Ann_ACTIVE_ANNOUNCEMENT
"NOTICE_SUBJECT_OBSOLETE", // Ann_OBSOLETE_ANNOUNCEMENT
};
static const char *ContentClass[Ann_NUM_STATUS] =
{
"NOTICE_TEXT_ACTIVE", // Ann_ACTIVE_ANNOUNCEMENT
"NOTICE_TEXT_OBSOLETE", // Ann_OBSOLETE_ANNOUNCEMENT
};
static const char *UsersClass[Ann_NUM_STATUS] =
{
"NOTICE_AUTHOR_ACTIVE", // Ann_ACTIVE_ANNOUNCEMENT
"NOTICE_AUTHOR_OBSOLETE", // Ann_OBSOLETE_ANNOUNCEMENT
};
2014-12-01 23:55:08 +01:00
Rol_Role_t Role;
2015-11-01 21:19:33 +01:00
bool SomeRolesAreSelected;
2014-12-01 23:55:08 +01:00
2016-12-11 20:16:15 +01:00
Gbl.Announcements.AnnCod = AnnCod; // Parameter for forms
2014-12-01 23:55:08 +01:00
/***** Start yellow note *****/
2015-11-01 20:21:59 +01:00
fprintf (Gbl.F.Out,"<div class=\"%s\" style=\"width:500px;\">",
ContainerClass[Status]);
2014-12-01 23:55:08 +01:00
2016-03-21 17:03:12 +01:00
if (ICanEdit)
2015-11-01 18:54:10 +01:00
{
2016-12-11 20:16:15 +01:00
/***** Put form to remove announcement *****/
2017-06-11 19:13:28 +02:00
Ico_PutContextualIconToRemove (ActRemAnn,Ann_PutParams);
2016-12-11 20:16:15 +01:00
2016-12-11 20:28:58 +01:00
/***** Put form to change the status of the announcement *****/
2015-11-01 20:21:59 +01:00
switch (Status)
{
case Ann_ACTIVE_ANNOUNCEMENT:
2017-04-17 19:03:21 +02:00
Lay_PutContextualLink (ActHidAnn,NULL,Ann_PutParams,
2016-12-11 20:16:15 +01:00
"eye-on64x64.png",
Txt_NOTICE_Active_Mark_as_obsolete,NULL,
NULL);
2015-11-01 20:21:59 +01:00
break;
case Ann_OBSOLETE_ANNOUNCEMENT:
2017-04-17 19:03:21 +02:00
Lay_PutContextualLink (ActRevAnn,NULL,Ann_PutParams,
2016-12-11 20:16:15 +01:00
"eye-slash-on64x64.png",
Txt_NOTICE_Obsolete_Mark_as_active,NULL,
NULL);
2015-11-01 20:21:59 +01:00
break;
}
2015-11-01 18:54:10 +01:00
}
2015-11-01 20:21:59 +01:00
/***** Write the subject of the announcement *****/
fprintf (Gbl.F.Out,"<div class=\"%s\">%s</div>",
SubjectClass[Status],Subject);
2014-12-01 23:55:08 +01:00
/***** Write the content of the announcement *****/
2015-11-01 20:21:59 +01:00
fprintf (Gbl.F.Out,"<div class=\"%s\">%s</div>",
ContentClass[Status],Content);
2014-12-01 23:55:08 +01:00
/***** Write form *****/
2015-09-28 18:28:29 +02:00
fprintf (Gbl.F.Out,"<div class=\"CENTER_MIDDLE\" style=\"margin:12px;\">");
2014-12-01 23:55:08 +01:00
if (ShowAllAnnouncements)
{
/* Users' roles who can view this announcement */
2015-11-01 20:21:59 +01:00
fprintf (Gbl.F.Out,"<p class=\"%s\">%s:",
UsersClass[Status],Txt_Users);
2017-05-18 19:13:41 +02:00
for (Role = Rol_UNK, SomeRolesAreSelected = false;
Role <= Rol_TCH;
2014-12-01 23:55:08 +01:00
Role++)
if (Roles & (1 << Role))
{
2015-11-01 21:19:33 +01:00
if (SomeRolesAreSelected)
2014-12-01 23:55:08 +01:00
fprintf (Gbl.F.Out,",");
2015-11-01 21:19:33 +01:00
SomeRolesAreSelected = true;
2014-12-01 23:55:08 +01:00
fprintf (Gbl.F.Out," %s",Txt_ROLES_PLURAL_abc[Role][Usr_SEX_UNKNOWN]);
}
fprintf (Gbl.F.Out,"</p>");
}
else
2016-12-11 20:16:15 +01:00
/***** Put form to mark announcement as seen *****/
2017-04-17 19:03:21 +02:00
Lay_PutContextualLink (ActAnnSee,NULL,Ann_PutParams,
2016-12-11 20:16:15 +01:00
"remove-on64x64.png",
Txt_Do_not_show_again,Txt_Do_not_show_again,
NULL);
2014-12-01 23:55:08 +01:00
fprintf (Gbl.F.Out,"</div>");
/***** End yellow note *****/
fprintf (Gbl.F.Out,"</div>");
}
/*****************************************************************************/
2016-12-11 20:16:15 +01:00
/******************** Params used to edit an assignment **********************/
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
2016-12-11 20:16:15 +01:00
static void Ann_PutParams (void)
2014-12-01 23:55:08 +01:00
{
2016-12-11 20:16:15 +01:00
Par_PutHiddenParamLong ("AnnCod",Gbl.Announcements.AnnCod);
2014-12-01 23:55:08 +01:00
}
/*****************************************************************************/
/************** Get parameter with the code of an announcement ***************/
/*****************************************************************************/
static long Ann_GetParamAnnCod (void)
{
long AnnCod;
2017-01-28 20:32:50 +01:00
/***** Get announcement code *****/
if ((AnnCod = Par_GetParToLong ("AnnCod")) <= 0)
2014-12-01 23:55:08 +01:00
Lay_ShowErrorAndExit ("Wrong code of announcement.");
return AnnCod;
}
/*****************************************************************************/
/***************** Show form to create a new announcement ********************/
/*****************************************************************************/
void Ann_ShowFormAnnouncement (void)
{
2016-11-26 23:42:12 +01:00
extern const char *Hlp_MESSAGES_Announcements;
2015-07-27 21:25:45 +02:00
extern const char *The_ClassForm[The_NUM_THEMES];
2014-12-01 23:55:08 +01:00
extern const char *Txt_New_announcement;
extern const char *Txt_MSG_Subject;
2017-04-19 14:27:52 +02:00
extern const char *Txt_MSG_Content;
2014-12-01 23:55:08 +01:00
extern const char *Txt_Users;
extern const char *Txt_Create_announcement;
2015-04-11 17:33:14 +02:00
/***** Start form *****/
2014-12-01 23:55:08 +01:00
Act_FormStart (ActRcvAnn);
2015-03-24 17:47:26 +01:00
/***** Start frame *****/
2017-06-10 21:38:10 +02:00
Box_StartBoxTable (NULL,Txt_New_announcement,NULL,
2017-06-10 20:56:50 +02:00
Hlp_MESSAGES_Announcements,
false, // Not closable
2);
2015-03-24 17:47:26 +01:00
2016-12-24 14:05:59 +01:00
/***** Announcement subject and body *****/
2016-12-26 18:26:40 +01:00
Ann_PutSubjectMessage ("Subject",Txt_MSG_Subject, 2);
2017-04-19 14:27:52 +02:00
Ann_PutSubjectMessage ("Content",Txt_MSG_Content,20);
2014-12-01 23:55:08 +01:00
/***** Users' roles who can view the announcement *****/
fprintf (Gbl.F.Out,"<tr>"
2015-07-27 21:25:45 +02:00
"<td class=\"%s RIGHT_TOP\">"
2014-12-22 14:08:19 +01:00
"%s: "
"</td>"
2015-07-28 00:51:32 +02:00
"<td class=\"DAT LEFT_TOP\">",
2015-07-27 21:25:45 +02:00
The_ClassForm[Gbl.Prefs.Theme],
2014-12-01 23:55:08 +01:00
Txt_Users);
2017-05-20 12:04:12 +02:00
Rol_WriteSelectorRoles (1 << Rol_UNK |
1 << Rol_GST |
1 << Rol_STD |
2017-05-21 21:23:13 +02:00
1 << Rol_NET |
2017-05-18 19:13:41 +02:00
1 << Rol_TCH,
2017-05-20 12:04:12 +02:00
1 << Rol_UNK |
1 << Rol_GST |
1 << Rol_STD |
2017-05-21 21:23:13 +02:00
1 << Rol_NET |
2017-05-18 19:13:41 +02:00
1 << Rol_TCH,
2016-03-24 16:49:36 +01:00
false,false);
2014-12-01 23:55:08 +01:00
fprintf (Gbl.F.Out,"</td>"
2015-03-24 17:47:26 +01:00
"</tr>");
2015-04-11 23:46:21 +02:00
/***** Button to create announcement and end frame *****/
2017-06-11 19:02:40 +02:00
Box_EndBoxTableWithButton (Btn_CREATE_BUTTON,Txt_Create_announcement);
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
Act_FormEnd ();
2014-12-01 23:55:08 +01:00
}
2016-12-26 18:26:40 +01:00
/*****************************************************************************/
/*********** Put form field for message subject or message content ***********/
/*****************************************************************************/
static void Ann_PutSubjectMessage (const char *Field,const char *Label,
unsigned Rows)
{
extern const char *The_ClassForm[The_NUM_THEMES];
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"RIGHT_TOP\">"
"<label for=\"%s\" class=\"%s\">%s:</label>"
"</td>"
"<td class=\"LEFT_TOP\">"
"<textarea id=\"%s\" name=\"%s\""
" cols=\"75\" rows=\"%u\">"
"</textarea>"
"</td>"
"</tr>",
Field,The_ClassForm[Gbl.Prefs.Theme],Label,
Field,Field,Rows);
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/****** Receive a new announcement from a form and store it in database ******/
/*****************************************************************************/
void Ann_ReceiveAnnouncement (void)
{
extern const char *Txt_Announcement_created;
unsigned Roles;
2017-01-28 15:58:46 +01:00
char Subject[Cns_MAX_BYTES_SUBJECT + 1];
char Content[Cns_MAX_BYTES_TEXT + 1];
2014-12-01 23:55:08 +01:00
/***** Get data from form *****/
/* Get the subject of the announcement */
Par_GetParToHTML ("Subject",Subject,Cns_MAX_BYTES_SUBJECT);
/* Get the content of the announcement */
Par_GetParAndChangeFormat ("Content",Content,Cns_MAX_BYTES_TEXT,
Str_TO_RIGOROUS_HTML,true);
/* Get users who can view this announcement */
2016-03-24 16:49:36 +01:00
Roles = Rol_GetSelectedRoles ();
2014-12-01 23:55:08 +01:00
/***** Create a new announcement in database *****/
Ann_CreateAnnouncement (Roles,Subject,Content);
/***** Write message of success *****/
2017-05-11 23:45:46 +02:00
Ale_ShowAlert (Ale_SUCCESS,Txt_Announcement_created);
2014-12-01 23:55:08 +01:00
/***** Refresh list of announcements *****/
Ann_ShowAllAnnouncements ();
}
/*****************************************************************************/
/************************ Create a new announcement **************************/
/*****************************************************************************/
static void Ann_CreateAnnouncement (unsigned Roles,const char *Subject,const char *Content)
{
2017-01-28 15:58:46 +01:00
char Query[128 + Cns_MAX_BYTES_SUBJECT + Cns_MAX_BYTES_TEXT];
2014-12-01 23:55:08 +01:00
/***** Select announcements not seen *****/
2017-03-13 13:17:53 +01:00
sprintf (Query,"INSERT INTO announcements"
" (Roles,Subject,Content)"
" VALUES"
2017-03-24 01:09:27 +01:00
" (%u,'%s','%s')",
2014-12-01 23:55:08 +01:00
Roles,Subject,Content);
DB_QueryINSERT (Query,"can not create announcement");
}
2015-11-01 20:21:59 +01:00
/*****************************************************************************/
/*********** Mark as hidden a global announcement that was active ************/
/*****************************************************************************/
void Ann_HideActiveAnnouncement (void)
{
char Query[256];
long AnnCod;
/***** Get the code of the global announcement to hide *****/
AnnCod = Ann_GetParamAnnCod ();
/***** Set global announcement as hidden *****/
2017-03-24 01:09:27 +01:00
sprintf (Query,"UPDATE announcements SET Status=%u"
" WHERE AnnCod=%ld",
2015-11-01 20:21:59 +01:00
(unsigned) Ann_OBSOLETE_ANNOUNCEMENT,AnnCod);
DB_QueryUPDATE (Query,"can not hide announcement");
}
/*****************************************************************************/
/*********** Mark as active a global announcement that was hidden ************/
/*****************************************************************************/
void Ann_RevealHiddenAnnouncement (void)
{
char Query[256];
long AnnCod;
/***** Get the code of the global announcement to show *****/
AnnCod = Ann_GetParamAnnCod ();
/***** Set global announcement as shown *****/
2017-03-24 01:09:27 +01:00
sprintf (Query,"UPDATE announcements SET Status=%u"
" WHERE AnnCod=%ld",
2015-11-01 20:21:59 +01:00
(unsigned) Ann_ACTIVE_ANNOUNCEMENT,AnnCod);
DB_QueryUPDATE (Query,"can not reveal announcement");
}
2014-12-01 23:55:08 +01:00
/*****************************************************************************/
/********************** Remove a global announcement *************************/
/*****************************************************************************/
void Ann_RemoveAnnouncement (void)
{
extern const char *Txt_Announcement_removed;
char Query[128];
long AnnCod;
/***** Get the code of the global announcement *****/
AnnCod = Ann_GetParamAnnCod ();
/***** Remove announcement *****/
2017-03-24 01:09:27 +01:00
sprintf (Query,"DELETE FROM announcements WHERE AnnCod=%ld",
2014-12-01 23:55:08 +01:00
AnnCod);
2015-03-18 01:06:43 +01:00
DB_QueryDELETE (Query,"can not remove announcement");
2014-12-01 23:55:08 +01:00
/***** Remove users who have seen the announcement *****/
2017-03-24 01:09:27 +01:00
sprintf (Query,"DELETE FROM ann_seen WHERE AnnCod=%ld",
2014-12-01 23:55:08 +01:00
AnnCod);
2015-03-18 01:06:43 +01:00
DB_QueryDELETE (Query,"can not remove announcement");
2014-12-01 23:55:08 +01:00
/***** Write message of success *****/
2017-05-11 23:45:46 +02:00
Ale_ShowAlert (Ale_SUCCESS,Txt_Announcement_removed);
2014-12-01 23:55:08 +01:00
/***** Refresh list of announcements *****/
Ann_ShowAllAnnouncements ();
}
/*****************************************************************************/
/************************ Create a new announcement **************************/
/*****************************************************************************/
void Ann_MarkAnnouncementAsSeen (void)
{
char Query[128];
long AnnCod;
/***** Get the code of the global announcement *****/
AnnCod = Ann_GetParamAnnCod ();
/***** Mark announcement as seen *****/
2017-03-13 13:17:53 +01:00
sprintf (Query,"REPLACE INTO ann_seen"
" (AnnCod,UsrCod)"
" VALUES"
2017-03-24 01:09:27 +01:00
" (%ld,%ld)",
2014-12-01 23:55:08 +01:00
AnnCod,Gbl.Usrs.Me.UsrDat.UsrCod);
DB_QueryREPLACE (Query,"can not mark announcement as seen");
/***** Show other announcements again *****/
Ann_ShowMyAnnouncementsNotMarkedAsSeen ();
}
/*****************************************************************************/
/******************** Remove user from seen announcements ********************/
/*****************************************************************************/
void Ann_RemoveUsrFromSeenAnnouncements (long UsrCod)
{
char Query[128];
/***** Remove user from seen announcements *****/
2017-03-24 01:09:27 +01:00
sprintf (Query,"DELETE FROM ann_seen WHERE UsrCod=%ld",
2014-12-01 23:55:08 +01:00
UsrCod);
DB_QueryDELETE (Query,"can not remove user from seen announcements");
}