From 1981c0b6051f7b910a824807b065a51856b633ab Mon Sep 17 00:00:00 2001 From: acanas Date: Sat, 23 May 2020 19:08:59 +0200 Subject: [PATCH] Version19.242.1 --- sql/swad.sql | 2 +- swad_changelog.h | 7 +- swad_database.c | 4 +- swad_exam.c | 18 +++--- swad_exam_log.c | 30 ++++----- swad_exam_log.h | 4 +- swad_exam_print.c | 48 +++++++++----- swad_exam_print.h | 2 +- swad_exam_result.c | 153 ++++++++++++++++++++++++++------------------ swad_exam_session.c | 19 ------ swad_exam_session.h | 1 - swad_test_print.c | 100 ++++++++++++++--------------- 12 files changed, 207 insertions(+), 181 deletions(-) diff --git a/sql/swad.sql b/sql/swad.sql index a07abb01..f1c078a0 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -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, diff --git a/swad_changelog.h b/swad_changelog.h index 5695c033..c4375630 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -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'; diff --git a/swad_database.c b/swad_database.c index 9b9137d2..8c8d0ebe 100644 --- a/swad_database.c +++ b/swad_database.c @@ -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 diff --git a/swad_exam.c b/swad_exam.c index 27658bdf..3b02b99f 100644 --- a/swad_exam.c +++ b/swad_exam.c @@ -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... { diff --git a/swad_exam_log.c b/swad_exam_log.c index 5b06e701..dfacf645 100644 --- a/swad_exam_log.c +++ b/swad_exam_log.c @@ -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); diff --git a/swad_exam_log.h b/swad_exam_log.h index c9d5267a..d075ffe9 100644 --- a/swad_exam_log.h +++ b/swad_exam_log.h @@ -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); diff --git a/swad_exam_print.c b/swad_exam_print.c index 3a0d1f8f..8ed62656 100644 --- a/swad_exam_print.c +++ b/swad_exam_print.c @@ -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); diff --git a/swad_exam_print.h b/swad_exam_print.h index f6770b53..53f088c7 100644 --- a/swad_exam_print.h +++ b/swad_exam_print.h @@ -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); diff --git a/swad_exam_result.c b/swad_exam_result.c index 8a886e3a..8b2283e5 100644 --- a/swad_exam_result.c +++ b/swad_exam_result.c @@ -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 (); diff --git a/swad_exam_session.c b/swad_exam_session.c index cd95de07..ca4c4b87 100644 --- a/swad_exam_session.c +++ b/swad_exam_session.c @@ -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 ******************/ /*****************************************************************************/ diff --git a/swad_exam_session.h b/swad_exam_session.h index 86b90045..76a3303c 100644 --- a/swad_exam_session.h +++ b/swad_exam_session.h @@ -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); diff --git a/swad_test_print.c b/swad_test_print.c index 5373b445..3c62e5bb 100644 --- a/swad_test_print.c +++ b/swad_test_print.c @@ -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]) {