Version 20.51: Mar 18, 2021 Call for exam module renamed.

This commit is contained in:
acanas 2021-03-18 01:49:43 +01:00
parent 9ea76aeebd
commit 789b3697f5
25 changed files with 2473 additions and 2465 deletions

View File

@ -29,13 +29,13 @@
OBJS = swad_account.o swad_action.o swad_agenda.o swad_alert.o \
swad_announcement.o swad_API.o swad_assignment.o swad_attendance.o \
swad_banner.o swad_box.o swad_building.o swad_button.o \
swad_calendar.o swad_center.o swad_center_config.o swad_chat.o \
swad_config.o swad_connected.o swad_cookie.o swad_country.o \
swad_country_config.o swad_course.o \
swad_calendar.o swad_call_for_exam.o swad_center.o \
swad_center_config.o swad_chat.o swad_config.o swad_connected.o \
swad_cookie.o swad_country.o swad_country_config.o swad_course.o \
swad_course_config.o swad_cryptography.o \
swad_database.o swad_date.o swad_degree.o swad_degree_config.o \
swad_degree_type.o swad_department.o swad_duplicate.o \
swad_enrolment.o swad_exam.o swad_exam_announcement.o swad_exam_log.o \
swad_enrolment.o swad_exam.o swad_exam_log.o \
swad_exam_print.o swad_exam_result.o swad_exam_session.o \
swad_exam_set.o \
swad_figure.o swad_figure_cache.o swad_file.o swad_file_browser.o \

View File

@ -3272,13 +3272,13 @@ table.CELLS_PAD_10 > tbody > tr > td {padding:10px;}
/***************************** Exam announcement *****************************/
/* Bottom space is used for signatures */
.EXA_ANN_VISIBLE
.CALL_FOR_EXAM_VISIBLE
{
box-sizing:border-box;
width:100%;
padding:25px 25px 125px 25px;
}
.EXA_ANN_HIDDEN
.CALL_FOR_EXAM_HIDDEN
{
box-sizing:border-box;
width:100%;

View File

@ -10645,7 +10645,7 @@ UPDATE usr_data SET EmailNtfEvents=(((EmailNtfEvents & ~0x7F) << 1) | (EmailNtfE
/* Assessment tab */
Ntf_EVENT_ASSIGNMENT = 3, // old 3
Ntf_EVENT_EXAM_ANNOUNCEMENT = 4, // old 4
Ntf_EVENT_CALL_FOR_EXAM = 4, // old 4
Ntf_EVENT_MARKS_FILE = 5, // old 5
/* Enrollment tab */

View File

@ -160,7 +160,7 @@ void QR_LinkTo (unsigned Size,const char *ParamName,long Cod)
void QR_ExamAnnnouncement (void)
{
extern const char *Txt_Link_to_announcement_of_exam;
extern const char *Txt_Link_to_call_for_exam;
char *URL;
/***** Show QR code with direct link to the exam announcement *****/
@ -171,7 +171,7 @@ void QR_ExamAnnnouncement (void)
Cfg_URL_SWAD_CGI,Gbl.Hierarchy.Crs.CrsCod,
Act_GetActCod (ActSeeAllExaAnn)) < 0)
Lay_NotEnoughMemoryExit ();
HTM_IMG (URL,NULL,Txt_Link_to_announcement_of_exam,
HTM_IMG (URL,NULL,Txt_Link_to_call_for_exam,
"style=\"width:250px;height:250px;\"");
free (URL);

View File

@ -29,9 +29,9 @@
#include <stddef.h> // For NULL
#include <string.h>
#include "swad_call_for_exam.h"
#include "swad_changelog.h"
#include "swad_database.h"
#include "swad_exam_announcement.h"
#include "swad_global.h"
#include "swad_notice.h"
#include "swad_RSS.h"
@ -260,7 +260,7 @@ static void RSS_WriteExamAnnouncements (FILE *FileRSS,struct Crs_Course *Crs)
" WHERE CrsCod=%ld AND Status=%u AND ExamDate>=NOW()"
" ORDER BY T",
Gbl.Hierarchy.Crs.CrsCod,
(unsigned) ExaAnn_VISIBLE_EXAM_ANNOUNCEMENT);
(unsigned) Cfe_VISIBLE_CALL_FOR_EXAM);
/***** Write items with notices *****/
if (NumExamAnnouncements)

View File

@ -32,6 +32,7 @@
#include "swad_banner.h"
#include "swad_building.h"
#include "swad_calendar.h"
#include "swad_call_for_exam.h"
#include "swad_center_config.h"
#include "swad_config.h"
#include "swad_cookie.h"
@ -47,7 +48,6 @@
#include "swad_department.h"
#include "swad_duplicate.h"
#include "swad_exam.h"
#include "swad_exam_announcement.h"
#include "swad_exam_print.h"
#include "swad_exam_result.h"
#include "swad_exam_session.h"
@ -554,7 +554,7 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActSeeAss ] = { 15, 0,TabAss,ActSeeAss ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Inf_ShowInfo ,"info" },
[ActSeeAsg ] = { 801, 1,TabAss,ActSeeAsg ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Asg_SeeAssignments ,"edit" },
[ActSeePrj ] = {1674, 2,TabAss,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prj_SeeProjects ,"file-invoice" },
[ActSeeAllExaAnn ] = { 85, 3,TabAss,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaAnn_ListExamAnnsSee ,"bullhorn" },
[ActSeeAllExaAnn ] = { 85, 3,TabAss,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cfe_ListCallsForExamsSee ,"bullhorn" },
[ActEdiTstQst ] = { 104, 4,TabAss,ActEdiTstQst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Tst_RequestEditTests ,"tasks" },
[ActReqTst ] = { 103, 5,TabAss,ActReqTst ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RequestTest ,"check" },
[ActSeeAllExa ] = {1848, 6,TabAss,ActSeeAllExa ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Exa_SeeAllExams ,"file-signature" },
@ -656,15 +656,15 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActChgDatAssPrj ] = {1733,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Brw_ChgFileMetadata ,NULL},
[ActDowAssPrj ] = {1734,-1,TabUnk,ActSeePrj ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_DOWNLD_FILE,Brw_DownloadFile ,NULL ,NULL},
[ActSeeOneExaAnn ] = {1572,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaAnn_ListExamAnnsCod ,NULL},
[ActSeeDatExaAnn ] = {1571,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaAnn_ListExamAnnsDay ,NULL},
[ActEdiExaAnn ] = { 91,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaAnn_PutFrmEditAExamAnn ,NULL},
[ActRcvExaAnn ] = { 110,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,ExaAnn_ReceiveExamAnn1 ,ExaAnn_ReceiveExamAnn2 ,NULL},
[ActPrnExaAnn ] = { 179,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,ExaAnn_PrintExamAnn ,NULL},
[ActReqRemExaAnn ] = {1619,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,ExaAnn_ReqRemoveExamAnn ,NULL},
[ActRemExaAnn ] = { 187,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,ExaAnn_RemoveExamAnn1 ,ExaAnn_RemoveExamAnn2 ,NULL},
[ActHidExaAnn ] = {1620,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,ExaAnn_HideExamAnn ,ExaAnn_ListExamAnnsEdit ,NULL},
[ActUnhExaAnn ] = {1621,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,ExaAnn_UnhideExamAnn ,ExaAnn_ListExamAnnsEdit ,NULL},
[ActSeeOneCfe ] = {1572,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cfe_ListCallsForExamsCod ,NULL},
[ActSeeDatCfe ] = {1571,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cfe_ListCallsForExamsDay ,NULL},
[ActEdiCfe ] = { 91,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cfe_PutFrmEditACallForExam ,NULL},
[ActRcvCfe ] = { 110,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Cfe_ReceiveCallForExam1 ,Cfe_ReceiveCallForExam2 ,NULL},
[ActPrnCfe ] = { 179,-1,TabUnk,ActSeeAllExaAnn ,0x3F8,0x3C7, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Cfe_PrintCallForExam ,NULL},
[ActReqRemCfe ] = {1619,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Cfe_ReqRemoveCallForExam ,NULL},
[ActRemCfe ] = { 187,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Cfe_RemoveCallForExam1 ,Cfe_RemoveCallForExam2 ,NULL},
[ActHidCfe ] = {1620,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Cfe_HideCallForExam ,Cfe_ListCallsForExamsEdit ,NULL},
[ActUnhCfe ] = {1621,-1,TabUnk,ActSeeAllExaAnn ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Cfe_UnhideCallForExam ,Cfe_ListCallsForExamsEdit ,NULL},
[ActEdiOneTstQst ] = { 105,-1,TabUnk,ActEdiTstQst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowFormEditOneQst ,NULL},
[ActReqImpTstQst ] = {1007,-1,TabUnk,ActEdiTstQst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,TsI_ShowFormImportQstsFromXML ,NULL},
@ -1913,7 +1913,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActReqRemAllStdCrs, // #88
ActSeeRecSevStd, // #89
ActDelSntMsg, // #90
ActEdiExaAnn, // #91
ActEdiCfe, // #91
-1, // #92 (obsolete action)
-1, // #93 (obsolete action)
-1, // #94 (obsolete action)
@ -1932,7 +1932,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActReqRemGrp, // #107
ActReqEdiGrp, // #108
ActEdiFAQ, // #109
ActRcvExaAnn, // #110
ActRcvCfe, // #110
ActPrnRecSevStd, // #111
-1, // #112 (obsolete action)
-1, // #113 (obsolete action)
@ -2001,7 +2001,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
-1, // #176 (obsolete action)
-1, // #177 (obsolete action)
-1, // #178 (obsolete action)
ActPrnExaAnn, // #179
ActPrnCfe, // #179
-1, // #180 (obsolete action)
ActInsIteSylPra, // #181
ActRcvURLCrsLnk, // #182
@ -2009,7 +2009,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActRcvPagAss, // #184
ActRcvPagBib, // #185
-1, // #186 (obsolete action)
ActRemExaAnn, // #187
ActRemCfe, // #187
-1, // #188 (obsolete action)
-1, // #189 (obsolete action)
-1, // #190 (obsolete action)
@ -3393,8 +3393,8 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActCnfID_Oth, // #1568
ActCnfID_Std, // #1569
ActCnfID_Tch, // #1570
ActSeeDatExaAnn, // #1571
ActSeeOneExaAnn, // #1572
ActSeeDatCfe, // #1571
ActSeeOneCfe, // #1572
ActChgCrsYeaCfg, // #1573
ActReqRemOthPho, // #1574
ActReqRemStdPho, // #1575
@ -3441,9 +3441,9 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActLogInUsrAgdLan, // #1616
-1, // #1617 (obsolete action)
ActPrnAgdQR, // #1618
ActReqRemExaAnn, // #1619
ActHidExaAnn, // #1620
ActUnhExaAnn, // #1621
ActReqRemCfe, // #1619
ActHidCfe, // #1620
ActUnhCfe, // #1621
ActSeeCal, // #1622
ActPrnCal, // #1623
ActChgCal1stDay, // #1624

View File

@ -618,15 +618,15 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActChgDatAssPrj (ActChgCrsTT1stDay + 97)
#define ActDowAssPrj (ActChgCrsTT1stDay + 98)
#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 99)
#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 100)
#define ActEdiExaAnn (ActChgCrsTT1stDay + 101)
#define ActRcvExaAnn (ActChgCrsTT1stDay + 102)
#define ActPrnExaAnn (ActChgCrsTT1stDay + 103)
#define ActReqRemExaAnn (ActChgCrsTT1stDay + 104)
#define ActRemExaAnn (ActChgCrsTT1stDay + 105)
#define ActHidExaAnn (ActChgCrsTT1stDay + 106)
#define ActUnhExaAnn (ActChgCrsTT1stDay + 107)
#define ActSeeOneCfe (ActChgCrsTT1stDay + 99)
#define ActSeeDatCfe (ActChgCrsTT1stDay + 100)
#define ActEdiCfe (ActChgCrsTT1stDay + 101)
#define ActRcvCfe (ActChgCrsTT1stDay + 102)
#define ActPrnCfe (ActChgCrsTT1stDay + 103)
#define ActReqRemCfe (ActChgCrsTT1stDay + 104)
#define ActRemCfe (ActChgCrsTT1stDay + 105)
#define ActHidCfe (ActChgCrsTT1stDay + 106)
#define ActUnhCfe (ActChgCrsTT1stDay + 107)
#define ActEdiOneTstQst (ActChgCrsTT1stDay + 108)
#define ActReqImpTstQst (ActChgCrsTT1stDay + 109)

View File

@ -29,8 +29,8 @@
#include "swad_box.h"
#include "swad_calendar.h"
#include "swad_call_for_exam.h"
#include "swad_database.h"
#include "swad_exam_announcement.h"
#include "swad_figure.h"
#include "swad_form.h"
#include "swad_global.h"
@ -219,7 +219,7 @@ void Cal_DrawCurrentMonth (void)
Lan_STR_LANG_ID[Gbl.Prefs.Language]);
Frm_SetParamsForm (ParamsStr,ActSeeCal,true);
HTM_TxtF ("'%s',",ParamsStr);
Frm_SetParamsForm (ParamsStr,ActSeeDatExaAnn,true);
Frm_SetParamsForm (ParamsStr,ActSeeDatCfe,true);
HTM_TxtF ("'%s');",ParamsStr);
HTM_SCRIPT_End ();
}
@ -288,7 +288,7 @@ static void Cal_DrawCalendar (Act_Action_t ActionSeeCalendar,
Lan_STR_LANG_ID[Gbl.Prefs.Language]);
Frm_SetParamsForm (ParamsStr,ActionSeeCalendar,true);
HTM_TxtF ("'%s',",ParamsStr);
Frm_SetParamsForm (ParamsStr,ActSeeDatExaAnn,true);
Frm_SetParamsForm (ParamsStr,ActSeeDatCfe,true);
HTM_TxtF ("'%s');",ParamsStr);
HTM_SCRIPT_End ();

1811
swad_call_for_exam.c Normal file

File diff suppressed because it is too large Load Diff

129
swad_call_for_exam.h Normal file
View File

@ -0,0 +1,129 @@
// swad_call_for_exam.h: calls for exams
#ifndef _SWAD_CFE
#define _SWAD_CFE
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2021 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General 3 License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include <stdbool.h> // For boolean type
#include "swad_constant.h"
#include "swad_course.h"
#include "swad_date.h"
#include "swad_notification.h"
/*****************************************************************************/
/************************** Public types and constants ***********************/
/*****************************************************************************/
#define Cfe_NUM_VIEWS 3
typedef enum
{
Cfe_NORMAL_VIEW,
Cfe_PRINT_VIEW,
Cfe_FORM_VIEW,
} Cfe_TypeViewCallForExam_t;
#define Cfe_NUM_STATUS 3
typedef enum
{
Cfe_VISIBLE_CALL_FOR_EXAM = 0,
Cfe_HIDDEN_CALL_FOR_EXAM = 1,
Cfe_DELETED_CALL_FOR_EXAM = 2,
} Cfe_Status_t; // Don't change these numbers because they are used in database
#define Cfe_STATUS_DEFAULT Cfe_VISIBLE_CALL_FOR_EXAM
#define Cfe_MAX_CHARS_SESSION (128 - 1) // 127
#define Cfe_MAX_BYTES_SESSION ((Cfe_MAX_CHARS_SESSION + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
struct Cfe_CallForExam
{
long CrsCod;
Cfe_Status_t Status;
char CrsFullName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1];
unsigned Year; // Number of year (0 (N.A.), 1, 2, 3, 4, 5, 6) in the degree
char Session[Cfe_MAX_BYTES_SESSION + 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;
};
struct Cfe_ExamCodeAndDate
{
long ExaCod;
struct Date ExamDate;
};
struct Cfe_CallsForExams
{
unsigned NumCallsForExams; // Number of calls for exams in the list
struct Cfe_ExamCodeAndDate *Lst; // List of calls for exams
long NewExaCod; // New call for exam just created
long HighlightExaCod; // Call for exam to be highlighted
char HighlightDate[4 + 2 + 2 + 1]; // Date with calls for exams to be highlighted (in YYYYMMDD format)
long ExaCod; // Used to put contextual icons
const char *Anchor; // Used to put contextual icons
struct Cfe_CallForExam CallForExam;
};
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
void Cfe_ResetCallsForExams (struct Cfe_CallsForExams *CallsForExams);
void Cfe_PutFrmEditACallForExam (void);
void Cfe_ReceiveCallForExam1 (void);
void Cfe_ReceiveCallForExam2 (void);
void Cfe_PrintCallForExam (void);
void Cfe_ReqRemoveCallForExam (void);
void Cfe_RemoveCallForExam1 (void);
void Cfe_RemoveCallForExam2 (void);
void Cfe_HideCallForExam (void);
void Cfe_UnhideCallForExam (void);
void Cfe_FreeListCallsForExams (struct Cfe_CallsForExams *CallsForExams);
void Cfe_ListCallsForExamsSee (void);
void Cfe_ListCallsForExamsEdit (void);
void Cfe_ListCallsForExamsCod (void);
void Cfe_ListCallsForExamsDay (void);
void Cfe_CreateListCallsForExams (struct Cfe_CallsForExams *CallsForExams);
void Cfe_PutHiddenParamExaCod (long ExaCod);
void Cfe_GetSummaryAndContentCallForExam (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
char **ContentStr,
long ExaCod,bool GetContent);
#endif

View File

@ -600,12 +600,14 @@ TODO: Salvador Romero Cort
TODO: FIX BUG, URGENT! En las fechas como parámetro Dat_WriteParamsIniEndDates(), por ejemplo al cambiar el color de la gráfica de accesos por día y hora, no se respeta la zona horaria.
*/
#define Log_PLATFORM_VERSION "SWAD 20.50.11 (2021-03-17)"
#define Log_PLATFORM_VERSION "SWAD 20.51 (2021-03-18)"
#define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.6.2.js"
/*
TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 20.51: Mar 18, 2021 Call for exam module renamed. (307459 lines)
Version 20.50.11: Mar 17, 2021 Departments database table renamed. (307450 lines)
1 change necessary in database:
RENAME TABLE departments TO dpt_departments;

View File

@ -32,10 +32,10 @@
#include <string.h> // For string functions
#include "swad_attendance.h"
#include "swad_call_for_exam.h"
#include "swad_course.h"
#include "swad_course_config.h"
#include "swad_database.h"
#include "swad_exam_announcement.h"
#include "swad_figure.h"
#include "swad_figure_cache.h"
#include "swad_form.h"
@ -1948,7 +1948,7 @@ static void Crs_EmptyCourseCompletely (long CrsCod)
DB_QueryUPDATE ("can not remove exam announcements of a course",
"UPDATE exam_announcements SET Status=%u"
" WHERE CrsCod=%ld",
(unsigned) ExaAnn_DELETED_EXAM_ANNOUNCEMENT,CrsCod);
(unsigned) Cfe_DELETED_CALL_FOR_EXAM,CrsCod);
/***** Remove course cards of the course *****/
/* Remove content of course cards */

View File

@ -1214,7 +1214,7 @@ mysql> DESCRIBE exam_announcements;
"NumNotif INT NOT NULL DEFAULT 0,"
"CrsFullName VARCHAR(2047) NOT NULL," // Cns_HIERARCHY_MAX_BYTES_FULL_NAME
"Year TINYINT NOT NULL,"
"ExamSession VARCHAR(2047) NOT NULL," // ExaAnn_MAX_BYTES_SESSION
"ExamSession VARCHAR(2047) NOT NULL," // Cfe_MAX_BYTES_SESSION
"CallDate DATETIME NOT NULL,"
"ExamDate DATETIME NOT NULL,"
"Duration TIME NOT NULL,"

File diff suppressed because it is too large Load Diff

View File

@ -1,129 +0,0 @@
// swad_exam_announcement.h: exam announcements
#ifndef _SWAD_EXA_ANN
#define _SWAD_EXA_ANN
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2021 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General 3 License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include <stdbool.h> // For boolean type
#include "swad_constant.h"
#include "swad_course.h"
#include "swad_date.h"
#include "swad_notification.h"
/*****************************************************************************/
/************************** Public types and constants ***********************/
/*****************************************************************************/
#define ExaAnn_NUM_VIEWS 3
typedef enum
{
ExaAnn_NORMAL_VIEW,
ExaAnn_PRINT_VIEW,
ExaAnn_FORM_VIEW,
} ExaAnn_TypeViewExamAnnouncement_t;
#define ExaAnn_NUM_STATUS 3
typedef enum
{
ExaAnn_VISIBLE_EXAM_ANNOUNCEMENT = 0,
ExaAnn_HIDDEN_EXAM_ANNOUNCEMENT = 1,
ExaAnn_DELETED_EXAM_ANNOUNCEMENT = 2,
} ExaAnn_Status_t; // Don't change these numbers because they are used in database
#define ExaAnn_STATUS_DEFAULT ExaAnn_VISIBLE_EXAM_ANNOUNCEMENT
#define ExaAnn_MAX_CHARS_SESSION (128 - 1) // 127
#define ExaAnn_MAX_BYTES_SESSION ((ExaAnn_MAX_CHARS_SESSION + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
struct ExaAnn_ExamAnnouncement
{
long CrsCod;
ExaAnn_Status_t Status;
char CrsFullName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1];
unsigned Year; // Number of year (0 (N.A.), 1, 2, 3, 4, 5, 6) in the degree
char Session[ExaAnn_MAX_BYTES_SESSION + 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;
};
struct ExaAnn_ExamCodeAndDate
{
long ExaCod;
struct Date ExamDate;
};
struct ExaAnn_ExamAnnouncements
{
unsigned NumExaAnns; // Number of announcements of exam in the list
struct ExaAnn_ExamCodeAndDate *Lst; // List of exam announcements
long NewExaCod; // New exam announcement just created
long HighlightExaCod; // Exam announcement to be highlighted
char HighlightDate[4 + 2 + 2 + 1]; // Date with exam announcements to be highlighted (in YYYYMMDD format)
long ExaCod; // Used to put contextual icons
const char *Anchor; // Used to put contextual icons
struct ExaAnn_ExamAnnouncement ExamAnn;
};
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
void ExaAnn_ResetExamAnns (struct ExaAnn_ExamAnnouncements *ExamAnns);
void ExaAnn_PutFrmEditAExamAnn (void);
void ExaAnn_ReceiveExamAnn1 (void);
void ExaAnn_ReceiveExamAnn2 (void);
void ExaAnn_PrintExamAnn (void);
void ExaAnn_ReqRemoveExamAnn (void);
void ExaAnn_RemoveExamAnn1 (void);
void ExaAnn_RemoveExamAnn2 (void);
void ExaAnn_HideExamAnn (void);
void ExaAnn_UnhideExamAnn (void);
void ExaAnn_FreeListExamAnns (struct ExaAnn_ExamAnnouncements *ExamAnns);
void ExaAnn_ListExamAnnsSee (void);
void ExaAnn_ListExamAnnsEdit (void);
void ExaAnn_ListExamAnnsCod (void);
void ExaAnn_ListExamAnnsDay (void);
void ExaAnn_CreateListExamAnns (struct ExaAnn_ExamAnnouncements *ExamAnns);
void ExaAnn_PutHiddenParamExaCod (long ExaCod);
void ExaAnn_GetSummaryAndContentExamAnn (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
char **ContentStr,
long ExaCod,bool GetContent);
#endif

View File

@ -36,11 +36,10 @@
#include "swad_action.h"
#include "swad_API.h"
#include "swad_calendar.h"
#include "swad_room.h"
#include "swad_call_for_exam.h"
#include "swad_config.h"
#include "swad_constant.h"
#include "swad_department.h"
#include "swad_exam_announcement.h"
#include "swad_follow.h"
#include "swad_global.h"
#include "swad_hierarchy.h"
@ -50,6 +49,7 @@
#include "swad_program.h"
#include "swad_project.h"
#include "swad_role.h"
#include "swad_room.h"
#include "swad_setting.h"
#include "swad_statistic.h"
#include "swad_theme.h"

View File

@ -1873,67 +1873,67 @@ const char *Hlp_ASSESSMENT_Surveys_questions =
"ASSESSMENT.Surveys.en#questions";
#endif
const char *Hlp_ASSESSMENT_Announcements =
const char *Hlp_ASSESSMENT_Calls_for_exams =
#if L==1
"ASSESSMENT.Announcements.es";
"ASSESSMENT.Calls_for_exams.es";
#elif L==2
"ASSESSMENT.Announcements.en";
"ASSESSMENT.Calls_for_exams.en";
#elif L==3
"ASSESSMENT.Announcements.en";
"ASSESSMENT.Calls_for_exams.en";
#elif L==4
"ASSESSMENT.Announcements.es";
"ASSESSMENT.Calls_for_exams.es";
#elif L==5
"ASSESSMENT.Announcements.en";
"ASSESSMENT.Calls_for_exams.en";
#elif L==6
"ASSESSMENT.Announcements.es";
"ASSESSMENT.Calls_for_exams.es";
#elif L==7
"ASSESSMENT.Announcements.en";
"ASSESSMENT.Calls_for_exams.en";
#elif L==8
"ASSESSMENT.Announcements.en";
"ASSESSMENT.Calls_for_exams.en";
#elif L==9
"ASSESSMENT.Announcements.en";
"ASSESSMENT.Calls_for_exams.en";
#endif
const char *Hlp_ASSESSMENT_Announcements_new_announcement =
const char *Hlp_ASSESSMENT_Calls_for_exam_new_call =
#if L==1
"ASSESSMENT.Announcements.es#nueva-convocatoria";
"ASSESSMENT.Calls_for_exams.es#nueva-convocatoria";
#elif L==2
"ASSESSMENT.Announcements.en#new-announcement";
"ASSESSMENT.Calls_for_exams.en#new-call";
#elif L==3
"ASSESSMENT.Announcements.en#new-announcement";
"ASSESSMENT.Calls_for_exams.en#new-call";
#elif L==4
"ASSESSMENT.Announcements.es#nueva-convocatoria";
"ASSESSMENT.Calls_for_exams.es#nueva-convocatoria";
#elif L==5
"ASSESSMENT.Announcements.en#new-announcement";
"ASSESSMENT.Calls_for_exams.en#new-call";
#elif L==6
"ASSESSMENT.Announcements.es#nueva-convocatoria";
"ASSESSMENT.Calls_for_exams.es#nueva-convocatoria";
#elif L==7
"ASSESSMENT.Announcements.en#new-announcement";
"ASSESSMENT.Calls_for_exams.en#new-call";
#elif L==8
"ASSESSMENT.Announcements.en#new-announcement";
"ASSESSMENT.Calls_for_exams.en#new-call";
#elif L==9
"ASSESSMENT.Announcements.en#new-announcement";
"ASSESSMENT.Calls_for_exams.en#new-call";
#endif
const char *Hlp_ASSESSMENT_Announcements_edit_announcement =
#if L==1
"ASSESSMENT.Announcements.es#editar-convocatoria";
"ASSESSMENT.Calls_for_exams.es#editar-convocatoria";
#elif L==2
"ASSESSMENT.Announcements.en#edit-announcement";
"ASSESSMENT.Calls_for_exams.en#edit-call";
#elif L==3
"ASSESSMENT.Announcements.en#edit-announcement";
"ASSESSMENT.Calls_for_exams.en#edit-call";
#elif L==4
"ASSESSMENT.Announcements.es#editar-convocatoria";
"ASSESSMENT.Calls_for_exams.es#editar-convocatoria";
#elif L==5
"ASSESSMENT.Announcements.en#edit-announcement";
"ASSESSMENT.Calls_for_exams.en#edit-call";
#elif L==6
"ASSESSMENT.Announcements.es#editar-convocatoria";
"ASSESSMENT.Calls_for_exams.es#editar-convocatoria";
#elif L==7
"ASSESSMENT.Announcements.en#edit-announcement";
"ASSESSMENT.Calls_for_exams.en#edit-call";
#elif L==8
"ASSESSMENT.Announcements.en#edit-announcement";
"ASSESSMENT.Calls_for_exams.en#edit-call";
#elif L==9
"ASSESSMENT.Announcements.en#edit-announcement";
"ASSESSMENT.Calls_for_exams.en#edit-call";
#endif
/***** FILES tab *****/

View File

@ -34,11 +34,11 @@
#include "swad_banner.h"
#include "swad_box.h"
#include "swad_calendar.h"
#include "swad_call_for_exam.h"
#include "swad_changelog.h"
#include "swad_config.h"
#include "swad_connected.h"
#include "swad_database.h"
#include "swad_exam_announcement.h"
#include "swad_exam_session.h"
#include "swad_firewall.h"
#include "swad_follow.h"
@ -495,7 +495,7 @@ static void Lay_WriteScripts (void)
extern const char *Txt_DAYS_SMALL[7];
extern const char *Txt_Exam_of_X;
struct Hld_Holidays Holidays;
struct ExaAnn_ExamAnnouncements ExamAnns;
struct Cfe_CallsForExams ExamAnns;
unsigned DayOfWeek; /* 0, 1, 2, 3, 4, 5, 6 */
unsigned NumHld;
unsigned NumExamAnnouncement; // Number of exam announcement
@ -542,10 +542,10 @@ static void Lay_WriteScripts (void)
Hld_GetListHolidays (&Holidays);
/***** Reset exam announcements context *****/
ExaAnn_ResetExamAnns (&ExamAnns);
Cfe_ResetCallsForExams (&ExamAnns);
/***** Create list of exam announcements *****/
ExaAnn_CreateListExamAnns (&ExamAnns);
Cfe_CreateListCallsForExams (&ExamAnns);
/***** Write script to initialize variables used to draw months *****/
HTM_SCRIPT_Begin (NULL,NULL);
@ -579,7 +579,7 @@ static void Lay_WriteScripts (void)
HTM_TxtF ("\tvar LstExamAnnouncements = [];\n");
for (NumExamAnnouncement = 0;
NumExamAnnouncement < ExamAnns.NumExaAnns;
NumExamAnnouncement < ExamAnns.NumCallsForExams;
NumExamAnnouncement++)
HTM_TxtF ("LstExamAnnouncements.push({ ExaCod: %ld, Year: %u, Month: %u, Day: %u });\n",
ExamAnns.Lst[NumExamAnnouncement].ExaCod,
@ -590,7 +590,7 @@ static void Lay_WriteScripts (void)
HTM_SCRIPT_End ();
/***** Free list of exam announcements *****/
ExaAnn_FreeListExamAnns (&ExamAnns);
Cfe_FreeListCallsForExams (&ExamAnns);
/***** Free list of holidays *****/
Hld_FreeListHolidays (&Holidays);

View File

@ -33,11 +33,11 @@
#include "swad_action.h"
#include "swad_box.h"
#include "swad_call_for_exam.h"
#include "swad_config.h"
#include "swad_config.h"
#include "swad_database.h"
#include "swad_enrolment.h"
#include "swad_exam_announcement.h"
#include "swad_figure.h"
#include "swad_follow.h"
#include "swad_form.h"
@ -85,7 +85,7 @@ const char *Ntf_WSNotifyEvents[Ntf_NUM_NOTIFY_EVENTS] =
/* Assessment tab */
[Ntf_EVENT_ASSIGNMENT ] = "assignment",
[Ntf_EVENT_SURVEY ] = "survey",
[Ntf_EVENT_EXAM_ANNOUNCEMENT] = "examAnnouncement",
[Ntf_EVENT_CALL_FOR_EXAM] = "examAnnouncement",
/* Files tab */
[Ntf_EVENT_DOCUMENT_FILE ] = "documentFile",
[Ntf_EVENT_TEACHERS_FILE ] = "teachersFile",
@ -123,7 +123,7 @@ static const Act_Action_t Ntf_DefaultActions[Ntf_NUM_NOTIFY_EVENTS] =
/* Assessment tab */
[Ntf_EVENT_ASSIGNMENT ] = ActSeeAsg,
[Ntf_EVENT_SURVEY ] = ActSeeAllSvy,
[Ntf_EVENT_EXAM_ANNOUNCEMENT] = ActSeeAllExaAnn,
[Ntf_EVENT_CALL_FOR_EXAM] = ActSeeAllExaAnn,
/* Files tab */
[Ntf_EVENT_DOCUMENT_FILE ] = ActSeeAdmDocCrsGrp,
[Ntf_EVENT_TEACHERS_FILE ] = ActAdmTchCrsGrp,
@ -166,7 +166,7 @@ static const char *Ntf_ParamNotifMeAboutNotifyEvents[Ntf_NUM_NOTIFY_EVENTS] =
/* Assessment tab */
[Ntf_EVENT_ASSIGNMENT ] = "NotifyNtfEventAssignment",
[Ntf_EVENT_SURVEY ] = "NotifyNtfEventSurvey",
[Ntf_EVENT_EXAM_ANNOUNCEMENT] = "NotifyNtfEventExamAnnouncement",
[Ntf_EVENT_CALL_FOR_EXAM] = "NotifyNtfEventExamAnnouncement",
/* Files tab */
[Ntf_EVENT_DOCUMENT_FILE ] = "NotifyNtfEventDocumentFile",
[Ntf_EVENT_TEACHERS_FILE ] = "NotifyNtfEventTeachersFile",
@ -205,7 +205,7 @@ static const char *Ntf_ParamEmailMeAboutNotifyEvents[Ntf_NUM_NOTIFY_EVENTS] =
/* Assessment tab */
[Ntf_EVENT_ASSIGNMENT ] = "EmailNtfEventAssignment",
[Ntf_EVENT_SURVEY ] = "EmailNtfEventSurvey",
[Ntf_EVENT_EXAM_ANNOUNCEMENT] = "EmailNtfEventExamAnnouncement",
[Ntf_EVENT_CALL_FOR_EXAM] = "EmailNtfEventExamAnnouncement",
/* Files tab */
[Ntf_EVENT_DOCUMENT_FILE ] = "EmailNtfEventDocumentFile",
[Ntf_EVENT_TEACHERS_FILE ] = "EmailNtfEventTeachersFile",
@ -244,7 +244,7 @@ static const char *Ntf_Icons[Ntf_NUM_NOTIFY_EVENTS] =
/* Assessment tab */
[Ntf_EVENT_ASSIGNMENT ] = "edit.svg",
[Ntf_EVENT_SURVEY ] = "poll.svg",
[Ntf_EVENT_EXAM_ANNOUNCEMENT] = "bullhorn.svg",
[Ntf_EVENT_CALL_FOR_EXAM] = "bullhorn.svg",
/* Files tab */
[Ntf_EVENT_DOCUMENT_FILE ] = "file.svg",
[Ntf_EVENT_TEACHERS_FILE ] = "file.svg",
@ -858,8 +858,8 @@ void Ntf_GetNotifSummaryAndContent (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
case Ntf_EVENT_ASSIGNMENT:
Asg_GetNotifAssignment (SummaryStr,ContentStr,Cod,GetContent);
break;
case Ntf_EVENT_EXAM_ANNOUNCEMENT:
ExaAnn_GetSummaryAndContentExamAnn (SummaryStr,ContentStr,Cod,GetContent);
case Ntf_EVENT_CALL_FOR_EXAM:
Cfe_GetSummaryAndContentCallForExam (SummaryStr,ContentStr,Cod,GetContent);
break;
case Ntf_EVENT_MARKS_FILE:
Mrk_GetNotifMyMarks (SummaryStr,ContentStr,Cod,UsrCod,GetContent);
@ -1250,7 +1250,7 @@ unsigned Ntf_StoreNotifyEventsToAllUsrs (Ntf_NotifyEvent_t NotifyEvent,long Cod)
Cod,Cod,Gbl.Usrs.Me.UsrDat.UsrCod,
Cod,Gbl.Usrs.Me.UsrDat.UsrCod);
break;
case Ntf_EVENT_EXAM_ANNOUNCEMENT:
case Ntf_EVENT_CALL_FOR_EXAM:
case Ntf_EVENT_NOTICE:
NumRows = DB_QuerySELECT (&mysql_res,"can not get users"
" to be notified",
@ -1708,7 +1708,7 @@ static void Ntf_SendPendingNotifByEMailToOneUsr (struct UsrData *ToUsrDat,unsign
case Ntf_EVENT_TEACHERS_FILE:
case Ntf_EVENT_SHARED_FILE:
case Ntf_EVENT_ASSIGNMENT:
case Ntf_EVENT_EXAM_ANNOUNCEMENT:
case Ntf_EVENT_CALL_FOR_EXAM:
case Ntf_EVENT_MARKS_FILE:
case Ntf_EVENT_ENROLMENT_STD:
case Ntf_EVENT_ENROLMENT_NET:

View File

@ -69,7 +69,7 @@ typedef enum // TODO: Change numbers (also in database)!!!!!!!!!!!!!!
/* Assessment tab */
Ntf_EVENT_ASSIGNMENT = 4,
Ntf_EVENT_SURVEY = 19,
Ntf_EVENT_EXAM_ANNOUNCEMENT = 5,
Ntf_EVENT_CALL_FOR_EXAM = 5,
/* Files tab */
Ntf_EVENT_DOCUMENT_FILE = 1,
Ntf_EVENT_TEACHERS_FILE = 2,

View File

@ -1761,48 +1761,6 @@ const char *Txt_Announcements =
"An&uacute;ncios";
#endif
const char *Txt_Announcement_of_exam_removed =
#if L==1 // ca
"Convocat&ograve;ria d'examen eliminada.";
#elif L==2 // de
"Aufruf zur Pr&uuml;fung entfernt.";
#elif L==3 // en
"Announcement of exam removed.";
#elif L==4 // es
"Convocatoria de examen eliminada.";
#elif L==5 // fr
"Convocation pour l'examen supprim&eacute;.";
#elif L==6 // gn
"Convocatoria de examen eliminada."; // Okoteve traducción
#elif L==7 // it
"Appello d'esame rimosso.";
#elif L==8 // pl
"Ogloszenie egzamin usuniete.";
#elif L==9 // pt
"Chamada para exame removida.";
#endif
const char *Txt_Announcements_of_exams =
#if L==1 // ca
"Convocat&ograve;ries d'ex&agrave;mens";
#elif L==2 // de
"Aufrufe f&uuml;r Pr&uuml;fung";
#elif L==3 // en
"Announcements of exams";
#elif L==4 // es
"Convocatorias de ex&aacute;menes";
#elif L==5 // fr
"Convocations &agrave; examens";
#elif L==6 // gn
"Convocatorias de ex&aacute;menes"; // Okoteve traducción
#elif L==7 // it
"Appelli d'esame";
#elif L==8 // pl
"Ogloszenia egzamin&oacute;w";
#elif L==9 // pt
"Chamadas para exames";
#endif
const char *Txt_Another_building =
#if L==1 // ca
"Un altre edifici";
@ -3492,6 +3450,321 @@ const char *Txt_Calendar =
"Calend&aacute;rio";
#endif
const char *Txt_CALL_FOR_EXAM =
#if L==1 // ca
"CONVOCAT&Ograve;RIA D'EXAMEN";
#elif L==2 // de
"PR&Uuml;FUNGSAUFRUF";
#elif L==3 // en
"CALL FOR EXAM";
#elif L==4 // es
"CONVOCATORIA DE EXAMEN";
#elif L==5 // fr
"CONVOCATION &Agrave; UN EXAMEN";
#elif L==6 // gn
"CONVOCATORIA DE EXAMEN"; // Okoteve traducción
#elif L==7 // it
"APPELLO D'ESAME";
#elif L==8 // pl
"OGLOSZENIE egzaminu";
#elif L==9 // pt
"CHAMADA DE EXAME";
#endif
const char *Txt_CALL_FOR_EXAM_Approximate_duration =
#if L==1 // ca
"Duraci&oacute;n aproximada"; // Necessita traduccio
#elif L==2 // de
"Voraussichtliche Dauer";
#elif L==3 // en
"Approximate duration";
#elif L==4 // es
"Duraci&oacute;n aproximada";
#elif L==5 // fr
"Dur&eacute;e approximative";
#elif L==6 // gn
"Duraci&oacute;n aproximada"; // Okoteve traducción
#elif L==7 // it
"Durata approssimativa";
#elif L==8 // pl
"Przyblizony czas trwania";
#elif L==9 // pt
"Dura&ccedil;&atilde;o aproximada";
#endif
const char *Txt_CALL_FOR_EXAM_Course =
#if L==1 // ca
"Assignatura";
#elif L==2 // de
"Kurs";
#elif L==3 // en
"Course";
#elif L==4 // es
"Asignatura";
#elif L==5 // fr
"Mati&egrave;re";
#elif L==6 // gn
"Mbo'esyry";
#elif L==7 // it
"Corso";
#elif L==8 // pl
"Kurs";
#elif L==9 // pt
"Disciplina";
#endif
const char *Txt_CALL_FOR_EXAM_Documentation_required =
#if L==1 // ca
"Documentaci&oacute;n exigida"; // Necessita traduccio
#elif L==2 // de
"Ausweis erforderlich";
#elif L==3 // en
"ID required";
#elif L==4 // es
"Documentaci&oacute;n exigida";
#elif L==5 // fr
"Pi&egrave;ce d'identité obligatoire";
#elif L==6 // gn
"Documentaci&oacute;n exigida"; // Okoteve traducción
#elif L==7 // it
"Documentazione richiesta";
#elif L==8 // pl
"ID wymagane";
#elif L==9 // pt
"Documenta&ccedil;&atilde;o necess&aacute;ria";
#endif
const char *Txt_CALL_FOR_EXAM_Exam_date =
#if L==1 // ca
"Fecha del examen"; // Necessita traduccio
#elif L==2 // de
"Pr&uuml;fungsdatum";
#elif L==3 // en
"Exam date";
#elif L==4 // es
"Fecha del examen";
#elif L==5 // fr
"Date de l'examen";
#elif L==6 // gn
"Fecha del examen"; // Okoteve traducción
#elif L==7 // it
"Data d'esame";
#elif L==8 // pl
"Termin egzaminu";
#elif L==9 // pt
"Exame data";
#endif
const char *Txt_CALL_FOR_EXAM_Material_allowed =
#if L==1 // ca
"Material permitido"; // Necessita traduccio
#elif L==2 // de
"Erlaubte Unterlagen";
#elif L==3 // en
"Material allowed";
#elif L==4 // es
"Material permitido";
#elif L==5 // fr
"Mat&eacute;riel autoris&eacute;";
#elif L==6 // gn
"Material permitido"; // Okoteve traducción
#elif L==7 // it
"Materiale permesso";
#elif L==8 // pl
"Material dozwolone";
#elif L==9 // pt
"Material autorizado";
#endif
const char *Txt_CALL_FOR_EXAM_Material_required =
#if L==1 // ca
"Material obligatorio"; // Necessita traduccio
#elif L==2 // de
"Erforderliche Unterlagen";
#elif L==3 // en
"Material required";
#elif L==4 // es
"Material obligatorio";
#elif L==5 // fr
"Mat&eacute;riel n&eacute;cessaire";
#elif L==6 // gn
"Material obligatorio"; // Okoteve traducción
#elif L==7 // it
"Materiale richiesto";
#elif L==8 // pl
"Materialy niezbedne do";
#elif L==9 // pt
"Material obrigat&oacute;rio";
#endif
const char *Txt_CALL_FOR_EXAM_Mode =
#if L==1 // ca
"Modalidad<br />(escrito, oral,&hellip;)"; // Necessita traduccio
#elif L==2 // de
"Pr&uuml;fungsart<br />(schriftlich, m&uuml;ndlich,&hellip;)";
#elif L==3 // en
"Mode<br />(written, oral,&hellip;)";
#elif L==4 // es
"Modalidad<br />(escrito, oral,&hellip;)";
#elif L==5 // fr
"Mode<br />(&eacute;crit, oral,&hellip;)";
#elif L==6 // gn
"Modalidad<br />(escrito, oral,&hellip;)"; // Okoteve traducción
#elif L==7 // it
"Modalit&agrave;<br />(scritto, orale,&hellip;)";
#elif L==8 // pl
"Tryb<br />(pisemnej, ustnej,&hellip;)";
#elif L==9 // pt
"Modalidade<br />(escrita, oral,&hellip;)";
#endif
const char *Txt_CALL_FOR_EXAM_Other_information =
#if L==1 // ca
"Otras indicaciones"; // Necessita traduccio
#elif L==2 // de
"Weitere Informationen";
#elif L==3 // en
"Other information";
#elif L==4 // es
"Otras indicaciones";
#elif L==5 // fr
"Autres informations";
#elif L==6 // gn
"Otras indicaciones"; // Okoteve traducción
#elif L==7 // it
"Altre informazioni";
#elif L==8 // pl
"Inne informacje";
#elif L==9 // pt
"Outras informa&ccedil;&otilde;es";
#endif
const char *Txt_CALL_FOR_EXAM_Place_of_exam =
#if L==1 // ca
"Lugar de realizaci&oacute;n"; // Necessita traduccio
#elif L==2 // de
"Pr&uuml;fungsort";
#elif L==3 // en
"Place of exam";
#elif L==4 // es
"Lugar de realizaci&oacute;n";
#elif L==5 // fr
"Lieu de l'examen";
#elif L==6 // gn
"Lugar de realizaci&oacute;n"; // Okoteve traducción
#elif L==7 // it
"Luogo d'esame";
#elif L==8 // pl
"Miejsce egzaminu";
#elif L==9 // pt
"Local do exame";
#endif
const char *Txt_CALL_FOR_EXAM_Session =
#if L==1 // ca
"Convocatoria<br />(junio, septiembre,&hellip;)"; // Necessita traduccio
#elif L==2 // de
"Einberufung<br />(Juni, September,&hellip;)";
#elif L==3 // en
"Session<br />(june, september,&hellip;)";
#elif L==4 // es
"Convocatoria<br />(junio, septiembre,&hellip;)";
#elif L==5 // fr
"P&eacute;riode<br />(juin, septembre,&hellip;)";
#elif L==6 // gn
"Convocatoria<br />(junio, septiembre,&hellip;)"; // Okoteve traducción
#elif L==7 // it
"Sessione<br />(giugno, settembre,&hellip;)";
#elif L==8 // pl
"Sesja<br />(czerwiec, wrzesien,&hellip;)";
#elif L==9 // pt
"Per&iacute;odo<br />(junho, setembro,&hellip;)";
#endif
const char *Txt_CALL_FOR_EXAM_Start_time =
#if L==1 // ca
"Hora de inicio"; // Necessita traduccio
#elif L==2 // de
"Beginn um";
#elif L==3 // en
"Start time";
#elif L==4 // es
"Hora de inicio";
#elif L==5 // fr
"Heure de d&eacute;but";
#elif L==6 // gn
"Hora de inicio"; // Okoteve traducción
#elif L==7 // it
"Ora d'inizio";
#elif L==8 // pl
"Czas rozpoczecia";
#elif L==9 // pt
"Hora de in&iacute;cio";
#endif
const char *Txt_CALL_FOR_EXAM_Structure_of_the_exam =
#if L==1 // ca
"Estructura del examen"; // Necessita traduccio
#elif L==2 // de
"Pr&uuml;fungsstruktur";
#elif L==3 // en
"Structure of the exam";
#elif L==4 // es
"Estructura del examen";
#elif L==5 // fr
"Structure de l'examen";
#elif L==6 // gn
"Estructura del examen"; // Okoteve traducción
#elif L==7 // it
"Struttura d'esame";
#elif L==8 // pl
"Struktura egzaminu";
#elif L==9 // pt
"Estrutura do exame";
#endif
const char *Txt_CALL_FOR_EXAM_Year_or_semester = // 1, 2, 3..., not 1984, 2038...
#if L==1 // ca
"Any o semestre";
#elif L==2 // de
"Jahr oder Semester";
#elif L==3 // en
"Year or semester";
#elif L==4 // es
"A&ntilde;o o semestre";
#elif L==5 // fr
"Ann&eacute;e ou semestre";
#elif L==6 // gn
"A&ntilde;o o semestre"; // Okoteve traducción
#elif L==7 // it
"Anno o semestre";
#elif L==8 // pl
"Rok lub semestr";
#elif L==9 // pt
"Ano ou semestre";
#endif
const char *Txt_Call_for_exam_removed =
#if L==1 // ca
"Convocat&ograve;ria d'examen eliminada.";
#elif L==2 // de
"Aufruf zur Pr&uuml;fung entfernt.";
#elif L==3 // en
"Call for exam removed.";
#elif L==4 // es
"Convocatoria de examen eliminada.";
#elif L==5 // fr
"Convocation pour l'examen supprim&eacute;.";
#elif L==6 // gn
"Convocatoria de examen eliminada."; // Okoteve traducción
#elif L==7 // it
"Appello d'esame rimosso.";
#elif L==8 // pl
"Ogloszenie egzamin usuniete.";
#elif L==9 // pt
"Chamada para exame removida.";
#endif
const char *Txt_Call_the_roll =
#if L==1 // ca
"Passar llista";
@ -3513,6 +3786,27 @@ const char *Txt_Call_the_roll =
"Lista de presen&ccedil;a";
#endif
const char *Txt_Calls_for_exams =
#if L==1 // ca
"Convocat&ograve;ries d'ex&agrave;mens";
#elif L==2 // de
"Aufrufe f&uuml;r Pr&uuml;fung";
#elif L==3 // en
"Calls for exams";
#elif L==4 // es
"Convocatorias de ex&aacute;menes";
#elif L==5 // fr
"Convocations &agrave; examens";
#elif L==6 // gn
"Convocatorias de ex&aacute;menes"; // Okoteve traducción
#elif L==7 // it
"Appelli d'esame";
#elif L==8 // pl
"Ogloszenia egzamin&oacute;w";
#elif L==9 // pt
"Chamadas para exames";
#endif
const char *Txt_Can_not_create_the_folder_X_because_it_would_exceed_the_disk_quota = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"No s'ha creat la carpeta <strong>%s</strong>"
@ -5094,7 +5388,6 @@ const char *Txt_Could_not_detect_any_face_in_front_position_ =
"N&atilde;o foi poss&iacute;vel detectar nenhum rosto na posi&ccedil;&atilde;o frontal.";
#endif
const char *Txt_Countdown =
#if L==1 // ca
"Compte enrere";
@ -6553,27 +6846,6 @@ const char *Txt_Create_ZIP_file =
"Criar arquivo ZIP";
#endif
const char *Txt_Created_new_announcement_of_exam =
#if L==1 // ca
"Creada nueva convocatoria de examen."; // Necessita traduccio
#elif L==2 // de
"Neuer Aufruf zur Pr&uuml;fung erstellt.";
#elif L==3 // en
"Created new announcement of exam.";
#elif L==4 // es
"Creada nueva convocatoria de examen.";
#elif L==5 // fr
"Cr&eacute;&eacute; nouvelle convocation &agrave; un examen.";
#elif L==6 // gn
"Creada nueva convocatoria de examen."; // Okoteve traducción
#elif L==7 // it
"Creato nuovo appello d'esame.";
#elif L==8 // pl
"Utworzono nowe ogloszenie egzamin.";
#elif L==9 // pt
"Criado nova chamada para exame.";
#endif
const char *Txt_Created_new_assignment_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"Creada nova activitat <strong>%s</strong>.";
@ -6637,6 +6909,27 @@ const char *Txt_Created_new_building_X = // Warning: it is very important to inc
"Criado novo edif&iacute;cio <strong>%s</strong>.";
#endif
const char *Txt_Created_new_call_for_exam =
#if L==1 // ca
"Creada nueva convocatoria de examen."; // Necessita traduccio
#elif L==2 // de
"Neuer Aufruf zur Pr&uuml;fung erstellt.";
#elif L==3 // en
"Created new call for exam.";
#elif L==4 // es
"Creada nueva convocatoria de examen.";
#elif L==5 // fr
"Cr&eacute;&eacute; nouvelle convocation &agrave; un examen.";
#elif L==6 // gn
"Creada nueva convocatoria de examen."; // Okoteve traducción
#elif L==7 // it
"Creato nuovo appello d'esame.";
#elif L==8 // pl
"Utworzono nowe ogloszenie egzamin.";
#elif L==9 // pt
"Criado nova chamada para exame.";
#endif
const char *Txt_Created_new_center_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"Creat nou center <strong>%s</strong>."; // Necessita traduccio
@ -9248,13 +9541,13 @@ const char *Txt_Do_you_really_want_to_remove_the_folder_X = // Warning: it is ve
" o diret&oacute;rio <strong>%s</strong> e todo o seu conte&uacute;do?";
#endif
const char *Txt_Do_you_really_want_to_remove_the_following_announcement_of_exam =
const char *Txt_Do_you_really_want_to_remove_the_following_call_for_exam =
#if L==1 // ca
"De veres voleu eliminar la seg&uuml;ent convocat&ograve;ria d'examen?";
#elif L==2 // de
"Wollen Sie wirklich, um die folgende Aufruf f&uuml;r Pr&uuml;fung?";
#elif L==3 // en
"Do you really want to remove the following announcement of exam?";
"Do you really want to remove the following call for exam?";
#elif L==4 // es
"&iquest;Realmente desea eliminar la siguiente convocatoria de examen?";
#elif L==5 // fr
@ -11731,300 +12024,6 @@ const char *Txt_Exam =
"Exame";
#endif
const char *Txt_EXAM_ANNOUNCEMENT =
#if L==1 // ca
"CONVOCAT&Ograve;RIA D'EXAMEN";
#elif L==2 // de
"PR&Uuml;FUNGSAUFRUF";
#elif L==3 // en
"ANNOUNCEMENT OF EXAM";
#elif L==4 // es
"CONVOCATORIA DE EXAMEN";
#elif L==5 // fr
"CONVOCATION &Agrave; UN EXAMEN";
#elif L==6 // gn
"CONVOCATORIA DE EXAMEN"; // Okoteve traducción
#elif L==7 // it
"APPELLO D'ESAME";
#elif L==8 // pl
"OGLOSZENIE egzaminu";
#elif L==9 // pt
"CHAMADA DE EXAME";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Approximate_duration =
#if L==1 // ca
"Duraci&oacute;n aproximada"; // Necessita traduccio
#elif L==2 // de
"Voraussichtliche Dauer";
#elif L==3 // en
"Approximate duration";
#elif L==4 // es
"Duraci&oacute;n aproximada";
#elif L==5 // fr
"Dur&eacute;e approximative";
#elif L==6 // gn
"Duraci&oacute;n aproximada"; // Okoteve traducción
#elif L==7 // it
"Durata approssimativa";
#elif L==8 // pl
"Przyblizony czas trwania";
#elif L==9 // pt
"Dura&ccedil;&atilde;o aproximada";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Course =
#if L==1 // ca
"Assignatura";
#elif L==2 // de
"Kurs";
#elif L==3 // en
"Course";
#elif L==4 // es
"Asignatura";
#elif L==5 // fr
"Mati&egrave;re";
#elif L==6 // gn
"Mbo'esyry";
#elif L==7 // it
"Corso";
#elif L==8 // pl
"Kurs";
#elif L==9 // pt
"Disciplina";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Documentation_required =
#if L==1 // ca
"Documentaci&oacute;n exigida"; // Necessita traduccio
#elif L==2 // de
"Ausweis erforderlich";
#elif L==3 // en
"ID required";
#elif L==4 // es
"Documentaci&oacute;n exigida";
#elif L==5 // fr
"Pi&egrave;ce d'identité obligatoire";
#elif L==6 // gn
"Documentaci&oacute;n exigida"; // Okoteve traducción
#elif L==7 // it
"Documentazione richiesta";
#elif L==8 // pl
"ID wymagane";
#elif L==9 // pt
"Documenta&ccedil;&atilde;o necess&aacute;ria";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Exam_date =
#if L==1 // ca
"Fecha del examen"; // Necessita traduccio
#elif L==2 // de
"Pr&uuml;fungsdatum";
#elif L==3 // en
"Exam date";
#elif L==4 // es
"Fecha del examen";
#elif L==5 // fr
"Date de l'examen";
#elif L==6 // gn
"Fecha del examen"; // Okoteve traducción
#elif L==7 // it
"Data d'esame";
#elif L==8 // pl
"Termin egzaminu";
#elif L==9 // pt
"Exame data";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Material_allowed =
#if L==1 // ca
"Material permitido"; // Necessita traduccio
#elif L==2 // de
"Erlaubte Unterlagen";
#elif L==3 // en
"Material allowed";
#elif L==4 // es
"Material permitido";
#elif L==5 // fr
"Mat&eacute;riel autoris&eacute;";
#elif L==6 // gn
"Material permitido"; // Okoteve traducción
#elif L==7 // it
"Materiale permesso";
#elif L==8 // pl
"Material dozwolone";
#elif L==9 // pt
"Material autorizado";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Material_required =
#if L==1 // ca
"Material obligatorio"; // Necessita traduccio
#elif L==2 // de
"Erforderliche Unterlagen";
#elif L==3 // en
"Material required";
#elif L==4 // es
"Material obligatorio";
#elif L==5 // fr
"Mat&eacute;riel n&eacute;cessaire";
#elif L==6 // gn
"Material obligatorio"; // Okoteve traducción
#elif L==7 // it
"Materiale richiesto";
#elif L==8 // pl
"Materialy niezbedne do";
#elif L==9 // pt
"Material obrigat&oacute;rio";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Mode =
#if L==1 // ca
"Modalidad<br />(escrito, oral,&hellip;)"; // Necessita traduccio
#elif L==2 // de
"Pr&uuml;fungsart<br />(schriftlich, m&uuml;ndlich,&hellip;)";
#elif L==3 // en
"Mode<br />(written, oral,&hellip;)";
#elif L==4 // es
"Modalidad<br />(escrito, oral,&hellip;)";
#elif L==5 // fr
"Mode<br />(&eacute;crit, oral,&hellip;)";
#elif L==6 // gn
"Modalidad<br />(escrito, oral,&hellip;)"; // Okoteve traducción
#elif L==7 // it
"Modalit&agrave;<br />(scritto, orale,&hellip;)";
#elif L==8 // pl
"Tryb<br />(pisemnej, ustnej,&hellip;)";
#elif L==9 // pt
"Modalidade<br />(escrita, oral,&hellip;)";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Other_information =
#if L==1 // ca
"Otras indicaciones"; // Necessita traduccio
#elif L==2 // de
"Weitere Informationen";
#elif L==3 // en
"Other information";
#elif L==4 // es
"Otras indicaciones";
#elif L==5 // fr
"Autres informations";
#elif L==6 // gn
"Otras indicaciones"; // Okoteve traducción
#elif L==7 // it
"Altre informazioni";
#elif L==8 // pl
"Inne informacje";
#elif L==9 // pt
"Outras informa&ccedil;&otilde;es";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Place_of_exam =
#if L==1 // ca
"Lugar de realizaci&oacute;n"; // Necessita traduccio
#elif L==2 // de
"Pr&uuml;fungsort";
#elif L==3 // en
"Place of exam";
#elif L==4 // es
"Lugar de realizaci&oacute;n";
#elif L==5 // fr
"Lieu de l'examen";
#elif L==6 // gn
"Lugar de realizaci&oacute;n"; // Okoteve traducción
#elif L==7 // it
"Luogo d'esame";
#elif L==8 // pl
"Miejsce egzaminu";
#elif L==9 // pt
"Local do exame";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Session =
#if L==1 // ca
"Convocatoria<br />(junio, septiembre,&hellip;)"; // Necessita traduccio
#elif L==2 // de
"Einberufung<br />(Juni, September,&hellip;)";
#elif L==3 // en
"Session<br />(june, september,&hellip;)";
#elif L==4 // es
"Convocatoria<br />(junio, septiembre,&hellip;)";
#elif L==5 // fr
"P&eacute;riode<br />(juin, septembre,&hellip;)";
#elif L==6 // gn
"Convocatoria<br />(junio, septiembre,&hellip;)"; // Okoteve traducción
#elif L==7 // it
"Sessione<br />(giugno, settembre,&hellip;)";
#elif L==8 // pl
"Sesja<br />(czerwiec, wrzesien,&hellip;)";
#elif L==9 // pt
"Per&iacute;odo<br />(junho, setembro,&hellip;)";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Start_time =
#if L==1 // ca
"Hora de inicio"; // Necessita traduccio
#elif L==2 // de
"Beginn um";
#elif L==3 // en
"Start time";
#elif L==4 // es
"Hora de inicio";
#elif L==5 // fr
"Heure de d&eacute;but";
#elif L==6 // gn
"Hora de inicio"; // Okoteve traducción
#elif L==7 // it
"Ora d'inizio";
#elif L==8 // pl
"Czas rozpoczecia";
#elif L==9 // pt
"Hora de in&iacute;cio";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Structure_of_the_exam =
#if L==1 // ca
"Estructura del examen"; // Necessita traduccio
#elif L==2 // de
"Pr&uuml;fungsstruktur";
#elif L==3 // en
"Structure of the exam";
#elif L==4 // es
"Estructura del examen";
#elif L==5 // fr
"Structure de l'examen";
#elif L==6 // gn
"Estructura del examen"; // Okoteve traducción
#elif L==7 // it
"Struttura d'esame";
#elif L==8 // pl
"Struktura egzaminu";
#elif L==9 // pt
"Estrutura do exame";
#endif
const char *Txt_EXAM_ANNOUNCEMENT_Year_or_semester = // 1, 2, 3..., not 1984, 2038...
#if L==1 // ca
"Any o semestre";
#elif L==2 // de
"Jahr oder Semester";
#elif L==3 // en
"Year or semester";
#elif L==4 // es
"A&ntilde;o o semestre";
#elif L==5 // fr
"Ann&eacute;e ou semestre";
#elif L==6 // gn
"A&ntilde;o o semestre"; // Okoteve traducción
#elif L==7 // it
"Anno o semestre";
#elif L==8 // pl
"Rok lub semestr";
#elif L==9 // pt
"Ano ou semestre";
#endif
const char *Txt_EXAM_LOG_ACTIONS[ExaLog_NUM_ACTIONS] =
{
[ExaLog_UNKNOWN_ACTION] =
@ -18567,13 +18566,13 @@ const char *Txt_Link_X_removed = // Warning: it is very important to include %s
"Liga&ccedil;&atilde;o <strong>%s</strong> removida.";
#endif
const char *Txt_Link_to_announcement_of_exam =
const char *Txt_Link_to_call_for_exam =
#if L==1 // ca
"Enlla&ccedil; a convocat&ograve;ria d'examen";
#elif L==2 // de
"Link zu Aufruf f&uuml;r Pr&uuml;fung";
#elif L==3 // en
"Link to announcement of exam";
"Link to call for exam";
#elif L==4 // es
"Enlace a convocatoria de examen";
#elif L==5 // fr
@ -22282,7 +22281,7 @@ const char *Txt_MENU_SUBTITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] =
#elif L==2 // de
"Pr&uuml;fungsaufruf"
#elif L==3 // en
"Announcements of exams"
"Calls for exams"
#elif L==4 // es
"Listado de convocatorias de ex&aacute;menes de esta asignatura"
#elif L==5 // fr
@ -25124,7 +25123,7 @@ const char *Txt_New_announcement =
"Novo an&uacute;ncio";
#endif
const char *Txt_New_announcement_OF_EXAM =
const char *Txt_New_call_FOR_EXAM =
#if L==1 // ca
"Nova convocat&ograve;ria";
#elif L==2 // de
@ -26153,27 +26152,6 @@ const char *Txt_No_announcements =
"N&atilde;o h&aacute; an&uacute;ncios";
#endif
const char *Txt_No_announcements_of_exams_of_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"No hay convocatorias de examen de <strong>%s</strong>."; // Necessita traduccio
#elif L==2 // de
"Keine Aufrufe f&uuml;r Pr&uuml;fung von <strong>%s</strong>.";
#elif L==3 // en
"No announcements of exams of <strong>%s</strong>.";
#elif L==4 // es
"No hay convocatorias de examen de <strong>%s</strong>.";
#elif L==5 // fr
"Aucune convocation &agrave; un examen de <strong>%s</strong>.";
#elif L==6 // gn
"No hay convocatorias de examen de <strong>%s</strong>."; // Okoteve traducción
#elif L==7 // it
"Nessun appello d'esame di <strong>%s</strong>.";
#elif L==8 // pl
"Brak ogloszen egzamin&oacute;w <strong>%s</strong>.";
#elif L==9 // pt
"N&atilde;o chamadas para exame de <strong>%s</strong>.";
#endif
const char *Txt_No_assigned_building =
#if L==1 // ca
"Sense edifici assignat";
@ -26258,6 +26236,27 @@ const char *Txt_No_banners =
"N&atilde;o h&aacute; banners.";
#endif
const char *Txt_No_calls_for_exams_of_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"No hay convocatorias de examen de <strong>%s</strong>."; // Necessita traduccio
#elif L==2 // de
"Keine Aufrufe f&uuml;r Pr&uuml;fung von <strong>%s</strong>.";
#elif L==3 // en
"No calls for exams of <strong>%s</strong>.";
#elif L==4 // es
"No hay convocatorias de examen de <strong>%s</strong>.";
#elif L==5 // fr
"Aucune convocation &agrave; un examen de <strong>%s</strong>.";
#elif L==6 // gn
"No hay convocatorias de examen de <strong>%s</strong>."; // Okoteve traducción
#elif L==7 // it
"Nessun appello d'esame di <strong>%s</strong>.";
#elif L==8 // pl
"Brak ogloszen egzamin&oacute;w <strong>%s</strong>.";
#elif L==9 // pt
"N&atilde;o chamadas para exame de <strong>%s</strong>.";
#endif
const char *Txt_no_course_of_origin = // Means: "message sent from any course"
#if L==1 // ca
"sin asignatura de origen"; // Necessita traduccio
@ -27793,13 +27792,13 @@ const char *Txt_NOTIFY_EVENTS_PLURAL[Ntf_NUM_NOTIFY_EVENTS] =
"Novas atividades"
#endif
,
[Ntf_EVENT_EXAM_ANNOUNCEMENT] =
[Ntf_EVENT_CALL_FOR_EXAM] =
#if L==1 // ca
"Noves convocat&ograve;ries d'examen"
#elif L==2 // de
"Neue Aufrufe f&uuml;r Pr&uuml;fung"
#elif L==3 // en
"New announcements of exam"
"New calls for exam"
#elif L==4 // es
"Nuevas convocatorias de examen"
#elif L==5 // fr
@ -28237,13 +28236,13 @@ const char *Txt_NOTIFY_EVENTS_SINGULAR[Ntf_NUM_NOTIFY_EVENTS] =
"Atividade"
#endif
,
[Ntf_EVENT_EXAM_ANNOUNCEMENT] =
[Ntf_EVENT_CALL_FOR_EXAM] =
#if L==1 // ca
"Convocat&ograve;ria d'examen"
#elif L==2 // de
"Aufrufe für Pr&uuml;fung"
#elif L==3 // en
"Announcement of exam"
"Call for exam"
#elif L==4 // es
"Convocatoria de examen"
#elif L==5 // fr
@ -32851,13 +32850,13 @@ const char *Txt_Public_views =
"Acessos p&uacute;blicos";
#endif
const char *Txt_Publish_announcement_OF_EXAM =
const char *Txt_Publish_call_FOR_EXAM =
#if L==1 // ca
"Publicar convocat&ograve;ria";
#elif L==2 // de
"Ver&ouml;ffentlichen Aufruf";
#elif L==3 // en
"Publish announcement";
"Publish call";
#elif L==4 // es
"Publicar convocatoria";
#elif L==5 // fr
@ -46252,27 +46251,6 @@ const char *Txt_The_alphabetical_code_X_is_not_correct = // Warning: it is very
"O c&oacute;digo alfab&eacute;tico ISO 3166-1 %s n&atilde;o est&aacute; correto.";
#endif
const char *Txt_The_announcement_of_exam_has_been_successfully_updated =
#if L==1 // ca
"La convocat&ograve;ria d'examen s'ha actualitzat correctament.";
#elif L==2 // de
"Der Aufruf zur Pr&uuml;fung wurde erfolgreich aktualisiert.";
#elif L==3 // en
"The announcement of exam has been successfully updated.";
#elif L==4 // es
"La convocatoria de examen se ha actualizado correctamente.";
#elif L==5 // fr
"La convocation pour l'examen a &eacute;t&eacute; mis &agrave; jour avec succ&egrave;s.";
#elif L==6 // gn
"La convocatoria de examen se ha actualizado correctamente."; // Okoteve traducción
#elif L==7 // it
"L'apello d'esame &egrave; stata aggiornata con successo.";
#elif L==8 // pl
"Ogloszenie egzamin zosta&lstrok; pomy&sacute;lnie zaktualizowany.";
#elif L==9 // pt
"A chamada para exame foi atualizada com sucesso.";
#endif
const char *Txt_The_answers_of_the_question_with_code_X_will_appear_shuffled = // Warning: it is very important to include %ld in the following sentences
#if L==1 // ca
"Las respuestas de la pregunta con c&oacute;digo <strong>%ld</strong>"
@ -46480,6 +46458,27 @@ const char *Txt_The_building_of_room_X_is_now_Y = // Warning: it is very importa
"O edif&iacute;cio da sala <strong>%s</strong> &eacute; agora <strong>%s</strong>.";
#endif
const char *Txt_The_call_for_exam_has_been_successfully_updated =
#if L==1 // ca
"La convocat&ograve;ria d'examen s'ha actualitzat correctament.";
#elif L==2 // de
"Der Aufruf zur Pr&uuml;fung wurde erfolgreich aktualisiert.";
#elif L==3 // en
"The call for exam has been successfully updated.";
#elif L==4 // es
"La convocatoria de examen se ha actualizado correctamente.";
#elif L==5 // fr
"La convocation pour l'examen a &eacute;t&eacute; mis &agrave; jour avec succ&egrave;s.";
#elif L==6 // gn
"La convocatoria de examen se ha actualizado correctamente."; // Okoteve traducción
#elif L==7 // it
"L'apello d'esame &egrave; stata aggiornata con successo.";
#elif L==8 // pl
"Ogloszenie egzamin zosta&lstrok; pomy&sacute;lnie zaktualizowany.";
#elif L==9 // pt
"A chamada para exame foi atualizada com sucesso.";
#endif
const char *Txt_The_capacity_of_room_X_has_not_changed = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"L'aforament de la sala <strong>%s</strong> no ha canviat.";
@ -52779,13 +52778,13 @@ const char *Txt_TIMELINE_NOTE[TL_NOT_NUM_NOTE_TYPES] =
"Arquivo compartilhado p&uacute;blico (disciplina)"
#endif
,
[TL_NOTE_EXAM_ANNOUNCEMENT] =
[TL_NOTE_CALL_FOR_EXAM] =
#if L==1 // ca
"Convocat&ograve;ria d'examen"
#elif L==2 // de
"Aufrufe für Pr&uuml;fung"
#elif L==3 // en
"Announcement of exam"
"Call for exam"
#elif L==4 // es
"Convocatoria de examen"
#elif L==5 // fr

View File

@ -9556,7 +9556,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"Download file from the assessment zone of a project" // Precisa de tradução
#endif
,
[ActSeeOneExaAnn] =
[ActSeeOneCfe] =
#if L==1 // ca
"See one exam announcement" // Necessita traducció
#elif L==2 // de
@ -9577,7 +9577,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"See one exam announcement" // Precisa de tradução
#endif
,
[ActSeeDatExaAnn] =
[ActSeeDatCfe] =
#if L==1 // ca
"See exam announcements of a given date" // Necessita traducció
#elif L==2 // de
@ -9598,7 +9598,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"See exam announcements of a given date" // Precisa de tradução
#endif
,
[ActEdiExaAnn] =
[ActEdiCfe] =
#if L==1 // ca
"Edit an exam announcement" // Necessita traducció
#elif L==2 // de
@ -9619,7 +9619,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"Edit an exam announcement" // Precisa de tradução
#endif
,
[ActRcvExaAnn] =
[ActRcvCfe] =
#if L==1 // ca
"Send an exam announcement" // Necessita traducció
#elif L==2 // de
@ -9640,7 +9640,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"Send an exam announcement" // Precisa de tradução
#endif
,
[ActPrnExaAnn] =
[ActPrnCfe] =
#if L==1 // ca
"See an exam announcement ready to be printed" // Necessita traducció
#elif L==2 // de
@ -9661,7 +9661,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"See an exam announcement ready to be printed" // Precisa de tradução
#endif
,
[ActReqRemExaAnn] =
[ActReqRemCfe] =
#if L==1 // ca
"Request removal of an exam announcement" // Necessita traducció
#elif L==2 // de
@ -9682,7 +9682,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"Request removal of an exam announcement" // Precisa de tradução
#endif
,
[ActRemExaAnn] =
[ActRemCfe] =
#if L==1 // ca
"Remove exam announcement" // Necessita traducció
#elif L==2 // de
@ -9703,7 +9703,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"Remove exam announcement" // Precisa de tradução
#endif
,
[ActHidExaAnn] =
[ActHidCfe] =
#if L==1 // ca
"Hide exam announcement" // Necessita traducció
#elif L==2 // de
@ -9724,7 +9724,7 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"Hide exam announcement" // Precisa de tradução
#endif
,
[ActUnhExaAnn] =
[ActUnhCfe] =
#if L==1 // ca
"Unhide exam announcement" // Necessita traducció
#elif L==2 // de

View File

@ -469,12 +469,12 @@ const char *Txt_NOTIFY_EVENTS_SINGULAR_NO_HTML[Ntf_NUM_NOTIFY_EVENTS][1 + Lan_NU
[Lan_LANGUAGE_PL ] = "Nowe zadania",
[Lan_LANGUAGE_PT ] = "Nova atividade",
},
[Ntf_EVENT_EXAM_ANNOUNCEMENT] =
[Ntf_EVENT_CALL_FOR_EXAM] =
{
[Lan_LANGUAGE_UNKNOWN] = "",
[Lan_LANGUAGE_CA ] = "Nova convocatòria d'examen",
[Lan_LANGUAGE_DE ] = "Neue Aufrufe für Prüfung",
[Lan_LANGUAGE_EN ] = "New announcement of exam",
[Lan_LANGUAGE_EN ] = "New call for exam",
[Lan_LANGUAGE_ES ] = "Nueva convocatoria de examen",
[Lan_LANGUAGE_FR ] = "Nouvelle convocation à un examen",
[Lan_LANGUAGE_GN ] = "Nueva convocatoria de examen", // Okoteve traducción

View File

@ -31,8 +31,8 @@
#include "swad_alert.h"
#include "swad_box.h"
#include "swad_call_for_exam.h"
#include "swad_course.h"
#include "swad_exam_announcement.h"
#include "swad_forum.h"
#include "swad_global.h"
#include "swad_hierarchy.h"
@ -138,7 +138,7 @@ void Tml_Not_ShowHighlightedNote (struct Tml_Timeline *Timeline,
/* Assessment tab */
[Ntf_EVENT_ASSIGNMENT ] = Tml_TOP_MESSAGE_NONE,
[Ntf_EVENT_SURVEY ] = Tml_TOP_MESSAGE_NONE,
[Ntf_EVENT_EXAM_ANNOUNCEMENT] = Tml_TOP_MESSAGE_NONE,
[Ntf_EVENT_CALL_FOR_EXAM] = Tml_TOP_MESSAGE_NONE,
/* Files tab */
[Ntf_EVENT_DOCUMENT_FILE ] = Tml_TOP_MESSAGE_NONE,
[Ntf_EVENT_TEACHERS_FILE ] = Tml_TOP_MESSAGE_NONE,
@ -467,7 +467,7 @@ static void Tml_Not_GetLocationInHierarchy (const struct Tml_Not_Note *Not,
break;
case TL_NOTE_CRS_DOC_PUB_FILE:
case TL_NOTE_CRS_SHA_PUB_FILE:
case TL_NOTE_EXAM_ANNOUNCEMENT:
case TL_NOTE_CALL_FOR_EXAM:
case TL_NOTE_NOTICE:
/* Get course data */
Hie->Crs.CrsCod = Not->HieCod;
@ -524,7 +524,7 @@ static void Tml_Not_WriteLocationInHierarchy (const struct Tml_Not_Note *Not,
break;
case TL_NOTE_CRS_DOC_PUB_FILE:
case TL_NOTE_CRS_SHA_PUB_FILE:
case TL_NOTE_EXAM_ANNOUNCEMENT:
case TL_NOTE_CALL_FOR_EXAM:
case TL_NOTE_NOTICE:
/* Write location (course) in hierarchy */
HTM_DIV_Begin ("class=\"TL_LOC\"");
@ -572,7 +572,7 @@ static void Tml_Not_PutFormGoToAction (const struct Tml_Not_Note *Not,
[TL_NOTE_CRS_DOC_PUB_FILE ] = ActReqDatSeeDocCrs,
[TL_NOTE_CRS_SHA_PUB_FILE ] = ActReqDatShaCrs,
/* Assessment tab */
[TL_NOTE_EXAM_ANNOUNCEMENT] = ActSeeOneExaAnn,
[TL_NOTE_CALL_FOR_EXAM] = ActSeeOneCfe,
/* Users tab */
/* Messages tab */
[TL_NOTE_NOTICE ] = ActSeeOneNot,
@ -598,7 +598,7 @@ static void Tml_Not_PutFormGoToAction (const struct Tml_Not_Note *Not,
[TL_NOTE_CRS_DOC_PUB_FILE ] = "file.svg",
[TL_NOTE_CRS_SHA_PUB_FILE ] = "file.svg",
/* Assessment tab */
[TL_NOTE_EXAM_ANNOUNCEMENT] = "bullhorn.svg",
[TL_NOTE_CALL_FOR_EXAM] = "bullhorn.svg",
/* Users tab */
/* Messages tab */
[TL_NOTE_NOTICE ] = "sticky-note.svg",
@ -658,12 +658,12 @@ static void Tml_Not_PutFormGoToAction (const struct Tml_Not_Note *Not,
if (Not->HieCod != Gbl.Hierarchy.Crs.CrsCod) // Not the current course
Crs_PutParamCrsCod (Not->HieCod); // Go to another course
break;
case TL_NOTE_EXAM_ANNOUNCEMENT:
case TL_NOTE_CALL_FOR_EXAM:
Frm_SetAnchorStr (Not->Cod,&Anchor);
Frm_BeginFormUniqueAnchor (TL_DefaultActions[Not->NoteType],
Anchor); // Locate on this specific exam
Frm_FreeAnchorStr (Anchor);
ExaAnn_PutHiddenParamExaCod (Not->Cod);
Cfe_PutHiddenParamExaCod (Not->Cod);
if (Not->HieCod != Gbl.Hierarchy.Crs.CrsCod) // Not the current course
Crs_PutParamCrsCod (Not->HieCod); // Go to another course
break;
@ -741,8 +741,8 @@ void Tml_Not_GetNoteSummary (const struct Tml_Not_Note *Not,
case TL_NOTE_CRS_SHA_PUB_FILE:
Brw_GetSummaryAndContentOfFile (SummaryStr,NULL,Not->Cod,false);
break;
case TL_NOTE_EXAM_ANNOUNCEMENT:
ExaAnn_GetSummaryAndContentExamAnn (SummaryStr,NULL,Not->Cod,false);
case TL_NOTE_CALL_FOR_EXAM:
Cfe_GetSummaryAndContentCallForExam (SummaryStr,NULL,Not->Cod,false);
break;
case TL_NOTE_POST:
// Not applicable
@ -916,7 +916,7 @@ void Tml_Not_StoreAndPublishNoteInternal (Tml_Not_NoteType_t NoteType,long Cod,
break;
case TL_NOTE_CRS_DOC_PUB_FILE:
case TL_NOTE_CRS_SHA_PUB_FILE:
case TL_NOTE_EXAM_ANNOUNCEMENT:
case TL_NOTE_CALL_FOR_EXAM:
case TL_NOTE_NOTICE:
HieCod = Gbl.Hierarchy.Crs.CrsCod;
break;

View File

@ -58,7 +58,7 @@ typedef enum
TL_NOTE_CRS_DOC_PUB_FILE = 7, // Public file in documents of course
TL_NOTE_CRS_SHA_PUB_FILE = 8, // Public file in shared files of course
/* Assessment tab */
TL_NOTE_EXAM_ANNOUNCEMENT = 9, // Exam announcement in a course
TL_NOTE_CALL_FOR_EXAM = 9, // Exam announcement in a course
/* Users tab */
/* Messages tab */
TL_NOTE_NOTICE = 12, // A public notice in a course