Version19.198

This commit is contained in:
acanas 2020-04-26 03:07:55 +02:00
parent b8ca23cb90
commit 963919bc82
7 changed files with 151 additions and 33 deletions

View File

@ -515,10 +515,10 @@ CREATE TABLE IF NOT EXISTS exa_participants (
-- Table exa_questions: stores the questions in the exams
--
CREATE TABLE IF NOT EXISTS exa_questions (
ExaCod INT NOT NULL,
SetCod INT NOT NULL,
QstCod INT NOT NULL,
QstInd INT NOT NULL DEFAULT 0,
INDEX(ExaCod),
INDEX(SetCod),
INDEX(QstCod));
--
-- Table exa_results: stores exam results

View File

@ -544,10 +544,16 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.197 (2020-04-26)"
#define Log_PLATFORM_VERSION "SWAD 19.198 (2020-04-26)"
#define CSS_FILE "swad19.193.1.css"
#define JS_FILE "swad19.193.1.js"
/*
Version 19.198: Apr 26, 2020 Remove set of questions. (299054 lines)
3 changes necessary in database:
ALTER TABLE exa_questions DROP INDEX ExaCod;
ALTER TABLE exa_questions CHANGE COLUMN ExaCod SetCod INT NOT NULL;
ALTER TABLE exa_questions ADD INDEX(SetCod);
Version 19.197: Apr 26, 2020 Ask user to remove set of questions. (298954 lines)
Version 19.196.1: Apr 25, 2020 Changes in edition of exams. (298857 lines)
Version 19.196: Apr 25, 2020 Changes in edition of sets of questions. (298866 lines)

View File

@ -1143,17 +1143,17 @@ mysql> DESCRIBE exa_questions;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| ExaCod | int(11) | NO | MUL | NULL | |
| SetCod | int(11) | NO | MUL | NULL | |
| QstCod | int(11) | NO | MUL | NULL | |
| QstInd | int(11) | NO | | 0 | |
+--------+---------+------+-----+---------+-------+
3 rows in set (0.01 sec)
3 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS exa_questions ("
"ExaCod INT NOT NULL,"
"SetCod INT NOT NULL,"
"QstCod INT NOT NULL,"
"QstInd INT NOT NULL DEFAULT 0,"
"INDEX(ExaCod),"
"INDEX(SetCod),"
"INDEX(QstCod))");
/***** Table exa_results *****/

View File

@ -241,6 +241,7 @@ void Exa_ResetExam (struct Exa_Exam *Exam)
Exam->TimeUTC[Dat_START_TIME] = (time_t) 0;
Exam->TimeUTC[Dat_END_TIME ] = (time_t) 0;
Exam->Title[0] = '\0';
Exam->NumSets = 0;
Exam->NumQsts = 0;
Exam->NumEvts = 0;
Exam->NumUnfinishedEvts = 0;
@ -545,7 +546,7 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,
struct Exa_Exam *Exam,bool ShowOnlyThisExam)
{
extern const char *Txt_View_exam;
extern const char *Txt_No_of_questions;
extern const char *Txt_Set_of_questions;
extern const char *Txt_Maximum_grade;
extern const char *Txt_Result_visibility;
extern const char *Txt_Events;
@ -629,8 +630,8 @@ static void Exa_ShowOneExam (struct Exa_Exams *Exams,
/* Number of questions, maximum grade, visibility of results */
HTM_DIV_Begin ("class=\"%s\"",Exam->Hidden ? "ASG_GRP_LIGHT" :
"ASG_GRP");
HTM_TxtColonNBSP (Txt_No_of_questions);
HTM_Unsigned (Exam->NumQsts);
HTM_TxtColonNBSP (Txt_Set_of_questions);
HTM_Unsigned (Exam->NumSets);
HTM_BR ();
HTM_TxtColonNBSP (Txt_Maximum_grade);
HTM_Double (Exam->MaxGrade);
@ -1044,20 +1045,18 @@ void ExaSet_GetDataOfSetByCod (struct ExaSet_Set *Set)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned long NumRows;
char StrSetInd[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
/***** Get data of set of questions from database *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get set data",
"SELECT SetCod," // row[0]
"SetInd," // row[1]
"NumQstsToExam," // row[2]
"Title" // row[3]
" FROM exa_sets"
" WHERE SetCod=%ld"
" AND ExaCod=%ld", // Extra check
Set->SetCod,Set->ExaCod);
if (NumRows) // Set found...
if (DB_QuerySELECT (&mysql_res,"can not get set data",
"SELECT SetCod," // row[0]
"SetInd," // row[1]
"NumQstsToExam," // row[2]
"Title" // row[3]
" FROM exa_sets"
" WHERE SetCod=%ld"
" AND ExaCod=%ld", // Extra check
Set->SetCod,Set->ExaCod)) // Set found...
{
/* Get row */
row = mysql_fetch_row (mysql_res);
@ -1144,8 +1143,11 @@ void Exa_GetDataOfExamByCod (struct Exa_Exam *Exam)
Str_Copy (Exam->Title,row[6],
Exa_MAX_BYTES_TITLE);
/* Get number of sets */
Exam->NumSets = ExaSet_GetNumSetsExam (Exam->ExaCod);
/* Get number of questions */
Exam->NumQsts = Exa_GetNumQstsExam (Exam->ExaCod);
Exam->NumQsts = ExaSet_GetNumQstsExam (Exam->ExaCod);
/* Get number of events */
Exam->NumEvts = ExaEvt_GetNumEventsInExam (Exam->ExaCod);
@ -1640,7 +1642,7 @@ void ExaSet_RecFormSet (void)
if (Exams.ExaCod <= 0)
Lay_WrongExamExit ();
Set.ExaCod = Exam.ExaCod = Exams.ExaCod;
Set.SetCod = ExaSet_GetParamSetCod ();
Exams.SetCod = Set.SetCod = ExaSet_GetParamSetCod ();
ItsANewSet = (Set.SetCod <= 0);
/***** Get exam data from database *****/
@ -2023,16 +2025,44 @@ static void Exa_UpdateExam (struct Exa_Exam *Exam,const char *Txt)
/******************* Get number of questions of an exam *********************/
/*****************************************************************************/
unsigned Exa_GetNumQstsExam (long ExaCod)
unsigned ExaSet_GetNumSetsExam (long ExaCod)
{
/***** Get nuumber of questions in an exam from database *****/
/***** Get number of sets in an exam from database *****/
return
(unsigned) DB_QueryCOUNT ("can not get number of questions of an exam",
"SELECT COUNT(*) FROM exa_questions"
(unsigned) DB_QueryCOUNT ("can not get number of sets in an exam",
"SELECT COUNT(*) FROM exa_sets"
" WHERE ExaCod=%ld",
ExaCod);
}
/*****************************************************************************/
/******************* Get number of questions of an exam *********************/
/*****************************************************************************/
unsigned ExaSet_GetNumQstsExam (long ExaCod)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumQsts = 0;
/***** Get total number of questions to appear in exam *****/
if (!DB_QuerySELECT (&mysql_res,"can not get number of questions in an exam",
"SELECT SUM(NumQstsToExam) FROM exa_sets"
" WHERE ExaCod=%ld",
ExaCod))
Lay_ShowErrorAndExit ("Error: wrong question index.");
/***** Get number of questions (row[0]) *****/
row = mysql_fetch_row (mysql_res);
if (row[0])
NumQsts = Str_ConvertStrToUnsigned (row[0]);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return NumQsts;
}
/*****************************************************************************/
/********** Request the creation or edition of an set of questions ***********/
/*****************************************************************************/
@ -2061,7 +2091,8 @@ void ExaSet_RequestCreatOrEditSet (void)
if (Exams.ExaCod <= 0)
Lay_WrongExamExit ();
Exam.ExaCod = Exams.ExaCod;
ItsANewSet = ((Set.SetCod = ExaSet_GetParamSetCod ()) <= 0);
Exams.SetCod = Set.SetCod = ExaSet_GetParamSetCod ();
ItsANewSet = (Set.SetCod <= 0);
/***** Get exam data from database *****/
Exa_GetDataOfExamByCod (&Exam);
@ -3025,7 +3056,7 @@ void ExaSet_RequestRemoveSet (void)
if (Exams.ExaCod <= 0)
Lay_WrongExamExit ();
Set.ExaCod = Exam.ExaCod = Exams.ExaCod;
Set.SetCod = ExaSet_GetParamSetCod ();
Exams.SetCod = Set.SetCod = ExaSet_GetParamSetCod ();
if (Set.SetCod <= 0)
Lay_WrongSetExit ();
@ -3055,6 +3086,66 @@ void ExaSet_RequestRemoveSet (void)
void ExaSet_RemoveSet (void)
{
extern const char *Txt_Set_of_questions_removed;
struct Exa_Exams Exams;
struct Exa_Exam Exam;
struct ExaSet_Set Set;
/***** Reset exams context *****/
Exa_ResetExams (&Exams);
/***** Reset exam and set *****/
Exa_ResetExam (&Exam);
ExaSet_ResetSet (&Set);
/***** Get parameters *****/
Exa_GetParams (&Exams);
if (Exams.ExaCod <= 0)
Lay_WrongExamExit ();
Set.ExaCod = Exam.ExaCod = Exams.ExaCod;
Set.SetCod = ExaSet_GetParamSetCod ();
if (Set.SetCod <= 0)
Lay_WrongSetExit ();
/***** Get exam data from database *****/
Exa_GetDataOfExamByCod (&Exam);
if (!Exa_CheckIfEditable (&Exam))
Lay_NoPermissionExit ();
/***** Get set data from database *****/
ExaSet_GetDataOfSetByCod (&Set);
/***** Remove the set from all the tables *****/
/* Remove questions associated to set */
DB_QueryDELETE ("can not remove questions associated to set",
"DELETE FROM exa_questions"
" USING exa_questions,exa_sets"
" WHERE exa_questions.SetCod=%ld"
" AND exa_questions.SetCod=exa_sets.SetCod"
" AND exa_sets.ExaCod=%ld", // Extra check
Set.SetCod,Set.ExaCod);
/* Remove the set itself */
DB_QueryDELETE ("can not remove set",
"DELETE FROM exa_sets"
" WHERE SetCod=%ld"
" AND ExaCod=%ld", // Extra check
Set.SetCod,Set.ExaCod);
if (!mysql_affected_rows (&Gbl.mysql))
Lay_ShowErrorAndExit ("The set to be removed does not exist.");
/* Change index of sets greater than this */
DB_QueryUPDATE ("can not update indexes of sets",
"UPDATE exa_sets SET SetInd=SetInd-1"
" WHERE ExaCod=%ld AND SetInd>%u",
Set.ExaCod,Set.SetInd);
/***** Write message *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_Set_of_questions_removed);
/***** Show current exam and its sets *****/
Exa_PutFormsOneExam (&Exams,&Exam,&Set,
false); // It's not a new exam
}
/*****************************************************************************/

View File

@ -95,6 +95,7 @@ struct Exa_Exam
char Title[Exa_MAX_BYTES_TITLE + 1];
time_t TimeUTC[Dat_NUM_START_END_TIME];
bool Hidden; // Exam is hidden
unsigned NumSets; // Number of sets in the exam
unsigned NumQsts; // Number of questions in the exam
unsigned NumEvts; // Number of events in the exam
unsigned NumUnfinishedEvts; // Number of unfinished events in the exam
@ -154,9 +155,8 @@ void ExaSet_RecFormSet (void);
void Exa_RecFormExam (void);
bool Mch_CheckIfMatchIsAssociatedToGrp (long EvtCod,long GrpCod);
unsigned Exa_GetNumQstsExam (long ExaCod);
void Exa_RequestNewSet (void);
unsigned ExaSet_GetNumSetsExam (long ExaCod);
unsigned ExaSet_GetNumQstsExam (long ExaCod);
void ExaSet_RequestCreatOrEditSet (void);
void Exa_RequestNewQuestion (void);

View File

@ -2705,7 +2705,7 @@ static void ExaEvt_ShowNumQstInEvt (const struct ExaEvt_Event *Event)
{
extern const char *Txt_MATCH_Start;
extern const char *Txt_MATCH_End;
unsigned NumQsts = Exa_GetNumQstsExam (Event->ExaCod);
unsigned NumQsts = ExaSet_GetNumQstsExam (Event->ExaCod);
HTM_DIV_Begin ("class=\"EXA_NUM_QST\"");
switch (Event->Status.Showing)

View File

@ -41046,6 +41046,27 @@ const char *Txt_Set_of_questions =
"Conjunto de perguntas";
#endif
const char *Txt_Set_of_questions_removed =
#if L==1 // ca
"Conjunt de preguntes eliminat.";
#elif L==2 // de
"Satz von Fragen entfernt.";
#elif L==3 // en
"Set of questions removed.";
#elif L==4 // es
"Conjunto de preguntas eliminado.";
#elif L==5 // fr
"Ensemble de questions supprim&eacute;.";
#elif L==6 // gn
"Conjunto de preguntas eliminado."; // Okoteve traducción
#elif L==7 // it
"Set di domande rimosso.";
#elif L==8 // pl
"Zestaw pyta&nacute; usuniete.";
#elif L==9 // pt
"Conjunto de perguntas removido.";
#endif
const char *Txt_Set_password =
#if L==1 // ca
"Establir contrasenya";