diff --git a/swad_assignment.c b/swad_assignment.c index c08c807ac..4b9131314 100644 --- a/swad_assignment.c +++ b/swad_assignment.c @@ -223,7 +223,7 @@ static void Asg_PutIconToCreateNewAsg (void) } /*****************************************************************************/ -/******************* Put button to create a new assignment *******************/ +/****************** Put button to create a new assignment ********************/ /*****************************************************************************/ static void Asg_PutButtonToCreateNewAsg (void) diff --git a/swad_calendar.c b/swad_calendar.c index 06caea17a..d12cc43c3 100644 --- a/swad_calendar.c +++ b/swad_calendar.c @@ -183,9 +183,6 @@ void Cal_DrawCurrentMonth (void) Hld_GetListHolidays (); } - /***** Create list of dates of exam announcements *****/ - Exa_CreateListOfExamAnnouncements (); - /***** Draw the month in JavaScript *****/ /* JavaScript will write HTML here */ fprintf (Gbl.F.Out,"
" @@ -205,9 +202,6 @@ void Cal_DrawCurrentMonth (void) Act_SetParamsForm (Params,ActSeeExaAnn,true); fprintf (Gbl.F.Out,"'%s');" "",Params); - - /***** Free list of dates of exam announcements *****/ - Exa_FreeListExamAnnouncements (); } /*****************************************************************************/ @@ -244,9 +238,6 @@ void Cal_DrawCalendar (void) Hld_GetListHolidays (); } - /***** Create list of calls for examination *****/ - Exa_CreateListOfExamAnnouncements (); - /***** Start frame *****/ Lay_StartRoundFrame (NULL,NULL,PrintView ? NULL : Cal_PutIconToPrintCalendar); @@ -283,9 +274,6 @@ void Cal_DrawCalendar (void) "", Params); - /***** Free list of dates of exam announcements *****/ - Exa_FreeListExamAnnouncements (); - /***** End frame *****/ Lay_EndRoundFrame (); } diff --git a/swad_changelog.h b/swad_changelog.h index 3b1c1bd44..37d072f43 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -129,7 +129,7 @@ // 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: List exam announcement as a list, like assignments. When clicking on an announcement, it will be shown alone, as now. +// 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 +139,14 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.214 (2016-05-31)" +#define Log_PLATFORM_VERSION "SWAD 15.215 (2016-06-01)" #define CSS_FILE "swad15.210.css" #define JS_FILE "swad15.213.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.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. Fixed bug in dates reported by Christian A. Morillas Gutiérrez. (201581 lines) diff --git a/swad_degree.c b/swad_degree.c index 98b542828..2ae568a90 100644 --- a/swad_degree.c +++ b/swad_degree.c @@ -58,7 +58,6 @@ /*****************************************************************************/ extern struct Globals Gbl; -extern const char *Inf_FileNamesForInfoType[Inf_NUM_INFO_TYPES]; /*****************************************************************************/ /*************************** Public constants ********************************/ diff --git a/swad_exam.c b/swad_exam.c index 67359a7d1..c5ba29ce4 100644 --- a/swad_exam.c +++ b/swad_exam.c @@ -74,6 +74,9 @@ static void Exa_AllocMemExamAnnouncement (void); static void Exa_UpdateNumUsrsNotifiedByEMailAboutExamAnnouncement (long ExaCod,unsigned NumUsrsToBeNotifiedByEMail); static void Exa_ListExamAnnouncementsEdit (void); static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement); +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); @@ -97,7 +100,7 @@ void Exa_PutFrmEditAExamAnnouncement (void) /***** Get the code of the exam announcement *****/ ExaCod = Exa_GetParamsExamAnnouncement (); - if (ExaCod >= 0) // -1 indicates that this is a new exam announcement + if (ExaCod > 0) // -1 indicates that this is a new exam announcement /***** Read exam announcement from the database *****/ Exa_GetDataExamAnnouncementFromDB (ExaCod); @@ -124,76 +127,76 @@ static long Exa_GetParamsExamAnnouncement (void) ExaCod = -1; /***** Get the name of the course (it is allowed to be different from the official name of the course) *****/ - Par_GetParToText ("CrsName",Gbl.ExamAnnouncement.CrsFullName,Cns_MAX_BYTES_STRING); + Par_GetParToText ("CrsName",Gbl.ExamAnnouncements.ExaDat.CrsFullName,Cns_MAX_BYTES_STRING); // If the parameter is not present or is empty, initialize the string to the full name of the current course - if (!Gbl.ExamAnnouncement.CrsFullName[0]) - strcpy (Gbl.ExamAnnouncement.CrsFullName,Gbl.CurrentCrs.Crs.FullName); + if (!Gbl.ExamAnnouncements.ExaDat.CrsFullName[0]) + strcpy (Gbl.ExamAnnouncements.ExaDat.CrsFullName,Gbl.CurrentCrs.Crs.FullName); /***** Get the year *****/ Par_GetParToText ("Year",UnsignedStr,10); - if (sscanf (UnsignedStr,"%u",&Gbl.ExamAnnouncement.Year) != 1) - Gbl.ExamAnnouncement.Year = Gbl.CurrentCrs.Crs.Year; - if (Gbl.ExamAnnouncement.Year > Deg_MAX_YEARS_PER_DEGREE) - Gbl.ExamAnnouncement.Year = Gbl.CurrentCrs.Crs.Year; + if (sscanf (UnsignedStr,"%u",&Gbl.ExamAnnouncements.ExaDat.Year) != 1) + Gbl.ExamAnnouncements.ExaDat.Year = Gbl.CurrentCrs.Crs.Year; + if (Gbl.ExamAnnouncements.ExaDat.Year > Deg_MAX_YEARS_PER_DEGREE) + Gbl.ExamAnnouncements.ExaDat.Year = Gbl.CurrentCrs.Crs.Year; /***** Get the type of exam announcement *****/ - Par_GetParToText ("ExamSession",Gbl.ExamAnnouncement.Session,Cns_MAX_BYTES_STRING); + Par_GetParToText ("ExamSession",Gbl.ExamAnnouncements.ExaDat.Session,Cns_MAX_BYTES_STRING); /***** Get the data of the exam *****/ - Dat_GetDateFromForm ("ExamDay","ExamMonth","ExamYear",&Gbl.ExamAnnouncement.ExamDate.Day,&Gbl.ExamAnnouncement.ExamDate.Month,&Gbl.ExamAnnouncement.ExamDate.Year); - if (Gbl.ExamAnnouncement.ExamDate.Day == 0 || - Gbl.ExamAnnouncement.ExamDate.Month == 0 || - Gbl.ExamAnnouncement.ExamDate.Year == 0) + 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) { - Gbl.ExamAnnouncement.ExamDate.Day = Gbl.Now.Date.Day; - Gbl.ExamAnnouncement.ExamDate.Month = Gbl.Now.Date.Month; - Gbl.ExamAnnouncement.ExamDate.Year = Gbl.Now.Date.Year; + Gbl.ExamAnnouncements.ExaDat.ExamDate.Day = Gbl.Now.Date.Day; + Gbl.ExamAnnouncements.ExaDat.ExamDate.Month = Gbl.Now.Date.Month; + Gbl.ExamAnnouncements.ExaDat.ExamDate.Year = Gbl.Now.Date.Year; } /***** Get the hour of the exam *****/ Par_GetParToText ("ExamHour",UnsignedStr,10); - if (sscanf (UnsignedStr,"%u",&Gbl.ExamAnnouncement.StartTime.Hour) != 1) - Gbl.ExamAnnouncement.StartTime.Hour = 0; - if (Gbl.ExamAnnouncement.StartTime.Hour > 23) - Gbl.ExamAnnouncement.StartTime.Hour = 0; + if (sscanf (UnsignedStr,"%u",&Gbl.ExamAnnouncements.ExaDat.StartTime.Hour) != 1) + Gbl.ExamAnnouncements.ExaDat.StartTime.Hour = 0; + if (Gbl.ExamAnnouncements.ExaDat.StartTime.Hour > 23) + Gbl.ExamAnnouncements.ExaDat.StartTime.Hour = 0; Par_GetParToText ("ExamMinute",UnsignedStr,10); - if (sscanf (UnsignedStr,"%u",&Gbl.ExamAnnouncement.StartTime.Minute) != 1) - Gbl.ExamAnnouncement.StartTime.Minute = 0; - if (Gbl.ExamAnnouncement.StartTime.Minute > 59) - Gbl.ExamAnnouncement.StartTime.Minute = 0; + if (sscanf (UnsignedStr,"%u",&Gbl.ExamAnnouncements.ExaDat.StartTime.Minute) != 1) + Gbl.ExamAnnouncements.ExaDat.StartTime.Minute = 0; + if (Gbl.ExamAnnouncements.ExaDat.StartTime.Minute > 59) + Gbl.ExamAnnouncements.ExaDat.StartTime.Minute = 0; /***** Get the duration of the exam *****/ Par_GetParToText ("DurationHour",UnsignedStr,10); - if (sscanf (UnsignedStr,"%u",&Gbl.ExamAnnouncement.Duration.Hour) != 1) - Gbl.ExamAnnouncement.Duration.Hour = 0; - if (Gbl.ExamAnnouncement.Duration.Hour > 23) - Gbl.ExamAnnouncement.Duration.Hour = 0; + if (sscanf (UnsignedStr,"%u",&Gbl.ExamAnnouncements.ExaDat.Duration.Hour) != 1) + Gbl.ExamAnnouncements.ExaDat.Duration.Hour = 0; + if (Gbl.ExamAnnouncements.ExaDat.Duration.Hour > 23) + Gbl.ExamAnnouncements.ExaDat.Duration.Hour = 0; Par_GetParToText ("DurationMinute",UnsignedStr,10); - if (sscanf (UnsignedStr,"%u",&Gbl.ExamAnnouncement.Duration.Minute) != 1) - Gbl.ExamAnnouncement.Duration.Minute = 0; - if (Gbl.ExamAnnouncement.Duration.Minute > 59) - Gbl.ExamAnnouncement.Duration.Minute = 0; + if (sscanf (UnsignedStr,"%u",&Gbl.ExamAnnouncements.ExaDat.Duration.Minute) != 1) + Gbl.ExamAnnouncements.ExaDat.Duration.Minute = 0; + if (Gbl.ExamAnnouncements.ExaDat.Duration.Minute > 59) + Gbl.ExamAnnouncements.ExaDat.Duration.Minute = 0; /***** Get the place where the exam will happen *****/ - Par_GetParToHTML ("Place",Gbl.ExamAnnouncement.Place,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("Place",Gbl.ExamAnnouncements.ExaDat.Place,Cns_MAX_BYTES_TEXT); /***** Get the modality of exam *****/ - Par_GetParToHTML ("ExamMode",Gbl.ExamAnnouncement.Mode,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("ExamMode",Gbl.ExamAnnouncements.ExaDat.Mode,Cns_MAX_BYTES_TEXT); /***** Get the structure of exam *****/ - Par_GetParToHTML ("Structure",Gbl.ExamAnnouncement.Structure,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("Structure",Gbl.ExamAnnouncements.ExaDat.Structure,Cns_MAX_BYTES_TEXT); /***** Get the mandatory documentation *****/ - Par_GetParToHTML ("DocRequired",Gbl.ExamAnnouncement.DocRequired,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("DocRequired",Gbl.ExamAnnouncements.ExaDat.DocRequired,Cns_MAX_BYTES_TEXT); /***** Get the mandatory material *****/ - Par_GetParToHTML ("MatRequired",Gbl.ExamAnnouncement.MatRequired,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("MatRequired",Gbl.ExamAnnouncements.ExaDat.MatRequired,Cns_MAX_BYTES_TEXT); /***** Get the allowed material *****/ - Par_GetParToHTML ("MatAllowed",Gbl.ExamAnnouncement.MatAllowed,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("MatAllowed",Gbl.ExamAnnouncements.ExaDat.MatAllowed,Cns_MAX_BYTES_TEXT); /***** Get other information *****/ - Par_GetParToHTML ("OtherInfo",Gbl.ExamAnnouncement.OtherInfo,Cns_MAX_BYTES_TEXT); + Par_GetParToHTML ("OtherInfo",Gbl.ExamAnnouncements.ExaDat.OtherInfo,Cns_MAX_BYTES_TEXT); return ExaCod; } @@ -204,25 +207,25 @@ static long Exa_GetParamsExamAnnouncement (void) static void Exa_AllocMemExamAnnouncement (void) { - if ((Gbl.ExamAnnouncement.Place = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) + if ((Gbl.ExamAnnouncements.ExaDat.Place = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store exam announcement."); - if ((Gbl.ExamAnnouncement.Mode = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) + if ((Gbl.ExamAnnouncements.ExaDat.Mode = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store exam announcement."); - if ((Gbl.ExamAnnouncement.Structure = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) + if ((Gbl.ExamAnnouncements.ExaDat.Structure = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store exam announcement."); - if ((Gbl.ExamAnnouncement.DocRequired = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) + if ((Gbl.ExamAnnouncements.ExaDat.DocRequired = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store exam announcement."); - if ((Gbl.ExamAnnouncement.MatRequired = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) + if ((Gbl.ExamAnnouncements.ExaDat.MatRequired = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store exam announcement."); - if ((Gbl.ExamAnnouncement.MatAllowed = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) + if ((Gbl.ExamAnnouncements.ExaDat.MatAllowed = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store exam announcement."); - if ((Gbl.ExamAnnouncement.OtherInfo = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) + if ((Gbl.ExamAnnouncements.ExaDat.OtherInfo = malloc (Cns_MAX_BYTES_TEXT+1)) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store exam announcement."); } @@ -232,40 +235,40 @@ static void Exa_AllocMemExamAnnouncement (void) void Exa_FreeMemExamAnnouncement (void) { - if (Gbl.ExamAnnouncement.Place) + if (Gbl.ExamAnnouncements.ExaDat.Place) { - free ((void *) Gbl.ExamAnnouncement.Place); - Gbl.ExamAnnouncement.Place = NULL; + free ((void *) Gbl.ExamAnnouncements.ExaDat.Place); + Gbl.ExamAnnouncements.ExaDat.Place = NULL; } - if (Gbl.ExamAnnouncement.Mode) + if (Gbl.ExamAnnouncements.ExaDat.Mode) { - free ((void *) Gbl.ExamAnnouncement.Mode); - Gbl.ExamAnnouncement.Mode = NULL; + free ((void *) Gbl.ExamAnnouncements.ExaDat.Mode); + Gbl.ExamAnnouncements.ExaDat.Mode = NULL; } - if (Gbl.ExamAnnouncement.Structure) + if (Gbl.ExamAnnouncements.ExaDat.Structure) { - free ((void *) Gbl.ExamAnnouncement.Structure); - Gbl.ExamAnnouncement.Structure = NULL; + free ((void *) Gbl.ExamAnnouncements.ExaDat.Structure); + Gbl.ExamAnnouncements.ExaDat.Structure = NULL; } - if (Gbl.ExamAnnouncement.DocRequired) + if (Gbl.ExamAnnouncements.ExaDat.DocRequired) { - free ((void *) Gbl.ExamAnnouncement.DocRequired); - Gbl.ExamAnnouncement.DocRequired = NULL; + free ((void *) Gbl.ExamAnnouncements.ExaDat.DocRequired); + Gbl.ExamAnnouncements.ExaDat.DocRequired = NULL; } - if (Gbl.ExamAnnouncement.MatRequired) + if (Gbl.ExamAnnouncements.ExaDat.MatRequired) { - free ((void *) Gbl.ExamAnnouncement.MatRequired); - Gbl.ExamAnnouncement.MatRequired = NULL; + free ((void *) Gbl.ExamAnnouncements.ExaDat.MatRequired); + Gbl.ExamAnnouncements.ExaDat.MatRequired = NULL; } - if (Gbl.ExamAnnouncement.MatAllowed) + if (Gbl.ExamAnnouncements.ExaDat.MatAllowed) { - free ((void *) Gbl.ExamAnnouncement.MatAllowed); - Gbl.ExamAnnouncement.MatAllowed = NULL; + free ((void *) Gbl.ExamAnnouncements.ExaDat.MatAllowed); + Gbl.ExamAnnouncements.ExaDat.MatAllowed = NULL; } - if (Gbl.ExamAnnouncement.OtherInfo) + if (Gbl.ExamAnnouncements.ExaDat.OtherInfo) { - free ((void *) Gbl.ExamAnnouncement.OtherInfo); - Gbl.ExamAnnouncement.OtherInfo = NULL; + free ((void *) Gbl.ExamAnnouncements.ExaDat.OtherInfo); + Gbl.ExamAnnouncements.ExaDat.OtherInfo = NULL; } } @@ -403,12 +406,29 @@ 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); /***** Mark possible notifications as seen *****/ Ntf_MarkNotifAsSeen (Ntf_EVENT_EXAM_ANNOUNCEMENT, - -1L,Gbl.CurrentCrs.Crs.CrsCod, - Gbl.Usrs.Me.UsrDat.UsrCod); + -1L,Gbl.CurrentCrs.Crs.CrsCod, + Gbl.Usrs.Me.UsrDat.UsrCod); } /*****************************************************************************/ @@ -426,47 +446,47 @@ static void Exa_ListExamAnnouncementsEdit (void) static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewExamAnnouncement) { + extern const char *Txt_All_announcements_of_exam; + extern const char *Txt_Announcements_of_exam; extern const char *Txt_No_announcements_of_exams_of_X; - extern const char *Txt_New_announcement_OF_EXAM; char Query[512]; MYSQL_RES *mysql_res; MYSQL_ROW row; - unsigned long NumRow,NumRows; + unsigned long NumExaAnn; + unsigned long NumExaAnns; long ExaCod; + bool ICanEdit = (Gbl.Usrs.Me.LoggedRole == Rol_TEACHER || + Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM); - /***** Get exam announcements in current course from database *****/ - sprintf (Query,"SELECT ExaCod,ExamDate FROM exam_announcements" - " WHERE CrsCod='%ld' AND Status<>'%u' ORDER BY ExamDate", - Gbl.CurrentCrs.Crs.CrsCod,(unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT); - NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get exam announcements in this course for listing"); + /***** Get exam announcements (the most recent first) + in current course from database *****/ + sprintf (Query,"SELECT ExaCod,ExamDate" + " FROM exam_announcements" + " WHERE CrsCod='%ld' AND Status<>'%u'" + " ORDER BY ExamDate DESC", + Gbl.CurrentCrs.Crs.CrsCod, + (unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT); + NumExaAnns = DB_QuerySELECT (Query,&mysql_res,"can not get exam announcements in this course for listing"); + + /***** Start frame *****/ + Lay_StartRoundFrame (NULL, + Gbl.ExamAnnouncements.HighlightExaCod > 0 ? Txt_All_announcements_of_exam : + Txt_Announcements_of_exam, + ICanEdit ? Exa_PutIconToCreateNewExamAnnouncement : + NULL); /***** The result of the query may be empty *****/ - if (NumRows == 0) + if (!NumExaAnns) { sprintf (Gbl.Message,Txt_No_announcements_of_exams_of_X, Gbl.CurrentCrs.Crs.FullName); Lay_ShowAlert (Lay_INFO,Gbl.Message); } - /***** Create link for creation of a new exam announcement *****/ - switch (Gbl.Usrs.Me.LoggedRole) - { - case Rol_TEACHER: - case Rol_SYS_ADM: - fprintf (Gbl.F.Out,"
"); - Lay_PutContextualLink (ActEdiExaAnn,NULL, - "plus64x64.png", - Txt_New_announcement_OF_EXAM,Txt_New_announcement_OF_EXAM); - fprintf (Gbl.F.Out,"
"); - break; - default: - break; - } - /***** List the existing exam announcements *****/ - for (NumRow = 0; - NumRow < NumRows; - NumRow++) + for (NumExaAnn = 0; + NumExaAnn < NumExaAnns; + NumExaAnn++) { /***** Get the code of the exam announcement (row[0]) *****/ row = mysql_fetch_row (mysql_res); @@ -489,6 +509,37 @@ static void Exa_ListExamAnnouncements (Exa_TypeViewExamAnnouncement_t TypeViewEx /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); + + /***** Button to create a new assignment *****/ + if (ICanEdit) + Exa_PutButtonToCreateNewExamAnnouncement (); + + /***** End frame *****/ + Lay_EndRoundFrame (); + } + +/*****************************************************************************/ +/***************** Put icon to create a new exam announcement ****************/ +/*****************************************************************************/ + +static void Exa_PutIconToCreateNewExamAnnouncement (void) + { + extern const char *Txt_New_announcement_OF_EXAM; + + Lay_PutContextualLink (ActEdiExaAnn,NULL,"plus64x64.png",Txt_New_announcement_OF_EXAM,NULL); + } + +/*****************************************************************************/ +/**************** Put button to create a new exam announcement ***************/ +/*****************************************************************************/ + +static void Exa_PutButtonToCreateNewExamAnnouncement (void) + { + extern const char *Txt_New_announcement_OF_EXAM; + + Act_FormStart (ActEdiExaAnn); + Lay_PutConfirmButton (Txt_New_announcement_OF_EXAM); + Act_FormEnd (); } /*****************************************************************************/ @@ -509,15 +560,15 @@ static long Exa_AddExamAnnouncementToDB (void) "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.ExamAnnouncement.CrsFullName,Gbl.ExamAnnouncement.Year,Gbl.ExamAnnouncement.Session, - Gbl.ExamAnnouncement.ExamDate.Year,Gbl.ExamAnnouncement.ExamDate.Month,Gbl.ExamAnnouncement.ExamDate.Day, - Gbl.ExamAnnouncement.StartTime.Hour,Gbl.ExamAnnouncement.StartTime.Minute, - Gbl.ExamAnnouncement.Duration.Hour,Gbl.ExamAnnouncement.Duration.Minute, - Gbl.ExamAnnouncement.Place, - Gbl.ExamAnnouncement.Mode,Gbl.ExamAnnouncement.Structure, - Gbl.ExamAnnouncement.DocRequired, - Gbl.ExamAnnouncement.MatRequired,Gbl.ExamAnnouncement.MatAllowed, - Gbl.ExamAnnouncement.OtherInfo); + 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.DocRequired, + 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); @@ -540,15 +591,15 @@ static void Exa_ModifyExamAnnouncementInDB (long ExaCod) "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.ExamAnnouncement.CrsFullName,Gbl.ExamAnnouncement.Year,Gbl.ExamAnnouncement.Session, - Gbl.ExamAnnouncement.ExamDate.Year,Gbl.ExamAnnouncement.ExamDate.Month,Gbl.ExamAnnouncement.ExamDate.Day, - Gbl.ExamAnnouncement.StartTime.Hour,Gbl.ExamAnnouncement.StartTime.Minute, - Gbl.ExamAnnouncement.Duration.Hour,Gbl.ExamAnnouncement.Duration.Minute, - Gbl.ExamAnnouncement.Place, - Gbl.ExamAnnouncement.Mode,Gbl.ExamAnnouncement.Structure, - Gbl.ExamAnnouncement.DocRequired, - Gbl.ExamAnnouncement.MatRequired,Gbl.ExamAnnouncement.MatAllowed, - Gbl.ExamAnnouncement.OtherInfo, + 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.DocRequired, + Gbl.ExamAnnouncements.ExaDat.MatRequired,Gbl.ExamAnnouncements.ExaDat.MatAllowed, + Gbl.ExamAnnouncements.ExaDat.OtherInfo, ExaCod); DB_QueryUPDATE (Query,"can not update an exam announcement"); free ((void *) Query); @@ -563,32 +614,35 @@ void Exa_CreateListOfExamAnnouncements (void) char Query[512]; MYSQL_RES *mysql_res; MYSQL_ROW row; - unsigned long NumRow,NumRows; + unsigned long NumExaAnn,NumExaAnns; long ExaCod; struct Date ExamDate; unsigned Hour,Minute,Second; if (Gbl.DB.DatabaseIsOpen) { - /***** Get exam announcements in current course from database *****/ - sprintf (Query,"SELECT ExaCod,ExamDate FROM exam_announcements" \ - " WHERE CrsCod='%ld' AND Status<>'%u' ORDER BY ExamDate", - Gbl.CurrentCrs.Crs.CrsCod,(unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT); - NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get exam announcements in this course"); + /***** Get exam announcements (no matter in what order) + in current course from database *****/ + sprintf (Query,"SELECT ExaCod,ExamDate" + " FROM exam_announcements" \ + " WHERE CrsCod='%ld' AND Status<>'%u'", + Gbl.CurrentCrs.Crs.CrsCod, + (unsigned) Exa_DELETED_EXAM_ANNOUNCEMENT); + NumExaAnns = DB_QuerySELECT (Query,&mysql_res,"can not get exam announcements in this course"); /***** The result of the query may be empty *****/ - Gbl.LstExamAnnouncements.Lst = NULL; - Gbl.LstExamAnnouncements.NumExamAnnounc = 0; - if (NumRows) + Gbl.ExamAnnouncements.Lst = NULL; + Gbl.ExamAnnouncements.NumExaAnns = 0; + if (NumExaAnns) { /***** Allocate memory for the list *****/ - if ((Gbl.LstExamAnnouncements.Lst = (struct Date *) calloc (NumRows,sizeof (struct Date))) == NULL) + if ((Gbl.ExamAnnouncements.Lst = (struct Date *) calloc (NumExaAnns,sizeof (struct Date))) == NULL) Lay_ShowErrorAndExit ("Not enough memory to store dates of exam announcements."); /***** Get the dates of the existing exam announcements *****/ - for (NumRow = 0; - NumRow < NumRows; - NumRow++) + for (NumExaAnn = 0; + NumExaAnn < NumExaAnns; + NumExaAnn++) { /***** Get the code of the exam announcement (row[0]) *****/ row = mysql_fetch_row (mysql_res); @@ -603,10 +657,10 @@ void Exa_CreateListOfExamAnnouncements (void) Lay_ShowErrorAndExit ("Wrong date of exam."); /***** Add exam announcement the list *****/ - Gbl.LstExamAnnouncements.Lst[Gbl.LstExamAnnouncements.NumExamAnnounc].Year = ExamDate.Year; - Gbl.LstExamAnnouncements.Lst[Gbl.LstExamAnnouncements.NumExamAnnounc].Month = ExamDate.Month; - Gbl.LstExamAnnouncements.Lst[Gbl.LstExamAnnouncements.NumExamAnnounc].Day = ExamDate.Day; - Gbl.LstExamAnnouncements.NumExamAnnounc++; + 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; + Gbl.ExamAnnouncements.NumExaAnns++; } } @@ -621,11 +675,11 @@ void Exa_CreateListOfExamAnnouncements (void) void Exa_FreeListExamAnnouncements (void) { - if (Gbl.LstExamAnnouncements.Lst) + if (Gbl.ExamAnnouncements.Lst) { - free ((void *) Gbl.LstExamAnnouncements.Lst); - Gbl.LstExamAnnouncements.Lst = NULL; - Gbl.LstExamAnnouncements.NumExamAnnounc = 0; + free ((void *) Gbl.ExamAnnouncements.Lst); + Gbl.ExamAnnouncements.Lst = NULL; + Gbl.ExamAnnouncements.NumExaAnns = 0; } } @@ -638,80 +692,84 @@ static void Exa_GetDataExamAnnouncementFromDB (long ExaCod) char Query[512]; MYSQL_RES *mysql_res; MYSQL_ROW row; - unsigned long NumRows; - unsigned Hour,Minute,Second; + unsigned long NumExaAnns; + unsigned Hour; + unsigned Minute; + unsigned Second; /***** Get data of an exam announcement from database *****/ - sprintf (Query,"SELECT CrsCod,CrsFullName,Year,ExamSession,CallDate,ExamDate,Duration," \ - "Place,ExamMode,Structure,DocRequired,MatRequired,MatAllowed,OtherInfo" \ - " FROM exam_announcements WHERE ExaCod='%ld'",ExaCod); - NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get data of an exam announcement"); + sprintf (Query,"SELECT CrsCod,CrsFullName,Year,ExamSession," + "CallDate,ExamDate,Duration,Place,ExamMode," + "Structure,DocRequired,MatRequired,MatAllowed,OtherInfo" + " FROM exam_announcements WHERE ExaCod='%ld'", + ExaCod); + NumExaAnns = DB_QuerySELECT (Query,&mysql_res,"can not get data of an exam announcement"); /***** The result of the query must have one row *****/ - if (NumRows != 1) + if (NumExaAnns != 1) Lay_ShowErrorAndExit ("Error when getting data of an exam announcement."); /***** Get the data of the exam announcement *****/ row = mysql_fetch_row (mysql_res); /* Code of the course in which the exam announcement is inserted (row[0]) */ - Gbl.ExamAnnouncement.CrsCod = Str_ConvertStrCodToLongCod (row[0]); + Gbl.ExamAnnouncements.ExaDat.CrsCod = Str_ConvertStrCodToLongCod (row[0]); /* Name of the course (row[1]) */ - strcpy (Gbl.ExamAnnouncement.CrsFullName,row[1]); + strcpy (Gbl.ExamAnnouncements.ExaDat.CrsFullName,row[1]); /* Year (row[2]) */ - if (sscanf (row[2],"%u",&Gbl.ExamAnnouncement.Year) != 1) + if (sscanf (row[2],"%u",&Gbl.ExamAnnouncements.ExaDat.Year) != 1) Lay_ShowErrorAndExit ("Wrong year."); /* Exam session (row[3]) */ - strcpy (Gbl.ExamAnnouncement.Session,row[3]); + strcpy (Gbl.ExamAnnouncements.ExaDat.Session,row[3]); /* Date of exam announcement (row[4]) */ if (sscanf (row[4],"%04u-%02u-%02u %02u:%02u:%02u", - &Gbl.ExamAnnouncement.CallDate.Year, - &Gbl.ExamAnnouncement.CallDate.Month, - &Gbl.ExamAnnouncement.CallDate.Day, + &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", - &Gbl.ExamAnnouncement.ExamDate.Year,&Gbl.ExamAnnouncement.ExamDate.Month,&Gbl.ExamAnnouncement.ExamDate.Day, - &Gbl.ExamAnnouncement.StartTime.Hour,&Gbl.ExamAnnouncement.StartTime.Minute,&Second) != 6) + &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.ExamAnnouncement.Duration.Hour,&Gbl.ExamAnnouncement.Duration.Minute,&Second) != 3) + if (sscanf (row[6],"%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.ExamAnnouncement.Place,row[7],Cns_MAX_BYTES_TEXT); - Gbl.ExamAnnouncement.Place[Cns_MAX_BYTES_TEXT] = '\0'; + strncpy (Gbl.ExamAnnouncements.ExaDat.Place,row[7],Cns_MAX_BYTES_TEXT); + Gbl.ExamAnnouncements.ExaDat.Place[Cns_MAX_BYTES_TEXT] = '\0'; /* Exam mode (row[8]) */ - strncpy (Gbl.ExamAnnouncement.Mode,row[8],Cns_MAX_BYTES_TEXT); - Gbl.ExamAnnouncement.Mode[Cns_MAX_BYTES_TEXT] = '\0'; + strncpy (Gbl.ExamAnnouncements.ExaDat.Mode,row[8],Cns_MAX_BYTES_TEXT); + Gbl.ExamAnnouncements.ExaDat.Mode[Cns_MAX_BYTES_TEXT] = '\0'; /* Structure (row[9]) */ - strncpy (Gbl.ExamAnnouncement.Structure,row[9],Cns_MAX_BYTES_TEXT); - Gbl.ExamAnnouncement.Structure[Cns_MAX_BYTES_TEXT] = '\0'; + strncpy (Gbl.ExamAnnouncements.ExaDat.Structure,row[9],Cns_MAX_BYTES_TEXT); + Gbl.ExamAnnouncements.ExaDat.Structure[Cns_MAX_BYTES_TEXT] = '\0'; /* Documentation required (row[10]) */ - strncpy (Gbl.ExamAnnouncement.DocRequired,row[10],Cns_MAX_BYTES_TEXT); - Gbl.ExamAnnouncement.DocRequired[Cns_MAX_BYTES_TEXT] = '\0'; + strncpy (Gbl.ExamAnnouncements.ExaDat.DocRequired,row[10],Cns_MAX_BYTES_TEXT); + Gbl.ExamAnnouncements.ExaDat.DocRequired[Cns_MAX_BYTES_TEXT] = '\0'; /* Material required (row[11]) */ - strncpy (Gbl.ExamAnnouncement.MatRequired,row[11],Cns_MAX_BYTES_TEXT); - Gbl.ExamAnnouncement.MatRequired[Cns_MAX_BYTES_TEXT] = '\0'; + strncpy (Gbl.ExamAnnouncements.ExaDat.MatRequired,row[11],Cns_MAX_BYTES_TEXT); + Gbl.ExamAnnouncements.ExaDat.MatRequired[Cns_MAX_BYTES_TEXT] = '\0'; /* Material allowed (row[12]) */ - strncpy (Gbl.ExamAnnouncement.MatAllowed,row[12],Cns_MAX_BYTES_TEXT); - Gbl.ExamAnnouncement.MatAllowed[Cns_MAX_BYTES_TEXT] = '\0'; + strncpy (Gbl.ExamAnnouncements.ExaDat.MatAllowed,row[12],Cns_MAX_BYTES_TEXT); + Gbl.ExamAnnouncements.ExaDat.MatAllowed[Cns_MAX_BYTES_TEXT] = '\0'; /* Other information for students (row[13]) */ - strncpy (Gbl.ExamAnnouncement.OtherInfo,row[13],Cns_MAX_BYTES_TEXT); - Gbl.ExamAnnouncement.OtherInfo[Cns_MAX_BYTES_TEXT] = '\0'; + strncpy (Gbl.ExamAnnouncements.ExaDat.OtherInfo,row[13],Cns_MAX_BYTES_TEXT); + Gbl.ExamAnnouncements.ExaDat.OtherInfo[Cns_MAX_BYTES_TEXT] = '\0'; /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); @@ -771,7 +829,7 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t } /***** Start frame *****/ - Gbl.LstExamAnnouncements.ExaCodToEdit = ExaCod; // Used as parameter in contextual links + Gbl.ExamAnnouncements.ExaCodToEdit = ExaCod; // Used as parameter in contextual links Lay_StartRoundFrame ("625px",NULL, TypeViewExamAnnouncement == Exa_NORMAL_VIEW ? Exa_PutIconsExamAnnouncement : NULL); @@ -845,10 +903,10 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t { fprintf (Gbl.F.Out,"", - Cns_MAX_LENGTH_STRING,Gbl.ExamAnnouncement.CrsFullName); + Cns_MAX_LENGTH_STRING,Gbl.ExamAnnouncements.ExaDat.CrsFullName); } else - fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncement.CrsFullName); + fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncements.ExaDat.CrsFullName); fprintf (Gbl.F.Out,"" \ ""); @@ -869,14 +927,14 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t Year++) { fprintf (Gbl.F.Out,"%s",Year,Txt_YEAR_OF_DEGREE[Year]); } fprintf (Gbl.F.Out,""); } else - fprintf (Gbl.F.Out,"%s",Txt_YEAR_OF_DEGREE[Gbl.ExamAnnouncement.Year]); + fprintf (Gbl.F.Out,"%s",Txt_YEAR_OF_DEGREE[Gbl.ExamAnnouncements.ExaDat.Year]); fprintf (Gbl.F.Out,"" \ ""); @@ -892,9 +950,9 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t if (TypeViewExamAnnouncement == Exa_FORM_VIEW) fprintf (Gbl.F.Out,"", - Cns_MAX_LENGTH_STRING,Gbl.ExamAnnouncement.Session); + Cns_MAX_LENGTH_STRING,Gbl.ExamAnnouncements.ExaDat.Session); else - fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncement.Session); + fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncements.ExaDat.Session); fprintf (Gbl.F.Out,"" \ ""); @@ -908,16 +966,16 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t if (TypeViewExamAnnouncement == Exa_FORM_VIEW) { fprintf (Gbl.F.Out,""); - Dat_WriteFormDate (Gbl.ExamAnnouncement.ExamDate.Year < Gbl.Now.Date.Year ? Gbl.ExamAnnouncement.ExamDate.Year : - Gbl.Now.Date.Year, + Dat_WriteFormDate (Gbl.ExamAnnouncements.ExaDat.ExamDate.Year < Gbl.Now.Date.Year ? Gbl.ExamAnnouncements.ExaDat.ExamDate.Year : + Gbl.Now.Date.Year, Gbl.Now.Date.Year + 1,"Exam", - &(Gbl.ExamAnnouncement.ExamDate), + &(Gbl.ExamAnnouncements.ExaDat.ExamDate), false,false); fprintf (Gbl.F.Out,""); } else { - Dat_ConvDateToDateStr (&Gbl.ExamAnnouncement.ExamDate,StrExamDate); + Dat_ConvDateToDateStr (&Gbl.ExamAnnouncements.ExaDat.ExamDate,StrExamDate); fprintf (Gbl.F.Out,"" "%s" "", @@ -937,7 +995,7 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t if (TypeViewExamAnnouncement == Exa_FORM_VIEW) { fprintf (Gbl.F.Out,""); } - else if (Gbl.ExamAnnouncement.StartTime.Hour) + else if (Gbl.ExamAnnouncements.ExaDat.StartTime.Hour) fprintf (Gbl.F.Out,"%2u:%02u", - Gbl.ExamAnnouncement.StartTime.Hour, - Gbl.ExamAnnouncement.StartTime.Minute); + Gbl.ExamAnnouncements.ExaDat.StartTime.Hour, + Gbl.ExamAnnouncements.ExaDat.StartTime.Minute); fprintf (Gbl.F.Out,"" \ ""); @@ -987,7 +1045,7 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t Hour++) { fprintf (Gbl.F.Out,"", Hour,Txt_hours_ABBREVIATION); @@ -998,36 +1056,36 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t Minute++) { fprintf (Gbl.F.Out,"",Minute); } fprintf (Gbl.F.Out,""); } - else if (Gbl.ExamAnnouncement.Duration.Hour || - Gbl.ExamAnnouncement.Duration.Minute) + else if (Gbl.ExamAnnouncements.ExaDat.Duration.Hour || + Gbl.ExamAnnouncements.ExaDat.Duration.Minute) { - if (Gbl.ExamAnnouncement.Duration.Hour) + if (Gbl.ExamAnnouncements.ExaDat.Duration.Hour) { - if (Gbl.ExamAnnouncement.Duration.Minute) + if (Gbl.ExamAnnouncements.ExaDat.Duration.Minute) fprintf (Gbl.F.Out,"%u %s %u '", - Gbl.ExamAnnouncement.Duration.Hour, + Gbl.ExamAnnouncements.ExaDat.Duration.Hour, Txt_hours_ABBREVIATION, - Gbl.ExamAnnouncement.Duration.Minute); + Gbl.ExamAnnouncements.ExaDat.Duration.Minute); else { - if (Gbl.ExamAnnouncement.Duration.Hour == 1) + if (Gbl.ExamAnnouncements.ExaDat.Duration.Hour == 1) fprintf (Gbl.F.Out,"1 %s",Txt_hour); else - fprintf (Gbl.F.Out,"%u %s",Gbl.ExamAnnouncement.Duration.Hour,Txt_hours); + fprintf (Gbl.F.Out,"%u %s",Gbl.ExamAnnouncements.ExaDat.Duration.Hour,Txt_hours); } } - else if (Gbl.ExamAnnouncement.Duration.Minute) + else if (Gbl.ExamAnnouncements.ExaDat.Duration.Minute) { - if (Gbl.ExamAnnouncement.Duration.Minute == 1) + if (Gbl.ExamAnnouncements.ExaDat.Duration.Minute == 1) fprintf (Gbl.F.Out,"1 %s",Txt_minute); else - fprintf (Gbl.F.Out,"%u %s",Gbl.ExamAnnouncement.Duration.Minute,Txt_minutes); + fprintf (Gbl.F.Out,"%u %s",Gbl.ExamAnnouncements.ExaDat.Duration.Minute,Txt_minutes); } } fprintf (Gbl.F.Out,"" \ @@ -1044,12 +1102,12 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t StyleNormal); if (TypeViewExamAnnouncement == Exa_FORM_VIEW) fprintf (Gbl.F.Out,"", - Gbl.ExamAnnouncement.Place); + Gbl.ExamAnnouncements.ExaDat.Place); else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnnouncement.Place,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML - fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncement.Place); + Gbl.ExamAnnouncements.ExaDat.Place,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML + fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncements.ExaDat.Place); } fprintf (Gbl.F.Out,"" \ ""); @@ -1065,12 +1123,12 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t StyleNormal); if (TypeViewExamAnnouncement == Exa_FORM_VIEW) fprintf (Gbl.F.Out,"", - Gbl.ExamAnnouncement.Mode); + Gbl.ExamAnnouncements.ExaDat.Mode); else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnnouncement.Mode,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML - fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncement.Mode); + Gbl.ExamAnnouncements.ExaDat.Mode,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML + fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncements.ExaDat.Mode); } fprintf (Gbl.F.Out,"" \ ""); @@ -1086,12 +1144,12 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t StyleNormal); if (TypeViewExamAnnouncement == Exa_FORM_VIEW) fprintf (Gbl.F.Out,"", - Gbl.ExamAnnouncement.Structure); + Gbl.ExamAnnouncements.ExaDat.Structure); else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnnouncement.Structure,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML - fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncement.Structure); + Gbl.ExamAnnouncements.ExaDat.Structure,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML + fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncements.ExaDat.Structure); } fprintf (Gbl.F.Out,"" \ ""); @@ -1107,12 +1165,12 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t StyleNormal); if (TypeViewExamAnnouncement == Exa_FORM_VIEW) fprintf (Gbl.F.Out,"", - Gbl.ExamAnnouncement.DocRequired); + Gbl.ExamAnnouncements.ExaDat.DocRequired); else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnnouncement.DocRequired,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML - fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncement.DocRequired); + Gbl.ExamAnnouncements.ExaDat.DocRequired,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML + fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncements.ExaDat.DocRequired); } fprintf (Gbl.F.Out,"" \ ""); @@ -1128,12 +1186,12 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t StyleNormal); if (TypeViewExamAnnouncement == Exa_FORM_VIEW) fprintf (Gbl.F.Out,"", - Gbl.ExamAnnouncement.MatRequired); + Gbl.ExamAnnouncements.ExaDat.MatRequired); else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnnouncement.MatRequired,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML - fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncement.MatRequired); + Gbl.ExamAnnouncements.ExaDat.MatRequired,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML + fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncements.ExaDat.MatRequired); } fprintf (Gbl.F.Out,"" \ ""); @@ -1149,12 +1207,12 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t StyleNormal); if (TypeViewExamAnnouncement == Exa_FORM_VIEW) fprintf (Gbl.F.Out,"", - Gbl.ExamAnnouncement.MatAllowed); + Gbl.ExamAnnouncements.ExaDat.MatAllowed); else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnnouncement.MatAllowed,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML - fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncement.MatAllowed); + Gbl.ExamAnnouncements.ExaDat.MatAllowed,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML + fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncements.ExaDat.MatAllowed); } fprintf (Gbl.F.Out,"" \ ""); @@ -1169,12 +1227,12 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_TypeViewExamAnnouncement_t StyleNormal); if (TypeViewExamAnnouncement == Exa_FORM_VIEW) fprintf (Gbl.F.Out,"", - Gbl.ExamAnnouncement.OtherInfo); + Gbl.ExamAnnouncements.ExaDat.OtherInfo); else { Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, - Gbl.ExamAnnouncement.OtherInfo,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML - fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncement.OtherInfo); + Gbl.ExamAnnouncements.ExaDat.OtherInfo,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML + fprintf (Gbl.F.Out,"%s",Gbl.ExamAnnouncements.ExaDat.OtherInfo); } fprintf (Gbl.F.Out,"" \ "" \ @@ -1225,7 +1283,7 @@ static void Exa_PutIconsExamAnnouncement (void) static void Exa_PutParamExaCod (void) { - Par_PutHiddenParamLong ("ExaCod",Gbl.LstExamAnnouncements.ExaCodToEdit); + Par_PutHiddenParamLong ("ExaCod",Gbl.ExamAnnouncements.ExaCodToEdit); } /*****************************************************************************/ @@ -1254,17 +1312,17 @@ void Exa_GetSummaryAndContentExamAnnouncement (char *SummaryStr,char **ContentSt /***** Summary *****/ /* Name of the course */ if (MaxChars) - Str_LimitLengthHTMLStr (Gbl.ExamAnnouncement.CrsFullName, + Str_LimitLengthHTMLStr (Gbl.ExamAnnouncements.ExaDat.CrsFullName, MaxChars-(2+Cns_MAX_LENGTH_DATE+6)); /* Date of exam */ sprintf (SummaryStr,"%s, %04u-%02u-%02u %2u:%02u", - Gbl.ExamAnnouncement.CrsFullName, - Gbl.ExamAnnouncement.ExamDate.Year, - Gbl.ExamAnnouncement.ExamDate.Month, - Gbl.ExamAnnouncement.ExamDate.Day, - Gbl.ExamAnnouncement.StartTime.Hour, - Gbl.ExamAnnouncement.StartTime.Minute); + Gbl.ExamAnnouncements.ExaDat.CrsFullName, + 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); /***** Free memory of the exam announcement *****/ Exa_FreeMemExamAnnouncement (); @@ -1303,7 +1361,7 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr) (*ContentStr)[0] = '\0'; // Return nothing on error /***** Get data of course *****/ - Crs.CrsCod = Gbl.ExamAnnouncement.CrsCod; + Crs.CrsCod = Gbl.ExamAnnouncements.ExaDat.CrsCod; Crs_GetDataOfCourseByCod (&Crs); /***** Get data of degree *****/ @@ -1314,7 +1372,7 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr) Ins.InsCod = Deg_GetInsCodOfDegreeByCod (Deg.DegCod); Ins_GetDataOfInstitutionByCod (&Ins,Ins_GET_BASIC_DATA); - Dat_ConvDateToDateStr (&Gbl.ExamAnnouncement.ExamDate,StrExamDate); + Dat_ConvDateToDateStr (&Gbl.ExamAnnouncements.ExaDat.ExamDate,StrExamDate); /***** Institution *****/ sprintf (*ContentStr,"%s: %s
" \ @@ -1334,21 +1392,21 @@ static void Exa_GetNotifContentExamAnnouncement (char **ContentStr) "%s: %s", Txt_Institution,Ins.FullName, Txt_Degree,Deg.FullName, - Txt_EXAM_ANNOUNCEMENT_Course,Gbl.ExamAnnouncement.CrsFullName, - Txt_EXAM_ANNOUNCEMENT_Year,Txt_YEAR_OF_DEGREE[Gbl.ExamAnnouncement.Year], - Txt_EXAM_ANNOUNCEMENT_Session,Gbl.ExamAnnouncement.Session, + Txt_EXAM_ANNOUNCEMENT_Course,Gbl.ExamAnnouncements.ExaDat.CrsFullName, + Txt_EXAM_ANNOUNCEMENT_Year,Txt_YEAR_OF_DEGREE[Gbl.ExamAnnouncements.ExaDat.Year], + Txt_EXAM_ANNOUNCEMENT_Session,Gbl.ExamAnnouncements.ExaDat.Session, Txt_EXAM_ANNOUNCEMENT_Exam_date,StrExamDate, - Txt_EXAM_ANNOUNCEMENT_Start_time,Gbl.ExamAnnouncement.StartTime.Hour, - Gbl.ExamAnnouncement.StartTime.Minute, + Txt_EXAM_ANNOUNCEMENT_Start_time,Gbl.ExamAnnouncements.ExaDat.StartTime.Hour, + Gbl.ExamAnnouncements.ExaDat.StartTime.Minute, Txt_hours_ABBREVIATION, - Txt_EXAM_ANNOUNCEMENT_Approximate_duration,Gbl.ExamAnnouncement.Duration.Hour, - Gbl.ExamAnnouncement.Duration.Minute, + Txt_EXAM_ANNOUNCEMENT_Approximate_duration,Gbl.ExamAnnouncements.ExaDat.Duration.Hour, + Gbl.ExamAnnouncements.ExaDat.Duration.Minute, Txt_hours_ABBREVIATION, - Txt_EXAM_ANNOUNCEMENT_Place_of_exam,Gbl.ExamAnnouncement.Place, - Txt_EXAM_ANNOUNCEMENT_Mode,Gbl.ExamAnnouncement.Mode, - Txt_EXAM_ANNOUNCEMENT_Structure_of_the_exam,Gbl.ExamAnnouncement.Structure, - Txt_EXAM_ANNOUNCEMENT_Documentation_required,Gbl.ExamAnnouncement.DocRequired, - Txt_EXAM_ANNOUNCEMENT_Material_required,Gbl.ExamAnnouncement.MatRequired, - Txt_EXAM_ANNOUNCEMENT_Material_allowed,Gbl.ExamAnnouncement.MatAllowed, - Txt_EXAM_ANNOUNCEMENT_Other_information,Gbl.ExamAnnouncement.OtherInfo); + Txt_EXAM_ANNOUNCEMENT_Place_of_exam,Gbl.ExamAnnouncements.ExaDat.Place, + Txt_EXAM_ANNOUNCEMENT_Mode,Gbl.ExamAnnouncements.ExaDat.Mode, + Txt_EXAM_ANNOUNCEMENT_Structure_of_the_exam,Gbl.ExamAnnouncements.ExaDat.Structure, + Txt_EXAM_ANNOUNCEMENT_Documentation_required,Gbl.ExamAnnouncements.ExaDat.DocRequired, + Txt_EXAM_ANNOUNCEMENT_Material_required,Gbl.ExamAnnouncements.ExaDat.MatRequired, + Txt_EXAM_ANNOUNCEMENT_Material_allowed,Gbl.ExamAnnouncements.ExaDat.MatAllowed, + Txt_EXAM_ANNOUNCEMENT_Other_information,Gbl.ExamAnnouncements.ExaDat.OtherInfo); } diff --git a/swad_global.c b/swad_global.c index dd8daacfe..f3b799301 100644 --- a/swad_global.c +++ b/swad_global.c @@ -194,8 +194,9 @@ void Gbl_InitializeGlobals (void) Gbl.Usrs.LstAdms.NumUsrs = 0; Gbl.Usrs.LstAdms.Lst = NULL; - Gbl.LstExamAnnouncements.NumExamAnnounc = 0; - Gbl.LstExamAnnouncements.Lst = NULL; + Gbl.ExamAnnouncements.NumExaAnns = 0; + Gbl.ExamAnnouncements.Lst = NULL; + Gbl.ExamAnnouncements.HighlightExaCod = -1L; // No exam announcement highlighted Gbl.Usrs.Select.All = Gbl.Usrs.Select.Std = diff --git a/swad_global.h b/swad_global.h index c96a7fd5f..b6efac15e 100644 --- a/swad_global.h +++ b/swad_global.h @@ -477,30 +477,31 @@ struct Globals bool EditionIsActive; Syl_WhichSyllabus_t WhichSyllabus; } Syllabus; - 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; - } ExamAnnouncement; struct { struct Date *Lst; // List of dates of announcements of exams - unsigned NumExamAnnounc; // Number of announcements of exam in the list + unsigned NumExaAnns; // Number of announcements of exam in the list long ExaCodToEdit; // Used as parameter in contextual links - } LstExamAnnouncements; + long HighlightExaCod; // Exam code of an exam announcement to be highlighted + 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; + } ExamAnnouncements; struct { unsigned Id; // Each file browser in the page has a unique identifier diff --git a/swad_layout.c b/swad_layout.c index b9f909bd9..601ee313a 100644 --- a/swad_layout.c +++ b/swad_layout.c @@ -514,14 +514,17 @@ static void Lay_WriteScripts (void) fprintf (Gbl.F.Out," var LstExamAnnouncements = [];\n"); for (NumExamAnnouncement = 0; - NumExamAnnouncement < Gbl.LstExamAnnouncements.NumExamAnnounc; + NumExamAnnouncement < Gbl.ExamAnnouncements.NumExaAnns; NumExamAnnouncement++) fprintf (Gbl.F.Out," LstExamAnnouncements.push({ Year: %u, Month: %u, Day: %u });\n", - Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Year, - Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Month, - Gbl.LstExamAnnouncements.Lst[NumExamAnnouncement].Day); + Gbl.ExamAnnouncements.Lst[NumExamAnnouncement].Year, + Gbl.ExamAnnouncements.Lst[NumExamAnnouncement].Month, + Gbl.ExamAnnouncements.Lst[NumExamAnnouncement].Day); fprintf (Gbl.F.Out,"\n"); + + /***** Free list of dates of exam announcements *****/ + Exa_FreeListExamAnnouncements (); } /***** Scripts depending on action *****/ diff --git a/swad_text.c b/swad_text.c index 7c22ce6e4..774f5b5aa 100644 --- a/swad_text.c +++ b/swad_text.c @@ -619,7 +619,7 @@ const char *Txt_NOTIFY_EVENTS_SINGULAR_NO_HTML[Ntf_NUM_NOTIFY_EVENTS][1+Txt_NUM_ "Nueva convocatoria de examen", "Nouvelle convocation à un examen", "Nueva convocatoria de examen", // Okoteve traducción - "Nuova sessione d'esame", + "Nuovo appello d'esame", "Nowe ogloszenie egzaminu", "Nova chamada para exame", }, @@ -2111,6 +2111,27 @@ const char *Txt_all = "tudo"; #endif +const char *Txt_All_announcements_of_exam = +#if L==1 + "Totes les convocatòries d'examen"; +#elif L==2 + "Alle Aufrufe für Prüfung"; +#elif L==3 + "All announcements of exam"; +#elif L==4 + "Todas las convocatorias de examen"; +#elif L==5 + "Tous les convocations à un examen"; +#elif L==6 + "Todas las convocatorias de examen"; // Okoteve traducción +#elif L==7 + "Tutti i appelli d'esame"; +#elif L==8 + "Wszystkie anonse egzamin"; +#elif L==9 + "Todas as chamadas para exame"; +#endif + const char *Txt_all_degrees = #if L==1 "Totes les titulacions"; @@ -2468,6 +2489,27 @@ const char *Txt_Announcement_of_exam_removed = "Chamada para exame removida."; #endif +const char *Txt_Announcements_of_exam = +#if L==1 + "Convocatòries d'examen"; +#elif L==2 + "Aufrufe für Prüfung"; +#elif L==3 + "Announcements of exam"; +#elif L==4 + "Convocatorias de examen"; +#elif L==5 + "Convocations à un examen"; +#elif L==6 + "Convocatorias de examen"; // Okoteve traducción +#elif L==7 + "Appelli d'esame"; +#elif L==8 + "Anonse egzamin"; +#elif L==9 + "Chamadas para exame"; +#endif + const char *Txt_Another_centre = #if L==1 "Un altre centre"; @@ -6427,7 +6469,7 @@ const char *Txt_Created_new_announcement_of_exam = #elif L==6 "Creada nueva convocatoria de examen."; // Okoteve traducción #elif L==7 - "Creata nuova sessione d'esame."; + "Creato nuovo appello d'esame."; #elif L==8 "Utworzono nowe ogloszenie egzamin."; #elif L==9 @@ -10613,7 +10655,7 @@ const char *Txt_EXAM_ANNOUNCEMENT = #elif L==6 "CONVOCATORIA DE EXAMEN"; // Okoteve traducción #elif L==7 - "SESSIONE D'ESAME"; + "APPELLO D'ESAME"; #elif L==8 "OGLOSZENIE egzaminu"; #elif L==9 @@ -16317,7 +16359,7 @@ const char *Txt_Link_to_announcement_of_exam = #elif L==6 "Enlace a convocatoria de examen"; // Okoteve traducción #elif L==7 - "Link alla sessione d'esame"; + "Link al appello d'esame"; #elif L==8 "Link do ogloszenie egzaminu"; #elif L==9 @@ -25725,7 +25767,7 @@ const char *Txt_NOTIFY_EVENTS_PLURAL[Ntf_NUM_NOTIFY_EVENTS] = #elif L==6 "Nuevas convocatorias de examen" // Okoteve traducción #elif L==7 - "Nuovo appello d'esame" + "Nuovi appelli d'esame" #elif L==8 "Nowe anonse egzamin" #elif L==9 @@ -26128,7 +26170,7 @@ const char *Txt_NOTIFY_EVENTS_SINGULAR[Ntf_NUM_NOTIFY_EVENTS] = #elif L==6 "Convocatoria de examen" // Okoteve traducción #elif L==7 - "Sessione d'esame" + "Appello d'esame" #elif L==8 "Ogloszenie egzamin" #elif L==9 @@ -36826,7 +36868,7 @@ const char *Txt_SOCIAL_NOTE[Soc_NUM_NOTE_TYPES] = #elif L==6 "Convocatoria de examen" // Okoteve traducción #elif L==7 - "Sessione d'esame" + "Appello d'esame" #elif L==8 "Ogloszenie egzamin" #elif L==9 @@ -40934,7 +40976,7 @@ const char *Txt_The_announcement_of_exam_has_been_successfully_updated = #elif L==6 "La convocatoria de examen se ha actualizado correctamente."; // Okoteve traducción #elif L==7 - "La sessione d'esame è stata aggiornata con successo."; + "L'apello d'esame è stata aggiornata con successo."; #elif L==8 "The announcement of exam has been successfully updated."; // Potrzebujesz tlumaczenie #elif L==9