Version19.193

This commit is contained in:
acanas 2020-04-22 22:40:07 +02:00
parent a352ee40ea
commit 5600f40aea
6 changed files with 424 additions and 96 deletions

View File

@ -439,6 +439,108 @@ CREATE TABLE IF NOT EXISTS departments (
UNIQUE INDEX(DptCod),
INDEX(InsCod));
--
-- Table exa_answers: stores the users' answers to the exam events
--
CREATE TABLE IF NOT EXISTS exa_answers (
EvtCod INT NOT NULL,
UsrCod INT NOT NULL,
QstInd INT NOT NULL,
NumOpt TINYINT NOT NULL,
AnsInd TINYINT NOT NULL,
UNIQUE INDEX(EvtCod,UsrCod,QstInd));
--
-- Table exa_groups: stores the groups associated to each event in an exam
--
CREATE TABLE IF NOT EXISTS exa_groups (
EvtCod INT NOT NULL,
GrpCod INT NOT NULL,
UNIQUE INDEX(EvtCod,GrpCod));
--
-- Table exa_events: stores the events (exams instances) that have already taken place
--
CREATE TABLE IF NOT EXISTS exa_events (
EvtCod INT NOT NULL AUTO_INCREMENT,
ExaCod INT NOT NULL,
UsrCod INT NOT NULL,
StartTime DATETIME NOT NULL,
EndTime DATETIME NOT NULL,
Title VARCHAR(2047) NOT NULL,
QstInd INT NOT NULL DEFAULT 0,
QstCod INT NOT NULL DEFAULT -1,
Showing ENUM('start','stem','answers','results','end') NOT NULL DEFAULT 'start',
Countdown INT NOT NULL DEFAULT -1,
NumCols INT NOT NULL DEFAULT 1,
ShowQstResults ENUM('N','Y') NOT NULL DEFAULT 'N',
ShowUsrResults ENUM('N','Y') NOT NULL DEFAULT 'N',
UNIQUE INDEX(EvtCod),
INDEX(ExaCod));
--
-- Table exa_exams: stores the exams
--
CREATE TABLE IF NOT EXISTS exa_exams (
ExaCod INT NOT NULL AUTO_INCREMENT,
CrsCod INT NOT NULL DEFAULT -1,
Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',
UsrCod INT NOT NULL,
MaxGrade DOUBLE PRECISION NOT NULL DEFAULT 1,
Visibility INT NOT NULL DEFAULT 0x1f,
Title VARCHAR(2047) NOT NULL,
Txt TEXT NOT NULL,
UNIQUE INDEX(ExaCod),
INDEX(CrsCod));
--
-- Table exa_happening: stores the current events taking place right now
--
CREATE TABLE IF NOT EXISTS exa_happening (
EvtCod INT NOT NULL,
TS TIMESTAMP,
UNIQUE INDEX(EvtCod));
--
-- Table exa_indexes: stores the order of answers in an event
--
CREATE TABLE IF NOT EXISTS exa_indexes (
EvtCod INT NOT NULL,
QstInd INT NOT NULL,
Indexes TEXT NOT NULL,
UNIQUE INDEX(EvtCod,QstInd));
--
-- Table exa_participants: stores the current exam event participants
--
CREATE TABLE IF NOT EXISTS exa_participants (
EvtCod INT NOT NULL,
UsrCod INT NOT NULL,
TS TIMESTAMP,
UNIQUE INDEX(EvtCod,UsrCod));
--
-- Table exa_questions: stores the questions in the exams
--
CREATE TABLE IF NOT EXISTS exa_questions (
ExaCod INT NOT NULL,
QstCod INT NOT NULL,
QstInd INT NOT NULL DEFAULT 0,
INDEX(ExaCod),
INDEX(QstCod));
--
-- Table exa_results: stores exam results
--
CREATE TABLE IF NOT EXISTS exa_results (
EvtCod INT NOT NULL,
UsrCod INT NOT NULL,
StartTime DATETIME NOT NULL,
EndTime DATETIME NOT NULL,
NumQsts INT NOT NULL DEFAULT 0,
NumQstsNotBlank INT NOT NULL DEFAULT 0,
Score DOUBLE PRECISION NOT NULL DEFAULT 0,
UNIQUE INDEX(EvtCod,UsrCod));
--
-- Table exa_times: stores the elapsed time in every question in every exam event
--
CREATE TABLE IF NOT EXISTS exa_times (
EvtCod INT NOT NULL,
QstInd INT NOT NULL,
ElapsedTime TIME NOT NULL DEFAULT 0,
UNIQUE INDEX(EvtCod,QstInd));
--
-- Table exam_announcements: stores the calls for examination
--
CREATE TABLE IF NOT EXISTS exam_announcements (
@ -673,7 +775,7 @@ CREATE TABLE IF NOT EXISTS mch_indexes (
Indexes TEXT NOT NULL,
UNIQUE INDEX(MchCod,QstInd));
--
-- Table mch_results: stores the current match results
-- Table mch_results: stores match results
--
CREATE TABLE IF NOT EXISTS mch_results (
MchCod INT NOT NULL,

View File

@ -497,7 +497,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.192.1 (2020-04-22)"
#define Log_PLATFORM_VERSION "SWAD 19.193 (2020-04-22)"
#define CSS_FILE "swad19.190.css"
#define JS_FILE "swad19.172.1.js"
/*
@ -552,6 +552,19 @@ Funci
// TODO: Cambiar icono notificaciones nuevas con "bell-on.svg"
// TODO: Ahmed El Moukhtari Koubaa: Cuando le damos a la opción de mostrar solo los mensajes no leídos, se muestran estos mensajes, pero cuando los intentamos leer, es decir, hacemos clic sobre ellos se recarga toda la página por así decirlo y vuelve a dar una lista con los mensajes, pero descartando aquel que clicamos porque, entiendo yo al menos, que ya lo ha marcado como leído.
Version 19.193: Apr 22, 2020 Created database tables related to exams. (297127 lines)
2 changes necessary in database:
CREATE TABLE IF NOT EXISTS exa_answers (EvtCod INT NOT NULL,UsrCod INT NOT NULL,QstInd INT NOT NULL,NumOpt TINYINT NOT NULL,AnsInd TINYINT NOT NULL,UNIQUE INDEX(EvtCod,UsrCod,QstInd));
CREATE TABLE IF NOT EXISTS exa_groups (EvtCod INT NOT NULL,GrpCod INT NOT NULL,UNIQUE INDEX(EvtCod,GrpCod));
CREATE TABLE IF NOT EXISTS exa_events (EvtCod INT NOT NULL AUTO_INCREMENT,ExaCod INT NOT NULL,UsrCod INT NOT NULL,StartTime DATETIME NOT NULL,EndTime DATETIME NOT NULL,Title VARCHAR(2047) NOT NULL,QstInd INT NOT NULL DEFAULT 0,QstCod INT NOT NULL DEFAULT -1,Showing ENUM('start','stem','answers','results','end') NOT NULL DEFAULT 'start',Countdown INT NOT NULL DEFAULT -1,NumCols INT NOT NULL DEFAULT 1,ShowQstResults ENUM('N','Y') NOT NULL DEFAULT 'N',ShowUsrResults ENUM('N','Y') NOT NULL DEFAULT 'N',UNIQUE INDEX(EvtCod),INDEX(ExaCod));
CREATE TABLE IF NOT EXISTS exa_exams (ExaCod INT NOT NULL AUTO_INCREMENT,CrsCod INT NOT NULL DEFAULT -1,Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',UsrCod INT NOT NULL,MaxGrade DOUBLE PRECISION NOT NULL DEFAULT 1,Visibility INT NOT NULL DEFAULT 0x1f,Title VARCHAR(2047) NOT NULL,Txt TEXT NOT NULL,UNIQUE INDEX(ExaCod),INDEX(CrsCod));
CREATE TABLE IF NOT EXISTS exa_happening (EvtCod INT NOT NULL,TS TIMESTAMP,UNIQUE INDEX(EvtCod));
CREATE TABLE IF NOT EXISTS exa_indexes (EvtCod INT NOT NULL,QstInd INT NOT NULL,Indexes TEXT NOT NULL,UNIQUE INDEX(EvtCod,QstInd));
CREATE TABLE IF NOT EXISTS exa_participants (EvtCod INT NOT NULL,UsrCod INT NOT NULL,TS TIMESTAMP,UNIQUE INDEX(EvtCod,UsrCod));
CREATE TABLE IF NOT EXISTS exa_questions (ExaCod INT NOT NULL,QstCod INT NOT NULL,QstInd INT NOT NULL DEFAULT 0,INDEX(ExaCod),INDEX(QstCod));
CREATE TABLE IF NOT EXISTS exa_results (EvtCod INT NOT NULL,UsrCod INT NOT NULL,StartTime DATETIME NOT NULL,EndTime DATETIME NOT NULL,NumQsts INT NOT NULL DEFAULT 0,NumQstsNotBlank INT NOT NULL DEFAULT 0,Score DOUBLE PRECISION NOT NULL DEFAULT 0,UNIQUE INDEX(EvtCod,UsrCod));
CREATE TABLE IF NOT EXISTS exa_times (EvtCod INT NOT NULL,QstInd INT NOT NULL,ElapsedTime TIME NOT NULL DEFAULT 0,UNIQUE INDEX(EvtCod,QstInd));
Version 19.192.1: Apr 22, 2020 Changed icon for exams. (296807 lines)
Copy the following 2 icons to icon public directory:
sudo cp icon/iconset/awesome/file-signature.svg /var/www/html/swad/icon/iconset/awesome

View File

@ -979,6 +979,227 @@ mysql> DESCRIBE departments;
"UNIQUE INDEX(DptCod),"
"INDEX(InsCod))");
/***** Table exa_answers *****/
/*
mysql> DESCRIBE exa_answers;
+--------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------+------+-----+---------+-------+
| EvtCod | int(11) | NO | PRI | NULL | |
| UsrCod | int(11) | NO | PRI | NULL | |
| QstInd | int(11) | NO | PRI | NULL | |
| NumOpt | tinyint(4) | NO | | NULL | |
| AnsInd | tinyint(4) | NO | | NULL | |
+--------+------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_answers ("
"EvtCod INT NOT NULL,"
"UsrCod INT NOT NULL,"
"QstInd INT NOT NULL,"
"NumOpt TINYINT NOT NULL," // Number of button on screen (Always ordered: 0,1,2,3)
"AnsInd TINYINT NOT NULL," // Answer index (Can be shuffled: 0,3,1,2)
"UNIQUE INDEX(EvtCod,UsrCod,QstInd))");
/***** Table exa_groups *****/
/*
mysql> DESCRIBE exa_groups;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| EvtCod | int(11) | NO | PRI | NULL | |
| GrpCod | int(11) | NO | PRI | NULL | |
+--------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_groups ("
"EvtCod INT NOT NULL,"
"GrpCod INT NOT NULL,"
"UNIQUE INDEX(EvtCod,GrpCod))");
/***** Table exa_events *****/
/*
mysql> DESCRIBE exa_events;
+----------------+------------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------------------------------------------+------+-----+---------+----------------+
| EvtCod | int(11) | NO | PRI | NULL | auto_increment |
| ExaCod | int(11) | NO | MUL | NULL | |
| UsrCod | int(11) | NO | | NULL | |
| StartTime | datetime | NO | | NULL | |
| EndTime | datetime | NO | | NULL | |
| Title | varchar(2047) | NO | | NULL | |
| QstInd | int(11) | NO | | 0 | |
| QstCod | int(11) | NO | | -1 | |
| Showing | enum('start','stem','answers','results','end') | NO | | start | |
| Countdown | int(11) | NO | | -1 | |
| NumCols | int(11) | NO | | 1 | |
| ShowQstResults | enum('N','Y') | NO | | N | |
| ShowUsrResults | enum('N','Y') | NO | | N | |
+----------------+------------------------------------------------+------+-----+---------+----------------+
13 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_events ("
"EvtCod INT NOT NULL AUTO_INCREMENT,"
"ExaCod INT NOT NULL,"
"UsrCod INT NOT NULL,"
"StartTime DATETIME NOT NULL,"
"EndTime DATETIME NOT NULL,"
"Title VARCHAR(2047) NOT NULL," // Gam_MAX_BYTES_TITLE
"QstInd INT NOT NULL DEFAULT 0,"
"QstCod INT NOT NULL DEFAULT -1,"
"Showing ENUM('start','stem','answers','results','end') NOT NULL DEFAULT 'start',"
"Countdown INT NOT NULL DEFAULT -1,"
"NumCols INT NOT NULL DEFAULT 1,"
"ShowQstResults ENUM('N','Y') NOT NULL DEFAULT 'N',"
"ShowUsrResults ENUM('N','Y') NOT NULL DEFAULT 'N',"
"UNIQUE INDEX(EvtCod),"
"INDEX(ExaCod))");
/***** Table exa_exams *****/
/*
mysql> DESCRIBE exa_exams;
+------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+----------------+
| ExaCod | int(11) | NO | PRI | NULL | auto_increment |
| CrsCod | int(11) | NO | MUL | -1 | |
| Hidden | enum('N','Y') | NO | | N | |
| UsrCod | int(11) | NO | | NULL | |
| MaxGrade | double | NO | | 1 | |
| Visibility | int(11) | NO | | 31 | |
| Title | varchar(2047) | NO | | NULL | |
| Txt | text | NO | | NULL | |
+------------+---------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_exams ("
"ExaCod INT NOT NULL AUTO_INCREMENT,"
"CrsCod INT NOT NULL DEFAULT -1,"
"Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',"
"UsrCod INT NOT NULL,"
"MaxGrade DOUBLE PRECISION NOT NULL DEFAULT 1," // Scale from score [0...num.answers] to grade [0...MaxGrade]
"Visibility INT NOT NULL DEFAULT 0x1f,"
"Title VARCHAR(2047) NOT NULL," // Exa_MAX_BYTES_TITLE
"Txt TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
"UNIQUE INDEX(ExaCod),"
"INDEX(CrsCod))");
/***** Table exa_happening *****/
/*
mysql> DESCRIBE exa_happening;
+--------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------+------+-----+-------------------+-----------------------------+
| EvtCod | int(11) | NO | PRI | NULL | |
| TS | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+--------+-----------+------+-----+-------------------+-----------------------------+
2 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_happening ("
"EvtCod INT NOT NULL,"
"TS TIMESTAMP,"
"UNIQUE INDEX(EvtCod))");
/***** Table exa_indexes *****/
/*
mysql> DESCRIBE exa_indexes;
+---------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| EvtCod | int(11) | NO | PRI | NULL | |
| QstInd | int(11) | NO | PRI | NULL | |
| Indexes | text | NO | | NULL | |
+---------+---------+------+-----+---------+-------+
3 rows in set (0.01 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_indexes ("
"EvtCod INT NOT NULL,"
"QstInd INT NOT NULL,"
"Indexes TEXT NOT NULL," // ExaRes_MAX_BYTES_INDEXES_ONE_QST
"UNIQUE INDEX(EvtCod,QstInd))");
/***** Table exa_participants *****/
/*
mysql> DESCRIBE exa_participants;
+--------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------+------+-----+-------------------+-----------------------------+
| EvtCod | int(11) | NO | PRI | NULL | |
| UsrCod | int(11) | NO | PRI | NULL | |
| TS | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+--------+-----------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_participants ("
"EvtCod INT NOT NULL,"
"UsrCod INT NOT NULL,"
"TS TIMESTAMP,"
"UNIQUE INDEX(EvtCod,UsrCod))");
/***** Table exa_questions *****/
/*
mysql> DESCRIBE exa_questions;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| ExaCod | int(11) | NO | MUL | NULL | |
| QstCod | int(11) | NO | MUL | NULL | |
| QstInd | int(11) | NO | | 0 | |
+--------+---------+------+-----+---------+-------+
3 rows in set (0.01 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_questions ("
"ExaCod INT NOT NULL,"
"QstCod INT NOT NULL,"
"QstInd INT NOT NULL DEFAULT 0,"
"INDEX(ExaCod),"
"INDEX(QstCod))");
/***** Table exa_results *****/
/*
mysql> DESCRIBE exa_results;
+-----------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+----------+------+-----+---------+-------+
| EvtCod | int(11) | NO | PRI | NULL | |
| UsrCod | int(11) | NO | PRI | NULL | |
| StartTime | datetime | NO | | NULL | |
| EndTime | datetime | NO | | NULL | |
| NumQsts | int(11) | NO | | 0 | |
| NumQstsNotBlank | int(11) | NO | | 0 | |
| Score | double | NO | | 0 | |
+-----------------+----------+------+-----+---------+-------+
7 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_results ("
"EvtCod INT NOT NULL,"
"UsrCod INT NOT NULL,"
"StartTime DATETIME NOT NULL," // Time this user started to answer
"EndTime DATETIME NOT NULL," // Time this user finished to answer
"NumQsts INT NOT NULL DEFAULT 0,"
"NumQstsNotBlank INT NOT NULL DEFAULT 0,"
"Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
"UNIQUE INDEX(EvtCod,UsrCod))");
/***** Table exa_times *****/
/*
mysql> DESCRIBE exa_times;
+-------------+---------+------+-----+----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+----------+-------+
| EvtCod | int(11) | NO | PRI | NULL | |
| QstInd | int(11) | NO | PRI | NULL | |
| ElapsedTime | time | NO | | 00:00:00 | |
+-------------+---------+------+-----+----------+-------+
3 rows in set (0.01 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_times ("
"EvtCod INT NOT NULL,"
"QstInd INT NOT NULL,"
"ElapsedTime TIME NOT NULL DEFAULT 0,"
"UNIQUE INDEX(EvtCod,QstInd))");
/***** Table exam_announcements *****/
/*
mysql> DESCRIBE exam_announcements;
@ -1307,7 +1528,6 @@ mysql> DESCRIBE forum_thread;
"UNIQUE INDEX(FirstPstCod),"
"UNIQUE INDEX(LastPstCod))");
/***** Table gam_games *****/
/*
mysql> DESCRIBE gam_games;
@ -1337,6 +1557,25 @@ mysql> DESCRIBE gam_games;
"UNIQUE INDEX(GamCod),"
"INDEX(CrsCod))");
/***** Table gam_questions *****/
/*
mysql> DESCRIBE gam_questions;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| GamCod | int(11) | NO | MUL | NULL | |
| QstCod | int(11) | NO | MUL | NULL | |
| QstInd | int(11) | NO | | 0 | |
+--------+---------+------+-----+---------+-------+
3 rows in set (0,00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS gam_questions ("
"GamCod INT NOT NULL,"
"QstCod INT NOT NULL,"
"QstInd INT NOT NULL DEFAULT 0,"
"INDEX(GamCod),"
"INDEX(QstCod))");
/***** Table mch_answers *****/
/*
mysql> DESCRIBE mch_answers;
@ -1492,25 +1731,6 @@ mysql> DESCRIBE mch_results;
"Score DOUBLE PRECISION NOT NULL DEFAULT 0,"
"UNIQUE INDEX(MchCod,UsrCod))");
/***** Table gam_questions *****/
/*
mysql> DESCRIBE gam_questions;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| GamCod | int(11) | NO | MUL | NULL | |
| QstCod | int(11) | NO | MUL | NULL | |
| QstInd | int(11) | NO | | 0 | |
+--------+---------+------+-----+---------+-------+
3 rows in set (0,00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS gam_questions ("
"GamCod INT NOT NULL,"
"QstCod INT NOT NULL,"
"QstInd INT NOT NULL DEFAULT 0,"
"INDEX(GamCod),"
"INDEX(QstCod))");
/***** Table mch_times *****/
/*
mysql> DESCRIBE mch_times;

View File

@ -190,7 +190,7 @@ void Exa_ResetExams (struct Exa_Exams *Exams)
Exams->ListQuestions = NULL;
Exams->ExaCodsSelected = NULL; // String with selected exam codes separated by separator multiple
Exams->ExaCod = -1L; // Selected/current exam code
Exams->EvtCod = -1L; // Selected/current match code
Exams->EvtCod = -1L; // Selected/current event code
Exams->QstInd = 0; // Current question index
}
@ -222,7 +222,7 @@ static void Exa_ListAllExams (struct Exa_Exams *Exams)
extern const char *Txt_Exams;
extern const char *Txt_EXAMS_ORDER_HELP[Exa_NUM_ORDERS];
extern const char *Txt_EXAMS_ORDER[Exa_NUM_ORDERS];
extern const char *Txt_Matches;
extern const char *Txt_Events;
extern const char *Txt_No_exams;
Exa_Order_t Order;
struct Pagination Pagination;
@ -281,7 +281,7 @@ static void Exa_ListAllExams (struct Exa_Exams *Exams)
HTM_TH_End ();
}
HTM_TH (1,1,"RM",Txt_Matches);
HTM_TH (1,1,"RM",Txt_Events);
HTM_TR_End ();
@ -432,7 +432,7 @@ void Exa_SeeOneExam (void)
/***** Show exam *****/
Exa_ShowOnlyOneExam (&Exams,&Exam,
false, // Do not list exam questions
false); // Do not put form to start new match
false); // Do not put form to start new event
}
/*****************************************************************************/
@ -488,7 +488,7 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,
extern const char *Txt_No_of_questions;
extern const char *Txt_Maximum_grade;
extern const char *Txt_Result_visibility;
extern const char *Txt_Matches;
extern const char *Txt_Events;
char *Anchor = NULL;
static unsigned UniqueId = 0;
char *Id;
@ -588,12 +588,12 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,
Exams->ExaCod = Exam->ExaCod;
Frm_StartForm (ActSeeExa);
Exa_PutParams (Exams);
HTM_BUTTON_SUBMIT_Begin (Txt_Matches,
HTM_BUTTON_SUBMIT_Begin (Txt_Events,
Exam->Hidden ? "BT_LINK LT ASG_TITLE_LIGHT" :
"BT_LINK LT ASG_TITLE",
NULL);
if (ShowOnlyThisExam)
HTM_TxtColonNBSP (Txt_Matches);
HTM_TxtColonNBSP (Txt_Events);
HTM_Unsigned (Exam->NumEvts);
HTM_BUTTON_End ();
Frm_EndForm ();
@ -1674,7 +1674,7 @@ void Exa_RequestNewQuestion (void)
/***** Show current exam *****/
Exa_ShowOnlyOneExam (&Exams,&Exam,
true, // List exam questions
false); // Do not put form to start new match
false); // Do not put form to start new event
}
/*****************************************************************************/
@ -2208,7 +2208,7 @@ void Exa_AddTstQuestionsToExam (void)
/***** Show current exam *****/
Exa_ShowOnlyOneExam (&Exams,&Exam,
true, // List exam questions
false); // Do not put form to start new match
false); // Do not put form to start new event
}
/*****************************************************************************/
@ -2302,7 +2302,7 @@ void Exa_RequestRemoveQst (void)
/***** Show current exam *****/
Exa_ShowOnlyOneExam (&Exams,&Exam,
true, // List exam questions
false); // Do not put form to start new match
false); // Do not put form to start new event
}
/*****************************************************************************/
@ -2364,7 +2364,7 @@ void Exa_RemoveQst (void)
/***** Show current exam *****/
Exa_ShowOnlyOneExam (&Exams,&Exam,
true, // List exam questions
false); // Do not put form to start new match
false); // Do not put form to start new event
}
/*****************************************************************************/
@ -2417,7 +2417,7 @@ void Exa_MoveUpQst (void)
/***** Show current exam *****/
Exa_ShowOnlyOneExam (&Exams,&Exam,
true, // List exam questions
false); // Do not put form to start new match
false); // Do not put form to start new event
}
/*****************************************************************************/
@ -2480,7 +2480,7 @@ void Exa_MoveDownQst (void)
/***** Show current exam *****/
Exa_ShowOnlyOneExam (&Exams,&Exam,
true, // List exam questions
false); // Do not put form to start new match
false); // Do not put form to start new event
}
/*****************************************************************************/
@ -2549,17 +2549,17 @@ static bool Exa_CheckIfEditable (const struct Exa_Exam *Exam)
}
/*****************************************************************************/
/********************* Put button to create a new match **********************/
/********************* Put button to create a new event **********************/
/*****************************************************************************/
void Exa_PutButtonNewEvent (struct Exa_Exams *Exams,long ExaCod)
{
extern const char *Txt_New_match;
extern const char *Txt_New_event;
Exams->ExaCod = ExaCod;
Frm_StartFormAnchor (ActReqNewExaEvt,ExaEvt_NEW_EVENT_SECTION_ID);
Exa_PutParams (Exams);
Btn_PutConfirmButton (Txt_New_match);
Btn_PutConfirmButton (Txt_New_event);
Frm_EndForm ();
}
@ -2583,7 +2583,7 @@ void Exa_RequestNewEvent (void)
/***** Show exam *****/
Exa_ShowOnlyOneExam (&Exams,&Exam,
false, // Do not list exam questions
true); // Put form to start new match
true); // Put form to start new event
}
/*****************************************************************************/
@ -2854,7 +2854,7 @@ void Exa_ShowTstTagsPresentInAnExam (long ExaCod)
/***** Get all tags of questions in this exam *****/
NumTags = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get tags"
" present in a match result",
" present in an event result",
"SELECT tst_tags.TagTxt" // row[0]
" FROM"
" (SELECT DISTINCT(tst_question_tags.TagCod)"

View File

@ -201,7 +201,7 @@ static void ExaEvt_ShowQuestionAndAnswersTch (const struct ExaEvt_Event *Event);
static void ExaEvt_WriteAnswersEventResult (const struct ExaEvt_Event *Event,
const struct Tst_Question *Question,
const char *Class,bool ShowResult);
static bool ExaEvt_ShowQuestionAndAnswersStd (const struct ExaEvt_Event *Event,
static void ExaEvt_ShowQuestionAndAnswersStd (const struct ExaEvt_Event *Event,
const struct ExaEvt_UsrAnswer *UsrAnswer,
ExaEvt_Update_t Update);
@ -255,8 +255,8 @@ void ExaEvt_ListEvents (struct Exa_Exams *Exams,
struct Exa_Exam *Exam,
bool PutFormNewEvent)
{
extern const char *Hlp_ASSESSMENT_Games_matches;
extern const char *Txt_Matches;
extern const char *Hlp_ASSESSMENT_Exams_events;
extern const char *Txt_Events;
char *SubQuery;
MYSQL_RES *mysql_res;
unsigned NumEvents;
@ -307,16 +307,16 @@ void ExaEvt_ListEvents (struct Exa_Exams *Exams,
/***** Begin box *****/
Exams->ExaCod = Exam->ExaCod;
Box_BoxBegin ("100%",Txt_Matches,
Box_BoxBegin ("100%",Txt_Events,
ExaEvt_PutIconsInListOfEvents,Exams,
Hlp_ASSESSMENT_Games_matches,Box_NOT_CLOSABLE);
Hlp_ASSESSMENT_Exams_events,Box_NOT_CLOSABLE);
/***** Select whether show only my groups or all groups *****/
if (Gbl.Crs.Grps.NumGrps)
{
Set_StartSettingsHead ();
Grp_ShowFormToSelWhichGrps (ActSeeGam,
Gam_PutParams,Exams);
Grp_ShowFormToSelWhichGrps (ActSeeExa,
Exa_PutParams,Exams);
Set_EndSettingsHead ();
}
@ -431,12 +431,12 @@ static void ExaEvt_PutIconsInListOfEvents (void *Exams)
static void ExaEvt_PutIconToCreateNewEvent (struct Exa_Exams *Exams)
{
extern const char *Txt_New_match;
extern const char *Txt_New_event;
/***** Put form to create a new exam event *****/
Ico_PutContextualIconToAdd (ActReqNewExaEvt,ExaEvt_NEW_EVENT_SECTION_ID,
Gam_PutParams,Exams,
Txt_New_match);
Exa_PutParams,Exams,
Txt_New_event);
}
/*****************************************************************************/
@ -522,8 +522,8 @@ static void ExaEvt_ListOneOrMoreEventsHeading (bool ICanEditEvents)
/***** The rest of columns *****/
HTM_TH (1,1,"LT",Txt_ROLES_SINGUL_Abc[Rol_TCH][Usr_SEX_UNKNOWN]);
HTM_TH (1,1,"LT",Txt_START_END_TIME[Gam_ORDER_BY_START_DATE]);
HTM_TH (1,1,"LT",Txt_START_END_TIME[Gam_ORDER_BY_END_DATE ]);
HTM_TH (1,1,"LT",Txt_START_END_TIME[Exa_ORDER_BY_START_DATE]);
HTM_TH (1,1,"LT",Txt_START_END_TIME[Exa_ORDER_BY_END_DATE ]);
HTM_TH (1,1,"LT",Txt_Match);
HTM_TH (1,1,"RT",Txt_Players);
HTM_TH (1,1,"CT",Txt_Status);
@ -1081,8 +1081,8 @@ mysql> SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'e
static void ExaEvt_RemoveEventFromAllTables (long EvtCod)
{
/***** Remove exam event from secondary tables *****/
ExaEvt_RemoveEventFromTable (EvtCod,"exa_players");
ExaEvt_RemoveEventFromTable (EvtCod,"exa_playing");
ExaEvt_RemoveEventFromTable (EvtCod,"exa_participants");
ExaEvt_RemoveEventFromTable (EvtCod,"exa_happening");
ExaEvt_RemoveEventFromTable (EvtCod,"exa_results");
ExaEvt_RemoveEventFromTable (EvtCod,"exa_answers");
ExaEvt_RemoveEventFromTable (EvtCod,"exa_times");
@ -1111,8 +1111,8 @@ static void ExaEvt_RemoveEventFromTable (long EvtCod,const char *TableName)
void ExaEvt_RemoveEventsInExamFromAllTables (long ExaCod)
{
/***** Remove events from secondary tables *****/
ExaEvt_RemoveEventsInExamFromTable (ExaCod,"exa_players");
ExaEvt_RemoveEventsInExamFromTable (ExaCod,"exa_playing");
ExaEvt_RemoveEventsInExamFromTable (ExaCod,"exa_participants");
ExaEvt_RemoveEventsInExamFromTable (ExaCod,"exa_happening");
ExaEvt_RemoveEventsInExamFromTable (ExaCod,"exa_results");
ExaEvt_RemoveEventsInExamFromTable (ExaCod,"exa_answers");
ExaEvt_RemoveEventsInExamFromTable (ExaCod,"exa_times");
@ -1146,8 +1146,8 @@ static void ExaEvt_RemoveEventsInExamFromTable (long ExaCod,const char *TableNam
void ExaEvt_RemoveEventInCourseFromAllTables (long CrsCod)
{
/***** Remove events from secondary tables *****/
ExaEvt_RemoveEventInCourseFromTable (CrsCod,"exa_players");
ExaEvt_RemoveEventInCourseFromTable (CrsCod,"exa_playing");
ExaEvt_RemoveEventInCourseFromTable (CrsCod,"exa_participants");
ExaEvt_RemoveEventInCourseFromTable (CrsCod,"exa_happening");
ExaEvt_RemoveEventInCourseFromTable (CrsCod,"exa_results");
ExaEvt_RemoveEventInCourseFromTable (CrsCod,"exa_answers");
ExaEvt_RemoveEventInCourseFromTable (CrsCod,"exa_times");
@ -1185,7 +1185,7 @@ static void ExaEvt_RemoveEventInCourseFromTable (long CrsCod,const char *TableNa
void ExaEvt_RemoveUsrFromEventTablesInCrs (long UsrCod,long CrsCod)
{
/***** Remove student from secondary tables *****/
ExaEvt_RemoveUsrEvtResultsInCrs (UsrCod,CrsCod,"exa_players");
ExaEvt_RemoveUsrEvtResultsInCrs (UsrCod,CrsCod,"exa_participants");
ExaEvt_RemoveUsrEvtResultsInCrs (UsrCod,CrsCod,"exa_results");
ExaEvt_RemoveUsrEvtResultsInCrs (UsrCod,CrsCod,"exa_answers");
}
@ -1216,7 +1216,7 @@ void ExaEvt_PutParamsEdit (void *Exams)
{
if (Exams)
{
Gam_PutParams (Exams);
Exa_PutParams (Exams);
ExaEvt_PutParamEvtCod (((struct Exa_Exams *) Exams)->EvtCod);
}
}
@ -1286,8 +1286,8 @@ long ExaEvt_GetParamEvtCod (void)
static void ExaEvt_PutFormNewEvent (const struct Exa_Exam *Exam)
{
extern const char *Hlp_ASSESSMENT_Games_matches;
extern const char *Txt_New_match;
extern const char *Hlp_ASSESSMENT_Exams_events;
extern const char *Txt_New_event;
extern const char *Txt_Title;
extern const char *Txt_Play;
@ -1296,13 +1296,13 @@ static void ExaEvt_PutFormNewEvent (const struct Exa_Exam *Exam)
/***** Begin form *****/
Frm_StartForm (ActNewExaEvt);
Gam_PutParamGameCod (Exam->ExaCod);
Gam_PutParamQstInd (0); // Start by first question in exam
Exa_PutParamExamCod (Exam->ExaCod);
Exa_PutParamQstInd (0); // Start by first question in exam
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_New_match,
Box_BoxTableBegin (NULL,Txt_New_event,
NULL,NULL,
Hlp_ASSESSMENT_Games_matches,Box_NOT_CLOSABLE,2);
Hlp_ASSESSMENT_Exams_events,Box_NOT_CLOSABLE,2);
/***** Event title *****/
HTM_TR_Begin (NULL);
@ -1312,7 +1312,7 @@ static void ExaEvt_PutFormNewEvent (const struct Exa_Exam *Exam)
/* Data */
HTM_TD_Begin ("class=\"LT\"");
HTM_INPUT_TEXT ("Title",Gam_MAX_CHARS_TITLE,Exam->Title,false,
HTM_INPUT_TEXT ("Title",Exa_MAX_CHARS_TITLE,Exam->Title,false,
"id=\"Title\" size=\"45\" required=\"required\"");
HTM_TD_End ();
@ -1409,8 +1409,8 @@ void ExaEvt_CreateNewEventTch (void)
char Title[Exa_MAX_BYTES_TITLE + 1];
/***** Get form parameters *****/
/* Get exam event code */
if ((ExaCod = Gam_GetParamGameCod ()) == -1L)
/* Get exam code */
if ((ExaCod = Exa_GetParamExamCod ()) == -1L)
Lay_ShowErrorAndExit ("Code of exam is missing.");
/* Get exam event title */
@ -2056,11 +2056,11 @@ static void ExaEvt_SetMatchStatusToPrev (struct ExaEvt_Event *Event)
static void ExaEvt_SetMatchStatusToPrevQst (struct ExaEvt_Event *Event)
{
/***** Get index of the previous question *****/
Event->Status.QstInd = Gam_GetPrevQuestionIndexInGame (Event->ExaCod,
Event->Status.QstInd = Exa_GetPrevQuestionIndexInExam (Event->ExaCod,
Event->Status.QstInd);
if (Event->Status.QstInd) // Start of questions not reached
{
Event->Status.QstCod = Gam_GetQstCodFromQstInd (Event->ExaCod,
Event->Status.QstCod = Exa_GetQstCodFromQstInd (Event->ExaCod,
Event->Status.QstInd);
Event->Status.Showing = Event->Status.ShowQstResults ? ExaEvt_RESULTS :
ExaEvt_ANSWERS;
@ -2119,13 +2119,13 @@ static void ExaEvt_SetMatchStatusToNext (struct ExaEvt_Event *Event)
static void ExaEvt_SetMatchStatusToNextQst (struct ExaEvt_Event *Event)
{
/***** Get index of the next question *****/
Event->Status.QstInd = Gam_GetNextQuestionIndexInGame (Event->ExaCod,
Event->Status.QstInd = Exa_GetNextQuestionIndexInExam (Event->ExaCod,
Event->Status.QstInd);
/***** Get question code *****/
if (Event->Status.QstInd < ExaEvt_AFTER_LAST_QUESTION) // End of questions not reached
{
Event->Status.QstCod = Gam_GetQstCodFromQstInd (Event->ExaCod,
Event->Status.QstCod = Exa_GetQstCodFromQstInd (Event->ExaCod,
Event->Status.QstInd);
Event->Status.Showing = ExaEvt_STEM;
}
@ -2624,8 +2624,7 @@ static void ExaEvt_ShowRightColumnStd (struct ExaEvt_Event *Event,
{
if (Event->Status.Showing == ExaEvt_ANSWERS) // Teacher's screen is showing question answers
/* Show current question and possible answers */
if (!ExaEvt_ShowQuestionAndAnswersStd (Event,UsrAnswer,Update))
Ale_ShowAlert (Ale_ERROR,"Wrong question.");
ExaEvt_ShowQuestionAndAnswersStd (Event,UsrAnswer,Update);
}
else
Ale_ShowAlert (Ale_ERROR,"You can not join this exam event.");
@ -2648,7 +2647,7 @@ static void ExaEvt_ShowNumQstInEvt (const struct ExaEvt_Event *Event)
{
extern const char *Txt_MATCH_Start;
extern const char *Txt_MATCH_End;
unsigned NumQsts = Gam_GetNumQstsGame (Event->ExaCod);
unsigned NumQsts = Exa_GetNumQstsExam (Event->ExaCod);
HTM_DIV_Begin ("class=\"EXA_NUM_QST\"");
switch (Event->Status.Showing)
@ -2893,7 +2892,7 @@ static void ExaEvt_PutIconToRemoveMyAnswer (const struct ExaEvt_Event *Event)
/***** Start form *****/
Frm_StartForm (ActRemExaEvtAnsQstStd);
ExaEvt_PutParamEvtCod (Event->EvtCod); // Current exam event being played
Gam_PutParamQstInd (Event->Status.QstInd); // Current question index shown
Exa_PutParamQstInd (Event->Status.QstInd); // Current question index shown
/***** Put icon with link *****/
HTM_DIV_Begin ("class=\"EXA_BIGBUTTON_CONT\"");
@ -3121,7 +3120,7 @@ void ExaEvt_WriteChoiceAnsViewEvent (const struct ExaEvt_Event *Event,
/*****************************************************************************/
// Return true on valid question, false on invalid question
static bool ExaEvt_ShowQuestionAndAnswersStd (const struct ExaEvt_Event *Event,
static void ExaEvt_ShowQuestionAndAnswersStd (const struct ExaEvt_Event *Event,
const struct ExaEvt_UsrAnswer *UsrAnswer,
ExaEvt_Update_t Update)
{
@ -3129,10 +3128,6 @@ static bool ExaEvt_ShowQuestionAndAnswersStd (const struct ExaEvt_Event *Event,
unsigned NumOpt;
char *Class;
/***** Trivial check: this question must be valid for exams *****/
if (!Tst_CheckIfQuestionIsValidForGame (Event->Status.QstCod))
return false;
/***** Get number of options in this question *****/
NumOptions = Tst_GetNumAnswersQst (Event->Status.QstCod);
@ -3156,7 +3151,7 @@ static bool ExaEvt_ShowQuestionAndAnswersStd (const struct ExaEvt_Event *Event,
and not lose clicks due to refresh */
Frm_StartForm (ActAnsExaEvtQstStd);
ExaEvt_PutParamEvtCod (Event->EvtCod); // Current exam event being played
Gam_PutParamQstInd (Event->Status.QstInd); // Current question index shown
Exa_PutParamQstInd (Event->Status.QstInd); // Current question index shown
ExaEvt_PutParamNumOpt (NumOpt); // Number of button
if (asprintf (&Class,"EXA_STD_BUTTON%s BT_%c",
@ -3181,8 +3176,6 @@ static bool ExaEvt_ShowQuestionAndAnswersStd (const struct ExaEvt_Event *Event,
/***** End table *****/
HTM_TABLE_End ();
return true;
}
/*****************************************************************************/
@ -3208,7 +3201,7 @@ static void ExaEvt_ShowEventScore (const struct ExaEvt_Event *Event)
unsigned NumRow;
/***** Get minimum and maximum scores *****/
Gam_GetScoreRange (Event->ExaCod,&MinScore,&MaxScore);
Exa_GetScoreRange (Event->ExaCod,&MinScore,&MaxScore);
Range = MaxScore - MinScore;
if (Range == 0.0)
return;
@ -3508,13 +3501,13 @@ static void ExaEvt_RemoveOldPlayers (void)
{
/***** Delete events not being played by teacher *****/
DB_QueryDELETE ("can not update events as not being played",
"DELETE FROM exa_playing"
"DELETE FROM exa_happening"
" WHERE TS<FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)",
Cfg_SECONDS_TO_REFRESH_MATCH_TCH*3);
/***** Delete players (students) who have left events *****/
DB_QueryDELETE ("can not update exam event players",
"DELETE FROM exa_players"
"DELETE FROM exa_participants"
" WHERE TS<FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)",
Cfg_SECONDS_TO_REFRESH_MATCH_STD*3);
}
@ -3527,7 +3520,7 @@ static void ExaEvt_UpdateEventAsBeingPlayed (long EvtCod)
{
/***** Insert exam event as being played *****/
DB_QueryREPLACE ("can not set exam event as being played",
"REPLACE exa_playing (EvtCod) VALUE (%ld)",
"REPLACE exa_happening (EvtCod) VALUE (%ld)",
EvtCod);
}
@ -3539,13 +3532,13 @@ static void ExaEvt_SetEventAsNotBeingPlayed (long EvtCod)
{
/***** Delete all exam event players ******/
DB_QueryDELETE ("can not update exam event players",
"DELETE FROM exa_players"
"DELETE FROM exa_participants"
" WHERE EvtCod=%ld",
EvtCod);
/***** Delete exam event as being played ******/
DB_QueryDELETE ("can not set exam event as not being played",
"DELETE FROM exa_playing"
"DELETE FROM exa_happening"
" WHERE EvtCod=%ld",
EvtCod);
}
@ -3559,7 +3552,7 @@ static bool ExaEvt_GetIfEventIsBeingPlayed (long EvtCod)
/***** Get if an exam event is being played or not *****/
return
(bool) (DB_QueryCOUNT ("can not get if exam event is being played",
"SELECT COUNT(*) FROM exa_playing"
"SELECT COUNT(*) FROM exa_happening"
" WHERE EvtCod=%ld",
EvtCod) != 0);
}
@ -3573,7 +3566,7 @@ static void ExaEvt_GetNumPlayers (struct ExaEvt_Event *Event)
/***** Get number of players who are playing an exam event *****/
Event->Status.NumPlayers =
(unsigned) DB_QueryCOUNT ("can not get number of players",
"SELECT COUNT(*) FROM exa_players"
"SELECT COUNT(*) FROM exa_participants"
" WHERE EvtCod=%ld",
Event->EvtCod);
}
@ -3603,7 +3596,7 @@ bool ExaEvt_RegisterMeAsPlayerInEvent (struct ExaEvt_Event *Event)
/***** Insert me as exam event player *****/
DB_QueryREPLACE ("can not insert exam event player",
"REPLACE exa_players (EvtCod,UsrCod) VALUES (%ld,%ld)",
"REPLACE exa_participants (EvtCod,UsrCod) VALUES (%ld,%ld)",
Event->EvtCod,Gbl.Usrs.Me.UsrDat.UsrCod);
return true;
}

View File

@ -992,14 +992,14 @@ static void ExaRes_ShowEvtResultsSummaryRow (unsigned NumResults,
double TotalScoreOfAllResults,
double TotalGrade)
{
extern const char *Txt_Matches;
extern const char *Txt_Events;
/***** Start row *****/
HTM_TR_Begin (NULL);
/***** Row title *****/
HTM_TD_Begin ("colspan=\"3\" class=\"DAT_N_LINE_TOP RM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TxtColonNBSP (Txt_Matches);
HTM_TxtColonNBSP (Txt_Events);
HTM_Unsigned (NumResults);
HTM_TD_End ();