mirror of https://github.com/acanas/swad-core.git
Version19.125
This commit is contained in:
parent
f7e186b154
commit
2605cfd0f5
36
swad_API.c
36
swad_API.c
|
@ -3627,7 +3627,6 @@ int swad__getTestConfig (struct soap *soap,
|
||||||
char *wsKey,int courseCode, // input
|
char *wsKey,int courseCode, // input
|
||||||
struct swad__getTestConfigOutput *getTestConfigOut) // output
|
struct swad__getTestConfigOutput *getTestConfigOut) // output
|
||||||
{
|
{
|
||||||
extern const char *TsR_FeedbackXML[TsR_NUM_TYPES_FEEDBACK];
|
|
||||||
int ReturnCode;
|
int ReturnCode;
|
||||||
|
|
||||||
/***** Initializations *****/
|
/***** Initializations *****/
|
||||||
|
@ -3670,7 +3669,10 @@ int swad__getTestConfig (struct soap *soap,
|
||||||
return ReturnCode;
|
return ReturnCode;
|
||||||
|
|
||||||
/***** Set default result to empty *****/
|
/***** Set default result to empty *****/
|
||||||
getTestConfigOut->numQuestions = getTestConfigOut->minQuestions = getTestConfigOut->defQuestions = getTestConfigOut->maxQuestions = 0;
|
getTestConfigOut->numQuestions =
|
||||||
|
getTestConfigOut->minQuestions =
|
||||||
|
getTestConfigOut->defQuestions =
|
||||||
|
getTestConfigOut->maxQuestions = 0;
|
||||||
getTestConfigOut->feedback = (char *) soap_malloc (Gbl.soap,TsR_MAX_BYTES_FEEDBACK_TYPE + 1);
|
getTestConfigOut->feedback = (char *) soap_malloc (Gbl.soap,TsR_MAX_BYTES_FEEDBACK_TYPE + 1);
|
||||||
getTestConfigOut->feedback[0] = '\0';
|
getTestConfigOut->feedback[0] = '\0';
|
||||||
|
|
||||||
|
@ -3682,9 +3684,29 @@ int swad__getTestConfig (struct soap *soap,
|
||||||
getTestConfigOut->minQuestions = (int) Gbl.Test.Config.Min;
|
getTestConfigOut->minQuestions = (int) Gbl.Test.Config.Min;
|
||||||
getTestConfigOut->defQuestions = (int) Gbl.Test.Config.Def;
|
getTestConfigOut->defQuestions = (int) Gbl.Test.Config.Def;
|
||||||
getTestConfigOut->maxQuestions = (int) Gbl.Test.Config.Max;
|
getTestConfigOut->maxQuestions = (int) Gbl.Test.Config.Max;
|
||||||
Str_Copy (getTestConfigOut->feedback,
|
|
||||||
TsR_FeedbackXML[Gbl.Test.Config.Feedback],
|
/* Convert from visibility to old feedback */
|
||||||
TsR_MAX_BYTES_FEEDBACK_TYPE);
|
/* TODO: Remove these lines in 2021 */
|
||||||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_TOTAL_SCORE )) == 0)
|
||||||
|
Str_Copy (getTestConfigOut->feedback,
|
||||||
|
"nothing",
|
||||||
|
TsR_MAX_BYTES_FEEDBACK_TYPE);
|
||||||
|
else if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_EACH_QST_SCORE)) == 0)
|
||||||
|
Str_Copy (getTestConfigOut->feedback,
|
||||||
|
"totalResult",
|
||||||
|
TsR_MAX_BYTES_FEEDBACK_TYPE);
|
||||||
|
else if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) == 0)
|
||||||
|
Str_Copy (getTestConfigOut->feedback,
|
||||||
|
"eachResult",
|
||||||
|
TsR_MAX_BYTES_FEEDBACK_TYPE);
|
||||||
|
else if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_FEEDBACK_TEXT )) == 0)
|
||||||
|
Str_Copy (getTestConfigOut->feedback,
|
||||||
|
"eachGoodBad",
|
||||||
|
TsR_MAX_BYTES_FEEDBACK_TYPE);
|
||||||
|
else
|
||||||
|
Str_Copy (getTestConfigOut->feedback,
|
||||||
|
"fullFeedback",
|
||||||
|
TsR_MAX_BYTES_FEEDBACK_TYPE);
|
||||||
|
|
||||||
/***** Get number of tests *****/
|
/***** Get number of tests *****/
|
||||||
if (Gbl.Test.Config.Pluggable == Tst_PLUGGABLE_YES &&
|
if (Gbl.Test.Config.Pluggable == Tst_PLUGGABLE_YES &&
|
||||||
|
@ -3705,7 +3727,7 @@ static int API_GetTstConfig (long CrsCod)
|
||||||
|
|
||||||
/***** Query database *****/
|
/***** Query database *****/
|
||||||
if (DB_QuerySELECT (&mysql_res,"can not get test configuration",
|
if (DB_QuerySELECT (&mysql_res,"can not get test configuration",
|
||||||
"SELECT Pluggable,Min,Def,Max,MinTimeNxtTstPerQst,Feedback"
|
"SELECT Pluggable,Min,Def,Max,MinTimeNxtTstPerQst,Visibility"
|
||||||
" FROM tst_config WHERE CrsCod=%ld",
|
" FROM tst_config WHERE CrsCod=%ld",
|
||||||
CrsCod))
|
CrsCod))
|
||||||
{
|
{
|
||||||
|
@ -3717,7 +3739,7 @@ static int API_GetTstConfig (long CrsCod)
|
||||||
{
|
{
|
||||||
Gbl.Test.Config.Pluggable = Tst_PLUGGABLE_UNKNOWN;
|
Gbl.Test.Config.Pluggable = Tst_PLUGGABLE_UNKNOWN;
|
||||||
Gbl.Test.Config.Min = Gbl.Test.Config.Def = Gbl.Test.Config.Max = 0;
|
Gbl.Test.Config.Min = Gbl.Test.Config.Def = Gbl.Test.Config.Max = 0;
|
||||||
Gbl.Test.Config.Feedback = TsR_FEEDBACK_DEFAULT;
|
Gbl.Test.Config.Visibility = TsR_VISIBILITY_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Free structure that stores the query result *****/
|
/***** Free structure that stores the query result *****/
|
||||||
|
|
|
@ -2808,7 +2808,7 @@ static void Att_ListOrPrintUsrsAttendanceCrs (void)
|
||||||
|
|
||||||
static void Att_GetListSelectedAttCods (char **StrAttCodsSelected)
|
static void Att_GetListSelectedAttCods (char **StrAttCodsSelected)
|
||||||
{
|
{
|
||||||
unsigned MaxSizeListAttCodsSelected;
|
size_t MaxSizeListAttCodsSelected;
|
||||||
unsigned NumAttEvent;
|
unsigned NumAttEvent;
|
||||||
const char *Ptr;
|
const char *Ptr;
|
||||||
long AttCod;
|
long AttCod;
|
||||||
|
@ -2821,7 +2821,7 @@ static void Att_GetListSelectedAttCods (char **StrAttCodsSelected)
|
||||||
unsigned NumGrpSel;
|
unsigned NumGrpSel;
|
||||||
|
|
||||||
/***** Allocate memory for list of attendance events selected *****/
|
/***** Allocate memory for list of attendance events selected *****/
|
||||||
MaxSizeListAttCodsSelected = Gbl.AttEvents.Num * (Cns_MAX_DECIMAL_DIGITS_LONG + 1);
|
MaxSizeListAttCodsSelected = (size_t) Gbl.AttEvents.Num * (Cns_MAX_DECIMAL_DIGITS_LONG + 1);
|
||||||
if ((*StrAttCodsSelected = (char *) malloc (MaxSizeListAttCodsSelected + 1)) == NULL)
|
if ((*StrAttCodsSelected = (char *) malloc (MaxSizeListAttCodsSelected + 1)) == NULL)
|
||||||
Lay_NotEnoughMemoryExit ();
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
|
||||||
|
@ -2840,7 +2840,7 @@ static void Att_GetListSelectedAttCods (char **StrAttCodsSelected)
|
||||||
/* Set some events as selected */
|
/* Set some events as selected */
|
||||||
for (Ptr = *StrAttCodsSelected;
|
for (Ptr = *StrAttCodsSelected;
|
||||||
*Ptr;
|
*Ptr;
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
/* Get next attendance event selected */
|
/* Get next attendance event selected */
|
||||||
Par_GetNextStrUntilSeparParamMult (&Ptr,LongStr,Cns_MAX_DECIMAL_DIGITS_LONG);
|
Par_GetNextStrUntilSeparParamMult (&Ptr,LongStr,Cns_MAX_DECIMAL_DIGITS_LONG);
|
||||||
|
|
|
@ -497,7 +497,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
|
||||||
En OpenSWAD:
|
En OpenSWAD:
|
||||||
ps2pdf source.ps destination.pdf
|
ps2pdf source.ps destination.pdf
|
||||||
*/
|
*/
|
||||||
#define Log_PLATFORM_VERSION "SWAD 19.124.1 (2020-02-17)"
|
#define Log_PLATFORM_VERSION "SWAD 19.125 (2020-02-17)"
|
||||||
#define CSS_FILE "swad19.118.css"
|
#define CSS_FILE "swad19.118.css"
|
||||||
#define JS_FILE "swad19.91.1.js"
|
#define JS_FILE "swad19.91.1.js"
|
||||||
/*
|
/*
|
||||||
|
@ -505,8 +505,11 @@ ps2pdf source.ps destination.pdf
|
||||||
// TODO: Impedir la creación y edición de proyectos si no son editables.
|
// TODO: Impedir la creación y edición de proyectos si no son editables.
|
||||||
// TODO: No se puede entrar con DNI '1' suponiendo que no tenga password ¿por qué?
|
// TODO: No se puede entrar con DNI '1' suponiendo que no tenga password ¿por qué?
|
||||||
// TODO: En la lista de conectados central, poner el logo de la institución a la que pertenece el usuario
|
// TODO: En la lista de conectados central, poner el logo de la institución a la que pertenece el usuario
|
||||||
// TODO: Urgente: Añadir nuevos niveles de realimentación tras sugerencia de Mancia y conversación con Javier.
|
// TODO: Remove Feedback field from tst_config database table
|
||||||
|
// TODO: Add visibility to API function getTestConfig
|
||||||
|
// TODO: Add visibility to games
|
||||||
|
|
||||||
|
Version 19.125: Feb 17, 2020 Removed feedback from test config form. (278823 lines)
|
||||||
Version 19.124.1: Feb 17, 2020 Fixed bug reported by Javier Fernández Baldomero.
|
Version 19.124.1: Feb 17, 2020 Fixed bug reported by Javier Fernández Baldomero.
|
||||||
Result visibility in tests is stored in database. (279010 lines)
|
Result visibility in tests is stored in database. (279010 lines)
|
||||||
6 changes necessary in database:
|
6 changes necessary in database:
|
||||||
|
|
|
@ -1032,7 +1032,7 @@ void McR_ShowOneMchResult (void)
|
||||||
&NumQsts,
|
&NumQsts,
|
||||||
&NumQstsNotBlank,
|
&NumQstsNotBlank,
|
||||||
&TotalScore);
|
&TotalScore);
|
||||||
Gbl.Test.Config.Feedback = TsR_FEEDBACK_FULL_FEEDBACK; // Initialize feedback to maximum
|
Gbl.Test.Config.Visibility = TsR_MAX_VISIBILITY; // Initialize visibility to maximum
|
||||||
|
|
||||||
/***** Check if I can view this match result *****/
|
/***** Check if I can view this match result *****/
|
||||||
ItsMe = Usr_ItsMe (UsrDat->UsrCod);
|
ItsMe = Usr_ItsMe (UsrDat->UsrCod);
|
||||||
|
@ -1049,7 +1049,7 @@ void McR_ShowOneMchResult (void)
|
||||||
if (ICanViewResult)
|
if (ICanViewResult)
|
||||||
{
|
{
|
||||||
Tst_GetConfigTstFromDB (); // To get feedback type
|
Tst_GetConfigTstFromDB (); // To get feedback type
|
||||||
ICanViewScore = Gbl.Test.Config.Feedback != TsR_FEEDBACK_NOTHING;
|
ICanViewScore = (Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_TOTAL_SCORE)) != 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ICanViewScore = false;
|
ICanViewScore = false;
|
||||||
|
@ -1383,7 +1383,7 @@ static bool McR_CheckIfICanSeeMatchResult (long MchCod,long UsrCod)
|
||||||
{
|
{
|
||||||
case Rol_STD:
|
case Rol_STD:
|
||||||
ItsMe = Usr_ItsMe (UsrCod);
|
ItsMe = Usr_ItsMe (UsrCod);
|
||||||
if (ItsMe && Gbl.Test.Config.Feedback != TsR_FEEDBACK_NOTHING)
|
if (ItsMe && Gbl.Test.Config.Visibility != 0)
|
||||||
ShowResultThisMatch = McR_GetVisibilityMchResultFromDB (MchCod);
|
ShowResultThisMatch = McR_GetVisibilityMchResultFromDB (MchCod);
|
||||||
else
|
else
|
||||||
ShowResultThisMatch = false;
|
ShowResultThisMatch = false;
|
||||||
|
|
151
swad_test.c
151
swad_test.c
|
@ -488,7 +488,7 @@ void Tst_AssessTest (void)
|
||||||
HTM_TABLE_End ();
|
HTM_TABLE_End ();
|
||||||
|
|
||||||
/***** Write total score and grade *****/
|
/***** Write total score and grade *****/
|
||||||
if (Gbl.Test.Config.Feedback != TsR_FEEDBACK_NOTHING)
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_TOTAL_SCORE)) != 0)
|
||||||
{
|
{
|
||||||
HTM_DIV_Begin ("class=\"DAT_N_BOLD CM\"");
|
HTM_DIV_Begin ("class=\"DAT_N_BOLD CM\"");
|
||||||
HTM_TxtColonNBSP (Txt_Score);
|
HTM_TxtColonNBSP (Txt_Score);
|
||||||
|
@ -992,7 +992,7 @@ void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestio
|
||||||
Tst_WriteAnswersTestResult (UsrDat,NumQst,QstCod,ScoreThisQst,AnswerIsNotBlank);
|
Tst_WriteAnswersTestResult (UsrDat,NumQst,QstCod,ScoreThisQst,AnswerIsNotBlank);
|
||||||
|
|
||||||
/* Write question feedback (row[5]) */
|
/* Write question feedback (row[5]) */
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_FEEDBACK_TEXT)) != 0)
|
||||||
Tst_WriteQstFeedback (row[5],"TEST_EXA_LIGHT");
|
Tst_WriteQstFeedback (row[5],"TEST_EXA_LIGHT");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1324,8 +1324,7 @@ static void Tst_PutIconsTests (void)
|
||||||
Txt_New_question);
|
Txt_New_question);
|
||||||
|
|
||||||
/***** Put form to go to test configuration *****/
|
/***** Put form to go to test configuration *****/
|
||||||
if (Gbl.Action.Act != ActCfgTst)
|
Ico_PutContextualIconToConfigure (ActCfgTst,NULL);
|
||||||
Ico_PutContextualIconToConfigure (ActCfgTst,NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Put icon to view tests results *****/
|
/***** Put icon to view tests results *****/
|
||||||
|
@ -1813,11 +1812,8 @@ static void Tst_ShowFormConfigTst (void)
|
||||||
extern const char *Txt_maximum;
|
extern const char *Txt_maximum;
|
||||||
extern const char *Txt_Minimum_time_seconds_per_question_between_two_tests;
|
extern const char *Txt_Minimum_time_seconds_per_question_between_two_tests;
|
||||||
extern const char *Txt_Result_visibility;
|
extern const char *Txt_Result_visibility;
|
||||||
extern const char *Txt_Feedback_to_students;
|
|
||||||
extern const char *Txt_TST_STR_FEEDBACK[TsR_NUM_TYPES_FEEDBACK];
|
|
||||||
extern const char *Txt_Save_changes;
|
extern const char *Txt_Save_changes;
|
||||||
Tst_Pluggable_t Pluggable;
|
Tst_Pluggable_t Pluggable;
|
||||||
TsR_Feedback_t Feedback;
|
|
||||||
char StrMinTimeNxtTstPerQst[Cns_MAX_DECIMAL_DIGITS_ULONG + 1];
|
char StrMinTimeNxtTstPerQst[Cns_MAX_DECIMAL_DIGITS_ULONG + 1];
|
||||||
|
|
||||||
/***** Read test configuration from database *****/
|
/***** Read test configuration from database *****/
|
||||||
|
@ -1907,30 +1903,6 @@ static void Tst_ShowFormConfigTst (void)
|
||||||
|
|
||||||
HTM_TR_End ();
|
HTM_TR_End ();
|
||||||
|
|
||||||
/***** Feedback to students *****/
|
|
||||||
HTM_TR_Begin (NULL);
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"%s RT\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
|
|
||||||
HTM_TxtF ("%s:",Txt_Feedback_to_students);
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TD_Begin ("class=\"LB\"");
|
|
||||||
for (Feedback = (TsR_Feedback_t) 0;
|
|
||||||
Feedback <= (TsR_Feedback_t) (TsR_NUM_TYPES_FEEDBACK - 1);
|
|
||||||
Feedback++)
|
|
||||||
{
|
|
||||||
HTM_LABEL_Begin ("class=\"DAT\"");
|
|
||||||
HTM_INPUT_RADIO ("Feedback",false,
|
|
||||||
"value=\"%u\"%s",
|
|
||||||
(unsigned) Feedback,
|
|
||||||
Feedback == Gbl.Test.Config.Feedback ? " checked=\"checked\"" : "");
|
|
||||||
HTM_Txt (Txt_TST_STR_FEEDBACK[Feedback]);
|
|
||||||
HTM_LABEL_End ();
|
|
||||||
HTM_BR ();
|
|
||||||
}
|
|
||||||
HTM_TD_End ();
|
|
||||||
|
|
||||||
HTM_TR_End ();
|
|
||||||
HTM_TABLE_End ();
|
HTM_TABLE_End ();
|
||||||
|
|
||||||
/***** Send button *****/
|
/***** Send button *****/
|
||||||
|
@ -1988,12 +1960,13 @@ void Tst_GetConfigTstFromDB (void)
|
||||||
"Def," // row[2]
|
"Def," // row[2]
|
||||||
"Max," // row[3]
|
"Max," // row[3]
|
||||||
"MinTimeNxtTstPerQst," // row[4]
|
"MinTimeNxtTstPerQst," // row[4]
|
||||||
"Feedback" // row[5]
|
"Visibility" // row[5]
|
||||||
" FROM tst_config WHERE CrsCod=%ld",
|
" FROM tst_config"
|
||||||
|
" WHERE CrsCod=%ld",
|
||||||
Gbl.Hierarchy.Crs.CrsCod);
|
Gbl.Hierarchy.Crs.CrsCod);
|
||||||
|
|
||||||
Gbl.Test.Config.Feedback = TsR_FEEDBACK_DEFAULT;
|
|
||||||
Gbl.Test.Config.MinTimeNxtTstPerQst = 0UL;
|
Gbl.Test.Config.MinTimeNxtTstPerQst = 0UL;
|
||||||
|
Gbl.Test.Config.Visibility = TsR_VISIBILITY_DEFAULT;
|
||||||
if (NumRows == 0)
|
if (NumRows == 0)
|
||||||
{
|
{
|
||||||
Gbl.Test.Config.Pluggable = Tst_PLUGGABLE_UNKNOWN;
|
Gbl.Test.Config.Pluggable = Tst_PLUGGABLE_UNKNOWN;
|
||||||
|
@ -2018,11 +1991,10 @@ void Tst_GetConfigTstFromDB (void)
|
||||||
|
|
||||||
void Tst_GetConfigFromRow (MYSQL_ROW row)
|
void Tst_GetConfigFromRow (MYSQL_ROW row)
|
||||||
{
|
{
|
||||||
extern const char *TsR_FeedbackDB[TsR_NUM_TYPES_FEEDBACK];
|
|
||||||
int IntNum;
|
int IntNum;
|
||||||
long LongNum;
|
long LongNum;
|
||||||
|
unsigned UnsignedNum;
|
||||||
Tst_Pluggable_t Pluggable;
|
Tst_Pluggable_t Pluggable;
|
||||||
TsR_Feedback_t Feedback;
|
|
||||||
|
|
||||||
/***** Get whether test are visible via plugins or not *****/
|
/***** Get whether test are visible via plugins or not *****/
|
||||||
Gbl.Test.Config.Pluggable = Tst_PLUGGABLE_UNKNOWN;
|
Gbl.Test.Config.Pluggable = Tst_PLUGGABLE_UNKNOWN;
|
||||||
|
@ -2062,15 +2034,9 @@ void Tst_GetConfigFromRow (MYSQL_ROW row)
|
||||||
Gbl.Test.Config.MinTimeNxtTstPerQst = (LongNum < 1L) ? 0UL :
|
Gbl.Test.Config.MinTimeNxtTstPerQst = (LongNum < 1L) ? 0UL :
|
||||||
(unsigned long) LongNum;
|
(unsigned long) LongNum;
|
||||||
|
|
||||||
/***** Get feedback type (row[5]) *****/
|
/***** Get visibility (row[5]) *****/
|
||||||
for (Feedback = (TsR_Feedback_t) 0;
|
if (sscanf (row[5],"%u",&UnsignedNum) == 1)
|
||||||
Feedback <= (TsR_Feedback_t) (TsR_NUM_TYPES_FEEDBACK - 1);
|
Gbl.Test.Config.Visibility = UnsignedNum & TsR_MAX_VISIBILITY;
|
||||||
Feedback++)
|
|
||||||
if (!strcmp (row[5],TsR_FeedbackDB[Feedback]))
|
|
||||||
{
|
|
||||||
Gbl.Test.Config.Feedback = Feedback;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -2127,7 +2093,6 @@ bool Tst_CheckIfCourseHaveTestsAndPluggableIsUnknown (void)
|
||||||
|
|
||||||
void Tst_ReceiveConfigTst (void)
|
void Tst_ReceiveConfigTst (void)
|
||||||
{
|
{
|
||||||
extern const char *TsR_FeedbackDB[TsR_NUM_TYPES_FEEDBACK];
|
|
||||||
extern const char *Txt_The_test_configuration_has_been_updated;
|
extern const char *Txt_The_test_configuration_has_been_updated;
|
||||||
|
|
||||||
/***** Get whether test are visible via plugins or not *****/
|
/***** Get whether test are visible via plugins or not *****/
|
||||||
|
@ -2165,19 +2130,19 @@ void Tst_ReceiveConfigTst (void)
|
||||||
0);
|
0);
|
||||||
|
|
||||||
/***** Get type of feedback from form *****/
|
/***** Get type of feedback from form *****/
|
||||||
Gbl.Test.Config.Feedback = TsR_GetFeedbackTypeFromForm ();
|
Gbl.Test.Config.Visibility = TsR_GetVisibilityFromForm ();
|
||||||
|
|
||||||
/***** Update database *****/
|
/***** Update database *****/
|
||||||
DB_QueryREPLACE ("can not save configuration of tests",
|
DB_QueryREPLACE ("can not save configuration of tests",
|
||||||
"REPLACE INTO tst_config"
|
"REPLACE INTO tst_config"
|
||||||
" (CrsCod,Pluggable,Min,Def,Max,MinTimeNxtTstPerQst,Feedback)"
|
" (CrsCod,Pluggable,Min,Def,Max,MinTimeNxtTstPerQst,Visibility)"
|
||||||
" VALUES"
|
" VALUES"
|
||||||
" (%ld,'%s',%u,%u,%u,'%lu','%s')",
|
" (%ld,'%s',%u,%u,%u,'%lu',%u)",
|
||||||
Gbl.Hierarchy.Crs.CrsCod,
|
Gbl.Hierarchy.Crs.CrsCod,
|
||||||
Tst_PluggableDB[Gbl.Test.Config.Pluggable],
|
Tst_PluggableDB[Gbl.Test.Config.Pluggable],
|
||||||
Gbl.Test.Config.Min,Gbl.Test.Config.Def,Gbl.Test.Config.Max,
|
Gbl.Test.Config.Min,Gbl.Test.Config.Def,Gbl.Test.Config.Max,
|
||||||
Gbl.Test.Config.MinTimeNxtTstPerQst,
|
Gbl.Test.Config.MinTimeNxtTstPerQst,
|
||||||
TsR_FeedbackDB[Gbl.Test.Config.Feedback]);
|
Gbl.Test.Config.Visibility);
|
||||||
|
|
||||||
/***** Show confirmation message *****/
|
/***** Show confirmation message *****/
|
||||||
Ale_ShowAlert (Ale_SUCCESS,Txt_The_test_configuration_has_been_updated);
|
Ale_ShowAlert (Ale_SUCCESS,Txt_The_test_configuration_has_been_updated);
|
||||||
|
@ -3534,18 +3499,16 @@ static void Tst_WriteTFAnsAssessTest (struct UsrData *UsrDat,
|
||||||
|
|
||||||
/***** Write the user answer *****/
|
/***** Write the user answer *****/
|
||||||
HTM_TD_Begin ("class=\"%s CM\"",
|
HTM_TD_Begin ("class=\"%s CM\"",
|
||||||
(Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
(Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0 ?
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK) ?
|
(AnsTF == row[1][0] ? "ANS_OK" :
|
||||||
(AnsTF == row[1][0] ? "ANS_OK" :
|
"ANS_BAD") :
|
||||||
"ANS_BAD") :
|
"ANS_0");
|
||||||
"ANS_0");
|
|
||||||
Tst_WriteAnsTF (AnsTF);
|
Tst_WriteAnsTF (AnsTF);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/***** Write the correct answer *****/
|
/***** Write the correct answer *****/
|
||||||
HTM_TD_Begin ("class=\"ANS_0 CM\"");
|
HTM_TD_Begin ("class=\"ANS_0 CM\"");
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
Tst_WriteAnsTF (row[1][0]);
|
Tst_WriteAnsTF (row[1][0]);
|
||||||
else
|
else
|
||||||
HTM_Txt ("?");
|
HTM_Txt ("?");
|
||||||
|
@ -3553,10 +3516,8 @@ static void Tst_WriteTFAnsAssessTest (struct UsrData *UsrDat,
|
||||||
|
|
||||||
HTM_TR_End ();
|
HTM_TR_End ();
|
||||||
|
|
||||||
/***** Write the mark *****/
|
/***** Write the score of this question *****/
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_RESULT ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_EACH_QST_SCORE)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
{
|
{
|
||||||
Tst_WriteScoreStart (2);
|
Tst_WriteScoreStart (2);
|
||||||
if (AnsTF == '\0') // If user has omitted the answer
|
if (AnsTF == '\0') // If user has omitted the answer
|
||||||
|
@ -3744,8 +3705,7 @@ static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
|
||||||
/* Draw icon depending on user's answer */
|
/* Draw icon depending on user's answer */
|
||||||
if (AnswersUsr[Indexes[NumOpt]] == true) // This answer has been selected by the user
|
if (AnswersUsr[Indexes[NumOpt]] == true) // This answer has been selected by the user
|
||||||
{
|
{
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
{
|
{
|
||||||
if (Gbl.Test.Answer.Options[Indexes[NumOpt]].Correct)
|
if (Gbl.Test.Answer.Options[Indexes[NumOpt]].Correct)
|
||||||
{
|
{
|
||||||
|
@ -3773,8 +3733,7 @@ static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
|
||||||
HTM_TD_Empty (1);
|
HTM_TD_Empty (1);
|
||||||
|
|
||||||
/* Draw icon that indicates whether the answer is correct */
|
/* Draw icon that indicates whether the answer is correct */
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
{
|
{
|
||||||
if (Gbl.Test.Answer.Options[Indexes[NumOpt]].Correct)
|
if (Gbl.Test.Answer.Options[Indexes[NumOpt]].Correct)
|
||||||
{
|
{
|
||||||
|
@ -3808,7 +3767,7 @@ static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
|
||||||
"TEST_MED_SHOW");
|
"TEST_MED_SHOW");
|
||||||
HTM_DIV_End ();
|
HTM_DIV_End ();
|
||||||
|
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0)
|
||||||
if (Gbl.Test.Answer.Options[Indexes[NumOpt]].Feedback)
|
if (Gbl.Test.Answer.Options[Indexes[NumOpt]].Feedback)
|
||||||
if (Gbl.Test.Answer.Options[Indexes[NumOpt]].Feedback[0])
|
if (Gbl.Test.Answer.Options[Indexes[NumOpt]].Feedback[0])
|
||||||
{
|
{
|
||||||
|
@ -3823,9 +3782,7 @@ static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Write the total score of this question *****/
|
/***** Write the total score of this question *****/
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_RESULT ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_EACH_QST_SCORE)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
{
|
{
|
||||||
Tst_WriteScoreStart (4);
|
Tst_WriteScoreStart (4);
|
||||||
if (*ScoreThisQst == 0.0)
|
if (*ScoreThisQst == 0.0)
|
||||||
|
@ -3883,7 +3840,7 @@ void Tst_GetChoiceAns (MYSQL_RES *mysql_res)
|
||||||
|
|
||||||
/***** Copy answer feedback (row[2]) and convert it,
|
/***** Copy answer feedback (row[2]) and convert it,
|
||||||
that is in HTML, to rigorous HTML ******/
|
that is in HTML, to rigorous HTML ******/
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_FEEDBACK_TEXT)) != 0)
|
||||||
if (row[2])
|
if (row[2])
|
||||||
if (row[2][0])
|
if (row[2][0])
|
||||||
{
|
{
|
||||||
|
@ -4212,7 +4169,7 @@ static void Tst_WriteTextAnsAssessTest (struct UsrData *UsrDat,
|
||||||
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
|
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK,false);
|
||||||
|
|
||||||
/***** Copy answer feedback (row[2]) and convert it, that is in HTML, to rigorous HTML ******/
|
/***** Copy answer feedback (row[2]) and convert it, that is in HTML, to rigorous HTML ******/
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_FEEDBACK_TEXT)) != 0)
|
||||||
if (row[2])
|
if (row[2])
|
||||||
if (row[2][0])
|
if (row[2][0])
|
||||||
{
|
{
|
||||||
|
@ -4265,11 +4222,10 @@ static void Tst_WriteTextAnsAssessTest (struct UsrData *UsrDat,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
HTM_TD_Begin ("class=\"%s CT\"",
|
HTM_TD_Begin ("class=\"%s CT\"",
|
||||||
(Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
(Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0 ?
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK) ?
|
(Correct ? "ANS_OK" :
|
||||||
(Correct ? "ANS_OK" :
|
"ANS_BAD") :
|
||||||
"ANS_BAD") :
|
"ANS_0");
|
||||||
"ANS_0");
|
|
||||||
HTM_Txt (Gbl.Test.StrAnswersOneQst[NumQst]);
|
HTM_Txt (Gbl.Test.StrAnswersOneQst[NumQst]);
|
||||||
}
|
}
|
||||||
else // If user has omitted the answer
|
else // If user has omitted the answer
|
||||||
|
@ -4277,8 +4233,7 @@ static void Tst_WriteTextAnsAssessTest (struct UsrData *UsrDat,
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
|
|
||||||
/***** Write the correct answers *****/
|
/***** Write the correct answers *****/
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
{
|
{
|
||||||
HTM_TD_Begin ("class=\"CT\"");
|
HTM_TD_Begin ("class=\"CT\"");
|
||||||
HTM_TABLE_BeginPadding (2);
|
HTM_TABLE_BeginPadding (2);
|
||||||
|
@ -4301,7 +4256,7 @@ static void Tst_WriteTextAnsAssessTest (struct UsrData *UsrDat,
|
||||||
HTM_Txt (Gbl.Test.Answer.Options[NumOpt].Text);
|
HTM_Txt (Gbl.Test.Answer.Options[NumOpt].Text);
|
||||||
HTM_DIV_End ();
|
HTM_DIV_End ();
|
||||||
|
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_FEEDBACK_TEXT)) != 0)
|
||||||
if (Gbl.Test.Answer.Options[NumOpt].Feedback)
|
if (Gbl.Test.Answer.Options[NumOpt].Feedback)
|
||||||
if (Gbl.Test.Answer.Options[NumOpt].Feedback[0])
|
if (Gbl.Test.Answer.Options[NumOpt].Feedback[0])
|
||||||
{
|
{
|
||||||
|
@ -4342,9 +4297,7 @@ static void Tst_WriteTextAnsAssessTest (struct UsrData *UsrDat,
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Write the mark *****/
|
/***** Write the mark *****/
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_RESULT ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_EACH_QST_SCORE)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
{
|
{
|
||||||
Tst_WriteScoreStart (4);
|
Tst_WriteScoreStart (4);
|
||||||
if (!Gbl.Test.StrAnswersOneQst[NumQst][0]) // If user has omitted the answer
|
if (!Gbl.Test.StrAnswersOneQst[NumQst][0]) // If user has omitted the answer
|
||||||
|
@ -4425,11 +4378,10 @@ static void Tst_WriteIntAnsAssessTest (struct UsrData *UsrDat,
|
||||||
if (sscanf (Gbl.Test.StrAnswersOneQst[NumQst],"%ld",&IntAnswerUsr) == 1)
|
if (sscanf (Gbl.Test.StrAnswersOneQst[NumQst],"%ld",&IntAnswerUsr) == 1)
|
||||||
{
|
{
|
||||||
HTM_TD_Begin ("class=\"%s CM\"",
|
HTM_TD_Begin ("class=\"%s CM\"",
|
||||||
(Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
(Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0 ?
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK) ?
|
(IntAnswerUsr == IntAnswerCorr ? "ANS_OK" :
|
||||||
(IntAnswerUsr == IntAnswerCorr ? "ANS_OK" :
|
"ANS_BAD") :
|
||||||
"ANS_BAD") :
|
"ANS_0");
|
||||||
"ANS_0");
|
|
||||||
HTM_Long (IntAnswerUsr);
|
HTM_Long (IntAnswerUsr);
|
||||||
HTM_TD_End ();
|
HTM_TD_End ();
|
||||||
}
|
}
|
||||||
|
@ -4446,8 +4398,7 @@ static void Tst_WriteIntAnsAssessTest (struct UsrData *UsrDat,
|
||||||
|
|
||||||
/***** Write the correct answer *****/
|
/***** Write the correct answer *****/
|
||||||
HTM_TD_Begin ("class=\"ANS_0 CM\"");
|
HTM_TD_Begin ("class=\"ANS_0 CM\"");
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
HTM_Long (IntAnswerCorr);
|
HTM_Long (IntAnswerCorr);
|
||||||
else
|
else
|
||||||
HTM_Txt ("?");
|
HTM_Txt ("?");
|
||||||
|
@ -4471,9 +4422,7 @@ static void Tst_WriteIntAnsAssessTest (struct UsrData *UsrDat,
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Write the score *****/
|
/***** Write the score *****/
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_RESULT ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_EACH_QST_SCORE)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
{
|
{
|
||||||
Tst_WriteScoreStart (2);
|
Tst_WriteScoreStart (2);
|
||||||
if (!Gbl.Test.StrAnswersOneQst[NumQst][0]) // If user has omitted the answer
|
if (!Gbl.Test.StrAnswersOneQst[NumQst][0]) // If user has omitted the answer
|
||||||
|
@ -4568,12 +4517,11 @@ static void Tst_WriteFloatAnsAssessTest (struct UsrData *UsrDat,
|
||||||
if (Gbl.Test.StrAnswersOneQst[NumQst][0]) // It's a correct floating point number
|
if (Gbl.Test.StrAnswersOneQst[NumQst][0]) // It's a correct floating point number
|
||||||
{
|
{
|
||||||
HTM_TD_Begin ("class=\"%s CM\"",
|
HTM_TD_Begin ("class=\"%s CM\"",
|
||||||
(Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
(Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0 ?
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK) ?
|
((FloatAnsUsr >= FloatAnsCorr[0] &&
|
||||||
((FloatAnsUsr >= FloatAnsCorr[0] &&
|
FloatAnsUsr <= FloatAnsCorr[1]) ? "ANS_OK" :
|
||||||
FloatAnsUsr <= FloatAnsCorr[1]) ? "ANS_OK" :
|
"ANS_BAD") :
|
||||||
"ANS_BAD") :
|
"ANS_0");
|
||||||
"ANS_0");
|
|
||||||
HTM_Double (FloatAnsUsr);
|
HTM_Double (FloatAnsUsr);
|
||||||
}
|
}
|
||||||
else // Not a floating point number
|
else // Not a floating point number
|
||||||
|
@ -4588,8 +4536,7 @@ static void Tst_WriteFloatAnsAssessTest (struct UsrData *UsrDat,
|
||||||
|
|
||||||
/***** Write the correct answer *****/
|
/***** Write the correct answer *****/
|
||||||
HTM_TD_Begin ("class=\"ANS_0 CM\"");
|
HTM_TD_Begin ("class=\"ANS_0 CM\"");
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_CORRECT_ANSWER)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
{
|
{
|
||||||
HTM_Txt ("[");
|
HTM_Txt ("[");
|
||||||
HTM_Double (FloatAnsCorr[0]);
|
HTM_Double (FloatAnsCorr[0]);
|
||||||
|
@ -4620,9 +4567,7 @@ static void Tst_WriteFloatAnsAssessTest (struct UsrData *UsrDat,
|
||||||
}
|
}
|
||||||
|
|
||||||
/***** Write mark *****/
|
/***** Write mark *****/
|
||||||
if (Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_RESULT ||
|
if ((Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_EACH_QST_SCORE)) != 0)
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_EACH_GOOD_BAD ||
|
|
||||||
Gbl.Test.Config.Feedback == TsR_FEEDBACK_FULL_FEEDBACK)
|
|
||||||
{
|
{
|
||||||
Tst_WriteScoreStart (2);
|
Tst_WriteScoreStart (2);
|
||||||
if (!Gbl.Test.StrAnswersOneQst[NumQst][0]) // If user has omitted the answer
|
if (!Gbl.Test.StrAnswersOneQst[NumQst][0]) // If user has omitted the answer
|
||||||
|
|
|
@ -83,7 +83,6 @@ struct Tst_Config
|
||||||
unsigned Max; // Maximum number of questions
|
unsigned Max; // Maximum number of questions
|
||||||
unsigned long MinTimeNxtTstPerQst;
|
unsigned long MinTimeNxtTstPerQst;
|
||||||
unsigned Visibility; // One bit for each visibility item
|
unsigned Visibility; // One bit for each visibility item
|
||||||
TsR_Feedback_t Feedback;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define Tst_NUM_ANS_TYPES 6
|
#define Tst_NUM_ANS_TYPES 6
|
||||||
|
|
|
@ -43,46 +43,11 @@
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************************** Public constants ******************************/
|
/***************************** Public constants ******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*
|
|
||||||
Visibilidad de resultados:
|
|
||||||
* Texto de preguntas y respuestas
|
|
||||||
* Texto de realimentación
|
|
||||||
* Respuestas correctas
|
|
||||||
* Puntuación de cada pregunta
|
|
||||||
* Puntuación total
|
|
||||||
|
|
||||||
Visibility of results:
|
|
||||||
* Text of questions and answers
|
|
||||||
* Feedback text
|
|
||||||
* Correct answers
|
|
||||||
* Score of each question
|
|
||||||
* Total score
|
|
||||||
*/
|
|
||||||
|
|
||||||
// strings are limited to TsR_MAX_BYTES_FEEDBACK_TYPE bytes
|
|
||||||
const char *TsR_FeedbackXML[TsR_NUM_TYPES_FEEDBACK] =
|
|
||||||
{
|
|
||||||
[TsR_FEEDBACK_NOTHING ] = "nothing",
|
|
||||||
[TsR_FEEDBACK_TOTAL_RESULT ] = "totalResult",
|
|
||||||
[TsR_FEEDBACK_EACH_RESULT ] = "eachResult",
|
|
||||||
[TsR_FEEDBACK_EACH_GOOD_BAD] = "eachGoodBad",
|
|
||||||
[TsR_FEEDBACK_FULL_FEEDBACK] = "fullFeedback",
|
|
||||||
};
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**************************** Private constants ******************************/
|
/**************************** Private constants ******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
// Feedback to students in tests
|
|
||||||
const char *TsR_FeedbackDB[TsR_NUM_TYPES_FEEDBACK] =
|
|
||||||
{
|
|
||||||
[TsR_FEEDBACK_NOTHING ] = "nothing", // No feedback
|
|
||||||
[TsR_FEEDBACK_TOTAL_RESULT ] = "total_result", // Little
|
|
||||||
[TsR_FEEDBACK_EACH_RESULT ] = "each_result", // Medium
|
|
||||||
[TsR_FEEDBACK_EACH_GOOD_BAD] = "each_good_bad", // High
|
|
||||||
[TsR_FEEDBACK_FULL_FEEDBACK] = "full_feedback", // Maximum
|
|
||||||
};
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************* Private types *******************************/
|
/******************************* Private types *******************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -384,7 +349,7 @@ static void TsR_ShowTstResults (struct UsrData *UsrDat)
|
||||||
case Rol_STD:
|
case Rol_STD:
|
||||||
ICanViewTest = ItsMe;
|
ICanViewTest = ItsMe;
|
||||||
ICanViewScore = ItsMe &&
|
ICanViewScore = ItsMe &&
|
||||||
Gbl.Test.Config.Feedback != TsR_FEEDBACK_NOTHING;
|
(Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_TOTAL_SCORE)) != 0;
|
||||||
break;
|
break;
|
||||||
case Rol_NET:
|
case Rol_NET:
|
||||||
case Rol_TCH:
|
case Rol_TCH:
|
||||||
|
@ -543,7 +508,7 @@ static void TsR_ShowTestResultsSummaryRow (bool ItsMe,
|
||||||
{
|
{
|
||||||
case Rol_STD:
|
case Rol_STD:
|
||||||
ICanViewTotalScore = ItsMe &&
|
ICanViewTotalScore = ItsMe &&
|
||||||
Gbl.Test.Config.Feedback != TsR_FEEDBACK_NOTHING;
|
(Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_TOTAL_SCORE)) != 0;
|
||||||
break;
|
break;
|
||||||
case Rol_NET:
|
case Rol_NET:
|
||||||
case Rol_TCH:
|
case Rol_TCH:
|
||||||
|
@ -642,7 +607,7 @@ void TsR_ShowOneTstResult (void)
|
||||||
/***** Get test result data *****/
|
/***** Get test result data *****/
|
||||||
TsR_GetTestResultDataByTstCod (TstCod,&TstTimeUTC,
|
TsR_GetTestResultDataByTstCod (TstCod,&TstTimeUTC,
|
||||||
&NumQstsNotBlank,&TotalScore);
|
&NumQstsNotBlank,&TotalScore);
|
||||||
Gbl.Test.Config.Feedback = TsR_FEEDBACK_FULL_FEEDBACK; // Initialize feedback to maximum
|
Gbl.Test.Config.Visibility = TsR_MAX_VISIBILITY;
|
||||||
|
|
||||||
/***** Check if I can view this test result *****/
|
/***** Check if I can view this test result *****/
|
||||||
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
|
ItsMe = Usr_ItsMe (Gbl.Usrs.Other.UsrDat.UsrCod);
|
||||||
|
@ -653,7 +618,7 @@ void TsR_ShowOneTstResult (void)
|
||||||
if (ItsMe)
|
if (ItsMe)
|
||||||
{
|
{
|
||||||
Tst_GetConfigTstFromDB (); // To get feedback type
|
Tst_GetConfigTstFromDB (); // To get feedback type
|
||||||
ICanViewScore = Gbl.Test.Config.Feedback != TsR_FEEDBACK_NOTHING;
|
ICanViewScore = (Gbl.Test.Config.Visibility & (1 << TsR_VISIBLE_TOTAL_SCORE)) != 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ICanViewScore = false;
|
ICanViewScore = false;
|
||||||
|
@ -1157,13 +1122,41 @@ void TsR_RemoveCrsTestResults (long CrsCod)
|
||||||
/*********************** Get type of feedback from form **********************/
|
/*********************** Get type of feedback from form **********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
TsR_Feedback_t TsR_GetFeedbackTypeFromForm (void)
|
unsigned TsR_GetVisibilityFromForm (void)
|
||||||
{
|
{
|
||||||
return (TsR_Feedback_t)
|
size_t MaxSizeListVisibilitySelected;
|
||||||
Par_GetParToUnsignedLong ("Feedback",
|
char *StrVisibilitySelected;
|
||||||
0,
|
const char *Ptr;
|
||||||
TsR_NUM_TYPES_FEEDBACK - 1,
|
char UnsignedStr[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
|
||||||
(unsigned long) TsR_FEEDBACK_DEFAULT);
|
unsigned UnsignedNum;
|
||||||
|
TsR_ResultVisibility_t VisibilityItem;
|
||||||
|
unsigned Visibility = 0; // Nothing selected
|
||||||
|
|
||||||
|
/***** Allocate memory for list of attendance events selected *****/
|
||||||
|
MaxSizeListVisibilitySelected = TsR_NUM_ITEMS_VISIBILITY * (Cns_MAX_DECIMAL_DIGITS_UINT + 1);
|
||||||
|
if ((StrVisibilitySelected = (char *) malloc (MaxSizeListVisibilitySelected + 1)) == NULL)
|
||||||
|
Lay_NotEnoughMemoryExit ();
|
||||||
|
|
||||||
|
/***** Get parameter multiple with list of visibility items selected *****/
|
||||||
|
Par_GetParMultiToText ("Visibility",StrVisibilitySelected,MaxSizeListVisibilitySelected);
|
||||||
|
|
||||||
|
/***** Set which attendance events will be shown as selected (checkboxes on) *****/
|
||||||
|
if (StrVisibilitySelected[0]) // There are events selected
|
||||||
|
for (Ptr = StrVisibilitySelected;
|
||||||
|
*Ptr;
|
||||||
|
)
|
||||||
|
{
|
||||||
|
/* Get next visibility item selected */
|
||||||
|
Par_GetNextStrUntilSeparParamMult (&Ptr,UnsignedStr,Cns_MAX_DECIMAL_DIGITS_UINT);
|
||||||
|
if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1)
|
||||||
|
if (UnsignedNum < TsR_NUM_ITEMS_VISIBILITY)
|
||||||
|
{
|
||||||
|
VisibilityItem = (TsR_ResultVisibility_t) UnsignedNum;
|
||||||
|
Visibility |= (1 << VisibilityItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Visibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -40,21 +40,7 @@
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/******************************* Public types ********************************/
|
/******************************* Public types ********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*
|
|
||||||
Visibilidad de resultados:
|
|
||||||
* Texto de preguntas y respuestas
|
|
||||||
* Texto de realimentación
|
|
||||||
* Respuestas correctas
|
|
||||||
* Puntuación de cada pregunta
|
|
||||||
* Puntuación total
|
|
||||||
|
|
||||||
Visibility of results:
|
|
||||||
* Text of questions and answers
|
|
||||||
* Feedback text
|
|
||||||
* Correct answers
|
|
||||||
* Score of each question
|
|
||||||
* Total score
|
|
||||||
*/
|
|
||||||
#define TsR_NUM_ITEMS_VISIBILITY 5
|
#define TsR_NUM_ITEMS_VISIBILITY 5
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
@ -64,18 +50,8 @@ typedef enum
|
||||||
TsR_VISIBLE_EACH_QST_SCORE = 3, // Score of each question
|
TsR_VISIBLE_EACH_QST_SCORE = 3, // Score of each question
|
||||||
TsR_VISIBLE_TOTAL_SCORE = 4, // Total score
|
TsR_VISIBLE_TOTAL_SCORE = 4, // Total score
|
||||||
} TsR_ResultVisibility_t;
|
} TsR_ResultVisibility_t;
|
||||||
#define TsR_VISIBILITY_DEFAULT ((1 << TsR_NUM_ITEMS_VISIBILITY) - 1) // All visible
|
#define TsR_MAX_VISIBILITY ((1 << TsR_NUM_ITEMS_VISIBILITY) - 1) // All visible
|
||||||
|
#define TsR_VISIBILITY_DEFAULT TsR_MAX_VISIBILITY
|
||||||
#define TsR_NUM_TYPES_FEEDBACK 5
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
TsR_FEEDBACK_NOTHING = 0,
|
|
||||||
TsR_FEEDBACK_TOTAL_RESULT = 1,
|
|
||||||
TsR_FEEDBACK_EACH_RESULT = 2,
|
|
||||||
TsR_FEEDBACK_EACH_GOOD_BAD = 3,
|
|
||||||
TsR_FEEDBACK_FULL_FEEDBACK = 4,
|
|
||||||
} TsR_Feedback_t;
|
|
||||||
#define TsR_FEEDBACK_DEFAULT TsR_FEEDBACK_FULL_FEEDBACK
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************************** Public prototypes *****************************/
|
/***************************** Public prototypes *****************************/
|
||||||
|
@ -96,8 +72,7 @@ void TsR_RemoveTestResultsMadeByUsrInAllCrss (long UsrCod);
|
||||||
void TsR_RemoveTestResultsMadeByUsrInCrs (long UsrCod,long CrsCod);
|
void TsR_RemoveTestResultsMadeByUsrInCrs (long UsrCod,long CrsCod);
|
||||||
void TsR_RemoveCrsTestResults (long CrsCod);
|
void TsR_RemoveCrsTestResults (long CrsCod);
|
||||||
|
|
||||||
TsR_Feedback_t TsR_GetFeedbackTypeFromForm (void);
|
unsigned TsR_GetVisibilityFromForm (void);
|
||||||
|
|
||||||
void TsR_PutVisibilityCheckboxes (unsigned SelectedVisibility);
|
void TsR_PutVisibilityCheckboxes (unsigned SelectedVisibility);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
129
swad_text.c
129
swad_text.c
|
@ -11787,27 +11787,6 @@ const char *Txt_Feedback =
|
||||||
"Feedback";
|
"Feedback";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *Txt_Feedback_to_students =
|
|
||||||
#if L==1 // ca
|
|
||||||
"Realimentación para estudiantes"; // Necessita traduccio
|
|
||||||
#elif L==2 // de
|
|
||||||
"Feedback an die Studenten";
|
|
||||||
#elif L==3 // en
|
|
||||||
"Feedback to students";
|
|
||||||
#elif L==4 // es
|
|
||||||
"Realimentación para estudiantes";
|
|
||||||
#elif L==5 // fr
|
|
||||||
"Feedback pour les étudiants";
|
|
||||||
#elif L==6 // gn
|
|
||||||
"Realimentación para estudiantes"; // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"Feedback per gli studenti";
|
|
||||||
#elif L==8 // pl
|
|
||||||
"Opinie studentów";
|
|
||||||
#elif L==9 // pt
|
|
||||||
"Feedback para estudantes";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char *Txt_Field_BR_name =
|
const char *Txt_Field_BR_name =
|
||||||
#if L==1 // ca
|
#if L==1 // ca
|
||||||
"Nombre<br />del campo"; // Necessita traduccio
|
"Nombre<br />del campo"; // Necessita traduccio
|
||||||
|
@ -51241,114 +51220,6 @@ const char *Txt_TST_STR_ANSWER_TYPES[Tst_NUM_ANS_TYPES] =
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *Txt_TST_STR_FEEDBACK[TsR_NUM_TYPES_FEEDBACK] =
|
|
||||||
{
|
|
||||||
[TsR_FEEDBACK_NOTHING] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"Ninguna realimentación" // Necessita traduccio
|
|
||||||
#elif L==2 // de
|
|
||||||
"Keine Feedback"
|
|
||||||
#elif L==3 // en
|
|
||||||
"No feedback"
|
|
||||||
#elif L==4 // es
|
|
||||||
"Ninguna realimentación"
|
|
||||||
#elif L==5 // fr
|
|
||||||
"Pas de feedback"
|
|
||||||
#elif L==6 // gn
|
|
||||||
"Ninguna realimentación" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"Nessun feedback"
|
|
||||||
#elif L==8 // pl
|
|
||||||
"No feedback" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"Nenhum feedback"
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[TsR_FEEDBACK_TOTAL_RESULT] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"Poca: solo puntuación total" // Necessita traduccio
|
|
||||||
#elif L==2 // de
|
|
||||||
"Kleine: nur die Gesamtnote"
|
|
||||||
#elif L==3 // en
|
|
||||||
"Little: only the total score"
|
|
||||||
#elif L==4 // es
|
|
||||||
"Poca: solo puntuación total"
|
|
||||||
#elif L==5 // fr
|
|
||||||
"Petit: seul le note total"
|
|
||||||
#elif L==6 // gn
|
|
||||||
"Poca: solo puntuación total" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"Poco: solo il punteggio totale"
|
|
||||||
#elif L==8 // pl
|
|
||||||
"Little: only the total score" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"Pouco: apenas a pontuação total"
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[TsR_FEEDBACK_EACH_RESULT] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"Media: puntuación de cada pregunta" // Necessita traduccio
|
|
||||||
#elif L==2 // de
|
|
||||||
"Medium: Ergebnisse der einzelnen Frage"
|
|
||||||
#elif L==3 // en
|
|
||||||
"Medium: result of each question"
|
|
||||||
#elif L==4 // es
|
|
||||||
"Media: puntuación de cada pregunta"
|
|
||||||
#elif L==5 // fr
|
|
||||||
"Medium: le résultat de chaque question"
|
|
||||||
#elif L==6 // gn
|
|
||||||
"Media: puntuación de cada pregunta" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"Medio: risultato di ogni domanda"
|
|
||||||
#elif L==8 // pl
|
|
||||||
"Medium: result of each question" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"Médio: pontuação de cada questão"
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[TsR_FEEDBACK_EACH_GOOD_BAD] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"Alta: respuesta correcta en cada pregunta" // Necessita traduccio
|
|
||||||
#elif L==2 // de
|
|
||||||
"Maximale Details: die richtige Antwort für jede Frage"
|
|
||||||
#elif L==3 // en
|
|
||||||
"High: correct answer for each question"
|
|
||||||
#elif L==4 // es
|
|
||||||
"Alta: respuesta correcta en cada pregunta"
|
|
||||||
#elif L==5 // fr
|
|
||||||
"Haute: bonne réponse pour chaque question"
|
|
||||||
#elif L==6 // gn
|
|
||||||
"Alta: respuesta correcta en cada pregunta" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"Alto: la corretta risposta per ogni domanda"
|
|
||||||
#elif L==8 // pl
|
|
||||||
"High: correct answer for each question" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"Alto: resposta correta para cada questão"
|
|
||||||
#endif
|
|
||||||
,
|
|
||||||
[TsR_FEEDBACK_FULL_FEEDBACK] =
|
|
||||||
#if L==1 // ca
|
|
||||||
"Máxima: mostrar texto de realimentación" // Necessita traduccio
|
|
||||||
#elif L==2 // de
|
|
||||||
"Maximale: zeigen Feedback text"
|
|
||||||
#elif L==3 // en
|
|
||||||
"Maximum: show feedback text"
|
|
||||||
#elif L==4 // es
|
|
||||||
"Máxima: mostrar texto de realimentación"
|
|
||||||
#elif L==5 // fr
|
|
||||||
"Maximum: afficher le texte de feedback"
|
|
||||||
#elif L==6 // gn
|
|
||||||
"Máxima: mostrar texto de realimentación" // Okoteve traducción
|
|
||||||
#elif L==7 // it
|
|
||||||
"Massimo: visualizzare il testo de feedback"
|
|
||||||
#elif L==8 // pl
|
|
||||||
"Maximum: show feedback text" // Potrzebujesz tlumaczenie
|
|
||||||
#elif L==9 // pt
|
|
||||||
"Máximo: mostrar o texto de feedback"
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
const char *Txt_TST_STR_ORDER_FULL[Tst_NUM_TYPES_ORDER_QST] =
|
const char *Txt_TST_STR_ORDER_FULL[Tst_NUM_TYPES_ORDER_QST] =
|
||||||
{
|
{
|
||||||
[Tst_ORDER_STEM] =
|
[Tst_ORDER_STEM] =
|
||||||
|
|
Loading…
Reference in New Issue