From c756157d8c2ebe32d31a5a5c728555cdd641c609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Wed, 1 Jun 2016 19:34:44 +0200 Subject: [PATCH] Version 15.216 --- js/{swad15.213.js => swad15.216.js} | 30 ++-- swad_QR.c | 2 +- swad_action.c | 51 +++---- swad_action.h | 133 ++++++++--------- swad_calendar.c | 20 +-- swad_changelog.h | 9 +- swad_date.h | 12 +- swad_exam.c | 215 ++++++++++++++++++---------- swad_exam.h | 3 + swad_global.c | 2 +- swad_global.h | 4 +- swad_menu.c | 4 +- swad_notice.c | 4 +- swad_notification.c | 6 +- swad_social.c | 4 +- swad_string.c | 6 +- swad_text.c | 8 +- 17 files changed, 303 insertions(+), 210 deletions(-) rename js/{swad15.213.js => swad15.216.js} (98%) diff --git a/js/swad15.213.js b/js/swad15.216.js similarity index 98% rename from js/swad15.213.js rename to js/swad15.216.js index a728e5af8..ffa23831c 100644 --- a/js/swad15.213.js +++ b/js/swad15.216.js @@ -1001,12 +1001,15 @@ function DrawMonth (id,FirstDayOfWeek,YearToDraw,MonthToDraw,CurrentMonth,Curren ]; var Hld_HOLIDAY = 0; var Hld_NON_SCHOOL_PERIOD = 1; - var Week; - var DayOfWeek; /* 0, 1, 2, 3, 4, 5, 6 */ - var Day; - var NumDaysInMonth; var Yea = YearToDraw; var Mon = MonthToDraw; + var Day; + var StrMon; + var StrDay; + var StrDate; + var Week; + var DayOfWeek; /* 0, 1, 2, 3, 4, 5, 6 */ + var NumDaysInMonth; var YYYYMMDD; var NumHld; var ClassForDay; // Class of day depending on type of day @@ -1139,11 +1142,12 @@ function DrawMonth (id,FirstDayOfWeek,YearToDraw,MonthToDraw,CurrentMonth,Curren Mon == LstExamAnnouncements[NumExamAnnouncement].Month && Day == LstExamAnnouncements[NumExamAnnouncement].Day) { ThisDayHasEvent = true; - if (!PrintView) - TextForDay = STR_EXAM + ': ' + - LstExamAnnouncements[NumExamAnnouncement].Year + '-' + - LstExamAnnouncements[NumExamAnnouncement].Month + '-' + - LstExamAnnouncements[NumExamAnnouncement].Day; + if (!PrintView) { + StrMon = ((Mon < 10) ? '0' : '') + Mon; + StrDay = ((Day < 10) ? '0' : '') + Day; + StrDate = Yea + '-' + StrMon + '-' + StrDay; + TextForDay = STR_EXAM + ': ' + StrDate; + } break; } @@ -1161,11 +1165,13 @@ function DrawMonth (id,FirstDayOfWeek,YearToDraw,MonthToDraw,CurrentMonth,Curren FormId = id + '_event_' + FormIdNum; Gbl_HTMLContent += '
' + FormEventParams + - '
'; } else { Gbl_HTMLContent += '
" "
", 300,300, - Cfg_HTTPS_URL_SWAD_CGI,Gbl.CurrentCrs.Crs.CrsCod,Act_Actions[ActSeeExaAnn].ActCod, + Cfg_HTTPS_URL_SWAD_CGI,Gbl.CurrentCrs.Crs.CrsCod,Act_Actions[ActSeeAllExaAnn].ActCod, Txt_Link_to_announcement_of_exam, Txt_Link_to_announcement_of_exam); } diff --git a/swad_action.c b/swad_action.c index 25336fa4d..a2112125d 100644 --- a/swad_action.c +++ b/swad_action.c @@ -695,7 +695,7 @@ Assessment: 551. ActReqAsgWrkCrs A teacher requests edition of works sent to the course 552. ActReqTst Request a test of self-assesment 553. ActSeeCal Show the academic calendar of the course with exam announcements - 554. ActSeeExaAnn Show the exam announcements + 554. ActSeeAllExaAnn Show the exam announcements 555. ActSeeAdmMrk Marks zone (see or admin) 556. ActEdiAss Edit the assessment system @@ -816,6 +816,7 @@ Assessment: 670. ActPrnCal Show print view of the academic calendar of the course 671. ActChgCal1stDay Change first day of week and show academic calendar of the course + NEW. ActSeeOneExaAnn Show one exam announcement highlighted 672. ActEdiExaAnn Edit an exam announcement 673. ActRcvExaAnn Receive an exam announcement 674. ActPrnExaAnn Show an exam announcement ready to be printed @@ -1232,7 +1233,7 @@ Social: Messages: 1047. ActSeeNtf Show my recent notifications 1048. ActSeeAnn Show global announcements - 1049. ActSeeNot Show notices + 1049. ActSeeAllNot Show all notices 1050. ActReqMsgUsr Write message to several users 1051. ActSeeRcvMsg Show the messages received from other users (link in menu) 1052. ActSeeSntMsg Show the messages sent to other users @@ -1242,7 +1243,7 @@ Messages: 1056. ActHidAnn Hide a global announcement that was active 1057. ActRevAnn Reveal a global announcement that was hidden 1058. ActRemAnn Remove global announcement - 1059. ActShoNot Show (expand) a notice + 1059. ActSeeOneNot Show (expand) a notice 1060. ActWriNot Write a new notice 1061. ActRcvNot Receive and create a new notice 1062. ActHidNot Hide a notice that was active @@ -2050,7 +2051,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActReqAsgWrkCrs */{ 899, 3,TabAss,ActReqAsgWrkCrs ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Brw_AskEditWorksCrs ,"folderusers64x64.gif" }, /* ActReqTst */{ 103, 4,TabAss,ActReqTst ,0x118,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Tst_ShowFormAskTst ,"test64x64.gif" }, /* ActSeeCal */{ 16, 5,TabAss,ActSeeCal ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Cal_DrawCalendar ,"date64x64.gif" }, - /* ActSeeExaAnn */{ 85, 6,TabAss,ActSeeExaAnn ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_ListExamAnnouncementsSee ,"announce64x64.gif" }, + /* ActSeeAllExaAnn */{ 85, 6,TabAss,ActSeeAllExaAnn ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_ListExamAnnouncementsSee ,"announce64x64.gif" }, /* ActSeeAdmMrk */{ 17, 7,TabAss,ActSeeAdmMrk ,0x118,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Brw_ShowFileBrowserOrWorks ,"grades64x64.gif" }, // Actions not in menu: @@ -2182,10 +2183,11 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActPrnCal */{ 71,-1,TabAss,ActSeeCal ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,Cal_DrawCalendar ,NULL}, /* ActChgCal1stDay */{1485,-1,TabAss,ActSeeCal ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Cal_ChangeFirstDayOfWeek ,Cal_DrawCalendar ,NULL}, - /* ActEdiExaAnn */{ 91,-1,TabAss,ActSeeExaAnn ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_PutFrmEditAExamAnnouncement,NULL}, - /* ActRcvExaAnn */{ 110,-1,TabAss,ActSeeExaAnn ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_ReceiveExamAnnouncement ,NULL}, - /* ActPrnExaAnn */{ 179,-1,TabAss,ActSeeExaAnn ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,Exa_PrintExamAnnouncement ,NULL}, - /* ActRemExaAnn */{ 187,-1,TabAss,ActSeeExaAnn ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_RemoveExamAnnouncement ,NULL}, + /* ActSeeOneExaAnn */{1571,-1,TabAss,ActSeeAllExaAnn ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Exa_GetExaToShowHighlighted ,Exa_ListExamAnnouncementsSee ,NULL}, + /* ActEdiExaAnn */{ 91,-1,TabAss,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_PutFrmEditAExamAnnouncement,NULL}, + /* ActRcvExaAnn */{ 110,-1,TabAss,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_ReceiveExamAnnouncement ,NULL}, + /* ActPrnExaAnn */{ 179,-1,TabAss,ActSeeAllExaAnn ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,Exa_PrintExamAnnouncement ,NULL}, + /* ActRemExaAnn */{ 187,-1,TabAss,ActSeeAllExaAnn ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Exa_RemoveExamAnnouncement ,NULL}, /* ActChgToSeeMrk */{1198,-1,TabAss,ActSeeAdmMrk ,0x118,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Brw_ShowFileBrowserOrWorks ,NULL}, @@ -2633,7 +2635,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = // Actions in menu: /* ActSeeNtf */{ 990, 0,TabMsg,ActSeeNtf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ntf_ShowMyNotifications ,"bell64x64.gif" }, /* ActSeeAnn */{1235, 1,TabMsg,ActSeeAnn ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ann_ShowAllAnnouncements ,"note64x64.gif" }, - /* ActSeeNot */{ 762, 2,TabMsg,ActSeeNot ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Not_ListFullNotices ,"note64x64.gif" }, + /* ActSeeAllNot */{ 762, 2,TabMsg,ActSeeAllNot ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Not_ListFullNotices ,"note64x64.gif" }, /* ActReqMsgUsr */{ 26, 3,TabMsg,ActReqMsgUsr ,0x1FC,0x1FC,0x1FC,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Msg_FormMsgUsrs ,"editnewmsg64x64.gif" }, /* ActSeeRcvMsg */{ 3, 4,TabMsg,ActSeeRcvMsg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Msg_ShowRecMsgs ,"recmsg64x64.gif" }, /* ActSeeSntMsg */{ 70, 5,TabMsg,ActSeeSntMsg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Msg_ShowSntMsgs ,"sntmsg64x64.gif" }, @@ -2646,13 +2648,13 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActRevAnn */{1471,-1,TabMsg,ActSeeAnn ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,Ann_RevealHiddenAnnouncement,Ann_ShowAllAnnouncements ,NULL}, /* ActRemAnn */{1236,-1,TabMsg,ActSeeAnn ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ann_RemoveAnnouncement ,NULL}, - /* ActShoNot */{1164,-1,TabMsg,ActSeeNot ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Not_GetNotToShowHighlighted ,Not_ListFullNotices ,NULL}, - /* ActWriNot */{ 59,-1,TabMsg,ActSeeNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Not_ShowFormNotice ,NULL}, - /* ActRcvNot */{ 60,-1,TabMsg,ActSeeNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Not_ReceiveNotice ,Not_ListFullNotices ,NULL}, - /* ActHidNot */{ 763,-1,TabMsg,ActSeeNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Not_HideActiveNotice ,Not_ListFullNotices ,NULL}, - /* ActRevNot */{ 764,-1,TabMsg,ActSeeNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Not_RevealHiddenNotice ,Not_ListFullNotices ,NULL}, - /* ActReqRemNot */{1472,-1,TabMsg,ActSeeNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Not_RequestRemNotice ,NULL}, - /* ActRemNot */{ 73,-1,TabMsg,ActSeeNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Not_RemoveNotice ,Not_ListNoticesAfterRemoval ,NULL}, + /* ActSeeOneNot */{1164,-1,TabMsg,ActSeeAllNot ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Not_GetNotToShowHighlighted ,Not_ListFullNotices ,NULL}, + /* ActWriNot */{ 59,-1,TabMsg,ActSeeAllNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Not_ShowFormNotice ,NULL}, + /* ActRcvNot */{ 60,-1,TabMsg,ActSeeAllNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Not_ReceiveNotice ,Not_ListFullNotices ,NULL}, + /* ActHidNot */{ 763,-1,TabMsg,ActSeeAllNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Not_HideActiveNotice ,Not_ListFullNotices ,NULL}, + /* ActRevNot */{ 764,-1,TabMsg,ActSeeAllNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Not_RevealHiddenNotice ,Not_ListFullNotices ,NULL}, + /* ActReqRemNot */{1472,-1,TabMsg,ActSeeAllNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Not_RequestRemNotice ,NULL}, + /* ActRemNot */{ 73,-1,TabMsg,ActSeeAllNot ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,Not_RemoveNotice ,Not_ListNoticesAfterRemoval ,NULL}, /* ActSeeNewNtf */{ 991,-1,TabMsg,ActSeeNtf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ntf_ShowMyNotifications ,NULL}, /* ActMrkNtfSee */{1146,-1,TabMsg,ActSeeNtf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ntf_MarkAllNotifAsSeen ,NULL}, @@ -2902,7 +2904,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq -1, // #82 (obsolete action) -1, // #83 (obsolete action) ActSeeUseGbl, // #84 - ActSeeExaAnn, // #85 + ActSeeAllExaAnn, // #85 -1, // #86 (obsolete action) ActRemAllStdCrs, // #87 ActReqRemAllStdCrs, // #88 @@ -3579,7 +3581,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq ActRemIns, // #759 -1, // #760 (obsolete action) ActReqUseGbl, // #761 - ActSeeNot, // #762 + ActSeeAllNot, // #762 ActHidNot, // #763 ActRevNot, // #764 ActRcvThrForGenTch, // #765 @@ -3981,7 +3983,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq ActRecCtrPho, // #1161 -1, // #1162 (obsolete action) ActCreUsrAcc, // #1163 - ActShoNot, // #1164 + ActSeeOneNot, // #1164 ActReqEdiMyIns, // #1165 ActChgCtyMyIns, // #1166 ActChgMyIns, // #1167 @@ -4391,6 +4393,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq ActCnfID_Oth, // #1568 ActCnfID_Std, // #1569 ActCnfID_Tch, // #1570 + ActSeeOneExaAnn, // #1571 }; /*****************************************************************************/ @@ -4540,7 +4543,7 @@ void Act_FormStartId (Act_Action_t NextAction,const char *Id) static void Act_FormStartInternal (Act_Action_t NextAction,bool PutParameterLocationIfNoSesion,const char *Id,const char *Anchor) { extern const char *Txt_STR_LANG_ID[1+Txt_NUM_LANGUAGES]; - char Params[256+256+Ses_LENGTH_SESSION_ID+256]; + char ParamsStr[256+256+Ses_LENGTH_SESSION_ID+256]; if (!Gbl.Form.Inside) { @@ -4566,15 +4569,15 @@ static void Act_FormStartInternal (Act_Action_t NextAction,bool PutParameterLoca fprintf (Gbl.F.Out," accept-charset=\"windows-1252\">"); /* Put basic form parameters */ - Act_SetParamsForm (Params,NextAction,PutParameterLocationIfNoSesion); - fprintf (Gbl.F.Out,"%s",Params); + Act_SetParamsForm (ParamsStr,NextAction,PutParameterLocationIfNoSesion); + fprintf (Gbl.F.Out,"%s",ParamsStr); Gbl.Form.Inside = true; } } // Params should have space for 256+256+Ses_LENGTH_SESSION_ID+256 bytes -void Act_SetParamsForm (char *Params,Act_Action_t NextAction,bool PutParameterLocationIfNoSesion) +void Act_SetParamsForm (char *ParamsStr,Act_Action_t NextAction,bool PutParameterLocationIfNoSesion) { char ParamAction[256]; char ParamSession[256+Ses_LENGTH_SESSION_ID]; @@ -4612,7 +4615,7 @@ void Act_SetParamsForm (char *Params,Act_Action_t NextAction,bool PutParameterLo Gbl.CurrentCty.Cty.CtyCod); } - sprintf (Params,"%s%s%s",ParamAction,ParamSession,ParamLocation); + sprintf (ParamsStr,"%s%s%s",ParamAction,ParamSession,ParamLocation); } void Act_FormEnd (void) diff --git a/swad_action.h b/swad_action.h index 583fe02de..b62c1d2fc 100644 --- a/swad_action.h +++ b/swad_action.h @@ -72,9 +72,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+15+90+70+67+245+184+150+172+36+28+83) +#define Act_NUM_ACTIONS (1+9+51+15+90+70+67+245+185+150+172+36+28+83) -#define Act_MAX_ACTION_COD 1570 +#define Act_MAX_ACTION_COD 1571 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20 @@ -718,7 +718,7 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica #define ActReqAsgWrkCrs (ActRcvRchTxtCrsLnk+ 4) #define ActReqTst (ActRcvRchTxtCrsLnk+ 5) #define ActSeeCal (ActRcvRchTxtCrsLnk+ 6) -#define ActSeeExaAnn (ActRcvRchTxtCrsLnk+ 7) +#define ActSeeAllExaAnn (ActRcvRchTxtCrsLnk+ 7) #define ActSeeAdmMrk (ActRcvRchTxtCrsLnk+ 8) // Secondary actions #define ActEdiAss (ActRcvRchTxtCrsLnk+ 9) @@ -847,72 +847,73 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica #define ActPrnCal (ActRcvRchTxtCrsLnk+123) #define ActChgCal1stDay (ActRcvRchTxtCrsLnk+124) -#define ActEdiExaAnn (ActRcvRchTxtCrsLnk+125) -#define ActRcvExaAnn (ActRcvRchTxtCrsLnk+126) -#define ActPrnExaAnn (ActRcvRchTxtCrsLnk+127) -#define ActRemExaAnn (ActRcvRchTxtCrsLnk+128) +#define ActSeeOneExaAnn (ActRcvRchTxtCrsLnk+125) +#define ActEdiExaAnn (ActRcvRchTxtCrsLnk+126) +#define ActRcvExaAnn (ActRcvRchTxtCrsLnk+127) +#define ActPrnExaAnn (ActRcvRchTxtCrsLnk+128) +#define ActRemExaAnn (ActRcvRchTxtCrsLnk+129) -#define ActChgToSeeMrk (ActRcvRchTxtCrsLnk+129) +#define ActChgToSeeMrk (ActRcvRchTxtCrsLnk+130) -#define ActSeeMrkCrs (ActRcvRchTxtCrsLnk+130) -#define ActExpSeeMrkCrs (ActRcvRchTxtCrsLnk+131) -#define ActConSeeMrkCrs (ActRcvRchTxtCrsLnk+132) -#define ActReqDatSeeMrkCrs (ActRcvRchTxtCrsLnk+133) -#define ActSeeMyMrkCrs (ActRcvRchTxtCrsLnk+134) +#define ActSeeMrkCrs (ActRcvRchTxtCrsLnk+131) +#define ActExpSeeMrkCrs (ActRcvRchTxtCrsLnk+132) +#define ActConSeeMrkCrs (ActRcvRchTxtCrsLnk+133) +#define ActReqDatSeeMrkCrs (ActRcvRchTxtCrsLnk+134) +#define ActSeeMyMrkCrs (ActRcvRchTxtCrsLnk+135) -#define ActSeeMrkGrp (ActRcvRchTxtCrsLnk+135) -#define ActExpSeeMrkGrp (ActRcvRchTxtCrsLnk+136) -#define ActConSeeMrkGrp (ActRcvRchTxtCrsLnk+137) -#define ActReqDatSeeMrkGrp (ActRcvRchTxtCrsLnk+138) -#define ActSeeMyMrkGrp (ActRcvRchTxtCrsLnk+139) +#define ActSeeMrkGrp (ActRcvRchTxtCrsLnk+136) +#define ActExpSeeMrkGrp (ActRcvRchTxtCrsLnk+137) +#define ActConSeeMrkGrp (ActRcvRchTxtCrsLnk+138) +#define ActReqDatSeeMrkGrp (ActRcvRchTxtCrsLnk+139) +#define ActSeeMyMrkGrp (ActRcvRchTxtCrsLnk+140) -#define ActChgToAdmMrk (ActRcvRchTxtCrsLnk+140) +#define ActChgToAdmMrk (ActRcvRchTxtCrsLnk+141) -#define ActAdmMrkCrs (ActRcvRchTxtCrsLnk+141) -#define ActReqRemFilMrkCrs (ActRcvRchTxtCrsLnk+142) -#define ActRemFilMrkCrs (ActRcvRchTxtCrsLnk+143) -#define ActRemFolMrkCrs (ActRcvRchTxtCrsLnk+144) -#define ActCopMrkCrs (ActRcvRchTxtCrsLnk+145) -#define ActPasMrkCrs (ActRcvRchTxtCrsLnk+146) -#define ActRemTreMrkCrs (ActRcvRchTxtCrsLnk+147) -#define ActFrmCreMrkCrs (ActRcvRchTxtCrsLnk+148) -#define ActCreFolMrkCrs (ActRcvRchTxtCrsLnk+149) -#define ActRenFolMrkCrs (ActRcvRchTxtCrsLnk+150) -#define ActRcvFilMrkCrsDZ (ActRcvRchTxtCrsLnk+151) -#define ActRcvFilMrkCrsCla (ActRcvRchTxtCrsLnk+152) -#define ActExpAdmMrkCrs (ActRcvRchTxtCrsLnk+153) -#define ActConAdmMrkCrs (ActRcvRchTxtCrsLnk+154) -#define ActZIPAdmMrkCrs (ActRcvRchTxtCrsLnk+155) -#define ActShoMrkCrs (ActRcvRchTxtCrsLnk+156) -#define ActHidMrkCrs (ActRcvRchTxtCrsLnk+157) -#define ActReqDatAdmMrkCrs (ActRcvRchTxtCrsLnk+158) -#define ActChgDatAdmMrkCrs (ActRcvRchTxtCrsLnk+159) -#define ActDowAdmMrkCrs (ActRcvRchTxtCrsLnk+160) -#define ActChgNumRowHeaCrs (ActRcvRchTxtCrsLnk+161) -#define ActChgNumRowFooCrs (ActRcvRchTxtCrsLnk+162) +#define ActAdmMrkCrs (ActRcvRchTxtCrsLnk+142) +#define ActReqRemFilMrkCrs (ActRcvRchTxtCrsLnk+143) +#define ActRemFilMrkCrs (ActRcvRchTxtCrsLnk+144) +#define ActRemFolMrkCrs (ActRcvRchTxtCrsLnk+145) +#define ActCopMrkCrs (ActRcvRchTxtCrsLnk+146) +#define ActPasMrkCrs (ActRcvRchTxtCrsLnk+147) +#define ActRemTreMrkCrs (ActRcvRchTxtCrsLnk+148) +#define ActFrmCreMrkCrs (ActRcvRchTxtCrsLnk+149) +#define ActCreFolMrkCrs (ActRcvRchTxtCrsLnk+150) +#define ActRenFolMrkCrs (ActRcvRchTxtCrsLnk+151) +#define ActRcvFilMrkCrsDZ (ActRcvRchTxtCrsLnk+152) +#define ActRcvFilMrkCrsCla (ActRcvRchTxtCrsLnk+153) +#define ActExpAdmMrkCrs (ActRcvRchTxtCrsLnk+154) +#define ActConAdmMrkCrs (ActRcvRchTxtCrsLnk+155) +#define ActZIPAdmMrkCrs (ActRcvRchTxtCrsLnk+156) +#define ActShoMrkCrs (ActRcvRchTxtCrsLnk+157) +#define ActHidMrkCrs (ActRcvRchTxtCrsLnk+158) +#define ActReqDatAdmMrkCrs (ActRcvRchTxtCrsLnk+159) +#define ActChgDatAdmMrkCrs (ActRcvRchTxtCrsLnk+160) +#define ActDowAdmMrkCrs (ActRcvRchTxtCrsLnk+161) +#define ActChgNumRowHeaCrs (ActRcvRchTxtCrsLnk+162) +#define ActChgNumRowFooCrs (ActRcvRchTxtCrsLnk+163) -#define ActAdmMrkGrp (ActRcvRchTxtCrsLnk+163) -#define ActReqRemFilMrkGrp (ActRcvRchTxtCrsLnk+164) -#define ActRemFilMrkGrp (ActRcvRchTxtCrsLnk+165) -#define ActRemFolMrkGrp (ActRcvRchTxtCrsLnk+166) -#define ActCopMrkGrp (ActRcvRchTxtCrsLnk+167) -#define ActPasMrkGrp (ActRcvRchTxtCrsLnk+168) -#define ActRemTreMrkGrp (ActRcvRchTxtCrsLnk+169) -#define ActFrmCreMrkGrp (ActRcvRchTxtCrsLnk+170) -#define ActCreFolMrkGrp (ActRcvRchTxtCrsLnk+171) -#define ActRenFolMrkGrp (ActRcvRchTxtCrsLnk+172) -#define ActRcvFilMrkGrpDZ (ActRcvRchTxtCrsLnk+173) -#define ActRcvFilMrkGrpCla (ActRcvRchTxtCrsLnk+174) -#define ActExpAdmMrkGrp (ActRcvRchTxtCrsLnk+175) -#define ActConAdmMrkGrp (ActRcvRchTxtCrsLnk+176) -#define ActZIPAdmMrkGrp (ActRcvRchTxtCrsLnk+177) -#define ActShoMrkGrp (ActRcvRchTxtCrsLnk+178) -#define ActHidMrkGrp (ActRcvRchTxtCrsLnk+179) -#define ActReqDatAdmMrkGrp (ActRcvRchTxtCrsLnk+180) -#define ActChgDatAdmMrkGrp (ActRcvRchTxtCrsLnk+181) -#define ActDowAdmMrkGrp (ActRcvRchTxtCrsLnk+182) -#define ActChgNumRowHeaGrp (ActRcvRchTxtCrsLnk+183) -#define ActChgNumRowFooGrp (ActRcvRchTxtCrsLnk+184) +#define ActAdmMrkGrp (ActRcvRchTxtCrsLnk+164) +#define ActReqRemFilMrkGrp (ActRcvRchTxtCrsLnk+165) +#define ActRemFilMrkGrp (ActRcvRchTxtCrsLnk+166) +#define ActRemFolMrkGrp (ActRcvRchTxtCrsLnk+167) +#define ActCopMrkGrp (ActRcvRchTxtCrsLnk+168) +#define ActPasMrkGrp (ActRcvRchTxtCrsLnk+169) +#define ActRemTreMrkGrp (ActRcvRchTxtCrsLnk+170) +#define ActFrmCreMrkGrp (ActRcvRchTxtCrsLnk+171) +#define ActCreFolMrkGrp (ActRcvRchTxtCrsLnk+172) +#define ActRenFolMrkGrp (ActRcvRchTxtCrsLnk+173) +#define ActRcvFilMrkGrpDZ (ActRcvRchTxtCrsLnk+174) +#define ActRcvFilMrkGrpCla (ActRcvRchTxtCrsLnk+175) +#define ActExpAdmMrkGrp (ActRcvRchTxtCrsLnk+176) +#define ActConAdmMrkGrp (ActRcvRchTxtCrsLnk+177) +#define ActZIPAdmMrkGrp (ActRcvRchTxtCrsLnk+178) +#define ActShoMrkGrp (ActRcvRchTxtCrsLnk+179) +#define ActHidMrkGrp (ActRcvRchTxtCrsLnk+180) +#define ActReqDatAdmMrkGrp (ActRcvRchTxtCrsLnk+181) +#define ActChgDatAdmMrkGrp (ActRcvRchTxtCrsLnk+182) +#define ActDowAdmMrkGrp (ActRcvRchTxtCrsLnk+183) +#define ActChgNumRowHeaGrp (ActRcvRchTxtCrsLnk+184) +#define ActChgNumRowFooGrp (ActRcvRchTxtCrsLnk+185) /*****************************************************************************/ /******************************* Users tab ***********************************/ @@ -1280,7 +1281,7 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica // Actions in menu #define ActSeeNtf (ActCht+ 1) #define ActSeeAnn (ActCht+ 2) -#define ActSeeNot (ActCht+ 3) +#define ActSeeAllNot (ActCht+ 3) #define ActReqMsgUsr (ActCht+ 4) #define ActSeeRcvMsg (ActCht+ 5) #define ActSeeSntMsg (ActCht+ 6) @@ -1291,7 +1292,7 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica #define ActHidAnn (ActCht+ 10) #define ActRevAnn (ActCht+ 11) #define ActRemAnn (ActCht+ 12) -#define ActShoNot (ActCht+ 13) +#define ActSeeOneNot (ActCht+ 13) #define ActWriNot (ActCht+ 14) #define ActRcvNot (ActCht+ 15) #define ActHidNot (ActCht+ 16) @@ -1497,7 +1498,7 @@ void Act_FormStartUnique (Act_Action_t NextAction); void Act_FormStartAnchor (Act_Action_t NextAction,const char *Anchor); void Act_FormStartUniqueAnchor (Act_Action_t NextAction,const char *Anchor); void Act_FormStartId (Act_Action_t NextAction,const char *Id); -void Act_SetParamsForm (char *Params,Act_Action_t NextAction,bool PutParameterLocationIfNoSesion); +void Act_SetParamsForm (char *ParamsStr,Act_Action_t NextAction,bool PutParameterLocationIfNoSesion); void Act_FormEnd (void); void Act_LinkFormSubmit (const char *Title,const char *LinkStyle); void Act_LinkFormSubmitUnique (const char *Title,const char *LinkStyle); diff --git a/swad_calendar.c b/swad_calendar.c index d12cc43c3..f9894f3fc 100644 --- a/swad_calendar.c +++ b/swad_calendar.c @@ -174,7 +174,7 @@ static unsigned Cal_GetParamFirstDayOfWeek (void) void Cal_DrawCurrentMonth (void) { extern const char *Txt_STR_LANG_ID[1+Txt_NUM_LANGUAGES]; - char Params[256+256+Ses_LENGTH_SESSION_ID+256]; + char ParamsStr[256+256+Ses_LENGTH_SESSION_ID+256]; /***** Get list of holidays *****/ if (!Gbl.Hlds.LstIsRead) @@ -197,11 +197,11 @@ void Cal_DrawCurrentMonth (void) Gbl.CurrentCtr.Ctr.PlcCod, Cfg_HTTPS_URL_SWAD_CGI, Txt_STR_LANG_ID[Gbl.Prefs.Language]); - Act_SetParamsForm (Params,ActSeeCal,true); - fprintf (Gbl.F.Out,"'%s',",Params); - Act_SetParamsForm (Params,ActSeeExaAnn,true); + Act_SetParamsForm (ParamsStr,ActSeeCal,true); + fprintf (Gbl.F.Out,"'%s',",ParamsStr); + Act_SetParamsForm (ParamsStr,ActSeeOneExaAnn,true); fprintf (Gbl.F.Out,"'%s');" - "",Params); + "",ParamsStr); } /*****************************************************************************/ @@ -228,7 +228,7 @@ void Cal_DrawCurrentMonth (void) void Cal_DrawCalendar (void) { extern const char *Txt_STR_LANG_ID[1+Txt_NUM_LANGUAGES]; - char Params[256+256+Ses_LENGTH_SESSION_ID+256]; + char ParamsStr[256+256+Ses_LENGTH_SESSION_ID+256]; bool PrintView = (Gbl.Action.Act == ActPrnCal); /***** Get list of holidays *****/ @@ -266,13 +266,13 @@ void Cal_DrawCalendar (void) "false", Cfg_HTTPS_URL_SWAD_CGI, Txt_STR_LANG_ID[Gbl.Prefs.Language]); - Act_SetParamsForm (Params,ActSeeCal,true); + Act_SetParamsForm (ParamsStr,ActSeeCal,true); fprintf (Gbl.F.Out,"'%s',", - Params); - Act_SetParamsForm (Params,ActSeeExaAnn,true); + ParamsStr); + Act_SetParamsForm (ParamsStr,ActSeeOneExaAnn,true); fprintf (Gbl.F.Out,"'%s');" "", - Params); + ParamsStr); /***** End frame *****/ Lay_EndRoundFrame (); diff --git a/swad_changelog.h b/swad_changelog.h index 37d072f43..55c937006 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -129,7 +129,6 @@ // TODO: FIX BUG: A teacher uploads a document in course documents zone, then he/she unregister from course, the he/she search for his/her documents, a document is shown in results but he/she can not view it // TODO: FIX BUG: Txt_Save_file_properties does not have sense in briefcase, because nothing to save (license should be editable in briefcase?) // TODO: In listing of courses, teachers column is before than students column. In edition of courses, students column is before teachers column. -// TODO: When clicking on an announcement, it will be shown alone, as now. // TODO: Check value returned by setlocale in all calls // TODO: Write "Tab > Action" in title of text in most frequent actions // TODO: Fix bug in copy-paste from Briefcase to another file browser @@ -139,13 +138,17 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.215 (2016-06-01)" +#define Log_PLATFORM_VERSION "SWAD 15.216 (2016-06-01)" #define CSS_FILE "swad15.210.css" -#define JS_FILE "swad15.213.js" +#define JS_FILE "swad15.216.js" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1 /* + Version 15.216: Jun 01, 2016 When clicking on an exam announcement, it will be shown alone. (201751 lines) + 1 change necessary in database: +INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1571','es','N','Ver convocatoria'); + Version 15.215: Jun 01, 2016 List exam announcements as a list, like notices. (201670 lines) Version 15.214: May 31, 2016 Fixed bug in renaming test tags. (201589 lines) Version 15.213: May 31, 2016 Code refactoring related to renaming test tags. diff --git a/swad_date.h b/swad_date.h index ccbd4d6e2..54b3ead76 100644 --- a/swad_date.h +++ b/swad_date.h @@ -45,16 +45,22 @@ struct Date { - unsigned Day,Month,Year,Week; + unsigned Day; + unsigned Month; + unsigned Year; + unsigned Week; char YYYYMMDD[4+2+2+1]; }; struct Time { - unsigned Hour,Minute,Second; + unsigned Hour; + unsigned Minute; + unsigned Second; }; struct Hour { - unsigned Hour,Minute; + unsigned Hour; + unsigned Minute; }; struct DateTime { diff --git a/swad_exam.c b/swad_exam.c index c5ba29ce4..ceee053a5 100644 --- a/swad_exam.c +++ b/swad_exam.c @@ -82,7 +82,9 @@ 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_PutIconsExamAnnouncement (void); -static void Exa_PutParamExaCod (void); +static void Exa_PutParamExaCodToEdit (void); +static void Exa_PutHiddenParamExaCod (long ExaCod); +static long Exa_GetParamExaCod (void); static void Exa_GetNotifContentExamAnnouncement (char **ContentStr); @@ -118,13 +120,10 @@ void Exa_PutFrmEditAExamAnnouncement (void) static long Exa_GetParamsExamAnnouncement (void) { char UnsignedStr[10+1]; - char LongStr[1+10+1]; long ExaCod; /***** Get the code of the exam announcement *****/ - Par_GetParToText ("ExaCod",LongStr,1+10); - if (sscanf (LongStr,"%ld",&ExaCod) != 1) - ExaCod = -1; + ExaCod = Exa_GetParamExaCod (); /***** Get the name of the course (it is allowed to be different from the official name of the course) *****/ Par_GetParToText ("CrsName",Gbl.ExamAnnouncements.ExaDat.CrsFullName,Cns_MAX_BYTES_STRING); @@ -143,7 +142,10 @@ static long Exa_GetParamsExamAnnouncement (void) Par_GetParToText ("ExamSession",Gbl.ExamAnnouncements.ExaDat.Session,Cns_MAX_BYTES_STRING); /***** Get the data of the exam *****/ - Dat_GetDateFromForm ("ExamDay","ExamMonth","ExamYear",&Gbl.ExamAnnouncements.ExaDat.ExamDate.Day,&Gbl.ExamAnnouncements.ExaDat.ExamDate.Month,&Gbl.ExamAnnouncements.ExaDat.ExamDate.Year); + Dat_GetDateFromForm ("ExamDay","ExamMonth","ExamYear", + &Gbl.ExamAnnouncements.ExaDat.ExamDate.Day, + &Gbl.ExamAnnouncements.ExaDat.ExamDate.Month, + &Gbl.ExamAnnouncements.ExaDat.ExamDate.Year); if (Gbl.ExamAnnouncements.ExaDat.ExamDate.Day == 0 || Gbl.ExamAnnouncements.ExaDat.ExamDate.Month == 0 || Gbl.ExamAnnouncements.ExaDat.ExamDate.Year == 0) @@ -341,15 +343,13 @@ static void Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (long ExaCod,u void Exa_PrintExamAnnouncement (void) { - char LongStr[1+10+1]; long ExaCod; /***** Allocate memory for the exam announcement *****/ Exa_AllocMemExamAnnouncement (); /***** Get the code of the exam announcement *****/ - Par_GetParToText ("ExaCod",LongStr,1+10); - if (sscanf (LongStr,"%ld",&ExaCod) != 1) + if ((ExaCod = Exa_GetParamExaCod ()) <= 0) Lay_ShowErrorAndExit ("Code of exam announcement is missing."); /***** Read exam announcement from the database *****/ @@ -370,12 +370,10 @@ void Exa_RemoveExamAnnouncement (void) { extern const char *Txt_Announcement_of_exam_removed; char Query[1024]; - char LongStr[1+10+1]; long ExaCod; /***** Get the code of the exam announcement *****/ - Par_GetParToText ("ExaCod",LongStr,1+10); - if (sscanf (LongStr,"%ld",&ExaCod) != 1) + if ((ExaCod = Exa_GetParamExaCod ()) <= 0) Lay_ShowErrorAndExit ("Code of exam announcement is missing."); /***** Mark the exam announcement as deleted in the database *****/ @@ -406,22 +404,6 @@ void Exa_RemoveExamAnnouncement (void) void Exa_ListExamAnnouncementsSee (void) { - /***** Show highlighted exam announcement *****/ - if (Gbl.ExamAnnouncements.HighlightExaCod > 0) - { - /***** Allocate memory for the exam announcement *****/ - Exa_AllocMemExamAnnouncement (); - - /***** Read exam announcement from the database *****/ - Exa_GetDataExamAnnouncementFromDB (Gbl.ExamAnnouncements.HighlightExaCod); - - /***** Show exam announcement *****/ - Exa_ShowExamAnnouncement (Gbl.ExamAnnouncements.HighlightExaCod,Exa_NORMAL_VIEW); - - /***** Free memory of the exam announcement *****/ - Exa_FreeMemExamAnnouncement (); - } - /***** List all exam announcements *****/ Exa_ListExamAnnouncements (Exa_NORMAL_VIEW); @@ -440,6 +422,17 @@ static void Exa_ListExamAnnouncementsEdit (void) Exa_ListExamAnnouncements (Exa_NORMAL_VIEW); } +/*****************************************************************************/ +/*************** Get exam announcement to show highlighted *******************/ +/*****************************************************************************/ + +void Exa_GetExaToShowHighlighted (void) + { + /***** Get the date (in YYYY-MM-DD format) + of the exam announcements to highlight *****/ + Par_GetParToText ("Date",Gbl.ExamAnnouncements.HighlightDate,4+1+2+1+2); + } + /*****************************************************************************/ /******************** List all the exam announcements ************************/ /*****************************************************************************/ @@ -458,6 +451,46 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx bool ICanEdit = (Gbl.Usrs.Me.LoggedRole == Rol_TEACHER || Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM); + /***** Show highlighted exam announcement *****/ + if (Gbl.ExamAnnouncements.HighlightDate[0]) + { + /***** Get exam announcements (the most recent first) + in current course for a date from database *****/ + sprintf (Query,"SELECT ExaCod,ExamDate" + " FROM exam_announcements" + " WHERE CrsCod='%ld' AND Status<>'%u'" + " AND DATE(ExamDate)='%s'" + " ORDER BY ExamDate DESC", + Gbl.CurrentCrs.Crs.CrsCod, + (unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT, + Gbl.ExamAnnouncements.HighlightDate); + NumExaAnns = DB_QuerySELECT (Query,&mysql_res,"can not get exam announcements in this course for listing"); + + /***** List the existing exam announcements *****/ + for (NumExaAnn = 0; + NumExaAnn < NumExaAnns; + NumExaAnn++) + { + /***** Get the code of the exam announcement (row[0]) *****/ + row = mysql_fetch_row (mysql_res); + + if (sscanf (row[0],"%ld",&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); + + /***** Show exam announcement *****/ + Exa_ShowExamAnnouncement (ExaCod,TypeViewExamAnnouncement); + + /***** Free memory of the exam announcement *****/ + Exa_FreeMemExamAnnouncement (); + } + } + /***** Get exam announcements (the most recent first) in current course from database *****/ sprintf (Query,"SELECT ExaCod,ExamDate" @@ -470,8 +503,8 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx /***** Start frame *****/ Lay_StartRoundFrame (NULL, - Gbl.ExamAnnouncements.HighlightExaCod > 0 ? Txt_All_announcements_of_exam : - Txt_Announcements_of_exam, + Gbl.ExamAnnouncements.HighlightDate[0] ? Txt_All_announcements_of_exam : + Txt_Announcements_of_exam, ICanEdit ? Exa_PutIconToCreateNewExamAnnouncement : NULL); @@ -555,19 +588,32 @@ static long Exa_AddExamAnnouncementToDB (void) /***** Add exam announcement *****/ if ((Query = malloc (512+2*Cns_MAX_BYTES_STRING+7*Cns_MAX_BYTES_TEXT)) == NULL) Lay_ShowErrorAndExit ("Not enough memory to query database."); - sprintf (Query,"INSERT INTO exam_announcements (CrsCod,Status,NumNotif," - "CrsFullName,Year,ExamSession,CallDate,ExamDate,Duration,Place," + sprintf (Query,"INSERT INTO exam_announcements " + "(CrsCod,Status,NumNotif,CrsFullName,Year,ExamSession," + "CallDate,ExamDate,Duration,Place," "ExamMode,Structure,DocRequired,MatRequired,MatAllowed,OtherInfo)" - " VALUES ('%ld','%u','0','%s','%u','%s',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, - Gbl.ExamAnnouncements.ExaDat.CrsFullName,Gbl.ExamAnnouncements.ExaDat.Year,Gbl.ExamAnnouncements.ExaDat.Session, - 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, - Gbl.ExamAnnouncements.ExaDat.Duration.Hour,Gbl.ExamAnnouncements.ExaDat.Duration.Minute, + " VALUES " + "('%ld','%u','0','%s','%u','%s'," + "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, + Gbl.ExamAnnouncements.ExaDat.CrsFullName, + Gbl.ExamAnnouncements.ExaDat.Year, + Gbl.ExamAnnouncements.ExaDat.Session, + 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, + Gbl.ExamAnnouncements.ExaDat.Duration.Hour, + Gbl.ExamAnnouncements.ExaDat.Duration.Minute, Gbl.ExamAnnouncements.ExaDat.Place, - Gbl.ExamAnnouncements.ExaDat.Mode,Gbl.ExamAnnouncements.ExaDat.Structure, + Gbl.ExamAnnouncements.ExaDat.Mode, + Gbl.ExamAnnouncements.ExaDat.Structure, Gbl.ExamAnnouncements.ExaDat.DocRequired, - Gbl.ExamAnnouncements.ExaDat.MatRequired,Gbl.ExamAnnouncements.ExaDat.MatAllowed, + Gbl.ExamAnnouncements.ExaDat.MatRequired, + Gbl.ExamAnnouncements.ExaDat.MatAllowed, Gbl.ExamAnnouncements.ExaDat.OtherInfo); ExaCod = DB_QueryINSERTandReturnCode (Query,"can not create a new exam announcement"); free ((void *) Query); @@ -588,17 +634,27 @@ static void Exa_ModifyExamAnnouncementInDB (long ExaCod) Lay_ShowErrorAndExit ("Not enough memory to query database."); sprintf (Query,"UPDATE exam_announcements" " SET CrsFullName='%s',Year='%u',ExamSession='%s'," - "ExamDate='%04u-%02u-%02u %02u:%02u:00',Duration='%02u:%02u:00'," - "Place='%s',ExamMode='%s',Structure='%s',DocRequired='%s',MatRequired='%s',MatAllowed='%s',OtherInfo='%s'" \ + "ExamDate='%04u-%02u-%02u %02u:%02u:00'," + "Duration='%02u:%02u:00'," + "Place='%s',ExamMode='%s',Structure='%s'," + "DocRequired='%s',MatRequired='%s',MatAllowed='%s',OtherInfo='%s'" \ " WHERE ExaCod='%ld'", - Gbl.ExamAnnouncements.ExaDat.CrsFullName,Gbl.ExamAnnouncements.ExaDat.Year,Gbl.ExamAnnouncements.ExaDat.Session, - 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, - Gbl.ExamAnnouncements.ExaDat.Duration.Hour,Gbl.ExamAnnouncements.ExaDat.Duration.Minute, + Gbl.ExamAnnouncements.ExaDat.CrsFullName, + Gbl.ExamAnnouncements.ExaDat.Year, + Gbl.ExamAnnouncements.ExaDat.Session, + 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, + Gbl.ExamAnnouncements.ExaDat.Duration.Hour, + Gbl.ExamAnnouncements.ExaDat.Duration.Minute, Gbl.ExamAnnouncements.ExaDat.Place, - Gbl.ExamAnnouncements.ExaDat.Mode,Gbl.ExamAnnouncements.ExaDat.Structure, + Gbl.ExamAnnouncements.ExaDat.Mode, + Gbl.ExamAnnouncements.ExaDat.Structure, Gbl.ExamAnnouncements.ExaDat.DocRequired, - Gbl.ExamAnnouncements.ExaDat.MatRequired,Gbl.ExamAnnouncements.ExaDat.MatAllowed, + Gbl.ExamAnnouncements.ExaDat.MatRequired, + Gbl.ExamAnnouncements.ExaDat.MatAllowed, Gbl.ExamAnnouncements.ExaDat.OtherInfo, ExaCod); DB_QueryUPDATE (Query,"can not update an exam announcement"); @@ -614,16 +670,14 @@ void Exa_CreateListOfExamAnnouncements (void) char Query[512]; MYSQL_RES *mysql_res; MYSQL_ROW row; - unsigned long NumExaAnn,NumExaAnns; - long ExaCod; - struct Date ExamDate; - unsigned Hour,Minute,Second; + unsigned long NumExaAnn; + unsigned long NumExaAnns; if (Gbl.DB.DatabaseIsOpen) { - /***** Get exam announcements (no matter in what order) + /***** Get exam dates (no matter in what order) in current course from database *****/ - sprintf (Query,"SELECT ExaCod,ExamDate" + sprintf (Query,"SELECT DISTINCT(DATE(ExamDate))" " FROM exam_announcements" \ " WHERE CrsCod='%ld' AND Status<>'%u'", Gbl.CurrentCrs.Crs.CrsCod, @@ -644,22 +698,17 @@ void Exa_CreateListOfExamAnnouncements (void) NumExaAnn < NumExaAnns; NumExaAnn++) { - /***** Get the code of the exam announcement (row[0]) *****/ + /***** Get next exam announcement *****/ row = mysql_fetch_row (mysql_res); - if (sscanf (row[0],"%ld",&ExaCod) != 1) - Lay_ShowErrorAndExit ("Wrong code of exam announcement."); - - /***** Read the date of the exam (row[1]) *****/ - /* Date of exam (row[6]) */ - if (sscanf (row[1],"%04u-%02u-%02u %02u:%02u:%02u", - &ExamDate.Year,&ExamDate.Month,&ExamDate.Day,&Hour,&Minute,&Second) != 6) + /* Read the date of the exam (row[0]) */ + if (sscanf (row[0],"%04u-%02u-%02u", + &Gbl.ExamAnnouncements.Lst[Gbl.ExamAnnouncements.NumExaAnns].Year, + &Gbl.ExamAnnouncements.Lst[Gbl.ExamAnnouncements.NumExaAnns].Month, + &Gbl.ExamAnnouncements.Lst[Gbl.ExamAnnouncements.NumExaAnns].Day) != 3) Lay_ShowErrorAndExit ("Wrong date of exam."); - /***** Add exam announcement the list *****/ - Gbl.ExamAnnouncements.Lst[Gbl.ExamAnnouncements.NumExaAnns].Year = ExamDate.Year; - Gbl.ExamAnnouncements.Lst[Gbl.ExamAnnouncements.NumExaAnns].Month = ExamDate.Month; - Gbl.ExamAnnouncements.Lst[Gbl.ExamAnnouncements.NumExaAnns].Day = ExamDate.Day; + /***** Increment number of elements in list *****/ Gbl.ExamAnnouncements.NumExaAnns++; } } @@ -839,7 +888,7 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t /***** Start form *****/ Act_FormStart (ActRcvExaAnn); if (ExaCod > 0) - Par_PutHiddenParamLong ("ExaCod",ExaCod); + Exa_PutHiddenParamExaCod (ExaCod); } fprintf (Gbl.F.Out,""); - Act_FormStart (ActShoNot); + Act_FormStart (ActSeeOneNot); Not_PutHiddenParamNotCod (NotCod); Act_LinkFormSubmit (Txt_See_full_notice,The_ClassForm[Gbl.Prefs.Theme]); fprintf (Gbl.F.Out," void Str_InsertLinks (char *Txt,unsigned long MaxLength,size_t MaxCharsURLOnScreen) { extern const char *Txt_STR_LANG_ID[1+Txt_NUM_LANGUAGES]; - char Params[256+256+Ses_LENGTH_SESSION_ID+256]; + char ParamsStr[256+256+Ses_LENGTH_SESSION_ID+256]; char Anchor1Nick[256+256+256+Ses_LENGTH_SESSION_ID+256+256]; char Anchor2Nick[256+Cry_LENGTH_ENCRYPTED_STR_SHA256_BASE64]; size_t TxtLength; @@ -303,7 +303,7 @@ void Str_InsertLinks (char *Txt,unsigned long MaxLength,size_t MaxCharsURLOnScre sprintf (Gbl.Form.Id,"form_%d",Gbl.Form.Num); /* Store first part of anchor */ - Act_SetParamsForm (Params,ActSeePubPrf,true); + Act_SetParamsForm (ParamsStr,ActSeePubPrf,true); sprintf (Anchor1Nick,"" "%s" "