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,"");
- 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,"",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