Version19.123

This commit is contained in:
Antonio Cañas Vargas 2020-02-16 13:02:30 +01:00
parent bd015b81f5
commit d6d3567fcb
13 changed files with 1392 additions and 1249 deletions

View File

@ -56,8 +56,8 @@ OBJS = swad_account.o swad_action.o swad_agenda.o swad_alert.o \
swad_scope.o swad_search.o swad_session.o swad_setting.o \
swad_statistic.o swad_string.o swad_survey.o swad_syllabus.o \
swad_system_config.o \
swad_tab.o swad_test.o swad_test_import.o swad_theme.o swad_timeline.o \
swad_timetable.o \
swad_tab.o swad_test.o swad_test_import.o swad_test_result.o \
swad_theme.o swad_timeline.o swad_timetable.o \
swad_user.o \
swad_xml.o \
swad_zip.o

View File

@ -3627,7 +3627,7 @@ int swad__getTestConfig (struct soap *soap,
char *wsKey,int courseCode, // input
struct swad__getTestConfigOutput *getTestConfigOut) // output
{
extern const char *Tst_FeedbackXML[Tst_NUM_TYPES_FEEDBACK];
extern const char *TsR_FeedbackXML[TsR_NUM_TYPES_FEEDBACK];
int ReturnCode;
/***** Initializations *****/
@ -3671,7 +3671,7 @@ int swad__getTestConfig (struct soap *soap,
/***** Set default result to empty *****/
getTestConfigOut->numQuestions = getTestConfigOut->minQuestions = getTestConfigOut->defQuestions = getTestConfigOut->maxQuestions = 0;
getTestConfigOut->feedback = (char *) soap_malloc (Gbl.soap,Tst_MAX_BYTES_FEEDBACK_TYPE + 1);
getTestConfigOut->feedback = (char *) soap_malloc (Gbl.soap,TsR_MAX_BYTES_FEEDBACK_TYPE + 1);
getTestConfigOut->feedback[0] = '\0';
/***** Get test configuration *****/
@ -3683,8 +3683,8 @@ int swad__getTestConfig (struct soap *soap,
getTestConfigOut->defQuestions = (int) Gbl.Test.Config.Def;
getTestConfigOut->maxQuestions = (int) Gbl.Test.Config.Max;
Str_Copy (getTestConfigOut->feedback,
Tst_FeedbackXML[Gbl.Test.Config.Feedback],
Tst_MAX_BYTES_FEEDBACK_TYPE);
TsR_FeedbackXML[Gbl.Test.Config.Feedback],
TsR_MAX_BYTES_FEEDBACK_TYPE);
/***** Get number of tests *****/
if (Gbl.Test.Config.Pluggable == Tst_PLUGGABLE_YES &&
@ -3717,7 +3717,7 @@ static int API_GetTstConfig (long CrsCod)
{
Gbl.Test.Config.Pluggable = Tst_PLUGGABLE_UNKNOWN;
Gbl.Test.Config.Min = Gbl.Test.Config.Def = Gbl.Test.Config.Max = 0;
Gbl.Test.Config.Feedback = Tst_FEEDBACK_DEFAULT;
Gbl.Test.Config.Feedback = TsR_FEEDBACK_DEFAULT;
}
/***** Free structure that stores the query result *****/

View File

@ -1067,7 +1067,7 @@ void Acc_CompletelyEliminateAccount (struct UsrData *UsrDat,
UsrDat->FullName);
/***** Remove test results made by user in all courses *****/
Tst_RemoveTestResultsMadeByUsrInAllCrss (UsrDat->UsrCod);
TsR_RemoveTestResultsMadeByUsrInAllCrss (UsrDat->UsrCod);
/***** Remove user's notifications *****/
Ntf_RemoveUsrNtfs (UsrDat->UsrCod);

View File

@ -630,12 +630,12 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActRenTag ] = { 143,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_RenameTag ,NULL},
[ActRcvCfgTst ] = { 454,-1,TabUnk,ActReqTst ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ReceiveConfigTst ,NULL},
[ActReqSeeMyTstRes ] = {1083,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Tst_SelDatesToSeeMyTstResults ,NULL},
[ActSeeMyTstRes ] = {1084,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowMyTstResults ,NULL},
[ActSeeOneTstResMe ] = {1085,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowOneTstResult ,NULL},
[ActReqSeeUsrTstRes ] = {1080,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,Tst_SelUsrsToViewUsrsTstResults,NULL},
[ActSeeUsrTstRes ] = {1081,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_GetUsrsAndShowTstResults ,NULL},
[ActSeeOneTstResOth ] = {1082,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Tst_ShowOneTstResult ,NULL},
[ActReqSeeMyTstRes ] = {1083,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,TsR_SelDatesToSeeMyTstResults ,NULL},
[ActSeeMyTstRes ] = {1084,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,TsR_ShowMyTstResults ,NULL},
[ActSeeOneTstResMe ] = {1085,-1,TabUnk,ActReqTst ,0x208,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,TsR_ShowOneTstResult ,NULL},
[ActReqSeeUsrTstRes ] = {1080,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Dat_SetIniEndDates ,TsR_SelUsrsToViewUsrsTstResults,NULL},
[ActSeeUsrTstRes ] = {1081,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,TsR_GetUsrsAndShowTstResults ,NULL},
[ActSeeOneTstResOth ] = {1082,-1,TabUnk,ActReqTst ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,TsR_ShowOneTstResult ,NULL},
[ActSeeGam ] = {1650,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_SeeOneGame ,NULL},

View File

@ -497,7 +497,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.122.4 (2020-02-14)"
#define Log_PLATFORM_VERSION "SWAD 19.123 (2020-02-16)"
#define CSS_FILE "swad19.118.css"
#define JS_FILE "swad19.91.1.js"
/*
@ -507,6 +507,7 @@ ps2pdf source.ps destination.pdf
// 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.
Version 19.123: Feb 16, 2020 New module swad_test_result for test results. (278815 lines)
Version 19.122.4: Feb 14, 2020 Fixed bug refreshing degree average photo. (278699 lines)
Version 19.122.3: Feb 14, 2020 Fixed bug in games, reported by Gustavo Romero López.
Fixed bug in listing of departments, reported by Daniel Haro Contreras. (278700 lines)

View File

@ -1881,7 +1881,7 @@ static void Crs_EmptyCourseCompletely (long CrsCod)
Svy_RemoveSurveys (Hie_CRS,CrsCod);
/***** Remove all test exams made in the course *****/
Tst_RemoveCrsTestResults (CrsCod);
TsR_RemoveCrsTestResults (CrsCod);
/***** Remove all tests questions in the course *****/
Tst_RemoveCrsTests (CrsCod);

View File

@ -4099,7 +4099,7 @@ static void Enr_EffectivelyRemUsrFromCrs (struct UsrData *UsrDat,
Brw_RemoveSomeInfoAboutCrsUsrFilesFromDB (UsrDat->UsrCod,Crs->CrsCod);
/***** Remove test results made by user in course *****/
Tst_RemoveTestResultsMadeByUsrInCrs (UsrDat->UsrCod,Crs->CrsCod);
TsR_RemoveTestResultsMadeByUsrInCrs (UsrDat->UsrCod,Crs->CrsCod);
/***** Set all the notifications for this user in this course as removed,
except notifications about new messages *****/

View File

@ -1032,7 +1032,7 @@ void McR_ShowOneMchResult (void)
&NumQsts,
&NumQstsNotBlank,
&TotalScore);
Gbl.Test.Config.Feedback = Tst_FEEDBACK_FULL_FEEDBACK; // Initialize feedback to maximum
Gbl.Test.Config.Feedback = TsR_FEEDBACK_FULL_FEEDBACK; // Initialize feedback to maximum
/***** Check if I can view this match result *****/
ItsMe = Usr_ItsMe (UsrDat->UsrCod);
@ -1049,7 +1049,7 @@ void McR_ShowOneMchResult (void)
if (ICanViewResult)
{
Tst_GetConfigTstFromDB (); // To get feedback type
ICanViewScore = Gbl.Test.Config.Feedback != Tst_FEEDBACK_NOTHING;
ICanViewScore = Gbl.Test.Config.Feedback != TsR_FEEDBACK_NOTHING;
}
else
ICanViewScore = false;
@ -1220,7 +1220,7 @@ void McR_ShowOneMchResult (void)
HTM_TR_End ();
/***** Write answers and solutions *****/
Tst_ShowTestResult (UsrDat,NumQsts,TimeUTC[Dat_START_TIME]);
TsR_ShowTestResult (UsrDat,NumQsts,TimeUTC[Dat_START_TIME]);
/***** End table *****/
HTM_TABLE_End ();
@ -1383,7 +1383,7 @@ static bool McR_CheckIfICanSeeMatchResult (long MchCod,long UsrCod)
{
case Rol_STD:
ItsMe = Usr_ItsMe (UsrCod);
if (ItsMe && Gbl.Test.Config.Feedback != Tst_FEEDBACK_NOTHING)
if (ItsMe && Gbl.Test.Config.Feedback != TsR_FEEDBACK_NOTHING)
ShowResultThisMatch = McR_GetVisibilityMchResultFromDB (MchCod);
else
ShowResultThisMatch = false;

File diff suppressed because it is too large Load Diff

View File

@ -28,13 +28,12 @@
/*****************************************************************************/
#include "swad_game.h"
#include "swad_test_result.h"
/*****************************************************************************/
/***************************** Public constants ******************************/
/*****************************************************************************/
#define Tst_SCORE_MAX 10 // Maximum score of a test (10 in Spain). Must be unsigned! // TODO: Make this configurable by teachers
#define Tst_MAX_QUESTIONS_PER_TEST 100 // Absolute maximum number of questions in a test
#define Tst_MAX_TAGS_PER_QUESTION 5
@ -52,7 +51,7 @@
#define Tst_CONFIG_DEFAULT_DEF_QUESTIONS 20 // Number of questions to be generated by default in a self-assessment test
#define Tst_CONFIG_DEFAULT_MAX_QUESTIONS 30 // Maximum number of questions to be generated in a self-assessment test
#define Tst_MAX_BYTES_FEEDBACK_TYPE 32
#define TsR_MAX_BYTES_FEEDBACK_TYPE 32
#define Tst_MAX_BYTES_ANSWER_TYPE 32
@ -76,17 +75,6 @@ typedef enum
Tst_SELECT_QUESTIONS_FOR_GAME, // Selecting test questions for a game
} Tst_ActionToDoWithQuestions_t;
#define Tst_NUM_TYPES_FEEDBACK 5
typedef enum
{
Tst_FEEDBACK_NOTHING = 0,
Tst_FEEDBACK_TOTAL_RESULT = 1,
Tst_FEEDBACK_EACH_RESULT = 2,
Tst_FEEDBACK_EACH_GOOD_BAD = 3,
Tst_FEEDBACK_FULL_FEEDBACK = 4,
} Tst_Feedback_t;
#define Tst_FEEDBACK_DEFAULT Tst_FEEDBACK_FULL_FEEDBACK
struct Tst_Config
{
Tst_Pluggable_t Pluggable;
@ -94,7 +82,7 @@ struct Tst_Config
unsigned Def; // Default number of questions
unsigned Max; // Maximum number of questions
unsigned long MinTimeNxtTstPerQst;
Tst_Feedback_t Feedback;
TsR_Feedback_t Feedback;
};
#define Tst_NUM_ANS_TYPES 6
@ -147,6 +135,10 @@ void Tst_ShowGrade (double Grade,double MaxGrade);
void Tst_ShowTagList (unsigned NumTags,MYSQL_RES *mysql_res);
void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestions,
struct UsrData *UsrDat,
unsigned NumQst,long QstCod,MYSQL_ROW row,
double *ScoreThisQst,bool *AnswerIsNotBlank);
void Tst_WriteQstStem (const char *Stem,const char *ClassStem);
void Tst_WriteQstFeedback (const char *Feedback,const char *ClassFeedback);
@ -176,6 +168,7 @@ void Tst_CheckIfNumberOfAnswersIsOne (void);
unsigned long Tst_GetTagsQst (long QstCod,MYSQL_RES **mysql_res);
void Tst_GetAndWriteTagsQst (long QstCod);
void Tst_FreeTagsList (void);
void Tst_ShowFormConfig (void);
void Tst_EnableTag (void);
@ -209,21 +202,8 @@ void Tst_PutParamQstCod (void);
void Tst_InsertOrUpdateQstTagsAnsIntoDB (void);
void Tst_FreeTagsList (void);
void Tst_RemoveCrsTests (long CrsCod);
void Tst_GetTestStats (Tst_AnswerType_t AnsType,struct Tst_Stats *Stats);
void Tst_SelUsrsToViewUsrsTstResults (void);
void Tst_SelDatesToSeeMyTstResults (void);
void Tst_ShowMyTstResults (void);
void Tst_GetUsrsAndShowTstResults (void);
void Tst_ShowOneTstResult (void);
void Tst_ShowTestResult (struct UsrData *UsrDat,
unsigned NumQsts,time_t TstTimeUTC);
void Tst_RemoveTestResultsMadeByUsrInAllCrss (long UsrCod);
void Tst_RemoveTestResultsMadeByUsrInCrs (long UsrCod,long CrsCod);
void Tst_RemoveCrsTestResults (long CrsCod);
void Tst_RemoveCrsTests (long CrsCod);
#endif

1167
swad_test_result.c Normal file

File diff suppressed because it is too large Load Diff

77
swad_test_result.h Normal file
View File

@ -0,0 +1,77 @@
// swad_test_results.h: test results
#ifndef _SWAD_TSR
#define _SWAD_TSR
/*
SWAD (Shared Workspace At a Distance in Spanish),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2020 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
// #include "swad_game.h"
#include "swad_user.h"
/*****************************************************************************/
/***************************** Public constants ******************************/
/*****************************************************************************/
#define TsR_SCORE_MAX 10 // Maximum score of a test (10 in Spain). Must be unsigned! // TODO: Make this configurable by teachers
#define TsR_MAX_BYTES_FEEDBACK_TYPE 32
/*****************************************************************************/
/******************************* Public types ********************************/
/*****************************************************************************/
#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 *****************************/
/*****************************************************************************/
void TsR_SelUsrsToViewUsrsTstResults (void);
void TsR_SelDatesToSeeMyTstResults (void);
void TsR_ShowMyTstResults (void);
long TsR_CreateTestResultInDB (void);
void TsR_StoreScoreOfTestResultInDB (long TstCod,
unsigned NumQstsNotBlank,double Score);
void TsR_GetUsrsAndShowTstResults (void);
void TsR_ShowOneTstResult (void);
void TsR_ShowTestResult (struct UsrData *UsrDat,
unsigned NumQsts,time_t TstTimeUTC);
void TsR_StoreOneTestResultQstInDB (long TstCod,long QstCod,unsigned NumQst,double Score);
void TsR_RemoveTestResultsMadeByUsrInAllCrss (long UsrCod);
void TsR_RemoveTestResultsMadeByUsrInCrs (long UsrCod,long CrsCod);
void TsR_RemoveCrsTestResults (long CrsCod);
TsR_Feedback_t TsR_GetFeedbackTypeFromForm (void);
#endif

View File

@ -51241,9 +51241,9 @@ const char *Txt_TST_STR_ANSWER_TYPES[Tst_NUM_ANS_TYPES] =
#endif
};
const char *Txt_TST_STR_FEEDBACK[Tst_NUM_TYPES_FEEDBACK] =
const char *Txt_TST_STR_FEEDBACK[TsR_NUM_TYPES_FEEDBACK] =
{
[Tst_FEEDBACK_NOTHING] =
[TsR_FEEDBACK_NOTHING] =
#if L==1 // ca
"Ninguna realimentaci&oacute;n" // Necessita traduccio
#elif L==2 // de
@ -51264,7 +51264,7 @@ const char *Txt_TST_STR_FEEDBACK[Tst_NUM_TYPES_FEEDBACK] =
"Nenhum feedback"
#endif
,
[Tst_FEEDBACK_TOTAL_RESULT] =
[TsR_FEEDBACK_TOTAL_RESULT] =
#if L==1 // ca
"Poca: solo puntuaci&oacute;n total" // Necessita traduccio
#elif L==2 // de
@ -51285,7 +51285,7 @@ const char *Txt_TST_STR_FEEDBACK[Tst_NUM_TYPES_FEEDBACK] =
"Pouco: apenas a pontua&ccedil;&atilde;o total"
#endif
,
[Tst_FEEDBACK_EACH_RESULT] =
[TsR_FEEDBACK_EACH_RESULT] =
#if L==1 // ca
"Media: puntuaci&oacute;n de cada pregunta" // Necessita traduccio
#elif L==2 // de
@ -51306,7 +51306,7 @@ const char *Txt_TST_STR_FEEDBACK[Tst_NUM_TYPES_FEEDBACK] =
"M&eacute;dio: pontua&ccedil;&atilde;o de cada quest&atilde;o"
#endif
,
[Tst_FEEDBACK_EACH_GOOD_BAD] =
[TsR_FEEDBACK_EACH_GOOD_BAD] =
#if L==1 // ca
"Alta: respuesta correcta en cada pregunta" // Necessita traduccio
#elif L==2 // de
@ -51327,7 +51327,7 @@ const char *Txt_TST_STR_FEEDBACK[Tst_NUM_TYPES_FEEDBACK] =
"Alto: resposta correta para cada quest&atilde;o"
#endif
,
[Tst_FEEDBACK_FULL_FEEDBACK] =
[TsR_FEEDBACK_FULL_FEEDBACK] =
#if L==1 // ca
"M&aacute;xima: mostrar texto de realimentaci&oacute;n" // Necessita traduccio
#elif L==2 // de