Version19.242.1

This commit is contained in:
acanas 2020-05-23 19:08:59 +02:00
parent 91319694d2
commit 1981c0b605
12 changed files with 207 additions and 181 deletions

View File

@ -491,7 +491,7 @@ CREATE TABLE IF NOT EXISTS exa_log (
PrnCod INT NOT NULL,
ActCod INT NOT NULL,
QstInd INT NOT NULL DEFAULT -1,
Open ENUM('N','Y') NOT NULL DEFAULT 'N',
CanAnswer ENUM('N','Y') NOT NULL DEFAULT 'N',
ClickTime DATETIME NOT NULL,
IP CHAR(15) NOT NULL,
SessionId CHAR(43) NOT NULL,

View File

@ -557,10 +557,15 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.242 (2020-05-23)"
#define Log_PLATFORM_VERSION "SWAD 19.242.1 (2020-05-23)"
#define CSS_FILE "swad19.238.2.css"
#define JS_FILE "swad19.239.6.js"
/*
Version 19.243: May 23, 2020 List exam log. (? lines)
Version 19.242.1: May 23, 2020 Bug fixing and code refactoring in exam log. (301932 lines)
1 change necessary in database:
ALTER TABLE exa_log CHANGE COLUMN Open CanAnswer ENUM('N','Y') NOT NULL DEFAULT 'N';
Version 19.242: May 23, 2020 Changes in exam log. (301911 lines)
1 change necessary in database:
ALTER TABLE exa_log CHANGE COLUMN Saved Open ENUM('N','Y') NOT NULL DEFAULT 'N';

View File

@ -1054,7 +1054,7 @@ mysql> DESCRIBE exa_log;
| PrnCod | int(11) | NO | MUL | NULL | |
| ActCod | int(11) | NO | | NULL | |
| QstInd | int(11) | NO | | -1 | |
| Open | enum('N','Y') | NO | | N | |
| CanAnswer | enum('N','Y') | NO | | N | |
| ClickTime | datetime | NO | MUL | NULL | |
| IP | char(15) | NO | | NULL | |
| SessionId | char(43) | NO | | NULL | |
@ -1067,7 +1067,7 @@ mysql> DESCRIBE exa_log;
"PrnCod INT NOT NULL,"
"ActCod INT NOT NULL,"
"QstInd INT NOT NULL DEFAULT -1,"
"Open ENUM('N','Y') NOT NULL DEFAULT 'N',"
"CanAnswer ENUM('N','Y') NOT NULL DEFAULT 'N',"
"ClickTime DATETIME NOT NULL,"
"IP CHAR(15) NOT NULL," // Cns_MAX_BYTES_IP
"SessionId CHAR(43) NOT NULL," // Cns_BYTES_SESSION_ID

View File

@ -958,17 +958,15 @@ void Exa_GetDataOfExamByCod (struct Exa_Exam *Exam)
/***** Get exam data from database *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get exam data",
"SELECT exa_exams.ExaCod," // row[0]
"exa_exams.CrsCod," // row[1]
"exa_exams.Hidden," // row[2]
"exa_exams.UsrCod," // row[3]
"exa_exams.MaxGrade," // row[4]
"exa_exams.Visibility," // row[5]
"exa_exams.Title" // row[6]
"SELECT ExaCod," // row[0]
"CrsCod," // row[1]
"Hidden," // row[2]
"UsrCod," // row[3]
"MaxGrade," // row[4]
"Visibility," // row[5]
"Title" // row[6]
" FROM exa_exams"
" LEFT JOIN exa_sessions"
" ON exa_exams.ExaCod=exa_sessions.ExaCod"
" WHERE exa_exams.ExaCod=%ld",
" WHERE ExaCod=%ld",
Exam->ExaCod);
if (NumRows) // Exam found...
{

View File

@ -53,13 +53,13 @@ static struct
long PrnCod; // Exam print code
int QstInd; // Exam print question index
ExaLog_Action_t Action; // Action performed by user
bool Open; // Exam print is open and accesible to answer by the user
bool ICanAnswer; // Exam print is open and accesible to answer by the user
} ExaLog_Log =
{
.PrnCod = -1L, // -1 means no print code set
.QstInd = -1, // -1 means no question index set
.Action = ExaLog_UNKNOWN_ACTION,
.Open = false,
.PrnCod = -1L, // -1 means no print code set
.QstInd = -1, // -1 means no question index set
.Action = ExaLog_UNKNOWN_ACTION,
.ICanAnswer = false,
};
/*****************************************************************************/
@ -81,7 +81,7 @@ ExaLog_Action_t ExaLog_GetAction (void)
}
/*****************************************************************************/
/************* Set and get current exam print code (used in log) *************/
/******************** Set and get current exam print code ********************/
/*****************************************************************************/
void ExaLog_SetPrnCod (long PrnCod)
@ -95,7 +95,7 @@ long ExaLog_GetPrnCod (void)
}
/*****************************************************************************/
/****** Set and get current question index in exam print (used in log) *******/
/************* Set and get current question index in exam print **************/
/*****************************************************************************/
void ExaLog_SetQstInd (unsigned QstInd)
@ -109,17 +109,17 @@ int ExaLog_GetQstInd (void)
}
/*****************************************************************************/
/******** Set and get if answer is saved in exam print (used in log) *********/
/************* Set and get if exam print is open and accessible **************/
/*****************************************************************************/
void ExaLog_SetOpen (bool Open)
void ExaLog_SetIfCanAnswer (bool ICanAnswer)
{
ExaLog_Log.Open = Open;
ExaLog_Log.ICanAnswer = ICanAnswer;
}
bool ExaLog_GetOpen (void)
bool ExaLog_GetIfCanAnswer (void)
{
return ExaLog_Log.Open;
return ExaLog_Log.ICanAnswer;
}
/*****************************************************************************/
@ -142,15 +142,15 @@ void ExaLog_LogAccess (long LogCod)
Redundant data (also present in log table) are stored for speed */
DB_QueryINSERT ("can not log exam access",
"INSERT INTO exa_log "
"(LogCod,PrnCod,ActCod,QstInd,Open,ClickTime,IP,SessionId)"
"(LogCod,PrnCod,ActCod,QstInd,UserCanAnswer,ClickTime,IP,SessionId)"
" VALUES "
"(%ld,%ld,%ld,%d,'%c',NOW(),'%s','%s')",
LogCod,
PrnCod,
(unsigned) Action,
ExaLog_GetQstInd (),
ExaLog_GetOpen () ? 'Y' :
'N',
ExaLog_GetIfCanAnswer () ? 'Y' :
'N',
// NOW() Redundant, for speed
Gbl.IP, // Redundant, for speed
Gbl.Session.Id);

View File

@ -52,8 +52,8 @@ void ExaLog_SetAction (ExaLog_Action_t Action);
ExaLog_Action_t ExaLog_GetAction (void);
void ExaLog_SetQstInd (unsigned QstInd);
int ExaLog_GetQstInd (void);
void ExaLog_SetOpen (bool Open);
bool ExaLog_GetOpen (void);
void ExaLog_SetIfCanAnswer (bool CanBeAnswered);
bool ExaLog_GetIfCanAnswer (void);
void ExaLog_LogAccess (long LogCod);

View File

@ -196,22 +196,22 @@ void ExaPrn_ShowExamPrint (void)
/***** Get print data from database *****/
Print.SesCod = Session.SesCod;
Print.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
ExaPrn_GetPrintDataBySesCodAndUsrCod (&Print);
ExaPrn_GetDataOfPrintByCodAndUsrCod (&Print);
if (Print.PrnCod <= 0) // Print does not exists
if (Print.PrnCod <= 0) // Print does not exists ==> create it
{
/***** Get questions from database *****/
ExaPrn_GetQuestionsForNewPrintFromDB (&Print,Exam.ExaCod);
if (Print.NumQsts)
{
/***** Create/update new exam print in database *****/
/***** Create new exam print in database *****/
ExaPrn_CreatePrintInDB (&Print);
/***** Set log print code and action *****/
ExaLog_SetPrnCod (Print.PrnCod);
ExaLog_SetAction (ExaLog_START_EXAM);
ExaLog_SetOpen (true);
ExaLog_SetIfCanAnswer (true);
}
}
else // Print exists
@ -222,7 +222,7 @@ void ExaPrn_ShowExamPrint (void)
/***** Set log print code and action *****/
ExaLog_SetPrnCod (Print.PrnCod);
ExaLog_SetAction (ExaLog_RESUME_EXAM);
ExaLog_SetOpen (true);
ExaLog_SetIfCanAnswer (true);
}
/***** Show test exam to be answered *****/
@ -237,7 +237,7 @@ void ExaPrn_ShowExamPrint (void)
/******** Get data of an exam print using session code and user code *********/
/*****************************************************************************/
void ExaPrn_GetPrintDataBySesCodAndUsrCod (struct ExaPrn_Print *Print)
void ExaPrn_GetDataOfPrintByCodAndUsrCod (struct ExaPrn_Print *Print)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
@ -980,10 +980,14 @@ static void ExaPrn_WriteJSToUpdateExamPrint (const struct ExaPrn_Print *Print,
void ExaPrn_ReceivePrintAnswer (void)
{
extern const char *Txt_You_dont_have_access_to_the_exam;
struct Exa_Exam Exam;
struct ExaSes_Session Session;
struct ExaPrn_Print Print;
unsigned QstInd;
/***** Reset print *****/
/***** Reset exam, session and print *****/
Exa_ResetExam (&Exam);
ExaSes_ResetSession (&Session);
ExaPrn_ResetPrint (&Print);
/***** Get session code *****/
@ -991,12 +995,23 @@ void ExaPrn_ReceivePrintAnswer (void)
/***** Get print data *****/
Print.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
ExaPrn_GetPrintDataBySesCodAndUsrCod (&Print);
ExaPrn_GetDataOfPrintByCodAndUsrCod (&Print);
if (Print.PrnCod <= 0)
Lay_WrongExamExit ();
/***** Get questions and current user's answers of exam print from database *****/
ExaPrn_GetPrintQuestionsFromDB (&Print);
/***** Get session data *****/
Session.SesCod = Print.SesCod;
ExaSes_GetDataOfSessionByCod (&Session);
if (Session.SesCod <= 0)
Lay_WrongExamExit ();
/***** Get exam data *****/
Exam.ExaCod = Session.ExaCod;
Exa_GetDataOfExamByCod (&Exam);
if (Exam.ExaCod <= 0)
Lay_WrongExamExit ();
if (Exam.CrsCod != Gbl.Hierarchy.Crs.CrsCod)
Lay_WrongExamExit ();
/***** Get question index from form *****/
QstInd = ExaPrn_GetParamQstInd ();
@ -1007,10 +1022,13 @@ void ExaPrn_ReceivePrintAnswer (void)
ExaLog_SetQstInd (QstInd);
/***** Check if session if visible and open *****/
if (ExaSes_CheckIfSessionIsVisibleAndOpen (Print.SesCod))
if (ExaSes_CheckIfICanAnswerThisSession (&Exam,&Session))
{
/***** Set log open ****/
ExaLog_SetOpen (true);
/***** Set log open to true ****/
ExaLog_SetIfCanAnswer (true);
/***** Get questions and current user's answers of exam print from database *****/
ExaPrn_GetPrintQuestionsFromDB (&Print);
/***** Get answers from form to assess a test *****/
ExaPrn_GetAnswerFromForm (&Print,QstInd);
@ -1029,8 +1047,8 @@ void ExaPrn_ReceivePrintAnswer (void)
}
else // Not accessible to answer
{
/***** Set log open ****/
ExaLog_SetOpen (true);
/***** Set log open to false ****/
ExaLog_SetIfCanAnswer (false);
/***** Show warning *****/
Ale_ShowAlert (Ale_INFO,Txt_You_dont_have_access_to_the_exam);

View File

@ -57,7 +57,7 @@ void ExaPrn_ResetPrint (struct ExaPrn_Print *Print);
void ExaPrn_ShowExamPrint (void);
void ExaPrn_GetPrintDataBySesCodAndUsrCod (struct ExaPrn_Print *Print);
void ExaPrn_GetDataOfPrintByCodAndUsrCod (struct ExaPrn_Print *Print);
void ExaPrn_GetPrintQuestionsFromDB (struct ExaPrn_Print *Print);

View File

@ -108,7 +108,12 @@ static void ExaRes_ShowResultsSummaryRow (unsigned NumResults,
double TotalScoreOfAllResults,
double TotalGrade);
static bool ExaRes_CheckIfICanSeePrintResult (struct ExaSes_Session *Session,long UsrCod);
static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
const struct ExaSes_Session *Session,
struct ExaPrn_Print *Print,
struct UsrData *UsrDat);
static bool ExaRes_CheckIfICanSeePrintResult (const struct ExaSes_Session *Session,long UsrCod);
static bool ExaRes_CheckIfICanViewScore (bool ICanViewResult,unsigned Visibility);
static void ExaRes_ShowExamAnswers (struct UsrData *UsrDat,
@ -1076,31 +1081,17 @@ static void ExaRes_ShowResultsSummaryRow (unsigned NumResults,
}
/*****************************************************************************/
/******************* Show one session result of another user *******************/
/*************************** Show one exam result ****************************/
/*****************************************************************************/
void ExaRes_ShowOneExaResult (void)
{
extern const char *Hlp_ASSESSMENT_Exams_results;
extern const char *Txt_The_user_does_not_exist;
extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Questions;
extern const char *Txt_non_blank_QUESTIONS;
extern const char *Txt_Score;
extern const char *Txt_Grade;
struct Exa_Exams Exams;
struct Exa_Exam Exam;
struct ExaSes_Session Session;
Usr_MeOrOther_t MeOrOther;
struct UsrData *UsrDat;
Dat_StartEndTime_t StartEndTime;
char *Id;
struct ExaPrn_Print Print;
bool ShowPhoto;
char PhotoURL[PATH_MAX + 1];
bool ICanViewResult;
bool ICanViewScore;
/***** Reset exams context *****/
Exa_ResetExams (&Exams);
@ -1126,31 +1117,68 @@ void ExaRes_ShowOneExaResult (void)
break;
}
/***** Get session result data *****/
/***** Get exam print data *****/
ExaPrn_ResetPrint (&Print);
Print.SesCod = Session.SesCod;
Print.UsrCod = UsrDat->UsrCod;
ExaPrn_GetPrintDataBySesCodAndUsrCod (&Print);
ExaPrn_GetDataOfPrintByCodAndUsrCod (&Print);
/***** Set log action and print code *****/
if (Gbl.Action.Act == ActEndExaPrn)
{
ExaLog_SetAction (ExaLog_FINISH_EXAM);
ExaLog_SetPrnCod (Print.PrnCod);
ExaLog_SetIfCanAnswer (ExaSes_CheckIfICanAnswerThisSession (&Exam,&Session));
}
/***** Get questions and user's answers of exam print from database *****/
ExaPrn_GetPrintQuestionsFromDB (&Print);
/***** Show exam result *****/
ExaRes_ShowExamResult (&Exam,&Session,&Print,UsrDat);
/***** Show exam log *****/
}
/*****************************************************************************/
/*************************** Show one exam result ****************************/
/*****************************************************************************/
static void ExaRes_ShowExamResult (const struct Exa_Exam *Exam,
const struct ExaSes_Session *Session,
struct ExaPrn_Print *Print,
struct UsrData *UsrDat)
{
extern const char *Hlp_ASSESSMENT_Exams_results;
extern const char *Txt_The_user_does_not_exist;
extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Questions;
extern const char *Txt_non_blank_QUESTIONS;
extern const char *Txt_Score;
extern const char *Txt_Grade;
bool ShowPhoto;
char PhotoURL[PATH_MAX + 1];
Dat_StartEndTime_t StartEndTime;
char *Id;
struct
{
bool Result;
bool Score;
} ICanView;
/***** Check if I can view this print result *****/
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD:
// Depends on visibility of result for this session (eye icon)
ICanViewResult = ExaRes_CheckIfICanSeePrintResult (&Session,UsrDat->UsrCod);
ICanView.Result = ExaRes_CheckIfICanSeePrintResult (Session,UsrDat->UsrCod);
if (ICanViewResult)
if (ICanView.Result)
// Depends on 5 visibility icons
ICanViewScore = TstVis_IsVisibleTotalScore (Exam.Visibility);
ICanView.Score = TstVis_IsVisibleTotalScore (Exam->Visibility);
else
ICanViewScore = false;
ICanView.Score = false;
break;
case Rol_NET:
case Rol_TCH:
@ -1158,20 +1186,17 @@ void ExaRes_ShowOneExaResult (void)
case Rol_CTR_ADM:
case Rol_INS_ADM:
case Rol_SYS_ADM:
ICanViewResult =
ICanViewScore = true;
ICanView.Result =
ICanView.Score = true;
break;
default:
ICanViewResult =
ICanViewScore = false;
ICanView.Result =
ICanView.Score = false;
break;
}
/***** Get questions and user's answers of exam print from database *****/
ExaPrn_GetPrintQuestionsFromDB (&Print);
/***** Begin box *****/
Box_BoxBegin (NULL,Session.Title,
Box_BoxBegin (NULL,Session->Title,
NULL,NULL,
Hlp_ASSESSMENT_Exams_results,Box_NOT_CLOSABLE);
Lay_WriteHeaderClassPhoto (false,false,
@ -1226,7 +1251,7 @@ void ExaRes_ShowOneExaResult (void)
if (asprintf (&Id,"match_%u",(unsigned) StartEndTime) < 0)
Lay_NotEnoughMemoryExit ();
HTM_TD_Begin ("id=\"%s\" class=\"DAT LT\"",Id);
Dat_WriteLocalDateHMSFromUTC (Id,Print.TimeUTC[StartEndTime],
Dat_WriteLocalDateHMSFromUTC (Id,Print->TimeUTC[StartEndTime],
Gbl.Prefs.DateFormat,Dat_SEPARATOR_COMMA,
true,true,true,0x7);
HTM_TD_End ();
@ -1243,10 +1268,10 @@ void ExaRes_ShowOneExaResult (void)
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
if (ICanViewResult)
if (ICanView.Result)
HTM_TxtF ("%u (%u %s)",
Print.NumQsts,
Print.NumQstsNotBlank,Txt_non_blank_QUESTIONS);
Print->NumQsts,
Print->NumQstsNotBlank,Txt_non_blank_QUESTIONS);
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
@ -1261,8 +1286,8 @@ void ExaRes_ShowOneExaResult (void)
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
if (ICanViewScore)
HTM_Double2Decimals (Print.Score);
if (ICanView.Score)
HTM_Double2Decimals (Print->Score);
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
@ -1277,9 +1302,9 @@ void ExaRes_ShowOneExaResult (void)
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT LT\"");
if (ICanViewScore)
TstPrn_ComputeAndShowGrade (Print.NumQsts,Print.Score,
Exam.MaxGrade);
if (ICanView.Score)
TstPrn_ComputeAndShowGrade (Print->NumQsts,Print->Score,
Exam->MaxGrade);
else
Ico_PutIconNotVisible ();
HTM_TD_End ();
@ -1287,22 +1312,22 @@ void ExaRes_ShowOneExaResult (void)
HTM_TR_End ();
/***** Write answers and solutions *****/
if (ICanViewResult)
ExaRes_ShowExamAnswers (UsrDat,&Print,Exam.Visibility);
if (ICanView.Result)
ExaRes_ShowExamAnswers (UsrDat,Print,Exam->Visibility);
/***** End table *****/
HTM_TABLE_End ();
/***** Write total mark of session result *****/
if (ICanViewScore)
if (ICanView.Score)
{
HTM_DIV_Begin ("class=\"DAT_N_BOLD CM\"");
HTM_TxtColonNBSP (Txt_Score);
HTM_Double2Decimals (Print.Score);
HTM_Double2Decimals (Print->Score);
HTM_BR ();
HTM_TxtColonNBSP (Txt_Grade);
TstPrn_ComputeAndShowGrade (Print.NumQsts,Print.Score,
Exam.MaxGrade);
TstPrn_ComputeAndShowGrade (Print->NumQsts,Print->Score,
Exam->MaxGrade);
HTM_DIV_End ();
}
@ -1314,7 +1339,7 @@ void ExaRes_ShowOneExaResult (void)
/********************** Get if I can see session result ************************/
/*****************************************************************************/
static bool ExaRes_CheckIfICanSeePrintResult (struct ExaSes_Session *Session,long UsrCod)
static bool ExaRes_CheckIfICanSeePrintResult (const struct ExaSes_Session *Session,long UsrCod)
{
bool ItsMe;
@ -1405,16 +1430,16 @@ static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat,
unsigned Visibility)
{
extern const char *Txt_Score;
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY];
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY];
/***** Check if I can view each part of the question *****/
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD:
IsVisible[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility);
IsVisible[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility);
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility);
IsVisible[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility);
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility);
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility);
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility);
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility);
break;
case Rol_NET:
case Rol_TCH:
@ -1422,16 +1447,16 @@ static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat,
case Rol_CTR_ADM:
case Rol_INS_ADM:
case Rol_SYS_ADM:
IsVisible[TstVis_VISIBLE_QST_ANS_TXT ] =
IsVisible[TstVis_VISIBLE_FEEDBACK_TXT ] =
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER] =
IsVisible[TstVis_VISIBLE_EACH_QST_SCORE] = true;
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = true;
break;
default:
IsVisible[TstVis_VISIBLE_QST_ANS_TXT ] =
IsVisible[TstVis_VISIBLE_FEEDBACK_TXT ] =
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER] =
IsVisible[TstVis_VISIBLE_EACH_QST_SCORE] = false;
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = false;
break;
}
@ -1448,10 +1473,10 @@ static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat,
HTM_TD_Begin ("class=\"LT COLOR%u\"",Gbl.RowEvenOdd);
/* Stem */
Tst_WriteQstStem (Question->Stem,"TEST_EXA",IsVisible[TstVis_VISIBLE_QST_ANS_TXT]);
Tst_WriteQstStem (Question->Stem,"TEST_EXA",ICanView[TstVis_VISIBLE_QST_ANS_TXT]);
/* Media */
if (IsVisible[TstVis_VISIBLE_QST_ANS_TXT])
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT])
Med_ShowMedia (&Question->Media,
"TEST_MED_SHOW_CONT",
"TEST_MED_SHOW");
@ -1459,10 +1484,10 @@ static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat,
/* Answers */
ExaPrn_ComputeAnswerScore (&Print->PrintedQuestions[NumQst],Question);
TstPrn_WriteAnswersExam (UsrDat,&Print->PrintedQuestions[NumQst],Question,
IsVisible);
ICanView);
/* Write score retrieved from database */
if (IsVisible[TstVis_VISIBLE_EACH_QST_SCORE])
if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE])
{
HTM_DIV_Begin ("class=\"DAT_SMALL LM\"");
HTM_TxtColonNBSP (Txt_Score);
@ -1477,7 +1502,7 @@ static void ExaRes_WriteQstAndAnsExam (struct UsrData *UsrDat,
}
/* Question feedback */
if (IsVisible[TstVis_VISIBLE_FEEDBACK_TXT])
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
Tst_WriteQstFeedback (Question->Feedback,"TEST_EXA_LIGHT");
HTM_TD_End ();

View File

@ -333,25 +333,6 @@ void ExaSes_GetDataOfSessionByCod (struct ExaSes_Session *Session)
DB_FreeMySQLResult (&mysql_res);
}
/*****************************************************************************/
/***************** Check if exam session is visible and open *****************/
/*****************************************************************************/
bool ExaSes_CheckIfSessionIsVisibleAndOpen (long SesCod)
{
/***** Trivial check *****/
if (SesCod < 0) // A non-existing session...
return false; // ...is not visible or open
/***** Check if exam session is visible and open from database *****/
return (DB_QueryCOUNT ("can not check if session is visible and open",
"SELECT COUNT(*) FROM exa_sessions"
" WHERE SesCod=%ld"
" AND Hidden='N'" // Visible
" AND NOW() BETWEEN StartTime AND EndTime", // Open
SesCod) != 0);
}
/*****************************************************************************/
/***************** Put icons in list of sessions of an exam ******************/
/*****************************************************************************/

View File

@ -55,7 +55,6 @@ void ExaSes_ListSessions (struct Exa_Exams *Exams,
struct ExaSes_Session *Session,
bool PutFormSession);
void ExaSes_GetDataOfSessionByCod (struct ExaSes_Session *Session);
bool ExaSes_CheckIfSessionIsVisibleAndOpen (long SesCod);
void ExaSes_ToggleVisResultsSesUsr (void);

View File

@ -105,23 +105,23 @@ static void TstPrn_GetCorrectTxtAnswerFromDB (struct Tst_Question *Question);
static void TstPrn_WriteIntAnsPrint (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY]);
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY]);
static void TstPrn_WriteFltAnsPrint (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY]);
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY]);
static void TstPrn_WriteTF_AnsPrint (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY]);
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY]);
static void TstPrn_WriteChoAnsPrint (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY]);
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY]);
static void TstPrn_WriteTxtAnsPrint (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY]);
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY]);
//-----------------------------------------------------------------------------
@ -280,16 +280,16 @@ static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
extern const char *Txt_Question_removed;
extern const char *Txt_Question_modified;
bool QuestionUneditedAfterExam = false;
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY];
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY];
/***** Check if I can view each part of the question *****/
switch (Gbl.Usrs.Me.Role.Logged)
{
case Rol_STD:
IsVisible[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility);
IsVisible[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility);
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility);
IsVisible[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility);
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] = TstVis_IsVisibleQstAndAnsTxt (Visibility);
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] = TstVis_IsVisibleFeedbackTxt (Visibility);
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] = TstVis_IsVisibleCorrectAns (Visibility);
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = TstVis_IsVisibleEachQstScore (Visibility);
break;
case Rol_NET:
case Rol_TCH:
@ -297,16 +297,16 @@ static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
case Rol_CTR_ADM:
case Rol_INS_ADM:
case Rol_SYS_ADM:
IsVisible[TstVis_VISIBLE_QST_ANS_TXT ] =
IsVisible[TstVis_VISIBLE_FEEDBACK_TXT ] =
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER] =
IsVisible[TstVis_VISIBLE_EACH_QST_SCORE] = true;
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = true;
break;
default:
IsVisible[TstVis_VISIBLE_QST_ANS_TXT ] =
IsVisible[TstVis_VISIBLE_FEEDBACK_TXT ] =
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER] =
IsVisible[TstVis_VISIBLE_EACH_QST_SCORE] = false;
ICanView[TstVis_VISIBLE_QST_ANS_TXT ] =
ICanView[TstVis_VISIBLE_FEEDBACK_TXT ] =
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] =
ICanView[TstVis_VISIBLE_EACH_QST_SCORE] = false;
break;
}
@ -334,10 +334,10 @@ static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
if (QuestionUneditedAfterExam)
{
/* Stem */
Tst_WriteQstStem (Question->Stem,"TEST_EXA",IsVisible[TstVis_VISIBLE_QST_ANS_TXT]);
Tst_WriteQstStem (Question->Stem,"TEST_EXA",ICanView[TstVis_VISIBLE_QST_ANS_TXT]);
/* Media */
if (IsVisible[TstVis_VISIBLE_QST_ANS_TXT])
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT])
Med_ShowMedia (&Question->Media,
"TEST_MED_SHOW_CONT",
"TEST_MED_SHOW");
@ -345,7 +345,7 @@ static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
/* Answers */
TstPrn_ComputeAnswerScore (&Print->PrintedQuestions[NumQst],Question);
TstPrn_WriteAnswersExam (UsrDat,&Print->PrintedQuestions[NumQst],Question,
IsVisible);
ICanView);
}
else
Ale_ShowAlert (Ale_WARNING,Txt_Question_modified);
@ -354,7 +354,7 @@ static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
Ale_ShowAlert (Ale_WARNING,Txt_Question_removed);
/* Write score retrieved from database */
if (IsVisible[TstVis_VISIBLE_EACH_QST_SCORE])
if (ICanView[TstVis_VISIBLE_EACH_QST_SCORE])
{
HTM_DIV_Begin ("class=\"DAT_SMALL LM\"");
HTM_TxtColonNBSP (Txt_Score);
@ -370,7 +370,7 @@ static void TstPrn_WriteQstAndAnsExam (struct UsrData *UsrDat,
/* Question feedback */
if (QuestionUneditedAfterExam)
if (IsVisible[TstVis_VISIBLE_FEEDBACK_TXT])
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
Tst_WriteQstFeedback (Question->Feedback,"TEST_EXA_LIGHT");
HTM_TD_End ();
@ -916,12 +916,12 @@ void TstPrn_ShowGrade (double Grade,double MaxGrade)
void TstPrn_WriteAnswersExam (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY])
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY])
{
void (*TstPrn_WriteAnsExam[Tst_NUM_ANS_TYPES]) (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY]) =
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY]) =
{
[Tst_ANS_INT ] = TstPrn_WriteIntAnsPrint,
[Tst_ANS_FLOAT ] = TstPrn_WriteFltAnsPrint,
@ -933,7 +933,7 @@ void TstPrn_WriteAnswersExam (struct UsrData *UsrDat,
/***** Get correct answer and compute answer score depending on type *****/
TstPrn_WriteAnsExam[Question->Answer.Type] (UsrDat,PrintedQuestion,Question,
IsVisible);
ICanView);
}
/*****************************************************************************/
@ -943,7 +943,7 @@ void TstPrn_WriteAnswersExam (struct UsrData *UsrDat,
static void TstPrn_WriteIntAnsPrint (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY])
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY])
{
long IntAnswerUsr;
@ -964,7 +964,7 @@ static void TstPrn_WriteIntAnsPrint (struct UsrData *UsrDat,
if (sscanf (PrintedQuestion->StrAnswers,"%ld",&IntAnswerUsr) == 1)
{
HTM_TD_Begin ("class=\"%s CM\"",
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER] ?
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ?
(IntAnswerUsr == Question->Answer.Integer ? "ANS_OK" :
"ANS_BAD") :
"ANS_0");
@ -983,8 +983,8 @@ static void TstPrn_WriteIntAnsPrint (struct UsrData *UsrDat,
/***** Write the correct answer *****/
HTM_TD_Begin ("class=\"ANS_0 CM\"");
if (IsVisible[TstVis_VISIBLE_QST_ANS_TXT] &&
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER])
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] &&
ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
HTM_Long (Question->Answer.Integer);
else
Ico_PutIconNotVisible ();
@ -1002,7 +1002,7 @@ static void TstPrn_WriteIntAnsPrint (struct UsrData *UsrDat,
static void TstPrn_WriteFltAnsPrint (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY])
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY])
{
double FloatAnsUsr = 0.0;
@ -1024,7 +1024,7 @@ static void TstPrn_WriteFltAnsPrint (struct UsrData *UsrDat,
FloatAnsUsr = Str_GetDoubleFromStr (PrintedQuestion->StrAnswers);
// A bad formatted floating point answer will interpreted as 0.0
HTM_TD_Begin ("class=\"%s CM\"",
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER] ?
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ?
((FloatAnsUsr >= Question->Answer.FloatingPoint[0] &&
FloatAnsUsr <= Question->Answer.FloatingPoint[1]) ? "ANS_OK" :
"ANS_BAD") :
@ -1037,8 +1037,8 @@ static void TstPrn_WriteFltAnsPrint (struct UsrData *UsrDat,
/***** Write the correct answer *****/
HTM_TD_Begin ("class=\"ANS_0 CM\"");
if (IsVisible[TstVis_VISIBLE_QST_ANS_TXT] &&
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER])
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] &&
ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
{
HTM_Txt ("[");
HTM_Double (Question->Answer.FloatingPoint[0]);
@ -1062,7 +1062,7 @@ static void TstPrn_WriteFltAnsPrint (struct UsrData *UsrDat,
static void TstPrn_WriteTF_AnsPrint (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY])
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY])
{
char AnsTFUsr;
@ -1082,7 +1082,7 @@ static void TstPrn_WriteTF_AnsPrint (struct UsrData *UsrDat,
/***** Write the user answer *****/
HTM_TD_Begin ("class=\"%s CM\"",
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER] ?
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ?
(AnsTFUsr == Question->Answer.TF ? "ANS_OK" :
"ANS_BAD") :
"ANS_0");
@ -1091,8 +1091,8 @@ static void TstPrn_WriteTF_AnsPrint (struct UsrData *UsrDat,
/***** Write the correct answer *****/
HTM_TD_Begin ("class=\"ANS_0 CM\"");
if (IsVisible[TstVis_VISIBLE_QST_ANS_TXT] &&
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER])
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] &&
ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
Tst_WriteAnsTF (Question->Answer.TF);
else
Ico_PutIconNotVisible ();
@ -1110,7 +1110,7 @@ static void TstPrn_WriteTF_AnsPrint (struct UsrData *UsrDat,
static void TstPrn_WriteChoAnsPrint (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY])
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY])
{
extern const char *Txt_TST_Answer_given_by_the_user;
extern const char *Txt_TST_Answer_given_by_the_teachers;
@ -1135,7 +1135,7 @@ static void TstPrn_WriteChoAnsPrint (struct UsrData *UsrDat,
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
/* Convert answer feedback, that is in HTML, to rigorous HTML */
if (IsVisible[TstVis_VISIBLE_FEEDBACK_TXT])
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
if (Question->Answer.Options[NumOpt].Feedback)
if (Question->Answer.Options[NumOpt].Feedback[0])
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
@ -1166,7 +1166,7 @@ static void TstPrn_WriteChoAnsPrint (struct UsrData *UsrDat,
/* Draw icon depending on user's answer */
if (UsrAnswers[Indexes[NumOpt]] == true) // This answer has been selected by the user
{
if (IsVisible[TstVis_VISIBLE_CORRECT_ANSWER])
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
{
if (Question->Answer.Options[Indexes[NumOpt]].Correct)
{
@ -1194,7 +1194,7 @@ static void TstPrn_WriteChoAnsPrint (struct UsrData *UsrDat,
HTM_TD_Empty (1);
/* Draw icon that indicates whether the answer is correct */
if (IsVisible[TstVis_VISIBLE_CORRECT_ANSWER])
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
{
if (Question->Answer.Options[Indexes[NumOpt]].Correct)
{
@ -1222,7 +1222,7 @@ static void TstPrn_WriteChoAnsPrint (struct UsrData *UsrDat,
HTM_TD_Begin ("class=\"LT\"");
HTM_DIV_Begin ("class=\"ANS_TXT\"");
if (IsVisible[TstVis_VISIBLE_QST_ANS_TXT])
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT])
{
HTM_Txt (Question->Answer.Options[Indexes[NumOpt]].Text);
Med_ShowMedia (&Question->Answer.Options[Indexes[NumOpt]].Media,
@ -1233,7 +1233,7 @@ static void TstPrn_WriteChoAnsPrint (struct UsrData *UsrDat,
Ico_PutIconNotVisible ();
HTM_DIV_End ();
if (IsVisible[TstVis_VISIBLE_CORRECT_ANSWER])
if (ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
if (Question->Answer.Options[Indexes[NumOpt]].Feedback)
if (Question->Answer.Options[Indexes[NumOpt]].Feedback[0])
{
@ -1258,7 +1258,7 @@ static void TstPrn_WriteChoAnsPrint (struct UsrData *UsrDat,
static void TstPrn_WriteTxtAnsPrint (struct UsrData *UsrDat,
const struct TstPrn_PrintedQuestion *PrintedQuestion,
const struct Tst_Question *Question,
bool IsVisible[TstVis_NUM_ITEMS_VISIBILITY])
bool ICanView[TstVis_NUM_ITEMS_VISIBILITY])
{
unsigned NumOpt;
char TextAnsUsr[Tst_MAX_BYTES_ANSWERS_ONE_QST + 1];
@ -1277,7 +1277,7 @@ static void TstPrn_WriteTxtAnsPrint (struct UsrData *UsrDat,
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
/* Convert answer feedback, that is in HTML, to rigorous HTML */
if (IsVisible[TstVis_VISIBLE_FEEDBACK_TXT])
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
if (Question->Answer.Options[NumOpt].Feedback)
if (Question->Answer.Options[NumOpt].Feedback[0])
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
@ -1323,7 +1323,7 @@ static void TstPrn_WriteTxtAnsPrint (struct UsrData *UsrDat,
}
}
HTM_TD_Begin ("class=\"%s CT\"",
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER] ? (Correct ? "ANS_OK" :
ICanView[TstVis_VISIBLE_CORRECT_ANSWER] ? (Correct ? "ANS_OK" :
"ANS_BAD") :
"ANS_0");
HTM_Txt (PrintedQuestion->StrAnswers);
@ -1333,8 +1333,8 @@ static void TstPrn_WriteTxtAnsPrint (struct UsrData *UsrDat,
HTM_TD_End ();
/***** Write the correct answers *****/
if (IsVisible[TstVis_VISIBLE_QST_ANS_TXT] &&
IsVisible[TstVis_VISIBLE_CORRECT_ANSWER])
if (ICanView[TstVis_VISIBLE_QST_ANS_TXT] &&
ICanView[TstVis_VISIBLE_CORRECT_ANSWER])
{
HTM_TD_Begin ("class=\"CT\"");
HTM_TABLE_BeginPadding (2);
@ -1357,7 +1357,7 @@ static void TstPrn_WriteTxtAnsPrint (struct UsrData *UsrDat,
HTM_Txt (Question->Answer.Options[NumOpt].Text);
HTM_DIV_End ();
if (IsVisible[TstVis_VISIBLE_FEEDBACK_TXT])
if (ICanView[TstVis_VISIBLE_FEEDBACK_TXT])
if (Question->Answer.Options[NumOpt].Feedback)
if (Question->Answer.Options[NumOpt].Feedback[0])
{