Version 16.97

This commit is contained in:
Antonio Cañas Vargas 2016-12-12 02:21:41 +01:00
parent 7954f4bd80
commit 08374d48a1
10 changed files with 411 additions and 211 deletions

View File

@ -369,8 +369,8 @@ a:hover /* Default ==> underlined */
}
}
.BC_SEMIOFF {opacity:0.67;}
.BC_OFF {opacity:0.33;}
.BC_SEMIOFF {opacity:0.67;}
.BC_OFF {opacity:0.33;}
.BC_WHITE {color:#707070;}
.BC_GREY {color:#FFB42E;}
@ -2115,7 +2115,23 @@ a:hover img.CENTRE_PHOTO_SHOW
.LOG {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:#606060; font-size:11pt;}
.LOG_R {font-family:"Arial Narrow","Nimbus Sans L","DejaVu LGC Sans Condensed",sans-serif; color:red; font-size:11pt;}
/******************************** Image uploading ****************************/
/***************************** Exam announcement *****************************/
/* Bottom space is used for signatures */
.EXA_ANN_VISIBLE
{
box-sizing:border-box;
width:100%;
padding:25px 25px 125px 25px;
}
.EXA_ANN_HIDDEN
{
box-sizing:border-box;
width:100%;
padding:25px 25px 125px 25px;
opacity:0.33;
}
/****************************** Image uploading ******************************/
.IMG_UPLOAD_CONTAINER
{
vertical-align:top;

View File

@ -257,8 +257,10 @@ static void RSS_WriteExamAnnouncements (FILE *FileRSS,struct Course *Crs)
sprintf (Query,"SELECT ExaCod,UNIX_TIMESTAMP(CallDate) AS T,"
"DATE_FORMAT(ExamDate,'%%d/%%m/%%Y %%H:%%i')"
" FROM exam_announcements"
" WHERE CrsCod='%ld' AND ExamDate>=NOW() AND Status<>'%u' ORDER BY T",
Gbl.CurrentCrs.Crs.CrsCod,(unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT);
" WHERE CrsCod='%ld' AND Status='%u' AND ExamDate>=NOW()"
" ORDER BY T",
Gbl.CurrentCrs.Crs.CrsCod,
(unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT);
NumExamAnnouncements = DB_QuerySELECT (Query,&mysql_res,"can not get exam announcements");
/***** Write items with notices *****/

View File

@ -839,6 +839,8 @@ Assessment:
688. ActPrnExaAnn Show an exam announcement ready to be printed
NEW. ActReqRemExaAnn Request the removal of an exam announcement
689. ActRemExaAnn Remove an exam announcement
NEW. ActHidExaAnn Hide exam announcement
NEW. ActShoExaAnn Show exam announcement
690. ActChgToSeeMrk Change to see marks in course/group
@ -2243,10 +2245,12 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActSeeOneExaAnn */{1572,-1,TabUnk,ActSeeAllExaAnn ,0x1FF,0x1FF,0x000,Act_CONT_NORM,Act_THIS_WINDOW,Exa_GetExaCodToHighlight ,Exa_ListExamAnnouncementsSee ,NULL},
/* ActSeeDatExaAnn */{1571,-1,TabUnk,ActSeeAllExaAnn ,0x1FF,0x1FF,0x000,Act_CONT_NORM,Act_THIS_WINDOW,Exa_GetDateToHighlight ,Exa_ListExamAnnouncementsSee ,NULL},
/* ActEdiExaAnn */{ 91,-1,TabUnk,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Exa_PutFrmEditAExamAnnouncement,NULL},
/* ActRcvExaAnn */{ 110,-1,TabUnk,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Exa_ReceiveExamAnnouncement ,NULL},
/* ActRcvExaAnn */{ 110,-1,TabUnk,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,Exa_ReceiveExamAnnouncement1 ,Exa_ReceiveExamAnnouncement2 ,NULL},
/* ActPrnExaAnn */{ 179,-1,TabUnk,ActSeeAllExaAnn ,0x1FF,0x1FF,0x000,Act_CONT_NORM,Act_BLNK_WINDOW,NULL ,Exa_PrintExamAnnouncement ,NULL},
/* ActReqRemExaAnn */{1619,-1,TabUnk,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Exa_ReqRemoveExamAnnouncement ,NULL},
/* ActRemExaAnn */{ 187,-1,TabUnk,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Exa_RemoveExamAnnouncement ,NULL},
/* ActRemExaAnn */{ 187,-1,TabUnk,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,Exa_RemoveExamAnnouncement1 ,Exa_RemoveExamAnnouncement2 ,NULL},
/* ActHidExaAnn */{1620,-1,TabUnk,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,Exa_HideExamAnnouncement1 ,Exa_HideExamAnnouncement2 ,NULL},
/* ActShoExaAnn */{1621,-1,TabUnk,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,Exa_UnhideExamAnnouncement1 ,Exa_UnhideExamAnnouncement2 ,NULL},
/* ActChgToSeeMrk */{1198,-1,TabUnk,ActSeeAdmMrk ,0x118,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Brw_ShowFileBrowserOrWorks ,NULL},
@ -4527,6 +4531,8 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq
ActSeeMyPubAgd, // #1617
ActPrnAgdQR, // #1618
ActReqRemExaAnn, // #1619
ActHidExaAnn, // #1620
ActShoExaAnn, // #1621
};
/*****************************************************************************/

View File

@ -55,9 +55,9 @@ typedef enum
typedef int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_NUM_ACTIONS (1+9+51+14+93+73+70+249+187+159+172+36+31+97)
#define Act_NUM_ACTIONS (1+9+51+14+93+73+70+249+189+159+172+36+31+97)
#define Act_MAX_ACTION_COD 1619
#define Act_MAX_ACTION_COD 1621
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 11
@ -849,68 +849,70 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica
#define ActPrnExaAnn (ActRcvRchTxtCrsLnk+129)
#define ActReqRemExaAnn (ActRcvRchTxtCrsLnk+130)
#define ActRemExaAnn (ActRcvRchTxtCrsLnk+131)
#define ActHidExaAnn (ActRcvRchTxtCrsLnk+132)
#define ActShoExaAnn (ActRcvRchTxtCrsLnk+133)
#define ActChgToSeeMrk (ActRcvRchTxtCrsLnk+132)
#define ActChgToSeeMrk (ActRcvRchTxtCrsLnk+134)
#define ActSeeMrkCrs (ActRcvRchTxtCrsLnk+133)
#define ActExpSeeMrkCrs (ActRcvRchTxtCrsLnk+134)
#define ActConSeeMrkCrs (ActRcvRchTxtCrsLnk+135)
#define ActReqDatSeeMrkCrs (ActRcvRchTxtCrsLnk+136)
#define ActSeeMyMrkCrs (ActRcvRchTxtCrsLnk+137)
#define ActSeeMrkCrs (ActRcvRchTxtCrsLnk+135)
#define ActExpSeeMrkCrs (ActRcvRchTxtCrsLnk+136)
#define ActConSeeMrkCrs (ActRcvRchTxtCrsLnk+137)
#define ActReqDatSeeMrkCrs (ActRcvRchTxtCrsLnk+138)
#define ActSeeMyMrkCrs (ActRcvRchTxtCrsLnk+139)
#define ActSeeMrkGrp (ActRcvRchTxtCrsLnk+138)
#define ActExpSeeMrkGrp (ActRcvRchTxtCrsLnk+139)
#define ActConSeeMrkGrp (ActRcvRchTxtCrsLnk+140)
#define ActReqDatSeeMrkGrp (ActRcvRchTxtCrsLnk+141)
#define ActSeeMyMrkGrp (ActRcvRchTxtCrsLnk+142)
#define ActSeeMrkGrp (ActRcvRchTxtCrsLnk+140)
#define ActExpSeeMrkGrp (ActRcvRchTxtCrsLnk+141)
#define ActConSeeMrkGrp (ActRcvRchTxtCrsLnk+142)
#define ActReqDatSeeMrkGrp (ActRcvRchTxtCrsLnk+143)
#define ActSeeMyMrkGrp (ActRcvRchTxtCrsLnk+144)
#define ActChgToAdmMrk (ActRcvRchTxtCrsLnk+143)
#define ActChgToAdmMrk (ActRcvRchTxtCrsLnk+145)
#define ActAdmMrkCrs (ActRcvRchTxtCrsLnk+144)
#define ActReqRemFilMrkCrs (ActRcvRchTxtCrsLnk+145)
#define ActRemFilMrkCrs (ActRcvRchTxtCrsLnk+146)
#define ActRemFolMrkCrs (ActRcvRchTxtCrsLnk+147)
#define ActCopMrkCrs (ActRcvRchTxtCrsLnk+148)
#define ActPasMrkCrs (ActRcvRchTxtCrsLnk+149)
#define ActRemTreMrkCrs (ActRcvRchTxtCrsLnk+150)
#define ActFrmCreMrkCrs (ActRcvRchTxtCrsLnk+151)
#define ActCreFolMrkCrs (ActRcvRchTxtCrsLnk+152)
#define ActRenFolMrkCrs (ActRcvRchTxtCrsLnk+153)
#define ActRcvFilMrkCrsDZ (ActRcvRchTxtCrsLnk+154)
#define ActRcvFilMrkCrsCla (ActRcvRchTxtCrsLnk+155)
#define ActExpAdmMrkCrs (ActRcvRchTxtCrsLnk+156)
#define ActConAdmMrkCrs (ActRcvRchTxtCrsLnk+157)
#define ActZIPAdmMrkCrs (ActRcvRchTxtCrsLnk+158)
#define ActShoMrkCrs (ActRcvRchTxtCrsLnk+159)
#define ActHidMrkCrs (ActRcvRchTxtCrsLnk+160)
#define ActReqDatAdmMrkCrs (ActRcvRchTxtCrsLnk+161)
#define ActChgDatAdmMrkCrs (ActRcvRchTxtCrsLnk+162)
#define ActDowAdmMrkCrs (ActRcvRchTxtCrsLnk+163)
#define ActChgNumRowHeaCrs (ActRcvRchTxtCrsLnk+164)
#define ActChgNumRowFooCrs (ActRcvRchTxtCrsLnk+165)
#define ActAdmMrkCrs (ActRcvRchTxtCrsLnk+146)
#define ActReqRemFilMrkCrs (ActRcvRchTxtCrsLnk+147)
#define ActRemFilMrkCrs (ActRcvRchTxtCrsLnk+148)
#define ActRemFolMrkCrs (ActRcvRchTxtCrsLnk+149)
#define ActCopMrkCrs (ActRcvRchTxtCrsLnk+150)
#define ActPasMrkCrs (ActRcvRchTxtCrsLnk+151)
#define ActRemTreMrkCrs (ActRcvRchTxtCrsLnk+152)
#define ActFrmCreMrkCrs (ActRcvRchTxtCrsLnk+153)
#define ActCreFolMrkCrs (ActRcvRchTxtCrsLnk+154)
#define ActRenFolMrkCrs (ActRcvRchTxtCrsLnk+155)
#define ActRcvFilMrkCrsDZ (ActRcvRchTxtCrsLnk+156)
#define ActRcvFilMrkCrsCla (ActRcvRchTxtCrsLnk+157)
#define ActExpAdmMrkCrs (ActRcvRchTxtCrsLnk+158)
#define ActConAdmMrkCrs (ActRcvRchTxtCrsLnk+159)
#define ActZIPAdmMrkCrs (ActRcvRchTxtCrsLnk+160)
#define ActShoMrkCrs (ActRcvRchTxtCrsLnk+161)
#define ActHidMrkCrs (ActRcvRchTxtCrsLnk+162)
#define ActReqDatAdmMrkCrs (ActRcvRchTxtCrsLnk+163)
#define ActChgDatAdmMrkCrs (ActRcvRchTxtCrsLnk+164)
#define ActDowAdmMrkCrs (ActRcvRchTxtCrsLnk+165)
#define ActChgNumRowHeaCrs (ActRcvRchTxtCrsLnk+166)
#define ActChgNumRowFooCrs (ActRcvRchTxtCrsLnk+167)
#define ActAdmMrkGrp (ActRcvRchTxtCrsLnk+166)
#define ActReqRemFilMrkGrp (ActRcvRchTxtCrsLnk+167)
#define ActRemFilMrkGrp (ActRcvRchTxtCrsLnk+168)
#define ActRemFolMrkGrp (ActRcvRchTxtCrsLnk+169)
#define ActCopMrkGrp (ActRcvRchTxtCrsLnk+170)
#define ActPasMrkGrp (ActRcvRchTxtCrsLnk+171)
#define ActRemTreMrkGrp (ActRcvRchTxtCrsLnk+172)
#define ActFrmCreMrkGrp (ActRcvRchTxtCrsLnk+173)
#define ActCreFolMrkGrp (ActRcvRchTxtCrsLnk+174)
#define ActRenFolMrkGrp (ActRcvRchTxtCrsLnk+175)
#define ActRcvFilMrkGrpDZ (ActRcvRchTxtCrsLnk+176)
#define ActRcvFilMrkGrpCla (ActRcvRchTxtCrsLnk+177)
#define ActExpAdmMrkGrp (ActRcvRchTxtCrsLnk+178)
#define ActConAdmMrkGrp (ActRcvRchTxtCrsLnk+179)
#define ActZIPAdmMrkGrp (ActRcvRchTxtCrsLnk+180)
#define ActShoMrkGrp (ActRcvRchTxtCrsLnk+181)
#define ActHidMrkGrp (ActRcvRchTxtCrsLnk+182)
#define ActReqDatAdmMrkGrp (ActRcvRchTxtCrsLnk+183)
#define ActChgDatAdmMrkGrp (ActRcvRchTxtCrsLnk+184)
#define ActDowAdmMrkGrp (ActRcvRchTxtCrsLnk+185)
#define ActChgNumRowHeaGrp (ActRcvRchTxtCrsLnk+186)
#define ActChgNumRowFooGrp (ActRcvRchTxtCrsLnk+187)
#define ActAdmMrkGrp (ActRcvRchTxtCrsLnk+168)
#define ActReqRemFilMrkGrp (ActRcvRchTxtCrsLnk+169)
#define ActRemFilMrkGrp (ActRcvRchTxtCrsLnk+170)
#define ActRemFolMrkGrp (ActRcvRchTxtCrsLnk+171)
#define ActCopMrkGrp (ActRcvRchTxtCrsLnk+172)
#define ActPasMrkGrp (ActRcvRchTxtCrsLnk+173)
#define ActRemTreMrkGrp (ActRcvRchTxtCrsLnk+174)
#define ActFrmCreMrkGrp (ActRcvRchTxtCrsLnk+175)
#define ActCreFolMrkGrp (ActRcvRchTxtCrsLnk+176)
#define ActRenFolMrkGrp (ActRcvRchTxtCrsLnk+177)
#define ActRcvFilMrkGrpDZ (ActRcvRchTxtCrsLnk+178)
#define ActRcvFilMrkGrpCla (ActRcvRchTxtCrsLnk+179)
#define ActExpAdmMrkGrp (ActRcvRchTxtCrsLnk+180)
#define ActConAdmMrkGrp (ActRcvRchTxtCrsLnk+181)
#define ActZIPAdmMrkGrp (ActRcvRchTxtCrsLnk+182)
#define ActShoMrkGrp (ActRcvRchTxtCrsLnk+183)
#define ActHidMrkGrp (ActRcvRchTxtCrsLnk+184)
#define ActReqDatAdmMrkGrp (ActRcvRchTxtCrsLnk+185)
#define ActChgDatAdmMrkGrp (ActRcvRchTxtCrsLnk+186)
#define ActDowAdmMrkGrp (ActRcvRchTxtCrsLnk+187)
#define ActChgNumRowHeaGrp (ActRcvRchTxtCrsLnk+188)
#define ActChgNumRowFooGrp (ActRcvRchTxtCrsLnk+189)
/*****************************************************************************/
/******************************* Users tab ***********************************/

View File

@ -185,13 +185,18 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 16.96 (2016-12-11)"
#define CSS_FILE "swad16.94.1.css"
#define Log_PLATFORM_VERSION "SWAD 16.97 (2016-12-12)"
#define CSS_FILE "swad16.97.css"
#define JS_FILE "swad16.90.2.js"
// Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
/*
Version 16.97: Dec 12, 2016 Exam announcements can be hidden. (210739 lines)
2 changes necessary in database:
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1620','es','N','Ocultar convocatoria de examen');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1621','es','N','Mostrar convocatoria de examen');
Version 16.96: Dec 11, 2016 Now removing an announcement of exam requires confirmation. (210563 lines)
1 change necessary in database:
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1619','es','N','Solicitar eliminaci&oacute;n de convocatoria');

View File

@ -78,9 +78,9 @@ static void Exa_PutIconToCreateNewExamAnnouncement (void);
static void Exa_PutButtonToCreateNewExamAnnouncement (void);
static long Exa_AddExamAnnouncementToDB (void);
static void Exa_ModifyExamAnnouncementInDB (long ExaCod);
static void Exa_GetDataExamAnnouncementFromDB (long ExaCod);
static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement);
static void Exa_ModifyExamAnnouncementInDB (void);
static void Exa_GetDataExamAnnouncementFromDB (void);
static void Exa_ShowExamAnnouncement (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement);
static void Exa_PutIconsExamAnnouncement (void);
static void Exa_PutParamExaCodToEdit (void);
static long Exa_GetParamExaCod (void);
@ -93,20 +93,18 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr);
void Exa_PutFrmEditAExamAnnouncement (void)
{
long ExaCod;
/***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement ();
/***** Get the code of the exam announcement *****/
ExaCod = Exa_GetParamsExamAnnouncement ();
Gbl.ExamAnnouncements.ExaDat.ExaCod = Exa_GetParamsExamAnnouncement ();
if (ExaCod > 0) // -1 indicates that this is a new exam announcement
if (Gbl.ExamAnnouncements.ExaDat.ExaCod > 0) // -1 indicates that this is a new exam announcement
/***** Read exam announcement from the database *****/
Exa_GetDataExamAnnouncementFromDB (ExaCod);
Exa_GetDataExamAnnouncementFromDB ();
/***** Show exam announcement *****/
Exa_ShowExamAnnouncement (ExaCod,Exa_FORM_VIEW);
Exa_ShowExamAnnouncement (Exa_FORM_VIEW);
/***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement ();
@ -277,48 +275,50 @@ void Exa_FreeMemExamAnnouncement (void)
/************************ Receive an exam announcement ***********************/
/*****************************************************************************/
void Exa_ReceiveExamAnnouncement (void)
void Exa_ReceiveExamAnnouncement1 (void)
{
extern const char *Txt_Created_new_announcement_of_exam;
extern const char *Txt_The_announcement_of_exam_has_been_successfully_updated;
long ExaCod;
bool NewExamAnnouncement;
unsigned NumUsrsToBeNotifiedByEMail;
struct SocialPublishing SocPub;
/***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement ();
/***** Get parameters of the exam announcement *****/
ExaCod = Exa_GetParamsExamAnnouncement ();
NewExamAnnouncement = (ExaCod == -1L); // -1 indicates that it is a new exam announcement
Gbl.ExamAnnouncements.ExaDat.ExaCod = Exa_GetParamsExamAnnouncement ();
Gbl.ExamAnnouncements.NewExamAnnouncement = (Gbl.ExamAnnouncements.ExaDat.ExaCod < 0);
/***** Add the exam announcement to the database and read it again from the database *****/
if (NewExamAnnouncement)
ExaCod = Exa_AddExamAnnouncementToDB ();
if (Gbl.ExamAnnouncements.NewExamAnnouncement)
Gbl.ExamAnnouncements.ExaDat.ExaCod = Exa_AddExamAnnouncementToDB ();
else
Exa_ModifyExamAnnouncementInDB (ExaCod);
Exa_ModifyExamAnnouncementInDB ();
/***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement ();
}
void Exa_ReceiveExamAnnouncement2 (void)
{
extern const char *Txt_Created_new_announcement_of_exam;
extern const char *Txt_The_announcement_of_exam_has_been_successfully_updated;
unsigned NumUsrsToBeNotifiedByEMail;
struct SocialPublishing SocPub;
/***** Show message *****/
Lay_ShowAlert (Lay_SUCCESS,NewExamAnnouncement ? Txt_Created_new_announcement_of_exam :
Txt_The_announcement_of_exam_has_been_successfully_updated);
Lay_ShowAlert (Lay_SUCCESS,
Gbl.ExamAnnouncements.NewExamAnnouncement ? Txt_Created_new_announcement_of_exam :
Txt_The_announcement_of_exam_has_been_successfully_updated);
/***** Notify by email about the new exam announcement *****/
if ((NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_EXAM_ANNOUNCEMENT,ExaCod)))
Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (ExaCod,NumUsrsToBeNotifiedByEMail);
if ((NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_EXAM_ANNOUNCEMENT,Gbl.ExamAnnouncements.ExaDat.ExaCod)))
Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (Gbl.ExamAnnouncements.ExaDat.ExaCod,NumUsrsToBeNotifiedByEMail);
Ntf_ShowAlertNumUsrsToBeNotifiedByEMail (NumUsrsToBeNotifiedByEMail);
/***** Create a new social note about the new exam announcement *****/
Soc_StoreAndPublishSocialNote (Soc_NOTE_EXAM_ANNOUNCEMENT,ExaCod,&SocPub);
/***** Show exam announcement *****/
Exa_ListExamAnnouncementsEdit ();
Soc_StoreAndPublishSocialNote (Soc_NOTE_EXAM_ANNOUNCEMENT,Gbl.ExamAnnouncements.ExaDat.ExaCod,&SocPub);
/***** Update RSS of current course *****/
RSS_UpdateRSSFileForACrs (&Gbl.CurrentCrs.Crs);
/***** Show exam announcement *****/
Exa_ListExamAnnouncementsEdit ();
}
/*****************************************************************************/
@ -327,7 +327,7 @@ void Exa_ReceiveExamAnnouncement (void)
static void Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (long ExaCod,unsigned NumUsrsToBeNotifiedByEMail)
{
char Query[512];
char Query[256];
/***** Update number of users notified *****/
sprintf (Query,"UPDATE exam_announcements SET NumNotif=NumNotif+'%u'"
@ -342,20 +342,18 @@ static void Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (long ExaCod,u
void Exa_PrintExamAnnouncement (void)
{
long ExaCod;
/***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement ();
/***** Get the code of the exam announcement *****/
if ((ExaCod = Exa_GetParamExaCod ()) <= 0)
if ((Gbl.ExamAnnouncements.ExaDat.ExaCod = Exa_GetParamExaCod ()) <= 0)
Lay_ShowErrorAndExit ("Code of exam announcement is missing.");
/***** Read exam announcement from the database *****/
Exa_GetDataExamAnnouncementFromDB (ExaCod);
Exa_GetDataExamAnnouncementFromDB ();
/***** Show exam announcement *****/
Exa_ShowExamAnnouncement (ExaCod,Exa_PRINT_VIEW);
Exa_ShowExamAnnouncement (Exa_PRINT_VIEW);
/***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement ();
@ -369,10 +367,9 @@ void Exa_ReqRemoveExamAnnouncement (void)
{
extern const char *Txt_Do_you_really_want_to_remove_the_following_announcement_of_exam;
extern const char *Txt_Remove;
long ExaCod;
/***** Get the code of the exam announcement *****/
if ((ExaCod = Exa_GetParamExaCod ()) <= 0)
if ((Gbl.ExamAnnouncements.ExaDat.ExaCod = Exa_GetParamExaCod ()) <= 0)
Lay_ShowErrorAndExit ("Code of exam announcement is missing.");
/***** Message *****/
@ -380,13 +377,13 @@ void Exa_ReqRemoveExamAnnouncement (void)
/***** View announcement *****/
Exa_AllocMemExamAnnouncement ();
Exa_GetDataExamAnnouncementFromDB (ExaCod);
Exa_ShowExamAnnouncement (ExaCod,Exa_NORMAL_VIEW);
Exa_GetDataExamAnnouncementFromDB ();
Exa_ShowExamAnnouncement (Exa_NORMAL_VIEW);
Exa_FreeMemExamAnnouncement ();
/***** Button of confirmation of removing *****/
Act_FormStart (ActRemExaAnn);
Exa_PutHiddenParamExaCod (ExaCod);
Exa_PutParamExaCodToEdit ();
Lay_PutRemoveButton (Txt_Remove);
Act_FormEnd ();
}
@ -395,10 +392,9 @@ void Exa_ReqRemoveExamAnnouncement (void)
/************************ Remove an exam announcement ************************/
/*****************************************************************************/
void Exa_RemoveExamAnnouncement (void)
void Exa_RemoveExamAnnouncement1 (void)
{
extern const char *Txt_Announcement_of_exam_removed;
char Query[1024];
char Query[256];
long ExaCod;
/***** Get the code of the exam announcement *****/
@ -408,8 +404,9 @@ void Exa_RemoveExamAnnouncement (void)
/***** Mark the exam announcement as deleted in the database *****/
sprintf (Query,"UPDATE exam_announcements SET Status='%u'"
" WHERE ExaCod='%ld' AND CrsCod='%ld'",
(unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT,ExaCod,Gbl.CurrentCrs.Crs.CrsCod);
DB_QueryUPDATE (Query,"can not remove an exam announcement");
(unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT,
ExaCod,Gbl.CurrentCrs.Crs.CrsCod);
DB_QueryUPDATE (Query,"can not remove exam announcement");
/***** Mark possible notifications as removed *****/
Ntf_MarkNotifAsRemoved (Ntf_EVENT_EXAM_ANNOUNCEMENT,ExaCod);
@ -417,14 +414,83 @@ void Exa_RemoveExamAnnouncement (void)
/***** Mark possible social note as unavailable *****/
Soc_MarkSocialNoteAsUnavailableUsingNoteTypeAndCod (Soc_NOTE_EXAM_ANNOUNCEMENT,ExaCod);
/***** Update RSS of current course *****/
RSS_UpdateRSSFileForACrs (&Gbl.CurrentCrs.Crs);
}
void Exa_RemoveExamAnnouncement2 (void)
{
extern const char *Txt_Announcement_of_exam_removed;
/***** Write message *****/
Lay_ShowAlert (Lay_SUCCESS,Txt_Announcement_of_exam_removed);
/***** List again all the remaining exam announcements *****/
Exa_ListExamAnnouncementsEdit ();
}
/***** Update RSS of current course *****/
RSS_UpdateRSSFileForACrs (&Gbl.CurrentCrs.Crs);
/*****************************************************************************/
/************************ Hide an exam announcement **************************/
/*****************************************************************************/
void Exa_HideExamAnnouncement1 (void)
{
char Query[256];
long ExaCod;
/***** Get the code of the exam announcement *****/
if ((ExaCod = Exa_GetParamExaCod ()) <= 0)
Lay_ShowErrorAndExit ("Code of exam announcement is missing.");
/***** Mark the exam announcement as hidden in the database *****/
sprintf (Query,"UPDATE exam_announcements SET Status='%u'"
" WHERE ExaCod='%ld' AND CrsCod='%ld'",
(unsigned) Exa_HIDDEN_EXAM_ANNOUNCEMENT,
ExaCod,Gbl.CurrentCrs.Crs.CrsCod);
DB_QueryUPDATE (Query,"can not hide exam announcement");
}
void Exa_HideExamAnnouncement2 (void)
{
extern const char *Txt_Announcement_of_exam_is_now_hidden;
/***** Write message to show the change made *****/
Lay_ShowAlert (Lay_SUCCESS,Txt_Announcement_of_exam_is_now_hidden);
/***** Show exam announcements again *****/
Exa_ListExamAnnouncementsEdit ();
}
/*****************************************************************************/
/************************ Unhide an exam announcement ************************/
/*****************************************************************************/
void Exa_UnhideExamAnnouncement1 (void)
{
char Query[256];
long ExaCod;
/***** Get the code of the exam announcement *****/
if ((ExaCod = Exa_GetParamExaCod ()) <= 0)
Lay_ShowErrorAndExit ("Code of exam announcement is missing.");
/***** Mark the exam announcement as visible in the database *****/
sprintf (Query,"UPDATE exam_announcements SET Status='%u'"
" WHERE ExaCod='%ld' AND CrsCod='%ld'",
(unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT,
ExaCod,Gbl.CurrentCrs.Crs.CrsCod);
DB_QueryUPDATE (Query,"can not unhide exam announcement");
}
void Exa_UnhideExamAnnouncement2 (void)
{
extern const char *Txt_Announcement_of_exam_is_now_visible;
/***** Write message to show the change made *****/
Lay_ShowAlert (Lay_SUCCESS,Txt_Announcement_of_exam_is_now_visible);
/***** Show exam announcements again *****/
Exa_ListExamAnnouncementsEdit ();
}
/*****************************************************************************/
@ -484,24 +550,32 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx
extern const char *Txt_Announcements_of_exams;
extern const char *Txt_No_announcements_of_exams_of_X;
char Query[512];
char SubQueryStatus[64];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumExaAnn;
unsigned long NumExaAnns;
long ExaCod;
bool ICanEdit = (Gbl.Usrs.Me.LoggedRole == Rol_TEACHER ||
Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM);
/***** Build subquery about status depending on my role *****/
if (ICanEdit)
sprintf (SubQueryStatus,"Status<>'%u'",
(unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT);
else
sprintf (SubQueryStatus,"Status='%u'",
(unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT);
/***** Show one highlighted exam announcement *****/
if (Gbl.ExamAnnouncements.HighlightExaCod > 0)
{
/***** Get one exam announcement from database *****/
sprintf (Query,"SELECT ExaCod"
" FROM exam_announcements"
" WHERE ExaCod='%ld' AND CrsCod='%ld' AND Status<>'%u'",
" WHERE ExaCod='%ld'"
" AND CrsCod='%ld' AND %s",
Gbl.ExamAnnouncements.HighlightExaCod,
Gbl.CurrentCrs.Crs.CrsCod,
(unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT);
Gbl.CurrentCrs.Crs.CrsCod,SubQueryStatus);
NumExaAnns = DB_QuerySELECT (Query,&mysql_res,"can not get exam announcements in this course for listing");
/***** List the existing exam announcements *****/
@ -512,17 +586,17 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx
/***** Get the code of the exam announcement (row[0]) *****/
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%ld",&ExaCod) != 1)
if (sscanf (row[0],"%ld",&Gbl.ExamAnnouncements.ExaDat.ExaCod) != 1)
Lay_ShowErrorAndExit ("Wrong code of exam announcement.");
/***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement ();
/***** Read the data of the exam announcement *****/
Exa_GetDataExamAnnouncementFromDB (ExaCod);
Exa_GetDataExamAnnouncementFromDB ();
/***** Show exam announcement *****/
Exa_ShowExamAnnouncement (ExaCod,TypeViewExamAnnouncement);
Exa_ShowExamAnnouncement (TypeViewExamAnnouncement);
/***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement ();
@ -536,11 +610,10 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx
in current course for a date from database *****/
sprintf (Query,"SELECT ExaCod"
" FROM exam_announcements"
" WHERE CrsCod='%ld' AND Status<>'%u'"
" WHERE CrsCod='%ld' AND %s"
" AND DATE(ExamDate)='%s'"
" ORDER BY ExamDate DESC",
Gbl.CurrentCrs.Crs.CrsCod,
(unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT,
Gbl.CurrentCrs.Crs.CrsCod,SubQueryStatus,
Gbl.ExamAnnouncements.HighlightDate);
NumExaAnns = DB_QuerySELECT (Query,&mysql_res,"can not get exam announcements in this course for listing");
@ -552,17 +625,17 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx
/***** Get the code of the exam announcement (row[0]) *****/
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%ld",&ExaCod) != 1)
if (sscanf (row[0],"%ld",&Gbl.ExamAnnouncements.ExaDat.ExaCod) != 1)
Lay_ShowErrorAndExit ("Wrong code of exam announcement.");
/***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement ();
/***** Read the data of the exam announcement *****/
Exa_GetDataExamAnnouncementFromDB (ExaCod);
Exa_GetDataExamAnnouncementFromDB ();
/***** Show exam announcement *****/
Exa_ShowExamAnnouncement (ExaCod,TypeViewExamAnnouncement);
Exa_ShowExamAnnouncement (TypeViewExamAnnouncement);
/***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement ();
@ -573,10 +646,9 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx
in current course from database *****/
sprintf (Query,"SELECT ExaCod"
" FROM exam_announcements"
" WHERE CrsCod='%ld' AND Status<>'%u'"
" WHERE CrsCod='%ld' AND %s"
" ORDER BY ExamDate DESC",
Gbl.CurrentCrs.Crs.CrsCod,
(unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT);
Gbl.CurrentCrs.Crs.CrsCod,SubQueryStatus);
NumExaAnns = DB_QuerySELECT (Query,&mysql_res,"can not get exam announcements in this course for listing");
/***** Start frame *****/
@ -604,17 +676,17 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx
/***** Get the code of the exam announcement (row[0]) *****/
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%ld",&ExaCod) != 1)
if (sscanf (row[0],"%ld",&Gbl.ExamAnnouncements.ExaDat.ExaCod) != 1)
Lay_ShowErrorAndExit ("Wrong code of exam announcement.");
/***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement ();
/***** Read the data of the exam announcement *****/
Exa_GetDataExamAnnouncementFromDB (ExaCod);
Exa_GetDataExamAnnouncementFromDB ();
/***** Show exam announcement *****/
Exa_ShowExamAnnouncement (ExaCod,TypeViewExamAnnouncement);
Exa_ShowExamAnnouncement (TypeViewExamAnnouncement);
/***** Free memory of the exam announcement *****/
Exa_FreeMemExamAnnouncement ();
@ -680,7 +752,7 @@ static long Exa_AddExamAnnouncementToDB (void)
"NOW(),'%04u-%02u-%02u %02u:%02u:00','%02u:%02u:00','%s',"
"'%s','%s','%s','%s','%s','%s')",
Gbl.CurrentCrs.Crs.CrsCod,
(unsigned) Exa_ACTIVE_EXAM_ANNOUNCEMENT,
(unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT,
Gbl.ExamAnnouncements.ExaDat.CrsFullName,
Gbl.ExamAnnouncements.ExaDat.Year,
Gbl.ExamAnnouncements.ExaDat.Session,
@ -708,7 +780,7 @@ static long Exa_AddExamAnnouncementToDB (void)
/*************** Modify an exam announcement in the database *****************/
/*****************************************************************************/
static void Exa_ModifyExamAnnouncementInDB (long ExaCod)
static void Exa_ModifyExamAnnouncementInDB (void)
{
char *Query;
@ -739,7 +811,7 @@ static void Exa_ModifyExamAnnouncementInDB (long ExaCod)
Gbl.ExamAnnouncements.ExaDat.MatRequired,
Gbl.ExamAnnouncements.ExaDat.MatAllowed,
Gbl.ExamAnnouncements.ExaDat.OtherInfo,
ExaCod);
Gbl.ExamAnnouncements.ExaDat.ExaCod);
DB_QueryUPDATE (Query,"can not update an exam announcement");
free ((void *) Query);
}
@ -748,9 +820,9 @@ static void Exa_ModifyExamAnnouncementInDB (long ExaCod)
/******* Create a list with the dates of all the exam announcements **********/
/*****************************************************************************/
void Exa_CreateListOfExamAnnouncements (void)
void Exa_CreateListDatesOfExamAnnouncements (void)
{
char Query[512];
char Query[256];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumExaAnn;
@ -759,12 +831,13 @@ void Exa_CreateListOfExamAnnouncements (void)
if (Gbl.DB.DatabaseIsOpen)
{
/***** Get exam dates (no matter in what order)
of visible exam announcements
in current course from database *****/
sprintf (Query,"SELECT DISTINCT(DATE(ExamDate))"
" FROM exam_announcements" \
" WHERE CrsCod='%ld' AND Status<>'%u'",
" WHERE CrsCod='%ld' AND Status='%u'",
Gbl.CurrentCrs.Crs.CrsCod,
(unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT);
(unsigned) Exa_VISIBLE_EXAM_ANNOUNCEMENT);
NumExaAnns = DB_QuerySELECT (Query,&mysql_res,"can not get exam announcements in this course");
/***** The result of the query may be empty *****/
@ -819,22 +892,23 @@ void Exa_FreeListExamAnnouncements (void)
/******** Read the data of an exam announcement from the database ************/
/*****************************************************************************/
static void Exa_GetDataExamAnnouncementFromDB (long ExaCod)
static void Exa_GetDataExamAnnouncementFromDB (void)
{
char Query[512];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumExaAnns;
unsigned UnsignedNum;
unsigned Hour;
unsigned Minute;
unsigned Second;
/***** Get data of an exam announcement from database *****/
sprintf (Query,"SELECT CrsCod,CrsFullName,Year,ExamSession,"
sprintf (Query,"SELECT CrsCod,Status,CrsFullName,Year,ExamSession,"
"CallDate,ExamDate,Duration,Place,ExamMode,"
"Structure,DocRequired,MatRequired,MatAllowed,OtherInfo"
" FROM exam_announcements WHERE ExaCod='%ld'",
ExaCod);
Gbl.ExamAnnouncements.ExaDat.ExaCod);
NumExaAnns = DB_QuerySELECT (Query,&mysql_res,"can not get data of an exam announcement");
/***** The result of the query must have one row *****/
@ -847,60 +921,67 @@ static void Exa_GetDataExamAnnouncementFromDB (long ExaCod)
/* Code of the course in which the exam announcement is inserted (row[0]) */
Gbl.ExamAnnouncements.ExaDat.CrsCod = Str_ConvertStrCodToLongCod (row[0]);
/* Name of the course (row[1]) */
strcpy (Gbl.ExamAnnouncements.ExaDat.CrsFullName,row[1]);
/* Status of the exam announcement (row[1]) */
if (sscanf (row[1],"%u",&UnsignedNum) != 1)
Lay_ShowErrorAndExit ("Wrong status.");
if (UnsignedNum >= Exa_NUM_STATUS)
Lay_ShowErrorAndExit ("Wrong status.");
Gbl.ExamAnnouncements.ExaDat.Status = (Exa_ExamAnnouncementStatus_t) UnsignedNum;
/* Year (row[2]) */
if (sscanf (row[2],"%u",&Gbl.ExamAnnouncements.ExaDat.Year) != 1)
/* Name of the course (row[2]) */
strcpy (Gbl.ExamAnnouncements.ExaDat.CrsFullName,row[2]);
/* Year (row[3]) */
if (sscanf (row[3],"%u",&Gbl.ExamAnnouncements.ExaDat.Year) != 1)
Lay_ShowErrorAndExit ("Wrong year.");
/* Exam session (row[3]) */
strcpy (Gbl.ExamAnnouncements.ExaDat.Session,row[3]);
/* Exam session (row[4]) */
strcpy (Gbl.ExamAnnouncements.ExaDat.Session,row[4]);
/* Date of exam announcement (row[4]) */
if (sscanf (row[4],"%04u-%02u-%02u %02u:%02u:%02u",
/* Date of exam announcement (row[5]) */
if (sscanf (row[5],"%04u-%02u-%02u %02u:%02u:%02u",
&Gbl.ExamAnnouncements.ExaDat.CallDate.Year,
&Gbl.ExamAnnouncements.ExaDat.CallDate.Month,
&Gbl.ExamAnnouncements.ExaDat.CallDate.Day,
&Hour,&Minute,&Second) != 6)
Lay_ShowErrorAndExit ("Wrong date of exam announcement.");
/* Date of exam (row[5]) */
if (sscanf (row[5],"%04u-%02u-%02u %02u:%02u:%02u",
/* Date of exam (row[6]) */
if (sscanf (row[6],"%04u-%02u-%02u %02u:%02u:%02u",
&Gbl.ExamAnnouncements.ExaDat.ExamDate.Year,&Gbl.ExamAnnouncements.ExaDat.ExamDate.Month,&Gbl.ExamAnnouncements.ExaDat.ExamDate.Day,
&Gbl.ExamAnnouncements.ExaDat.StartTime.Hour,&Gbl.ExamAnnouncements.ExaDat.StartTime.Minute,&Second) != 6)
Lay_ShowErrorAndExit ("Wrong date of exam.");
/* Approximate duration (row[6]) */
if (sscanf (row[6],"%02u:%02u:%02u",&Gbl.ExamAnnouncements.ExaDat.Duration.Hour,&Gbl.ExamAnnouncements.ExaDat.Duration.Minute,&Second) != 3)
/* Approximate duration (row[7]) */
if (sscanf (row[7],"%02u:%02u:%02u",&Gbl.ExamAnnouncements.ExaDat.Duration.Hour,&Gbl.ExamAnnouncements.ExaDat.Duration.Minute,&Second) != 3)
Lay_ShowErrorAndExit ("Wrong duration of exam.");
/* Place (row[7]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.Place,row[7],Cns_MAX_BYTES_TEXT);
/* Place (row[8]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.Place,row[8],Cns_MAX_BYTES_TEXT);
Gbl.ExamAnnouncements.ExaDat.Place[Cns_MAX_BYTES_TEXT] = '\0';
/* Exam mode (row[8]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.Mode,row[8],Cns_MAX_BYTES_TEXT);
/* Exam mode (row[9]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.Mode,row[9],Cns_MAX_BYTES_TEXT);
Gbl.ExamAnnouncements.ExaDat.Mode[Cns_MAX_BYTES_TEXT] = '\0';
/* Structure (row[9]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.Structure,row[9],Cns_MAX_BYTES_TEXT);
/* Structure (row[10]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.Structure,row[10],Cns_MAX_BYTES_TEXT);
Gbl.ExamAnnouncements.ExaDat.Structure[Cns_MAX_BYTES_TEXT] = '\0';
/* Documentation required (row[10]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.DocRequired,row[10],Cns_MAX_BYTES_TEXT);
/* Documentation required (row[11]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.DocRequired,row[11],Cns_MAX_BYTES_TEXT);
Gbl.ExamAnnouncements.ExaDat.DocRequired[Cns_MAX_BYTES_TEXT] = '\0';
/* Material required (row[11]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.MatRequired,row[11],Cns_MAX_BYTES_TEXT);
/* Material required (row[12]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.MatRequired,row[12],Cns_MAX_BYTES_TEXT);
Gbl.ExamAnnouncements.ExaDat.MatRequired[Cns_MAX_BYTES_TEXT] = '\0';
/* Material allowed (row[12]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.MatAllowed,row[12],Cns_MAX_BYTES_TEXT);
/* Material allowed (row[13]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.MatAllowed,row[13],Cns_MAX_BYTES_TEXT);
Gbl.ExamAnnouncements.ExaDat.MatAllowed[Cns_MAX_BYTES_TEXT] = '\0';
/* Other information for students (row[13]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.OtherInfo,row[13],Cns_MAX_BYTES_TEXT);
/* Other information for students (row[14]) */
strncpy (Gbl.ExamAnnouncements.ExaDat.OtherInfo,row[14],Cns_MAX_BYTES_TEXT);
Gbl.ExamAnnouncements.ExaDat.OtherInfo[Cns_MAX_BYTES_TEXT] = '\0';
/***** Free structure that stores the query result *****/
@ -911,7 +992,7 @@ static void Exa_GetDataExamAnnouncementFromDB (long ExaCod)
/************ Show a form with the data of an exam announcement **************/
/*****************************************************************************/
static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement)
static void Exa_ShowExamAnnouncement (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement)
{
extern const char *Hlp_ASSESSMENT_Announcements_new_announcement;
extern const char *Hlp_ASSESSMENT_Announcements_edit_announcement;
@ -943,6 +1024,12 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t
struct Instit Ins;
char StrExamDate[Cns_MAX_LENGTH_DATE+1];
unsigned Year,Hour,Minute;
const char *ClassExaAnnouncement[Exa_NUM_STATUS] =
{
"EXA_ANN_VISIBLE", // Exa_VISIBLE_EXAM_ANNOUNCEMENT
"EXA_ANN_HIDDEN", // Exa_HIDDEN_EXAM_ANNOUNCEMENT
NULL, // Exa_DELETED_EXAM_ANNOUNCEMENT, Not applicable here
};
/***** Get data of institution of this degree *****/
Ins.InsCod = Gbl.CurrentIns.Ins.InsCod;
@ -963,25 +1050,24 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t
}
/***** Start frame *****/
Gbl.ExamAnnouncements.ExaCodToEdit = ExaCod; // Used as parameter in contextual links
Lay_StartRoundFrame ("625px",NULL,
TypeViewExamAnnouncement == Exa_NORMAL_VIEW ? Exa_PutIconsExamAnnouncement :
NULL,
TypeViewExamAnnouncement == Exa_FORM_VIEW ? ((ExaCod > 0) ? Hlp_ASSESSMENT_Announcements_edit_announcement :
Hlp_ASSESSMENT_Announcements_new_announcement) :
TypeViewExamAnnouncement == Exa_FORM_VIEW ? ((Gbl.ExamAnnouncements.ExaDat.ExaCod > 0) ? Hlp_ASSESSMENT_Announcements_edit_announcement :
Hlp_ASSESSMENT_Announcements_new_announcement) :
NULL);
if (TypeViewExamAnnouncement == Exa_FORM_VIEW)
{
/***** Start form *****/
Act_FormStart (ActRcvExaAnn);
if (ExaCod > 0)
Exa_PutHiddenParamExaCod (ExaCod);
if (Gbl.ExamAnnouncements.ExaDat.ExaCod > 0) // Existing announcement of exam
Exa_PutParamExaCodToEdit ();
}
fprintf (Gbl.F.Out,"<table class=\"CELLS_PAD_2\""
" style=\"width:100%%;"
" padding:25px 25px 125px 25px;\">"); // Bottom space used for signatures
/***** Start table *****/
fprintf (Gbl.F.Out,"<table class=\"%s CELLS_PAD_2\">",
ClassExaAnnouncement[Gbl.ExamAnnouncements.ExaDat.Status]);
/***** Institution logo *****/
fprintf (Gbl.F.Out,"<tr>" \
@ -1372,13 +1458,15 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t
fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncements.ExaDat.OtherInfo);
}
fprintf (Gbl.F.Out,"</td>" \
"</tr>" \
"</table>");
"</tr>");
/***** End table *****/
fprintf (Gbl.F.Out,"</table>");
/***** End frame *****/
if (TypeViewExamAnnouncement == Exa_FORM_VIEW)
Lay_EndRoundFrameWithButton ((ExaCod > 0) ? Lay_CONFIRM_BUTTON :
Lay_CREATE_BUTTON,
Lay_EndRoundFrameWithButton ((Gbl.ExamAnnouncements.ExaDat.ExaCod > 0) ? Lay_CONFIRM_BUTTON :
Lay_CREATE_BUTTON,
Txt_Publish_announcement_OF_EXAM);
else
Lay_EndRoundFrame ();
@ -1394,6 +1482,8 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t
static void Exa_PutIconsExamAnnouncement (void)
{
extern const char *Txt_Remove;
extern const char *Txt_Show;
extern const char *Txt_Hide;
extern const char *Txt_Edit;
extern const char *Txt_Print;
@ -1406,6 +1496,25 @@ static void Exa_PutIconsExamAnnouncement (void)
Txt_Remove,NULL,
NULL);
/***** Put form to hide/show exam announement *****/
switch (Gbl.ExamAnnouncements.ExaDat.Status)
{
case Exa_VISIBLE_EXAM_ANNOUNCEMENT:
Lay_PutContextualLink (ActHidExaAnn,Exa_PutParamExaCodToEdit,
"eye-on64x64.png",
Txt_Hide,NULL,
NULL);
break;
case Exa_HIDDEN_EXAM_ANNOUNCEMENT:
Lay_PutContextualLink (ActShoExaAnn,Exa_PutParamExaCodToEdit,
"eye-slash-on64x64.png",
Txt_Show,NULL,
NULL);
break;
case Exa_DELETED_EXAM_ANNOUNCEMENT: // Not applicable here
break;
}
/***** Link to edit this exam announcement *****/
Lay_PutContextualLink (ActEdiExaAnn,Exa_PutParamExaCodToEdit,
"edit64x64.png",
@ -1426,7 +1535,7 @@ static void Exa_PutIconsExamAnnouncement (void)
static void Exa_PutParamExaCodToEdit (void)
{
Exa_PutHiddenParamExaCod (Gbl.ExamAnnouncements.ExaCodToEdit);
Exa_PutHiddenParamExaCod (Gbl.ExamAnnouncements.ExaDat.ExaCod);
}
void Exa_PutHiddenParamExaCod (long ExaCod)
@ -1462,13 +1571,15 @@ void Exa_GetSummaryAndContentExamAnnouncement (char *SummaryStr,char **ContentSt
{
extern const char *Txt_hours_ABBREVIATION;
/***** Initializations *****/
Gbl.ExamAnnouncements.ExaDat.ExaCod = ExaCod;
SummaryStr[0] = '\0'; // Return nothing on error
/***** Allocate memory for the exam announcement *****/
Exa_AllocMemExamAnnouncement ();
/***** Get data of an exam announcement from database *****/
Exa_GetDataExamAnnouncementFromDB (ExaCod);
Exa_GetDataExamAnnouncementFromDB ();
/***** Content *****/
if (GetContent)

View File

@ -29,6 +29,9 @@
#include <stdbool.h> // For boolean type
#include "swad_constant.h"
#include "swad_date.h"
/*****************************************************************************/
/************************** Public types and constants ***********************/
/*****************************************************************************/
@ -40,22 +43,51 @@ typedef enum
Exa_FORM_VIEW,
} Exa_TypeViewExamAnnouncement_t;
#define Exa_NUM_STATUS 3
typedef enum
{
Exa_ACTIVE_EXAM_ANNOUNCEMENT = 0,
Exa_OBSOLETE_EXAM_ANNOUNCEMENT = 1,
Exa_DELETED_EXAM_ANNOUNCEMENT = 2,
Exa_VISIBLE_EXAM_ANNOUNCEMENT = 0,
Exa_HIDDEN_EXAM_ANNOUNCEMENT = 1,
Exa_DELETED_EXAM_ANNOUNCEMENT = 2,
} Exa_ExamAnnouncementStatus_t; // Don't change these numbers because they are used in database
struct ExamData
{
long ExaCod;
long CrsCod;
Exa_ExamAnnouncementStatus_t Status;
char CrsFullName[Cns_MAX_BYTES_STRING+1];
unsigned Year; // Number of year (0 (N.A.), 1, 2, 3, 4, 5, 6) in the degree
char Session[Cns_MAX_BYTES_STRING+1]; // Exam session is june, september, etc.
struct Date CallDate;
struct Date ExamDate;
struct Hour StartTime;
struct Hour Duration;
char *Place;
char *Mode;
char *Structure;
char *DocRequired;
char *MatRequired;
char *MatAllowed;
char *OtherInfo;
};
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
void Exa_PutFrmEditAExamAnnouncement (void);
void Exa_ReceiveExamAnnouncement (void);
void Exa_ReceiveExamAnnouncement1 (void);
void Exa_ReceiveExamAnnouncement2 (void);
void Exa_PrintExamAnnouncement (void);
void Exa_ReqRemoveExamAnnouncement (void);
void Exa_RemoveExamAnnouncement (void);
void Exa_RemoveExamAnnouncement1 (void);
void Exa_RemoveExamAnnouncement2 (void);
void Exa_HideExamAnnouncement1 (void);
void Exa_HideExamAnnouncement2 (void);
void Exa_UnhideExamAnnouncement1 (void);
void Exa_UnhideExamAnnouncement2 (void);
void Exa_FreeMemExamAnnouncement (void);
void Exa_FreeListExamAnnouncements (void);
void Exa_ListExamAnnouncementsSee (void);
@ -63,7 +95,7 @@ void Exa_ListExamAnnouncementsSee (void);
void Exa_GetExaCodToHighlight (void);
void Exa_GetDateToHighlight (void);
void Exa_CreateListOfExamAnnouncements (void);
void Exa_CreateListDatesOfExamAnnouncements (void);
void Exa_PutHiddenParamExaCod (long ExaCod);
void Exa_GetSummaryAndContentExamAnnouncement (char *SummaryStr,char **ContentStr,
long ExaCod,unsigned MaxChars,bool GetContent);

View File

@ -44,6 +44,7 @@
#include "swad_cryptography.h"
#include "swad_department.h"
#include "swad_degree_type.h"
#include "swad_exam.h"
#include "swad_file.h"
#include "swad_file_browser.h"
#include "swad_forum.h"
@ -486,27 +487,10 @@ struct Globals
{
struct Date *Lst; // List of dates of exam announcements
unsigned NumExaAnns; // Number of announcements of exam in the list
long ExaCodToEdit; // Used as parameter in contextual links
long HighlightExaCod; // Exam announcement to be highlighted
char HighlightDate[4+1+2+1+2+1]; // Date with exam announcements to be highlighted (in YYYY-MM-DD format)
struct
{
long CrsCod;
char CrsFullName[Cns_MAX_BYTES_STRING+1];
unsigned Year; // Number of year (0 (N.A.), 1, 2, 3, 4, 5, 6) in the degree
char Session[Cns_MAX_BYTES_STRING+1]; // Exam session is june, september, etc.
struct Date CallDate;
struct Date ExamDate;
struct Hour StartTime;
struct Hour Duration;
char *Place;
char *Mode;
char *Structure;
char *DocRequired;
char *MatRequired;
char *MatAllowed;
char *OtherInfo;
} ExaDat;
struct ExamData ExaDat;
bool NewExamAnnouncement;
} ExamAnnouncements;
struct
{

View File

@ -498,7 +498,7 @@ static void Lay_WriteScripts (void)
}
/***** Create list of calls for examination *****/
Exa_CreateListOfExamAnnouncements ();
Exa_CreateListDatesOfExamAnnouncements ();
/***** Write script to initialize variables used to draw months *****/
fprintf (Gbl.F.Out,"<script type=\"text/javascript\">\n"

View File

@ -2489,6 +2489,48 @@ const char *Txt_Announcement_of_exam_removed =
"Chamada para exame removida.";
#endif
const char *Txt_Announcement_of_exam_is_now_hidden =
#if L==1
"Convocatoria d'examen ara est&agrave; oculta.";
#elif L==2
"Aufruf zur Pr&uuml;fung ist jetzt ausgeblendet.";
#elif L==3
"Announcement of exam is now hidden.";
#elif L==4
"Convocatoria de examen ahora est&aacute; oculta.";
#elif L==5
"Convocation pour l'examen est maintenant cach&eacute;.";
#elif L==6
"Convocatoria de examen ahora est&aacute; oculta."; // Okoteve traducción
#elif L==7
"Appello d'esame &egrave; ora nascosto.";
#elif L==8
"Ogloszenie egzamin jest teraz ukryte.";
#elif L==9
"Chamada para exame &eacute; agora oculta.";
#endif
const char *Txt_Announcement_of_exam_is_now_visible =
#if L==1
"Convocatoria d'examen ara est&agrave; visible.";
#elif L==2
"Aufruf zur Pr&uuml;fung ist jetzt sichtbar.";
#elif L==3
"Announcement of exam is now visible.";
#elif L==4
"Convocatoria de examen ahora est&aacute; visible.";
#elif L==5
"Convocation pour l'examen est maintenant visible.";
#elif L==6
"Convocatoria de examen ahora est&aacute; visible."; // Okoteve traducción
#elif L==7
"Appello d'esame &egrave; ora visibile.";
#elif L==8
"Ogloszenie egzamin jest teraz widoczny.";
#elif L==9
"Chamada para exame &eacute; agora vis&iacute;vel.";
#endif
const char *Txt_Announcements_of_exams =
#if L==1
"Convocat&ograve;ries d'ex&agrave;mens";