Version19.125

This commit is contained in:
Antonio Cañas Vargas 2020-02-17 12:00:39 +01:00
parent f7e186b154
commit 2605cfd0f5
9 changed files with 129 additions and 321 deletions

View File

@ -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 *****/

View File

@ -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);

View File

@ -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:

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -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

View File

@ -11787,27 +11787,6 @@ const char *Txt_Feedback =
"Feedback"; "Feedback";
#endif #endif
const char *Txt_Feedback_to_students =
#if L==1 // ca
"Realimentaci&oacute;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&oacute;n para estudiantes";
#elif L==5 // fr
"Feedback pour les &eacute;tudiants";
#elif L==6 // gn
"Realimentaci&oacute;n para estudiantes"; // Okoteve traducción
#elif L==7 // it
"Feedback per gli studenti";
#elif L==8 // pl
"Opinie student&oacute;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&oacute;n" // Necessita traduccio
#elif L==2 // de
"Keine Feedback"
#elif L==3 // en
"No feedback"
#elif L==4 // es
"Ninguna realimentaci&oacute;n"
#elif L==5 // fr
"Pas de feedback"
#elif L==6 // gn
"Ninguna realimentaci&oacute;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&oacute;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&oacute;n total"
#elif L==5 // fr
"Petit: seul le note total"
#elif L==6 // gn
"Poca: solo puntuaci&oacute;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&ccedil;&atilde;o total"
#endif
,
[TsR_FEEDBACK_EACH_RESULT] =
#if L==1 // ca
"Media: puntuaci&oacute;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&oacute;n de cada pregunta"
#elif L==5 // fr
"Medium: le r&eacute;sultat de chaque question"
#elif L==6 // gn
"Media: puntuaci&oacute;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&eacute;dio: pontua&ccedil;&atilde;o de cada quest&atilde;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&uuml;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&eacute;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&atilde;o"
#endif
,
[TsR_FEEDBACK_FULL_FEEDBACK] =
#if L==1 // ca
"M&aacute;xima: mostrar texto de realimentaci&oacute;n" // Necessita traduccio
#elif L==2 // de
"Maximale: zeigen Feedback text"
#elif L==3 // en
"Maximum: show feedback text"
#elif L==4 // es
"M&aacute;xima: mostrar texto de realimentaci&oacute;n"
#elif L==5 // fr
"Maximum: afficher le texte de feedback"
#elif L==6 // gn
"M&aacute;xima: mostrar texto de realimentaci&oacute;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&aacute;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] =